packages feed

MicroHs 0.13.0.0 → 0.15.0.0

raw patch · 392 files changed

+40522/−23141 lines, 392 filesdep −ghc-internaldep ~basedep ~time

Dependencies removed: ghc-internal

Dependency ranges changed: base, time

Files

Example.hs view
@@ -1,11 +1,11 @@ module Example(fac, main) where -fac :: Int -> Int+fac :: Integer -> Integer fac 0 = 1 fac n = n * fac(n - 1)  main :: IO () main = do-  let rs = map fac [1,2,3,10]+  let rs = map fac [1,2,3,10,52]   putStrLn "Some factorials"   print rs
Makefile view
@@ -1,21 +1,28 @@ # Define these 3 lines to use GMP for Integer.-# For MacOS with homebrew:-#MHSGMPCCFLAGS=-DWANT_GMP=1 -L/opt/homebrew/lib -lgmp -I/opt/homebrew/include+#MHSGMPCCFLAGS=-DWANT_GMP=1 #MHSGMP=-ilib/gmp #MCABALGMP=-fgmp+# AND, for MacOS with homebrew (after brew install gmp):+#MHSGMPCCLIBS= -L/opt/homebrew/lib -lgmp -I/opt/homebrew/include+# OR, for Ubuntu Linux (after apt-get install -y libgmp-dev):+#MHSGMPCCLIBS=-lgmp # # installation prefix PREFIX=/usr/local-# Unix-like system, 64 bit words-CONF=unix-64+# Unix-like system, 32/64 bit words+CONF=unix # # Using GCC enables global register variables on ARM64, which gives a 5-10% speedup. #CC=gcc-14+RTS=src/runtime+RTSINC=-I$(RTS) -I$(RTS)/$(CONF)+MAINC= $(RTS)/main.c+# CCWARNS= -Wall CCOPTS= -O3-CCLIBS= -lm+CCLIBS= -lm $(MHSGMPCCLIBS) CCSANITIZE= -fsanitize=undefined -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract-CCEVAL= $(CC) $(CCWARNS) $(CCOPTS) $(MHSGMPCCFLAGS) -Isrc/runtime src/runtime/eval-$(CONF).c $(CCLIBS)+CCEVAL= $(CC) $(CCWARNS) $(CCOPTS) $(MHSGMPCCFLAGS) $(RTSINC) $(MAINC) $(RTS)/eval.c # GHC= ghc GHCINCS= -ighc -isrc -ipaths@@ -35,7 +42,10 @@ HUGSINCS= '+Phugs:mhs:src:paths:{Hugs}/packages/*:hugs/obj' -98 +o +w  #-EMCC=emcc -sALLOW_MEMORY_GROWTH -sTOTAL_STACK=5MB -sNODERAWFS -sSINGLE_FILE -DUSE_SYSTEM_RAW+EMCC=emcc+EMCCFLAGS=-O3 -sEXPORTED_RUNTIME_METHODS=stringToNewUTF8 -sALLOW_MEMORY_GROWTH -sTOTAL_STACK=5MB -sNODERAWFS -sSINGLE_FILE -DUSE_SYSTEM_RAW -sEXIT_RUNTIME+NODE=node+#NODEFLAGS=--stack_size=8192 # MHSINCNP= -i $(MHSGMP) -imhs -isrc -ilib MHSINC=$(MHSINCNP) -ipaths @@ -45,65 +55,63 @@  all:	bin/mhs bin/cpphs bin/mcabal -targets.conf:-	echo "[default]"         > targets.conf-	echo cc = \"$(CC)\"     >> targets.conf-	echo ccflags = \"$(MHSGMPCCFLAGS)\" >> targets.conf-	echo conf = \"$(CONF)\" >> targets.conf-	echo ''                 >> targets.conf-	echo "[emscripten]"     >> targets.conf-	echo cc = \"$(EMCC)\"   >> targets.conf-	echo conf = \"$(CONF)\" >> targets.conf- newmhs:	ghcgen targets.conf-	$(CCEVAL) generated/mhs.c -o bin/mhs-	$(CC) $(CCWARNS) $(MHSGMPCCFLAGS) -g -Isrc/runtime src/runtime/eval-$(CONF).c $(CCLIBS) generated/mhs.c -o bin/mhsgdb+	$(CCEVAL) generated/mhs.c $(CCLIBS) -o bin/mhs+	$(CC) $(CCWARNS) $(MHSGMPCCFLAGS) -g $(RTSINC) $(RTS)/eval.c $(MAINC) generated/mhs.c $(CCLIBS) -o bin/mhsgdb  newmhsz:	newmhs 	rm generated/mhs.c-	make generated/mhs.c+	$(MAKE) generated/mhs.c  sanitizemhs:	ghcgen targets.conf-	$(CCEVAL) $(CCSANITIZE) generated/mhs.c -o bin/mhssane+	$(CCEVAL) $(CCSANITIZE) generated/mhs.c $(CCLIBS) -o bin/mhssane  # Compile mhs from distribution, with C compiler-bin/mhs:	src/runtime/*.c src/runtime/*.h targets.conf #generated/mhs.c+bin/mhs:	$(RTS)/*.c $(RTS)/*.h $(RTS)/*/*.h targets.conf #generated/mhs.c 	@mkdir -p bin-	$(CCEVAL) generated/mhs.c -o bin/mhs+	$(CCEVAL) generated/mhs.c $(CCLIBS) -o bin/mhs  # Compile cpphs from distribution, with C compiler-bin/cpphs:	src/runtime/*.c src/runtime/config*.h #generated/cpphs.c+bin/cpphs:	$(RTS)/*.c $(RTS)/*.h $(RTS)/*/*.h #generated/cpphs.c 	@mkdir -p bin-	$(CCEVAL) generated/cpphs.c -o bin/cpphs+	$(CCEVAL) generated/cpphs.c $(CCLIBS) -o bin/cpphs  # Compile mcabal from distribution, with C compiler-bin/mcabal:	src/runtime/*.c src/runtime/config*.h #generated/mcabal.c+bin/mcabal:	$(RTS)/*.c $(RTS)/*.h $(RTS)/*/*.h #generated/mcabal.c 	@mkdir -p bin-	$(CCEVAL) generated/mcabal.c -o bin/mcabal+	$(CCEVAL) generated/mcabal.c $(CCLIBS) -o bin/mcabal  # Compile combinator evaluator-bin/mhseval:	src/runtime/*.c src/runtime/config*.h+bin/mhseval:	$(RTS)/*.c $(RTS)/*.h $(RTS)/*/*.h 	@mkdir -p bin-	$(CCEVAL) src/runtime/comb.c -o bin/mhseval+	$(CCEVAL) $(RTS)/comb.c $(CCLIBS) -o bin/mhseval 	size bin/mhseval -bin/mhsevalgdb:	src/runtime/*.c src/runtime/config*.h+bin/mhsevalgdb:	$(RTS)/*.c $(RTS)/*/*.h 	@mkdir -p bin-	$(CC) $(CCWARNS) $(MHSGMPCCFLAGS) -g src/runtime/eval-$(CONF).c $(CCLIBS) src/runtime/comb.c -o bin/mhsevalgdb+	$(CC) $(CCWARNS) $(MHSGMPCCFLAGS) $(RTSINC) -g $(RTS)/eval.c $(RTS)/comb.c $(MAINC) $(CCLIBS) -o bin/mhsevalgdb -bin/mhsevalsane:	src/runtime/*.c src/runtime/config*.h+bin/mhsevalsane:	$(RTS)/*.c $(RTS)/*/*.h 	@mkdir -p bin-	$(CCEVAL) $(CCSANITIZE) src/runtime/comb.c -o bin/mhsevalsane+	$(CCEVAL) $(CCSANITIZE) $(RTSINC) $(RTS)/comb.c $(CCLIBS) -o bin/mhsevalsane +# mhseval, compiled with emscripten. Use in the browser!+EMCCOPTS= -O3 -sEXPORTED_FUNCTIONS=_apply_sp,_main -sEXPORTED_RUNTIME_METHODS=stringToNewUTF8 -sALLOW_MEMORY_GROWTH -sTOTAL_STACK=5MB -sSINGLE_FILE -DUSE_SYSTEM_RAW -Wno-address-of-packed-member+EMCCLIBS= -lm+EMCCEVAL= emcc $(EMCCOPTS) $(RTSINC) $(MAINC) $(RTS)/eval.c+generated/mhseval.js:	$(RTS)/*.c $(RTS)/*.h $(RTS)/*/*.h+	@mkdir -p bin+	$(EMCCEVAL) $(RTS)/comb.c $(EMCCLIBS) -o generated/mhseval.js+ # Compile mhs with ghc bin/gmhs:	src/*/*.hs ghc/*.hs ghc/*/*.hs ghc/*/*/*.hs 	@mkdir -p bin-	$(GHC) $(GHCFLAGS) $(MAINMODULE) -o bin/gmhs+	$(GHC) $(GHCFLAGS) $(RTSINC) $(RTS)/mhseval.c $(MAINMODULE) -o bin/gmhs  # Compile mhs with ghc, with code coverage bin/cmhs:	src/*/*.hs ghc/*.hs ghc/*/*.hs 	@mkdir -p bin-	$(GHC) $(GHCFLAGS) -fhpc $(MAINMODULE) -o bin/cmhs+	$(GHC) $(GHCFLAGS) $(RTSINC) $(RTS)/mhseval.c -fhpc $(MAINMODULE) -o bin/cmhs  # Generate distribution C file generated/mhs.c:	bin/mhs src/*/*.hs@@ -123,7 +131,7 @@ 	bin/mhs -z -i../MicroCabal/src -ilib -ogenerated/mcabal.c MicroCabal.Main  # Flags to read local file system, generate a single .js file, and to avoid ioctl()-mhs.js:	src/*/*.hs src/runtime/*.[ch] targets.conf+mhs.js:	src/*/*.hs $(RTS)/*.h $(RTS)/*/*.h targets.conf 	bin/mhs $(MHSINC) -temscripten $(MAINMODULE) -o mhs.js  # Make sure boottrapping works@@ -137,7 +145,7 @@ 	@mkdir -p generated 	@echo "*** Build stage1 compiler, using bin/mhs" 	bin/mhs -z $(MHSINC) $(MAINMODULE) -ogenerated/mhs-stage1.c-	$(CCEVAL) generated/mhs-stage1.c -o bin/mhs-stage1+	$(CCEVAL) generated/mhs-stage1.c $(CCLIBS) -o bin/mhs-stage1  # Build stage2 compiler with stage1 compiler, and compare bin/mhs-stage2:	bin/mhs-stage1 src/*/*.hs@@ -146,7 +154,7 @@ 	bin/mhs-stage1 -z $(MHSINC) $(MAINMODULE) -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+	$(CCEVAL) generated/mhs-stage2.c $(CCLIBS) -o bin/mhs-stage2  # Fetch cpphs submodule cpphssrc/malcolm-wallace-universe/.git:@@ -158,27 +166,34 @@ bootstrapcpphs: bin/mhs cpphssrc/malcolm-wallace-universe/.git 	MHSCPPHS=$(USECPPHS) bin/mhs -z -XCPP '-DMIN_VERSION_base(x,y,z)=((x)<4||(x)==4&&(y)<19||(x)==4&&(y)==19&&(z)<=1)' -icpphscompat -icpphssrc/malcolm-wallace-universe/polyparse-1.12/src -icpphssrc/malcolm-wallace-universe/cpphs-1.20.9 cpphssrc/malcolm-wallace-universe/cpphs-1.20.9/cpphs.hs -ogenerated/cpphs.c +targets.conf: targets.conf.in+	sed -e "s,GMPFLAGS,$(MHSGMPCCFLAGS)," -e "s,GMPLIBS,$(MHSGMPCCLIBS)," targets.conf.in > targets.conf+ # Run test examples with ghc-compiled compiler runtest:	bin/mhseval bin/gmhs tests/*.hs-	cd tests; make alltest+	cd tests; $(MAKE) alltest  # Run test examples with mhs-compiled compiler runtestmhs: bin/mhseval bin/mhs-	cd tests; make MHS=../bin/mhs cache; make MHS="../bin/mhs +RTS -H4M -RTS -CR" info test errtest+	cd tests; $(MAKE) MHS=../bin/mhs cache; $(MAKE) MHS="../bin/mhs +RTS -H4M -RTS -CR" alltest  # Run test examples with sanitized mhs-compiled compiler runtestsan: bin/mhsevalsane sanitizemhs-	cd tests; make MHS="../bin/mhssane +RTS -H4M -RTS -CW" cache-	cd tests; make MHS="../bin/mhssane +RTS -H4M -RTS -CR" EVAL="../bin/mhsevalsane +RTS -H1M -RTS" info test errtest+	cd tests; $(MAKE) MHS="../bin/mhssane +RTS -H4M -RTS -CW" cache+	cd tests; $(MAKE) MHS="../bin/mhssane +RTS -H4M -RTS -CR" EVAL="../bin/mhsevalsane +RTS -H1M -RTS" info test errtest  runtestgsan: bin/mhsevalsane bin/gmhs-	cd tests; make EVAL="../bin/mhsevalsane +RTS -H1M -RTS" info test errtest+	cd tests; $(MAKE) EVAL="../bin/mhsevalsane +RTS -H1M -RTS" info test errtest  # Run test examples going via JavaScript runtestemscripten: bin/mhseval bin/mhs bin/cpphs-	cd tests; make MHS=../bin/mhs cache; MHSDIR=.. make MHS="../bin/mhs -CR -temscripten -oout.js" EVAL="node out.js" info test errtest+	cd tests; $(MAKE) MHS=../bin/mhs cache; MHSDIR=.. $(MAKE) MHSTARGET="-temscripten" MHS="../bin/mhs -CR -oout.js" EVAL="$(NODE) $(NODEFLAGS) out.js" info test errtest +# Run test examples going with tcc+runtesttcc: bin/mhseval bin/mhs bin/cpphs+	cd tests; MHSDIR=.. $(MAKE) MHSTARGET="-ttcc" MHSOUTPUT="-oa.out" EVAL="./a.out" info test errtest + # Compress the binary (broken on MacOS) bin/umhs: bin/mhs 	rm -f bin/umhs@@ -219,8 +234,8 @@  # clean:-	rm -rf src/*/*.hi src/*/*.o *.comb *.js *.tmp *~ bin/* a.out $(GHCOUTDIR) Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* .mhscache targets.conf .mhscache dist-mcabal Interactive.hs .mhsi-	cd tests; make clean+	rm -rf src/*/*.hi src/*/*.o *.comb *.js *.tmp *~ bin/* a.out $(GHCOUTDIR) Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* .mhscache .mhscache dist-mcabal Interactive.hs .mhsi lib/*.pkg lib/dist-mcabal targets.conf+	cd tests; $(MAKE) clean 	-cabal clean 	-git submodule deinit cpphssrc/malcolm-wallace-universe 	-git submodule deinit MicroCabal@@ -229,18 +244,18 @@ 	mkdir -p $(PREFIX)/bin 	cp bin/mhs $(PREFIX)/bin 	-cp bin/cpphs $(PREFIX)/bin-	mkdir -p $(PREFIX)/lib/mhs/src/runtime+	mkdir -p $(PREFIX)/lib/mhs/$(RTS) 	cp -r lib $(PREFIX)/lib/mhs-	cp src/runtime/* $(PREFIX)/lib/mhs/src/runtime+	cp -r $(RTS)/* $(PREFIX)/lib/mhs/$(RTS) 	cp targets.conf $(PREFIX)/lib/mhs/targets.conf 	@echo "***" 	@echo "*** Installation complete" 	@echo "*** Set environment variable MHSDIR to $(PREFIX)/lib/mhs" 	@echo "***" -everytest:	newmhs bin/cpphs runtest exampletest cachetest bootcombtest nfibtest info+everytest:	newmhs bin/cpphs exampletest info runtest cachetest bootcombtest nfibtest -everytestmhs:	bin/mhs bin/cpphs bin/mhseval exampletest cachetest bootstrap runtestmhs nfibtest info+everytestmhs:	bin/mhs bin/cpphs bin/mhseval exampletest info cachetest bootstrap runtestmhs nfibtest  bootcombtest:	bin/gmhs bin/mhseval 	bin/gmhs $(MHSINC) -ogmhs.comb $(MAINMODULE)@@ -254,7 +269,7 @@  examplejs: bin/mhs Example.hs 	bin/mhs -temscripten Example -oEx.js-	node Ex.js+	$(NODE) $(NODEFLAGS) Ex.js 	rm Ex.js  info:	bin/mhs@@ -272,24 +287,24 @@  ###### -VERSION=0.13.0.0-HVERSION=0,13,0,0+VERSION=0.15.0.0+HVERSION=0,15,0,0 MCABAL=$(HOME)/.mcabal MCABALMHS=$(MCABAL)/mhs-$(VERSION) MDATA=$(MCABALMHS)/packages/mhs-$(VERSION)/data-MRUNTIME=$(MDATA)/src/runtime+MRUNTIME=$(MDATA)/$(RTS) MCABALBIN=$(MCABAL)/bin MDIST=dist-mcabal BASE=base-$(VERSION) BASEMODULES=Control.Applicative Control.Arrow Control.Category Control.DeepSeq Control.Error Control.Exception Control.Exception.Base Control.Monad Control.Monad.Fail Control.Monad.Fix Control.Monad.IO.Class Control.Monad.ST Control.Monad.Zip Data.Array Data.Bifoldable Data.Bifunctor Data.Bitraversable Data.Bits Data.Bool Data.Bounded Data.ByteString Data.Char Data.Complex Data.Constraint Data.Data Data.Double Data.Dynamic Data.Either Data.Enum Data.Eq Data.Fixed Data.Float Data.FloatW Data.Floating Data.Foldable Data.Foldable1 Data.Fractional Data.Function Data.Functor Data.Functor.Classes Data.Functor.Compose Data.Functor.Const Data.Functor.Contravariant Data.Functor.Identity Data.Functor.Product Data.Functor.Sum Data.Hashable Data.IOArray Data.IORef Data.Int Data.Integer Data.Integral Data.Ix Data.Kind Data.List Data.List.NonEmpty Data.Maybe Data.Monoid Data.Num Data.Ord Data.Proxy Data.Ratio Data.Real Data.RealFloat Data.RealFrac Data.Records Data.STRef Data.Semigroup Data.String Data.Text Data.Traversable Data.Tuple Data.Tuple.Instances Data.Type.Equality Data.TypeLits Data.Typeable Data.Version Data.Void Data.Word Data.ZipList Debug.Trace Foreign Foreign.C Foreign.C.Error Foreign.C.String Foreign.C.Types Foreign.ForeignPtr Foreign.Marshal Foreign.Marshal.Alloc Foreign.Marshal.Array Foreign.Marshal.Error Foreign.Marshal.Utils Foreign.Ptr Foreign.Storable GHC.Generics GHC.Stack GHC.Types Language.Haskell.TH.Syntax Mhs.Builtin Numeric Numeric.FormatFloat Numeric.Natural Prelude System.Cmd System.Console.GetOpt System.Compress System.Directory System.Environment System.Exit System.IO System.IO.Error System.IO.MD5 System.IO.PrintOrRun System.IO.Serialize System.IO.TimeMilli System.IO.Unsafe System.Info System.Process Text.Printf Text.ParserCombinators.ReadP Text.ParserCombinators.ReadPrec Text.Read Text.Read.Lex Text.Show Unsafe.Coerce -$(MCABALBIN)/mhs: bin/mhs src/runtime/*.[ch] targets.conf $(MDIST)/Paths_MicroHs.hs+$(MCABALBIN)/mhs: bin/mhs $(RTS)/*.[ch] targets.conf $(MDIST)/Paths_MicroHs.hs 	@mkdir -p $(MCABALBIN) 	@mkdir -p $(MDIST) 	bin/mhs -z $(MHSINCNP) -i$(MDIST) $(MAINMODULE) -o$(MCABALBIN)/mhs 	@mkdir -p $(MRUNTIME) 	cp targets.conf $(MDATA)-	cp src/runtime/*.[ch] $(MRUNTIME)+	cp -r $(RTS)/* $(MRUNTIME)  $(MDIST)/Paths_MicroHs.hs: 	@mkdir -p $(MDIST)@@ -314,9 +329,15 @@ # mkdir ~/.mcabal/packages/array-0.5.6.0  preparedist:	newmhsz bootstrapcpphs-	rm -f generated/mcabal.c-	make generated/mcabal.c+	rm -f generated/mcabal.c generated/mhseval.js generated/base.pkg+	$(MAKE) generated/mcabal.c+	$(MAKE) generated/mhseval.js+#	$(MAKE) generated/base.pkg +generated/base.pkg:+	cd lib; mcabal $(MCABALCMP) build+	cp lib/dist-mcabal/base-$(VERSION).pkg generated/base.pkg+ install:	installmsg minstall  installmsg:@@ -327,17 +348,26 @@ 	@echo '*    cpphs   - C preprocessor' 	@echo '*    mcabal  - cabal for MicroHs' 	@echo '*  Libraries:'-	@echo '*    base (bytestring, directory, filepath, text)'+	@echo '*    base (bytestring, deepseq, directory, hashable, text, stm)' 	@echo '***************************************************' 	@echo '' -minstall:	bin/cpphs bin/mcabal $(MCABALBIN)/mhs+minstall:	bin/cpphs bin/mcabal $(MCABALBIN)/mhs machdep 	cp bin/cpphs bin/mcabal $(MCABALBIN) 	cd lib; PATH=$(MCABALBIN):"$$PATH" mcabal $(MCABALGMP) install # We don't really need to rebuild mhs #	PATH=$(MCABALBIN):"$$PATH" mcabal install 	@echo $$PATH | tr ':' '\012' | grep -q $(MCABALBIN) || echo '***' Add $(MCABALBIN) to the PATH +machdep:+	$(CC) Tools/machdep.c -o machdep.exe && ./machdep.exe > $(RTS)/MachDeps.h && rm machdep.exe++# Install without recompiling anything.+fastinstall:	bin/cpphs bin/mcabal bin/mhs machdep+	@mkdir -p $(MCABALBIN)+	cp bin/cpphs bin/mcabal bin/mhs $(MCABALBIN)+	mhs -Q generated/base.pkg $(MCABALMHS)+ ##### # Hugs HUGS= runhugs@@ -349,4 +379,5 @@  bin/hmhs: generated/hmhs.c 	@mkdir -p bin-	$(CCEVAL) generated/hmhs.c -o bin/hmhs+	$(CCEVAL) generated/hmhs.c $(CCLIBS) -o bin/hmhs+
MicroHs.cabal view
@@ -1,6 +1,6 @@ cabal-version:       3.0 name:                MicroHs-version:             0.13.0.0+version:             0.15.0.0                      -- *** When changing the version number, also                      -- *** run 'sh updateversion.sh'                      -- *** Yeah, it stinks.@@ -33,14 +33,19 @@       paths/Paths_MicroHs.hs       src/runtime/*.c       src/runtime/*.h+      src/runtime/**/*.c+      src/runtime/**/*.h       tests/Makefile       tests/*.hs       tests/*.hs-boot       tests/*.ref  data-files:+      targets.conf       src/runtime/*.c       src/runtime/*.h+      src/runtime/**/*.c+      src/runtime/**/*.h -- I would like to have these two only for ghc, but I can't figure out how. -- But mcabal has a hack that recognizes lines that start with --MCABAL as valid lines. --MCABALif impl(ghc)@@ -97,12 +102,15 @@                        Data.Double                        Data.Integer                        PrimTable+                       MhsEval                        MHSPrelude                        System.IO.MD5                        System.IO.Serialize                        System.IO.TimeMilli+                       System.IO.Transducers                        System.Compress                        Paths_MicroHs+   autogen-modules:     Paths_MicroHs   if impl(ghc)     hs-source-dirs:    ghc src@@ -112,12 +120,15 @@                        filepath     >= 1.1 && < 1.8,                        ghc-prim     >= 0.5 && < 0.15,                        haskeline    >= 0.8 && < 0.10,-                       time         >= 1.1 && < 1.20,+                       time         >= 1.9 && < 1.20,                        process      >= 1.6 && < 1.10,                        directory    >= 1.2 && < 1.6,                        text         >= 2.0 && < 2.5,-                       array        >= 0.5 && < 0.6,-                       ghc-internal >= 9.0 && < 10.0,+                       array        >= 0.5 && < 0.6+    include-dirs:      src/runtime src/runtime/unix+    install-includes:  mhseval.h+    c-sources:         src/runtime/mhseval.c+    includes:          mhseval.h    if impl(hugs)     hs-source-dirs:    hugs src@@ -126,3 +137,83 @@     hs-source-dirs:    mhs src     build-depends:     base         >= 0.1 && < 10.0, +library+  default-language:    Haskell2010+  default-extensions:  ScopedTypeVariables TypeSynonymInstances MultiParamTypeClasses FlexibleInstances FlexibleContexts+  ghc-options:         -Wall -Wno-unrecognised-warning-flags -Wno-x-partial+                       -fwrite-ide-info -Wno-deprecations+  autogen-modules:     Paths_MicroHs+  exposed-modules:+                        MicroHs.Abstract +                        MicroHs.Builtin +                        MicroHs.Compile +                        MicroHs.CompileCache +                        MicroHs.Deriving +                        MicroHs.Desugar +                        MicroHs.EncodeData +                        MicroHs.Exp +                        MicroHs.ExpPrint +                        MicroHs.Expr +                        MicroHs.FFI +                        MicroHs.Fixity +                        MicroHs.Flags +                        MicroHs.Graph +                        MicroHs.Ident +                        MicroHs.IdentMap +                        MicroHs.Interactive +                        MicroHs.IntMap +                        MicroHs.IntSet +                        MicroHs.Lex +                        MicroHs.List +                        MicroHs.Main +                        MicroHs.MakeCArray +                        MicroHs.Names +                        MicroHs.Package +                        MicroHs.Parse +                        MicroHs.State +                        MicroHs.StateIO +                        MicroHs.SymTab +                        MicroHs.TargetConfig +                        MicroHs.TCMonad +                        MicroHs.Translate +                        MicroHs.TypeCheck+                        MhsEval++  other-modules:        MHSPrelude+                        Text.ParserComb+                        Text.PrettyPrint.HughesPJLite+                        Data.Integer+                        Paths_MicroHs+                        PrimTable+                        System.Compress+                        System.Console.SimpleReadline+                        System.IO.MD5+                        System.IO.Serialize+                        System.IO.TimeMilli+                        System.IO.Transducers+  if impl(ghc)+    hs-source-dirs:     ghc src+    build-depends:      base         >= 4.10 && < 4.30,+                        bytestring   >= 0.5 && < 0.20,+                        deepseq      >= 1.1 && < 1.8,+                        filepath     >= 1.1 && < 1.8,+                        ghc-prim     >= 0.5 && < 0.15,+                        haskeline    >= 0.8 && < 0.10,+                        time         >= 1.9 && < 1.20,+                        process      >= 1.6 && < 1.10,+                        directory    >= 1.2 && < 1.6,+                        text         >= 2.0 && < 2.5,+                        array        >= 0.5 && < 0.6+    include-dirs:       src/runtime src/runtime/unix+    install-includes:   mhseval.h config.h extra.c+    c-sources:          src/runtime/mhseval.c+    includes:           mhseval.h++  if impl(hugs)+    hs-source-dirs:     hugs src+    other-modules:      System.FilePath++  if impl(mhs)+    hs-source-dirs:     mhs src+    build-depends:      base         >= 0.1 && < 10.0,+    other-modules:      System.FilePath
README.md view
@@ -43,7 +43,6 @@ The language is an extended subset of Haskell-2010.  Differences:- * There is only deriving for `Bounded`, `Enum`, `Eq`, `Ord`, `Show`, and `Typeable`.  * Kind variables need an explicit `forall`.  * Always enabled extension:    * AllowAmbiguousTypes@@ -53,15 +52,21 @@    * ConstraintKinds    * DefaultSignatures    * DeriveAnyClass+   * DerivingDataTypeable+   * DerivingFoldable+   * DerivingFunctor    * DerivingStrategies+   * DerivingTraversable    * DerivingVia    * DoAndIfThenElse    * DuplicateRecordFields    * EmptyCase    * EmptyDataDecls+   * EmptyDataDeriving    * ExistentialQuantification    * ExplicitNamespaces    * ExtendedDefaultRules+   * ExtraInstanceBindings    * FlexibleContexts    * FlexibleInstance    * ForeignFunctionInterface@@ -76,14 +81,14 @@    * KindSignatures    * LambdaCase    * LiberalTypesynonyms-   * MonoLocalBinds+   * MagicHash    * MultilineStrings    * MultiParamTypeClasses    * MultiWayIf    * NamedDefaults    * NamedFieldPuns    * NegativeLiterals-   * NoMonomorphismRestriction+   * NondecreasingIndentation    * NoStarIsType    * NumericUnderscores    * OrPatterns@@ -96,6 +101,7 @@    * PolymorphicComponents    * RankNTypes    * RecordWildCards+   * RecursiveDo (just `rec`, not `mdo`)    * RequiredTypeArguments    * QualifiedDo    * ScopedTypeVariables@@ -277,6 +283,7 @@ * `:reload` Reload all modules * `:type EXPR` Show type of `EXPR` * `:kind TYPE` Show kind of `TYPE`+* `:set FLAG` Set flag * `expr` Evaluate expression. * `defn` Add definition (can also be an `import`) @@ -354,20 +361,25 @@  ### Hackage Hackage is full of great packages, unfortunately most of them contain some GHC specific code.-There is a handful packages that works with mhs out of the box, or have been converted:-* `containers`-* `cpphs`-* `hscolour`-* `mtl` changes not merged yet, use [github.com/augustss/mtl](https://github.com/augustss/mtl)-* `parsec` changes not merged yet, use [github.com/augustss/parsec](https://github.com/augustss/parsec)-* `polyparse`-* `pretty`-* `time`-* `transformers`+Some compile, most don't.  Some have replacement, most don't.  Here's a summary of+the current state: -Some of these might not have be released on hackage yet, but the github repo works.+#### Packages included with the compiler+* `array` some of the functionality+* `base`  most of what GHC has in `base`+* `bytestring` some of the functionality+* `deepseq` some of the functionality+* `directory` some of the functionality+* `hashable` a little of the functionality+* `integer-logarithms`+* `process` very little of the functionality+* `stm` most of the functionality+* `text` some of the functionality -Contributions to this list are very welcome.+#### Package status+You can find the [status for various packages](https://docs.google.com/spreadsheets/d/1e0dbUg5uuFKNwgMpwtBnYRldPCYYyBqYfsbyhEjf5bU/edit?usp=sharing).+If a package is not in the list it just means that nobody has reported success of failure with the package.+Please do so.  ## Files There is a number of subdirectories:@@ -548,18 +560,32 @@  # Thank You A big thanks goes to the people who have contributed to MicroHs:+@amigalemming+@arossato+@benclifford+@claudeha @dmjio gay@disroot.org @gergoerdi+@ikervagyok @jmaessen @juhp @kolmodin @konsumlamm @liolin+@lortabac+@MaximilianAlgehed+@meooow25+@philderbeast @rewbert+@sol+@Superstar64+@thielema @thimc+@thma @treeowl @TristanCacqueray+@tvmaaren @yobson  @@ -570,7 +596,3 @@ *   * 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.  10000+ lines of Haskell seems excessive.-       6000+ lines of C is also more than I'd like for such a simple system.
generated/cpphs.c view
@@ -1,2206 +1,2271 @@-static unsigned char data[] = {-122,76,90,49,146,171,0,0,31,118,56,46,48,10,57,55,51,10,65,32,-95,48,32,95,50,52,32,64,95,50,53,32,95,51,53,32,64,95,51,55,-32,1,64,64,224,22,4,1,52,48,224,22,13,0,50,224,22,0,1,49,-49,160,23,7,51,54,50,32,64,67,39,32,224,17,0,5,64,66,32,95,-49,50,160,11,7,83,32,83,32,95,51,54,54,64,4,0,56,96,45,31,-57,32,95,51,55,49,32,73,32,64,64,102,114,111,109,85,84,70,56,32,-34,45,45,99,112,112,34,32,64,64,64,64,64,24,3,95,51,56,54,64,-12,64,73,224,103,0,1,56,56,64,79,3,39,32,83,39,224,194,0,10,-64,64,67,39,66,32,66,32,95,51,57,64,17,0,50,96,58,224,108,26,-6,118,101,114,115,105,111,110,128,112,96,188,192,80,12,66,32,95,52,49,-54,32,64,67,32,95,50,53,64,237,64,5,7,79,32,35,51,50,32,64,-75,64,94,1,52,49,64,254,64,8,1,50,51,65,16,96,133,224,150,62,-2,104,101,108,161,4,224,147,12,0,66,128,147,224,49,1,6,85,115,97,-103,101,58,32,96,50,224,176,4,224,34,1,21,32,91,102,105,108,101,32,-46,46,46,93,32,91,32,45,68,115,121,109,32,92,124,128,8,3,61,118,-97,108,96,12,12,73,112,97,116,104,32,93,42,32,32,91,45,79,64,47,-2,93,94,42,64,84,224,75,6,15,94,41,94,41,91,45,45,110,111,109,-97,99,114,111,93,32,96,11,3,108,105,110,101,96,10,64,8,5,112,114,-97,103,109,97,96,14,224,10,2,3,116,101,120,116,224,81,20,4,115,116,-114,105,112,96,42,96,9,3,45,101,111,108,96,13,5,104,97,115,104,101,-115,128,93,4,97,121,111,117,116,96,10,3,117,110,108,105,192,79,224,74,-6,0,32,98,71,3,32,115,116,100,64,7,8,45,111,112,116,105,111,110,-115,32,96,54,7,105,110,99,108,117,100,101,61,64,223,4,110,97,109,101,-93,161,105,225,203,8,7,66,32,67,32,67,39,32,83,98,213,128,8,160,-9,160,12,96,13,224,29,0,0,39,97,161,0,66,64,11,224,8,5,0,-39,65,177,0,66,226,20,2,0,66,98,35,226,19,2,2,52,50,53,224,-91,0,224,38,3,193,240,128,10,225,243,6,6,110,107,110,111,119,110,32,-128,219,129,251,64,178,0,39,193,255,1,52,50,128,57,224,55,6,10,44,-32,102,111,114,32,118,97,108,105,100,160,59,4,115,32,116,114,121,226,60,-5,226,55,2,130,141,129,101,225,36,4,3,55,32,35,49,225,57,0,96,-121,96,235,224,232,2,64,139,224,229,1,100,26,4,56,50,32,95,55,67,-191,4,95,57,57,32,64,96,64,228,88,0,64,234,224,120,1,18,65,116,-32,109,111,115,116,32,111,110,101,32,111,117,116,112,117,116,32,98,193,20,-40,45,79,41,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,-100,96,156,224,152,2,64,111,128,0,131,144,0,67,161,67,0,83,64,31,-64,126,129,108,0,66,161,153,1,51,57,196,178,3,64,95,57,52,64,7,-2,95,51,53,68,185,1,48,57,96,72,129,231,128,26,2,95,51,50,128,-20,64,15,65,182,2,95,57,52,65,104,2,95,57,52,101,15,1,57,52,-96,95,2,95,57,55,225,29,2,9,58,57,55,50,32,64,10,65,32,89,-66,23,1,32,66,96,142,130,93,98,29,64,5,226,64,0,4,66,32,95,-53,48,64,89,64,18,128,122,224,9,12,160,65,66,102,10,66,32,95,56,-56,55,32,64,95,55,48,96,132,128,6,1,64,66,96,111,1,80,32,68,-176,192,119,161,16,64,251,128,65,2,32,61,61,65,137,128,173,64,125,0,-85,160,25,3,95,49,50,51,224,194,0,224,82,43,129,133,224,82,68,128,-61,224,82,24,2,95,57,54,160,20,128,72,160,2,224,60,0,98,11,129,-124,128,20,224,21,0,64,1,194,27,64,92,1,52,52,64,4,3,55,32,-64,35,97,236,160,0,224,85,3,64,162,224,85,4,65,155,224,81,4,0,-67,160,121,224,19,4,224,99,12,0,55,162,90,198,57,0,39,64,2,100,-71,226,176,3,164,80,64,103,0,80,96,26,225,4,4,224,97,1,98,239,-1,57,55,71,194,1,53,48,132,211,224,87,9,192,140,128,11,2,67,39,-32,64,82,225,86,6,224,52,2,96,237,224,51,3,160,26,96,53,67,225,-64,54,129,207,2,95,49,54,103,249,97,120,96,48,162,236,1,32,64,225,-87,4,135,71,193,38,225,126,16,128,38,98,30,96,101,192,17,128,130,224,-175,5,96,40,192,129,160,135,160,6,0,58,99,152,3,10,65,32,83,96,-145,96,153,2,32,95,57,128,170,128,131,194,121,225,255,11,0,83,64,233,-128,251,226,66,0,224,37,3,71,216,196,48,130,13,224,32,6,0,56,96,-70,225,254,14,96,194,69,178,68,120,0,66,64,150,73,150,2,56,56,57,-160,33,229,30,1,2,47,92,92,229,145,1,64,46,2,95,57,54,105,42,-128,117,192,67,132,223,1,57,54,65,42,97,169,64,190,0,85,99,106,0,-64,64,235,133,14,2,95,51,54,67,254,4,79,32,35,52,57,136,222,5,-64,64,64,85,32,65,64,8,3,95,52,52,49,99,102,224,166,0,1,64,-35,96,45,128,0,65,50,3,95,51,55,56,160,27,232,211,17,199,118,128,-181,165,69,224,234,4,96,136,0,55,70,86,0,48,192,94,64,68,0,67,-70,49,0,48,169,51,67,217,64,56,0,58,98,214,5,10,65,32,79,32,-80,230,52,2,232,148,0,104,99,0,57,70,202,0,64,224,33,9,72,161,-160,32,65,112,224,32,7,232,192,1,160,36,66,26,224,36,7,224,32,4,-65,210,224,32,7,72,236,160,30,64,183,224,30,7,104,224,160,31,65,83,-224,31,12,73,0,160,35,65,219,224,35,7,137,22,160,32,65,21,224,201,-8,105,44,128,32,0,54,65,84,224,32,7,105,66,160,31,130,1,225,43,-7,2,119,97,114,107,30,1,95,57,75,222,194,27,128,0,0,58,97,139,-1,10,65,98,85,133,155,1,85,32,64,21,0,56,224,21,2,64,86,128,-21,0,55,96,21,64,19,1,52,32,65,217,0,58,98,177,224,40,0,64,-94,128,40,0,53,160,40,1,95,49,130,142,1,95,49,103,179,0,58,99,-164,99,185,224,1,8,3,39,32,95,57,64,44,71,204,71,106,139,102,2,-57,53,49,71,182,98,6,224,26,14,198,80,224,27,11,133,50,224,19,5,-99,189,224,18,5,99,118,64,129,0,49,65,233,224,27,9,224,17,5,196,-237,224,112,11,100,59,224,19,6,102,17,224,18,4,97,201,224,18,6,99,-144,224,84,12,97,182,65,59,0,51,225,126,0,0,48,193,126,136,147,3,-80,32,35,57,192,17,133,26,3,80,32,35,56,192,17,131,102,3,80,32,-35,55,160,17,64,145,128,17,193,198,64,183,128,17,0,53,192,17,225,235,-0,0,54,192,17,129,234,3,80,32,35,51,192,17,193,230,73,173,128,17,-129,222,64,162,192,17,224,180,0,192,179,65,203,78,187,1,54,54,136,41,-198,93,165,138,2,67,32,60,69,71,161,145,224,25,9,136,230,224,26,13,-98,10,135,191,230,173,0,160,26,171,143,0,85,69,59,69,70,232,144,1,-134,89,66,122,1,64,85,194,168,129,224,0,85,64,61,103,176,224,49,5,-64,102,160,49,128,37,133,90,132,222,128,0,224,132,13,162,197,224,87,15,-64,30,224,87,21,224,59,17,65,21,224,59,10,2,57,53,48,67,134,206,-173,224,160,1,225,67,15,96,64,224,189,13,98,180,225,66,12,64,25,225,-66,16,224,44,6,64,36,224,43,11,224,116,13,96,29,224,70,11,102,73,-224,114,30,144,229,224,114,10,225,3,14,194,70,224,25,9,235,211,0,224,-168,8,176,228,224,124,9,100,63,224,168,30,108,140,225,27,32,226,210,16,-226,209,20,224,43,6,226,203,2,225,27,6,192,115,227,98,5,225,0,16,-226,219,1,224,97,6,226,213,2,224,141,24,226,197,2,224,141,5,224,44,-11,226,117,15,136,156,0,51,165,63,68,113,133,19,76,165,209,206,70,183,-64,74,172,157,96,20,128,216,206,82,96,8,205,205,1,49,53,162,252,99,-85,201,126,224,16,3,105,105,224,122,0,96,117,133,119,203,204,224,1,3,-172,95,160,66,224,29,18,224,26,17,224,23,14,224,20,11,224,17,8,224,-14,5,224,11,2,192,8,108,147,128,0,0,58,103,148,101,193,5,75,32,-95,51,51,55,232,93,2,29,92,34,99,112,112,104,115,115,114,99,47,109,-97,108,99,111,108,109,45,119,97,108,108,97,99,101,45,117,110,105,83,153,-1,101,47,96,33,6,45,49,46,50,48,46,57,128,12,9,46,104,115,92,-34,44,56,48,58,49,138,72,102,20,79,114,2,10,65,32,65,88,0,75,-139,227,74,139,96,118,138,104,0,90,203,14,0,58,111,172,96,43,0,90,-224,43,0,134,136,240,17,3,103,205,208,19,193,158,129,231,143,113,224,29,-1,172,126,0,57,65,183,193,217,66,100,98,219,241,206,2,1,95,57,112,-228,0,54,71,154,85,85,141,183,0,57,85,73,64,0,0,80,233,121,4,-3,115,116,100,105,169,118,0,52,66,15,108,117,1,95,55,141,196,0,58,-112,135,71,4,2,55,48,51,149,185,0,58,96,38,96,196,65,131,1,95,-57,117,183,1,57,52,66,193,131,103,2,95,54,57,66,225,64,193,245,74,-1,2,54,57,57,242,81,3,14,84,70,45,56,47,47,82,79,85,78,68,-84,82,73,80,172,95,204,197,242,152,1,86,2,96,189,0,52,135,24,64,-213,69,37,0,58,96,205,1,10,65,65,134,0,50,96,148,131,58,161,50,-1,57,51,101,189,0,54,77,127,128,49,0,58,96,167,226,230,0,2,95,-57,51,99,133,97,104,110,109,0,95,96,95,128,127,160,199,193,115,192,15,-128,215,134,214,239,37,3,0,95,99,72,0,95,143,180,0,58,96,123,96,-104,0,95,70,215,0,51,65,128,132,136,0,83,110,187,96,124,99,138,2,-95,57,51,101,141,96,9,96,108,96,9,104,82,0,58,96,160,65,121,1,-57,51,68,33,83,97,0,58,96,27,128,19,2,53,32,58,96,61,224,33,-2,0,56,96,33,130,97,192,19,96,249,64,91,160,249,96,146,97,83,242,-150,5,64,125,160,200,96,159,105,207,86,128,226,140,0,96,27,128,25,160,-234,0,58,64,99,97,116,169,53,101,21,69,70,0,58,96,58,20,10,65,-32,73,79,46,115,101,116,109,97,115,107,105,110,103,115,116,97,116,101,64,-182,129,170,224,138,0,82,132,64,90,109,166,0,58,97,48,96,84,109,239,-65,187,101,64,66,232,192,15,96,131,97,18,64,6,177,134,128,255,64,68,-66,22,2,50,32,58,96,17,130,34,96,25,129,59,0,75,67,98,0,58,-96,60,128,160,0,103,224,160,8,64,148,96,160,1,49,52,131,64,0,58,-99,80,76,14,98,8,227,148,6,3,95,56,57,48,97,220,1,95,57,84,-125,1,95,56,79,119,2,95,56,56,133,93,65,54,128,57,227,242,13,131,-155,147,253,196,239,248,203,1,194,146,241,141,0,163,117,1,56,56,65,161,-120,23,2,95,57,50,99,227,146,31,101,23,235,157,0,0,56,143,230,144,-127,147,248,172,58,1,57,48,128,5,64,65,65,255,65,55,148,137,0,55,-140,101,130,23,2,55,51,53,64,214,135,77,172,253,0,56,65,131,128,58,-128,70,2,64,95,56,143,48,0,56,111,48,96,0,0,58,97,11,162,28,-0,65,107,81,1,64,75,88,213,73,131,100,186,0,58,96,86,164,72,70,-233,160,133,64,142,88,183,64,139,0,57,137,203,65,112,121,32,65,42,74,-125,135,82,0,57,138,224,1,57,49,135,80,3,95,57,49,57,97,171,194,-64,149,1,229,31,0,0,79,99,115,145,154,133,60,161,206,164,172,241,98,-10,180,4,224,39,25,165,101,132,77,64,40,101,169,0,54,178,63,129,78,-160,231,96,16,224,136,0,3,64,64,82,32,129,199,224,103,0,0,83,160,-103,179,203,96,10,162,3,241,195,5,208,188,224,90,27,224,35,27,72,165,-100,48,65,71,134,210,96,37,226,62,1,98,65,98,101,243,103,20,0,57,-132,56,128,183,224,181,1,139,214,230,5,1,10,98,101,103,105,110,123,99,-111,100,101,125,134,0,160,158,161,216,243,218,4,64,99,224,133,1,166,40,-225,17,8,224,120,9,242,47,25,2,101,110,100,224,131,3,224,133,7,226,-94,0,229,8,0,97,65,1,95,57,166,144,128,0,166,55,226,33,17,143,-27,160,153,224,184,9,69,182,192,30,128,96,212,51,1,95,52,64,32,128,-250,70,119,71,11,69,219,0,51,128,127,160,147,1,57,49,68,115,5,53,-48,55,32,95,54,134,74,1,95,52,103,3,96,192,99,208,224,200,0,224,-100,2,96,57,116,183,84,229,165,239,224,241,1,248,54,0,128,114,0,52,-116,151,225,30,1,132,125,128,44,225,52,14,0,58,96,8,133,144,135,168,-64,53,3,10,65,32,90,160,1,87,91,96,38,0,54,96,22,2,66,32,-90,64,149,224,4,1,96,6,169,231,0,58,96,229,224,37,11,0,90,66,-210,160,34,133,169,3,75,32,75,51,96,110,133,126,107,82,193,152,203,75,-226,188,7,68,189,100,89,64,30,0,82,160,47,214,3,71,156,250,133,0,-128,59,129,244,99,164,168,37,224,2,0,128,20,224,21,14,163,230,224,2,-0,224,43,0,224,15,2,134,8,162,72,64,3,224,19,0,193,19,224,16,-2,247,245,0,130,13,224,154,11,236,44,0,192,83,228,89,2,200,153,0,-75,133,166,128,24,1,95,51,113,252,163,72,96,5,1,95,57,79,189,227,-57,1,6,112,114,111,103,114,97,109,99,55,224,21,1,5,99,111,109,109,-101,110,115,234,128,75,165,21,73,99,229,12,3,165,38,163,167,101,214,192,-49,224,228,3,160,225,247,119,3,105,128,64,51,0,56,72,170,72,115,193,-151,224,47,1,160,251,161,14,161,11,224,255,4,233,147,3,160,249,96,253,-224,176,41,224,177,53,192,60,225,196,46,162,89,128,157,96,30,67,44,227,-61,0,225,198,26,225,176,3,225,220,13,183,30,225,203,103,68,48,103,169,-128,213,198,178,161,29,227,152,1,224,68,19,0,58,96,140,138,79,129,51,-96,60,160,5,230,151,2,238,45,3,1,92,34,160,246,230,115,0,128,46,-97,114,128,196,254,234,6,4,76,105,110,101,32,160,52,193,35,223,29,0,-49,73,67,0,51,252,162,2,224,59,6,0,58,160,56,97,23,96,50,224,-34,8,0,32,88,40,5,32,98,101,102,111,114,160,102,255,62,10,64,35,-0,46,255,61,2,192,170,97,123,224,10,8,224,99,8,1,73,110,158,245,-192,63,225,234,2,96,105,224,249,14,2,32,97,116,128,157,224,253,136,96,-0,225,173,161,0,58,99,150,98,169,64,1,0,80,72,166,66,252,195,0,-167,163,104,40,224,15,2,96,168,132,50,224,193,10,231,216,4,224,14,0,-64,67,0,58,107,91,206,22,5,54,32,95,55,32,95,64,17,1,95,54,-227,106,0,80,139,64,25,0,54,78,118,2,95,56,57,230,253,5,74,221,-103,61,185,19,80,49,2,95,57,48,109,202,0,48,109,154,172,14,108,174,-235,199,3,236,72,31,96,173,3,80,32,95,56,111,198,233,190,4,218,28,-0,58,109,57,241,144,1,177,105,96,24,241,169,0,64,22,224,24,3,136,-129,96,24,64,2,97,28,0,58,96,179,128,22,0,51,168,155,160,49,64,-27,200,119,64,1,0,89,193,129,64,1,239,211,0,237,178,0,140,105,159,-6,250,195,0,133,36,197,183,232,32,7,160,21,96,18,192,88,140,182,224,-35,7,224,41,3,224,43,1,96,136,235,100,3,226,103,1,7,95,95,70,-73,76,69,95,95,227,23,2,224,79,54,2,76,73,78,224,79,20,166,13,-224,79,32,2,68,65,84,224,79,68,2,84,73,77,224,79,5,96,45,192,-77,113,186,192,65,96,10,236,209,2,93,255,93,236,160,34,66,184,172,81,-224,151,1,224,2,7,192,30,225,79,3,224,106,2,224,181,7,224,49,2,-224,151,15,224,85,0,224,14,3,206,199,196,17,224,30,0,229,210,0,224,-173,6,224,118,2,234,45,6,224,18,2,128,56,64,200,240,96,0,64,3,-224,24,3,229,253,0,231,253,1,0,95,67,184,150,199,192,5,153,207,225,-34,1,0,79,128,149,64,48,72,142,192,189,3,95,55,53,55,64,168,2,-50,48,49,172,249,238,197,0,104,96,253,243,2,224,173,3,224,175,1,224,-22,65,225,172,13,160,25,97,15,97,80,200,227,225,95,7,224,89,5,119,-245,160,0,226,190,3,128,85,192,35,96,85,224,59,4,226,219,12,226,246,-0,129,65,161,45,133,17,0,57,177,32,64,7,2,95,55,55,248,73,1,-224,56,1,184,13,104,180,192,115,128,88,242,116,3,96,15,2,55,57,53,-192,16,230,3,7,229,244,8,224,101,0,226,46,6,226,52,3,224,233,2,-226,54,1,234,53,5,226,58,16,227,94,4,98,62,224,56,1,109,254,129,-43,1,95,55,115,87,226,41,7,226,252,7,120,223,248,3,53,22,76,97,-110,103,117,97,103,101,47,80,114,101,112,114,111,99,101,115,115,111,114,47,-67,64,34,8,47,77,97,99,114,111,80,97,115,184,35,5,49,53,50,58,-50,50,196,114,225,108,6,1,95,54,68,166,128,9,230,38,2,3,95,56,-57,52,64,180,0,53,234,122,5,7,37,72,58,37,77,58,37,83,202,130,-1,95,56,97,242,226,131,18,224,104,47,6,100,32,37,98,32,37,89,224,-104,31,65,210,96,18,64,113,232,97,1,2,95,57,48,178,133,224,38,14,-1,49,52,112,172,181,164,0,48,226,78,0,224,101,8,227,146,2,97,239,-96,219,64,30,244,52,3,232,125,0,160,2,96,19,226,57,3,231,90,7,-160,2,224,39,12,226,180,0,224,120,9,224,124,15,224,181,8,224,141,3,-131,221,234,80,0,224,194,17,224,97,36,173,6,66,245,104,144,137,235,160,-231,128,10,224,75,0,64,142,2,95,50,53,151,84,205,13,2,95,49,55,-120,136,73,67,1,51,57,208,196,2,95,57,48,64,87,244,68,2,103,83,-1,57,48,173,81,160,220,1,95,56,89,89,129,26,1,95,55,73,136,144,-34,64,0,0,58,105,243,105,23,114,81,196,93,1,95,52,120,215,96,149,-246,201,1,243,57,0,105,25,96,61,0,51,234,239,4,0,75,71,125,0,-54,227,178,2,75,34,6,98,114,101,97,107,115,44,76,101,227,193,68,6,-72,97,115,104,68,101,102,75,132,99,194,3,50,53,58,54,131,8,224,134,-126,107,125,120,172,98,1,64,7,0,58,97,178,202,163,64,14,140,48,106,-251,65,204,0,58,99,140,88,186,228,19,0,2,56,57,55,234,158,5,98,-41,0,56,148,127,0,50,73,63,123,245,2,35,49,48,163,199,0,58,100,-7,89,26,1,32,58,96,40,64,78,2,56,57,54,64,13,139,56,3,94,-71,69,84,73,100,3,77,73,76,76,96,36,0,54,128,36,80,105,225,53,-1,16,100,101,102,97,117,108,116,84,105,109,101,76,111,99,97,108,101,64,-214,0,58,100,134,148,14,230,35,0,228,78,3,67,12,83,228,99,13,0,-58,68,185,162,33,98,238,131,108,172,69,195,70,221,120,227,224,4,224,30,-1,128,16,93,47,0,50,224,40,1,227,130,1,120,83,234,72,1,2,79,-32,35,89,240,96,126,224,45,2,224,120,6,224,100,1,224,9,8,0,39,-236,30,5,172,45,64,16,228,116,0,232,23,6,164,137,240,150,3,244,147,-13,224,182,3,242,46,2,228,214,10,232,83,12,161,8,0,64,104,171,140,-244,160,61,172,145,224,8,2,234,163,4,224,69,2,225,42,7,0,49,236,-226,2,224,157,5,132,164,247,251,6,64,50,237,21,3,224,188,5,189,85,-167,241,64,244,248,164,0,229,51,3,159,93,225,253,1,160,10,1,95,55,-122,203,96,0,160,96,224,186,3,226,37,2,225,50,9,160,2,224,29,1,-165,193,230,103,6,224,220,0,97,164,224,17,3,138,89,224,31,1,128,13,-64,71,233,198,2,146,172,2,95,56,52,155,95,64,0,225,115,3,224,2,-0,225,124,31,230,52,2,192,45,224,73,13,224,67,1,225,141,8,225,192,-4,192,175,100,26,138,248,161,42,244,120,1,243,108,1,2,49,57,49,243,-109,5,224,54,3,224,53,16,243,162,7,224,52,3,0,75,225,163,3,155,-226,130,0,160,6,134,121,224,37,2,64,16,64,97,160,66,226,4,2,90,-59,80,102,0,73,166,175,226,214,1,227,11,15,226,177,3,248,237,2,128,-113,64,5,0,58,108,12,230,237,42,159,44,103,158,69,38,93,82,102,236,-128,212,0,67,74,236,196,238,133,207,132,43,149,174,96,2,235,184,3,238,-174,3,133,20,161,245,94,114,0,50,254,120,0,2,95,56,56,137,252,94,-140,194,129,139,146,128,233,2,83,32,85,66,7,241,83,8,98,204,160,4,-229,162,1,64,180,178,96,251,71,15,8,35,105,110,99,108,117,100,101,32,-202,81,210,244,224,48,15,1,92,34,242,254,2,243,68,8,0,35,115,68,-0,49,192,77,224,138,2,81,168,224,69,14,64,239,131,93,255,66,3,0,-83,64,125,0,57,82,133,76,112,0,51,76,118,64,111,0,51,64,204,2,-56,56,57,252,31,22,2,92,92,47,160,95,161,83,65,168,243,58,6,130,-117,161,172,226,13,0,0,52,99,233,98,84,2,95,51,54,155,132,128,42,-0,58,64,118,135,52,5,56,48,32,75,32,85,228,69,0,227,169,1,129,-21,224,11,0,2,95,56,56,196,223,0,58,96,200,242,143,0,224,46,1,-224,61,17,192,8,187,72,96,75,243,3,0,128,144,0,54,224,17,1,104,-108,98,57,200,108,136,94,96,255,128,18,0,50,104,130,64,18,227,20,2,-165,68,128,9,132,130,135,48,229,112,2,225,40,1,196,160,194,238,160,164,-2,95,56,55,129,77,244,54,0,99,194,2,95,52,51,80,51,134,16,225,-105,2,98,254,67,204,3,95,56,56,49,168,234,67,119,0,55,65,163,190,-209,78,53,189,12,0,56,81,223,0,58,99,41,244,53,1,161,4,96,206,-181,131,0,39,66,231,157,33,0,54,171,4,98,131,95,210,2,56,55,50,-72,80,67,71,162,147,64,5,0,79,149,103,229,78,0,3,95,56,55,57,-96,106,169,146,0,56,94,137,0,55,64,83,128,197,0,58,96,31,248,153,-3,231,241,2,64,110,129,31,134,133,131,241,2,95,56,51,66,187,97,35,-253,203,3,128,13,229,145,2,128,35,0,48,77,121,137,222,135,238,1,95,-56,79,212,0,58,96,46,226,62,2,136,162,225,162,1,225,171,4,230,63,-4,232,189,1,225,118,0,64,184,228,130,0,102,61,201,170,1,95,51,65,-39,1,95,52,99,111,64,15,0,48,234,130,1,5,52,49,53,32,95,52,-64,149,227,248,8,31,85,110,109,97,116,99,104,101,100,32,35,105,102,58,-32,112,111,115,105,116,105,111,110,115,32,111,102,32,111,112,101,110,12,32,-99,111,110,116,101,120,116,32,97,114,101,58,163,251,64,81,70,19,131,211,-106,79,1,52,51,201,53,228,10,0,232,78,1,133,242,98,193,224,225,6,-96,227,0,66,65,222,224,54,10,224,42,7,242,105,25,231,141,4,238,154,-0,224,40,1,161,55,200,79,224,25,3,242,46,0,224,69,9,224,72,0,-224,184,7,96,75,224,146,13,163,160,167,187,66,104,100,245,184,80,192,0,-226,4,10,160,53,224,31,20,226,42,0,130,181,224,171,2,163,231,224,36,-6,224,71,16,160,43,224,146,2,224,41,15,224,50,1,224,191,26,224,45,-2,224,93,5,192,175,224,31,4,224,2,12,224,52,4,224,191,23,224,56,-17,99,30,224,42,2,224,5,6,225,61,7,224,60,6,225,211,8,224,1,-5,247,19,14,0,100,110,96,247,17,2,224,0,0,224,177,6,224,140,3,-224,14,9,224,140,61,4,117,110,100,101,102,224,139,26,225,79,6,225,45,-7,224,139,60,1,105,102,224,140,132,224,139,14,227,75,3,224,139,12,192,-11,227,165,0,128,0,224,131,19,224,178,7,224,43,19,224,175,16,224,172,-10,225,55,6,226,65,6,224,198,4,224,129,57,2,101,108,115,226,213,11,-224,131,102,225,7,12,225,179,6,224,131,86,1,110,100,225,140,121,5,112,-114,97,103,109,97,224,133,10,199,81,0,66,120,0,192,13,96,98,250,247,-4,141,143,224,22,3,192,134,103,28,224,11,10,239,150,9,128,125,192,16,-250,249,8,128,233,230,255,6,232,4,4,65,8,238,9,2,84,244,184,160,-106,127,224,212,0,160,0,231,152,3,249,219,5,225,108,6,227,156,4,224,-159,1,224,1,1,225,135,11,224,39,11,64,1,227,144,15,141,127,225,130,-8,230,86,6,228,48,12,224,100,9,224,144,10,224,36,9,64,1,224,141,-14,6,119,97,114,110,105,110,103,224,141,7,226,117,4,226,132,6,224,113,-54,4,101,114,114,111,114,224,111,10,224,2,9,224,247,0,224,87,6,224,-149,0,224,68,2,224,128,11,128,34,224,132,12,78,181,224,131,6,224,61,-7,207,193,78,22,112,105,1,51,49,234,95,2,239,225,0,227,43,6,129,-173,96,65,227,41,0,224,8,4,64,189,204,46,138,82,2,95,49,53,83,-68,1,52,51,74,196,0,52,137,232,128,72,112,227,106,218,109,106,64,67,-1,95,52,76,27,98,252,66,245,1,52,52,188,91,224,27,2,142,60,224,-211,6,225,181,6,225,202,2,227,218,1,224,38,8,224,19,10,224,16,7,-224,13,0,108,223,142,250,128,28,128,20,107,243,1,53,49,113,97,0,55,-92,174,225,67,2,227,171,3,226,0,34,235,132,9,64,1,235,79,14,0,-83,64,71,225,97,0,225,197,0,80,87,236,246,2,192,0,225,211,12,253,-62,1,128,251,237,32,0,193,166,64,76,0,57,64,20,76,174,1,95,54,-193,193,237,63,4,128,15,237,66,5,0,87,131,123,20,58,32,117,110,107,-110,111,119,110,32,100,105,114,101,99,116,105,118,101,32,35,130,156,98,2,-146,14,224,61,8,4,94,42,105,110,32,96,38,237,73,7,224,203,7,165,-209,97,234,128,150,226,39,4,226,11,9,129,201,1,95,54,115,49,225,165,-6,226,243,255,128,2,226,243,4,128,31,160,45,226,245,11,116,199,2,95,-51,54,230,161,1,225,92,3,96,206,89,157,96,97,225,247,44,230,208,2,-160,226,130,159,65,117,128,5,194,158,128,166,231,70,26,96,31,226,62,3,-163,8,227,5,1,96,13,226,233,4,226,180,46,224,146,31,64,0,231,178,-7,161,204,232,131,16,245,158,6,226,13,1,226,186,0,129,220,224,131,1,-96,50,0,55,125,119,64,37,1,95,55,83,122,2,95,52,51,182,249,225,-72,0,224,98,0,0,85,161,87,192,86,228,58,3,119,87,224,193,1,128,-145,64,5,147,6,245,86,16,225,42,2,255,161,3,224,67,1,245,110,0,-147,57,224,80,2,115,89,163,195,224,0,0,224,222,1,160,9,161,98,133,-5,224,160,3,130,205,194,80,128,16,229,46,0,224,70,15,129,169,99,149,-66,252,226,233,1,242,87,44,107,48,93,203,226,48,10,241,246,11,224,149,-21,3,95,55,57,49,127,85,192,237,224,49,35,128,16,160,201,230,26,7,-226,69,4,226,101,3,194,9,1,95,56,66,43,226,59,1,193,93,193,195,-83,167,224,119,2,160,34,101,40,130,135,224,41,15,64,21,66,118,84,70,-225,232,1,224,59,37,96,180,103,12,224,70,6,192,55,99,23,161,33,128,-13,194,27,116,80,128,54,90,230,97,149,226,72,8,192,55,128,2,160,92,-227,35,2,224,28,8,224,15,5,224,64,3,64,26,224,33,5,69,129,117,-244,160,161,102,234,149,249,129,102,213,251,128,230,246,0,8,122,139,0,53,-64,19,65,20,64,19,166,119,96,0,224,206,8,76,187,131,3,1,95,51,-119,231,249,154,11,134,229,70,145,96,115,226,68,7,251,5,0,195,38,192,-17,224,94,5,99,58,247,72,0,224,119,27,224,61,17,193,43,162,19,128,-223,202,223,96,20,229,5,2,162,52,192,15,162,58,224,14,1,137,104,192,-53,96,32,134,177,192,101,97,85,135,223,1,56,55,96,216,96,235,1,56,-55,131,252,102,28,69,58,130,141,224,200,10,192,49,231,246,5,1,56,55,-245,2,1,192,139,165,180,224,171,2,224,170,0,226,63,1,160,9,96,8,-167,175,119,154,226,232,3,252,240,0,3,95,49,55,52,160,9,2,51,51,-57,97,184,160,32,86,183,2,55,53,55,253,156,0,110,151,1,64,35,102,-32,96,0,225,127,1,222,254,195,241,221,9,1,95,52,96,51,237,94,8,-161,157,74,70,226,124,1,226,207,1,231,126,12,232,247,6,225,0,5,192,-83,230,220,14,164,234,232,188,0,226,224,1,230,47,1,225,98,2,225,234,-1,64,124,203,126,235,178,4,139,169,224,49,4,225,129,0,224,77,5,160,-31,247,2,4,224,30,6,224,114,1,247,3,41,224,156,5,229,166,7,224,-2,1,247,202,10,226,76,0,224,90,10,138,193,224,90,0,239,165,9,224,-32,3,224,206,8,204,132,0,56,224,209,1,110,143,244,227,13,224,43,26,-96,39,224,30,17,244,161,9,227,236,2,237,93,7,224,166,2,224,195,1,-224,189,5,224,105,15,243,85,6,225,21,6,224,78,42,244,40,4,224,173,-5,224,77,1,224,74,1,0,67,224,74,17,243,107,5,128,46,99,44,101,-143,128,19,226,50,1,96,151,96,13,232,232,6,224,57,3,124,0,128,34,-66,61,192,122,92,8,156,9,230,213,2,128,101,64,34,251,236,0,128,34,-201,19,233,35,115,192,207,113,30,225,93,0,96,103,101,182,224,217,11,224,-251,24,161,87,196,73,230,246,0,160,0,225,26,1,239,79,4,233,64,36,-97,51,124,62,237,65,2,194,9,224,10,2,232,37,4,194,55,226,243,1,-232,202,0,224,240,19,230,195,1,137,26,224,223,7,224,122,1,161,77,235,-248,4,225,254,0,198,86,192,85,231,234,12,231,209,16,228,138,5,99,175,-239,213,4,226,176,2,97,151,231,99,37,224,192,1,231,70,18,230,57,9,-231,68,85,231,34,0,231,35,10,231,32,5,231,31,5,161,16,135,22,224,-245,29,224,228,19,231,30,5,231,23,3,96,13,2,51,51,55,227,142,2,-31,92,34,99,112,112,104,115,115,114,99,47,109,97,108,99,111,108,109,45,-119,97,108,108,97,99,101,45,117,110,105,118,101,3,114,115,101,47,96,33,-30,45,49,46,50,48,46,57,47,76,97,110,103,117,97,103,101,47,80,114,-101,112,114,111,99,101,115,115,111,114,47,67,64,34,64,5,0,73,69,192,-9,46,104,115,92,34,44,54,56,58,53,132,198,0,58,96,141,1,10,65,-139,181,64,170,87,53,132,191,196,202,65,61,66,194,226,120,3,194,122,0,-58,97,171,4,10,65,32,80,32,132,14,99,210,112,18,231,98,2,238,238,-1,98,168,0,95,169,116,160,15,1,35,57,164,142,96,12,96,43,192,33,-64,95,0,53,160,159,239,107,4,1,95,52,97,57,64,176,228,143,0,1,-64,64,171,148,0,58,98,176,5,10,65,32,85,32,90,224,1,2,0,75,-196,173,64,32,0,51,160,85,98,225,65,215,4,55,55,49,32,64,65,211,-160,253,194,28,128,184,99,6,1,54,55,64,108,67,92,139,193,1,95,56,-70,31,1,95,56,99,224,3,67,39,32,79,65,51,0,80,65,225,65,27,-240,165,10,0,35,157,140,0,32,199,104,96,174,0,79,128,243,162,74,96,-6,97,133,132,98,128,157,0,75,172,90,98,130,96,164,226,46,10,5,92,-34,44,48,58,48,225,215,0,0,50,96,225,3,95,56,55,48,224,37,2,-3,112,114,101,68,96,131,0,100,64,39,0,58,96,169,1,10,65,102,242,-114,93,65,232,3,95,55,48,54,65,180,196,95,138,103,0,58,64,72,129,-84,1,75,50,65,75,129,78,0,58,96,253,128,22,0,51,96,22,98,30,-0,58,97,26,161,97,64,1,194,31,64,0,227,42,1,168,44,227,145,6,-129,128,224,25,15,233,18,2,224,29,13,233,51,3,224,33,16,224,36,3,-224,37,20,224,40,4,224,41,23,224,44,5,224,45,26,224,48,6,224,49,-29,224,52,7,231,6,3,224,38,4,232,233,6,237,147,0,224,0,1,193,-138,224,55,5,224,103,14,224,40,19,224,43,6,224,83,30,224,75,16,224,-41,50,192,232,199,152,165,129,244,177,6,224,5,9,235,187,0,225,21,3,-192,1,0,89,224,96,1,224,28,9,224,32,6,224,172,14,230,121,1,224,-42,2,224,74,11,172,71,192,155,233,31,1,192,5,224,105,2,192,67,230,-182,5,192,250,64,25,245,180,1,160,13,224,2,4,224,242,16,165,197,5,-67,32,60,32,64,35,237,33,3,224,67,9,128,218,192,34,224,70,5,160,-203,128,70,230,235,2,224,37,5,148,227,224,22,4,75,207,192,19,224,103,-3,238,18,6,224,13,5,97,94,230,121,9,64,0,65,32,0,85,81,214,-70,32,134,105,81,175,224,27,0,129,66,64,74,65,98,98,10,69,201,0,-52,104,119,234,231,0,225,39,9,224,186,0,224,25,4,0,82,224,187,0,-227,133,7,128,24,224,41,1,225,236,1,224,184,5,150,244,224,44,7,225,-176,0,224,64,4,96,185,238,212,5,200,238,224,221,12,96,5,150,59,230,-161,5,1,32,32,236,220,0,224,252,11,224,134,1,128,13,234,242,1,97,-89,235,92,0,234,142,0,224,0,4,224,178,1,128,1,238,240,9,226,70,-17,128,28,162,70,235,165,1,224,37,4,225,8,1,3,67,32,61,61,224,-39,17,193,177,225,155,8,229,27,0,224,81,1,252,0,0,224,100,4,64,-44,96,42,160,173,160,26,96,17,90,107,172,202,225,4,1,192,106,240,56,-8,192,36,64,61,75,239,2,95,55,48,161,184,226,124,12,224,78,0,224,-1,17,226,143,1,224,43,21,194,161,224,37,9,225,151,10,225,49,0,224,-1,1,226,183,15,235,115,1,224,47,6,253,74,13,226,189,13,241,146,3,-196,217,227,159,9,233,168,2,162,129,65,75,161,48,225,55,8,192,105,238,-42,13,226,134,6,253,246,14,227,172,16,227,109,1,224,50,8,229,99,4,-226,240,9,197,205,224,51,3,225,111,35,228,39,2,236,187,11,195,79,228,-226,19,1,52,32,240,226,2,228,2,2,226,21,9,228,102,19,224,125,8,-227,78,0,224,123,19,0,50,224,123,15,160,57,163,112,232,203,10,224,41,-1,128,91,224,248,6,0,66,192,40,224,38,0,231,127,0,224,73,16,224,-70,27,160,108,224,65,11,224,62,4,224,53,2,161,192,64,12,193,10,226,-175,2,228,42,10,225,46,7,128,5,224,77,11,160,209,64,21,0,85,142,-92,0,52,90,18,1,56,52,103,106,0,67,76,145,246,252,2,224,89,60,-114,192,224,89,5,212,6,224,89,15,225,24,2,194,68,96,4,224,67,2,-228,238,16,226,2,3,130,204,225,127,0,64,14,161,78,65,106,129,110,192,-44,200,254,69,15,0,82,236,123,0,77,71,226,216,2,236,128,8,192,53,-160,252,129,170,241,248,4,224,38,0,143,207,168,74,164,245,160,94,239,200,-83,7,84,111,107,101,110,105,115,101,143,200,5,50,49,53,58,49,51,227,-177,13,192,1,234,153,3,224,31,11,224,35,7,225,115,6,224,2,2,234,-193,12,224,83,14,228,175,1,225,71,0,234,196,20,161,118,227,128,6,64,-43,234,200,67,232,150,3,228,9,10,224,74,35,235,19,255,225,39,10,235,-19,255,235,19,17,226,46,48,229,28,2,224,37,5,226,46,2,224,86,6,-234,212,8,96,78,225,116,8,231,224,13,224,181,3,224,43,2,182,156,225,-115,26,253,93,7,96,228,192,8,64,48,151,88,93,201,82,123,246,220,11,-225,143,5,1,45,123,232,36,4,233,81,53,194,95,82,195,0,35,234,185,-1,224,36,2,224,58,10,233,10,14,254,71,11,225,40,33,1,49,50,224,-63,1,226,157,34,1,125,45,226,157,20,225,246,2,198,182,226,124,9,128,-21,224,160,4,227,126,13,255,41,13,227,126,31,224,225,3,192,59,226,11,-23,250,231,7,224,254,18,224,84,0,195,72,224,88,3,160,147,117,65,121,-248,118,208,233,122,6,224,67,1,192,1,229,131,62,135,55,229,131,13,224,-47,2,228,58,5,90,37,224,161,7,226,24,9,229,148,17,224,0,1,224,-188,1,160,140,96,62,239,126,21,224,52,6,230,251,6,239,89,2,163,128,-231,164,2,224,76,1,228,210,29,236,192,2,224,37,5,225,125,10,226,197,-2,231,116,10,128,24,224,102,8,226,200,8,120,111,224,90,9,194,200,225,-19,7,224,198,1,224,45,1,225,16,2,224,89,2,224,90,12,201,53,129,-34,154,3,224,50,2,224,44,3,227,16,10,64,99,2,95,56,53,152,80,-226,13,0,249,55,2,224,63,22,98,120,192,63,224,54,2,224,65,8,225,-80,10,160,246,224,241,5,64,144,224,194,11,160,129,227,125,28,96,142,226,-219,24,192,14,160,26,224,47,5,228,237,21,64,1,241,231,213,241,233,9,-224,46,18,241,236,5,224,40,6,228,8,10,225,57,0,224,1,1,227,75,-15,241,239,144,224,229,9,224,226,10,224,152,4,230,244,75,224,62,2,226,-224,9,229,188,0,69,235,232,225,2,230,212,3,224,101,6,64,1,224,202,-47,233,203,13,224,203,71,2,52,57,32,105,73,233,177,16,161,200,232,221,-7,224,5,6,224,229,14,225,11,7,225,182,16,243,145,255,224,122,4,196,-248,224,123,19,243,145,21,240,27,7,225,59,6,232,63,1,225,117,7,224,-179,0,102,208,227,251,3,241,239,18,224,95,60,105,233,224,95,30,226,25,-1,128,95,225,191,10,244,88,9,169,2,224,80,23,224,77,30,224,73,25,-224,70,27,160,108,224,65,11,224,62,4,224,53,2,129,65,234,137,10,244,-166,191,224,89,81,245,0,77,226,0,13,128,164,64,1,0,83,226,19,0,-224,41,6,160,188,224,247,1,224,1,3,161,241,227,34,15,224,74,6,233,-41,6,98,20,192,88,224,85,6,236,226,7,235,101,12,128,82,239,20,11,-192,5,232,26,7,224,155,5,225,102,42,3,66,32,79,32,128,70,97,112,-160,12,225,187,0,233,129,13,226,41,9,231,172,1,0,49,160,78,224,73,-6,224,50,18,64,94,229,84,1,1,39,39,197,84,224,50,22,224,170,7,-224,148,23,64,190,64,51,0,52,224,222,3,192,58,194,21,193,191,128,76,-165,83,128,87,98,24,132,14,192,44,205,215,247,70,213,4,57,52,58,49,-49,230,233,1,234,89,5,224,233,3,192,1,247,47,1,224,25,7,192,1,-230,169,3,224,37,15,224,35,4,224,30,10,97,38,247,154,4,224,36,9,-192,1,247,193,5,230,230,7,224,2,0,228,32,3,230,236,3,224,200,18,-193,195,168,236,224,5,8,224,68,3,160,73,227,136,2,163,142,228,86,13,-224,116,4,224,34,6,224,157,4,224,154,13,164,202,240,70,8,64,0,231,-147,3,231,76,10,232,74,5,224,95,27,242,38,4,192,95,237,232,4,128,-5,224,106,20,224,97,20,233,8,3,224,38,8,164,207,3,67,32,61,61,-224,42,20,247,125,15,241,57,3,234,246,9,229,230,8,237,31,33,247,147,-69,1,39,32,244,198,22,240,149,6,96,12,162,112,194,170,243,227,5,65,-169,243,229,7,225,240,13,239,80,3,226,59,2,164,165,128,1,225,52,10,-225,104,7,240,76,1,224,102,9,229,41,0,224,28,11,0,90,224,79,14,-192,107,166,229,224,31,6,167,20,230,243,2,231,132,14,228,21,11,225,247,-8,193,68,199,161,162,43,193,89,160,32,128,73,244,167,2,225,172,0,129,-122,229,204,3,197,205,224,103,5,245,70,1,226,137,64,243,213,22,224,64,-4,225,41,10,240,200,2,228,192,0,207,155,224,222,19,233,51,6,128,191,-224,126,1,224,13,4,129,69,224,117,12,64,113,225,78,2,251,139,3,235,-131,1,128,0,224,201,1,64,1,245,37,255,245,37,221,226,154,0,131,135,-229,44,9,96,207,244,152,8,224,0,1,192,166,160,170,164,58,167,162,227,-139,13,224,52,5,194,212,224,22,9,193,234,248,33,6,224,37,5,226,174,-10,64,1,228,251,0,224,73,1,160,2,225,39,0,160,25,64,220,226,195,-6,128,21,192,176,230,31,9,225,19,14,227,228,2,249,61,32,224,1,9,-245,134,8,236,134,3,225,90,4,224,166,0,225,99,12,194,90,225,145,5,-224,42,11,224,123,1,252,157,34,227,68,7,96,42,229,230,0,224,105,6,-227,204,21,231,254,25,224,130,23,229,94,7,9,51,54,57,32,95,51,55,-49,32,73,244,56,4,242,125,3,225,172,3,0,57,148,97,224,54,5,236,-241,6,226,207,2,231,192,1,198,194,231,199,14,224,193,3,243,243,13,65,-114,231,246,11,234,13,8,231,170,10,225,219,5,225,32,10,231,171,19,230,-86,5,194,242,231,168,6,224,163,1,160,16,192,58,128,148,129,213,247,56,-7,128,56,99,24,0,79,134,213,225,73,1,231,186,2,225,6,6,240,125,-3,193,109,200,134,225,91,10,224,54,0,129,23,224,69,3,224,92,6,231,-221,102,227,248,4,64,62,225,8,13,192,57,233,108,4,224,229,17,227,64,-18,232,0,16,227,132,50,245,66,2,224,130,5,225,7,9,241,78,2,225,-7,29,241,43,5,224,51,30,240,128,8,226,136,5,224,158,3,224,178,0,-98,25,192,188,229,167,0,224,16,0,1,56,53,130,0,229,92,1,2,95,-56,54,116,62,96,30,251,79,0,64,0,229,209,17,225,26,5,64,11,225,-116,6,227,220,0,227,123,1,224,151,1,128,16,176,206,128,5,103,231,224,-89,1,96,37,226,148,2,224,173,1,194,48,230,162,16,192,93,245,35,27,-227,151,0,224,117,1,128,1,251,232,1,224,80,0,224,224,6,227,180,1,-128,209,230,170,5,162,92,224,67,1,224,61,7,224,64,2,224,61,22,163,-42,224,59,11,224,55,4,224,52,2,225,15,4,128,158,246,129,16,224,243,-1,228,237,2,228,234,4,225,78,14,245,190,10,224,76,71,192,223,96,51,-226,140,9,160,217,128,204,224,60,6,128,0,226,124,1,226,133,4,224,169,-6,165,42,105,116,140,61,128,98,237,112,12,128,50,230,187,1,224,98,8,-228,195,12,243,188,7,224,155,13,236,108,2,224,106,1,128,44,243,218,120,-5,49,55,49,58,49,50,250,197,4,108,46,229,67,1,2,51,54,56,129,-129,196,118,196,76,72,85,64,44,165,64,224,39,8,68,149,69,84,228,124,-0,1,95,49,96,7,0,83,65,219,7,53,56,32,64,95,54,48,52,98,-46,2,51,54,54,204,5,224,244,1,1,95,96,160,149,224,47,3,0,54,-224,47,17,0,39,224,48,0,224,33,15,7,40,41,44,91,93,59,123,125,-128,38,224,37,15,2,32,94,41,224,32,21,22,58,33,35,36,37,38,42,-43,46,47,60,61,62,63,64,92,92,92,94,92,124,45,126,192,52,193,15,-230,191,2,82,151,224,20,4,67,165,142,191,128,11,230,231,0,7,58,56,-54,55,32,64,10,65,162,211,130,101,98,195,162,228,130,212,67,30,229,220,-0,0,66,70,109,1,51,50,241,205,0,160,2,224,30,1,225,206,9,234,-81,15,3,108,105,110,101,226,11,0,224,74,53,5,112,114,97,103,109,97,-224,76,0,232,27,0,128,214,224,71,33,2,100,101,102,224,148,1,132,59,-193,76,224,55,20,4,117,110,100,101,102,128,54,193,28,64,192,2,95,50,-48,64,11,1,95,54,97,52,227,101,81,4,72,97,115,104,68,96,186,131,-103,3,56,56,58,53,96,141,0,90,64,190,4,56,53,51,32,64,107,164,-192,0,196,24,160,159,128,234,160,2,3,95,51,55,57,64,51,0,54,64,-237,0,50,101,83,162,17,98,4,194,1,224,204,98,0,57,160,204,233,148,-3,226,36,1,199,225,160,13,165,1,225,181,18,3,79,32,35,52,234,79,-4,238,16,0,130,229,225,9,0,119,197,162,135,199,61,75,225,97,57,1,-51,54,65,80,129,68,1,53,50,225,11,2,16,105,110,99,111,109,112,108,-101,116,101,32,109,97,99,114,111,32,98,83,7,105,116,105,111,110,58,94,-42,128,200,224,54,10,2,32,32,35,130,124,0,32,163,218,0,39,160,34,-68,217,64,7,224,182,3,3,95,56,53,55,96,16,233,219,7,224,202,0,-129,38,232,218,4,160,201,227,9,20,224,83,9,235,100,8,227,159,34,64,-77,0,49,224,77,2,226,99,1,161,104,64,68,232,73,5,228,7,10,228,-132,0,161,20,1,56,53,71,238,197,230,243,94,0,2,95,57,53,224,16,-0,160,96,237,86,0,102,60,192,76,162,224,65,191,226,224,0,128,207,192,-25,0,49,192,25,2,95,56,54,135,34,160,31,5,55,51,53,32,95,55,-67,26,228,30,0,231,232,0,65,167,0,54,170,251,64,8,1,52,52,64,-4,1,51,51,64,9,96,153,235,22,5,128,147,64,40,1,57,57,128,48,-2,55,53,55,229,185,5,197,167,2,95,54,51,224,56,0,195,179,97,7,-128,7,226,71,5,0,35,229,10,2,224,56,2,224,55,4,0,56,224,55,-11,229,141,0,224,53,2,64,163,96,167,64,253,67,14,129,7,0,80,224,-243,0,227,145,13,130,22,238,53,2,226,27,13,1,51,53,226,105,3,160,-59,163,205,195,199,224,79,1,136,214,234,138,1,1,95,49,117,157,199,55,-96,98,224,33,1,130,82,73,238,0,54,226,90,0,235,4,3,247,62,1,-224,170,25,225,36,2,0,35,230,98,1,195,93,128,111,228,150,22,242,7,-7,224,101,31,192,62,176,89,229,166,1,140,185,225,12,8,160,251,113,199,-226,123,4,224,12,3,128,0,164,36,224,53,0,163,204,225,80,8,225,79,-8,244,219,2,224,23,4,224,91,2,2,64,64,89,96,181,227,28,1,192,-180,0,67,227,19,5,136,132,0,54,104,132,3,75,50,32,58,96,69,64,-11,2,32,75,32,64,25,0,52,160,13,0,65,96,13,0,51,96,13,4,-95,56,53,52,32,99,237,224,4,1,0,58,99,168,64,28,4,51,56,48,-32,75,75,143,10,32,67,32,80,32,75,32,95,55,55,54,226,230,2,2,-114,101,112,70,150,8,109,101,110,116,44,32,97,116,32,230,185,84,3,50,-53,58,54,129,202,224,135,127,75,242,224,137,126,0,90,140,152,97,205,96,-153,0,52,224,153,127,66,77,0,49,226,77,14,101,60,65,206,101,125,64,-9,201,96,96,12,96,210,96,17,163,37,64,18,141,128,224,26,1,227,40,-0,0,58,102,132,2,10,65,32,65,11,0,90,68,134,192,4,150,199,0,-58,96,100,1,10,65,224,29,7,224,34,5,0,56,160,34,70,127,101,185,-3,95,54,51,56,67,18,0,53,139,220,227,18,23,69,248,5,98,114,101,-97,107,115,227,17,116,224,134,109,1,64,90,225,190,0,97,85,193,185,65,-78,89,6,225,174,0,0,58,107,17,161,104,185,34,224,10,30,232,201,1,-0,32,83,14,193,251,64,88,160,79,64,44,224,7,11,224,70,2,224,59,-2,0,58,96,163,226,22,6,224,60,5,128,41,0,58,96,217,98,95,0,-90,121,26,0,58,115,184,96,57,2,80,32,35,72,218,0,85,98,40,130,-237,4,80,32,35,51,32,71,239,0,58,120,8,192,38,65,15,96,38,95,-194,101,141,143,105,1,58,56,81,113,226,189,1,128,96,64,25,224,213,10,-64,144,0,58,115,62,160,28,1,80,32,154,150,0,80,96,72,129,10,3,-80,32,35,53,160,128,74,133,128,17,0,48,192,17,128,202,3,80,32,35,-54,192,17,128,203,113,72,234,51,1,112,80,145,43,1,95,56,85,48,7,-95,55,54,48,32,95,55,54,73,186,0,54,204,238,244,213,0,129,41,144,-44,1,58,56,74,174,239,15,0,80,10,224,65,14,74,11,67,94,170,106,-0,67,73,93,0,49,231,51,0,1,95,55,100,37,160,86,1,58,56,75,-183,160,246,137,68,238,157,4,157,48,96,8,152,179,1,95,56,233,128,0,-233,6,3,200,95,247,220,8,128,207,96,8,1,95,54,69,69,233,9,0,-224,60,4,245,223,2,162,145,64,189,96,224,7,64,95,49,57,49,32,95,-57,169,42,103,218,128,48,1,95,56,68,75,224,20,2,136,122,224,33,2,-165,197,192,38,1,64,58,96,81,226,2,6,194,189,0,58,96,39,194,186,-98,85,64,235,228,191,0,73,14,0,50,72,187,139,151,193,39,225,108,7,-233,67,1,225,108,1,96,37,225,238,13,64,101,0,54,160,101,129,218,64,-44,0,49,64,104,1,55,57,97,106,201,159,116,82,96,138,237,223,16,31,-67,97,110,110,111,116,32,101,120,112,97,110,100,32,35,105,102,32,100,105,-114,101,99,116,105,118,101,32,105,110,32,102,1,105,108,237,194,3,205,196,-1,95,49,76,58,1,52,51,139,208,224,81,5,4,58,94,42,32,32,251,-94,2,224,140,1,6,66,32,95,48,32,95,50,164,145,66,143,1,51,57,-64,16,67,185,1,95,51,64,226,225,49,1,169,80,96,52,1,52,49,64,-108,108,186,224,193,10,31,87,97,114,110,105,110,103,58,32,116,114,97,105,-108,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,97,102,116,1,-101,114,64,214,128,142,224,62,10,174,214,97,0,3,115,105,111,110,224,245,-47,224,240,1,130,68,97,145,2,95,56,51,98,132,225,144,41,4,112,97,-114,115,101,225,143,76,227,71,3,225,143,17,148,56,157,64,225,152,10,1,-95,56,154,24,225,159,90,224,255,56,225,153,3,0,95,65,148,128,241,64,-0,1,58,56,77,181,72,85,224,224,0,96,8,0,56,174,179,236,211,15,-1,47,47,128,83,175,22,129,19,0,58,97,19,64,76,1,49,49,65,254,-67,189,0,56,84,168,69,157,224,17,0,5,52,55,55,32,95,55,118,11,-67,216,96,19,1,55,50,111,48,224,181,3,3,92,124,92,124,160,99,2,-55,52,56,79,171,82,193,96,40,162,83,229,248,1,160,70,99,68,0,51,-181,239,128,143,172,98,224,143,3,0,49,224,143,45,1,38,38,224,141,16,-250,48,3,224,141,11,213,157,64,40,64,141,1,52,54,64,65,96,113,224,-10,13,224,135,9,79,94,0,51,207,94,224,188,2,224,140,2,96,217,96,-218,224,129,0,129,209,224,49,5,0,56,84,206,225,0,4,0,56,98,53,-128,188,224,38,5,128,21,224,212,5,170,168,224,83,9,246,167,1,0,53,-143,13,1,51,57,103,237,162,115,128,41,0,49,134,8,224,17,3,72,134,-129,88,2,53,51,32,224,208,5,97,230,0,58,96,216,225,55,28,225,77,-31,225,213,1,1,62,61,161,213,224,144,2,5,53,57,32,95,53,55,131,-34,225,138,13,78,156,193,138,224,55,1,1,56,50,224,55,1,224,117,21,-0,60,224,117,9,1,55,53,224,60,21,64,117,244,229,0,224,55,2,72,-32,224,116,29,0,61,224,234,10,225,173,0,224,61,24,0,33,224,61,9,-105,34,192,61,0,58,98,69,225,165,6,226,33,3,0,55,137,128,224,29,-1,226,132,6,98,24,226,132,38,224,18,4,130,63,128,50,0,58,96,6,-224,141,6,225,84,12,74,134,225,84,8,1,57,56,65,84,169,243,224,54,-13,242,235,0,225,78,3,73,116,192,55,0,58,96,209,225,16,17,1,48,-50,225,16,23,215,158,225,70,7,225,16,39,139,10,64,6,227,68,17,224,-228,13,226,230,11,0,53,225,27,25,0,55,224,54,10,1,56,48,96,139,-175,43,228,225,14,224,56,11,1,50,52,224,56,2,0,58,97,21,101,209,-1,50,53,84,183,0,56,92,4,1,95,56,117,88,1,95,56,65,40,128,-42,1,95,56,64,65,160,11,1,50,52,224,23,1,1,50,52,224,23,1,-0,56,71,7,3,95,50,53,48,192,17,108,134,64,9,106,90,0,83,102,-243,237,143,0,0,80,136,179,227,18,1,12,73,110,116,101,103,101,114,58,-32,100,105,118,105,105,57,3,98,121,32,48,167,107,237,203,1,108,6,64,-64,83,63,5,80,32,95,50,49,54,64,4,71,92,147,76,224,17,9,128,-64,237,113,5,135,237,245,160,1,247,183,3,2,32,95,56,156,9,244,66,-0,0,66,97,21,96,93,0,56,130,14,128,42,98,38,192,36,171,252,160,-12,0,83,139,145,0,56,72,253,0,85,83,161,128,79,233,43,0,109,130,-64,5,160,88,183,48,153,65,136,133,1,85,32,245,255,0,81,25,98,212,-224,0,3,0,58,97,113,1,10,65,160,194,64,58,1,95,50,78,211,2,-95,51,55,109,89,64,49,252,191,3,64,9,0,89,161,61,224,19,0,237,-94,0,64,63,255,226,4,233,217,3,224,219,1,173,31,235,134,3,128,238,-128,69,152,137,73,20,98,104,110,197,128,220,206,83,120,209,0,52,224,28,-2,96,241,68,36,0,49,109,98,1,67,32,99,21,128,12,1,95,50,163,-126,2,64,95,53,109,139,216,40,129,219,0,58,97,95,226,193,3,0,50,-74,99,0,50,70,241,64,6,71,57,0,50,110,164,162,181,64,114,194,181,-160,11,224,138,0,194,187,128,11,64,6,0,58,96,12,128,94,124,165,96,-148,1,95,53,79,169,64,180,0,51,78,187,128,42,64,43,206,200,143,100,-97,94,207,42,174,97,206,167,224,7,2,71,231,1,53,55,64,71,1,53,-55,99,150,130,79,0,80,98,25,163,124,204,188,224,26,0,79,6,64,21,-64,59,121,240,0,53,65,241,128,36,192,27,128,28,194,52,96,58,0,39,-160,46,96,26,163,27,250,183,1,144,25,0,83,251,218,0,239,74,5,243,-165,1,64,69,0,55,97,7,246,213,0,227,1,0,183,50,224,253,1,0,-39,96,254,162,76,143,83,0,49,191,46,128,95,160,163,128,220,160,12,66,-238,128,37,64,253,96,217,154,164,224,197,16,64,39,64,48,192,243,225,16,-3,228,17,2,102,35,99,92,64,137,0,50,64,69,98,152,239,223,0,122,-111,113,123,105,108,1,67,39,67,16,3,95,56,49,56,227,22,0,224,77,-3,224,13,5,0,58,100,27,113,133,228,219,6,15,108,97,115,116,58,32,-101,109,112,116,121,32,108,105,115,116,100,213,129,44,2,85,32,64,82,127,-128,98,99,212,64,8,66,114,224,89,1,0,79,114,141,64,127,0,58,97,-13,227,211,0,133,115,0,75,66,168,64,253,2,10,65,32,100,106,0,58,-97,255,176,54,68,163,220,248,227,195,1,113,216,98,43,0,53,106,49,1,-95,53,80,67,64,7,96,14,0,58,100,148,2,10,65,32,88,169,133,172,-200,60,249,203,1,192,93,96,70,159,43,132,69,229,31,0,243,241,11,64,-133,234,220,1,0,49,102,251,2,95,49,55,64,11,99,92,234,232,1,92,-102,131,252,146,196,132,36,129,166,96,48,224,47,1,228,73,0,0,64,129,-184,0,58,101,193,161,39,130,187,1,95,50,64,217,129,29,179,26,224,27,-6,129,71,163,240,2,50,50,52,64,164,232,187,1,224,104,2,64,188,232,-156,1,224,24,2,96,10,2,64,95,57,77,248,1,56,48,106,131,96,33,-2,56,48,54,224,11,2,0,56,65,79,96,13,202,107,3,95,56,48,57,-224,20,8,0,58,103,135,133,222,224,170,1,198,178,129,213,224,2,0,225,-103,0,192,11,145,198,75,69,230,126,3,178,151,229,185,0,1,95,56,101,-76,224,46,0,82,34,224,46,0,160,23,67,140,0,48,190,49,224,65,24,-68,194,224,64,19,134,211,0,58,64,239,160,218,96,71,100,23,224,72,17,-96,102,96,16,99,132,0,58,65,67,130,223,166,206,253,115,1,133,34,165,-110,0,82,224,22,4,255,72,0,0,58,96,106,130,1,129,92,164,241,161,-66,224,41,1,230,241,0,157,95,255,238,3,138,216,192,227,98,16,96,49,-104,245,64,238,224,159,3,224,82,1,192,76,133,81,96,66,66,78,65,242,-226,202,5,0,58,96,241,230,123,2,226,28,3,134,121,0,58,105,175,99,-245,3,75,51,32,75,64,24,0,58,74,25,160,218,0,95,79,137,100,86,-198,108,157,118,133,206,65,192,255,80,4,0,35,86,176,131,226,99,197,162,-118,163,224,162,102,224,47,3,0,49,70,240,128,210,224,79,12,0,49,67,-75,97,243,2,95,55,57,110,5,173,26,0,85,65,206,0,48,224,16,2,-160,18,235,239,2,170,201,103,242,128,133,1,82,32,228,26,2,87,176,133,-143,0,58,107,250,118,232,64,221,1,95,55,225,81,10,196,77,137,193,0,-55,75,136,0,58,64,109,224,54,22,166,128,0,55,65,106,224,54,1,131,-147,224,54,17,160,191,0,53,114,208,160,53,64,254,130,15,194,97,253,251,-1,226,120,2,165,37,225,112,0,226,107,2,226,201,1,201,123,160,2,98,-185,231,93,1,128,2,164,32,224,91,5,193,254,224,22,0,195,204,131,207,-195,51,0,64,100,101,226,250,1,139,40,233,241,8,162,195,128,162,131,9,-131,8,178,45,96,85,1,95,50,70,136,70,61,78,24,160,0,128,162,1,-79,32,118,243,97,196,225,64,5,129,173,0,64,65,53,227,229,4,237,222,-9,237,113,12,101,124,236,240,0,130,36,237,245,4,1,55,51,64,28,77,-29,2,95,55,50,87,7,183,216,64,215,241,48,2,96,168,2,95,55,51,-64,55,120,113,73,239,1,56,57,64,112,98,15,104,69,192,209,96,59,224,-98,0,64,133,238,110,0,224,81,43,0,58,119,120,197,31,224,187,4,103,-16,225,226,1,98,41,231,77,0,0,51,112,62,232,119,1,0,100,123,213,-0,100,173,68,160,53,225,70,5,193,231,224,100,3,242,57,6,1,55,53,-65,37,129,48,225,59,5,86,150,0,57,195,239,244,221,16,1,44,41,213,-49,238,216,5,136,186,224,0,0,194,135,225,71,2,98,82,2,95,52,54,-97,165,64,4,172,12,132,17,248,166,6,0,90,69,36,1,54,50,96,217,-107,194,239,189,3,96,0,227,68,2,225,8,10,224,18,10,225,24,7,228,-147,1,66,180,164,242,237,49,0,224,45,12,65,75,224,65,12,64,189,79,-126,224,166,8,224,88,9,224,184,7,167,49,69,143,65,253,165,148,97,252,-225,131,15,226,9,5,230,10,0,130,185,0,67,142,60,129,85,229,203,0,-96,104,65,225,76,156,0,64,98,100,3,52,51,51,32,197,70,224,182,0,-65,202,235,30,0,224,205,4,224,80,1,192,5,142,166,0,75,128,45,1,-75,50,241,116,2,224,69,4,1,64,75,65,53,224,26,3,227,202,0,1,-64,75,66,111,224,26,13,68,64,0,55,235,118,2,255,37,68,7,67,112,-112,73,102,100,101,102,191,35,4,51,56,58,49,50,161,78,0,75,131,183,-165,126,129,73,130,77,133,80,224,10,0,225,77,0,65,127,65,79,82,212,-225,3,15,225,74,7,173,158,160,81,165,232,64,13,161,194,225,94,7,64,-24,255,1,1,224,111,38,67,78,64,1,67,143,197,91,98,178,83,170,1,-95,55,109,92,229,101,7,224,113,6,241,177,0,96,169,224,69,1,197,22,-109,193,130,27,93,149,139,214,150,190,224,89,10,225,220,100,1,52,53,225,-220,1,0,58,101,203,254,160,2,231,152,2,0,80,135,252,102,113,227,159,-1,231,37,6,71,31,137,9,237,134,4,192,21,167,133,96,69,64,248,167,-40,0,58,68,240,232,51,1,216,123,3,95,51,54,54,104,80,137,248,192,-24,155,94,65,220,0,54,74,122,0,67,68,13,0,54,197,151,225,51,1,-2,39,96,95,128,213,0,58,102,244,74,92,2,55,49,51,136,142,1,55,-49,67,88,64,197,111,106,97,252,64,21,1,53,32,224,64,2,25,69,120,-112,101,99,116,101,100,32,101,110,100,32,111,102,32,105,110,112,117,116,32,-40,69,79,70,229,227,0,0,58,103,129,254,225,15,0,55,75,38,106,177,-226,37,3,251,165,8,3,35,108,105,110,219,152,134,20,251,151,2,0,51,-97,42,111,216,180,233,213,89,128,31,0,49,82,122,0,51,175,160,160,146,-137,181,204,38,194,118,170,212,141,53,234,188,4,1,64,35,91,201,192,188,-0,80,66,160,244,80,3,193,167,160,26,0,56,99,75,64,49,162,175,143,-54,162,45,162,15,229,177,1,81,19,224,92,1,224,10,0,235,149,13,65,-77,129,6,203,152,227,240,0,235,114,10,169,60,64,26,65,211,64,153,128,-172,224,26,0,224,108,1,66,189,211,149,147,85,224,223,0,192,173,235,253,-19,128,79,170,31,99,6,162,186,238,161,1,224,224,6,224,179,13,129,104,-128,115,98,10,224,144,2,66,53,225,95,11,224,44,19,245,248,5,64,0,-2,58,55,56,139,127,2,65,32,58,96,76,3,10,65,32,75,64,10,137,-100,237,165,2,96,172,130,29,224,244,12,158,165,224,199,13,127,129,2,64,-95,52,156,160,192,7,193,75,135,80,230,30,1,224,61,1,137,180,178,225,-2,95,55,56,97,14,3,58,55,56,54,140,104,167,239,200,234,0,56,64,-129,197,87,133,236,96,56,0,58,96,56,224,205,1,117,137,232,207,36,207,-218,233,127,2,111,135,0,51,128,126,234,198,1,68,22,234,18,0,233,211,-20,161,161,230,86,3,224,128,16,224,43,7,236,241,4,230,222,0,134,76,-96,45,67,178,232,163,5,97,8,240,82,2,130,130,225,125,1,231,32,6,-115,119,1,55,55,175,112,230,181,8,64,244,65,83,166,237,224,208,0,248,-70,3,224,7,7,197,204,129,197,230,221,14,128,0,230,206,97,2,51,55,-55,230,206,3,66,65,242,253,4,131,172,225,92,5,225,101,6,182,196,214,-202,134,107,236,247,0,66,233,100,73,66,206,0,54,162,56,78,242,1,95,-55,111,206,179,53,65,23,66,54,100,147,245,103,0,224,69,0,224,60,14,-128,42,162,31,85,86,160,10,230,48,5,5,109,97,99,114,111,32,128,227,-194,1,166,51,129,225,224,51,10,1,32,101,198,205,128,55,160,136,96,53,-64,144,230,107,1,224,145,6,192,91,224,74,2,23,97,114,103,117,109,101,-110,116,115,44,32,98,117,116,32,119,97,115,32,103,105,118,101,110,128,90,-224,77,5,160,208,162,6,166,167,165,29,64,2,1,95,55,230,123,1,250,-99,4,234,1,2,201,241,101,95,193,179,1,95,55,84,115,236,1,4,66,-231,160,98,98,135,0,48,228,111,1,108,105,132,225,2,55,53,55,71,236,-126,130,166,254,165,222,247,118,4,65,249,64,98,81,173,224,101,8,128,42,-224,100,9,68,179,97,231,99,79,129,144,96,27,165,188,133,83,64,125,65,-119,69,230,228,67,0,0,58,99,55,72,165,2,53,54,49,67,184,0,58,-96,64,177,126,71,123,0,75,67,192,0,54,225,136,2,4,101,120,112,97,-110,92,61,4,44,32,97,116,32,227,84,68,4,72,97,115,104,68,109,70,-170,37,2,53,58,54,130,56,224,133,125,109,79,224,135,124,80,62,225,15,-125,66,71,0,58,98,127,228,241,4,224,9,1,131,54,0,55,67,144,163,-124,124,57,68,140,67,22,132,128,152,134,84,113,184,230,64,83,219,236,246,-129,1,184,173,128,71,219,7,67,155,224,53,1,64,104,226,190,19,228,70,-2,226,190,114,224,133,108,226,190,10,224,135,110,226,190,8,224,135,110,0,-32,112,87,0,58,101,46,226,52,19,2,114,101,112,64,125,64,161,226,54,-116,224,135,110,226,56,10,224,137,112,152,148,82,162,224,144,124,0,58,106,-186,144,39,0,52,90,13,87,101,71,128,0,53,71,75,1,55,54,96,27,-2,73,32,58,96,16,71,103,0,52,124,155,0,55,80,82,1,95,55,95,-227,68,252,97,94,96,56,0,51,83,255,224,11,0,96,229,64,11,0,58,-96,6,64,63,4,49,51,54,32,75,176,176,0,49,225,0,3,6,110,111,-32,102,105,101,108,201,106,96,29,104,253,0,52,82,23,128,105,1,49,52,-96,105,64,11,0,58,96,6,96,145,0,57,66,240,1,51,53,77,40,1,-49,56,224,81,2,25,67,111,110,116,114,111,108,46,69,120,99,101,112,116,-105,111,110,46,73,110,116,101,114,110,97,108,64,98,224,39,1,10,82,101,-99,83,101,108,69,114,114,111,114,96,123,97,161,0,58,96,226,227,84,2,-0,73,141,70,64,28,99,117,1,75,51,97,33,134,56,107,15,1,32,83,-211,63,95,150,69,208,64,8,1,55,53,85,194,0,51,78,73,230,41,1,-234,129,1,73,88,106,248,145,148,237,239,3,198,93,96,37,106,92,0,54,-65,10,0,54,75,33,107,6,128,166,134,102,126,142,2,95,50,54,65,126,-96,28,1,95,50,224,40,1,1,95,51,73,172,1,95,51,81,249,3,95,-55,54,55,97,194,64,25,1,95,53,70,165,64,106,0,54,129,215,224,20,-4,1,51,48,65,110,160,65,0,48,224,89,0,0,58,96,6,222,118,0,-66,203,242,204,40,128,2,128,184,143,34,79,33,0,53,88,197,137,241,243,-30,1,110,76,0,51,171,77,2,50,54,49,253,191,0,160,60,237,30,0,-1,50,51,74,49,91,144,224,64,2,64,50,126,188,96,50,65,37,82,249,-64,22,65,132,254,99,2,224,113,91,254,213,5,224,42,7,224,15,7,0,-58,65,111,97,66,171,178,187,13,224,153,13,208,104,2,95,50,50,75,82,-128,148,64,163,64,81,160,183,224,13,2,224,149,16,191,90,66,0,98,50,-2,56,32,58,96,42,200,165,172,222,0,55,64,124,136,153,82,159,140,100,-178,88,161,36,64,5,96,12,169,18,0,50,115,80,187,194,128,30,64,22,-3,57,56,32,95,155,59,96,88,0,53,160,14,123,203,128,9,157,71,131,-27,66,178,148,194,192,40,0,35,240,20,0,155,243,1,95,55,111,239,0,-58,67,3,131,155,1,95,55,64,50,2,95,55,54,99,141,64,29,1,10,-65,82,201,0,49,64,218,132,32,96,245,0,58,96,39,0,10,83,224,0,-58,96,223,96,24,0,65,96,24,233,167,8,108,167,128,230,194,219,105,164,-0,54,68,207,66,195,129,38,67,147,159,214,160,228,97,216,64,21,224,117,-1,67,193,234,4,6,176,179,145,124,170,4,109,160,112,80,211,35,0,58,-100,24,224,165,1,68,69,226,47,4,160,5,113,189,0,64,78,4,1,75,-52,130,47,2,95,55,50,164,107,1,55,53,109,56,182,58,96,35,64,37,-224,35,1,160,139,0,58,81,172,129,79,224,93,7,0,55,67,74,160,93,-98,71,224,93,0,129,24,118,168,150,167,224,95,10,240,50,1,126,50,227,-134,0,170,246,148,232,124,239,97,111,246,226,7,210,112,99,26,0,52,70,-168,224,231,12,176,126,0,67,88,65,96,15,224,137,11,189,61,229,245,1,-31,87,104,101,110,32,108,111,111,107,105,110,103,32,102,111,114,32,97,32,-110,111,110,45,101,109,112,116,121,32,115,101,113,24,117,101,110,99,101,32,-119,105,116,104,32,115,101,112,97,114,97,116,111,114,115,58,94,42,94,150,-199,0,58,97,92,135,56,216,184,242,227,0,0,48,206,159,64,210,243,43,-3,224,41,8,0,49,192,41,243,4,4,0,58,115,83,128,92,253,117,3,-65,39,133,105,130,58,230,48,6,98,150,0,54,252,223,1,240,210,11,240,-209,10,177,5,240,175,6,2,103,111,116,160,35,224,157,6,0,58,64,187,-64,156,120,25,0,89,161,221,68,33,224,140,2,239,253,10,0,64,141,2,-242,211,40,14,112,111,108,121,112,97,114,115,101,45,49,46,49,50,47,64,-43,5,84,101,120,116,47,80,64,19,136,207,4,49,48,57,58,55,128,172,-176,238,98,88,0,52,90,65,224,14,1,245,165,3,109,206,224,25,12,66,-53,0,83,64,212,64,25,253,60,2,128,30,91,13,96,57,246,4,20,0,-49,127,174,224,33,19,119,118,224,66,20,154,16,99,41,246,72,8,110,141,-128,55,121,149,165,228,209,47,96,164,192,12,96,43,230,74,0,1,95,52,-73,78,0,53,150,165,224,66,31,128,139,224,67,53,96,240,224,66,6,0,-55,67,40,224,134,34,97,85,224,67,15,196,5,228,110,0,101,42,129,196,-228,210,1,250,247,5,255,11,15,8,44,59,40,41,91,93,123,125,96,195,-0,230,5,0,104,215,228,199,0,71,18,224,102,6,251,103,3,90,71,225,-183,3,1,64,35,91,177,229,59,4,128,6,159,49,128,97,155,80,165,4,-227,190,8,13,66,97,100,32,99,104,97,114,97,99,116,101,114,58,131,160,-212,57,229,13,0,136,16,226,93,0,162,203,128,116,249,116,10,250,85,13,-0,52,107,126,160,33,135,252,161,91,160,46,160,71,224,202,0,65,90,127,-248,64,10,229,225,0,161,19,229,204,0,132,108,132,153,129,226,96,103,230,-251,1,233,143,1,200,185,129,232,192,91,212,70,224,48,8,224,46,14,129,-14,226,95,6,224,62,10,96,54,253,37,30,1,95,39,229,25,0,230,164,-0,224,98,26,64,79,64,101,96,11,102,239,96,47,3,64,67,32,79,230,-48,2,226,159,26,22,33,64,35,36,37,38,42,43,46,47,60,61,62,63,-92,92,92,94,92,124,58,45,126,160,148,129,229,193,226,169,163,97,223,224,-207,15,1,101,69,224,58,12,202,245,128,18,229,17,15,135,171,224,110,4,-226,17,8,192,130,225,138,11,226,25,11,230,179,6,0,43,230,172,2,226,-36,6,226,28,7,224,180,30,131,135,224,180,84,0,45,224,180,34,224,128,-65,0,79,138,253,194,78,224,124,30,196,117,224,197,8,3,109,105,115,115,-73,32,7,43,47,45,47,100,105,103,105,168,19,224,39,8,14,97,102,116,-101,114,32,101,32,105,110,32,102,108,111,97,224,38,15,6,108,105,116,101,-114,97,108,164,184,64,155,255,142,7,215,230,224,204,8,224,68,1,2,46,-46,46,227,126,1,96,229,195,72,64,0,95,88,194,198,0,85,101,65,64,-218,170,233,225,165,9,10,110,100,32,111,102,32,105,110,112,117,116,64,188,-133,80,224,35,5,2,115,116,114,65,2,160,187,128,34,96,118,198,20,97,-164,129,131,138,197,232,78,6,193,202,246,89,10,64,186,99,140,97,170,166,-161,97,176,106,187,97,148,80,221,233,53,76,3,49,56,58,52,210,152,228,-143,3,122,39,127,36,249,125,0,64,0,249,121,4,96,36,64,48,96,39,-230,128,2,109,25,80,109,128,60,205,192,1,64,67,102,232,2,52,52,54,-69,3,191,208,128,225,234,43,9,225,159,13,160,169,0,58,107,7,114,75,-254,38,2,222,123,2,95,55,50,135,118,98,69,224,72,2,202,247,0,97,-225,200,0,71,71,163,163,225,181,7,109,217,235,73,1,224,70,1,3,98,-105,110,100,128,51,224,125,3,64,52,66,204,224,17,2,80,238,94,253,224,-143,15,224,132,3,4,32,104,97,115,32,114,255,3,110,97,108,32,198,91,-65,144,224,150,41,236,72,5,97,45,206,223,130,121,0,83,159,169,160,96,-99,59,77,227,96,15,237,230,8,0,58,64,200,174,206,0,50,78,134,64,-57,236,151,8,64,225,162,215,236,238,2,165,93,224,192,3,0,57,68,170,-224,20,7,128,213,224,181,2,224,225,12,225,191,14,0,44,108,167,0,39,-231,143,0,224,152,14,134,2,224,138,4,163,116,224,27,12,235,156,5,224,-27,4,1,49,48,112,162,224,28,14,157,19,224,28,15,229,212,0,224,28,-11,169,6,224,28,13,224,144,18,97,83,224,27,14,131,186,224,27,14,97,-107,224,83,14,192,55,101,69,0,83,198,45,224,157,15,236,169,0,224,28,-10,141,9,64,22,4,83,32,95,54,48,138,211,238,163,2,229,145,8,18,-117,110,114,101,99,111,103,110,105,115,101,100,32,101,115,99,97,112,101,239,-142,1,1,105,110,225,253,4,3,58,32,92,92,97,249,233,65,2,207,33,-224,137,7,82,50,224,27,16,97,124,224,27,14,98,40,224,27,14,97,151,-224,27,14,97,95,224,27,13,85,179,224,27,16,97,77,224,27,14,97,235,-224,27,14,224,195,18,149,120,224,27,13,0,56,224,83,18,95,92,224,27,-16,97,79,228,164,9,0,56,125,30,230,176,76,5,51,48,56,58,49,52,-163,234,83,73,227,233,5,224,137,8,66,179,229,197,24,196,119,0,35,130,-198,235,115,16,4,39,92,92,86,84,228,103,0,224,125,26,120,177,224,125,-32,115,3,224,125,20,1,85,83,228,229,3,0,55,121,116,224,4,15,224,-155,22,112,19,230,223,34,224,67,12,115,170,225,93,33,160,186,224,154,61,-224,86,1,168,156,226,11,61,224,67,22,67,69,224,154,33,99,87,224,242,-28,226,41,37,106,19,224,174,27,225,228,59,224,242,38,224,243,32,100,61,-224,156,54,101,181,224,156,34,176,208,227,189,29,69,161,227,189,34,128,248,-227,189,18,4,83,79,72,39,32,96,7,128,6,1,84,88,128,7,0,73,-128,6,1,89,78,128,7,5,85,66,39,32,111,114,96,10,0,80,240,100,-1,228,109,73,144,132,224,175,18,0,82,228,109,9,225,210,90,102,196,224,-198,33,211,250,225,32,26,103,254,224,157,55,224,67,28,226,112,1,228,243,-0,225,102,17,2,78,85,76,193,240,2,78,65,75,225,241,35,104,67,228,-53,34,225,241,24,1,76,70,230,221,35,231,91,37,140,141,224,124,18,0,-72,231,90,82,159,113,224,125,19,0,71,226,236,40,225,125,39,165,24,224,-219,73,141,186,224,219,18,1,70,70,194,96,0,70,224,229,1,232,65,20,-225,250,60,224,67,22,230,87,37,221,93,225,149,24,230,242,58,226,217,38,-209,28,231,74,62,224,155,22,68,81,224,155,33,209,101,233,29,92,231,141,-39,193,211,225,56,25,119,9,224,88,33,192,245,227,107,63,224,246,22,224,-157,38,185,164,227,177,16,2,111,110,101,82,240,3,39,92,92,69,168,34,-2,69,79,84,128,7,1,78,81,128,7,1,84,66,128,7,0,77,195,216,-2,69,83,67,227,217,14,224,188,23,234,34,59,225,247,37,0,49,225,1,-1,224,88,60,224,224,59,224,156,1,234,34,35,225,249,28,229,90,37,83,-108,224,174,35,129,74,224,85,23,84,0,224,85,35,134,82,224,86,25,228,-140,37,64,4,224,86,28,238,87,37,146,95,96,20,231,3,17,1,68,69,-233,101,0,2,68,76,69,224,10,0,6,67,91,49,46,46,52,93,227,59,-9,228,55,23,238,250,38,164,234,234,164,94,237,178,38,198,192,225,62,18,-1,67,82,193,50,2,67,65,78,225,45,40,228,100,106,196,98,233,111,73,-233,110,24,0,66,226,106,1,0,66,233,111,2,228,78,62,225,38,23,236,-160,37,196,237,224,206,18,1,65,67,236,148,2,153,240,95,29,0,53,72,-137,1,95,55,123,183,190,0,224,29,10,0,52,224,29,2,218,46,224,31,-0,86,48,1,95,48,160,138,96,30,90,21,245,200,1,1,95,55,90,42,-224,63,0,224,251,8,86,80,159,174,0,48,64,54,3,95,49,53,57,64,-4,64,211,0,35,123,235,88,217,91,248,128,18,0,57,104,22,246,123,22,-249,148,4,5,99,116,114,108,45,101,150,128,8,109,97,108,102,111,114,109,-101,100,86,113,1,92,94,97,17,246,115,3,125,101,224,203,2,96,225,64,-224,5,49,57,49,32,95,57,98,99,0,51,68,7,96,5,128,159,193,84,-225,143,1,187,44,224,17,3,128,40,224,17,2,151,238,228,94,4,180,57,-224,35,2,224,34,8,188,79,224,17,2,174,14,224,17,2,224,88,8,162,-235,227,86,8,224,234,2,158,96,68,5,225,90,6,253,102,7,217,189,225,-97,4,162,88,0,58,123,63,1,10,65,118,74,0,83,66,210,1,55,52,-226,188,4,6,100,101,99,105,109,97,108,129,117,65,84,1,55,52,64,111,-158,210,65,196,1,52,54,224,15,1,1,95,50,64,77,98,213,1,51,57,-94,63,160,12,116,41,2,95,55,52,154,198,0,54,218,198,0,55,65,27,-186,187,156,253,155,169,67,9,0,58,98,146,224,152,18,2,111,99,116,224,-150,46,161,91,0,53,97,224,224,149,0,0,52,224,109,20,2,104,101,120,-225,2,45,131,231,2,95,55,52,104,8,192,108,0,51,96,108,227,70,4,-5,95,49,53,51,32,35,124,29,99,81,0,51,71,143,152,255,224,38,9,-123,65,224,38,0,187,23,64,183,224,39,6,102,212,224,39,0,152,250,3,-95,51,54,48,226,30,2,8,100,105,103,105,116,84,111,73,110,189,227,227,-57,12,224,16,0,163,67,64,86,193,222,224,49,28,96,176,224,49,21,96,-39,157,29,0,58,97,39,65,142,0,39,127,168,191,233,66,224,66,229,94,-107,64,0,128,27,64,5,228,160,1,100,205,0,51,67,36,94,1,68,175,-172,147,64,38,128,42,227,65,1,153,95,1,39,66,65,190,1,66,39,96,-5,3,32,95,53,54,64,165,224,117,0,96,11,125,174,96,7,2,83,32,-95,252,162,3,0,67,68,111,128,74,226,18,25,160,133,1,95,51,105,103,-67,180,99,186,0,50,86,85,2,66,32,80,197,113,224,71,27,160,76,222,-219,229,78,9,1,94,42,227,247,0,108,214,6,114,32,109,111,114,101,32,-165,61,255,17,7,0,32,98,5,0,115,228,20,1,159,229,130,77,70,54,-99,194,224,14,0,226,101,1,229,229,0,226,146,0,229,247,2,194,151,224,-45,10,194,152,224,45,2,130,157,64,124,159,52,171,186,225,203,0,97,202,-224,145,1,2,54,48,54,97,126,2,51,54,54,167,130,231,61,3,1,96,-95,199,57,230,187,3,1,51,56,229,43,7,225,55,8,0,69,254,235,0,-10,110,32,105,100,101,110,116,105,102,105,101,190,234,1,92,34,225,62,4,-1,79,32,102,35,220,250,1,58,55,70,67,96,184,1,49,51,132,208,1,-95,49,102,109,0,58,96,120,96,25,1,51,51,100,98,64,1,0,80,64,-35,64,201,130,140,197,188,0,55,107,85,1,95,55,111,164,162,235,0,58,-97,0,128,64,0,52,229,57,0,98,64,1,95,55,100,98,3,95,54,32,-89,100,186,0,83,72,71,0,75,65,119,96,4,162,39,192,50,99,121,98,-82,0,89,69,121,162,216,64,4,224,55,1,166,87,184,234,96,10,200,172,-0,89,67,0,2,39,32,80,225,69,24,9,102,97,105,108,101,100,32,116,-111,32,124,86,3,32,97,110,121,79,89,22,116,104,101,32,112,111,115,115,-105,98,108,101,32,99,104,111,105,99,101,115,58,94,42,97,85,99,183,1,-48,32,121,186,96,11,2,53,32,85,99,155,129,108,224,98,8,192,55,224,-53,1,97,237,1,55,48,195,35,128,220,0,66,128,91,227,253,0,129,6,-224,19,2,0,83,96,14,228,98,0,128,2,128,20,224,55,2,225,32,4,-224,26,3,0,90,161,37,192,38,128,76,96,11,0,39,102,220,192,91,1,-95,49,97,209,0,80,160,64,194,53,226,34,1,0,54,167,22,0,89,132,-135,74,181,136,171,132,228,193,1,64,52,0,58,65,29,128,45,128,115,0,-80,70,85,66,140,5,10,65,32,85,32,58,66,102,166,96,0,39,64,2,-64,59,72,170,132,73,0,75,96,85,1,95,55,144,13,132,199,104,73,99,-29,0,85,64,31,0,65,224,33,3,66,101,225,123,5,12,73,110,32,97,-32,115,101,113,117,101,110,99,101,225,136,12,1,83,39,65,121,101,93,99,-120,105,146,64,173,69,126,224,135,12,161,31,64,137,0,52,82,118,160,137,-170,143,176,185,0,58,68,14,168,61,68,145,64,44,83,64,224,80,11,0,-58,96,117,128,43,3,54,32,95,52,118,138,226,255,0,133,132,193,83,99,-210,0,53,250,76,2,0,55,96,45,0,58,64,210,129,72,0,85,193,142,-2,90,32,90,69,118,2,52,52,49,236,0,5,198,221,131,31,234,160,0,-0,90,130,195,96,220,160,85,96,0,0,58,96,11,97,174,0,75,96,228,-0,58,97,127,96,16,0,73,65,205,64,196,67,241,203,166,97,21,132,22,-101,9,1,95,52,73,32,96,55,0,54,225,18,0,235,166,5,64,237,3,-83,32,64,82,227,171,3,225,196,1,159,220,8,115,97,116,105,115,102,121,-58,32,131,178,236,167,7,96,95,130,107,99,58,100,180,69,179,65,11,224,-75,1,6,82,97,110,32,111,117,116,67,227,10,105,110,112,117,116,32,40,-69,79,70,41,197,45,137,219,64,73,130,161,1,95,52,76,243,100,232,224,-153,12,0,110,164,54,162,86,74,225,2,95,52,55,96,39,101,20,1,52,-56,65,20,96,11,0,58,96,6,163,9,228,227,1,0,83,202,87,67,200,-227,191,9,99,182,99,185,98,94,0,58,96,98,64,152,1,54,50,64,152,-64,248,234,158,0,229,10,0,0,58,96,165,64,37,97,28,134,74,224,35,-1,96,226,129,235,232,139,0,224,14,6,232,124,7,1,95,49,96,211,101,-239,0,50,96,210,128,10,64,48,96,10,0,58,96,6,64,114,192,18,224,-230,5,229,202,9,0,67,162,125,70,85,205,117,229,191,1,2,95,52,56,-102,153,102,111,1,51,56,193,132,1,64,58,96,18,64,103,0,51,225,72,-3,136,161,142,59,170,212,97,30,72,240,0,58,96,6,128,50,67,230,224,-122,0,134,60,139,90,96,130,160,80,102,165,224,74,8,64,11,0,58,96,-6,2,10,65,32,67,90,0,85,128,16,194,210,0,90,128,242,65,171,69,-57,0,58,96,82,161,238,64,20,224,28,6,130,95,2,73,32,58,96,192,-97,209,64,101,0,49,67,80,68,120,107,225,0,80,66,24,0,80,79,11,-0,48,104,133,192,12,164,61,160,45,129,235,66,66,234,7,0,230,37,5,-96,197,129,120,132,237,138,31,166,60,0,83,160,58,0,64,96,18,224,5,-4,230,113,6,160,60,230,145,2,230,127,14,129,195,224,19,2,170,187,243,-195,6,202,142,192,42,134,2,227,8,3,132,165,224,215,2,224,40,3,0,-64,224,76,3,174,241,128,57,224,110,12,202,146,225,20,1,64,36,134,81,-2,50,48,57,128,46,100,180,64,5,96,157,198,215,2,64,64,79,68,249,-167,9,224,64,56,224,199,0,224,73,44,135,103,66,9,128,30,2,79,32,-35,75,123,224,91,1,204,17,225,1,15,128,114,3,82,32,95,51,101,228,-224,153,4,98,37,0,39,96,2,99,41,98,112,128,39,224,119,24,225,239,-1,64,1,0,89,192,23,226,135,1,226,68,5,224,48,4,72,125,224,66,-6,200,127,224,63,9,70,105,244,145,0,161,241,192,182,2,95,51,57,64,-29,200,253,224,78,1,1,95,52,70,13,77,173,224,24,7,232,49,5,23,-87,97,114,110,105,110,103,58,32,67,97,110,39,116,32,102,105,110,100,32,-102,105,108,101,203,83,224,60,3,236,212,0,224,19,2,224,78,6,19,92,-34,32,105,110,32,100,105,114,101,99,116,111,114,105,101,115,94,42,94,134,-110,225,168,1,64,2,192,72,160,68,0,54,110,19,224,13,1,0,56,237,-48,4,224,65,0,225,144,20,224,139,8,17,94,42,32,32,65,115,107,101,-100,32,102,111,114,32,98,121,58,32,134,183,1,49,51,65,25,72,64,192,-0,165,255,199,154,66,4,64,74,244,2,15,6,109,105,115,115,105,110,103,-97,39,160,84,244,46,6,224,148,2,207,9,161,203,70,116,96,103,2,95,-54,54,100,16,129,20,67,11,77,51,0,55,65,21,224,39,5,0,55,68,-255,97,23,224,163,0,234,172,0,160,63,69,199,0,48,71,252,77,141,225,-89,0,225,102,0,1,95,55,77,146,128,229,79,202,65,107,160,19,128,0,-112,158,100,98,0,52,72,235,169,241,64,200,64,39,0,57,101,118,134,239,-0,85,102,11,0,90,64,111,132,206,0,58,96,31,197,208,75,227,1,95,-54,235,34,0,74,173,105,226,84,181,84,184,64,222,238,26,15,2,92,92,-47,161,230,204,43,0,58,96,100,2,10,65,32,108,222,97,249,129,75,228,-48,0,97,206,64,105,0,58,96,50,1,10,65,224,122,0,224,210,1,229,-53,7,135,251,137,174,129,3,225,24,12,0,58,96,7,96,81,0,58,65,-92,166,116,225,152,1,4,67,32,95,54,55,85,211,0,54,81,195,97,180,-0,54,80,129,168,89,64,35,3,95,54,57,57,226,144,2,15,85,84,70,-45,56,47,47,82,79,85,78,68,84,82,73,80,128,238,133,238,227,228,1,-0,95,73,214,2,95,55,48,96,222,1,95,54,119,2,0,58,98,4,204,-133,132,83,2,95,55,48,168,119,224,150,4,2,95,55,48,116,251,230,69,-1,64,34,115,58,97,9,152,121,1,55,57,145,227,0,35,149,39,226,133,-2,103,31,224,42,2,65,174,65,55,5,35,50,48,57,53,49,103,139,4,-35,53,53,50,57,97,36,129,142,224,124,2,0,52,111,22,226,173,6,225,-111,0,150,227,130,113,0,67,68,162,65,62,0,52,117,100,225,37,1,21,-104,71,101,116,67,111,110,116,101,110,116,115,58,32,115,117,114,114,111,103,-97,116,138,115,129,102,193,42,129,28,225,60,3,65,147,0,54,130,241,64,-84,224,131,0,227,143,0,0,58,97,87,4,10,65,32,75,51,70,7,0,-58,96,39,7,10,65,32,94,103,101,116,98,65,232,170,73,4,51,57,57,-32,79,81,247,80,77,1,95,52,65,105,170,145,64,10,180,143,129,37,0,-51,67,199,225,228,22,243,218,6,20,117,110,107,110,111,119,110,32,116,101,-120,116,32,101,110,99,111,100,105,110,103,235,225,2,98,59,144,96,66,65,-130,122,69,24,1,57,51,64,4,66,17,96,15,97,84,0,52,74,172,128,-20,64,46,169,252,1,52,56,67,10,1,54,57,130,133,73,78,0,73,68,-27,67,172,0,85,64,23,160,92,131,52,3,85,32,75,50,110,90,0,58,-96,24,106,215,2,51,54,32,77,188,97,94,0,49,145,159,0,85,96,35,-1,95,51,205,139,2,49,52,48,64,74,121,95,2,49,52,50,192,11,0,-58,96,6,96,132,2,57,32,75,77,208,65,37,0,49,229,211,3,65,223,-19,114,111,108,46,69,120,99,101,112,116,105,111,110,46,73,110,116,101,114,-110,150,56,224,39,1,3,83,111,109,101,224,35,0,97,32,129,133,96,215,-99,14,129,23,101,54,167,194,169,222,2,95,54,55,65,29,0,54,99,243,-0,95,173,146,65,64,64,55,98,228,194,238,64,63,2,32,64,35,102,15,-224,22,9,98,177,224,22,9,97,2,224,22,9,99,180,128,22,98,33,96,-20,131,214,0,51,76,62,0,54,91,180,1,95,54,79,71,224,19,1,0,-56,96,19,0,56,224,19,11,219,90,224,19,3,136,157,224,19,4,0,57,-150,64,1,54,57,75,34,96,242,9,10,65,32,105,115,105,110,116,32,58,-96,20,130,241,0,58,96,40,64,11,65,240,1,64,58,96,75,64,14,0,-50,99,12,96,110,128,14,0,65,96,14,174,233,162,75,93,68,2,95,54,-55,100,63,1,54,56,68,31,64,124,64,11,0,53,224,11,0,1,51,51,-224,23,0,0,58,96,6,129,164,129,10,66,188,0,56,97,142,169,98,98,-96,100,44,0,51,80,18,132,133,114,196,181,88,162,106,224,15,7,96,92,-236,111,1,0,95,102,94,96,89,64,141,0,51,96,187,130,32,2,80,32,-58,96,16,224,198,2,0,56,110,221,100,137,1,95,51,84,201,192,147,0,-51,224,159,2,128,198,64,11,0,58,96,6,227,18,37,128,92,131,18,96,-11,0,58,96,6,227,18,64,4,65,115,121,110,99,227,23,12,64,220,192,-171,0,75,212,205,2,51,49,54,224,104,2,13,115,116,97,99,107,32,111,-118,101,114,102,108,111,119,164,158,224,33,4,3,104,101,97,112,224,32,5,-224,33,7,9,116,104,114,101,97,100,32,107,105,108,240,154,1,224,33,5,-5,117,115,101,114,32,105,64,193,2,114,117,112,184,193,193,30,130,66,129,-30,96,11,0,58,96,6,225,30,60,225,26,17,66,190,98,17,67,164,81,-201,99,133,226,223,3,101,43,158,46,130,24,159,97,130,24,192,11,66,24,-96,11,0,58,96,6,225,108,1,0,85,243,213,1,2,67,32,60,164,11,-232,134,0,128,18,134,163,164,161,128,18,64,110,0,85,225,163,7,19,82,-97,116,105,111,90,101,114,111,68,101,110,111,109,105,110,97,116,111,114,161,-67,224,43,8,64,34,0,114,220,9,224,32,12,6,105,118,105,100,101,66,-121,64,79,192,36,224,151,6,66,163,224,151,6,66,208,224,74,8,11,76,-111,115,115,79,102,80,114,101,99,105,115,193,94,224,38,10,2,85,110,100,-226,60,3,224,33,10,0,79,226,93,4,64,0,194,27,230,77,2,96,11,-0,58,96,6,226,27,61,3,114,105,116,104,226,27,13,213,161,133,9,64,-17,132,52,7,99,97,116,99,104,32,58,54,70,96,153,119,233,108,4,73,-252,74,210,140,51,0,54,76,2,0,54,89,46,224,115,1,6,111,112,101,-110,70,105,108,179,50,233,19,1,0,58,106,59,130,143,0,49,194,143,131,-188,68,210,68,212,71,171,238,162,0,152,154,3,95,52,49,48,206,200,64,-167,133,20,197,76,207,78,250,127,3,247,156,7,0,32,193,113,0,58,64,-173,64,110,234,212,8,108,50,138,212,75,77,200,143,1,49,52,106,14,233,-127,8,224,33,2,76,60,128,90,131,107,189,178,138,76,85,198,1,64,95,-87,31,253,56,2,0,56,139,203,224,32,2,125,143,224,19,7,165,218,112,-19,2,95,54,54,106,123,224,119,0,126,149,96,138,96,114,1,95,52,73,-196,1,95,54,90,201,0,58,96,43,73,223,7,102,108,117,115,104,98,32,-58,96,22,219,65,237,139,1,90,233,235,136,7,102,183,135,202,192,5,84,-190,64,4,64,114,64,3,224,131,4,224,13,6,234,170,6,160,234,1,54,-53,100,101,0,53,135,196,234,175,0,1,54,54,104,57,0,58,96,226,135,-172,103,130,64,22,96,213,0,66,85,23,115,82,96,51,139,71,0,58,96,-60,128,245,0,54,93,29,72,196,0,58,96,29,9,10,65,32,65,46,119,-114,105,116,101,64,243,130,88,5,94,99,108,111,115,101,65,4,64,126,237,-205,0,2,95,54,52,74,65,2,53,55,32,137,3,64,87,64,173,10,10,-65,32,116,111,70,117,110,80,116,114,64,50,234,42,0,64,50,0,51,126,-32,64,40,129,95,1,95,54,71,27,66,128,234,156,0,96,233,224,9,1,-135,230,84,218,144,173,161,224,92,208,131,255,1,51,50,69,102,97,240,0,-58,96,6,139,135,0,56,64,123,225,20,0,0,58,98,151,129,191,225,194,-4,2,64,95,54,93,163,64,101,226,180,3,209,203,64,23,226,232,4,64,-150,64,128,96,37,0,54,106,30,1,95,54,80,79,160,44,76,179,2,57,-32,95,78,246,163,84,204,237,85,195,0,54,93,53,64,6,160,189,0,58,-99,52,172,22,71,113,96,123,102,230,128,5,108,65,0,58,96,47,234,182,-0,237,56,4,0,54,146,173,64,21,226,55,5,97,155,99,122,137,31,224,-55,6,144,198,192,177,228,94,0,162,178,0,95,105,86,128,160,130,3,14,-73,79,46,112,101,114,102,111,114,109,73,79,32,94,38,162,17,1,64,58,-96,98,9,10,65,32,102,112,102,105,110,32,58,64,118,128,14,2,110,101,-119,64,14,129,253,8,94,97,100,100,95,70,73,76,69,64,18,129,249,96,-18,2,117,116,102,65,167,65,70,152,240,0,52,67,102,64,166,64,89,129,-189,177,248,225,177,1,143,136,73,57,192,213,96,11,161,65,241,78,3,3,-79,32,35,49,86,66,101,173,224,26,10,0,57,205,225,224,27,8,76,224,-224,26,11,229,17,1,1,119,43,200,156,0,54,97,170,99,224,228,127,0,-98,158,1,95,54,100,128,225,96,3,194,19,226,105,8,0,58,98,134,104,-21,1,49,52,99,80,0,58,96,61,163,35,192,233,112,147,72,145,64,92,-130,75,128,6,131,5,96,118,0,58,96,6,99,133,0,73,107,200,191,127,-1,94,102,70,84,1,32,58,96,175,97,110,252,146,0,173,15,145,27,252,-177,10,166,76,84,56,177,63,224,47,2,130,39,223,17,2,51,54,51,210,-62,145,97,115,163,100,1,132,134,242,213,0,67,165,162,188,229,43,0,1,-95,52,66,79,176,93,4,67,32,95,57,56,144,111,192,18,1,58,54,189,-86,188,30,220,218,64,24,163,250,2,53,48,56,64,4,71,82,67,78,2,-64,95,53,66,58,160,11,0,54,89,150,64,80,1,95,54,73,169,132,141,-1,95,54,105,169,96,33,0,58,96,6,188,100,66,87,1,95,52,79,26,-0,58,64,34,128,22,3,66,32,95,53,64,247,0,66,99,109,0,52,64,-194,8,95,54,50,55,32,95,53,57,48,84,92,77,54,130,58,101,201,0,-53,68,182,0,80,64,165,167,9,140,146,96,246,121,232,67,183,242,162,1,-98,231,96,84,64,184,68,87,224,23,8,160,76,135,52,227,191,0,128,27,-211,131,192,24,192,52,1,95,54,154,163,64,21,89,145,129,131,141,97,1,-61,61,169,182,155,187,0,54,67,251,226,231,1,2,98,105,110,171,169,224,-61,1,181,142,242,35,0,240,208,2,65,0,0,51,225,0,0,96,102,227,-21,0,192,32,67,216,131,146,0,53,155,101,0,64,98,107,128,12,225,30,-0,224,213,1,247,212,4,65,138,251,220,3,96,33,126,54,0,57,70,234,-192,195,134,145,0,58,96,204,224,43,2,96,154,1,95,52,86,252,3,56,-32,95,52,70,156,128,38,131,34,77,246,253,198,0,103,72,189,195,64,96,-81,81,1,95,54,93,156,0,58,65,239,160,22,98,3,114,164,114,58,225,-116,0,98,99,123,14,164,192,2,51,57,52,64,23,131,79,196,39,83,179,-97,7,167,22,189,250,99,242,191,112,0,83,112,41,236,32,7,224,25,13,-96,77,155,189,214,57,160,25,180,176,0,85,81,198,225,248,4,108,158,194,-153,233,138,0,160,43,96,131,226,41,6,171,104,162,78,0,85,213,41,0,-54,166,64,64,0,224,129,12,96,30,224,85,16,99,157,224,85,9,98,50,-224,144,22,65,14,224,58,21,224,145,1,236,189,8,224,171,13,104,105,224,-112,16,99,43,224,171,45,175,224,224,171,19,224,59,16,101,231,224,59,9,-151,15,160,0,166,7,98,86,0,58,96,6,226,77,0,109,186,141,173,0,-67,64,8,96,3,196,7,164,46,136,158,129,207,136,58,160,159,0,50,224,-17,1,2,64,75,51,64,116,128,12,230,24,1,109,3,224,23,0,224,24,-0,224,93,0,125,45,224,99,6,224,86,4,233,39,0,224,142,13,64,215,-224,47,5,224,24,2,0,53,225,63,1,193,1,133,204,64,6,214,254,165,-72,75,217,129,85,65,15,105,244,0,56,100,21,224,187,0,128,131,67,13,-128,17,96,104,224,91,0,96,86,198,12,114,135,227,30,9,164,215,192,31,-107,103,0,50,76,93,224,24,0,229,181,7,78,73,64,0,0,58,70,151,-132,138,96,36,205,152,2,95,53,51,70,214,135,250,2,50,49,53,138,45,-100,119,96,19,233,186,0,172,125,96,14,115,18,128,66,224,63,2,5,95,-51,51,57,32,35,74,161,110,200,234,235,0,224,10,1,0,58,96,172,230,-237,4,230,79,14,131,53,254,139,1,124,179,102,20,66,101,121,113,227,224,-2,160,27,97,22,160,49,180,242,230,32,6,0,53,247,122,1,224,119,13,-160,229,231,21,2,225,84,10,114,35,128,0,109,89,0,58,71,253,99,16,-69,203,2,95,54,49,103,216,64,80,64,19,229,200,5,133,187,0,58,96,-35,104,85,85,53,0,53,122,229,128,10,117,64,160,10,224,21,1,71,252,-192,10,224,32,0,0,54,90,142,1,95,54,103,205,64,0,0,58,96,91,-96,85,0,51,64,30,120,206,1,54,49,110,119,64,36,138,5,224,142,0,-1,51,54,161,173,230,91,4,160,58,105,103,96,243,64,20,236,182,3,224,-43,9,159,41,224,43,7,161,146,224,25,1,224,18,1,0,54,170,172,0,-54,167,166,64,159,245,62,1,0,90,225,245,0,156,88,0,58,96,38,224,-188,6,97,10,1,51,48,64,193,100,251,96,11,131,194,67,114,224,40,5,-224,55,11,141,98,128,10,96,156,224,217,5,0,55,226,202,0,224,196,7,-207,118,229,37,3,160,77,90,197,227,54,0,224,68,6,224,66,2,237,192,-0,0,58,97,59,225,150,7,64,145,65,210,224,199,5,225,173,4,224,74,-12,214,22,224,74,6,64,142,224,74,6,0,50,104,0,224,18,1,128,94,-224,233,8,225,171,2,1,95,54,163,215,96,105,227,196,1,65,171,0,80,-98,95,210,43,1,80,32,180,66,1,64,58,96,58,225,183,7,0,57,110,-79,113,105,1,95,54,91,190,225,73,6,121,178,225,141,7,1,57,50,224,-53,4,0,54,96,53,253,181,12,1,95,39,234,84,3,224,205,10,107,1,-202,204,0,58,99,66,192,183,64,19,128,183,131,70,82,22,1,95,49,73,-203,1,95,54,93,113,129,52,224,185,1,1,95,51,98,191,0,58,96,144,-144,245,0,51,64,58,245,119,6,64,35,224,18,6,65,82,244,242,7,65,-95,231,211,5,231,152,2,233,66,2,224,10,2,122,54,224,66,1,64,20,-224,29,1,224,75,4,233,6,2,233,141,4,224,151,6,72,129,245,119,6,-129,20,192,50,224,60,2,224,39,6,67,133,224,39,12,65,31,178,227,225,-79,1,0,53,101,74,225,79,3,121,5,126,100,0,58,97,92,225,127,7,-142,248,69,66,0,58,96,38,211,51,71,203,2,95,55,53,64,9,0,54,-74,118,65,167,1,67,32,224,17,1,1,64,35,122,140,0,58,96,58,225,-164,17,96,249,233,140,14,224,244,3,233,56,14,224,34,2,0,58,96,171,-160,190,66,220,82,33,1,35,49,123,98,1,95,53,77,244,64,6,0,57,-96,199,131,52,224,199,11,97,31,224,199,5,0,49,114,168,0,58,96,59,-224,200,2,226,51,5,224,146,11,0,58,96,117,224,251,22,224,18,5,65,-135,248,43,11,226,83,25,224,10,13,226,44,31,0,58,98,24,228,51,6,-94,101,0,53,108,224,161,82,99,249,138,219,0,79,246,76,2,1,46,46,-67,251,224,17,3,1,58,58,128,17,2,79,32,35,84,132,71,251,96,12,-92,145,224,12,0,0,49,73,204,128,13,224,57,1,1,60,45,224,75,7,-1,45,62,224,75,1,224,48,0,96,62,0,54,224,62,9,0,61,96,44,-200,107,128,0,229,184,5,0,53,132,232,224,20,7,101,101,0,58,103,228,-196,150,64,248,68,150,96,49,161,197,228,250,11,22,33,64,35,36,37,38,-63,43,46,47,60,61,62,63,92,92,92,94,92,124,58,45,126,64,136,0,-58,97,62,142,88,225,88,2,99,84,137,103,0,82,79,39,97,245,240,22,-3,160,148,142,128,229,78,5,229,67,1,65,159,224,91,10,134,171,144,138,-239,213,2,118,175,235,147,1,66,20,105,220,192,31,224,161,10,128,24,70,-106,98,127,230,185,4,224,151,17,239,234,1,240,55,0,0,58,96,202,230,-145,9,1,95,53,126,196,224,72,4,74,160,65,141,2,67,32,79,224,62,-2,198,249,1,80,32,186,144,64,20,131,197,225,150,15,8,44,59,40,41,-91,93,123,125,96,129,136,190,226,231,166,7,114,36,2,75,32,89,225,1,-6,0,89,96,238,72,181,0,64,234,72,1,224,58,6,97,158,231,225,5,-65,54,65,104,231,89,2,0,35,83,72,107,54,1,95,52,72,173,161,238,-234,158,7,224,91,15,193,23,152,74,225,91,4,224,18,1,0,53,94,229,-193,175,146,14,132,66,129,220,204,72,249,103,0,1,50,48,73,156,135,247,-97,0,225,131,10,95,244,241,187,0,162,54,96,6,0,95,75,7,225,236,-1,0,95,113,19,65,96,231,209,2,132,103,64,20,228,85,9,97,117,65,-246,225,58,5,64,194,0,85,96,179,150,246,128,137,130,102,2,53,50,53,-64,4,176,243,101,219,129,84,224,201,5,203,43,224,109,12,121,54,227,243,-4,0,56,136,241,64,0,0,58,107,254,192,189,67,65,128,189,175,111,225,-225,10,233,61,7,131,170,224,95,2,0,67,124,10,206,131,226,248,4,235,-25,5,226,51,11,166,133,224,20,6,128,243,224,20,5,0,49,114,165,224,-21,8,136,213,224,21,8,102,75,224,21,8,116,149,224,21,8,224,109,11,-96,230,226,224,8,128,85,225,17,4,129,115,194,235,225,21,0,193,163,224,-17,3,130,127,224,17,2,96,100,224,17,4,74,248,224,35,6,224,34,8,-130,143,224,17,3,139,56,224,17,3,224,88,8,134,252,224,16,2,142,121,-225,163,8,77,111,107,190,224,95,8,229,21,5,108,122,219,240,128,18,226,-190,5,168,89,0,53,112,30,2,95,50,49,79,36,111,245,1,51,49,87,-102,96,40,0,56,203,241,227,147,9,68,142,80,90,182,232,224,171,13,68,-62,132,213,226,102,23,117,134,224,20,8,137,201,224,20,6,226,35,11,93,-106,224,20,9,226,55,11,110,32,224,20,7,94,230,224,20,9,65,234,224,-20,8,226,118,11,95,153,224,20,9,224,209,11,0,55,224,209,11,0,55,-224,209,11,106,44,224,20,8,224,209,11,112,139,224,20,7,97,185,224,20,-8,224,209,11,0,56,224,209,11,0,56,224,209,11,101,218,224,20,8,224,-209,11,68,194,224,20,9,224,209,11,69,170,224,20,9,224,209,11,105,23,-224,20,8,224,209,11,228,26,12,98,166,224,20,8,228,47,11,105,149,228,-47,10,227,249,8,184,9,224,17,2,176,247,224,17,3,227,215,8,126,142,-224,17,5,145,189,224,17,3,134,15,224,17,3,228,155,8,166,246,224,17,-3,228,84,8,72,52,224,17,6,228,138,9,228,192,9,224,179,8,135,88,-224,17,4,224,179,8,81,190,224,17,6,224,179,8,229,26,10,229,97,26,-229,62,9,224,178,8,229,61,15,224,16,1,224,175,8,224,174,8,224,173,-8,225,96,9,224,16,7,224,170,8,197,47,5,95,53,56,50,32,79,179,-133,233,95,1,1,56,51,236,32,2,2,83,79,72,112,168,224,79,7,224,-47,17,224,46,8,128,178,0,79,224,98,16,2,78,85,76,224,51,7,96,-161,224,49,17,2,83,84,88,224,49,7,96,245,224,49,17,0,69,224,49,-9,97,56,224,49,18,1,79,84,224,49,7,96,200,224,49,18,1,78,81,-224,49,7,97,190,224,49,17,2,65,67,75,224,49,7,98,1,224,49,17,-1,66,69,225,43,8,98,68,224,49,18,0,83,224,48,7,98,134,224,48,-17,0,72,224,247,8,98,200,224,48,17,1,76,70,225,242,8,225,191,22,-0,86,224,98,8,131,79,224,49,17,0,70,224,99,9,225,241,22,1,67,-82,224,49,8,225,241,22,1,83,73,224,49,8,225,191,22,2,68,76,69,-224,50,8,225,192,22,2,68,67,49,224,50,8,225,193,22,2,68,67,50,-224,50,8,225,195,22,2,68,67,51,224,50,8,225,197,22,2,68,67,52,-224,50,7,133,134,224,50,17,1,78,65,226,190,8,133,203,225,99,18,1,-89,78,224,50,8,227,186,24,0,66,224,50,8,225,201,22,1,67,65,224,-101,9,227,188,23,0,77,224,49,8,225,252,22,1,83,85,224,151,9,225,-252,22,2,69,83,67,224,50,8,225,252,22,0,70,227,190,8,135,172,224,-49,17,0,71,224,49,9,225,250,22,0,82,224,49,8,136,52,224,49,17,-0,85,224,49,9,225,248,23,0,80,224,49,8,225,247,22,0,68,228,234,-9,0,49,129,45,242,174,5,224,0,17,238,95,11,245,236,0,111,64,242,-13,13,1,83,39,253,46,1,123,196,190,109,224,75,0,144,36,125,212,0,-85,210,143,224,19,0,187,247,112,67,233,177,2,201,172,143,162,242,61,14,-82,59,64,0,80,170,0,58,65,14,64,161,0,80,160,98,147,0,125,81,-0,90,160,4,112,95,145,117,71,203,192,217,146,60,79,116,109,110,76,56,-0,95,149,221,3,49,49,52,49,101,107,3,95,51,54,48,225,108,3,30,-97,116,97,46,67,104,97,114,46,99,104,114,58,32,105,110,118,97,108,105,-100,32,99,111,100,101,112,111,105,110,116,97,137,77,117,0,48,111,231,146,-94,2,95,50,50,84,223,1,49,48,144,2,128,9,224,98,1,0,58,109,-153,214,55,237,243,2,249,195,13,253,225,26,0,58,110,46,124,56,83,12,-64,210,3,95,53,53,53,64,5,77,154,2,95,53,53,96,5,77,145,75,-47,107,51,1,56,48,238,62,0,0,53,108,216,1,95,53,108,202,224,13,-1,65,156,0,73,64,214,64,102,96,214,1,49,54,64,4,0,55,125,139,-181,142,0,58,96,39,224,29,0,0,51,82,165,224,29,4,0,54,224,59,-7,1,95,49,64,147,0,58,96,102,64,25,0,54,78,171,77,237,1,95,-53,77,222,1,95,53,129,150,77,192,1,95,53,77,177,1,95,53,77,162,-2,95,55,54,224,176,0,1,55,55,192,10,0,58,96,6,83,189,158,48,-224,5,2,160,78,145,57,162,224,128,6,0,58,96,80,224,52,27,224,59,-2,0,58,96,139,224,52,20,224,98,2,160,59,0,58,96,198,224,52,27,-224,112,2,0,58,97,1,116,145,0,66,98,221,191,189,87,126,0,64,96,-19,211,136,191,209,1,95,53,163,72,124,197,160,35,131,111,67,134,0,52,-101,226,0,67,64,9,139,88,1,64,58,96,123,97,124,65,84,79,148,1,-95,53,79,133,0,58,97,136,223,224,0,51,111,47,128,31,0,58,96,31,-192,148,243,198,2,228,10,0,116,23,98,239,99,220,0,53,120,244,192,13,-1,51,50,67,239,226,175,1,64,82,2,10,65,32,84,24,226,26,2,96,-25,218,107,96,84,99,208,0,66,66,242,226,64,7,196,23,160,4,1,83,-32,68,27,224,48,32,193,90,132,59,246,216,5,224,208,1,1,67,39,69,-28,244,181,4,224,238,3,64,97,65,31,90,225,129,96,0,53,67,169,178,-155,2,64,64,75,100,121,160,60,160,108,128,111,164,235,160,114,215,97,64,-88,192,25,160,121,224,115,22,224,113,5,224,111,3,224,49,17,0,54,133,-109,224,0,2,0,58,100,37,193,245,1,53,54,68,25,0,52,96,75,160,-16,4,49,32,95,50,53,67,137,2,51,53,50,68,59,0,50,68,91,132,-219,5,53,54,50,32,95,51,69,168,205,62,66,56,96,44,224,155,4,0,-58,96,119,129,242,2,52,32,75,64,131,0,58,64,59,128,118,0,89,193,-111,98,177,225,174,1,230,78,3,192,21,162,217,224,29,0,160,165,248,54,-2,0,58,64,177,128,88,69,43,229,208,4,16,102,111,108,100,108,49,58,-32,101,109,112,116,121,32,108,105,115,197,194,1,53,53,99,122,0,54,223,-7,160,146,0,83,226,1,4,64,91,64,39,133,188,160,134,0,85,245,201,-6,98,229,97,13,248,123,1,192,189,119,80,163,157,133,255,64,182,1,95,-50,138,82,228,31,0,97,59,69,237,163,48,130,32,5,95,57,56,32,95,-49,134,23,66,109,224,13,1,96,151,188,35,228,99,3,227,137,2,133,154,-64,83,99,231,66,13,164,0,70,14,68,91,0,80,187,198,214,108,64,15,-64,9,200,28,2,95,51,50,91,200,96,77,0,58,96,6,96,110,66,33,-166,113,101,215,66,27,99,192,0,73,195,49,135,157,227,125,4,128,113,230,-51,2,96,153,228,7,1,128,209,165,218,131,28,64,59,163,69,250,139,2,-68,255,193,157,97,92,229,44,3,226,255,0,192,86,194,215,184,216,129,39,-131,146,128,15,133,35,130,246,1,52,57,224,155,0,99,219,128,57,121,45,-162,149,161,25,224,46,1,224,102,0,160,44,228,59,3,224,184,11,224,134,-15,229,172,0,224,137,8,192,90,224,134,27,224,181,2,225,11,3,224,73,-0,161,11,98,27,0,55,227,35,2,7,92,34,46,47,108,105,98,47,72,-252,7,47,73,110,116,101,103,101,114,96,7,12,114,110,97,108,46,104,115,-92,34,44,53,52,58,141,175,0,58,97,251,104,122,0,53,118,220,99,69,-64,117,163,35,97,150,128,238,254,68,0,98,253,96,23,202,9,67,51,164,-64,225,238,0,64,41,228,17,4,132,223,128,5,227,216,8,19,105,109,112,-111,115,115,105,98,108,101,58,32,120,115,32,62,61,32,121,115,96,161,0,-75,68,160,224,223,39,3,57,48,58,54,132,24,0,64,97,147,130,85,128,-189,226,90,0,227,194,3,2,85,32,65,129,145,227,193,1,0,49,250,248,-0,228,187,0,199,250,71,39,229,26,0,196,200,224,80,12,98,204,224,80,-8,97,180,96,69,97,129,196,237,99,108,102,57,69,16,0,57,87,207,140,-31,131,248,131,255,180,68,164,82,224,37,1,64,106,224,14,3,228,109,1,-1,95,50,180,102,0,58,96,114,163,245,65,190,0,85,231,102,22,166,124,-98,108,0,56,229,33,11,1,64,58,66,176,164,183,1,95,51,70,35,167,-12,66,47,227,27,3,129,116,200,98,0,52,201,107,96,169,128,120,202,88,-0,52,165,8,228,214,1,0,53,75,46,66,7,169,11,195,56,105,29,105,-51,193,127,169,92,131,139,163,169,68,200,157,35,139,52,0,52,96,210,96,-17,201,82,0,58,96,7,202,205,96,223,1,95,49,106,211,0,49,137,229,-106,211,0,49,106,211,0,49,106,211,106,205,96,73,138,205,96,10,0,58,-96,6,3,10,65,32,75,65,252,0,58,96,155,64,13,2,50,32,58,96,-185,96,25,0,75,96,25,195,116,0,52,227,116,1,67,206,227,116,2,164,-99,130,15,230,160,9,162,126,230,162,8,226,216,15,97,160,64,110,162,131,-231,143,1,100,172,226,208,3,227,48,46,224,91,1,227,48,9,224,95,4,-227,48,31,224,80,2,162,131,194,114,227,48,9,131,30,227,29,0,101,45,-231,110,2,224,11,3,0,58,96,71,1,10,65,77,221,0,58,96,147,143,-46,2,53,51,55,65,104,64,76,109,159,1,64,58,77,185,193,146,111,59,-96,87,232,84,0,224,200,1,72,19,98,116,1,95,51,125,178,0,64,66,-254,161,72,198,53,163,23,225,75,0,160,7,0,83,96,167,225,73,1,104,-23,128,240,101,240,0,53,97,127,0,80,193,31,225,15,0,224,8,0,143,-10,127,53,97,215,2,51,51,57,142,183,64,191,130,213,240,11,10,196,62,-238,190,0,160,127,233,203,1,162,128,238,206,4,233,198,3,200,28,169,71,-195,130,97,231,110,228,99,57,240,87,0,224,69,14,129,80,240,54,12,160,-27,112,59,64,92,163,221,2,66,32,95,76,239,234,47,2,67,147,131,41,-241,115,0,253,110,6,205,12,164,119,240,243,5,0,58,111,184,144,88,225,-175,0,235,238,1,167,232,163,125,225,111,4,65,144,129,111,135,137,224,62,-48,129,241,224,62,48,185,163,194,97,129,141,226,121,2,224,60,21,165,225,-1,52,53,242,165,3,15,118,97,108,68,105,103,58,32,66,97,100,32,98,-97,115,101,135,76,0,83,98,226,88,249,64,9,99,186,103,10,94,203,0,-49,74,81,0,35,98,254,190,221,96,17,87,53,97,29,68,192,224,49,11,-190,103,224,49,3,126,17,74,175,68,47,67,5,1,48,57,132,18,67,197,-97,181,230,250,0,134,234,95,53,128,5,128,78,250,182,0,224,61,39,131,-189,224,61,12,224,48,13,70,172,162,132,1,53,51,98,79,101,168,1,53,-51,81,177,224,192,9,224,68,23,225,36,15,96,33,225,36,5,139,228,224,-99,41,132,38,0,58,67,164,164,219,224,109,27,76,21,64,52,134,197,96,-227,98,7,224,127,39,0,58,97,37,70,250,227,240,6,254,29,8,128,131,-224,20,5,80,118,224,20,8,147,149,224,21,7,255,152,12,0,49,102,30,-254,115,7,127,6,254,115,9,253,101,10,224,17,8,128,212,224,16,19,132,-25,224,16,7,1,58,53,86,38,207,178,229,156,7,227,189,5,181,181,230,-64,1,134,92,128,11,134,97,144,134,166,109,224,35,5,236,181,3,231,206,-2,240,102,6,0,39,68,19,224,21,2,224,66,0,100,75,227,58,2,189,-117,230,194,0,236,19,0,70,216,64,66,137,105,241,204,2,96,4,66,23,-229,155,0,0,89,160,93,102,252,97,135,70,42,134,179,97,15,247,57,1,-134,10,146,179,226,89,3,192,134,225,87,1,128,119,66,136,1,52,57,105,-172,65,83,0,56,129,176,224,23,2,193,109,96,25,1,95,52,80,12,64,-0,70,146,64,73,160,48,96,139,0,58,94,63,200,27,66,229,226,51,2,-64,28,208,105,230,186,8,129,144,0,82,215,65,230,108,3,0,58,96,72,-226,254,7,0,48,131,56,230,188,14,235,44,1,224,49,0,152,47,1,58,-53,64,24,119,73,93,95,117,235,64,25,64,94,2,52,54,57,64,45,118,-55,99,132,151,77,1,52,55,81,211,160,86,107,13,96,11,0,58,96,6,-132,13,72,255,0,53,90,86,64,146,1,51,56,64,247,0,52,86,5,151,-187,90,61,179,248,178,4,64,42,139,255,104,57,236,191,0,0,53,67,107,-233,212,1,64,17,108,134,103,193,0,53,91,29,232,194,0,107,44,71,207,-195,16,0,52,64,118,103,208,96,182,64,29,227,46,2,97,200,96,29,2,-52,54,56,64,44,98,12,0,58,96,42,161,174,3,49,53,32,35,106,45,-232,228,1,65,50,1,95,53,67,194,192,138,224,40,0,152,56,0,56,97,-49,162,49,0,58,96,190,225,223,3,77,33,0,53,104,104,105,35,146,7,-75,154,236,122,2,2,32,95,52,140,143,96,90,64,155,64,79,1,95,53,-157,212,96,86,64,120,129,64,0,51,76,24,96,18,129,197,2,95,52,57,-87,253,66,13,0,58,96,104,128,125,97,11,0,90,108,235,0,48,162,67,-64,196,228,59,5,128,156,179,243,246,169,1,228,230,3,96,253,105,117,0,-58,64,245,224,113,2,66,31,0,58,96,27,128,19,2,48,32,95,64,186,-82,98,64,23,165,175,160,157,0,49,96,43,247,74,0,1,95,52,69,61,-1,95,53,71,49,67,53,1,58,53,69,141,128,224,0,50,97,252,0,58,-96,27,192,203,64,44,0,52,69,219,1,58,53,70,47,235,197,0,164,108,-128,8,75,93,2,58,53,48,129,22,129,242,0,53,66,252,114,166,209,162,-0,48,118,213,0,48,182,213,128,239,100,183,0,89,116,55,66,90,64,77,-68,192,137,72,212,106,233,20,4,1,95,51,109,230,0,51,67,46,2,51,-55,49,118,133,204,113,128,36,234,103,2,224,239,0,226,85,6,96,208,196,-183,65,138,161,43,97,143,163,183,96,181,64,182,100,18,2,53,48,52,233,-108,2,19,80,114,101,108,117,100,101,46,114,101,97,100,58,32,110,111,32,-112,97,114,201,114,150,73,3,95,53,48,53,175,2,224,57,18,8,97,109,-98,105,103,117,111,117,115,224,64,3,65,36,130,47,66,68,64,13,129,252,-101,153,128,16,129,249,109,14,64,158,228,158,10,229,178,1,150,243,166,35,-226,243,6,235,198,11,155,250,229,167,7,0,58,97,28,226,110,0,0,52,-72,94,0,58,96,49,224,19,2,129,224,226,60,2,68,139,66,58,65,94,-226,99,0,104,205,97,129,96,183,163,115,228,70,2,64,166,251,170,5,141,-158,3,95,52,56,51,225,194,1,1,56,53,192,11,0,58,96,6,64,76,-96,179,0,50,97,218,163,133,196,37,140,189,1,95,49,224,64,1,227,237,-0,2,64,95,50,98,7,133,99,0,57,224,86,3,129,134,246,65,1,0,-66,134,167,98,160,224,18,7,1,66,39,180,26,129,47,64,72,224,147,1,-0,49,128,147,69,7,71,115,160,135,134,108,96,135,113,79,128,135,128,10,-96,251,64,10,0,58,96,6,225,42,0,0,52,193,42,101,83,132,203,225,-30,5,96,85,161,30,101,241,96,6,64,64,0,51,229,172,3,173,150,0,-55,160,158,64,64,97,41,100,226,96,6,224,50,3,96,109,195,158,0,67,-96,58,224,49,0,101,240,96,6,5,10,65,32,73,32,58,96,44,160,10,-64,106,194,13,87,7,99,141,160,16,86,110,231,199,5,0,58,96,36,192,-235,78,114,135,154,224,5,0,101,35,206,231,96,67,172,140,1,52,54,64,-200,200,62,160,27,138,124,224,27,6,165,39,248,78,1,230,148,4,68,64,-232,136,3,120,109,132,241,2,95,52,56,97,219,97,115,65,255,175,120,132,-186,164,169,120,179,227,108,1,137,169,64,26,80,140,224,21,1,69,48,103,-87,228,173,1,193,17,128,0,224,24,1,161,214,168,255,97,214,96,11,0,-58,96,6,129,74,167,245,0,56,83,142,64,34,64,22,102,176,64,14,253,-175,1,226,172,0,131,148,255,214,1,97,18,161,52,66,27,1,95,52,89,-150,64,34,195,244,104,157,65,144,128,43,247,69,7,234,183,1,224,19,2,-128,115,214,87,224,32,2,224,9,10,65,59,150,163,225,213,0,232,47,7,-133,231,101,239,65,135,97,116,192,17,131,137,1,95,52,113,138,97,242,224,-55,7,224,177,7,129,163,226,90,0,162,84,64,41,192,83,224,84,5,224,-82,5,224,81,11,224,91,4,224,82,9,224,181,1,224,56,17,226,225,5,-224,57,18,225,108,9,224,9,2,101,243,160,63,193,246,160,230,224,236,16,-96,98,227,54,2,194,242,139,111,224,113,1,160,218,97,155,98,173,185,23,-64,125,2,95,52,55,68,192,0,55,102,92,162,66,96,0,224,96,0,113,-176,64,122,200,243,224,147,25,226,150,5,224,96,2,131,154,177,117,225,1,-0,161,4,224,13,22,99,150,130,112,97,96,224,237,0,99,245,128,13,224,-253,1,227,241,0,98,144,173,239,96,17,157,165,225,15,9,224,244,4,64,-97,224,96,22,130,105,224,95,2,162,122,128,94,228,23,3,194,3,226,190,-6,225,67,29,225,216,24,160,105,225,206,21,226,190,21,192,9,195,208,226,-240,25,224,49,11,224,176,2,228,6,9,225,89,8,229,234,0,96,181,224,-43,4,224,45,6,225,52,0,224,137,18,96,135,226,27,5,193,59,224,138,-21,250,245,14,27,84,101,120,116,47,80,97,114,115,101,114,67,111,109,98,-105,110,97,116,111,114,115,47,82,101,97,100,80,154,252,5,49,52,49,58,-49,48,250,254,0,64,0,141,248,128,103,141,248,128,11,0,58,96,6,113,-209,144,61,132,152,64,47,137,58,238,2,4,181,182,0,58,64,64,230,19,-0,64,170,0,58,96,46,192,70,66,52,70,139,101,222,64,55,96,71,173,-113,76,187,160,21,198,148,2,95,52,55,103,203,88,215,192,85,108,57,96,-23,128,17,102,138,64,53,102,62,1,55,49,135,27,197,82,98,76,107,174,-130,226,248,84,2,64,158,206,133,96,106,72,30,98,132,3,95,52,55,52,-192,11,0,58,96,6,198,215,162,193,128,202,119,177,130,213,0,66,115,18,-100,41,64,80,67,81,89,240,64,15,130,59,1,95,50,77,105,248,179,2,-96,248,85,113,224,35,4,224,51,20,247,192,2,130,45,209,190,71,242,236,-201,5,164,170,128,170,159,64,96,164,1,52,55,224,250,0,228,173,0,163,-151,224,43,5,224,214,0,118,31,96,139,224,223,37,224,224,49,195,80,227,-50,4,242,193,0,210,205,136,243,224,250,2,229,160,1,224,202,2,64,5,-162,119,224,254,9,128,72,225,2,3,224,56,13,225,11,122,224,170,5,119,-199,132,201,234,1,1,235,52,1,97,5,101,84,166,36,224,192,1,81,146,-160,99,224,147,48,101,232,167,35,224,7,2,224,141,117,224,104,10,224,103,-76,96,89,128,199,224,240,119,64,16,1,54,48,230,7,2,31,115,116,105,-109,101,115,58,32,112,111,115,105,116,105,118,101,32,109,117,108,116,105,112,-108,105,101,114,32,101,120,112,101,3,99,116,101,100,101,251,0,58,68,223,-229,219,4,226,220,31,128,146,96,0,128,213,1,95,50,93,16,224,204,24,-224,55,0,224,195,4,224,54,39,98,103,0,58,99,196,108,142,109,49,173,-28,0,83,157,121,175,41,141,14,194,154,96,52,244,38,1,178,72,0,58,-70,44,166,68,0,50,96,14,208,80,128,1,196,17,224,11,0,224,59,2,-64,81,86,154,240,106,0,64,209,0,58,103,32,174,115,1,54,53,103,49,-80,169,78,22,128,22,223,59,175,201,0,58,96,31,70,91,1,32,58,96,-48,207,198,0,54,65,83,172,16,174,70,143,201,141,156,111,201,103,112,143,-201,160,10,206,202,64,87,175,201,0,51,164,218,128,5,134,191,213,135,104,-109,70,226,239,160,2,64,120,233,198,7,224,28,7,238,216,11,140,185,224,-65,9,175,255,96,24,65,34,161,179,159,36,175,214,96,49,0,58,96,6,-224,178,0,137,139,112,120,67,84,227,51,0,192,75,65,61,199,187,133,177,-128,46,96,33,0,49,78,186,224,34,4,0,58,96,125,128,93,1,95,51,-72,8,128,121,161,132,130,6,0,80,65,132,130,2,0,90,160,1,120,249,-1,64,58,96,199,211,24,224,4,3,158,131,128,205,0,58,97,4,1,10,-65,194,14,0,58,97,37,96,76,224,55,6,224,85,0,129,252,224,85,8,-224,34,3,232,123,1,235,130,2,237,186,2,64,240,255,53,0,97,114,139,-193,131,215,160,14,0,85,164,137,160,38,231,63,3,169,105,0,67,129,146,-98,115,128,64,113,47,129,153,64,17,97,59,3,54,48,32,58,117,106,161,-45,65,72,146,182,212,0,135,103,97,227,0,90,180,1,185,71,231,158,1,-131,70,168,158,244,46,4,251,121,2,92,78,130,71,133,85,225,26,1,96,-214,64,85,1,95,52,92,156,128,0,224,38,10,224,123,2,64,195,193,227,-229,51,6,15,105,110,105,116,58,32,101,109,112,116,121,32,108,105,115,116,-101,31,68,77,225,84,0,224,122,4,193,48,224,123,1,0,58,96,9,97,-198,232,58,0,2,115,101,113,192,221,128,19,224,16,2,228,75,11,1,64,-58,96,170,133,144,86,109,0,56,161,6,246,125,5,224,181,1,3,35,108,-105,110,181,196,64,24,69,54,1,53,50,224,213,2,8,123,45,35,32,76,-73,78,69,32,96,35,65,49,106,253,66,31,0,51,139,108,0,51,66,244,-1,95,52,133,94,224,56,1,3,32,35,45,125,128,87,1,58,52,93,151,-128,215,225,12,1,67,20,181,51,235,68,1,64,86,134,169,131,109,2,95,-52,52,68,138,149,251,128,15,0,54,192,15,0,58,96,41,96,86,242,213,-0,225,104,1,207,242,98,71,242,153,0,0,58,64,63,225,29,0,0,49,-67,86,1,95,52,70,118,129,228,1,52,32,224,192,3,9,94,41,94,42,-94,43,94,44,94,45,166,234,64,118,224,111,7,130,24,230,43,1,64,85,-155,73,249,20,2,96,60,242,211,0,128,26,1,52,52,111,39,0,51,88,-92,1,95,50,70,136,0,58,96,137,67,30,1,54,54,130,132,130,230,234,-62,0,2,67,32,60,94,32,97,12,224,26,12,90,192,224,26,15,111,197,-224,26,13,126,79,227,122,0,224,26,4,160,221,0,85,65,146,64,226,68,-44,1,61,61,192,25,160,254,99,224,223,250,224,44,12,161,17,224,44,8,-224,117,14,97,52,224,72,12,134,191,224,117,30,134,225,224,117,10,225,7,-14,98,58,224,145,13,184,124,224,100,10,109,229,224,145,31,103,93,225,7,-33,98,180,224,72,12,151,134,224,117,30,98,104,225,7,12,226,97,14,194,-16,225,35,10,100,171,224,173,13,108,97,224,128,12,112,17,224,173,31,64,-97,225,35,33,125,238,224,72,12,96,25,224,117,31,96,242,226,43,16,96,-118,225,34,5,195,78,224,145,10,226,189,16,96,25,224,145,32,226,189,16,-224,45,12,226,134,15,225,200,15,96,164,225,253,13,97,199,224,26,13,98,-144,224,245,13,165,119,224,154,10,226,244,15,224,44,12,226,216,15,224,117,-14,100,240,224,72,12,226,244,15,224,44,12,226,160,15,225,7,14,98,115,-224,144,13,181,10,224,99,10,226,215,15,224,44,11,226,186,15,224,116,13,-96,29,224,70,11,226,212,15,224,43,11,226,155,15,225,3,15,194,10,224,-25,9,198,159,224,168,9,182,73,224,124,9,226,235,15,224,43,11,226,233,-16,224,114,12,226,150,16,226,149,35,226,148,16,228,28,14,225,0,16,226,-174,16,226,173,36,228,24,35,229,77,16,111,10,0,50,78,9,104,136,0,-58,96,6,174,113,5,52,48,32,64,95,54,74,46,160,26,138,242,239,33,-2,0,85,233,108,0,128,5,64,0,64,119,192,239,114,86,128,136,0,64,-233,150,1,128,17,96,32,252,77,5,173,149,245,67,1,0,58,96,131,105,-168,64,182,234,49,0,3,95,52,51,56,96,224,138,134,96,61,1,35,51,-208,200,0,58,106,147,233,162,6,235,165,5,5,102,111,108,100,114,49,235,-167,8,65,60,129,197,64,140,160,14,141,147,224,10,3,64,121,192,105,202,-211,105,209,0,49,80,110,65,106,1,52,51,216,177,126,36,136,83,236,255,-0,0,51,202,177,0,95,79,211,72,160,0,58,96,48,207,252,206,45,86,-138,192,103,253,26,0,224,29,0,224,31,2,64,32,138,88,111,93,1,95,-52,97,11,142,152,3,58,52,51,51,138,79,2,51,54,51,74,151,65,213,-98,1,0,58,96,38,206,48,0,85,96,16,129,226,6,95,49,51,54,32,-75,32,130,68,0,66,122,63,175,182,0,51,134,242,161,13,98,29,1,49,-54,225,88,2,4,32,32,97,116,32,76,76,0,32,216,20,192,66,128,63,-1,49,51,76,127,133,176,129,31,224,66,9,2,99,111,108,192,61,130,76,-224,57,8,66,75,125,247,224,61,9,13,94,42,32,32,32,32,117,115,101,-100,32,98,121,32,160,71,128,60,1,52,51,237,222,0,128,20,0,52,80,-235,96,20,2,95,49,52,81,38,96,11,0,58,96,6,141,219,98,114,226,-104,1,162,168,165,197,0,52,139,23,0,58,96,7,160,47,65,87,1,75,-50,204,17,1,58,52,64,15,111,178,97,94,74,184,96,40,0,73,89,162,-0,95,249,117,7,31,99,112,112,104,115,115,114,99,47,109,97,108,99,111,-108,109,45,119,97,108,108,97,99,101,45,117,110,105,118,101,114,115,1,101,-47,96,33,6,45,49,46,50,48,46,57,128,12,153,135,3,55,57,58,49,-205,102,66,79,96,100,0,75,195,233,64,8,192,143,130,71,3,75,32,58,-52,66,148,120,226,113,253,74,30,1,58,52,66,160,96,19,0,56,127,92,-73,60,1,95,52,137,184,1,51,50,65,33,138,69,1,51,51,68,49,192,-11,76,198,96,11,0,58,96,6,194,63,131,118,225,156,4,10,69,120,105,-116,83,117,99,99,101,115,115,128,173,161,223,0,52,73,238,79,175,3,56,-50,32,95,89,155,231,66,1,225,225,9,64,68,5,70,97,105,108,117,114,-174,177,224,36,1,0,79,132,5,148,223,3,95,49,51,56,162,49,168,205,-225,244,1,202,139,96,210,64,11,0,58,96,6,115,57,102,202,193,233,68,-127,178,51,160,16,128,73,0,58,96,178,97,42,0,57,65,104,2,51,53,-52,64,107,0,56,224,167,2,6,83,121,115,116,101,109,46,64,174,64,167,-224,192,5,2,67,111,100,128,189,96,171,0,58,97,105,180,42,2,83,32,-95,65,134,145,96,78,57,0,58,65,161,64,29,224,66,1,130,1,0,34,-96,27,130,83,1,95,52,114,165,0,48,96,18,130,1,70,123,3,39,32,-95,48,228,127,0,0,52,73,132,78,226,73,95,129,97,0,58,64,54,128,-121,2,95,51,57,228,191,1,64,33,0,58,96,47,110,173,101,20,134,226,-132,233,78,187,84,175,64,78,1,51,57,65,98,5,50,48,57,53,49,48,-64,61,4,35,53,53,50,57,100,38,99,57,1,52,48,112,25,0,48,99,-185,70,145,1,95,52,65,142,1,95,52,99,203,224,211,1,17,104,80,117,-116,67,104,97,114,58,32,115,117,114,114,111,103,97,116,161,223,1,95,51,-160,141,130,156,1,80,32,105,214,0,73,96,18,245,132,1,96,105,99,144,-251,88,1,224,9,5,99,191,0,52,64,246,1,95,50,96,41,118,17,0,-51,142,195,128,6,0,58,96,154,224,81,0,64,1,149,181,164,240,192,14,-224,11,2,192,8,209,120,64,95,97,143,3,48,56,32,58,96,145,96,13,-84,101,79,228,0,58,64,23,227,99,3,0,48,113,253,0,48,104,251,131,-99,64,38,195,99,192,11,67,99,96,11,0,58,96,6,227,99,1,115,26,-128,1,102,155,104,113,246,177,1,224,5,0,97,182,161,148,64,11,64,174,-99,161,108,142,128,19,96,31,131,54,0,52,97,201,227,121,6,0,58,229,-150,1,230,13,2,224,36,15,193,27,229,194,0,67,90,130,57,0,51,86,-215,65,125,224,72,28,128,162,192,185,209,96,224,171,3,106,107,224,94,10,-230,94,12,0,40,196,122,224,122,7,0,79,131,221,249,29,0,192,118,228,-53,0,129,164,132,53,96,11,0,58,96,6,231,48,1,67,68,64,78,0,-85,254,157,1,236,42,1,224,18,6,109,16,224,19,7,64,84,242,176,0,-160,19,97,159,236,95,6,69,34,0,85,244,117,4,5,116,101,114,114,117,-112,217,144,224,28,4,14,114,101,115,111,117,114,99,101,32,118,97,110,105,-115,104,192,34,224,35,4,89,233,1,111,117,201,5,224,110,7,65,95,224,-45,3,20,117,110,115,117,112,112,111,114,116,101,100,32,111,112,101,114,97,-116,105,111,110,224,120,9,12,104,97,114,100,119,97,114,101,32,102,97,117,-108,192,91,224,243,8,69,80,224,243,7,68,25,224,132,7,73,59,224,243,-5,14,97,112,112,114,111,112,114,105,97,116,101,32,116,121,112,164,46,224,-35,5,12,118,97,108,105,100,32,97,114,103,117,109,101,110,192,131,224,34,-3,3,102,97,105,108,225,18,0,224,115,7,69,34,224,44,3,4,112,114,-111,116,111,72,159,4,101,114,114,111,114,224,111,9,0,115,101,243,224,29,-3,224,240,9,225,247,10,225,246,10,225,245,10,225,244,7,21,117,110,115,-97,116,105,115,102,105,101,100,32,99,111,110,115,116,114,97,105,110,116,167,-89,224,40,4,0,115,91,176,224,147,2,224,210,4,13,101,114,109,105,115,-115,105,111,110,32,100,101,110,105,225,10,15,226,2,7,6,105,108,108,101,-103,97,108,225,254,19,9,101,110,100,32,111,102,32,102,105,108,161,153,224,-247,8,225,230,10,225,229,7,226,188,0,5,101,120,104,97,117,115,226,224,-21,3,98,117,115,121,225,201,14,224,86,6,10,100,111,101,115,32,110,111,-116,32,101,120,235,252,0,224,31,3,6,97,108,114,101,97,100,121,128,30,-161,82,128,0,196,11,174,128,100,11,150,136,64,6,196,11,2,95,51,53,-75,135,101,69,107,211,247,82,8,5,72,97,110,100,108,101,132,140,0,67,-170,95,228,129,8,128,94,64,68,0,58,96,6,232,112,27,3,73,79,46,-69,193,235,224,28,1,6,73,79,69,120,99,101,112,225,169,0,168,119,70,-125,7,10,65,32,94,112,117,116,98,70,174,218,213,3,57,57,32,79,64,-6,64,147,3,95,52,48,48,160,148,0,58,103,204,250,147,3,64,26,183,-212,153,47,134,135,230,145,2,167,43,237,31,4,1,51,57,151,137,236,28,-0,232,168,4,166,141,4,51,57,52,32,95,150,204,72,101,0,54,65,85,-0,57,101,234,237,205,6,3,66,97,100,32,129,78,1,32,109,201,87,96,-37,0,57,174,231,0,58,64,207,104,201,121,80,249,250,3,120,122,192,151,-169,232,0,51,104,189,104,188,1,51,57,87,152,237,195,1,128,76,167,193,-3,57,55,32,58,96,32,73,155,2,112,50,112,64,13,0,54,128,26,87,-187,0,39,74,74,224,5,4,219,99,111,152,204,46,171,155,224,6,12,224,-42,2,64,15,171,207,224,42,29,160,28,224,49,10,224,42,15,224,49,10,-224,42,22,224,49,3,176,72,129,162,0,58,96,6,98,24,0,82,64,240,-3,95,51,56,57,138,211,0,58,65,214,129,139,0,95,89,13,80,155,0,-58,98,15,5,10,65,32,97,110,100,65,68,233,213,1,0,89,156,94,155,-6,72,175,108,38,137,254,194,41,168,17,143,149,0,66,129,207,0,64,80,-40,129,172,201,208,0,85,224,135,8,130,186,79,83,111,73,0,58,96,27,-99,193,162,16,0,95,89,138,226,185,4,224,180,2,142,13,226,209,0,0,-56,104,45,2,58,51,56,130,28,240,114,8,3,104,101,97,100,240,112,8,-0,75,64,251,64,57,97,15,100,179,0,89,201,208,64,250,96,10,160,255,-128,252,253,185,0,170,216,229,81,0,96,39,224,5,0,145,180,1,95,51,-90,81,179,161,96,2,112,184,225,80,0,98,252,112,16,96,40,2,95,51,-55,98,228,224,42,1,128,6,224,38,0,224,87,6,160,47,192,159,132,195,-3,67,39,32,79,96,33,0,53,164,51,128,30,96,185,3,95,50,48,49,-169,158,64,33,0,54,132,241,192,40,170,16,97,111,113,41,132,22,128,85,-64,54,0,57,251,152,3,1,45,79,131,231,128,71,197,51,228,106,0,64,-64,224,52,10,9,45,115,116,114,105,112,45,101,111,108,164,37,224,188,131,-229,43,4,224,192,20,231,79,0,225,169,255,225,169,104,193,171,176,40,255,-88,15,6,45,45,104,97,115,104,101,232,65,1,227,137,255,227,137,255,225,-169,255,227,137,51,64,18,131,120,224,9,12,234,103,3,65,166,170,158,167,-55,64,14,227,203,0,209,60,72,100,80,73,0,49,83,127,96,176,128,0,-224,39,0,113,63,225,246,4,160,62,99,214,224,76,1,96,37,167,173,128,-2,96,17,192,71,138,15,192,17,115,103,64,14,145,51,192,140,128,45,64,-39,97,20,0,54,160,150,224,89,0,209,17,193,67,244,187,0,139,43,128,-22,96,0,75,178,225,13,2,64,173,160,146,114,195,224,94,8,171,4,224,-65,2,225,58,1,64,116,173,98,96,181,129,48,97,234,229,12,16,0,111,-195,45,138,21,146,25,96,93,224,179,4,128,10,0,55,106,127,128,0,229,-53,0,225,173,2,160,124,96,17,225,192,36,225,179,6,160,7,117,248,193,-135,224,68,11,0,49,214,68,227,45,2,224,182,4,192,12,96,184,4,95,-51,55,55,32,155,233,224,196,5,128,182,226,9,0,224,185,0,117,248,2,-51,55,56,160,110,225,67,15,3,97,110,115,105,230,76,0,224,174,0,224,-81,2,224,75,34,4,116,114,97,100,105,78,17,0,97,195,217,160,220,162,-11,224,64,24,1,115,116,208,45,96,0,109,61,96,56,64,45,0,56,100,-244,172,76,220,113,224,34,18,140,111,128,131,226,98,49,0,120,226,98,4,-228,225,2,224,80,47,4,105,110,99,108,117,238,84,1,226,185,8,100,174,-229,45,3,160,48,0,61,225,25,2,131,250,196,15,226,169,0,64,135,224,-130,27,0,80,232,61,6,225,234,6,163,7,102,112,0,56,226,181,1,133,-117,224,70,2,0,67,96,70,224,30,17,128,31,128,228,225,47,49,0,65,-225,128,11,225,0,54,3,45,104,101,108,231,105,0,224,76,56,91,74,242,-176,0,224,79,57,224,78,7,64,62,143,239,228,163,4,128,87,177,17,227,-99,0,228,164,12,198,0,243,46,2,65,220,225,181,1,135,108,231,74,3,-195,80,106,59,207,142,128,18,78,199,160,18,96,123,98,182,225,15,18,224,-33,44,225,160,5,227,228,5,94,228,227,228,7,224,66,10,1,110,111,94,-55,228,79,3,64,195,1,56,49,64,249,240,251,0,224,243,2,224,254,3,-64,41,225,158,13,2,68,85,73,96,82,3,58,51,56,54,178,219,1,56,-48,126,219,0,90,167,129,97,143,64,162,0,56,220,36,0,58,96,179,224,-43,3,178,50,128,46,224,41,1,0,58,97,93,224,40,5,129,227,224,35,-0,0,58,97,147,224,34,3,88,38,224,119,2,65,39,224,121,0,64,46,-250,210,3,226,145,0,64,8,72,114,0,58,96,43,112,181,0,58,64,80,-128,10,91,11,65,108,128,56,176,65,66,67,0,85,65,102,129,250,192,18,-1,66,39,96,21,225,136,1,232,64,0,232,108,2,170,187,97,177,242,247,-1,93,153,157,34,162,149,3,32,95,55,53,221,176,145,17,223,51,0,64,-65,93,103,3,98,229,92,89,115,242,117,136,64,0,128,178,144,249,117,32,-0,65,96,221,73,218,192,17,65,217,0,58,98,233,209,165,126,100,107,64,-128,17,92,22,107,86,255,125,2,128,218,0,58,107,115,126,233,3,95,51,-55,48,98,20,0,58,66,29,193,59,0,55,225,59,4,74,105,179,182,2,-95,51,54,102,241,141,212,64,218,0,58,96,6,10,10,65,32,115,101,113,-117,97,108,32,58,96,33,161,163,2,95,51,54,182,9,0,52,96,72,128,-191,186,120,97,9,1,95,51,74,207,0,58,96,39,98,7,1,54,51,165,-169,192,170,64,38,242,239,2,129,137,65,237,129,145,0,58,64,49,96,58,-242,151,43,0,54,97,113,2,58,51,54,129,15,242,151,8,3,116,97,105,-108,242,151,8,0,65,96,150,211,57,124,189,0,51,64,177,64,204,128,178,-129,62,2,73,32,58,96,16,252,207,1,1,51,53,99,238,0,53,156,183,-92,207,192,56,92,207,224,11,0,68,202,96,11,0,58,96,6,247,54,5,-160,61,231,88,5,120,191,188,19,151,24,128,38,0,58,96,6,1,10,65,-163,207,140,61,92,25,148,134,0,53,163,245,247,53,16,6,67,111,110,116,-114,111,108,247,51,11,96,18,2,67,97,108,137,29,100,104,0,58,96,223,-95,92,141,2,246,237,1,64,7,230,70,1,134,83,0,95,99,68,130,38,-0,53,65,135,67,200,171,78,98,22,2,95,51,53,171,90,140,169,0,58,-64,160,130,151,119,94,96,30,227,212,3,227,95,0,227,184,1,235,158,0,-0,58,98,104,96,155,0,85,225,229,7,9,109,100,53,67,111,109,98,105,-110,101,161,235,133,103,64,143,66,104,0,90,97,61,2,95,50,54,168,71,-1,48,53,64,86,65,72,0,89,96,116,64,251,102,181,66,159,236,116,1,-194,163,236,33,2,128,236,100,93,198,230,1,95,51,97,6,97,15,0,56,-164,7,0,95,87,144,1,95,51,228,92,0,128,190,130,112,8,94,109,100,-53,65,114,114,97,121,66,92,216,94,226,251,1,0,57,76,161,64,155,1,-95,51,135,50,100,143,248,61,1,247,209,4,1,95,51,66,187,224,46,3,-169,187,192,46,1,95,49,121,94,227,51,5,0,52,167,45,0,58,96,200,-162,231,64,20,68,253,96,211,172,105,229,3,10,205,237,224,106,0,225,53,-3,192,25,232,101,5,4,67,32,95,54,52,160,67,3,95,49,55,52,129,-35,4,95,51,51,57,32,128,82,64,0,225,117,1,96,55,238,103,2,248,-191,2,64,187,255,228,1,128,45,96,96,172,205,229,135,7,226,141,0,142,-40,224,70,0,224,43,10,194,119,224,38,0,160,16,0,58,65,97,226,178,-0,0,90,151,74,64,21,0,54,163,214,0,50,67,114,68,176,225,253,0,-129,247,124,207,0,95,87,114,0,58,97,153,2,10,65,32,95,0,0,58,-96,28,128,57,0,53,100,81,91,18,1,95,51,90,120,65,173,101,156,0,-52,65,207,1,50,52,80,91,64,89,64,11,67,76,192,11,192,113,68,67,-0,48,224,11,0,65,79,64,107,131,82,2,114,101,109,64,107,186,240,2,-49,50,54,64,107,96,157,97,135,98,197,115,143,64,53,64,54,130,156,97,-49,96,131,65,157,64,147,0,58,96,39,183,192,226,21,1,70,35,97,189,-252,243,2,0,95,70,186,165,163,98,113,5,56,32,95,51,51,55,227,167,-2,31,92,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,92,34,44,51,2,57,58,49,169,33,-100,11,1,51,51,160,171,68,39,2,95,54,49,226,47,1,96,30,1,50,-49,101,72,164,99,3,95,50,49,54,160,19,193,204,253,37,0,104,97,172,-93,160,158,0,83,64,235,73,52,160,83,168,60,96,69,128,13,0,79,64,-211,0,79,235,228,2,68,66,64,29,224,21,3,2,95,50,49,97,232,1,-50,50,64,70,0,58,97,78,5,10,65,32,65,32,58,96,188,230,96,2,-101,177,3,95,51,51,54,65,165,0,51,130,84,67,120,64,16,230,96,2,-0,49,100,57,96,77,166,96,192,56,70,96,192,11,66,2,166,2,64,6,-164,67,64,10,73,21,72,108,2,95,51,51,136,79,0,51,199,126,0,85,-131,93,2,95,51,51,165,171,0,39,68,225,64,23,64,203,160,47,224,15,-8,64,65,130,82,200,145,64,23,100,41,177,224,171,186,69,93,101,5,0,-51,66,64,192,68,105,158,224,21,2,128,154,251,81,0,133,72,2,95,50,-48,96,245,0,51,161,67,130,139,2,95,53,53,65,30,130,125,2,75,32,-58,96,45,161,52,64,64,232,223,1,64,90,168,223,253,2,7,224,14,5,-192,170,236,139,1,169,9,96,188,0,58,96,6,201,40,1,50,51,107,108,-192,50,76,200,99,58,65,236,160,26,147,254,224,26,3,0,58,96,91,198,-210,130,125,64,77,130,115,221,33,201,204,1,75,50,234,170,2,234,194,15,-197,102,234,198,27,224,8,1,64,214,96,142,188,141,229,181,2,192,9,128,-44,253,16,4,0,58,96,54,105,198,1,50,49,65,102,201,85,0,58,64,-15,96,24,72,199,139,227,3,95,51,49,54,227,219,2,11,110,111,32,109,-97,116,99,104,32,97,116,32,131,196,96,32,128,149,68,166,130,211,136,219,-163,45,64,6,232,190,29,223,221,0,46,68,53,0,114,177,210,224,39,1,-2,80,97,116,64,22,0,77,64,128,2,70,97,105,232,210,4,67,81,129,-2,0,83,100,4,146,222,130,121,99,53,135,33,163,64,2,95,49,52,66,-16,100,90,195,244,72,120,96,5,77,148,0,54,227,251,0,104,213,98,128,-68,3,225,28,1,83,107,238,250,3,101,98,139,51,3,49,52,56,32,128,-15,99,20,0,54,66,245,0,49,74,82,224,24,2,161,56,224,220,1,4,-39,92,92,39,39,165,23,161,75,96,158,224,82,3,97,246,136,205,224,17,-3,132,240,231,138,3,224,151,1,0,64,160,35,168,50,224,139,0,142,191,-74,168,224,133,4,3,92,92,92,34,238,190,2,0,58,96,131,64,244,65,-24,0,58,97,234,105,156,241,176,4,70,98,0,49,74,193,250,1,2,67,-235,0,67,183,59,160,136,95,18,129,18,64,39,138,227,130,168,191,33,244,-209,2,73,149,96,176,161,144,64,59,129,144,160,200,96,62,193,205,0,51,-95,77,64,216,102,36,255,236,3,0,90,64,28,97,0,64,61,224,231,3,-0,38,240,9,1,131,181,104,141,248,23,0,200,234,136,163,118,101,225,89,-7,224,60,1,149,51,160,223,128,77,160,223,96,224,64,56,128,79,96,177,-65,32,225,163,6,128,162,224,180,1,64,194,226,92,3,78,8,208,121,244,-136,1,224,210,16,80,88,0,80,103,71,224,30,1,2,78,85,76,96,30,-96,25,0,49,224,25,3,2,83,79,72,224,25,1,0,50,224,25,4,1,-84,88,224,25,1,0,51,224,25,3,0,69,224,25,3,0,52,224,25,4,-1,79,84,224,25,1,0,53,224,25,4,1,78,81,224,25,1,0,54,224,-25,3,2,65,67,75,224,25,1,0,55,113,33,1,57,55,161,240,96,19,-145,53,0,57,69,77,224,19,0,0,57,96,19,0,49,66,146,224,20,1,-1,49,48,160,21,0,48,224,21,4,0,49,160,21,224,64,4,66,52,64,-21,0,48,194,91,128,21,0,51,160,43,0,52,224,108,4,128,43,226,134,-0,128,42,224,248,4,0,83,153,219,128,25,224,248,4,0,83,145,190,128,-25,224,248,4,2,68,76,69,224,26,2,0,55,224,26,4,0,67,137,37,-128,26,0,56,224,26,5,0,50,224,26,2,250,96,4,2,68,67,51,225,-203,2,226,0,4,2,68,67,52,224,26,2,226,1,4,1,78,65,225,127,-2,70,14,224,187,2,1,89,78,224,26,2,226,3,6,0,66,224,26,2,-225,11,4,1,67,65,224,53,3,226,5,5,0,77,224,25,2,225,12,4,-1,83,85,224,79,3,225,12,4,1,69,83,149,216,128,26,225,12,4,1,-70,83,224,25,2,225,11,4,0,71,224,25,2,72,96,224,25,1,0,82,-224,25,3,225,9,4,0,85,224,25,2,107,35,225,63,2,0,69,131,64,-198,23,224,0,21,111,11,140,152,0,58,101,112,69,54,229,30,0,77,110,-0,49,79,214,0,35,109,166,173,128,96,17,1,64,35,176,18,66,93,103,-164,0,48,76,80,66,150,198,124,74,215,237,118,10,209,56,0,51,66,238,-0,95,84,183,108,250,235,34,5,198,32,1,56,50,192,53,103,189,228,197,-1,187,113,96,68,224,23,4,104,132,224,39,7,103,58,128,112,128,21,244,-5,0,198,195,164,185,72,15,96,11,0,58,96,6,129,13,101,25,160,201,-224,154,10,224,195,0,99,214,235,190,1,192,114,108,199,237,39,0,224,36,-0,128,160,224,10,5,96,50,158,201,238,20,0,97,89,129,128,102,170,104,-18,224,74,4,0,58,96,102,5,10,65,32,99,104,114,65,131,136,200,0,-83,103,249,65,165,2,95,51,48,64,61,225,215,11,107,87,225,215,5,77,-159,96,84,71,27,141,134,0,51,78,10,225,204,2,2,60,32,64,99,20,-224,19,8,130,37,161,197,160,19,70,12,234,67,1,234,77,2,224,40,7,-66,79,224,40,12,224,102,8,70,134,224,61,7,65,231,224,102,13,108,27,-3,67,32,61,61,64,38,110,158,134,154,224,97,3,0,58,97,34,107,43,-73,49,249,225,3,226,184,5,65,171,1,53,57,240,65,0,0,54,80,15,-83,161,129,188,0,50,64,15,0,51,208,230,1,50,54,79,191,77,94,65,-130,0,53,224,41,1,2,64,95,50,107,135,97,218,64,123,136,189,4,111,-114,100,32,58,96,18,9,10,65,32,98,115,105,110,100,101,120,64,16,180,-205,0,50,66,68,0,50,84,210,128,97,2,95,50,54,72,84,96,11,233,-230,1,85,95,160,169,224,18,4,66,241,224,18,6,129,251,224,18,4,65,-30,224,18,6,224,94,10,113,220,224,18,5,109,112,224,18,5,64,247,224,-18,6,130,31,224,18,4,65,128,224,170,7,224,190,11,224,191,10,99,168,-224,19,7,224,193,10,104,182,224,19,7,224,195,10,143,109,224,19,6,224,-197,10,111,101,224,19,7,224,199,10,108,88,224,19,7,225,135,11,224,199,-10,98,168,224,19,7,224,199,10,98,247,224,19,7,224,199,10,99,93,224,-19,7,163,174,224,19,4,105,187,246,183,6,17,111,69,110,117,109,58,32,-111,117,116,32,111,102,32,114,97,110,103,186,60,162,199,64,7,106,106,1,-95,50,119,198,64,7,99,88,1,95,50,87,252,96,7,146,217,0,50,106,-34,64,7,100,239,1,95,50,81,166,96,7,133,207,0,50,88,149,96,7,-160,79,142,203,1,95,50,127,233,2,64,95,50,89,136,96,7,160,79,0,-56,160,79,89,250,96,7,160,79,90,86,96,7,160,79,0,56,160,79,0,-56,160,79,83,12,64,7,0,57,160,79,0,57,160,79,139,29,1,95,50,-134,147,2,95,50,57,160,79,0,57,132,95,228,137,6,98,69,228,157,7,-64,65,229,44,53,128,7,96,8,96,174,229,42,14,128,7,96,8,96,229,-229,40,35,128,7,96,8,96,225,224,38,8,64,255,64,29,97,7,64,8,-140,54,224,99,8,99,12,224,119,7,130,248,224,80,5,65,96,64,71,97,-104,64,8,199,7,224,38,4,99,71,0,85,138,47,128,8,129,1,66,187,-224,39,4,130,227,224,59,5,161,22,143,47,64,8,129,22,64,9,209,101,-224,169,6,64,41,224,208,7,64,160,224,19,7,131,141,224,109,5,65,55,-64,90,97,63,64,8,199,205,224,38,5,65,55,64,29,97,63,64,8,168,-123,224,98,6,132,63,224,58,5,65,33,64,49,97,41,0,85,108,75,224,-96,9,134,202,96,6,64,7,205,242,224,94,6,64,155,224,18,6,132,57,-224,75,4,65,47,0,85,108,245,96,7,129,52,224,35,6,160,246,192,245,-128,244,225,158,8,226,0,10,161,255,193,6,193,154,167,18,64,47,2,95,-50,50,94,89,198,221,99,52,0,39,177,41,223,228,231,126,3,103,96,128,-46,224,12,5,142,206,2,95,50,51,73,219,160,78,99,193,224,25,12,164,-195,1,51,48,224,64,0,2,95,51,48,231,102,0,0,58,96,6,138,9,-79,115,0,39,137,219,250,37,0,107,104,243,20,2,218,116,72,11,160,217,-145,232,143,165,96,11,192,42,160,134,164,123,92,55,224,6,6,0,58,64,-136,224,124,5,224,121,35,224,108,5,129,92,224,108,10,0,58,64,250,232,-99,0,70,37,72,247,74,57,1,50,57,131,103,0,95,72,185,184,157,230,-28,5,17,73,110,116,46,115,117,99,99,58,32,111,118,101,114,102,108,111,-119,134,26,224,69,5,134,125,87,54,224,69,17,8,112,114,101,100,58,32,-117,110,100,224,70,3,1,73,32,64,2,66,26,79,86,160,143,226,20,3,-183,234,225,216,0,122,237,128,112,192,19,1,51,48,74,244,128,58,64,7,-0,56,192,59,130,178,66,162,224,70,0,128,64,160,51,65,24,139,89,129,-193,0,83,105,215,224,119,1,96,201,0,83,194,230,98,158,65,162,203,205,-242,53,1,209,166,96,65,178,90,210,67,128,84,113,140,167,20,129,190,128,-27,236,25,1,145,250,161,138,129,97,248,16,2,129,91,224,243,0,204,181,-128,163,224,41,1,250,73,0,64,222,224,215,16,96,113,224,215,67,129,242,-224,215,68,133,145,224,215,7,97,189,252,58,0,128,209,96,43,128,176,224,-123,5,160,189,96,199,160,177,162,177,64,90,155,199,226,247,1,249,201,0,-192,9,0,58,98,73,67,53,5,56,49,32,95,56,51,67,206,4,56,32,-95,56,56,132,211,100,233,154,182,98,142,192,40,224,36,9,0,58,98,154,-118,219,64,20,85,197,100,173,128,17,0,49,192,17,132,133,146,252,128,17,-132,26,146,244,128,17,215,35,69,158,128,17,130,191,146,228,128,17,129,249,-146,220,96,17,73,11,128,17,0,55,192,17,128,216,146,210,128,17,128,193,-146,208,128,17,224,179,0,70,159,128,18,224,180,1,192,181,73,143,160,18,-192,182,73,170,160,18,192,183,0,56,224,183,0,71,77,128,18,224,184,0,-71,187,128,18,224,185,0,71,216,96,18,74,22,160,18,192,187,70,26,160,-18,192,188,74,76,160,18,192,189,74,103,128,18,72,135,128,18,224,189,0,-72,163,128,18,225,115,1,192,189,66,76,160,18,192,189,74,211,160,18,192,-189,66,241,160,18,192,189,75,9,160,18,192,189,75,36,160,18,192,189,75,-63,160,18,192,189,66,144,160,18,192,189,70,177,177,169,87,42,101,240,151,-39,2,50,54,52,167,91,197,219,78,37,64,44,9,115,117,98,116,114,97,-99,116,32,58,64,35,224,62,14,1,54,48,224,61,8,128,239,123,112,126,-112,0,58,96,25,254,133,8,96,68,151,130,0,56,64,4,89,193,110,239,-15,10,65,32,34,94,95,94,44,94,41,94,66,94,57,94,59,96,5,18,-53,94,54,94,57,94,58,94,57,94,52,94,57,94,57,94,73,94,38,96,-7,0,66,96,19,30,57,94,89,94,32,94,53,94,57,94,54,94,60,94,-51,94,60,94,89,94,33,94,53,94,58,94,54,94,58,124,32,96,75,22,-57,94,67,94,59,94,61,94,57,94,60,94,61,94,50,94,55,94,58,94,-45,94,61,96,13,8,58,94,40,94,40,94,60,94,33,96,75,31,60,94,-40,94,50,94,56,94,66,94,40,94,57,94,86,94,32,94,58,94,70,94,-32,94,87,94,33,94,58,94,71,94,2,33,94,32,224,3,102,224,33,59,-224,3,53,224,9,1,0,66,224,15,6,64,5,0,66,96,5,2,33,94,-67,224,19,6,224,43,3,224,79,13,224,69,9,224,15,1,2,33,94,50,-160,67,0,67,96,9,0,34,96,25,224,5,3,224,3,21,224,33,25,192,-37,192,77,224,129,3,224,3,99,0,70,96,5,128,11,64,5,128,23,193,-77,224,3,2,1,124,68,97,21,28,90,94,33,94,81,94,49,94,67,94,-60,94,75,94,49,94,77,94,60,94,68,94,49,94,70,94,60,94,49,96,-3,6,80,94,60,124,111,94,35,224,57,0,64,21,64,7,4,48,94,48,-94,49,97,83,8,57,94,32,94,67,94,48,94,60,96,25,67,73,2,32,-94,48,160,3,64,41,0,80,96,11,3,72,94,32,124,193,29,225,211,3,-224,3,35,64,179,64,9,0,58,160,15,96,75,5,124,50,94,32,124,47,-224,75,40,224,3,13,8,61,94,68,94,35,94,37,94,37,224,73,56,224,-3,37,224,29,19,224,67,31,224,3,145,1,48,124,65,79,130,49,4,69,-94,57,124,40,98,53,0,52,96,17,18,61,94,61,94,59,94,48,124,44,-94,35,94,52,94,35,94,57,94,35,224,5,4,6,71,94,48,94,90,94,-50,98,97,67,189,69,87,6,74,94,48,94,69,94,45,229,179,0,0,59,-96,5,64,73,0,74,96,53,64,25,14,57,94,95,94,50,94,49,94,73,-94,50,94,84,94,35,101,231,10,67,94,57,94,50,94,50,94,35,124,98,-96,73,4,50,94,70,94,35,101,187,6,69,94,35,94,49,94,49,96,117,-4,61,94,67,94,35,96,39,64,51,2,66,94,50,96,89,8,50,94,77,-94,57,94,48,94,45,64,63,1,94,93,99,59,0,35,64,193,3,124,88,-94,50,96,119,64,33,0,48,64,51,5,124,32,94,50,94,72,160,81,0,-61,96,139,0,49,96,235,6,35,94,59,94,59,94,85,96,205,64,29,128,-35,0,66,96,5,66,119,64,35,0,78,96,101,64,83,64,23,64,17,64,-15,16,74,94,50,94,68,94,48,94,87,94,50,94,60,94,69,94,50,96,-137,0,45,96,19,3,72,94,35,124,70,103,2,49,94,87,96,205,6,95,-94,35,94,36,124,53,96,167,0,36,96,151,8,66,94,36,94,71,94,35,-94,67,96,15,2,36,94,36,160,249,65,27,129,103,199,7,2,49,94,78,-160,55,4,36,94,48,94,71,96,103,0,48,97,11,64,7,64,185,2,48,-94,70,96,5,64,85,129,145,128,217,128,101,64,215,64,15,128,63,128,7,-64,27,65,197,64,29,192,75,65,85,64,121,64,35,64,121,64,21,65,27,-2,69,94,40,98,15,65,157,128,29,64,37,64,75,64,243,224,63,1,224,-139,7,224,5,7,64,55,64,101,64,125,64,247,128,71,64,23,65,85,64,-185,2,35,94,70,224,191,0,65,13,128,135,64,37,128,155,65,17,224,125,-1,0,72,224,181,0,224,121,11,0,68,225,5,6,129,203,192,59,129,3,-129,71,0,78,160,51,224,251,3,66,191,64,127,0,50,98,133,64,55,225,-125,27,224,119,7,129,217,225,127,13,64,93,128,141,225,129,17,66,225,65,-125,128,245,64,33,65,113,65,41,128,245,65,41,64,13,193,101,128,9,192,-17,192,39,64,7,0,75,161,169,128,123,64,5,128,29,64,145,129,145,128,-213,0,69,96,35,163,51,105,35,0,69,97,251,69,131,64,131,128,43,129,-5,128,131,0,86,96,5,0,79,225,109,4,130,213,129,215,64,165,224,237,-1,192,53,128,173,225,119,9,64,39,2,57,94,70,98,113,194,243,0,57,-224,111,10,67,37,225,107,9,0,68,96,117,193,171,128,235,128,123,64,11,-64,219,226,143,1,224,117,3,128,17,2,36,94,75,225,147,0,0,36,226,-93,3,99,201,64,23,227,79,3,225,59,3,68,141,65,93,64,45,0,36,-96,189,225,201,7,0,72,96,209,132,35,192,159,0,81,161,155,68,63,194,-205,128,207,66,79,131,15,128,85,65,173,130,133,66,129,128,201,128,183,128,-217,0,57,64,185,1,124,47,96,115,64,201,68,71,64,57,67,187,68,131,-68,103,235,85,0,0,124,64,123,226,49,1,129,67,128,131,193,89,128,69,-69,9,128,143,128,35,69,47,64,89,224,123,1,66,127,0,95,96,55,2,-66,94,61,101,37,75,129,64,11,64,251,66,57,64,41,0,73,96,251,69,-195,128,3,75,237,64,3,64,185,97,217,0,124,64,103,64,175,0,77,97,-27,67,169,134,107,64,119,69,197,64,33,128,251,64,63,64,87,134,163,0,-68,107,247,64,115,96,213,1,124,42,97,127,129,161,65,37,133,107,129,111,-129,191,64,143,2,69,94,57,97,23,192,21,131,69,193,221,129,63,65,113,-134,17,0,76,226,135,0,128,211,129,239,0,36,163,31,64,13,2,61,94,-61,167,75,73,13,137,101,64,139,71,79,137,141,1,66,124,129,221,197,153,-196,47,224,17,0,98,97,224,13,1,70,171,224,45,18,102,15,2,48,124,-56,224,51,4,195,87,64,201,4,72,94,57,94,83,98,133,131,153,0,73,-98,123,2,48,124,85,167,241,0,69,170,43,4,52,94,68,124,107,98,189,-10,57,94,80,94,50,94,41,94,89,94,50,97,155,3,66,94,48,124,70,-223,71,39,2,66,94,39,97,167,67,71,130,179,65,15,4,72,94,48,94,-82,162,229,66,129,0,57,96,17,64,31,64,17,67,73,65,57,195,181,160,-19,1,124,51,224,49,0,66,73,66,203,129,91,65,229,135,147,142,21,64,-37,195,59,130,237,68,137,64,185,72,163,72,51,64,133,0,45,168,67,64,-219,0,34,66,233,1,124,52,160,167,66,57,3,35,94,35,124,75,79,65,-175,3,68,94,48,124,65,243,69,73,0,94,160,151,199,123,132,213,229,29,-1,65,227,128,29,66,101,65,67,199,139,72,97,195,15,4,74,94,48,124,-43,162,183,65,53,195,147,97,117,0,124,74,181,68,169,226,125,1,64,55,-66,167,64,161,128,245,131,75,130,163,131,11,128,123,0,73,160,45,224,219,-0,224,7,0,0,70,97,33,65,3,64,31,67,45,5,37,94,79,94,35,-124,131,139,72,97,0,46,162,173,67,67,197,17,192,93,64,187,192,201,64,-73,66,21,67,227,0,72,169,15,128,171,64,227,195,65,195,61,131,29,99,-61,96,243,128,91,198,13,128,31,128,99,64,135,0,57,99,207,65,219,64,-209,192,69,65,71,67,175,131,55,130,23,193,83,2,69,94,49,162,65,138,-155,65,173,0,42,162,171,76,149,0,71,102,3,129,179,2,57,94,76,225,-61,0,66,251,65,51,196,177,128,105,129,237,8,43,94,33,124,62,94,49,-94,76,77,31,0,124,76,147,4,36,94,49,124,63,237,53,2,224,3,255,-224,3,17,193,143,224,3,181,64,197,2,71,94,32,228,245,0,0,69,162,-89,81,235,64,23,192,7,224,31,11,207,51,192,3,192,43,0,77,160,43,-128,15,0,34,224,7,8,79,21,0,48,241,53,0,0,34,114,125,2,66,-94,60,102,13,224,23,3,64,19,0,67,160,75,192,21,66,231,0,60,96,-73,0,68,111,145,0,60,163,7,224,81,7,64,23,8,74,94,41,94,68,-94,45,94,69,179,57,6,55,94,56,94,53,94,55,224,7,0,67,57,2,-42,94,43,96,35,0,41,102,23,64,25,69,63,2,51,94,51,99,245,0,-58,101,239,0,74,179,127,4,51,94,73,94,57,160,83,68,119,2,45,94,-40,173,39,74,135,77,219,64,45,77,193,224,13,1,69,233,69,183,70,183,-0,59,107,77,67,161,2,67,94,37,99,245,4,37,94,75,94,35,96,21,-71,177,80,149,64,5,64,11,242,89,1,128,7,192,23,0,58,96,247,71,-229,64,15,192,3,64,245,64,51,145,55,67,249,64,49,64,17,65,227,71,-121,80,129,65,75,64,65,128,25,8,61,94,79,94,40,124,34,94,39,160,-51,0,39,104,137,137,171,64,47,0,68,96,43,0,58,96,147,128,51,192,-5,0,70,96,5,0,94,160,31,192,25,128,17,2,66,94,75,116,41,0,-61,232,201,0,0,83,160,39,64,53,4,53,94,54,124,80,96,15,8,93,-94,61,94,88,94,58,124,39,103,125,1,58,124,64,49,0,85,97,179,10,-61,94,84,94,48,124,59,94,40,124,77,96,19,4,40,94,65,124,54,96,-51,69,139,10,58,124,53,94,61,94,71,94,58,124,110,96,19,2,65,124,-119,224,107,2,224,3,11,4,93,94,40,124,43,105,15,129,145,0,94,160,-7,224,3,7,0,79,64,77,5,92,95,94,61,94,65,225,189,0,224,3,-30,1,124,62,224,47,2,0,95,160,11,6,66,94,65,94,58,124,47,96,-207,129,37,64,231,76,183,66,49,64,103,6,48,124,104,94,61,124,47,242,-13,2,193,243,227,163,3,243,11,1,64,5,67,135,79,165,243,175,111,224,-3,73,0,33,162,205,128,13,70,197,64,7,74,43,67,137,86,135,2,57,-124,37,163,223,64,21,100,15,1,124,55,168,203,71,27,77,145,0,35,104,-81,73,101,138,17,224,5,33,80,125,196,29,64,3,67,247,64,7,128,5,-68,21,132,61,64,5,128,23,196,73,226,7,5,71,191,67,251,64,41,137,-133,64,49,2,53,94,76,177,233,215,203,224,3,3,1,52,124,64,205,0,-89,98,11,2,88,94,61,106,25,6,65,124,85,94,61,94,89,106,157,0,-61,184,9,6,61,94,49,94,50,94,39,226,123,11,96,91,224,87,8,96,-5,64,27,2,72,94,39,232,175,0,0,52,117,41,128,139,0,39,96,81,-128,153,74,251,137,187,72,33,69,59,66,97,3,50,94,52,124,73,187,74,-77,64,13,136,119,75,91,137,233,132,43,79,127,0,61,82,185,1,124,37,-96,109,64,23,2,79,94,50,100,11,138,153,67,233,0,71,100,91,2,78,-94,40,98,247,2,73,94,40,99,7,64,15,2,66,124,63,78,205,2,124,-51,124,64,47,0,50,128,13,5,94,65,124,35,124,125,176,65,4,49,94,-72,124,118,141,243,100,7,4,72,94,48,124,39,233,23,2,68,113,64,37,-65,39,64,121,73,55,72,239,0,83,102,147,226,155,53,224,3,19,73,87,-69,193,73,181,66,65,0,49,224,73,48,179,199,171,131,0,39,173,75,137,-213,4,86,94,60,94,72,118,195,150,197,224,3,13,246,153,41,224,3,69,-79,69,224,17,3,224,35,13,224,195,3,88,213,64,9,224,185,35,70,249,-192,5,224,3,19,248,61,3,64,5,66,217,128,7,128,3,224,47,5,0,-84,104,63,129,189,66,71,2,49,94,33,100,25,211,87,139,71,68,93,235,-243,1,71,19,139,181,147,255,146,5,77,105,77,195,67,251,148,63,1,36,-124,67,57,0,79,160,55,64,19,204,99,76,177,0,81,171,159,66,185,149,-221,64,105,64,29,0,91,108,35,132,151,64,121,78,1,142,9,64,65,0,-92,242,191,0,236,213,3,236,151,5,76,125,68,121,69,33,64,81,71,213,-64,77,141,251,85,201,131,41,112,189,111,97,144,17,192,225,128,7,67,207,-129,5,77,33,64,23,65,75,64,55,141,85,131,113,77,117,144,229,173,189,-96,245,144,51,140,123,64,75,174,117,160,25,0,87,177,103,131,195,79,77,-224,121,1,64,17,129,137,64,19,78,149,146,27,224,7,5,229,235,6,112,-83,74,47,64,219,194,109,6,67,94,48,124,79,94,33,110,255,128,211,224,-5,1,0,57,96,9,192,207,65,143,2,50,124,87,101,143,0,50,101,135,-65,119,64,63,64,15,65,61,2,46,94,70,100,147,2,46,94,46,192,7,-1,94,71,160,9,2,47,124,49,96,9,4,47,94,66,124,109,128,163,1,-124,105,101,19,64,157,0,33,96,79,74,245,70,191,129,227,2,50,94,58,-176,3,146,63,128,3,224,5,0,112,121,4,80,94,60,94,79,65,129,3,-124,106,94,50,101,217,4,79,94,61,124,63,160,95,87,47,71,1,69,125,-148,195,94,47,69,125,83,213,222,55,64,215,64,17,134,149,74,215,230,67,-11,224,3,3,65,125,64,7,144,71,139,7,129,235,134,85,192,3,139,31,-0,52,105,43,66,91,152,211,138,61,64,161,0,65,161,157,87,247,66,69,-254,207,58,160,59,192,165,65,69,2,49,124,44,162,43,80,185,131,145,226,-43,9,140,35,128,31,87,181,0,58,126,251,64,9,65,63,0,67,169,159,-66,105,0,66,121,93,137,163,65,83,144,191,145,205,193,161,114,97,112,99,-0,50,66,47,1,124,122,184,235,64,221,66,49,0,44,178,93,4,72,94,-61,124,52,103,127,1,40,94,74,245,95,105,65,161,76,3,145,59,2,61,-124,46,96,47,68,77,4,65,94,65,94,48,195,219,98,117,76,23,4,35,-94,90,94,40,97,85,90,29,64,73,66,247,0,83,104,13,67,147,0,39,-103,151,0,37,96,129,67,99,0,48,177,135,144,103,64,55,64,37,67,247,-2,39,124,41,103,57,6,32,124,39,94,33,124,77,160,195,210,33,73,117,-64,187,0,35,101,63,135,97,0,71,164,207,132,117,0,74,109,125,0,78,-96,5,0,70,253,45,0,75,177,67,51,0,78,96,5,66,235,141,135,64,-195,64,59,66,249,2,66,124,54,163,175,71,207,65,101,64,147,68,1,71,-195,2,48,124,41,109,69,3,72,94,49,124,64,191,193,175,67,5,81,79,-129,117,65,45,128,23,150,227,69,97,0,40,96,11,65,173,86,85,65,255,-69,97,4,72,94,40,124,47,225,177,4,64,85,2,68,94,40,96,125,141,-169,64,63,65,215,64,25,2,57,124,63,170,79,65,45,65,163,64,51,2,-79,94,40,99,101,77,227,132,199,137,29,138,151,134,21,211,191,65,179,130,-97,147,23,69,55,0,40,99,155,74,61,64,7,64,33,64,89,197,187,73,-7,129,5,0,61,101,235,64,89,131,57,64,55,116,45,99,223,64,169,64,-15,201,159,64,243,64,215,64,133,64,11,84,81,154,21,118,229,65,7,3,-124,79,94,48,85,81,3,124,54,94,48,94,105,1,94,76,96,7,70,211,-102,173,162,23,134,141,243,67,3,64,209,69,183,85,7,146,143,92,223,2,-49,94,85,111,181,0,48,109,195,0,65,64,93,1,94,94,65,27,1,124,-41,96,147,64,185,157,23,129,53,97,19,64,123,96,99,64,237,74,3,129,-153,64,197,70,201,66,197,75,45,77,239,64,193,129,79,75,229,2,48,94,-84,96,209,0,40,105,189,203,209,134,83,84,27,0,78,164,219,65,43,85,-195,64,183,230,97,1,128,45,135,21,68,21,216,143,198,205,68,51,0,45,-97,43,134,85,68,151,156,185,219,77,65,11,2,66,94,35,97,35,148,37,-71,133,193,31,70,149,64,75,131,25,70,83,128,83,128,119,102,189,120,103,-64,119,84,59,135,147,136,15,64,135,134,113,138,159,64,53,133,89,64,199,-67,97,65,9,221,71,244,53,1,64,5,202,15,160,233,107,41,246,247,7,-132,147,69,17,101,243,168,21,64,73,64,193,66,47,192,223,199,101,251,175,-33,129,91,128,141,154,187,251,175,1,153,233,64,47,64,91,85,91,128,53,-192,31,84,137,194,77,64,229,154,155,192,119,132,185,64,9,64,71,156,77,-192,95,64,217,64,5,225,5,1,136,57,65,113,136,203,66,83,64,155,2,-92,94,48,98,29,192,237,64,49,129,63,131,167,213,89,192,57,137,217,0,-93,186,21,192,121,192,221,129,31,128,243,129,167,195,41,0,65,66,161,97,-89,194,89,64,169,224,51,5,0,86,97,235,98,143,102,27,192,97,245,237,-1,128,39,137,243,129,17,129,151,73,173,0,82,173,99,128,37,64,47,192,-153,161,215,224,45,0,0,83,106,37,2,48,94,90,161,75,224,49,1,130,-241,65,111,67,37,64,47,134,119,77,235,65,219,2,65,124,56,165,89,226,-167,1,99,29,1,124,99,102,101,4,32,94,95,94,33,96,55,68,197,68,-85,226,39,1,132,131,226,31,1,91,25,87,149,226,15,1,193,9,66,1,-137,211,64,121,67,31,87,31,64,185,160,77,0,124,67,5,225,71,3,133,-3,192,235,64,59,0,90,96,103,2,73,94,35,173,239,64,89,196,187,65,-197,65,151,234,183,1,67,183,2,45,94,50,183,1,225,99,1,65,253,69,-3,74,241,131,231,4,57,94,65,124,53,186,73,144,61,193,85,122,137,0,-124,128,185,152,129,225,127,1,130,69,128,43,0,82,230,69,0,0,57,248,-247,0,0,85,162,189,64,55,226,17,2,0,124,234,167,1,137,217,66,241,-64,85,64,63,198,85,131,39,139,103,224,141,1,135,9,129,105,71,253,221,-193,128,103,194,75,228,189,1,0,66,64,213,250,119,2,139,73,222,93,64,-211,106,113,121,247,64,29,66,35,64,133,224,75,1,66,131,101,83,0,124,-77,21,136,129,2,84,94,40,115,207,2,67,94,59,104,197,0,76,167,125,-10,89,94,50,124,101,94,48,124,110,94,39,184,189,66,205,1,65,124,66,-253,1,84,124,90,207,0,96,163,173,64,49,0,72,99,9,0,79,122,149,-64,215,69,201,65,77,0,95,98,193,100,53,5,124,70,94,50,124,53,66,-157,97,83,85,25,197,9,64,147,0,77,98,61,0,68,123,217,64,211,154,-169,133,153,154,61,197,3,129,61,250,143,1,157,223,131,139,65,103,221,25,-76,43,67,21,193,213,103,63,166,131,64,145,65,73,0,67,104,75,2,66,-94,49,98,131,147,121,129,35,0,65,96,143,195,47,0,86,105,165,2,57,-124,100,188,27,136,7,71,9,66,17,135,13,0,76,121,99,77,145,64,119,-79,243,65,49,65,125,66,131,4,50,124,47,124,117,97,117,98,3,81,147,-0,124,64,141,65,255,64,65,4,50,124,69,124,102,96,73,158,107,64,5,-64,73,73,95,70,139,65,171,0,50,69,11,168,149,64,13,64,87,65,143,-154,123,74,207,0,82,105,221,76,79,64,225,66,15,138,169,194,69,128,57,-158,163,65,37,3,45,94,94,124,68,103,2,65,124,111,190,177,64,245,4,-67,124,51,94,61,97,227,65,207,64,49,0,86,142,45,4,124,115,94,61,-124,75,85,2,65,124,117,129,89,212,241,0,124,79,33,197,153,75,5,68,-55,2,71,94,45,101,25,137,195,0,35,114,43,3,67,94,35,124,75,157,-86,5,0,65,107,39,4,35,94,61,124,121,167,41,68,143,160,7,1,124,-86,178,113,0,88,86,35,96,191,76,59,76,47,64,7,138,139,0,81,160,-13,64,21,234,179,1,190,135,224,13,0,152,89,88,187,152,111,234,203,1,-74,221,224,63,1,64,37,128,43,128,45,203,9,224,29,7,80,163,64,93,-137,191,192,33,224,157,3,224,7,23,0,91,176,183,10,88,94,32,94,58,-94,88,94,33,94,58,117,251,224,15,55,177,15,1,124,49,67,55,86,237,-1,124,54,101,119,1,61,124,66,143,67,231,1,35,94,87,119,129,147,67,-41,66,87,67,67,72,99,2,35,94,72,106,1,0,73,113,43,0,83,117,-187,68,167,2,33,94,65,100,49,133,51,0,80,162,19,221,195,64,5,172,-157,4,124,61,94,49,124,65,15,2,35,124,111,108,249,202,227,73,215,153,-75,195,209,75,27,84,29,131,201,2,35,94,80,254,83,0,132,15,66,191,-2,59,94,67,96,143,68,67,0,49,224,25,0,85,65,192,53,68,247,228,-35,1,2,67,124,95,229,141,0,137,55,237,209,3,1,65,124,136,239,108,-67,64,147,67,127,3,124,33,94,32,93,33,96,163,64,99,228,115,4,1,-94,70,96,151,0,58,114,5,75,215,0,59,74,221,99,25,78,5,148,227,-1,65,124,77,217,128,111,135,175,128,117,195,165,195,119,192,145,134,213,64,-5,129,7,224,3,1,131,217,224,61,7,224,3,9,224,31,1,128,83,224,-241,3,224,101,1,128,117,0,80,238,189,0,64,13,129,1,0,80,85,145,-171,243,0,66,68,69,121,65,68,57,0,99,182,165,0,78,175,35,128,7,-96,5,1,124,36,165,75,0,76,96,243,4,32,94,61,124,55,108,251,102,-51,192,65,121,197,144,183,0,61,100,159,87,253,0,65,118,239,2,65,124,-122,98,115,4,60,94,69,124,87,160,45,70,113,66,33,175,49,1,124,118,-160,135,86,95,65,35,0,75,160,39,65,105,224,13,0,1,124,55,118,115,-64,225,147,149,90,101,64,15,68,95,64,181,224,53,1,0,61,107,77,1,-66,124,90,165,64,215,66,251,64,33,207,161,64,65,66,183,64,81,64,181,-192,247,90,167,136,49,128,23,2,65,94,82,97,3,0,91,165,37,0,72,-161,193,4,66,124,77,124,93,96,9,66,121,2,50,124,32,97,19,193,223,-0,65,101,91,161,201,2,124,44,92,96,35,166,13,0,58,80,27,229,215,-0,2,68,124,107,96,7,0,83,114,161,0,68,135,33,1,124,97,96,41,-0,38,104,99,129,197,64,97,96,111,5,124,43,124,56,124,80,108,229,74,-233,2,95,94,45,96,93,69,199,4,35,94,67,124,124,109,171,0,47,68,-3,1,124,123,96,9,64,131,224,15,2,31,34,32,58,50,53,57,32,64,-10,65,32,95,54,32,95,49,54,51,32,64,95,54,32,89,32,66,32,66,-32,83,32,85,64,18,5,52,32,64,64,64,64,64,16,1,90,32,224,7,-1,12,83,39,32,83,32,64,66,32,67,39,32,83,39,64,8,14,83,32,-64,95,49,52,52,32,95,54,57,32,64,35,49,160,52,0,67,64,23,224,-38,0,26,66,32,64,64,67,32,67,32,95,54,52,32,95,49,55,51,32,-64,64,95,49,55,52,32,95,50,49,64,120,7,51,51,57,32,35,49,50,-56,96,59,128,53,64,110,10,95,49,50,51,32,64,67,32,95,57,56,160,-41,224,53,19,3,85,32,35,48,224,64,0,31,66,32,80,32,95,51,51,-55,32,102,114,111,109,85,84,70,56,32,34,92,34,46,47,108,105,98,47,-68,97,116,97,47,23,67,104,97,114,47,85,110,105,99,111,100,101,46,104,-115,92,34,44,50,48,50,58,56,34,128,64,64,227,96,230,96,73,128,13,-64,135,224,189,28,128,187,2,64,67,39,64,251,6,95,49,57,49,32,95,-57,64,50,160,24,96,204,96,16,3,67,32,95,53,192,11,192,63,3,95,-50,49,53,64,186,4,50,53,49,32,64,160,55,224,28,0,129,78,64,70,-96,151,3,95,50,53,50,96,162,3,95,50,53,53,225,39,0,160,78,128,-140,225,19,2,64,71,64,11,10,95,50,53,55,32,64,64,58,50,53,56,-129,254,2,50,53,54,66,12,0,55,96,13,7,98,115,117,110,112,97,99,-107,64,17,0,54,96,17,64,110,2,95,50,53,64,232,3,50,53,52,32,-64,56,0,53,96,24,2,66,32,89,65,249,65,162,0,58,96,25,64,44,-65,41,0,67,129,44,4,55,53,32,95,55,64,183,96,118,97,144,130,83,-129,222,128,57,128,189,129,229,225,42,1,192,190,0,64,128,49,0,58,96,-33,96,139,64,115,64,61,0,80,128,6,160,68,64,33,0,50,128,205,1,-49,50,129,63,64,23,2,95,50,51,64,234,7,95,50,49,50,32,95,50,-51,64,139,192,11,0,57,96,11,1,52,49,161,105,64,11,64,23,192,11,-65,219,160,11,1,53,48,224,11,0,0,54,64,87,65,151,1,50,50,65,-120,0,58,96,22,1,10,65,162,224,99,9,129,245,66,57,129,8,64,2,-64,160,162,81,226,87,0,66,13,225,201,1,192,37,64,16,128,52,64,77,-96,5,99,90,97,37,1,52,53,64,7,2,85,32,65,161,53,1,52,54,-128,15,0,75,128,178,64,233,96,0,0,67,64,27,98,47,64,145,1,95,-55,64,234,224,19,1,7,64,64,83,32,73,32,64,75,64,192,162,145,224,-134,0,1,83,39,65,87,194,102,99,228,129,149,66,72,64,102,96,181,98,-250,224,121,0,224,137,16,163,22,160,149,128,80,130,162,96,16,224,63,24,-0,64,128,233,96,17,0,57,98,3,0,48,97,108,64,38,2,75,52,32,-128,192,0,58,96,27,224,21,2,160,20,130,218,2,85,32,90,96,1,0,-75,132,201,0,58,96,90,160,44,64,13,0,54,224,37,14,130,223,225,175,-0,97,19,3,95,49,50,52,65,249,0,52,98,238,65,147,128,72,0,50,-224,57,0,0,58,96,27,130,165,161,208,6,95,50,52,48,32,64,65,96,-49,130,159,224,27,7,128,136,130,70,96,77,224,196,2,128,239,5,117,114,-101,109,32,58,98,177,64,13,3,113,117,111,116,64,14,195,188,1,50,52,-101,106,65,168,66,181,1,49,54,130,241,1,50,53,64,27,97,73,229,63,-22,129,108,3,95,51,54,48,229,43,2,19,87,111,114,100,56,46,115,117,-99,99,58,32,111,118,101,114,102,108,111,119,133,27,224,108,12,64,94,224,-108,0,99,198,224,109,42,8,112,114,101,100,58,32,117,110,100,224,110,3,-99,115,0,49,67,115,68,2,96,14,0,56,227,129,1,66,214,1,50,57,-67,207,224,245,8,131,103,128,5,64,148,1,53,57,197,186,162,139,2,95,-50,51,67,217,192,57,224,194,1,224,31,13,224,89,1,64,25,0,49,67,-67,192,123,0,54,98,31,224,20,0,128,54,96,20,0,58,96,62,225,167,-6,1,56,54,96,58,64,80,0,51,131,133,129,160,0,49,228,250,2,225,-32,10,225,141,19,160,82,64,195,224,82,0,97,134,224,83,23,225,115,13,-101,236,65,102,65,95,0,51,101,72,224,174,2,225,89,7,0,55,97,137,-193,51,99,36,224,137,2,224,25,1,0,53,224,71,6,64,19,0,51,192,-72,227,108,0,128,187,96,83,128,77,160,58,65,75,0,54,195,151,165,98,-135,154,128,133,72,124,68,219,232,150,0,101,68,68,173,134,33,131,120,0,-89,160,170,224,66,0,64,13,168,159,136,249,128,7,96,131,129,53,0,56,-96,172,128,28,192,76,64,32,136,210,1,95,56,135,162,3,64,67,32,79,-99,205,128,11,160,53,160,252,64,177,224,165,2,224,42,1,167,16,0,58,-96,225,224,218,16,128,136,224,218,67,129,44,224,218,69,96,165,224,218,11,-168,25,192,46,106,46,64,44,128,179,224,125,5,160,192,96,202,160,180,162,-222,64,91,73,85,128,150,164,72,234,164,0,232,40,0,66,81,131,111,0,-54,104,250,2,95,56,56,137,2,0,58,98,117,5,10,65,32,75,32,95,-72,192,0,58,67,175,229,117,3,102,108,0,58,67,189,229,139,10,0,50,-230,101,1,64,13,229,124,0,164,157,169,88,64,9,105,29,64,35,131,248,-2,80,32,58,64,37,128,60,102,8,0,50,201,61,224,1,3,103,253,64,-0,224,20,11,224,17,8,224,14,5,224,11,2,192,8,102,177,128,184,129,-125,3,95,49,50,54,105,22,101,138,170,194,3,54,32,95,51,70,100,232,-215,7,64,54,129,70,0,73,64,189,129,54,0,83,98,156,65,128,129,163,-162,134,161,157,138,101,128,33,65,181,224,22,4,64,149,0,95,74,194,235,-144,19,10,73,110,116,101,103,101,114,95,84,121,112,171,144,3,53,52,58,-49,171,143,96,65,1,50,49,97,109,134,102,1,39,66,66,105,226,153,3,-104,73,224,34,1,224,26,3,224,23,2,194,49,2,95,50,49,138,14,1,-50,48,97,148,130,11,98,199,0,57,66,53,74,12,0,49,204,207,0,58,-96,37,65,70,1,56,52,102,195,1,95,57,96,53,64,32,128,53,0,56,-64,90,160,20,130,28,2,75,32,58,96,112,162,3,0,49,130,3,202,41,-137,67,168,225,96,184,96,14,162,109,0,49,130,34,226,153,6,64,34,64,-131,70,201,106,197,99,159,160,10,133,47,64,10,0,49,64,134,3,64,95,-49,57,96,194,64,34,0,73,97,181,231,181,7,231,154,7,140,39,231,177,-14,224,45,14,96,185,97,15,129,38,64,31,162,219,128,24,64,19,130,63,-96,243,140,165,1,49,55,97,141,64,66,227,46,0,64,44,98,167,1,55,-55,64,4,0,56,98,165,65,137,1,49,56,66,161,0,49,103,244,0,56,-96,22,0,56,70,66,96,61,2,95,49,56,104,216,96,73,128,38,0,57,-130,229,96,12,141,61,2,95,49,57,224,110,0,1,95,49,137,9,131,174,-0,48,71,168,192,11,0,51,224,56,8,132,136,162,205,77,249,236,204,1,-224,27,5,104,91,96,28,1,95,56,165,88,66,99,128,41,2,95,50,48,-102,196,64,18,224,81,51,65,179,224,81,6,66,115,1,50,48,224,220,1,-2,50,48,55,224,11,2,0,56,66,254,4,95,50,48,57,32,160,67,0,-75,160,8,0,75,66,7,64,8,0,58,96,43,5,10,65,32,90,32,85,-66,185,0,48,130,206,6,112,111,112,99,111,117,110,74,101,64,68,202,180,-0,66,96,109,71,196,1,55,57,173,166,0,58,64,113,97,182,64,24,0,-58,64,139,226,183,3,139,86,224,1,9,171,104,224,0,2,0,58,96,88,-64,72,232,163,5,9,97,114,105,116,104,109,101,116,105,99,232,247,4,0,-58,97,1,231,47,0,68,241,103,29,228,150,1,192,5,3,95,50,48,49,-160,7,0,50,227,96,0,164,63,198,93,66,142,134,217,1,49,57,66,140,-97,139,227,160,3,226,241,3,128,66,0,58,66,47,128,234,224,228,15,224,-1,3,224,240,9,64,0,0,58,96,147,230,24,1,64,169,192,211,65,108,-1,49,57,98,255,64,147,0,58,66,171,161,90,0,51,224,108,42,0,58,-96,75,224,92,4,64,244,132,141,2,95,49,57,101,24,96,252,0,58,67,-33,160,105,225,193,17,224,103,14,0,58,96,73,224,195,5,74,15,128,195,-67,135,224,89,0,224,92,14,224,84,7,0,58,96,58,237,105,1,224,1,-21,225,103,12,0,58,96,131,197,56,69,51,101,45,133,39,133,38,131,240,-229,38,7,227,156,1,101,4,135,227,68,232,0,58,96,47,103,19,143,29,-98,68,64,232,226,40,1,0,58,64,88,160,184,238,33,1,96,45,5,10,-65,32,42,32,58,96,126,129,42,1,95,49,64,149,130,89,226,122,12,101,-131,0,58,68,220,160,49,176,68,130,195,228,75,9,234,61,2,64,154,70,-204,224,29,3,1,95,49,169,80,225,165,0,100,74,227,214,0,64,106,226,-4,0,137,5,224,2,2,193,85,64,51,160,223,224,30,3,225,133,3,0,-58,96,104,224,178,62,234,31,1,128,178,65,111,224,178,4,226,40,0,0,-51,224,141,3,226,23,6,0,58,96,56,224,183,7,226,66,14,0,58,96,-117,226,178,0,100,242,64,154,64,18,4,120,111,114,32,58,102,150,2,10,-65,32,128,11,129,208,4,97,110,100,32,58,102,187,117,91,78,176,77,157,-2,49,54,54,66,57,64,212,233,253,8,224,1,21,234,27,0,224,0,6,-224,57,25,192,1,224,65,14,224,56,25,128,1,224,62,13,224,55,25,64,-1,224,59,12,224,54,25,224,56,13,224,53,44,224,50,41,224,47,38,224,-44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,26,17,-224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,204,190,224,-0,6,0,58,74,28,229,83,1,224,1,23,227,202,4,224,68,3,0,54,-96,68,0,73,67,165,228,51,0,64,45,139,103,101,125,99,186,0,53,171,-43,1,95,49,128,10,105,143,160,11,118,63,128,11,0,55,102,24,160,11,-69,170,192,11,107,147,74,235,173,111,138,218,132,69,64,6,5,10,65,32,-117,62,61,64,134,132,82,1,117,62,64,11,132,81,1,117,60,96,24,132,-82,3,117,60,32,58,96,114,64,11,2,99,109,112,64,13,132,71,100,95,-96,110,101,210,192,157,64,11,0,58,96,187,3,10,65,32,47,64,73,64,-18,160,244,0,54,128,244,0,75,64,10,206,29,1,54,50,64,13,128,147,-1,98,115,152,0,64,20,160,29,0,48,64,13,128,152,7,98,115,108,101,-110,103,116,104,64,17,232,147,0,101,30,142,58,74,186,64,21,0,82,141,-242,64,16,170,68,152,17,0,49,88,86,88,209,0,55,96,27,170,63,96,-182,85,157,1,95,49,120,248,0,49,87,206,1,95,49,114,136,0,49,88,-91,1,95,49,76,40,129,77,96,65,129,77,96,10,0,58,96,6,225,77,-0,184,158,97,77,184,150,129,77,184,68,97,77,184,46,0,105,129,77,183,-199,90,245,118,107,0,49,182,107,65,35,182,96,112,161,1,58,49,182,89,-129,119,86,40,1,95,49,86,70,0,58,96,188,193,108,182,88,0,61,96,-11,226,98,1,64,37,128,143,121,58,111,73,145,208,1,95,49,82,219,0,-90,64,7,110,222,1,95,49,79,151,64,6,65,84,1,58,49,182,88,120,-13,97,30,86,13,0,58,96,29,96,22,71,52,192,73,3,50,51,32,35,-109,142,160,10,177,196,195,116,224,32,2,143,177,122,170,184,0,82,67,219,-124,0,80,64,103,224,65,2,224,64,5,64,200,64,0,96,58,163,88,182,-198,139,145,128,163,128,244,129,76,71,215,86,182,71,210,0,58,96,29,200,-97,64,14,232,112,0,99,134,0,58,97,8,167,40,164,18,0,58,97,36,-194,112,128,36,209,75,0,95,81,99,96,96,66,55,112,216,107,60,82,14,-96,40,129,119,11,94,109,100,53,83,116,114,105,110,103,32,58,96,27,186,-223,2,66,32,95,98,99,82,18,85,83,0,39,96,15,219,176,122,74,0,-49,141,116,108,32,0,58,96,102,128,234,160,56,0,48,73,177,1,90,32,-224,31,0,129,10,4,110,101,119,67,65,128,112,2,76,101,110,64,115,129,-10,224,213,4,178,91,2,65,32,58,99,48,240,37,0,2,115,101,113,142,-16,96,8,101,20,0,58,99,54,144,82,81,209,192,75,224,1,1,229,137,-78,0,58,91,86,193,123,229,92,2,0,58,121,21,3,10,65,32,79,64,-144,129,80,3,95,49,48,54,83,101,0,49,78,61,110,109,96,8,3,95,-49,49,48,66,60,101,21,0,49,112,169,192,11,67,201,192,11,87,166,160,-11,81,116,1,95,49,81,154,0,58,96,18,65,192,3,112,111,107,101,86,-185,64,110,129,99,4,94,112,101,101,107,192,18,162,105,65,183,75,72,145,-227,0,49,81,124,0,58,64,90,160,193,241,85,2,96,34,224,50,4,101,-170,192,50,226,132,1,1,95,49,81,127,67,97,68,246,1,95,49,81,163,-64,33,129,132,2,116,111,73,79,48,96,21,96,14,1,80,116,74,18,177,-178,244,76,5,96,98,245,17,3,174,185,97,116,67,197,64,93,66,136,189,-39,69,134,1,64,95,76,196,108,163,0,58,65,59,193,138,229,119,2,177,-65,237,122,1,79,206,65,197,128,64,88,100,66,170,142,226,0,58,65,140,-160,68,234,217,0,175,255,1,95,49,80,71,76,108,0,35,101,191,176,4,-154,120,64,27,193,18,226,78,8,226,117,73,176,81,203,246,64,32,1,95,-49,90,94,97,13,1,95,49,79,65,163,176,224,22,1,163,182,81,221,99,-179,163,186,125,248,194,182,176,111,64,78,79,202,0,95,70,65,0,58,96,-40,66,82,3,102,114,101,101,64,235,173,230,101,166,224,96,6,0,95,78,-205,0,95,79,86,140,148,96,34,192,114,97,187,97,131,165,136,192,23,0,-58,96,177,252,7,4,64,171,133,119,96,254,0,39,93,8,224,49,0,0,-73,161,9,225,0,3,193,225,225,72,1,224,119,2,64,115,178,79,96,130,-186,91,255,85,5,133,129,176,111,205,48,96,156,130,20,0,89,109,164,65,-133,2,66,32,90,134,30,113,80,2,83,32,95,79,224,65,113,130,80,224,-89,7,96,88,176,106,145,26,132,39,0,58,176,84,68,201,0,58,176,35,-96,184,71,255,130,164,0,53,192,75,226,169,7,176,53,242,25,6,90,178,-4,102,105,110,101,100,114,15,240,36,0,233,249,4,0,58,239,248,3,99,-181,72,195,99,14,0,95,72,235,0,83,238,137,11,65,113,238,87,2,144,-17,85,225,0,48,224,37,3,224,33,0,128,249,240,37,1,0,95,79,246,-0,58,176,31,0,66,188,172,112,52,240,15,0,129,153,89,6,1,56,50,-176,45,0,80,96,7,97,114,225,113,0,112,170,64,120,97,11,143,6,96,-212,181,41,85,6,99,164,96,92,193,184,244,70,0,136,90,247,135,4,194,-68,249,72,0,0,55,192,191,65,5,0,48,249,85,0,97,2,217,55,97,-210,176,121,4,105,110,118,32,58,176,26,4,115,104,114,32,58,176,3,72,-232,175,233,0,97,128,23,129,143,4,115,104,108,32,58,175,111,2,43,32,-58,175,76,2,45,32,58,175,67,2,73,32,58,175,64,230,86,7,175,75,-130,155,100,157,239,80,0,2,53,32,95,75,10,0,95,75,27,0,95,75,-45,0,95,75,62,0,95,75,80,0,95,113,132,74,35,149,59,74,34,96,-9,0,58,175,118,131,166,98,189,131,179,96,37,0,53,131,103,69,91,172,-96,224,29,1,224,49,1,224,39,5,128,237,227,59,2,172,74,74,129,172,-64,2,62,32,58,171,229,74,125,171,227,2,60,32,58,171,225,138,122,171,-225,106,79,108,107,75,216,0,58,171,235,74,76,171,232,65,98,171,207,2,-80,32,58,171,205,195,255,164,58,194,34,224,20,11,224,17,8,224,14,5,-224,11,2,192,8,229,132,0,172,47,179,129,163,208,172,57,4,110,101,103,-32,58,172,55,2,42,32,58,172,49,2,45,32,58,172,45,2,43,32,58,-172,37,224,148,68,0,58,172,100,199,88,64,17,225,225,0,73,145,68,90,-66,26,75,255,96,12,165,226,1,64,58,204,113,3,53,53,32,58,172,54,-2,73,32,58,172,51,64,41,66,76,76,41,0,58,172,59,64,29,128,224,-64,9,168,134,7,109,97,108,108,111,99,32,58,172,56,224,158,2,0,58,-172,58,2,85,32,58,172,57,224,198,14,0,58,172,74,64,19,0,95,76,-37,1,64,95,108,73,172,72,103,221,107,253,172,77,6,114,97,105,115,101,-32,58,172,79,7,65,46,114,101,97,100,32,58,172,80,13,73,79,46,103,-101,116,65,114,103,82,101,102,32,58,172,46,4,95,51,50,32,95,108,47,-75,108,229,59,1,5,115,116,100,101,114,114,101,56,172,65,2,73,79,46,-128,20,1,32,58,171,196,96,59,75,148,224,59,9,2,111,117,116,128,59,-205,35,67,160,0,58,171,207,128,73,4,111,117,116,32,58,171,210,4,95,-51,54,32,58,171,205,2,73,32,58,171,195,128,95,122,78,0,52,224,95,-6,1,105,110,96,94,171,219,3,75,52,32,58,171,189,128,91,3,105,110,-32,58,171,186,129,89,0,95,75,19,102,69,135,247,231,167,0,0,95,75,-109,194,70,231,254,3,97,132,0,95,107,236,64,104,205,69,225,195,1,171,-190,203,222,2,50,56,32,101,26,162,72,75,176,1,64,58,171,202,93,34,-171,192,0,46,162,20,254,30,0,2,54,32,58,171,175,13,73,79,46,112,-101,114,102,111,114,109,73,79,32,58,171,185,0,75,107,3,231,232,1,0,-58,171,99,0,95,64,192,66,134,96,123,104,157,88,2,225,4,0,3,62,-62,32,58,203,107,64,66,69,8,110,137,0,51,232,241,0,90,229,156,18,-72,26,188,28,160,9,0,58,221,209,156,139,72,217,163,37,75,33,0,95,-74,209,90,26,224,35,2,96,32,118,153,192,32,0,95,101,85,221,21,0,-55,86,206,224,47,12,96,150,116,254,65,163,0,58,171,108,113,122,96,9,-71,177,168,123,129,19,153,11,253,0,4,138,156,128,253,234,221,1,0,49,-171,58,192,12,96,199,171,10,129,27,96,61,142,76,235,48,2,143,80,194,-228,97,243,109,235,129,219,71,192,129,81,73,13,96,36,64,199,64,193,69,-156,69,155,128,232,2,75,32,58,128,203,143,216,200,210,0,58,164,81,9,-79,46,114,101,116,117,114,110,32,58,128,201,97,181,2,61,32,58,128,197,-2,80,32,58,226,192,3,228,30,0,229,0,32,0,58,226,178,1,228,89,-11,231,83,0,0,50,143,39,64,200,1,95,57,114,143,224,0,255,224,0,-255,224,0,255,224,0,170,1,32,125,-};-unsigned char *combexpr = data;-int combexprlen = 43930;-#include "mhsffi.h"-static struct ffi_entry table[] = {-{ 0,0 }-};-struct ffi_entry *xffi_table = table;+#include "mhsffi.h"+static const unsigned char data[] = {+122,76,90,49,56,176,0,0,31,118,56,46,51,10,57,56,51,10,65,32,+95,48,32,95,50,52,32,64,95,50,53,32,95,51,53,32,64,95,51,55,+32,1,64,64,224,22,4,1,52,48,224,22,13,0,50,224,22,0,1,49,+49,160,23,7,51,54,54,32,64,67,39,32,224,17,0,5,64,66,32,95,+49,50,160,11,17,83,32,83,32,95,51,55,48,32,95,49,52,57,32,95,+50,50,51,64,60,2,51,55,49,64,21,26,51,32,73,32,64,64,102,114,+111,109,85,84,70,56,32,34,45,45,99,112,112,34,32,64,64,64,64,64,+24,3,95,51,56,56,64,12,64,79,224,109,0,3,57,48,32,64,64,110,+0,67,96,116,128,8,3,64,83,39,32,224,2,0,192,176,64,0,4,67,+39,66,32,66,96,36,4,39,32,95,51,57,64,148,0,50,96,25,0,67,+160,20,64,138,3,48,32,64,67,64,141,1,49,32,224,138,4,6,118,101,+114,115,105,111,110,128,142,96,114,224,89,0,5,66,32,95,52,49,57,96,+54,1,49,51,64,149,64,5,7,79,32,35,51,50,32,64,75,64,184,1,+52,50,64,165,96,8,0,54,65,53,65,49,192,165,160,141,224,165,62,2,+104,101,108,161,49,224,162,13,65,59,2,51,52,32,224,50,1,6,85,115,+97,103,101,58,32,96,51,224,191,4,224,34,1,21,32,91,102,105,108,101,+32,46,46,46,93,32,91,32,45,68,115,121,109,32,92,124,128,8,3,61,+118,97,108,96,12,12,73,112,97,116,104,32,93,42,32,32,91,45,79,64,+47,2,93,94,42,64,84,224,75,6,15,94,41,94,41,91,45,45,110,111,+109,97,99,114,111,93,32,96,11,3,108,105,110,101,96,10,64,8,5,112,+114,97,103,109,97,96,14,224,10,2,3,116,101,120,116,224,81,20,4,115,+116,114,105,112,96,42,96,9,3,45,101,111,108,96,13,5,104,97,115,104,+101,115,128,93,4,97,121,111,117,116,96,10,3,117,110,108,105,192,79,224,+74,6,0,32,98,117,3,32,115,116,100,64,7,8,45,111,112,116,105,111,+110,115,32,96,54,7,105,110,99,108,117,100,101,61,64,223,4,110,97,109,+101,93,193,106,225,218,7,1,66,32,97,171,0,83,194,148,0,83,162,164,+224,12,0,226,178,4,1,83,39,97,161,97,243,224,8,5,0,39,65,177,+0,66,226,29,2,0,66,98,210,226,20,1,2,95,52,50,67,19,226,68,+7,96,52,97,240,128,10,225,243,6,6,110,107,110,111,119,110,32,128,219,+129,251,64,178,67,180,97,255,1,52,50,128,57,224,55,6,10,44,32,102,+111,114,32,118,97,108,105,100,160,59,4,115,32,116,114,121,226,60,5,226,+55,2,130,142,129,101,225,36,3,4,51,48,32,35,49,225,57,0,96,121,+96,235,224,232,2,226,250,5,64,13,5,50,52,53,32,95,56,64,54,5,+95,49,48,51,32,64,96,65,228,141,0,64,235,224,121,1,18,65,116,32,+109,111,115,116,32,111,110,101,32,111,117,116,112,117,116,32,98,194,20,40,+45,79,41,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,+96,157,224,153,2,131,107,64,0,163,160,161,68,0,83,64,31,96,182,97,+109,0,66,161,154,2,51,57,51,193,117,2,95,57,53,64,7,2,95,50,+49,68,223,0,53,100,172,161,232,128,26,2,95,49,53,130,31,64,15,0,+53,64,42,2,57,53,54,128,6,101,68,0,57,128,51,1,95,57,96,231,+101,24,133,19,0,64,229,46,3,128,0,9,58,57,56,50,32,64,10,65,+32,89,66,47,1,32,66,96,165,130,117,98,53,64,5,226,88,0,4,66,+32,95,53,48,96,91,164,113,133,36,224,9,8,160,65,66,126,10,66,32,+95,56,57,55,32,64,95,55,49,96,155,128,6,1,64,66,96,111,1,80,+32,68,215,192,119,196,200,224,131,0,2,32,61,61,65,160,128,196,64,125,+0,85,160,25,2,95,49,50,64,246,128,0,224,82,43,129,156,224,82,68,+129,82,224,82,24,2,95,57,55,161,124,230,93,3,99,203,161,98,97,115,+97,118,224,39,9,64,116,224,39,4,128,16,224,17,0,66,94,224,16,6,+225,135,0,0,83,66,56,1,52,52,161,254,1,35,52,224,155,1,224,44,+2,192,63,224,64,7,0,66,134,150,224,62,1,0,55,67,218,128,0,195,+118,128,104,226,215,4,164,120,66,19,0,80,96,26,225,20,5,224,101,2,+128,103,224,101,7,224,164,2,224,43,0,64,91,4,83,32,95,57,56,72,+76,1,53,48,163,9,224,133,8,224,82,1,97,141,1,39,32,64,128,224,+127,7,224,52,1,97,72,224,51,3,160,26,96,53,68,209,64,54,130,13,+1,95,49,71,46,97,151,64,222,227,42,1,225,96,6,229,195,1,65,84,+225,72,15,160,38,98,92,96,101,192,17,128,130,224,175,5,96,40,192,129,+160,135,160,6,0,58,99,237,3,10,65,32,83,96,145,96,153,3,32,95,+57,55,137,46,96,131,64,162,224,173,16,96,101,96,38,224,167,13,0,54,+169,52,98,116,164,150,65,47,2,95,57,55,64,58,136,109,3,80,32,64,+85,99,45,96,73,132,232,2,95,51,54,64,32,4,79,32,35,52,57,136,+200,5,64,64,64,85,32,65,64,8,3,95,52,52,52,99,41,224,103,0,+2,64,35,54,229,211,1,224,176,30,2,66,32,90,128,181,224,179,7,0,+56,96,35,96,172,2,95,57,55,69,34,96,0,195,191,226,107,11,0,83,+64,195,226,242,14,99,184,192,252,96,249,68,216,1,56,57,197,82,230,57,+1,2,47,92,92,231,211,1,96,85,73,101,0,56,70,102,64,40,234,169,+17,200,26,128,61,165,232,224,114,4,0,56,96,62,3,57,32,35,49,138,+12,170,213,4,67,32,95,55,57,235,15,5,68,107,67,165,0,58,99,42,+5,10,65,32,79,32,80,230,221,2,233,62,0,105,13,1,57,54,69,19,+224,33,9,73,75,160,32,64,83,224,32,7,233,106,1,160,36,66,110,224,+36,7,224,32,4,130,11,224,32,5,73,150,160,30,66,86,224,30,7,105,+138,160,31,65,15,224,31,12,73,170,160,35,65,232,224,35,7,137,192,160,+32,65,21,224,201,8,105,214,128,32,75,22,224,32,8,105,236,160,31,66,+162,225,43,9,2,119,97,114,107,216,2,95,57,55,65,76,162,234,128,0,+0,58,97,139,1,10,65,99,36,134,45,1,85,32,64,21,0,56,224,21,+2,64,53,128,21,0,55,96,21,64,19,1,52,32,65,223,0,58,98,190,+224,40,0,64,127,128,40,0,53,160,40,3,95,49,52,54,67,93,1,95,+49,104,92,0,58,99,248,100,13,224,1,8,4,39,32,95,57,53,139,196,+0,51,64,37,141,72,0,57,67,119,162,6,224,26,14,198,226,224,27,11,+140,116,224,19,5,131,125,224,18,4,99,131,64,129,0,50,76,213,224,27,+9,224,17,5,197,65,224,112,11,137,22,224,19,5,102,147,224,18,4,97,+201,224,18,6,100,95,224,84,12,97,182,65,59,0,51,225,126,0,0,48,+193,126,137,37,3,80,32,35,57,192,17,133,110,3,80,32,35,56,192,17,+131,102,3,80,32,35,55,160,17,64,145,128,17,193,198,64,183,128,17,0,+53,192,17,225,235,0,0,54,192,17,129,234,3,80,32,35,51,192,17,193,+230,74,86,128,17,129,222,64,162,192,17,224,180,0,192,179,65,203,79,153,+1,54,57,136,187,198,177,168,95,2,67,32,60,68,213,161,145,224,25,9,+137,120,224,26,13,98,10,138,213,231,1,0,160,26,172,57,0,85,70,10,+69,69,233,34,1,106,213,98,167,1,64,85,194,168,129,224,0,85,64,61,+104,50,224,49,5,111,214,128,49,128,37,133,143,234,197,8,224,138,14,162,+203,224,93,15,64,30,224,93,27,224,65,17,64,193,224,65,4,134,133,104,+241,104,53,1,52,52,133,182,1,54,48,73,207,0,80,97,152,98,183,224,+194,9,225,105,13,98,210,224,221,13,98,218,225,104,12,64,25,225,104,16,+224,44,6,64,96,224,43,11,224,116,13,168,4,224,70,9,64,24,224,114,+31,108,8,224,114,11,225,3,14,194,108,224,25,9,135,178,224,168,11,225,+146,1,224,124,6,100,101,224,168,30,64,94,225,27,33,226,248,16,226,247,+20,224,43,6,226,241,2,225,27,6,192,115,227,136,5,225,0,16,226,251,+1,224,97,6,226,245,2,224,141,24,226,223,2,224,141,5,224,44,11,226,+117,15,130,238,73,130,105,218,0,58,96,6,102,202,0,89,67,37,106,68,+69,40,64,74,173,85,96,20,233,168,1,203,246,64,27,96,46,0,49,139,+35,96,9,0,52,234,115,0,224,16,3,106,94,224,122,0,96,117,133,157,+204,70,224,1,3,107,240,160,0,224,29,20,224,26,17,224,23,14,224,20,+11,224,17,8,224,14,5,224,11,2,192,8,109,59,128,0,0,58,103,186,+101,231,71,236,1,54,55,232,131,2,29,92,34,99,112,112,104,115,115,114,+99,47,109,97,108,99,111,108,109,45,119,97,108,108,97,99,101,45,117,110,+105,84,121,1,101,47,96,33,6,45,49,46,50,48,46,57,128,12,9,46,+104,115,92,34,44,56,48,58,49,138,116,102,58,74,110,2,10,65,32,65,+88,0,75,66,190,0,58,112,90,96,118,138,148,0,90,204,3,0,58,112,+123,96,43,0,90,224,43,0,134,174,238,8,2,66,152,245,202,1,193,158,+129,231,142,161,224,29,1,172,248,2,57,51,51,225,217,1,66,100,98,219,+242,158,2,1,95,57,114,101,2,54,54,56,150,89,142,95,1,57,53,143,+220,1,64,80,64,171,235,104,14,3,115,116,100,105,149,131,2,95,57,53,+67,114,101,155,1,95,55,134,188,0,58,113,101,71,57,2,55,49,51,150,+204,0,58,96,38,96,211,65,146,2,95,57,53,78,125,1,57,53,66,208,+131,118,1,95,55,113,25,64,208,246,87,1,1,55,48,242,79,3,15,85,+84,70,45,56,47,47,82,79,85,78,68,84,82,73,80,172,34,97,28,243,+119,4,87,21,96,204,0,52,144,52,64,228,139,201,64,220,1,10,65,65,+149,0,50,96,148,131,73,161,65,0,57,77,96,2,64,95,54,72,190,128,+49,0,58,96,167,226,245,0,1,95,57,99,11,238,246,2,0,95,96,111,+177,185,128,199,193,130,192,15,128,215,134,255,239,220,3,0,95,102,188,0,+95,142,157,0,58,96,123,96,104,1,95,52,64,103,65,143,132,151,0,83,+111,68,96,124,99,153,1,95,57,135,47,96,9,96,108,96,9,96,232,0,+58,96,160,65,121,2,57,52,51,66,2,0,54,64,195,64,27,128,19,2,+53,32,58,96,61,224,33,2,0,56,96,33,130,112,192,19,0,55,96,19,+129,195,96,247,64,146,65,198,243,116,6,64,125,160,200,96,159,106,4,88,+141,226,155,0,96,27,128,25,160,234,0,58,64,99,97,116,169,106,101,36,+69,85,0,58,96,58,20,10,65,32,73,79,46,115,101,116,109,97,115,107,+105,110,103,115,116,97,116,101,64,182,129,170,224,138,0,83,75,64,90,0,+51,129,216,65,48,96,84,110,42,74,73,101,79,66,247,192,15,96,131,97,+18,64,6,178,77,128,255,64,68,66,22,2,50,32,58,96,17,130,34,96,+25,129,59,0,75,67,113,0,58,96,60,128,160,0,103,224,160,8,64,148,+96,160,1,49,55,131,79,0,58,99,95,76,67,98,8,227,163,6,2,95,+57,48,72,211,66,118,107,202,1,56,57,64,206,1,56,57,66,20,0,58,+99,187,128,57,228,1,13,131,170,118,89,228,254,0,249,222,1,194,146,242,+68,0,163,117,1,56,57,144,246,129,1,99,242,147,3,101,38,235,210,0,+1,56,56,136,49,199,16,236,111,1,1,57,49,79,62,0,57,96,65,65,+255,96,20,117,103,0,55,140,154,130,23,0,55,86,36,0,57,134,192,205,+50,0,56,111,236,96,58,128,70,2,64,95,56,77,188,64,6,243,11,0,+0,58,97,11,162,28,0,65,137,237,0,75,89,195,73,146,100,201,0,58,+96,86,164,72,70,248,160,133,64,142,1,54,32,128,139,0,57,153,231,65,+112,91,4,100,111,86,192,135,97,0,57,131,119,0,57,119,177,96,8,99,+232,65,14,96,120,149,200,229,46,0,0,79,99,115,146,35,133,75,129,206,+0,83,164,172,161,35,241,95,8,180,208,166,131,64,45,192,46,97,151,241,+26,5,208,139,199,186,146,181,224,119,0,2,64,64,82,64,10,161,37,162,+78,160,127,168,206,224,122,10,224,39,25,165,244,132,205,64,40,102,56,0,+54,179,72,224,144,31,224,180,28,130,118,0,58,97,108,167,6,64,37,226,+99,1,98,102,98,138,244,21,20,0,57,132,93,129,72,225,70,1,236,14,+3,230,48,1,10,98,101,103,105,110,123,99,111,100,101,125,134,43,160,164,+162,3,244,142,4,243,43,2,203,39,225,168,10,224,126,9,242,149,25,2,+101,110,100,224,131,3,224,133,7,226,137,0,229,51,0,97,71,1,95,57,+195,202,96,0,166,98,225,204,17,144,120,160,153,224,184,9,133,189,128,30,+128,96,212,231,1,95,52,70,227,128,250,70,162,71,54,1,51,54,71,182,+99,209,160,147,0,57,96,147,0,53,67,94,0,54,101,66,84,123,128,114,+2,95,57,50,128,16,192,200,224,100,2,96,57,121,114,85,153,99,168,224,+241,3,249,40,0,128,114,0,52,103,94,225,30,1,132,168,128,44,225,52,+14,0,58,96,8,133,187,135,211,64,53,3,10,65,32,90,160,1,88,77,+96,38,0,54,96,22,116,235,224,4,3,96,6,170,33,0,58,96,229,224,+37,11,0,90,66,216,160,34,133,212,3,75,32,75,51,96,110,133,169,107,+140,193,152,203,133,226,194,7,81,4,100,132,64,30,0,82,160,47,214,183,+71,199,251,143,0,128,59,129,244,100,59,168,80,224,2,0,128,20,224,21,+14,164,161,224,2,0,224,43,0,224,15,2,134,51,162,72,64,3,224,19,+0,193,19,224,16,2,248,215,0,130,13,224,154,11,236,102,0,192,83,228,+240,2,200,196,0,75,207,191,98,82,1,51,54,252,213,3,235,124,40,22,+76,97,110,103,117,97,103,101,47,80,114,101,112,114,111,99,101,115,115,111,+114,47,85,84,101,139,146,4,52,53,58,53,52,191,83,176,88,128,5,2,+95,57,50,255,175,4,6,112,114,111,103,114,97,109,96,40,224,21,1,5,+99,111,109,109,101,110,116,177,128,178,165,39,73,245,229,30,3,165,56,164,+14,102,104,192,49,225,75,3,161,72,248,146,3,106,18,67,166,0,48,115,+66,73,6,237,243,2,225,121,5,161,118,161,115,225,103,4,234,38,3,161,+97,97,101,224,177,41,224,178,54,192,61,226,45,46,162,194,128,158,96,30,+67,149,227,166,0,226,47,89,0,56,226,47,30,226,25,3,226,69,13,184,+84,226,52,104,69,1,104,165,129,61,199,137,161,133,228,105,1,224,69,20,+0,58,96,142,139,76,129,156,96,61,160,5,231,111,8,225,146,3,1,92,+34,160,254,250,119,3,255,1,6,1,49,51,225,198,3,3,76,105,110,101,+161,114,237,86,0,128,35,3,64,95,49,54,110,61,135,6,224,59,10,225,+171,1,192,50,224,34,8,0,32,89,96,5,32,98,101,102,111,114,160,102,+64,244,64,42,224,35,6,2,46,94,42,193,185,225,119,0,97,131,224,10,+8,224,99,8,5,73,110,32,102,105,108,224,197,0,238,29,3,96,105,224,+249,14,2,32,97,116,128,157,224,253,136,96,0,225,173,161,0,58,99,158,+98,175,64,1,0,80,73,126,67,3,195,7,168,123,98,247,224,15,2,99,+114,132,161,224,193,10,232,176,4,224,14,0,64,67,0,58,108,94,207,25,+3,54,32,95,55,67,70,80,49,227,113,0,81,157,64,25,0,54,78,87,+2,95,57,48,231,213,5,75,96,104,21,186,75,81,52,2,95,57,49,105,+243,0,49,110,157,173,17,109,177,236,202,3,237,75,31,96,173,4,80,32,+95,56,56,126,63,234,150,3,219,84,0,58,110,60,242,162,1,178,123,96,+24,242,187,0,64,22,224,24,3,137,89,96,24,64,2,97,28,0,58,96,+179,128,22,0,51,169,115,160,49,64,27,201,79,64,1,0,89,193,129,64,+1,240,214,0,238,181,0,141,108,3,95,53,48,55,254,230,0,64,46,230,+22,0,230,68,3,230,44,1,198,47,224,88,0,141,185,224,35,1,224,2,+4,225,136,1,233,13,1,192,89,192,28,224,73,0,160,166,95,210,223,100,+226,136,2,7,95,95,70,73,76,69,95,95,227,56,3,224,87,61,2,76,+73,78,224,87,21,224,204,5,224,87,32,2,68,65,84,224,87,51,102,171,+224,87,11,2,84,73,77,224,87,6,192,137,96,2,114,247,160,69,128,10,+237,233,2,81,156,95,94,160,34,71,12,0,48,232,143,1,225,193,10,224,+159,2,225,103,3,224,106,2,224,185,12,224,23,1,224,151,11,224,85,0,+224,14,3,208,4,196,75,224,30,0,230,12,0,224,173,6,224,118,2,235,+63,6,224,18,2,128,56,64,200,241,157,0,64,3,224,24,3,230,55,0,+232,63,1,99,242,152,19,192,5,148,5,225,34,1,0,79,128,149,64,48,+73,55,192,189,3,95,55,54,55,97,181,0,53,67,103,103,177,207,248,104,+162,255,101,2,224,173,3,224,175,1,224,22,65,225,172,13,160,25,97,15,+97,80,144,189,64,22,225,95,5,224,89,5,121,65,160,0,226,198,3,128,+85,192,35,96,85,224,59,4,226,64,2,224,20,1,226,254,0,129,65,161,+45,126,206,1,95,49,96,144,68,168,64,8,2,95,55,56,207,173,224,212,+3,185,91,104,240,192,117,128,90,243,179,3,96,15,2,56,48,53,192,16,+230,63,7,230,48,8,224,101,0,226,48,6,226,54,3,224,235,2,226,56,+1,234,121,5,226,60,16,227,96,4,98,64,224,56,1,111,18,129,45,1,+95,55,116,150,226,43,7,226,254,7,103,39,249,81,53,235,164,13,0,67,+64,34,8,47,77,97,99,114,111,80,97,115,185,113,5,49,53,50,58,50,+50,196,117,225,108,6,2,95,54,52,84,13,96,9,230,98,2,2,95,57,+48,86,63,1,48,53,228,192,3,9,92,34,37,72,58,37,77,58,37,83,+202,190,2,95,57,48,180,146,224,230,9,224,104,53,6,100,32,37,98,32,+37,89,224,104,31,120,149,64,18,64,113,232,157,1,1,95,57,212,48,224,+38,14,2,50,50,48,64,43,98,169,1,95,57,127,102,96,110,255,53,4,+224,114,8,227,161,2,97,252,96,232,64,30,0,79,245,128,2,232,198,0,+160,2,96,19,226,70,3,231,163,7,160,2,224,39,12,226,193,0,224,120,+9,224,124,15,224,181,8,224,141,3,131,236,234,153,0,224,194,17,224,97,+36,173,86,65,53,104,217,138,52,160,231,128,10,224,75,0,64,142,1,95,+51,68,41,100,49,173,93,2,95,49,57,125,191,64,9,1,55,54,209,230,+2,95,57,49,64,88,245,253,2,71,18,1,95,57,149,191,225,49,0,1,+95,56,90,166,129,27,1,95,55,73,210,145,68,64,0,0,58,106,61,105,+97,248,95,4,1,95,52,121,23,96,150,248,22,1,170,251,169,99,96,61,+0,51,235,57,4,0,75,71,141,0,54,227,192,2,75,108,6,98,114,101,+97,107,115,44,76,175,227,207,68,6,72,97,115,104,68,101,102,75,206,99,+208,3,50,53,58,54,131,22,224,134,126,107,199,121,249,98,2,64,7,0,+58,97,178,202,237,64,14,140,122,107,69,65,204,0,58,99,154,90,7,228,+33,0,0,57,65,108,225,135,3,98,42,0,56,143,127,4,50,55,32,95,+50,101,239,2,35,49,48,90,17,97,150,68,21,90,103,1,32,58,96,40,+123,154,1,48,54,64,13,139,130,3,94,71,69,84,73,117,3,77,73,76,+76,96,36,0,54,128,36,241,34,12,11,99,111,109,112,97,116,47,84,105,+109,101,67,96,10,128,231,3,54,58,50,49,141,147,224,49,1,6,100,101,+102,97,117,108,116,64,42,5,76,111,99,97,108,101,64,30,0,58,100,198,+149,98,230,99,0,228,142,3,67,63,75,232,99,64,0,58,68,249,162,83,+138,139,199,91,108,247,163,121,223,6,228,19,4,224,30,1,128,16,94,189,+0,50,224,40,1,227,181,1,234,134,0,228,208,3,2,79,32,35,91,117,+96,132,224,51,2,224,126,6,224,106,1,224,9,8,0,39,140,160,224,23,+1,99,143,128,137,203,88,197,110,240,218,1,224,5,0,245,228,3,227,239,+7,229,173,0,224,195,3,229,37,10,234,171,1,192,38,235,149,0,64,18,+1,85,32,132,138,128,32,228,230,0,200,25,160,180,249,22,1,97,19,0,+49,237,77,2,228,247,1,0,49,134,28,225,142,0,197,238,0,55,249,177,+1,224,53,0,193,143,229,241,3,224,198,0,225,11,51,224,70,1,128,189,+161,17,230,39,8,225,25,4,224,52,5,225,31,16,192,38,225,37,30,0,+52,225,37,3,224,128,4,191,182,169,19,224,205,12,250,241,0,225,53,1,+224,163,3,226,236,2,224,219,12,64,2,224,29,2,234,78,1,193,113,231,+81,0,224,83,1,238,229,1,224,20,2,236,117,8,226,76,0,192,201,96,+9,192,17,180,12,1,95,56,153,233,64,0,129,78,224,118,1,225,120,7,+173,185,106,86,160,2,173,197,225,73,0,231,73,2,224,80,26,234,165,1,+192,78,226,190,19,129,60,224,199,1,101,65,181,23,224,25,0,224,27,0,+180,226,1,57,55,180,226,231,133,13,224,69,4,224,70,18,245,41,0,224,+70,27,0,75,225,242,3,233,118,4,158,132,130,48,160,6,135,206,224,50,+2,64,16,64,128,160,79,227,150,2,92,178,82,5,0,73,168,4,227,25,+1,227,10,15,168,172,96,195,251,100,2,128,113,64,5,0,58,109,113,232,+66,42,96,70,0,58,104,244,70,123,1,55,52,82,115,64,197,96,212,0,+67,76,79,198,17,135,36,130,134,151,85,96,2,237,27,3,240,19,3,134,+55,162,56,2,64,95,56,93,117,1,95,56,108,131,2,95,56,57,96,156,+1,56,57,179,207,236,245,1,128,233,2,83,32,85,82,237,242,242,8,99,+29,160,4,230,197,1,64,180,128,102,128,16,93,208,64,190,231,18,1,8,+35,105,110,99,108,117,100,101,32,203,179,64,102,224,44,15,1,92,34,212,+152,224,125,0,161,51,244,231,4,0,35,116,231,0,49,192,82,224,142,2,+83,75,224,78,11,96,82,0,56,98,126,115,222,225,54,1,94,129,0,49,+84,40,0,56,66,143,99,201,3,66,32,95,50,93,168,1,56,57,194,118,+254,154,15,2,92,92,47,160,95,161,87,65,172,244,221,6,130,121,161,176,+128,94,0,66,66,69,130,28,78,29,1,51,55,133,5,128,42,0,58,64,+118,98,17,6,51,56,50,32,75,32,85,228,154,0,228,149,5,224,11,2,+2,95,56,57,195,43,0,58,96,200,244,50,0,224,46,1,224,61,17,192,+8,189,195,96,75,244,166,0,128,144,0,54,224,17,1,105,197,98,61,201,+197,137,183,96,255,128,18,0,50,105,219,64,18,227,24,2,165,164,128,9,+132,198,136,81,229,208,2,225,40,1,196,228,194,242,160,164,2,95,56,56,+129,77,245,217,0,99,198,2,95,52,51,72,203,134,68,225,105,2,99,2,+67,208,3,95,56,57,49,66,184,163,123,0,56,138,40,0,95,97,111,1,+95,55,65,111,97,69,83,72,0,58,99,45,245,216,1,161,4,96,206,183,+38,76,161,0,54,138,147,0,54,172,93,98,131,68,209,2,56,56,50,73,+119,226,228,1,96,5,1,79,32,119,10,229,136,0,3,95,56,56,57,96,+106,170,235,6,56,56,56,32,95,55,55,66,105,96,197,0,58,96,31,250,+66,3,255,0,2,64,110,129,31,201,85,108,246,0,56,100,151,97,35,200,+154,108,252,96,13,229,197,2,128,35,0,49,78,229,139,55,135,241,3,95,+56,52,55,96,120,226,62,5,105,210,231,115,11,160,202,226,102,1,128,168,+71,121,225,118,0,64,184,228,134,0,64,16,164,153,65,64,0,55,65,27,+0,52,81,77,96,15,0,48,235,219,1,5,52,49,56,32,95,52,64,149,+227,248,8,31,85,110,109,97,116,99,104,101,100,32,35,105,102,58,32,112,+111,115,105,116,105,111,110,115,32,111,102,32,111,112,101,110,12,32,99,111,+110,116,101,120,116,32,97,114,101,58,163,251,64,81,65,124,131,211,107,118,+1,52,51,143,193,228,10,2,232,130,1,133,246,98,193,224,225,6,199,190,+0,85,229,208,1,232,185,3,224,42,5,243,210,25,231,209,4,232,162,11,+129,55,232,167,10,65,83,213,170,224,69,7,224,72,0,224,184,7,96,75,+224,146,13,232,223,1,204,23,100,245,185,243,192,0,226,4,10,233,120,5,+224,2,15,192,64,224,116,8,224,25,0,224,60,18,224,36,1,233,11,4,+128,28,224,8,0,224,40,5,224,79,19,160,50,224,216,25,224,54,6,224,+48,3,224,49,29,224,101,6,192,191,224,32,4,224,2,15,224,56,5,224,+207,26,224,60,18,99,117,224,43,2,224,5,3,225,79,3,225,88,1,224,+64,7,225,185,8,234,198,10,234,204,9,239,22,4,1,105,110,111,11,224,+0,7,224,192,6,224,154,6,224,17,10,224,154,71,4,117,110,100,101,102,+224,153,26,224,141,3,224,153,9,64,5,224,153,71,1,105,102,224,154,146,+224,153,14,227,155,3,224,153,15,192,14,196,192,192,0,224,147,7,224,1,+5,224,195,8,224,32,7,224,194,13,224,191,15,224,188,10,226,120,22,224,+217,6,224,142,67,2,101,108,115,227,28,11,224,144,115,225,33,12,225,221,+6,224,144,99,1,110,100,225,179,134,5,112,114,97,103,109,97,224,146,10,+224,70,6,160,13,96,107,160,10,128,119,142,102,224,8,3,224,31,0,192,+152,176,105,224,11,8,166,140,192,13,241,247,0,192,16,240,200,8,128,252,+231,219,6,232,224,4,65,27,238,233,2,87,41,186,227,107,91,224,221,0,+192,0,232,117,3,252,33,5,225,131,9,227,234,5,224,164,1,224,1,3,+225,161,12,224,34,5,225,157,10,227,221,14,142,112,225,155,8,230,232,6,+226,205,5,224,162,2,224,159,31,224,158,21,224,155,13,6,119,97,114,110,+105,110,103,224,155,7,225,46,5,225,61,6,224,124,64,4,101,114,114,111,+114,224,122,10,224,2,9,225,15,2,224,104,5,193,223,64,164,224,72,3,+224,35,5,242,148,2,192,41,224,141,9,79,195,224,140,6,224,107,10,112,+211,79,36,113,123,0,51,243,105,1,64,0,224,246,1,160,42,130,203,254,+61,1,227,100,9,64,8,64,194,205,60,139,96,1,95,49,76,252,2,95,+52,51,128,5,109,63,128,72,113,245,64,21,143,198,64,67,1,95,52,83,+163,99,46,67,39,0,52,109,255,224,27,5,143,74,224,211,6,225,198,6,+225,219,2,228,21,1,224,38,8,224,19,10,224,16,7,224,13,0,109,237,+248,20,1,210,40,109,1,88,104,1,95,53,77,1,1,54,51,225,67,2,+227,221,3,226,9,12,226,7,13,236,146,9,64,1,236,93,14,0,83,64,+71,225,97,0,225,197,0,0,66,238,4,5,192,0,225,211,12,255,179,1,+128,251,238,46,0,193,166,64,76,0,57,77,147,77,188,1,95,54,65,177,+193,144,238,77,0,128,15,238,80,5,0,87,131,143,20,58,32,117,110,107,+110,111,119,110,32,100,105,114,101,99,116,105,118,101,32,35,130,156,98,2,+147,32,224,61,8,4,94,42,105,110,32,96,38,238,87,7,224,203,7,227,+12,0,98,207,226,39,8,226,11,9,129,201,1,95,54,98,139,225,165,6,+226,243,255,128,2,226,243,4,128,31,160,45,226,245,11,117,217,2,95,51,+54,238,217,1,225,92,3,96,206,252,4,12,0,115,253,43,60,3,67,112,+112,73,75,59,156,65,2,49,49,51,252,67,0,96,210,226,104,44,231,114,+2,161,83,131,16,65,230,128,5,195,15,129,23,231,233,26,197,191,226,175,+0,163,121,227,118,1,96,13,227,90,4,227,37,46,224,146,31,64,0,231,+174,7,162,61,233,38,16,247,33,6,226,126,1,227,43,0,130,77,224,131,+1,96,50,1,55,50,194,234,1,95,55,120,165,0,52,128,227,228,88,1,+224,98,1,0,85,161,87,192,86,228,171,3,120,249,224,193,1,128,145,64,+5,148,133,246,213,16,225,42,2,2,50,50,48,69,46,216,112,226,216,0,+182,237,148,184,224,80,2,116,216,164,52,224,0,0,224,222,1,160,9,161,+98,133,118,224,160,3,131,62,194,80,128,16,229,159,0,224,70,15,129,169,+115,101,64,148,227,90,1,243,214,44,107,233,2,32,97,116,225,5,3,194,+48,243,117,11,224,149,21,3,95,56,48,49,122,96,192,237,224,49,35,128,+16,160,201,230,139,7,226,69,4,226,101,3,194,9,2,95,56,52,86,106,+226,59,0,193,93,193,195,73,18,224,119,2,160,34,101,153,130,135,224,41,+15,64,21,66,118,85,197,224,59,47,96,180,103,125,224,70,6,192,55,99,+23,161,33,128,13,194,27,117,207,128,54,0,53,183,69,226,72,9,192,55,+229,145,0,64,0,227,35,2,224,28,8,224,15,5,224,64,3,64,26,224,+33,5,69,242,166,127,196,168,102,5,196,136,247,122,0,128,230,247,127,8,+124,14,0,53,64,19,89,131,64,19,166,232,96,0,224,206,8,77,94,131,+3,1,95,51,87,149,250,12,6,128,83,135,86,71,2,96,115,226,68,7,+252,136,0,195,38,192,17,224,94,5,99,58,248,199,0,224,119,27,224,61,+17,193,43,162,19,128,223,203,80,235,226,0,225,105,4,225,121,0,162,58,+224,14,1,137,217,192,53,96,32,96,60,224,101,0,97,85,136,80,1,56,+56,99,173,129,7,0,56,129,134,91,233,93,37,162,141,224,200,10,192,49,+232,103,5,1,56,56,231,167,1,192,139,165,180,224,171,2,224,170,0,226,+63,1,160,9,96,8,168,32,121,25,226,232,3,254,146,1,254,145,13,96,+33,89,146,2,55,54,55,102,222,239,60,0,2,64,35,49,154,124,225,129,+4,64,47,69,170,195,243,254,142,0,1,95,52,99,41,254,198,4,230,205,+4,224,2,1,92,142,186,142,96,92,237,72,1,231,142,11,233,120,6,225,+16,5,192,83,230,236,14,164,250,233,61,0,226,240,1,230,63,1,225,114,+2,225,250,1,64,124,203,255,236,51,4,140,42,224,49,4,225,145,0,224,+77,5,160,31,248,145,4,224,30,6,224,114,1,240,182,6,248,146,26,224,+115,2,224,33,16,139,15,192,0,224,192,1,229,224,3,224,2,0,173,4,+224,157,7,192,63,224,96,25,233,161,0,239,97,2,224,133,9,224,95,3,+235,230,3,101,216,75,177,0,50,68,196,165,137,246,46,18,224,45,28,96,+41,224,28,15,245,222,9,228,57,2,224,195,2,225,24,10,224,210,3,224,+206,8,112,151,224,115,12,244,114,6,225,45,9,224,87,48,245,91,4,224,+192,7,224,86,3,192,83,166,246,224,81,16,244,139,5,128,51,99,131,101,+246,128,19,162,6,163,122,128,106,233,79,6,224,57,3,125,230,128,34,125,+42,162,242,93,238,157,239,231,60,2,128,101,64,34,253,210,0,128,34,201,+122,233,138,115,192,207,113,244,225,103,0,128,103,70,29,224,217,11,224,251,+24,161,87,196,160,231,93,0,160,0,225,26,1,240,39,4,233,167,36,101,+76,0,50,238,25,6,162,14,129,83,128,10,232,140,4,194,59,128,228,64,+102,162,58,96,122,224,240,16,231,42,1,137,129,224,223,7,224,122,1,161,+77,236,95,4,225,254,1,198,189,192,86,232,82,12,232,57,16,228,183,5,+99,200,240,174,4,226,177,2,97,152,231,203,37,224,193,1,231,174,18,230,+145,9,231,172,87,231,137,13,231,138,10,231,135,5,231,134,5,161,31,135,+125,225,4,29,224,243,19,231,133,5,231,126,3,96,13,2,49,54,55,240,+141,93,3,54,56,58,53,132,214,0,58,96,141,1,10,65,140,44,64,170,+88,79,132,207,196,218,65,74,102,94,226,136,3,194,138,0,58,97,187,4,+10,65,32,80,32,132,31,99,227,112,138,231,202,2,97,150,65,90,130,184,+201,236,160,15,1,35,57,196,159,64,12,96,43,234,14,0,0,58,96,8,+96,160,239,227,4,2,95,52,51,65,179,64,177,228,160,0,107,209,64,7,+0,58,98,192,5,10,65,32,85,32,90,224,1,2,0,75,227,115,0,0,+58,106,185,96,85,98,241,65,216,4,55,56,49,32,64,65,212,160,254,194,+29,128,184,99,22,1,55,55,69,67,238,99,1,2,95,56,55,74,4,1,+56,55,64,138,3,67,39,32,79,65,52,0,80,65,226,64,29,229,112,8,+2,94,42,35,159,30,0,32,135,145,172,187,0,79,128,243,162,75,96,6,+97,134,132,115,128,157,0,75,172,210,98,131,96,164,226,47,10,5,92,34,+44,48,58,48,225,216,0,0,50,96,225,3,95,56,56,48,224,37,2,3,+112,114,101,68,96,131,0,100,64,39,0,58,96,169,1,10,65,68,238,97,+95,97,233,3,95,55,49,54,65,180,196,111,138,221,0,58,64,72,129,84,+1,75,50,65,75,129,78,0,58,96,253,128,22,0,51,96,22,99,106,0,+58,97,26,161,97,64,1,194,31,64,0,227,43,1,168,85,227,146,6,129,+128,224,25,15,232,29,2,224,29,13,224,32,2,224,33,17,224,36,3,224,+37,20,224,40,4,224,41,23,224,44,5,224,45,26,224,48,6,224,49,29,+224,52,7,231,23,3,224,38,4,233,1,3,233,200,6,160,0,193,138,224,+55,5,224,103,14,224,40,19,224,43,6,224,83,30,224,75,16,224,41,50,+233,240,3,236,168,1,135,175,245,41,1,224,5,9,104,189,128,0,225,21,+1,192,1,0,89,224,96,1,224,28,9,224,32,6,224,172,14,230,122,1,+224,42,2,224,74,11,128,43,224,155,0,233,48,1,192,5,224,105,2,192,+67,230,183,5,192,250,64,25,246,44,1,160,13,224,2,4,224,242,16,165,+197,5,67,32,60,32,64,35,237,137,3,224,67,9,128,218,192,34,224,70,+5,160,203,128,70,231,229,1,224,37,6,149,91,224,22,4,0,83,224,81,+0,224,112,5,238,122,6,224,13,5,97,94,230,121,9,64,0,65,32,0,+85,82,78,70,107,134,105,109,52,192,27,129,66,64,74,65,98,98,10,69,+201,0,53,72,104,234,248,1,225,39,9,224,186,0,224,25,4,0,82,224,+187,0,227,133,7,128,24,224,41,1,225,236,1,224,184,5,212,76,224,44,+5,225,176,0,224,64,4,96,185,239,60,5,74,116,160,0,224,221,9,96,+5,150,179,230,161,5,1,32,32,236,237,0,224,252,11,224,134,1,128,13,+235,3,1,97,89,235,109,0,234,158,0,224,0,4,224,178,1,128,1,227,+164,0,226,70,26,128,28,162,70,225,140,1,224,37,4,225,8,1,3,67,+32,61,61,224,39,17,193,177,225,155,8,229,27,0,224,81,1,252,233,0,+224,100,4,64,44,96,42,160,173,160,26,96,17,91,84,172,219,225,4,1,+192,106,240,118,8,192,36,64,61,76,0,1,95,55,212,159,226,124,12,224,+78,0,224,1,17,226,143,1,224,43,21,194,161,224,37,9,225,151,10,225,+49,0,224,1,1,226,183,15,235,129,1,224,47,6,254,51,13,226,189,13,+241,250,3,196,217,227,159,9,233,168,2,162,129,72,122,161,48,225,55,8,+162,174,229,35,4,224,228,47,227,93,2,224,228,27,194,91,227,162,6,227,+225,1,236,118,8,226,138,0,227,188,9,228,154,1,240,171,4,227,186,2,+224,82,11,224,237,121,224,68,2,224,237,44,0,50,224,237,19,231,103,6,+224,233,11,226,2,10,192,2,128,40,224,38,0,231,168,0,224,73,16,224,+70,27,160,108,224,65,11,224,62,4,224,53,2,193,86,225,9,2,226,216,+2,228,83,10,225,45,7,128,5,224,77,11,160,209,64,21,0,85,142,134,+0,53,109,136,0,53,103,147,0,67,76,186,247,157,2,224,89,60,110,218,+224,89,5,211,195,224,89,15,225,24,2,194,67,96,4,224,67,2,229,23,+17,226,3,3,133,152,225,128,0,64,14,161,79,65,107,129,111,192,44,201,+40,69,57,0,82,236,165,0,77,113,226,216,2,236,170,8,192,53,160,253,+129,171,242,51,4,224,38,0,143,250,168,116,165,31,160,94,239,243,83,7,+84,111,107,101,110,105,115,101,143,243,5,50,49,53,58,49,51,244,204,7,+224,1,5,234,195,3,224,31,11,224,35,7,225,115,6,224,2,2,234,235,+12,224,83,14,234,238,39,161,118,227,129,6,64,43,234,242,67,210,48,64,+0,228,10,10,224,74,35,235,61,255,225,39,10,235,61,255,235,61,17,226,+46,48,242,236,0,226,46,18,224,86,6,234,254,8,96,78,225,116,8,231,+224,13,0,49,64,5,224,112,8,0,83,182,215,225,115,26,247,141,16,64,+8,64,48,151,147,87,23,1,53,57,128,61,247,23,9,225,144,4,1,45,+123,232,37,4,227,198,9,196,91,224,155,1,235,240,0,224,19,4,64,57,+194,96,87,222,0,35,234,228,1,224,36,2,224,58,10,233,11,14,224,234,+7,96,42,225,41,32,226,31,3,226,158,34,1,125,45,226,158,20,225,247,+2,198,183,226,125,9,128,21,224,160,4,227,127,13,224,225,11,227,127,33,+224,225,3,192,59,226,12,24,251,35,6,224,254,18,224,84,0,195,73,224,+88,3,160,147,117,108,122,52,64,95,233,124,7,224,67,1,192,1,229,132,+62,135,56,229,132,13,224,47,2,228,59,5,0,54,96,33,224,161,5,226,+24,9,229,149,17,224,0,1,224,188,1,160,140,96,62,239,169,21,224,52,+6,230,252,6,224,101,3,128,68,231,165,2,224,76,1,228,211,29,237,49,+2,224,37,5,225,125,10,226,197,2,231,117,10,128,24,224,102,8,226,200,+8,120,154,224,90,9,194,200,225,19,7,224,198,1,224,45,1,225,16,2,+224,89,2,224,90,12,201,54,129,34,154,47,224,50,2,224,44,3,227,16,+10,64,99,2,95,56,54,65,113,64,14,162,13,249,98,2,224,63,22,98,+120,192,63,224,54,2,224,65,8,225,80,10,160,246,224,241,5,64,144,224,+194,11,160,129,227,125,28,96,142,226,219,24,192,14,160,26,224,47,5,228,+237,21,64,1,242,18,213,242,20,9,224,46,18,242,23,5,224,40,6,228,+8,10,225,57,0,224,1,1,227,75,15,242,26,144,224,229,9,224,226,10,+224,152,4,230,244,75,224,62,2,226,224,9,229,188,0,69,235,232,225,2,+230,212,3,224,101,6,64,1,224,202,47,233,204,13,224,203,71,2,53,57,+32,105,73,233,177,16,163,39,237,234,10,226,131,47,243,185,155,224,83,8,+224,241,122,243,189,84,240,70,7,224,237,6,232,105,1,226,222,7,224,178,+0,102,250,228,37,3,236,253,2,224,53,4,225,72,13,224,31,1,225,69,+15,0,51,106,4,224,44,7,227,15,32,224,62,2,225,37,19,0,51,225,+37,3,1,39,39,225,37,5,224,99,1,224,196,68,0,83,226,77,12,2,+66,32,90,226,29,11,165,86,224,219,4,232,24,3,224,220,18,2,54,49,+32,128,128,0,79,128,7,244,20,0,224,101,7,225,162,88,135,117,237,109,+11,192,5,225,189,17,244,194,46,1,66,32,160,245,148,204,225,2,8,231,+218,17,227,26,73,224,204,2,224,95,24,228,34,0,160,95,228,153,8,96,+2,160,101,224,83,3,202,201,224,80,18,224,77,30,224,73,25,224,70,27,+193,221,224,65,10,224,62,4,224,53,2,162,20,64,12,194,25,247,141,197,+224,89,81,247,231,77,224,173,9,229,57,4,228,87,9,224,48,18,100,141,+70,36,64,53,0,52,228,141,8,227,23,6,224,180,1,66,29,64,14,162,+15,66,43,130,47,192,44,206,221,248,77,213,4,57,52,58,49,49,230,158,+1,235,95,5,224,233,3,192,1,248,54,1,224,25,7,192,1,228,202,3,+224,37,15,224,35,4,224,30,10,97,38,248,161,4,224,36,9,192,1,248,+200,5,229,7,7,224,2,0,132,16,160,11,224,162,26,225,195,2,166,165,+224,5,8,224,68,3,160,73,227,16,2,163,22,228,237,6,240,201,1,224,+1,1,229,16,16,224,156,16,164,221,241,76,8,64,0,229,180,3,229,109,+10,230,107,5,224,95,27,249,65,3,224,95,0,238,238,4,128,5,224,106,+20,224,97,20,233,228,3,224,38,8,164,87,3,67,32,61,61,224,42,20,+248,132,15,242,63,3,240,24,9,240,22,6,240,20,8,228,29,0,235,143,+9,248,154,69,1,39,32,232,59,13,224,69,3,224,154,3,96,12,229,249,+1,98,170,209,107,148,233,65,169,244,235,7,225,240,13,240,86,3,226,59,+2,164,165,128,1,225,52,10,225,104,7,241,82,1,224,102,9,229,41,0,+224,28,11,234,162,0,224,79,6,192,107,198,199,224,31,5,166,156,230,123,+2,234,205,15,228,21,10,225,247,8,193,68,202,78,162,43,193,89,160,32,+128,73,245,173,2,225,172,0,183,169,229,204,2,197,205,224,103,5,246,76,+1,226,137,64,244,219,22,224,64,4,225,41,10,241,206,2,228,192,0,208,+161,224,222,19,245,54,6,128,191,224,126,1,224,13,4,129,69,224,117,12,+64,113,225,78,2,252,146,3,233,164,1,128,0,224,201,1,64,1,246,43,+255,246,43,221,226,154,0,131,135,229,44,9,96,207,245,158,8,224,0,1,+192,166,160,170,164,58,167,162,227,139,13,224,52,5,194,212,224,22,9,193,+234,249,39,6,224,37,5,226,174,10,64,1,239,158,4,224,134,4,225,39,+0,160,25,64,220,226,195,6,128,21,246,178,39,230,112,21,224,0,0,224,+167,5,224,1,9,246,140,8,237,192,9,161,90,224,166,0,225,99,12,194,+90,225,145,5,224,42,11,224,123,1,227,141,16,231,207,50,231,144,1,224,+103,11,224,64,4,229,69,10,232,14,2,225,94,3,0,57,149,25,12,95,+51,55,49,32,95,51,55,51,32,73,32,64,236,164,3,224,168,2,224,86,+13,224,149,11,0,83,255,140,33,232,101,12,246,123,5,244,183,9,227,18,+2,232,3,1,199,5,232,10,14,224,137,3,232,7,1,224,21,1,96,25,+225,244,2,224,47,3,192,72,238,91,4,225,28,7,226,30,2,224,232,10,+231,238,19,230,153,5,195,53,231,235,6,224,163,1,160,16,192,58,128,148,+132,184,248,129,7,128,56,99,91,0,79,135,24,225,218,1,231,253,2,225,+6,6,243,171,3,193,109,200,201,226,203,19,129,23,224,69,3,224,92,6,+232,32,102,228,59,4,64,62,225,8,13,192,57,233,175,4,224,229,17,96,+132,224,153,8,194,146,250,136,15,228,6,6,224,67,17,103,48,224,67,2,+246,97,2,224,130,5,225,7,9,244,152,4,225,7,27,240,198,5,224,51,+30,240,196,8,226,136,5,224,158,3,224,178,0,98,25,192,188,229,234,0,+224,16,0,1,56,54,130,0,160,127,5,66,39,32,95,56,55,114,162,96,+30,252,152,0,64,0,230,20,17,225,26,5,64,11,225,116,6,227,220,0,+227,123,1,224,151,1,128,16,177,17,128,5,104,42,224,89,1,96,37,226,+148,2,224,173,1,194,48,230,229,16,192,93,243,135,27,227,151,0,224,117,+1,128,1,253,49,1,224,80,0,224,224,6,227,180,1,128,209,230,237,5,+162,92,224,67,1,224,61,7,224,64,2,224,61,22,163,42,224,59,11,224,+55,4,224,52,2,225,15,4,128,158,244,229,16,224,243,1,228,237,2,228,+234,4,225,78,14,244,34,10,224,76,71,192,223,96,51,226,140,9,160,217,+128,204,224,60,6,128,0,226,124,1,226,133,4,224,169,6,165,42,105,183,+140,128,128,98,237,179,12,128,50,230,187,1,224,98,8,228,195,12,226,231,+0,96,253,224,56,13,224,59,1,225,71,9,64,6,237,113,4,244,29,104,+5,49,55,49,58,49,50,232,29,4,108,113,229,67,1,2,49,52,57,203,+229,232,226,10,196,139,196,97,64,24,64,65,165,85,224,60,29,68,191,1,+53,55,224,68,1,66,12,64,7,4,83,39,32,95,50,78,41,3,95,54,+48,54,98,88,2,51,55,48,192,79,225,30,1,1,95,96,160,191,224,47,+3,0,56,224,47,17,0,39,224,48,0,224,33,5,224,161,5,224,47,1,+7,40,41,44,91,93,59,123,125,224,52,36,2,32,94,41,224,47,36,22,+58,33,35,36,37,38,42,43,46,47,60,61,62,63,64,92,92,92,94,92,+124,45,126,224,67,0,193,81,231,22,2,83,49,224,20,4,110,127,111,89,+128,11,231,62,0,7,58,56,55,55,32,64,10,65,163,42,130,188,99,26,+163,59,131,43,67,117,133,78,224,24,3,224,2,0,0,66,70,214,0,49,+65,168,128,147,226,230,6,128,22,130,223,228,213,3,131,243,128,169,161,13,+0,49,234,156,3,3,108,105,110,101,226,128,0,224,84,63,5,112,114,97,+103,109,97,224,86,0,232,154,0,224,87,3,224,81,37,2,100,101,102,224,+168,1,224,71,0,99,219,224,83,1,224,65,20,4,117,110,100,101,102,128,+64,193,70,64,214,1,95,49,101,39,1,95,54,97,94,227,248,81,4,72,+97,115,104,68,96,196,131,250,3,56,56,58,53,96,141,0,90,64,180,1,+56,54,66,66,233,109,1,228,173,1,160,159,224,244,3,4,32,95,51,56,+49,64,51,0,54,68,37,135,130,162,77,98,64,64,54,224,204,102,0,57,+160,204,234,39,3,193,97,232,116,1,160,13,161,184,195,62,228,165,16,3,+79,32,35,52,234,232,4,238,236,0,227,39,7,64,86,88,166,224,17,1,+225,43,0,99,57,128,145,76,141,97,82,2,51,54,52,225,25,95,7,49,+48,49,58,51,53,58,32,129,29,129,208,0,51,224,125,3,16,105,110,99,+111,109,112,108,101,116,101,32,109,97,99,114,111,32,98,233,7,105,116,105,+111,110,58,94,42,224,54,16,2,32,32,35,131,18,160,89,65,81,96,34,+101,214,1,51,52,74,233,225,60,0,3,95,56,54,55,96,16,251,191,9,+238,135,0,129,42,129,40,199,207,227,249,4,238,63,2,235,232,1,227,115,+12,224,105,9,227,254,6,224,103,7,226,21,3,224,98,33,0,49,224,98,+3,225,239,3,130,29,128,18,141,16,233,157,5,224,43,1,128,93,96,124,+172,253,129,72,1,56,54,231,84,2,69,233,136,68,3,95,49,49,49,226,+56,95,4,57,57,58,53,50,194,55,128,131,224,219,2,72,29,227,53,0,+67,54,131,49,239,55,0,128,12,160,218,164,46,0,55,118,110,164,46,129,+217,192,25,0,49,192,25,2,95,56,55,137,3,160,31,5,55,52,53,32,+95,55,68,104,164,129,233,201,2,66,105,0,54,172,220,64,8,0,52,64,+145,1,52,51,96,9,100,178,236,247,5,128,147,64,40,1,49,48,74,113,+64,58,1,54,55,231,68,5,199,50,1,95,54,238,10,1,197,2,97,150,+0,57,226,223,0,225,134,1,0,35,230,109,2,224,56,2,224,55,4,128,+7,224,55,6,230,250,0,224,53,1,225,86,14,64,4,96,8,100,102,130,+57,226,69,0,65,40,69,110,237,206,0,230,215,3,197,8,226,103,3,163,+73,160,13,227,102,1,128,10,226,235,11,1,51,53,236,16,11,237,203,0,+236,143,0,242,85,5,160,24,203,235,1,95,49,146,172,106,255,105,20,128,+76,128,61,131,31,76,15,0,55,246,82,0,224,201,21,195,174,224,199,31,+225,121,2,0,35,232,26,0,178,114,132,9,228,137,9,242,230,11,238,194,+1,228,56,17,163,176,128,46,224,141,34,224,104,0,0,83,210,187,193,62,+192,102,225,109,2,193,81,193,64,64,12,227,0,5,224,12,3,128,0,224,+214,1,232,255,2,234,165,1,226,126,3,225,155,12,209,76,224,26,10,247,+146,2,228,29,15,1,64,89,96,218,227,194,1,192,213,0,67,227,185,5,+138,180,0,54,106,180,3,75,50,32,58,96,92,64,11,2,32,75,32,64,+25,0,52,160,13,0,65,96,13,0,51,96,13,2,95,56,54,71,204,229,+33,97,4,53,49,58,49,55,165,33,224,119,102,1,52,48,224,119,109,0,+54,198,17,1,58,56,69,167,65,117,4,51,56,50,32,75,79,111,10,32,+67,32,80,32,75,32,95,55,56,54,224,145,2,2,114,101,112,64,126,8,+109,101,110,116,44,32,97,116,32,224,161,84,3,50,53,58,54,131,75,224,+135,127,79,210,224,137,126,0,90,132,139,99,38,96,153,0,52,224,153,127,+66,77,0,49,226,77,14,103,58,65,206,103,123,64,9,204,173,96,12,96,+210,96,17,164,152,64,18,229,115,1,128,26,228,152,0,0,58,104,131,2,+10,65,32,65,11,0,90,69,172,192,4,154,234,0,58,96,100,1,10,65,+224,29,7,224,34,5,0,56,160,34,72,126,103,183,1,95,54,74,233,0,+58,74,228,227,18,27,71,246,5,98,114,101,97,107,115,227,17,116,224,134,+109,1,64,90,225,190,0,97,85,193,185,65,78,93,41,225,174,0,0,58,+110,94,161,104,189,69,224,10,30,235,86,1,0,32,86,238,193,251,64,88,+160,79,64,44,224,7,11,224,70,2,224,59,2,0,58,96,163,226,22,6,+224,60,5,128,41,0,58,96,217,98,95,0,90,125,61,0,58,119,152,96,+57,2,80,32,35,74,217,0,85,98,40,130,237,4,80,32,35,51,32,73,+215,0,58,123,176,192,38,65,15,96,38,0,53,130,140,66,252,80,47,0,+58,117,81,226,189,1,128,96,64,25,224,213,10,64,144,0,58,119,30,160,+28,1,80,32,158,185,0,80,96,72,129,10,3,80,32,35,53,160,128,0,+53,128,225,0,80,124,205,128,17,128,202,3,80,32,35,54,192,17,128,203,+117,40,168,145,104,58,172,186,74,232,1,52,57,76,183,72,73,1,55,55,+75,185,0,55,138,215,64,128,173,0,129,41,147,226,2,58,56,53,129,9,+128,74,83,192,224,65,14,76,10,67,94,172,129,73,77,1,53,50,232,174,+6,1,95,55,100,43,160,92,2,58,56,53,193,83,0,66,111,155,242,4,+2,128,4,104,248,64,8,139,15,1,95,56,253,75,0,234,92,3,202,4,+251,194,8,128,213,96,8,5,95,54,55,32,95,56,171,126,224,60,6,249,+197,2,162,151,64,195,96,230,7,64,95,49,57,55,32,95,57,173,82,235,+44,0,67,5,201,7,160,20,137,250,224,33,2,165,203,233,46,2,64,81,+226,8,6,194,195,0,58,96,39,194,192,98,91,64,235,228,197,0,73,252,+0,52,106,59,96,195,193,39,225,114,8,241,45,6,225,114,1,96,43,225,+250,13,64,107,0,54,160,107,129,230,64,44,1,50,50,64,189,0,48,97,+112,203,46,120,62,96,144,241,31,82,7,67,112,112,73,102,100,101,102,177,+29,3,56,51,58,50,238,229,0,130,165,237,163,4,31,67,97,110,110,111,+116,32,101,120,112,97,110,100,32,35,105,102,32,100,105,114,101,99,116,105,+118,101,32,105,110,32,102,1,105,108,241,0,3,209,2,3,95,49,54,51,+74,208,138,254,224,81,5,4,58,94,42,32,32,255,145,2,224,253,1,2,+66,32,95,86,39,165,14,67,12,2,51,57,50,65,107,114,152,1,54,57,+225,168,3,161,247,96,52,5,52,49,56,32,95,52,111,54,224,193,10,31,+87,97,114,110,105,110,103,58,32,116,114,97,105,108,105,110,103,32,99,104,+97,114,97,99,116,101,114,115,32,97,102,116,1,101,114,64,214,225,0,16,+178,20,97,0,3,115,105,111,110,224,245,47,224,240,1,130,187,98,2,2,+95,56,52,96,44,226,1,115,4,57,50,58,50,56,226,1,25,4,112,97,+114,115,101,226,0,76,228,47,3,226,0,17,64,13,141,224,226,9,12,1,+95,56,110,92,226,16,91,224,255,56,226,10,3,1,95,49,64,224,206,84,+68,43,134,153,224,224,1,64,8,0,56,217,63,249,62,15,1,47,47,128,+83,178,3,129,19,0,58,97,19,64,76,1,49,49,66,111,68,159,0,56,+65,22,64,165,224,17,0,0,52,64,92,0,55,64,169,65,124,128,19,0,+55,78,138,2,55,54,50,226,130,3,2,124,92,124,160,99,2,55,53,56,+82,152,82,173,96,40,162,196,230,230,1,160,70,99,181,0,55,186,147,128,+143,174,169,224,143,3,0,49,224,143,45,1,38,38,224,141,16,220,224,224,+141,13,177,132,64,141,173,193,0,52,65,83,128,113,224,10,13,224,135,9,+82,18,0,51,210,18,224,188,2,224,140,2,96,217,96,218,224,129,0,129,+209,224,49,5,0,56,75,65,225,0,4,0,56,75,76,160,188,224,38,5,+128,21,224,212,5,171,150,224,83,9,251,30,1,0,53,148,120,1,55,54,+104,219,162,115,128,41,0,49,134,240,224,17,3,64,188,129,88,66,194,224,+208,4,97,230,0,58,96,216,225,55,28,225,77,31,225,213,1,1,62,61,+161,213,224,144,1,2,50,51,51,64,194,128,149,225,138,13,74,99,193,138,+224,55,1,85,57,192,55,224,117,21,0,60,224,117,9,1,55,56,224,60,+21,64,117,249,26,0,224,55,2,66,97,224,116,29,0,61,224,116,9,225,+173,1,224,61,24,0,33,224,61,10,74,16,192,61,0,58,98,69,225,165,+6,226,33,3,0,55,138,110,224,29,1,226,132,6,0,51,68,66,226,132,+38,224,18,4,130,63,128,50,0,58,96,6,224,141,6,225,84,12,66,99,+225,84,8,6,49,48,48,32,95,53,56,128,217,224,55,14,245,160,0,224,+55,3,74,93,192,55,0,58,96,210,225,17,17,1,49,50,225,17,23,219,+218,225,71,7,225,17,39,139,249,64,6,227,69,17,224,228,13,226,231,11,+1,54,49,225,27,24,0,55,224,54,10,1,56,49,96,139,176,26,228,226,+14,224,56,11,1,49,57,88,177,160,56,0,58,97,21,101,210,1,50,56,+87,132,1,56,49,70,179,1,56,50,64,143,2,95,56,50,224,42,0,1,+95,56,104,238,128,11,2,49,56,57,224,11,1,1,57,48,224,35,1,103,+58,0,50,65,237,128,17,109,117,64,9,107,61,0,83,102,244,238,126,0,+0,80,65,59,3,32,95,54,56,68,156,1,54,56,133,213,238,161,1,108,+214,64,39,85,110,120,30,85,222,107,164,149,123,224,17,9,128,64,238,71,+5,135,213,247,136,1,239,91,0,64,88,1,95,56,172,7,128,37,104,198,+1,95,56,103,206,1,95,56,129,245,128,42,98,13,192,36,172,204,160,12,+0,83,140,97,0,56,71,36,0,85,85,208,128,79,233,19,0,151,83,86,+236,128,88,182,121,157,75,136,109,0,85,86,21,128,0,81,239,98,187,224,+0,3,0,58,97,88,1,10,65,160,194,64,58,2,95,51,48,90,115,0,+51,76,164,0,58,96,49,238,133,0,74,157,1,67,39,78,50,96,228,224,+19,0,238,46,0,64,63,2,67,32,79,249,17,1,233,193,3,224,219,1,+173,239,235,223,3,128,238,128,69,79,49,109,84,130,79,161,127,142,29,143,+41,124,51,78,88,192,28,128,241,66,30,0,50,113,65,1,67,32,98,253,+128,12,1,95,49,167,92,2,64,95,53,136,2,186,254,129,220,0,58,97,+96,226,169,3,0,51,71,21,1,50,57,128,34,67,64,2,95,50,57,98,+11,130,157,130,34,130,157,160,11,98,193,96,11,162,163,128,11,1,56,52,+96,94,167,21,2,49,50,57,64,94,96,148,1,95,50,106,149,64,181,0,+55,74,186,96,42,64,43,207,153,144,59,97,95,208,1,250,159,0,143,120,+224,7,2,71,208,0,53,86,118,1,95,53,64,77,194,80,0,80,98,26,+163,100,131,150,216,156,0,80,64,55,128,21,64,59,81,42,1,95,53,206,+151,64,32,160,49,96,28,253,157,1,98,111,128,46,96,26,188,126,186,29,+139,140,128,12,80,87,240,88,1,176,27,244,124,1,64,69,88,185,1,95,+53,79,72,224,117,0,145,59,66,9,226,113,0,145,65,153,138,96,11,99,+19,0,50,96,120,192,95,160,163,128,220,160,12,66,239,128,37,64,253,96,+100,153,105,224,197,16,64,39,64,9,192,243,225,16,3,228,18,2,140,112,+67,55,125,192,93,49,98,153,240,176,0,157,69,114,83,105,86,1,67,39,+67,18,3,95,56,50,56,227,24,0,224,78,3,224,13,5,0,58,100,29,+114,93,237,234,8,14,46,47,108,105,98,47,68,97,116,97,47,76,105,115,+116,184,123,4,52,51,58,49,49,140,58,224,44,1,15,108,97,115,116,58,+32,101,109,112,116,121,32,108,105,115,116,104,19,129,90,2,85,32,64,83,+132,128,143,100,3,64,8,98,160,224,134,0,0,79,115,146,64,172,0,58,+97,59,228,2,0,133,137,0,75,66,214,65,43,2,10,65,32,100,153,0,+58,98,45,177,53,68,210,220,44,227,242,1,114,221,98,89,0,53,82,218,+65,179,139,123,128,14,0,58,100,195,96,65,164,95,101,199,0,49,97,164,+128,56,251,160,3,128,101,96,78,126,74,0,64,132,124,192,42,64,1,116,+175,224,13,6,252,195,0,100,128,162,9,226,100,0,165,78,227,112,0,145,+145,124,156,69,72,133,129,129,235,0,56,128,18,97,206,235,64,2,73,107,+162,207,64,92,64,84,165,200,132,158,164,215,0,56,203,117,196,190,0,85,+91,203,128,10,96,201,98,72,228,190,0,97,32,64,96,0,58,102,85,161,+140,128,196,1,95,49,68,154,129,130,180,132,224,27,6,129,172,196,131,1,+55,57,107,253,233,55,1,224,136,2,96,155,233,24,0,224,24,2,96,10,+2,64,95,57,67,20,1,56,49,75,61,128,33,2,56,49,54,224,11,2,+101,60,96,13,202,232,2,95,56,49,100,242,224,20,4,0,58,104,3,134,+115,225,140,2,225,221,1,231,81,0,99,244,161,193,192,11,129,147,75,194,+231,19,3,225,199,0,208,45,0,56,101,224,224,46,0,70,198,224,46,0,+160,23,68,32,0,49,244,96,7,224,65,15,0,55,97,240,224,64,17,135,+104,0,58,64,239,160,218,96,71,100,171,224,72,17,96,102,96,201,98,72,+0,58,65,67,227,3,4,104,157,129,155,101,182,166,2,0,82,224,22,4,+167,20,96,63,227,171,0,129,92,165,133,161,66,224,41,1,160,19,149,224,+244,214,0,97,0,171,85,192,228,98,17,96,50,105,114,64,239,224,160,3,+224,83,1,192,77,131,55,128,67,226,236,13,0,58,96,243,231,17,2,226,+30,3,135,15,0,58,106,45,100,93,3,75,51,32,75,135,27,0,49,226,+251,0,1,95,55,74,115,67,246,199,2,0,67,194,57,97,118,128,18,130,+64,96,13,141,64,113,40,0,35,244,32,0,128,51,163,253,159,105,224,38,+2,0,49,106,169,65,217,3,95,56,48,57,235,73,1,198,118,224,50,10,+224,89,0,0,83,169,132,224,89,14,0,49,129,9,64,89,0,49,236,191,+2,224,19,0,235,183,3,139,117,119,19,131,41,97,251,196,111,89,75,134,+82,0,58,108,166,120,131,64,215,3,95,56,48,56,225,127,8,160,82,0,+51,88,251,80,145,0,50,97,104,184,103,224,54,16,184,57,0,53,108,157,+224,53,0,131,194,224,108,18,167,122,0,55,88,107,224,54,0,0,48,247,+137,1,130,61,0,85,226,201,0,226,168,2,197,173,197,245,226,155,2,226,+249,1,229,205,4,162,233,232,33,1,128,2,216,161,224,91,4,193,248,224,+22,0,195,252,166,9,216,153,100,149,227,42,1,139,237,234,182,8,162,242,+128,162,163,57,131,56,90,202,64,62,64,28,5,95,50,56,51,32,64,73,+252,75,92,160,0,128,163,1,79,32,120,137,97,197,225,66,5,194,21,0,+58,97,94,227,117,1,238,139,9,238,30,11,2,56,48,50,64,72,205,157,+130,37,238,162,4,1,55,52,64,28,117,57,2,55,51,53,65,197,140,30,+64,216,0,95,241,222,1,134,242,1,55,52,64,55,115,33,86,132,75,154,+0,55,74,172,148,195,224,209,0,96,59,224,98,0,64,133,239,27,0,224,+81,43,0,58,121,8,197,80,224,187,4,104,60,225,227,1,98,42,242,216,+0,249,138,3,233,20,1,0,100,125,119,0,100,181,100,160,59,225,76,5,+193,238,224,106,3,242,237,6,1,55,54,89,195,129,54,225,65,5,70,16,+0,48,195,230,245,145,16,1,44,41,213,229,239,139,5,137,87,224,0,0,+194,142,225,77,2,98,88,3,95,52,54,56,64,103,64,132,128,21,164,24,+250,60,6,0,90,69,89,1,54,51,66,15,172,165,194,10,192,0,227,75,+2,225,8,10,224,18,10,225,24,7,228,154,1,66,186,164,233,237,253,0,+224,45,12,65,75,224,65,12,64,189,80,49,224,166,8,224,88,9,224,184,+7,64,250,229,236,9,226,2,2,225,137,15,226,15,5,230,17,0,130,197,+0,67,143,14,129,91,229,200,0,201,204,0,55,101,159,98,112,0,52,64,+196,165,83,224,188,0,65,208,235,238,0,224,211,4,224,80,1,234,105,2,+132,0,64,45,0,75,93,187,224,69,12,1,64,75,65,59,224,26,3,227,+214,0,1,64,75,64,240,224,26,13,88,113,0,55,250,49,93,5,50,51,+56,58,49,50,161,78,170,208,165,139,129,73,130,83,133,93,224,10,0,225,+77,0,65,127,97,79,80,127,225,3,14,225,74,7,174,111,160,81,165,245,+64,13,161,194,225,94,7,64,24,210,7,224,111,40,67,84,64,1,67,149,+197,103,98,184,110,45,0,55,114,104,229,113,7,224,113,6,242,131,0,96,+169,224,69,1,197,34,110,185,130,27,3,32,95,55,57,139,255,133,51,224,+89,10,225,220,100,1,52,53,225,220,1,0,58,101,215,167,201,71,122,231,+165,2,0,80,136,10,102,125,227,165,1,231,50,6,103,44,96,28,238,41,+4,192,21,167,146,96,69,64,248,170,181,0,58,68,246,232,64,1,217,53,+1,95,51,86,219,0,58,69,123,128,28,128,24,68,190,122,97,1,95,54,+168,159,64,39,164,19,225,51,1,2,39,96,95,128,213,0,58,103,0,74,+151,2,55,50,51,136,155,1,55,50,67,88,64,197,112,59,97,252,64,21,+1,53,32,224,64,2,25,69,120,112,101,99,116,101,100,32,101,110,100,32,+111,102,32,105,110,112,117,116,32,40,69,79,70,229,233,0,0,58,103,141,+160,184,212,68,67,20,68,98,1,58,56,72,20,106,236,226,37,3,179,195,+224,103,1,3,35,108,105,110,220,82,166,26,252,81,1,1,51,53,180,2,+96,20,85,162,214,18,128,31,2,50,50,48,64,36,137,204,160,146,137,195,+204,99,194,118,173,120,141,114,234,185,4,1,64,35,149,220,128,188,0,80,+66,160,70,250,193,229,193,167,160,26,0,56,99,75,64,49,162,175,0,89,+226,45,3,162,15,229,183,1,81,228,224,92,1,224,10,0,235,105,13,0,+57,175,45,96,33,240,90,1,229,166,0,235,111,5,169,72,64,26,65,211,+64,153,128,172,224,26,0,224,108,1,66,189,212,103,148,38,226,197,3,140,+93,232,113,1,230,118,9,224,114,5,224,204,6,224,159,13,215,106,202,100,+224,124,3,66,33,225,75,11,194,2,243,84,0,209,30,224,134,11,128,86,+131,149,224,107,25,224,242,3,128,0,1,58,55,80,71,5,10,65,32,65,+32,58,96,139,3,10,65,32,75,64,10,137,155,238,12,2,96,235,130,72,+224,144,12,137,216,225,6,13,91,53,94,167,0,53,104,107,192,7,192,231,+135,123,230,73,1,224,61,1,233,235,3,179,227,1,95,55,80,170,96,184,+0,54,140,167,168,38,169,33,1,55,57,149,124,133,136,134,29,96,56,0,+58,96,56,224,211,1,118,140,233,6,36,208,72,233,182,2,64,118,81,201,+235,3,5,68,71,0,54,202,73,234,10,20,161,167,230,135,3,224,128,16,+224,43,7,237,47,4,231,15,0,134,125,96,45,242,161,3,135,134,97,8,+240,192,2,239,36,0,161,131,231,81,6,116,75,1,55,56,160,99,230,230,+8,64,244,114,55,135,30,224,208,0,249,73,3,224,7,7,197,253,129,197,+231,14,14,128,0,230,255,97,2,51,55,55,230,255,2,98,65,243,108,4,+132,21,225,92,5,225,101,6,183,198,215,204,134,156,237,52,0,66,7,100,+122,66,212,87,204,97,229,70,146,2,95,55,56,68,178,179,164,65,24,76,+1,139,212,246,106,0,224,71,1,224,62,14,160,44,162,35,246,91,7,225,+55,66,4,72,97,115,104,68,107,90,129,57,4,54,57,58,51,52,150,160,+194,160,230,215,4,4,109,97,99,114,111,160,30,194,119,166,218,130,87,224,+51,10,1,32,101,199,116,128,55,192,252,64,53,64,7,231,18,1,225,5,+7,192,92,224,75,2,23,97,114,103,117,109,101,110,116,115,44,32,98,117,+116,32,119,97,115,32,103,105,118,101,110,128,91,224,78,5,193,68,194,126,+130,212,165,218,64,2,1,95,55,84,155,128,180,251,222,4,234,170,2,202,+154,102,28,194,43,1,95,55,85,89,236,170,4,67,95,160,98,98,255,87,+158,228,237,4,109,30,133,101,2,55,54,55,110,254,95,235,167,173,165,254,+248,246,4,66,119,64,104,180,115,96,27,224,91,15,69,40,98,90,99,196,+101,56,129,67,100,99,1,53,32,133,206,64,116,64,8,70,160,228,184,0,+0,58,99,172,73,75,2,53,54,51,68,45,0,58,96,64,178,50,72,33,+0,75,66,198,0,54,225,134,2,13,101,120,112,97,110,115,105,111,110,44,+32,97,116,32,226,145,84,3,50,53,58,54,130,55,224,133,125,109,245,224,+135,124,80,234,225,15,125,66,71,0,58,98,127,229,102,4,224,9,1,131,+51,0,56,70,230,163,121,143,130,71,61,2,95,55,54,164,242,0,53,67,+61,66,235,186,39,64,83,221,99,247,100,2,96,38,160,71,144,3,133,187,+224,53,1,64,104,226,190,19,228,68,2,226,190,114,224,133,108,226,190,10,+224,135,110,226,190,8,224,135,110,155,206,0,58,101,46,226,52,19,2,114,+101,112,64,125,64,161,226,54,116,224,135,110,226,56,10,224,137,112,153,71,+83,72,224,144,124,0,58,107,47,144,205,0,52,90,238,0,56,104,125,2,+55,56,53,71,75,1,56,54,96,27,2,73,32,58,96,16,71,103,0,52,+125,126,1,55,56,135,166,171,41,99,15,136,182,0,54,97,106,160,11,96,+229,123,85,96,6,64,63,4,49,51,51,32,75,182,251,1,51,53,225,0,+2,6,78,111,32,102,105,101,108,201,105,96,29,128,7,76,203,192,105,82,+201,96,11,0,58,96,6,96,145,0,57,74,102,0,48,224,74,2,25,67,+111,110,116,114,111,108,46,69,120,99,101,112,116,105,111,110,46,73,110,116,+101,114,110,97,108,64,91,224,39,1,10,82,101,99,83,101,108,69,114,114,+111,114,96,116,0,58,96,214,227,72,2,0,73,141,175,65,178,99,105,1,+75,51,97,21,134,44,107,120,1,32,83,211,217,0,54,165,250,64,8,1,+55,54,86,98,0,51,102,52,230,29,0,234,116,1,73,67,107,96,0,54,+238,94,14,198,87,96,43,109,123,82,81,1,55,55,77,199,0,55,173,156,+0,58,109,70,97,82,0,55,65,1,109,168,96,28,2,95,51,49,65,144,+160,11,91,17,1,95,51,84,107,3,95,55,55,55,97,188,64,25,1,95,+53,64,235,64,106,0,55,129,209,224,20,4,0,51,107,221,160,65,0,52,+224,118,0,0,58,96,6,223,83,0,66,204,97,204,151,128,2,128,184,208,+191,127,20,140,69,251,73,5,108,153,74,58,1,95,51,91,174,64,0,172,+202,207,180,1,50,57,86,164,66,131,224,28,0,64,231,106,109,65,25,93,+200,90,243,71,104,255,52,1,220,169,224,107,77,67,45,224,107,9,76,232,+64,43,224,15,14,0,58,65,99,225,54,0,224,141,9,208,195,1,95,50,+90,157,160,133,224,127,3,224,141,35,0,58,65,229,98,23,2,56,32,58,+96,41,200,132,172,188,0,55,243,133,2,66,145,83,41,140,69,178,226,161,+27,64,5,232,172,0,110,49,64,157,220,89,128,31,96,22,3,48,48,32,+95,81,0,128,56,92,144,96,14,0,35,140,81,192,183,224,23,2,208,94,+0,64,156,123,1,95,55,117,95,0,58,66,223,131,125,1,95,55,78,89,+2,95,55,55,99,111,64,29,1,10,65,83,69,0,49,64,209,131,246,96,+236,0,58,96,39,0,10,84,92,0,58,96,214,96,24,0,65,96,24,233,+125,8,108,131,128,216,194,183,105,122,1,54,55,162,159,129,29,67,111,4,+64,95,49,57,55,192,212,97,192,64,21,224,117,1,67,157,233,218,7,144,+254,129,222,169,218,109,115,112,155,211,16,0,58,99,250,224,165,1,68,39,+66,23,192,141,143,202,189,106,0,64,77,215,1,75,52,130,67,1,95,55,+127,24,100,27,109,14,182,182,96,35,64,37,224,35,1,160,139,2,58,55,+54,193,79,224,93,7,2,55,51,56,224,93,0,98,61,224,93,0,129,24,+119,36,151,35,224,95,10,227,90,2,160,13,68,214,192,19,181,100,125,119,+97,111,247,94,7,210,187,114,190,0,52,68,196,224,231,12,194,162,88,189,+96,15,224,137,11,102,31,239,100,3,31,87,104,101,110,32,108,111,111,107,+105,110,103,32,102,111,114,32,97,32,110,111,110,45,101,109,112,116,121,32,+115,101,113,24,117,101,110,99,101,32,119,105,116,104,32,115,101,112,97,114,+97,116,111,114,115,58,94,42,94,151,67,0,58,97,92,135,14,254,226,0,+211,46,0,48,206,117,64,210,243,118,3,224,41,8,0,49,192,41,243,79,+4,0,58,115,158,128,92,253,247,3,65,39,133,69,130,58,230,18,12,131,+90,0,51,64,106,125,103,128,16,224,252,5,240,172,10,215,187,240,137,5,+2,103,111,116,160,35,224,163,6,0,58,64,193,64,162,120,155,0,89,244,+152,0,141,8,140,180,64,84,224,158,7,120,244,224,245,0,131,16,243,49,+40,14,112,111,108,121,112,97,114,115,101,45,49,46,49,50,47,64,43,5,+84,101,120,116,47,80,64,19,136,184,4,49,48,57,58,55,128,185,176,212,+98,107,0,52,70,222,224,14,1,246,9,3,109,183,224,25,12,66,72,0,+83,160,223,247,90,9,64,81,96,57,187,68,247,238,9,0,50,165,142,112,+234,1,50,52,197,137,208,180,96,64,192,12,128,44,198,30,64,176,127,236,+216,22,224,134,50,209,41,224,133,27,96,43,224,132,75,0,49,155,99,225,+11,30,96,44,224,134,6,0,53,195,207,224,134,51,137,26,224,133,29,96,+43,224,132,16,231,30,0,164,228,101,160,128,148,229,72,1,251,233,5,255,+253,15,8,44,59,40,41,91,93,123,125,96,195,112,230,123,0,105,41,229,+61,0,71,122,224,102,6,252,89,3,234,42,2,179,118,152,123,229,177,2,+128,6,3,95,51,53,54,214,32,156,66,165,122,228,46,8,12,66,97,100,+32,99,104,97,114,97,99,116,101,114,181,56,212,131,148,195,199,229,200,47,+132,2,128,153,166,230,128,31,251,71,22,215,74,232,100,2,232,86,0,96,+46,160,71,224,202,0,65,90,64,198,97,239,230,87,0,161,19,230,66,0,+132,220,165,9,97,225,137,57,231,113,0,225,223,0,233,37,0,129,232,192,+91,212,152,224,48,8,224,46,14,129,14,226,94,6,224,62,10,96,54,254,+23,30,1,95,39,229,137,0,231,26,0,224,98,26,64,79,64,101,96,11,+103,101,96,47,3,64,67,32,79,230,166,2,226,159,26,22,33,64,35,36,+37,38,42,43,46,47,60,61,62,63,92,92,92,94,92,124,58,45,126,160,+148,129,229,193,226,235,50,3,224,93,29,1,101,69,226,246,3,224,73,1,+252,228,0,226,84,2,227,240,9,198,250,224,125,2,226,32,8,192,145,225,+153,11,226,40,12,1,51,52,246,254,6,224,173,2,0,43,160,173,226,66,+11,226,58,7,224,195,30,131,165,224,195,73,224,181,2,0,45,231,239,3,+224,180,22,224,128,65,0,79,139,145,194,108,224,124,30,196,147,224,197,8,+3,109,105,115,115,73,180,7,43,47,45,47,100,105,103,105,168,161,224,39,+8,14,97,102,116,101,114,32,101,32,105,110,32,102,108,111,97,224,38,15,+6,108,105,116,101,114,97,108,164,214,64,30,68,216,2,50,50,48,228,221,+0,216,80,224,204,8,224,68,1,2,46,46,46,227,156,1,96,229,195,102,+160,0,0,89,238,231,0,121,131,125,249,0,53,204,12,225,168,9,10,110,+100,32,111,102,32,105,110,112,117,116,64,191,165,113,224,35,4,2,115,116,+114,65,5,160,190,128,34,96,121,198,53,97,167,129,134,139,92,232,210,6,+193,205,246,198,10,64,189,0,53,102,226,64,68,166,194,97,179,107,82,96,+8,86,193,233,185,76,3,49,56,58,52,211,5,228,176,3,122,145,0,55,+65,134,69,193,192,194,249,230,5,96,36,64,48,96,39,230,161,2,109,176,+79,73,128,60,238,88,0,0,67,103,9,0,52,74,161,106,27,193,22,128,+228,234,173,3,225,157,13,128,167,228,33,0,107,24,142,94,255,16,4,223,+101,1,95,55,64,171,194,80,224,82,2,203,144,0,97,225,208,0,71,112,+163,174,225,189,7,110,120,235,226,1,224,70,1,3,98,105,110,100,160,145,+224,125,2,65,201,66,98,224,17,2,0,57,191,231,224,143,15,224,132,3,+5,32,104,97,115,32,110,83,116,3,110,97,108,32,198,132,65,152,224,150,+41,236,231,5,97,45,207,126,130,129,0,83,66,121,161,177,191,101,78,130,+96,15,238,133,8,0,58,64,200,175,109,0,50,79,37,64,57,237,54,8,+98,41,128,93,237,141,2,165,104,224,192,3,92,16,106,53,224,213,9,224,+181,2,224,225,12,225,191,14,0,44,109,64,0,39,231,184,0,224,152,14,+134,13,224,138,4,163,124,224,27,12,132,148,224,27,12,1,49,48,115,150,+224,28,14,145,95,224,28,15,99,80,224,28,15,229,252,0,224,28,11,224,+144,18,97,83,224,27,14,131,194,224,27,14,97,107,224,83,14,192,55,101,+77,0,83,198,56,224,157,15,209,110,224,28,11,237,154,0,64,24,1,54,+48,138,252,239,60,2,229,153,8,18,117,110,114,101,99,111,103,110,105,115,+101,100,32,101,115,99,97,112,101,240,45,1,1,105,110,225,253,4,3,58,+32,92,92,97,249,233,106,2,207,192,224,137,7,81,129,224,27,16,97,124,+224,27,14,241,103,0,224,27,10,97,151,224,27,14,97,95,224,27,13,83,+17,224,27,16,97,77,224,27,14,97,235,224,27,14,224,195,18,84,243,224,+27,15,0,56,224,83,18,119,222,224,27,15,97,79,228,164,9,117,50,230,+184,77,5,51,48,56,58,49,52,163,234,80,215,227,233,5,224,137,8,66,+197,229,197,24,196,119,0,35,130,198,224,37,2,4,39,92,92,86,84,196,+89,224,110,26,107,124,224,110,32,146,58,224,110,5,1,85,83,229,252,1,+2,95,55,51,64,43,224,4,15,224,140,22,152,47,230,193,33,224,67,12,+116,43,225,63,33,128,185,224,86,25,224,154,28,224,86,1,168,134,225,237,+61,224,67,22,67,39,224,154,33,99,57,224,242,28,226,26,37,0,49,138,+6,224,174,25,225,228,59,224,242,38,224,243,32,100,31,224,156,54,101,151,+224,156,34,236,221,0,227,174,27,69,131,227,174,34,128,248,227,174,4,4,+83,79,72,39,32,96,7,128,6,1,84,88,128,7,0,73,128,6,1,89,+78,128,7,5,85,66,39,32,111,114,96,10,0,80,232,168,0,228,79,73,+148,60,224,160,4,0,82,228,79,8,225,180,90,102,136,224,183,33,212,243,+225,17,26,103,194,224,157,55,224,67,28,226,82,1,196,213,225,87,4,2,+78,85,76,193,210,2,78,65,75,225,211,34,103,248,228,8,34,225,211,10,+1,76,70,230,146,34,231,1,37,140,51,224,109,4,0,72,231,0,81,64,+4,224,110,7,0,71,226,176,39,225,80,39,164,190,224,204,73,141,66,224,+204,4,1,70,70,194,36,0,70,224,214,0,231,216,20,225,205,60,224,67,+22,229,238,37,180,212,231,211,62,226,172,68,241,250,0,224,155,24,224,242,+28,224,155,22,68,6,224,155,33,167,191,224,243,63,229,21,22,231,36,38,+193,211,225,56,25,76,249,224,88,34,192,245,227,92,63,224,246,22,224,157,+38,218,79,224,39,1,2,111,110,101,82,101,3,39,92,92,69,167,185,2,+69,79,84,128,7,1,78,81,128,7,1,84,66,128,7,0,77,195,201,2,+69,83,67,227,202,13,224,173,23,233,170,59,225,232,37,0,49,224,242,0,+224,88,61,224,224,59,224,156,1,233,170,35,225,234,28,229,75,37,0,52,+224,174,38,129,74,224,85,23,125,192,224,85,34,181,14,224,86,24,228,125,+37,0,49,179,251,224,86,24,237,223,37,145,201,64,0,224,40,1,4,39,+92,92,68,69,233,11,0,2,68,76,69,224,10,0,6,67,91,49,46,46,+52,93,227,44,8,228,25,23,238,115,38,164,204,234,59,94,237,43,38,198,+162,225,47,4,1,67,82,193,35,2,67,65,78,225,30,39,228,70,106,196,+68,233,51,73,233,50,10,0,66,226,76,1,0,66,233,51,1,228,33,62,+225,23,23,236,25,37,196,192,224,191,4,1,65,67,236,13,1,153,38,4,+56,32,64,95,53,65,24,2,95,55,53,90,245,90,217,224,29,13,64,136,+192,29,217,100,224,31,0,121,49,64,153,64,123,96,30,0,53,121,61,212,+246,3,95,55,53,54,224,63,2,224,236,8,85,126,92,77,0,49,88,147,+0,67,95,13,64,140,110,51,1,35,54,119,37,3,32,95,55,56,224,18,+0,0,57,103,203,245,169,22,248,194,4,4,99,116,114,108,45,181,174,8,+109,97,108,102,111,114,109,101,100,85,159,1,92,94,97,16,245,161,3,124,+158,224,203,2,96,225,64,224,5,49,57,55,32,95,57,98,159,0,51,64,+223,96,5,128,159,160,0,225,128,2,186,98,224,17,3,128,40,224,17,2,+151,28,228,49,4,129,33,224,35,3,224,34,8,132,84,224,17,3,132,250,+224,17,3,224,88,8,130,205,227,56,9,224,234,2,157,153,67,231,225,90,+6,252,156,7,216,235,225,97,4,162,87,0,58,122,109,1,10,65,117,120,+0,83,66,195,0,55,70,31,224,61,1,6,100,101,99,105,109,97,108,129,+117,97,84,0,56,64,111,158,11,65,122,87,221,192,15,1,95,49,129,234,+4,64,95,49,55,54,93,120,128,12,151,239,1,95,55,70,34,0,58,66,+90,185,244,0,55,67,41,185,233,156,51,154,215,91,153,0,58,98,146,224,+152,18,2,111,99,116,224,150,46,161,91,0,53,122,147,224,149,0,0,52,+224,109,20,2,104,101,120,225,2,45,131,216,1,95,55,135,204,192,108,0,+51,96,108,120,197,97,28,227,80,4,227,58,1,154,87,227,76,5,186,50,+64,164,224,49,11,102,153,224,49,5,152,31,2,95,51,54,226,21,3,16,+92,34,46,47,108,105,98,47,68,97,116,97,47,67,104,97,114,189,205,4,+55,51,58,51,57,159,92,226,4,2,95,182,3,84,111,73,110,189,63,227,+93,12,224,16,0,163,103,64,136,194,2,224,49,28,96,236,224,49,21,96,+39,157,247,0,58,97,75,65,178,0,39,127,2,191,67,67,4,221,189,64,+0,128,27,64,5,228,196,1,100,241,0,52,67,72,65,60,68,211,172,108,+159,123,228,80,4,184,177,95,155,3,66,32,66,39,96,5,3,32,95,53,+54,65,132,224,117,0,255,134,0,128,7,88,218,0,48,96,198,128,28,3,+67,32,95,54,197,74,226,55,24,160,134,1,95,50,97,8,67,217,99,223,+0,50,68,213,2,66,32,80,197,150,224,71,27,160,76,70,152,100,204,229,+115,8,1,94,42,228,28,0,108,190,5,114,32,109,111,114,101,97,252,254,+100,10,0,32,98,6,0,115,228,57,1,159,56,66,133,0,50,68,133,162,+202,192,14,226,207,38,226,203,35,64,124,158,135,171,163,225,204,0,97,203,+224,145,1,2,54,48,56,97,126,2,51,55,48,167,152,231,97,3,1,96,+95,231,93,0,230,224,2,66,94,230,171,22,0,69,254,62,0,10,110,32,+105,100,101,110,116,105,102,105,101,190,61,1,92,34,225,62,4,1,79,32,+102,72,220,77,1,58,55,76,43,96,184,1,50,51,132,245,1,95,49,123,+164,0,58,96,120,96,25,1,52,51,100,135,64,1,0,80,64,35,71,183,+130,141,197,225,0,55,97,13,2,95,55,51,105,35,130,236,0,58,97,0,+128,64,0,52,229,94,0,98,64,1,95,55,118,204,3,95,54,32,89,100,+223,4,83,32,73,32,64,95,130,128,4,162,39,192,50,99,122,98,117,0,+89,69,158,162,217,159,127,192,55,166,124,175,165,96,10,200,194,0,89,67,+1,2,39,32,80,225,69,24,9,102,97,105,108,101,100,32,116,111,32,123,+169,3,32,97,110,121,79,65,22,116,104,101,32,112,111,115,115,105,98,108,+101,32,99,104,111,105,99,101,115,58,94,42,97,85,99,184,1,48,32,121,+43,96,11,2,53,32,85,99,156,129,108,160,7,3,95,51,55,49,64,4,+0,51,64,174,225,240,2,192,69,65,49,160,68,128,13,173,144,129,4,2,+67,32,66,128,106,228,13,0,129,21,224,19,2,0,83,96,14,228,114,0,+128,2,128,20,224,55,2,225,47,4,224,26,3,0,90,161,52,192,38,128,+76,96,11,0,39,103,16,192,91,1,95,49,97,96,0,80,160,64,194,68,+226,49,1,0,54,167,74,0,89,132,151,74,218,157,241,132,244,193,16,64,+52,0,58,65,44,128,45,128,115,0,80,70,137,0,52,134,246,2,85,32,+58,66,117,166,148,0,39,64,2,96,59,0,49,196,88,0,75,96,68,1,+95,55,103,51,255,157,0,101,107,128,33,2,52,32,65,224,33,3,66,116,+225,237,5,3,73,110,32,97,255,122,0,193,137,225,136,4,1,83,39,65,+121,101,109,99,135,0,49,194,125,69,142,224,135,12,161,31,64,137,0,52,+89,129,160,137,170,195,128,35,64,228,134,40,64,72,130,36,2,52,56,55,+224,80,13,0,58,96,117,128,43,3,54,32,95,52,121,167,227,14,0,133,+147,193,83,68,86,0,48,75,234,185,204,1,95,55,106,67,0,58,64,210,+129,72,0,85,193,142,2,90,32,90,69,133,2,52,52,52,236,37,5,198,+237,131,46,234,212,0,0,90,162,210,64,220,160,85,96,0,0,58,96,11,+97,174,0,75,96,228,0,58,97,127,96,16,0,73,65,205,64,196,68,0,+203,218,97,21,132,37,101,24,1,95,52,199,59,1,51,54,225,18,0,235,+218,5,64,237,3,83,32,64,82,227,186,3,225,196,1,159,62,8,115,97,+116,105,115,102,121,58,32,131,193,236,204,7,96,95,130,107,99,58,100,195,+0,53,161,11,224,75,1,6,82,97,110,32,111,117,116,67,242,10,105,110,+112,117,116,32,40,69,79,70,41,197,60,138,15,64,73,130,161,2,95,52,+55,64,95,68,247,224,153,12,0,110,164,69,162,86,101,253,1,52,56,64,+219,133,35,1,52,56,69,110,96,11,0,58,96,6,163,9,228,242,1,0,+83,202,139,67,200,227,191,9,99,182,99,185,98,94,0,58,96,98,64,152,+1,54,51,193,65,234,210,0,229,25,0,0,58,96,165,64,37,97,28,134,+89,224,35,1,96,226,129,235,232,155,0,224,14,6,130,253,232,140,1,1,+95,49,72,221,133,254,0,50,97,6,128,10,96,233,64,10,0,58,96,6,+64,114,192,18,224,230,5,229,217,9,0,67,162,125,70,100,195,78,229,206,+1,2,95,52,56,102,64,102,126,1,51,57,224,103,2,64,18,64,103,0,+51,225,72,3,136,176,142,111,178,230,0,57,160,250,64,50,166,226,0,51,+68,97,224,122,1,134,75,108,0,128,130,160,80,140,54,224,74,7,64,11,+0,58,96,6,2,10,65,32,67,90,0,85,128,16,194,210,0,90,128,242,+65,171,69,57,0,58,96,82,161,238,64,20,224,28,6,130,95,2,73,32,+58,96,192,97,209,64,101,0,49,67,80,94,160,108,21,0,80,66,24,0,+80,79,63,72,81,160,183,2,95,53,48,132,134,192,45,129,235,66,66,234,+23,0,230,37,5,96,197,129,120,132,237,138,47,166,60,0,83,160,58,0,+64,96,18,224,5,4,230,113,6,160,60,230,145,2,230,127,14,129,195,224,+35,1,224,116,2,194,229,224,114,0,75,145,243,207,2,180,78,224,73,2,+160,46,102,89,240,237,5,175,25,192,160,162,198,134,35,0,49,64,73,64,+46,100,206,64,5,96,91,198,169,2,64,64,79,68,203,198,219,224,174,92,+107,246,224,174,70,224,109,17,192,154,224,42,0,224,118,44,135,212,66,118,+128,30,2,79,32,35,71,254,224,136,5,224,238,20,128,115,0,82,64,107,+64,16,224,199,4,98,147,0,39,96,2,99,151,98,222,128,39,224,120,24,+224,255,1,64,1,0,89,192,23,226,245,1,226,178,5,224,48,4,72,235,+224,66,6,200,237,224,63,9,70,215,245,6,0,161,222,192,182,3,95,51,+57,50,64,239,224,98,8,1,95,52,69,49,72,2,224,24,7,232,159,5,+23,87,97,114,110,105,110,103,58,32,67,97,110,39,116,32,102,105,110,100,+32,102,105,108,101,203,208,224,60,3,237,81,0,224,19,2,224,78,6,19,+92,34,32,105,110,32,100,105,114,101,99,116,111,114,105,101,115,94,42,94,+134,220,225,168,1,64,2,192,72,160,68,0,54,135,237,192,13,1,52,48,+237,173,4,224,65,0,225,144,20,224,139,8,15,94,42,32,32,65,115,107,+101,100,32,102,111,114,32,98,121,143,222,4,64,95,49,54,51,72,227,170,+220,192,58,65,70,168,8,98,4,235,80,18,6,109,105,115,115,105,110,103,+97,39,160,84,0,64,224,43,5,224,148,2,207,135,161,203,70,226,133,242,+0,54,141,212,129,20,67,12,109,176,64,26,224,39,5,0,55,137,189,224,+163,3,235,26,0,160,63,70,53,0,49,104,106,160,185,192,87,128,12,1,+95,55,113,143,169,91,131,23,160,19,128,0,113,83,68,95,1,95,52,71,+184,170,95,64,200,64,39,0,57,101,228,135,93,0,85,102,121,0,90,64,+111,131,222,0,58,96,31,198,62,96,128,0,54,235,144,0,75,27,106,80,+1,52,57,96,31,96,222,238,151,15,2,92,92,47,161,230,204,153,0,58,+96,100,2,10,65,32,109,91,97,249,129,75,228,49,0,97,206,64,105,0,+58,96,50,1,10,65,224,122,0,224,210,1,229,175,7,97,46,170,100,129,+3,225,24,12,0,58,96,7,96,81,0,58,65,92,166,226,225,152,1,80,+222,0,55,74,98,0,54,81,163,97,180,0,55,71,37,168,199,64,35,3,+95,55,48,57,226,144,2,15,85,84,70,45,56,47,47,82,79,85,78,68,+84,82,73,80,128,238,135,52,227,228,1,0,95,160,154,98,159,1,95,54,+120,173,0,58,98,4,204,243,132,83,1,95,55,139,150,161,232,226,47,2,+101,58,231,139,1,64,34,115,220,97,9,0,55,65,3,2,95,56,50,146,+97,0,35,165,102,226,133,1,103,141,224,42,2,65,174,81,105,6,35,50,+48,57,53,49,48,64,98,3,35,53,53,50,114,158,236,168,0,224,124,0,+0,52,99,200,226,173,6,225,111,0,0,53,119,133,130,113,76,24,64,212,+1,95,52,65,92,244,115,3,20,71,101,116,67,111,110,116,101,110,116,115,+58,32,115,117,114,114,111,103,97,116,138,225,129,102,193,42,129,28,225,60,+3,65,147,86,233,1,95,55,118,91,224,131,0,227,143,0,0,58,97,87,+4,10,65,32,75,51,70,7,0,58,96,39,7,10,65,32,94,103,101,116,+98,65,232,170,183,6,52,48,49,32,79,32,95,144,202,1,95,52,81,172,+170,255,65,116,181,49,129,37,0,49,66,220,226,204,7,225,234,12,244,139,+14,8,83,121,115,116,101,109,47,73,79,148,139,4,56,56,58,50,48,244,+138,7,20,117,110,107,110,111,119,110,32,116,101,120,116,32,101,110,99,111,+100,105,110,103,236,129,2,98,109,76,221,1,64,58,66,115,130,172,68,22,+0,48,75,255,105,175,96,15,64,166,1,95,52,107,54,137,196,0,58,98,+179,96,242,0,56,108,178,65,225,2,95,55,48,164,0,135,160,0,85,64,+23,160,92,131,102,3,85,32,75,50,110,250,0,58,96,24,107,119,0,51,+75,17,0,85,184,132,64,139,64,13,100,2,0,49,180,7,1,95,49,116,+164,96,92,2,95,49,52,75,199,96,11,0,58,96,6,96,132,4,57,32,+95,51,54,229,254,3,66,10,19,114,111,108,46,69,120,99,101,112,116,105,+111,110,46,73,110,116,101,114,110,151,5,224,39,1,3,83,111,109,101,224,+35,0,97,25,0,58,96,203,99,52,96,251,0,54,101,92,167,232,169,80,+1,95,54,90,177,1,95,55,115,141,0,95,80,42,96,55,208,19,227,20,+2,64,171,2,32,64,35,244,223,2,224,22,3,96,223,224,22,9,103,126,+224,22,9,99,5,224,22,9,99,44,224,22,9,96,148,128,22,98,117,96,+20,99,126,1,95,49,84,1,0,54,93,82,2,95,54,55,217,131,96,19,+1,56,50,64,19,163,111,192,19,76,162,0,54,80,4,224,19,1,118,135,+0,54,116,160,224,19,7,217,140,224,19,3,224,99,4,96,19,0,55,149,+242,1,95,55,85,159,0,58,97,72,9,10,65,32,105,115,105,110,116,32,+58,96,20,131,109,0,58,96,40,64,11,66,58,1,64,58,96,75,64,14,+0,50,99,136,96,110,128,14,0,65,96,14,175,211,130,149,1,54,56,96,+226,0,56,109,141,2,54,57,52,160,124,64,11,0,53,224,11,0,1,49,+54,224,23,0,0,58,96,6,129,250,65,50,65,229,1,95,54,101,254,201,+222,98,170,132,168,0,54,150,114,135,249,246,81,1,130,180,224,15,7,96,+92,237,89,1,2,95,52,54,192,89,64,141,0,51,96,187,130,118,2,80,+32,58,96,16,224,198,2,0,57,111,199,0,57,64,72,3,95,49,52,51,+224,147,1,0,54,97,79,160,11,96,198,64,11,0,58,96,6,227,92,36,+224,92,0,0,48,192,11,0,58,96,6,227,92,57,4,65,115,121,110,99,+227,97,6,96,208,192,159,0,75,213,186,2,49,51,53,224,99,2,13,115,+116,97,99,107,32,111,118,101,114,102,108,111,119,169,130,224,33,4,3,104,+101,97,112,224,32,5,224,33,7,9,116,104,114,101,97,100,32,107,105,108,+241,120,2,224,33,4,5,117,115,101,114,32,105,64,188,2,114,117,112,185,+175,193,18,130,54,129,18,96,11,0,58,96,6,225,18,53,225,14,12,66,+166,97,249,67,226,82,155,99,109,226,199,3,69,93,1,54,56,165,0,66,+0,67,148,194,0,192,11,66,0,96,11,0,58,96,6,193,96,2,95,52,+48,66,108,96,61,0,85,244,177,1,2,67,32,60,164,83,232,244,0,128,+18,135,17,164,233,128,18,128,58,224,197,1,25,82,97,116,105,111,32,104,+97,115,32,122,101,114,111,32,100,101,110,111,109,105,110,97,116,111,114,129,+66,224,43,3,64,28,0,114,221,20,224,26,6,7,105,118,105,100,101,32,+98,121,96,70,160,32,224,141,6,66,139,224,141,6,66,227,224,70,3,3,+108,111,115,115,83,24,5,112,114,101,99,105,115,193,86,224,34,4,13,97,+114,105,116,104,109,101,116,105,99,32,117,110,100,226,50,3,224,38,15,226,+88,5,226,8,1,102,120,96,6,226,8,54,64,106,226,8,8,241,94,0,+101,131,226,1,3,100,2,0,56,228,2,2,69,170,226,1,0,228,2,2,+96,11,0,58,96,6,227,98,1,85,92,227,26,11,3,98,108,111,99,76,+234,11,105,110,100,101,102,105,110,105,116,101,108,121,77,138,11,97,110,32,+77,86,97,114,32,111,112,101,114,65,235,161,82,227,26,0,228,45,2,96,+11,0,58,96,6,225,17,53,0,66,128,139,0,73,224,138,2,1,79,110,+64,133,193,28,132,52,65,28,70,180,225,28,2,0,55,102,101,0,55,107,+135,129,28,70,219,193,28,192,11,65,28,96,11,0,58,96,6,225,28,52,+10,83,84,77,32,116,114,97,110,115,97,99,225,29,9,192,136,65,29,96,+11,0,58,96,6,225,29,74,2,83,84,77,161,28,65,2,201,96,118,236,+104,161,7,10,65,32,99,97,116,99,104,65,50,130,90,172,54,235,122,0,+76,135,77,93,142,190,0,54,78,141,0,54,75,192,224,120,1,6,111,112,+101,110,70,105,108,182,43,235,158,1,0,58,108,198,132,182,0,49,164,182,+64,57,166,225,112,75,168,200,112,118,155,162,3,95,52,49,51,209,83,64,+167,135,35,199,91,209,218,253,135,3,239,158,6,207,57,96,128,244,66,0,+237,95,5,64,209,173,95,70,87,202,232,0,49,123,249,235,248,3,140,10,+224,33,2,123,123,96,90,203,175,237,2,1,0,54,96,165,0,95,126,254,+92,21,253,56,0,224,32,6,88,209,224,19,8,167,233,0,54,136,126,0,+54,105,36,224,119,0,79,50,0,58,96,138,96,114,1,95,52,74,73,3,+95,54,54,55,65,83,64,43,76,106,7,102,108,117,115,104,98,32,58,96,+22,190,73,240,22,2,65,54,238,19,7,104,198,138,1,192,5,87,183,64,+4,64,114,64,3,224,131,4,224,13,6,237,53,7,0,48,96,234,0,54,+94,183,1,95,54,168,62,237,58,0,0,54,126,127,64,175,0,54,96,158,+1,75,51,137,145,64,22,96,213,0,66,88,16,118,75,96,51,138,98,0,+58,96,60,128,245,2,54,54,50,139,41,0,58,96,29,9,10,65,32,65,+46,119,114,105,116,101,64,243,173,111,4,99,108,111,115,101,97,4,129,250,+144,88,2,95,54,53,67,107,2,53,57,32,139,104,96,87,129,192,9,116,+111,70,117,110,80,116,114,32,58,64,30,128,50,0,75,64,50,0,51,73,+141,64,40,65,56,67,154,1,54,57,130,181,119,49,139,249,64,233,224,9,+1,96,29,119,211,147,56,161,224,92,9,163,253,0,52,67,253,97,240,0,+58,96,6,99,241,1,48,48,64,123,225,20,0,1,58,54,66,151,129,191,+225,194,4,2,64,95,54,76,72,64,101,226,180,4,180,86,64,23,226,232,+4,114,241,0,54,160,37,0,54,144,132,0,54,154,177,211,17,3,49,57,+32,95,78,120,163,84,207,120,88,188,1,54,53,102,50,1,54,53,160,189,+0,58,99,52,174,161,0,80,142,194,0,95,111,149,160,5,110,204,0,58,+96,47,237,27,0,239,195,4,0,54,95,171,128,122,226,55,5,129,155,130,+46,224,55,10,121,31,224,177,0,228,94,0,162,178,0,95,163,145,64,122,+130,3,14,73,79,46,112,101,114,102,111,114,109,73,79,32,94,38,162,17,+64,31,130,18,4,102,112,102,105,110,65,102,130,0,6,102,112,110,101,119,+32,58,96,157,66,65,7,97,100,100,95,70,73,76,69,64,18,163,89,64,+18,3,117,116,102,56,64,18,129,181,107,160,118,80,76,157,65,102,97,26,+227,74,0,229,68,7,196,227,1,95,50,114,5,96,31,126,80,125,6,160,+18,155,50,99,128,104,227,146,210,0,49,80,42,1,35,49,80,211,144,110,+224,21,4,0,57,224,21,10,76,227,224,20,5,229,29,1,1,119,43,198,+138,0,54,93,155,105,77,228,192,1,98,170,1,95,54,94,198,244,188,4,+194,31,226,117,9,244,154,0,0,58,98,156,103,51,1,49,54,99,102,0,+58,96,71,163,57,193,213,112,217,97,235,1,95,54,100,243,192,6,131,27,+96,128,0,58,96,6,99,155,0,73,77,237,96,33,100,225,70,106,64,15,+222,85,255,161,0,175,138,147,188,255,192,10,161,126,65,129,179,224,224,47,+2,130,61,190,103,3,95,51,54,55,212,223,148,2,118,68,100,23,132,156,+245,118,0,67,236,162,210,229,65,0,1,95,52,66,133,178,254,65,87,1,+48,48,147,17,192,19,1,58,54,254,100,0,0,75,127,93,191,234,64,24,+164,17,0,53,66,55,0,53,65,106,0,54,113,122,2,95,53,49,65,156,+128,11,1,54,50,179,98,3,95,54,50,52,160,90,93,195,78,136,145,168,+96,6,191,116,96,198,0,53,111,66,64,34,128,22,3,66,32,95,53,91,+222,0,66,99,132,0,53,79,63,8,95,54,50,57,32,95,53,57,50,86,+254,77,215,178,217,67,168,0,53,65,36,0,80,64,165,167,32,142,184,96,+247,124,248,66,171,245,68,1,98,245,96,84,64,184,221,131,224,23,4,160,+76,131,185,227,214,0,128,27,214,37,192,24,192,52,1,95,54,92,15,128,+21,92,161,129,132,143,135,1,61,61,171,244,158,203,0,54,87,131,226,242,+1,2,98,105,110,173,219,224,61,1,163,163,224,9,1,128,12,196,156,163,+131,98,174,99,81,0,51,243,235,1,161,253,231,51,1,224,40,3,64,6,+128,40,1,95,53,150,108,0,64,98,134,128,12,225,56,0,224,239,1,194,+160,243,238,3,160,0,0,58,97,189,99,63,95,19,96,46,68,119,79,187,+70,210,128,234,102,105,64,43,172,14,96,43,0,52,66,22,0,75,64,7,+2,51,32,95,89,175,112,138,96,38,131,74,80,67,191,75,111,238,0,58,+64,77,162,52,0,53,69,200,1,95,54,94,92,0,58,66,22,160,22,0,+48,160,86,1,95,53,115,91,161,155,128,18,0,54,161,231,100,245,1,51,+57,87,154,145,250,228,89,0,158,114,1,95,53,183,4,96,93,196,26,71,+249,129,116,220,166,238,123,2,224,25,13,98,33,158,244,217,2,160,25,96,+95,97,228,0,85,226,31,5,143,3,162,192,233,200,0,160,43,96,131,226,+80,6,175,76,224,80,1,192,202,96,17,96,0,224,129,12,169,89,224,85,+14,133,78,224,85,8,225,254,8,224,64,16,101,162,224,64,26,224,157,1,+239,46,8,224,183,13,98,73,224,118,16,165,164,224,183,49,101,243,224,183,+27,224,65,16,100,82,224,65,9,224,60,4,166,71,98,110,0,58,96,6,+226,101,0,199,83,130,166,66,173,229,203,0,199,138,0,49,137,37,96,86,+120,165,192,12,96,165,160,17,1,64,75,76,160,128,134,230,88,2,109,89,+224,23,0,228,87,6,192,38,192,124,196,69,128,8,105,230,158,86,134,74,+164,80,128,0,224,164,6,153,70,224,44,2,96,15,105,227,198,205,194,168,+3,53,32,95,53,156,13,196,96,192,194,193,38,134,48,64,6,218,4,165,+172,76,107,129,122,65,52,115,124,102,21,224,224,1,128,146,67,74,128,17,+224,178,0,96,91,96,86,198,112,117,17,227,91,9,165,33,192,31,107,226,+120,72,224,24,0,230,25,7,182,59,64,91,213,11,128,36,174,19,2,95,+53,52,69,41,80,8,4,64,95,50,56,51,69,122,0,50,70,253,160,19,+234,53,0,172,248,96,14,117,156,128,66,224,63,2,5,95,49,55,54,32,+35,75,28,65,241,206,145,224,10,3,0,58,96,172,231,81,4,230,179,14,+131,102,0,83,193,246,159,185,161,248,97,215,228,29,4,160,27,97,22,226,+40,0,226,21,1,227,49,3,70,113,0,53,230,154,5,231,49,11,96,235,+231,127,2,225,90,10,0,56,162,24,0,64,189,159,0,58,72,103,99,59,+70,14,1,95,54,93,167,0,58,96,80,64,19,230,11,5,133,254,0,58,+96,35,96,49,72,152,0,53,125,241,128,10,119,101,128,10,118,169,160,10,+97,234,128,10,224,32,0,0,54,108,142,0,54,190,5,64,135,222,7,0,+53,95,57,0,54,91,102,1,95,54,66,31,0,58,96,36,138,112,224,142,+0,1,51,57,161,179,230,158,4,160,58,105,210,0,50,192,20,237,55,3,+224,43,9,64,214,224,43,9,161,152,224,25,1,224,18,1,0,54,157,30,+1,95,54,222,255,0,58,96,165,162,30,0,90,225,251,0,159,100,0,58,+96,38,224,188,6,129,54,0,51,64,193,101,44,96,11,125,167,98,117,224,+40,5,224,55,11,122,103,160,10,101,19,224,217,5,1,56,49,194,208,224,+196,7,204,118,229,80,3,160,77,93,209,227,60,0,224,68,6,224,66,2,+238,65,0,0,58,97,59,225,150,7,64,145,64,38,224,199,5,225,173,4,+224,74,12,169,0,224,74,7,64,31,224,74,6,0,53,104,67,224,18,1,+128,94,224,233,8,225,171,2,1,95,54,146,126,128,105,227,202,1,65,171,+0,80,98,95,210,172,1,80,32,182,224,64,20,163,2,224,123,3,0,50,+101,193,113,234,1,95,54,92,183,225,73,6,144,73,225,141,6,1,57,52,+224,53,4,0,56,96,53,2,51,55,48,253,244,9,1,95,39,234,190,3,+224,205,9,93,152,235,54,1,0,58,99,66,192,183,64,73,96,183,189,189,+82,151,1,95,50,99,155,0,54,125,169,224,185,6,1,95,51,80,137,64,+47,131,92,64,147,79,25,248,21,6,68,167,224,18,6,106,1,232,107,6,+65,219,232,4,5,231,195,2,233,133,2,224,10,2,125,28,224,66,1,65,+233,224,29,1,233,73,15,233,208,4,224,151,6,65,227,248,31,6,129,20,+192,50,224,60,2,224,39,6,64,20,224,39,12,65,31,179,100,225,79,1,+0,53,110,12,225,79,3,128,5,65,150,0,58,97,92,225,127,7,105,202,+0,54,94,77,0,58,96,38,211,180,71,221,2,95,55,56,64,40,125,147,+64,65,93,160,192,17,1,64,35,69,70,64,52,243,27,0,225,164,11,96,+249,233,195,14,224,244,3,233,99,14,224,34,2,0,58,96,171,160,190,224,+137,5,0,49,150,204,0,54,141,240,0,54,142,106,189,173,224,204,11,108,+23,224,66,6,115,46,0,58,96,59,224,205,2,234,61,15,224,151,1,0,+58,96,117,225,0,22,224,18,5,65,114,250,206,11,226,88,25,224,10,13,+226,49,31,0,58,98,29,228,56,6,94,100,0,53,99,201,161,87,99,254,+235,17,3,0,79,246,216,2,1,46,46,68,6,224,17,3,1,58,58,128,+17,2,79,32,35,84,238,72,6,96,12,78,33,224,12,0,0,49,73,42,+128,13,224,57,1,1,60,45,224,75,7,1,45,62,224,75,1,224,48,0,+96,62,110,74,224,44,5,0,61,96,44,200,118,128,0,229,195,5,0,53,+141,255,224,20,7,101,112,0,58,103,239,196,161,65,109,68,161,96,49,161,+203,229,5,11,22,33,64,35,36,37,38,63,43,46,47,60,61,62,63,92,+92,92,94,92,124,58,45,126,64,136,0,58,97,68,142,166,225,94,2,67,+29,174,62,0,82,79,130,64,131,170,222,230,38,3,95,86,229,89,8,229,+78,1,65,165,224,91,10,64,156,208,255,171,229,135,224,73,230,242,36,2,+75,244,98,39,232,60,1,224,161,6,128,24,70,117,98,133,230,196,4,224,+151,17,208,69,96,23,129,137,0,58,96,202,230,156,9,1,95,53,127,176,+224,72,4,74,177,65,141,2,67,32,79,224,62,2,199,4,1,80,32,189,+67,64,20,131,203,225,150,15,8,44,59,40,41,91,93,123,125,96,161,136,+231,30,10,2,51,32,35,121,168,2,75,32,89,225,1,6,0,89,96,238,+72,192,0,64,234,83,1,224,58,6,98,51,231,236,5,65,54,65,104,231,+100,2,0,35,83,85,145,139,0,52,72,30,161,238,234,169,7,224,91,15,+193,23,152,214,225,91,4,224,18,1,0,53,127,59,161,148,146,131,132,72,+129,220,204,89,249,243,1,0,53,85,45,136,2,97,0,225,131,10,1,56,+57,80,168,195,73,130,54,96,6,0,95,97,10,225,236,0,0,95,141,18,+0,58,107,64,193,163,132,109,1,64,58,96,69,225,117,11,70,144,225,58,+5,64,194,0,85,96,179,151,130,162,86,97,150,2,53,50,56,64,4,244,+210,0,128,200,224,201,8,96,31,235,96,7,192,109,121,194,227,243,4,0,+56,171,58,96,189,76,9,192,189,69,251,128,189,175,165,225,225,10,233,72,+7,64,143,224,95,4,0,67,124,150,206,148,224,66,3,235,36,6,226,51,+11,166,139,224,20,6,130,72,224,20,5,0,49,70,209,224,21,9,136,224,+224,21,8,102,81,224,21,8,128,174,224,21,7,224,109,11,96,230,226,224,+8,128,85,225,17,4,129,115,194,235,225,21,0,193,163,224,17,3,207,155,+224,17,0,133,139,224,17,3,140,193,224,35,4,224,34,8,102,149,224,17,+4,140,26,224,17,3,224,88,8,139,206,224,16,2,130,18,225,163,8,77,+122,107,201,224,95,8,229,21,5,108,133,220,124,128,18,226,190,5,168,95,+0,53,94,244,80,8,66,189,112,6,7,51,53,53,32,95,50,56,55,67,+121,128,166,227,147,11,78,99,80,107,183,93,224,171,13,68,62,132,213,226,+102,23,71,79,224,20,9,137,212,224,20,6,226,35,11,93,206,224,20,9,+226,55,11,110,43,224,20,7,114,0,224,20,8,65,234,224,20,8,226,118,+11,95,195,224,20,9,224,209,11,0,55,224,209,11,97,129,224,20,8,224,+209,11,0,55,224,209,11,0,55,224,209,11,110,141,224,20,8,224,209,11,+97,227,224,20,8,224,209,11,0,56,224,209,11,0,56,224,209,11,102,4,+224,20,8,224,209,11,68,236,224,20,9,224,209,11,107,206,224,20,8,224,+209,11,228,26,12,71,183,224,20,9,228,47,11,110,137,228,47,10,227,249,+8,157,116,224,17,3,134,23,224,17,4,227,215,8,151,229,224,17,4,197,+152,224,17,1,134,210,224,17,3,228,155,8,64,171,224,17,6,228,84,8,+146,220,224,17,4,228,138,9,228,192,9,224,179,8,185,166,224,17,3,224,+179,8,80,210,224,17,6,224,179,8,229,26,10,229,97,26,229,62,9,224,+178,8,229,61,15,224,16,1,224,175,8,224,174,8,224,173,8,225,96,9,+224,153,8,224,16,7,128,169,101,125,2,52,32,79,179,144,233,95,1,1,+56,53,236,32,2,2,83,79,72,112,179,224,79,7,224,47,17,224,46,8,+128,178,0,79,224,98,16,2,78,85,76,224,51,7,96,161,224,49,17,2,+83,84,88,224,49,7,96,245,224,49,17,0,69,224,49,9,173,150,224,49,+16,1,79,84,224,49,7,96,200,224,49,18,1,78,81,224,49,7,97,190,+224,49,17,2,65,67,75,224,49,7,98,1,224,49,17,1,66,69,225,43,+8,98,68,224,49,18,0,83,224,48,7,98,134,224,48,17,0,72,224,247,+8,98,200,224,48,17,1,76,70,225,242,8,225,191,22,0,86,224,98,8,+131,79,224,49,17,0,70,224,99,9,225,241,22,1,67,82,224,49,8,225,+241,22,1,83,73,224,49,8,225,191,22,2,68,76,69,224,50,8,225,192,+22,2,68,67,49,224,50,8,225,193,22,2,68,67,50,224,50,8,225,195,+22,2,68,67,51,224,50,8,225,197,22,2,68,67,52,224,50,7,133,134,+224,50,17,1,78,65,226,190,8,133,203,225,99,18,1,89,78,224,50,8,+227,186,24,0,66,224,50,8,225,201,22,1,67,65,224,101,9,227,188,23,+0,77,224,49,8,225,252,22,1,83,85,224,151,9,225,252,22,2,69,83,+67,224,50,8,225,252,22,0,70,227,190,8,135,172,224,49,17,0,71,224,+49,9,225,250,22,0,82,224,49,8,136,52,224,49,17,0,85,224,49,9,+225,248,23,0,80,224,49,8,225,247,22,0,68,228,234,9,0,49,129,45,+242,174,5,224,0,17,238,95,11,245,247,0,111,64,242,13,13,1,83,39,+253,63,1,123,213,190,163,224,75,0,144,36,126,8,0,85,210,143,224,19,+0,188,8,112,67,233,177,2,201,172,143,162,242,61,14,82,59,64,0,80,+170,0,58,65,14,64,161,0,80,160,98,0,83,115,0,125,98,0,90,160,+4,112,95,145,117,71,203,192,217,146,60,79,116,77,110,1,50,52,118,212,+74,53,4,49,49,49,52,49,153,51,2,51,54,52,225,108,2,29,92,34,+46,47,108,105,98,47,68,97,116,97,47,67,104,97,114,46,104,115,92,34,+44,54,50,58,49,55,58,32,65,135,225,152,2,3,97,116,97,46,96,35,+21,99,104,114,58,32,105,110,118,97,108,105,100,32,99,111,100,101,112,111,+105,110,116,97,181,77,161,0,50,112,19,146,138,4,95,50,56,56,32,96,+19,150,153,96,9,224,142,1,0,58,109,197,214,105,238,31,2,249,250,13,+254,30,26,0,58,110,90,64,121,0,54,83,56,1,53,53,64,28,91,253,+1,95,53,77,156,1,95,53,89,30,1,95,53,77,147,75,91,107,95,1,+56,51,238,106,0,0,53,151,13,0,53,108,204,224,13,1,67,73,0,73,+96,214,189,34,0,49,117,232,77,175,0,79,113,198,66,155,0,58,96,39,+224,29,2,0,56,224,29,6,145,59,224,59,2,1,95,49,77,199,0,58,+96,102,96,178,110,243,125,97,64,24,1,95,53,77,209,1,95,53,77,194,+1,95,53,77,179,1,95,53,77,164,2,95,55,57,224,176,0,1,56,48,+192,10,0,58,96,6,83,233,158,109,224,5,2,160,78,145,101,163,12,128,+6,0,58,96,80,224,52,27,224,59,2,0,58,96,139,224,52,20,224,98,+2,160,59,0,58,96,198,224,52,27,224,112,2,0,58,97,1,116,189,0,+66,99,9,191,250,87,176,0,64,96,19,211,180,98,243,65,171,88,70,64,+6,139,117,96,35,131,155,67,178,88,203,64,20,160,38,98,47,64,123,97,+124,65,84,65,179,1,95,53,65,155,0,58,97,136,188,82,1,95,51,111,+49,128,31,0,58,96,31,192,148,243,242,2,228,54,0,66,183,96,106,132,+8,0,53,189,15,128,13,120,30,1,49,53,228,144,0,64,82,2,10,65,+32,84,68,226,26,2,96,25,218,162,96,84,99,252,0,66,66,242,226,64,+7,196,67,160,4,1,83,32,68,71,224,48,32,193,90,132,103,247,4,5,+224,208,1,1,67,39,69,72,244,225,4,224,238,4,112,165,2,95,53,53,+96,186,65,96,0,54,66,152,0,52,209,163,0,75,96,8,160,60,160,108,+128,111,165,23,160,114,215,141,64,88,192,25,160,121,224,115,22,224,113,5,+224,111,3,224,49,18,247,138,0,192,0,0,58,100,37,193,245,0,53,100,+67,127,71,181,97,4,54,51,32,95,49,83,139,3,95,50,49,48,119,83,+70,58,132,219,1,53,54,65,221,70,95,205,106,86,75,75,20,224,155,5,+0,58,96,119,129,242,2,52,32,75,70,36,0,58,64,59,128,118,0,89,+193,111,98,177,225,174,1,230,122,3,192,21,162,217,224,29,0,160,165,248,+98,2,0,58,64,177,128,88,1,80,32,229,252,19,3,76,105,115,116,133,+252,5,49,52,49,58,49,53,229,253,7,16,102,111,108,100,108,49,58,32,+101,109,112,116,121,32,108,105,115,197,239,0,53,90,185,0,58,65,41,224,+191,4,0,83,226,46,4,96,136,131,103,118,186,199,92,65,245,208,224,131,+18,97,58,248,212,1,192,234,119,169,163,202,134,44,64,227,1,95,49,114,+179,228,76,1,97,104,64,22,162,119,130,77,2,95,49,48,88,248,65,9,+98,155,1,54,49,224,13,0,96,152,188,131,228,145,3,227,183,2,133,200,+64,6,100,21,66,59,164,46,70,60,68,137,67,97,68,187,164,186,96,15,+64,9,200,118,2,95,49,52,69,216,96,77,0,58,96,6,96,110,66,79,+166,159,100,234,70,165,99,238,0,73,195,95,135,247,227,171,4,128,113,230,+97,2,97,35,228,53,1,96,209,64,79,100,159,128,255,0,64,227,115,0,+250,229,2,69,45,193,158,97,93,229,90,3,227,45,0,192,86,195,5,185,+50,129,39,131,192,128,15,133,81,131,36,1,53,49,224,155,0,68,9,0,+53,136,161,121,135,162,195,161,25,224,46,3,160,102,160,44,224,155,1,129,+239,224,184,7,224,134,15,229,218,0,224,137,8,192,90,224,134,27,224,181,+2,225,11,5,160,73,161,11,98,20,0,55,227,81,15,6,73,110,116,101,+103,101,114,96,7,3,114,110,97,108,131,93,2,53,55,58,142,9,0,58,+97,251,66,73,1,53,53,72,127,68,28,0,58,96,117,163,36,97,150,128,+238,254,164,0,98,254,96,23,198,76,67,52,164,110,225,238,0,64,41,228,+63,4,133,13,128,5,228,6,21,224,180,13,4,57,54,58,50,57,228,17,+7,19,105,109,112,111,115,115,105,98,108,101,58,32,120,115,32,62,61,32,+121,115,96,217,1,75,50,65,42,225,23,38,3,57,51,58,54,132,81,0,+64,97,203,130,141,128,245,226,146,0,227,251,3,2,85,32,65,129,201,227,+250,0,74,234,187,138,229,33,0,200,96,74,148,229,128,0,197,46,224,80,+12,99,4,224,80,8,97,236,96,69,97,185,197,83,99,164,102,159,66,35,+1,57,55,164,87,115,43,164,133,196,163,228,139,0,224,37,0,64,106,224,+14,3,228,166,2,1,95,49,104,111,96,107,169,0,164,16,97,211,231,205,+18,166,227,96,173,102,160,229,91,7,64,82,133,137,64,141,0,51,107,8,+255,1,0,131,75,163,84,129,117,200,201,0,52,169,157,102,91,160,120,202,+191,0,53,165,65,229,15,1,0,53,68,255,66,8,169,114,195,113,105,132,+132,25,231,155,1,227,196,1,163,226,69,1,157,182,107,155,1,50,52,227,+185,1,201,185,0,58,96,7,3,10,65,32,75,65,182,0,58,96,84,64,+13,2,50,32,58,96,114,96,25,0,75,96,25,0,54,163,102,101,210,131,+102,67,192,227,102,2,164,85,129,201,230,147,9,162,56,230,149,8,226,146,+15,97,89,64,110,162,61,231,175,1,100,158,107,205,201,25,226,234,45,224,+91,1,226,234,9,224,95,4,226,234,31,224,80,2,130,60,64,69,97,101,+200,151,226,234,1,130,216,226,215,0,133,31,231,97,2,224,12,4,0,58,+96,73,1,10,65,77,255,0,58,96,149,143,124,2,53,52,48,65,106,64,+78,109,193,64,40,232,32,1,139,235,71,241,0,89,64,68,128,125,232,84,+0,192,16,162,83,128,219,3,32,95,51,57,165,188,128,195,96,22,226,215,+0,161,2,108,36,128,74,192,7,96,174,225,94,1,104,30,224,65,2,110,+103,69,54,64,17,225,34,0,225,146,1,124,104,225,232,1,0,54,142,232,+64,206,204,62,240,104,8,196,9,238,239,0,160,123,233,252,1,162,145,238,+255,4,233,247,3,200,31,169,75,192,223,64,97,1,51,56,73,233,97,161,+240,180,0,224,69,14,193,86,240,147,10,160,27,112,152,64,92,163,167,2,+66,32,95,104,215,234,96,1,64,243,131,58,241,208,0,253,203,6,205,61,+164,65,241,80,5,0,58,111,233,193,245,225,176,1,236,34,1,167,238,163,+145,99,66,97,113,129,107,130,229,224,55,41,174,29,224,55,40,185,238,160,+56,161,123,192,68,224,53,17,128,236,3,95,52,53,54,231,21,2,15,118,+97,108,68,105,103,58,32,66,97,100,32,98,97,115,101,134,254,0,83,98,+202,73,193,64,9,99,178,68,207,127,15,0,50,83,160,1,35,57,156,171,+224,17,1,87,121,97,8,68,184,224,49,11,190,171,224,49,3,134,37,1,+95,49,74,116,98,33,74,150,235,43,0,147,58,198,173,145,147,0,51,106,+171,64,5,128,79,250,251,0,224,62,40,96,192,224,62,14,224,48,12,175,+204,100,152,0,51,97,75,101,162,1,53,51,64,230,224,194,10,224,68,22,+225,38,15,96,33,225,38,5,134,108,224,99,42,132,16,132,38,0,58,67,+148,162,228,224,116,27,64,79,64,52,204,15,78,102,114,182,224,134,38,0,+58,97,44,114,114,227,224,5,254,106,8,128,131,224,20,5,79,8,224,20,+8,147,182,224,21,7,255,229,12,0,49,120,71,254,192,7,127,83,254,192,+9,253,178,10,224,17,8,128,212,224,16,19,132,13,224,16,7,2,58,53,+51,135,238,228,235,8,142,16,227,191,3,182,2,196,137,128,23,192,35,134,+147,144,167,128,11,224,35,6,236,168,3,231,207,2,240,135,6,0,39,141,+213,230,148,4,96,66,100,77,227,66,3,189,195,166,19,97,76,128,86,70,+198,64,67,137,36,241,238,2,96,4,66,24,229,140,0,0,89,160,94,134,+234,65,136,135,189,1,57,56,128,100,0,95,230,179,1,128,104,247,152,2,+134,12,146,230,226,107,4,224,61,6,198,149,225,122,2,128,153,66,171,1,+52,57,106,208,65,118,0,56,206,162,224,23,0,193,144,96,25,1,95,52,+80,69,64,0,70,165,64,73,160,48,96,158,0,58,94,175,200,61,88,69,+226,86,2,64,28,0,51,231,110,11,101,139,97,179,0,82,215,177,230,127,+3,0,58,96,72,227,33,7,0,51,131,91,230,207,14,235,9,1,224,49,+0,153,55,1,58,53,64,24,119,185,93,207,118,47,64,25,64,94,1,52,+55,96,45,118,135,64,133,183,189,1,52,56,86,207,160,86,118,134,96,11,+0,58,96,6,132,48,73,33,0,53,89,0,64,146,1,51,57,80,102,0,+52,67,111,152,43,90,21,180,60,178,72,64,42,139,220,104,76,236,157,0,+0,53,65,39,233,248,1,96,17,106,213,152,75,106,21,168,220,107,80,90,+212,195,51,1,52,57,64,41,68,189,96,182,64,29,227,81,2,97,200,96,+29,1,52,55,97,203,98,53,0,58,96,42,161,174,3,49,56,32,35,73,+15,132,179,64,243,105,115,1,95,53,92,158,192,138,224,40,0,97,94,64,+234,1,95,52,137,210,96,77,225,223,4,96,63,1,95,53,100,98,105,54,+146,30,75,190,236,87,2,2,32,95,52,133,10,96,98,192,79,1,95,53,+157,224,128,86,129,255,0,85,65,62,111,32,0,58,64,40,97,179,1,53,+48,76,191,66,13,0,58,96,104,128,125,97,11,0,90,108,200,0,48,162,+67,64,196,228,94,3,160,156,128,101,203,99,138,91,226,178,2,64,33,103,+8,0,58,64,245,224,113,2,66,31,0,58,96,27,98,57,7,57,51,32,+95,56,32,95,52,82,166,64,23,129,151,192,157,0,52,96,43,247,195,0,+1,95,52,98,33,0,53,94,244,67,53,2,58,53,49,129,133,0,85,64,+221,134,140,64,27,192,203,96,44,75,127,1,58,53,95,89,235,233,0,164,+143,128,8,74,251,1,58,53,69,249,225,242,0,1,53,53,64,4,132,0,+128,203,0,48,115,29,71,211,243,75,4,66,134,2,66,32,80,98,90,64,+77,68,227,137,102,212,174,233,57,4,151,29,187,57,0,51,66,78,2,51,+55,51,118,207,204,155,128,42,234,128,2,224,245,0,226,91,7,64,214,132,+206,161,144,129,49,96,57,99,189,128,40,96,42,100,24,1,53,48,240,180,+3,19,80,114,101,108,117,100,101,46,114,101,97,100,58,32,110,111,32,112,+97,114,201,164,150,147,3,95,53,48,56,174,229,224,57,18,8,97,109,98,+105,103,117,111,117,115,224,64,3,1,64,58,97,48,2,10,65,32,66,74,+64,13,130,2,101,193,128,16,129,255,109,54,64,158,228,164,10,229,218,1,+151,61,166,76,226,249,6,235,223,11,156,112,229,173,7,0,58,97,28,226,+116,0,0,52,72,100,0,58,96,49,224,19,2,97,230,64,125,227,14,2,+0,95,128,40,227,74,0,0,50,97,238,0,58,97,129,96,183,163,121,228,+76,2,64,166,251,244,5,141,184,3,95,52,56,54,225,194,0,0,52,92,+60,128,11,0,58,96,6,64,76,96,179,0,53,97,218,163,139,196,43,144,+105,1,95,49,69,71,128,64,0,49,67,56,100,67,1,95,50,101,206,133,+105,70,189,160,86,96,18,133,105,250,41,0,102,173,98,166,224,18,7,1,+66,39,148,54,134,166,0,58,64,72,224,147,1,0,52,160,147,101,103,160,+135,128,218,160,135,113,71,128,135,128,10,224,181,0,0,58,96,6,225,42,+0,0,55,225,42,0,142,46,64,12,225,30,3,160,85,97,30,128,11,0,+58,96,6,64,64,0,51,229,178,3,173,175,0,55,160,158,64,64,0,57,+64,11,106,96,96,6,224,50,4,64,109,195,164,79,8,224,49,2,101,246,+96,6,5,10,65,32,73,32,58,96,44,192,10,239,213,0,1,52,57,68,+115,99,141,160,16,74,177,231,205,5,0,58,96,36,192,235,178,127,146,117,+178,123,246,231,1,164,108,171,34,0,52,82,248,232,68,0,160,27,138,122,+224,27,6,165,45,248,107,1,230,154,4,68,64,232,142,3,120,138,132,247,+1,95,52,95,125,161,115,176,127,64,23,132,192,164,175,120,208,227,108,1,+137,210,64,26,80,172,224,21,1,69,54,103,93,228,173,1,193,17,128,0,+224,24,1,161,214,169,5,97,214,96,11,0,58,96,6,129,74,167,251,1,+56,55,65,97,75,70,198,182,64,14,231,244,0,226,172,1,99,148,64,87,+64,25,0,80,166,64,128,227,105,102,1,95,52,113,161,0,58,96,241,232,+163,1,65,144,128,43,69,166,197,196,68,94,234,224,1,224,19,2,128,115,+214,115,224,32,2,224,9,10,65,59,150,191,225,213,0,232,53,7,133,231,+101,239,64,163,97,116,192,17,131,137,1,95,52,113,159,97,242,224,55,7,+224,177,7,129,163,226,90,0,162,84,64,41,192,83,224,84,5,224,82,5,+224,81,11,224,91,4,224,82,9,224,181,1,224,56,17,226,225,5,224,57,+18,225,108,9,224,9,2,101,243,160,63,193,246,227,65,0,224,236,14,96,+98,227,54,2,194,242,139,117,224,113,1,160,218,97,155,98,173,185,51,64,+125,2,95,52,55,68,214,0,55,102,92,162,66,96,0,224,96,0,0,83,+96,164,152,172,224,147,30,226,150,5,224,96,2,131,154,177,153,225,1,0,+161,4,224,13,22,99,150,130,112,97,96,192,237,157,252,128,13,224,253,1,+227,241,0,64,226,128,213,160,17,157,239,225,15,9,224,244,4,64,97,224,+96,22,130,105,224,95,2,162,122,128,94,228,23,3,194,3,226,190,6,225,+67,28,225,216,25,160,105,225,206,21,226,190,21,192,9,195,208,226,240,25,+224,49,11,224,176,2,228,6,9,225,89,8,229,234,0,128,181,224,43,3,+224,45,6,225,52,0,224,137,18,96,135,226,27,5,193,59,224,138,21,250,+217,14,27,84,101,120,116,47,80,97,114,115,101,114,67,111,109,98,105,110,+97,116,111,114,115,47,82,101,97,100,80,223,86,3,50,58,49,48,250,226,+0,64,0,141,254,128,103,141,254,128,11,0,58,96,6,113,250,144,102,132,+152,64,35,64,134,238,8,6,181,207,0,58,64,64,230,19,0,64,170,0,+58,96,46,192,70,66,52,66,109,110,118,145,176,114,63,128,21,72,37,128,+21,198,148,2,95,52,56,103,203,0,56,135,203,96,85,108,63,96,23,128,+17,76,124,96,53,134,62,0,52,135,27,229,82,0,200,78,162,226,248,126,+2,64,158,206,139,99,242,76,78,98,132,2,95,52,55,72,173,96,11,0,+58,96,6,198,215,162,193,128,202,119,199,130,213,0,66,115,59,100,41,64,+80,64,205,137,138,128,102,96,15,238,221,3,192,248,160,51,224,35,0,224,+51,20,0,95,241,37,7,209,231,238,124,2,222,147,224,14,1,96,156,2,+52,55,54,96,73,131,90,227,140,1,224,37,2,224,200,0,118,60,96,125,+113,27,224,209,24,229,125,0,224,211,36,192,53,128,212,177,188,131,24,242,+214,0,224,159,1,128,223,229,131,1,192,24,64,5,162,87,224,230,9,160,+72,160,234,224,50,11,224,243,123,224,238,1,96,165,164,30,225,2,1,193,+226,154,46,64,13,96,25,185,10,168,246,143,216,69,71,198,24,224,218,1,+81,140,192,124,224,173,49,134,63,96,126,224,107,2,118,99,141,105,96,27,+128,22,224,19,3,224,222,0,143,106,171,215,97,197,224,46,10,96,187,224,+186,79,224,118,109,96,91,225,147,1,225,10,126,228,3,2,130,121,147,163,+192,62,224,86,24,224,71,0,96,19,227,52,29,224,51,0,64,142,2,51,+54,52,230,194,10,19,68,97,116,97,47,77,111,110,111,105,100,47,73,110,+116,101,114,110,97,108,134,186,7,50,49,50,58,49,57,58,32,70,188,224,+55,1,31,115,116,105,109,101,115,58,32,112,111,115,105,116,105,118,101,32,+109,117,108,116,105,112,108,105,101,114,32,101,120,112,101,3,99,116,101,100,+102,238,2,58,52,55,184,201,163,44,129,139,133,47,96,164,228,1,27,128,+202,128,0,193,201,1,95,49,113,247,161,145,225,102,4,224,20,5,133,184,+225,91,15,224,90,0,0,58,100,196,109,110,110,17,173,252,0,83,158,118,+176,9,141,238,227,132,0,64,52,245,12,1,65,212,0,80,103,21,243,118,+2,64,14,0,51,224,34,0,192,38,64,80,224,11,0,224,59,2,96,81,+241,74,3,64,209,0,58,104,0,175,83,0,54,64,215,1,52,54,81,137,+78,246,128,22,146,7,64,153,112,169,0,58,96,31,71,59,1,32,58,96,+48,208,166,89,214,68,67,76,240,175,38,144,169,142,124,112,169,78,3,176,+169,160,10,207,170,64,87,176,169,0,51,161,207,161,213,226,201,2,169,77,+71,194,240,128,2,122,79,128,233,234,166,0,224,28,7,239,184,11,141,153,+224,65,8,106,219,71,251,64,11,65,190,161,179,159,168,176,182,96,49,0,+58,96,6,224,178,0,106,107,104,155,100,5,163,28,104,178,96,75,72,170,+200,155,134,183,128,46,139,172,72,168,224,34,4,0,58,96,125,128,93,1,+95,50,84,255,128,121,137,200,64,6,111,126,0,58,96,67,115,239,128,1,+122,2,64,33,209,60,249,191,1,96,4,159,124,128,205,0,58,97,4,1,+10,65,194,14,0,58,97,37,96,76,224,55,6,192,85,65,95,224,85,11,+224,34,3,233,91,1,236,98,2,238,154,2,64,240,81,186,106,94,97,180,+140,161,131,190,160,14,0,85,180,60,160,38,225,184,1,101,56,158,119,96,+196,66,115,160,64,114,15,146,130,64,17,97,59,1,54,52,65,135,0,58,+118,83,161,48,92,207,228,53,0,66,224,168,106,97,230,0,90,130,197,0,+53,163,238,232,158,1,131,73,103,175,96,10,199,176,252,133,4,106,143,167,+81,134,17,193,29,128,217,0,50,109,38,232,105,0,224,38,10,224,123,2,+64,181,193,230,229,91,19,3,76,105,115,116,133,80,5,53,52,56,58,49,+49,229,80,7,15,105,110,105,116,58,32,101,109,112,116,121,32,108,105,115,+116,101,60,68,125,225,132,0,224,167,4,193,96,224,168,1,0,58,96,9,+97,246,233,112,0,2,115,101,113,193,10,128,19,224,16,2,228,123,11,64,+68,236,53,0,4,32,95,51,56,48,161,51,247,141,5,224,181,1,3,35,+108,105,110,182,212,64,24,64,149,0,51,225,2,3,7,123,45,35,32,76,+73,78,69,96,236,135,62,65,125,66,79,0,52,153,244,0,51,67,64,2,+95,52,53,101,164,224,56,1,3,32,35,45,125,128,87,2,58,52,53,196,+252,225,12,2,67,68,182,67,236,84,1,98,166,0,48,64,13,131,157,1,+95,52,65,244,183,11,128,15,67,157,96,15,0,58,96,41,96,86,243,229,+0,225,104,1,198,169,98,116,243,169,0,0,58,64,63,225,29,0,0,50,+91,240,2,95,52,52,68,101,119,114,1,55,32,224,192,3,9,94,41,94,+42,94,43,94,44,94,45,167,7,64,118,224,111,7,96,60,230,91,2,64,+85,66,88,250,42,4,96,60,243,227,0,128,26,1,52,52,64,146,1,95,+51,64,144,1,95,51,90,180,0,58,96,137,67,78,1,54,57,130,177,208,+71,160,199,2,67,32,60,95,89,96,202,224,26,12,124,17,224,26,14,96,+167,224,26,13,97,93,227,167,0,224,26,4,177,11,0,85,65,146,175,254,+2,32,61,61,192,25,160,254,65,211,125,84,64,0,224,44,12,110,26,224,+44,10,224,117,14,100,103,224,72,12,102,206,224,117,31,151,187,224,117,10,+225,7,14,100,85,224,145,13,97,115,224,100,12,97,197,224,145,31,112,42,+225,7,33,98,60,224,72,12,64,25,224,117,32,162,143,225,7,10,226,97,+14,194,16,225,35,10,99,229,224,173,13,163,121,224,128,10,64,25,224,173,+32,136,210,225,35,31,81,1,224,72,13,96,25,224,117,31,96,242,226,43,+16,96,118,225,34,5,195,78,224,145,10,226,189,16,96,25,224,145,32,226,+189,16,224,45,12,226,134,15,225,200,15,96,164,225,253,13,96,58,224,26,+13,98,144,224,245,13,99,60,224,154,12,226,244,15,224,44,12,226,216,15,+224,117,14,100,240,224,72,12,226,244,15,224,44,12,226,160,15,225,7,14,+98,115,224,144,13,99,31,224,99,12,226,215,15,224,44,11,226,186,15,224,+116,13,190,41,224,70,9,226,212,15,224,43,11,226,155,15,225,3,15,194,+10,224,25,9,198,159,224,168,9,99,52,224,124,11,226,235,15,224,43,11,+226,233,16,224,114,12,226,150,16,226,149,35,226,148,16,228,28,14,225,0,+16,226,174,16,226,173,36,228,24,35,229,77,16,107,244,0,52,78,46,104,+136,0,58,96,6,174,161,0,52,74,48,0,54,74,46,141,6,79,224,232,+248,3,73,198,201,108,201,114,141,131,192,239,125,99,128,136,0,64,233,150,+1,211,119,0,83,110,103,235,4,2,173,197,246,83,1,0,58,96,131,105,+168,64,182,234,49,0,3,95,52,52,49,96,224,138,134,96,61,0,35,105,+112,160,53,205,142,233,162,1,235,210,28,5,49,49,57,58,49,53,235,210,+7,5,102,111,108,100,114,49,235,212,8,65,105,129,242,64,185,160,14,141,+240,224,10,3,64,166,192,150,203,0,105,254,2,49,32,95,136,9,1,52,+51,217,238,127,97,136,128,237,92,0,0,52,202,222,0,95,75,96,72,205,+0,58,96,48,208,89,206,138,87,199,160,103,0,51,254,87,0,224,29,0,+224,31,2,64,32,138,133,111,186,2,95,52,51,99,75,110,245,3,58,52,+51,54,138,124,2,51,54,55,74,162,94,71,98,46,0,58,96,38,206,141,+0,85,96,16,130,15,2,95,49,51,88,170,130,113,0,66,123,124,176,19,+0,49,96,89,193,13,64,107,64,17,235,91,2,3,32,97,116,32,76,121,+97,112,64,0,192,66,192,63,3,55,32,95,51,77,150,160,68,224,66,10,+2,99,111,108,192,61,130,121,224,57,8,98,120,66,7,224,61,9,13,94,+42,32,32,32,32,117,115,101,100,32,98,121,32,160,71,128,60,1,52,51,+238,56,0,160,20,67,36,96,20,3,95,49,52,48,192,11,0,58,96,6,+142,53,98,159,226,149,1,162,213,165,242,0,52,130,158,0,58,96,7,160,+47,65,87,1,75,50,204,62,1,58,52,64,15,112,15,129,94,129,248,0,+80,77,170,0,75,89,221,250,178,5,31,99,112,112,104,115,115,114,99,47,+109,97,108,99,111,108,109,45,119,97,108,108,97,99,101,45,117,110,105,118,+101,114,115,1,101,47,96,33,6,45,49,46,50,48,46,57,128,12,130,229,+3,55,57,58,49,205,147,75,192,96,100,64,97,100,22,64,8,160,143,75,+176,80,175,2,32,58,52,75,114,122,31,114,68,66,154,1,58,52,66,139,+96,19,0,56,64,205,0,52,74,96,1,95,52,202,220,82,140,171,21,0,+54,82,177,192,11,76,243,162,217,64,6,194,63,141,70,225,156,4,10,69,+120,105,116,83,117,99,99,101,115,115,128,173,161,223,0,52,74,246,0,67,+67,39,2,53,32,95,90,216,231,111,1,225,225,9,64,68,5,70,97,105,+108,117,114,174,222,224,36,1,0,79,132,50,149,85,2,95,49,51,68,233,+66,49,168,250,225,244,1,192,210,65,244,96,11,0,58,96,6,115,150,102,+247,193,233,67,170,178,144,160,16,128,73,0,58,96,178,97,42,0,57,67,+89,0,48,224,160,2,6,83,121,115,116,101,109,46,64,167,228,117,5,64,+17,2,67,111,100,128,182,0,58,97,93,180,123,110,179,209,177,67,161,0,+58,65,149,64,29,224,61,1,129,245,0,34,96,27,130,71,1,95,52,116,+21,99,228,75,20,177,148,2,39,32,95,80,28,132,115,0,52,67,40,79,+3,74,118,129,85,0,58,64,54,128,121,2,95,51,57,83,29,132,179,64,+33,0,58,96,47,110,206,101,8,135,3,132,221,78,220,85,0,64,78,0,+51,85,167,6,35,50,48,57,53,49,48,64,61,4,35,53,53,50,57,104,+5,99,45,1,52,48,70,104,0,52,96,26,114,183,1,95,52,156,224,106,+206,224,211,1,17,104,80,117,116,67,104,97,114,58,32,115,117,114,114,111,+103,97,116,161,211,1,95,51,82,101,0,58,96,147,98,204,105,247,0,73,+96,18,245,213,1,64,105,138,41,250,45,1,224,9,5,99,179,0,52,74,+124,1,95,49,116,248,150,87,0,53,137,20,96,6,0,58,96,154,224,81,+0,64,1,150,6,164,228,192,14,224,11,2,192,8,209,153,64,95,129,143,+2,49,32,58,96,145,96,13,68,115,133,130,66,127,227,87,2,0,48,113,+88,0,48,170,12,67,87,170,68,99,87,192,11,67,87,193,176,161,240,131,+87,115,104,128,1,102,143,192,243,224,2,0,128,190,98,11,247,24,0,224,+5,0,128,20,229,193,1,224,63,0,64,205,177,107,225,71,0,96,31,131,+73,1,52,48,129,52,227,140,4,135,88,178,64,230,32,0,224,36,15,193,+70,131,246,82,34,64,94,246,162,0,180,227,152,119,181,253,224,85,26,128,+175,192,198,224,240,3,224,190,5,146,107,224,109,18,230,141,12,0,40,196,+169,224,137,7,0,79,132,12,217,194,224,133,0,1,95,49,68,18,242,32,+0,164,113,193,236,68,113,96,11,0,58,96,6,231,108,1,102,99,105,49,+0,83,234,116,5,64,44,224,18,6,109,121,224,19,7,97,74,224,19,6,+97,200,234,169,5,111,16,0,85,224,225,2,0,105,90,83,2,114,117,112,+218,22,224,28,4,14,114,101,115,111,117,114,99,101,32,118,97,110,105,115,+104,192,34,224,35,4,90,111,1,111,117,201,65,224,110,7,67,240,224,45,+3,20,117,110,115,117,112,112,111,114,116,101,100,32,111,112,101,114,97,116,+105,111,110,224,120,9,12,104,97,114,100,119,97,114,101,32,102,97,117,108,+192,91,224,243,8,69,140,224,243,7,132,161,224,132,5,65,139,224,243,5,+14,97,112,112,114,111,112,114,105,97,116,101,32,116,121,112,164,118,224,35,+5,12,118,97,108,105,100,32,97,114,103,117,109,101,110,192,131,224,34,3,+3,102,97,105,108,225,18,0,224,115,7,67,185,224,44,3,4,112,114,111,+116,111,72,219,4,101,114,114,111,114,224,111,9,0,115,102,54,224,29,3,+224,240,9,225,247,10,225,246,10,225,245,10,225,244,7,21,117,110,115,97,+116,105,115,102,105,101,100,32,99,111,110,115,116,114,97,105,110,116,167,149,+224,40,4,0,115,92,54,224,147,2,224,210,4,13,101,114,109,105,115,115,+105,111,110,32,100,101,110,105,225,10,15,226,2,7,6,105,108,108,101,103,+97,108,225,254,19,9,101,110,100,32,111,102,32,102,105,108,161,153,224,247,+8,225,230,10,225,229,7,226,188,0,5,101,120,104,97,117,115,226,224,21,+3,98,117,115,121,225,201,14,224,86,6,10,100,111,101,115,32,110,111,116,+32,101,120,236,56,0,224,31,3,6,97,108,114,101,97,100,121,128,30,161,+82,128,0,196,11,175,190,100,11,150,241,64,6,196,11,2,95,52,48,229,+110,0,108,15,247,187,8,5,72,97,110,100,108,101,132,153,68,193,74,155,+228,142,8,128,94,134,225,64,6,186,150,202,203,70,97,138,238,1,48,54,+166,156,232,201,15,3,73,79,46,69,194,1,224,28,1,6,73,79,69,120,+99,101,112,225,191,0,0,58,102,214,9,10,65,32,94,112,117,116,98,32,+58,103,253,96,87,3,48,49,32,79,72,50,64,164,2,95,52,48,201,161,+0,58,104,37,251,61,3,64,26,184,78,198,162,70,224,230,234,2,128,10,+237,108,5,0,51,190,37,236,105,0,233,1,4,166,199,2,51,57,54,69,+148,161,49,2,51,55,48,64,18,101,177,238,71,14,128,251,3,47,73,79,+47,255,116,5,3,54,56,58,50,238,79,8,3,66,97,100,32,129,148,1,+32,109,201,224,105,125,0,48,106,63,96,235,136,2,106,74,250,214,4,121,+41,192,204,170,106,0,51,95,34,137,74,1,51,57,88,71,238,69,1,128,+76,200,15,3,48,50,32,58,96,33,74,42,2,112,50,112,64,13,162,74,+88,107,0,39,74,205,224,5,4,220,67,112,72,204,177,172,30,224,6,12,+224,42,2,64,15,172,82,224,42,29,160,28,224,49,10,224,42,15,224,49,+10,224,42,22,224,49,3,64,14,0,56,193,216,0,58,96,6,98,78,0,+82,64,240,3,95,51,57,49,139,98,0,58,66,12,129,140,0,95,71,252,+81,75,0,58,98,69,5,10,65,32,97,110,100,65,68,234,18,1,0,89,+157,62,155,182,73,31,99,114,138,141,194,95,186,34,169,89,129,208,0,64,+80,216,65,173,75,99,128,76,0,85,224,135,8,130,240,79,214,111,204,0,+58,96,27,97,217,162,17,0,95,81,46,226,239,4,224,180,2,142,144,227,+7,0,0,56,116,190,2,58,51,57,206,102,241,34,29,2,51,56,57,252,+245,10,3,104,101,97,100,241,32,8,0,75,65,40,64,102,97,60,101,39,+0,89,254,158,0,202,126,105,217,97,38,229,178,0,66,199,82,114,2,95,+51,55,67,171,224,23,0,98,251,112,145,96,24,2,95,51,55,65,205,224,+30,9,224,63,6,192,39,129,149,164,208,3,67,39,32,79,96,33,0,55,+164,95,128,30,96,164,2,95,49,53,111,148,233,152,1,3,95,51,55,56,+133,52,0,53,160,46,64,4,164,44,145,168,164,103,96,91,64,127,0,49,+252,68,3,1,45,79,131,228,128,71,197,118,138,212,96,62,224,50,10,9,+45,115,116,114,105,112,45,101,111,108,128,59,224,191,137,224,193,29,160,189,+225,165,255,225,165,106,224,195,24,4,104,97,115,104,101,168,123,227,109,255,+227,109,255,225,165,255,227,109,34,64,18,1,51,32,135,240,135,243,128,136,+240,106,2,65,158,64,31,138,161,193,172,192,211,128,2,120,54,224,32,0,+152,68,128,14,74,242,224,13,3,172,128,96,22,147,121,96,227,96,217,128,+0,224,41,0,160,57,160,231,128,2,148,6,146,158,192,42,105,248,184,184,+235,42,3,224,151,4,0,39,129,35,161,29,75,68,208,199,161,59,232,235,+0,225,80,0,245,42,0,96,154,160,22,96,0,75,212,224,128,2,96,229,+160,65,177,119,224,213,8,224,42,3,224,191,6,128,1,146,240,224,193,1,+184,156,136,130,224,186,16,96,187,224,179,0,224,0,0,225,152,0,193,188,+224,227,6,161,133,225,179,0,128,10,210,51,226,65,11,0,111,130,65,160,+50,0,82,162,113,64,11,128,123,225,44,4,128,10,0,55,105,181,192,143,+202,102,160,145,224,133,2,96,125,226,74,12,224,10,1,226,54,24,160,38,+226,109,4,192,241,225,147,5,0,49,247,51,0,160,35,224,192,10,192,12,+96,194,4,95,51,55,57,32,157,8,192,0,160,159,225,243,21,224,210,0,+161,195,225,239,1,4,83,32,95,51,56,193,200,97,106,227,134,0,225,114,+1,3,97,110,115,105,225,116,0,224,76,55,4,116,114,97,100,105,78,209,+0,97,164,142,192,65,128,78,65,240,224,67,24,1,115,116,209,6,64,0,+109,207,96,55,64,44,0,56,124,218,0,53,236,178,3,224,34,20,141,0,+128,0,226,172,73,0,120,226,172,8,99,93,224,104,73,4,105,110,99,108,+117,239,22,1,227,27,14,101,150,230,26,3,160,54,0,61,225,222,4,228,+224,1,160,154,227,15,1,96,141,224,156,1,224,145,19,0,80,192,83,224,+81,11,160,215,128,73,211,91,1,95,50,123,238,226,8,0,128,90,224,82,+2,0,67,96,82,224,31,18,128,32,65,213,246,31,3,225,111,75,0,65,+225,216,16,225,61,61,3,45,104,101,108,168,151,224,85,67,92,227,244,13,+0,224,88,13,225,23,3,224,86,30,224,85,9,161,103,225,91,2,229,66,+2,198,98,160,29,225,204,1,230,171,9,130,188,244,152,2,69,36,64,41,+232,148,6,0,55,232,148,5,195,232,98,242,99,232,224,18,0,112,223,128,+18,160,130,99,26,225,36,18,224,36,50,225,196,3,228,133,8,76,37,228,+133,7,224,69,12,1,110,111,95,238,228,241,2,226,225,6,233,57,1,3,+95,51,56,51,65,27,242,69,0,225,20,2,225,31,3,96,51,229,90,12,+2,68,85,73,96,104,2,58,51,56,178,228,6,51,56,50,32,75,32,85,+180,217,232,2,0,96,106,128,140,0,58,96,203,224,43,3,179,125,128,46,+224,41,1,0,58,97,126,224,40,5,130,12,224,35,0,0,58,97,180,224,+34,3,89,183,224,119,2,97,63,227,216,0,0,58,101,204,252,89,0,252,+58,8,0,58,96,43,113,255,0,58,64,80,128,10,92,228,65,132,128,56,+0,89,196,3,82,61,230,51,0,192,18,1,66,39,96,21,225,160,1,228,+52,2,251,228,2,108,47,97,151,244,66,0,70,199,145,197,194,188,3,32,+95,55,56,223,125,146,91,124,10,64,15,65,93,103,222,99,11,3,57,55,+32,95,125,235,119,25,64,0,96,178,64,30,146,203,2,50,32,65,96,221,+75,69,192,17,65,217,0,58,99,10,210,239,69,77,0,58,108,180,128,17,+0,51,96,68,129,95,244,152,5,0,58,108,231,86,40,64,133,0,50,98,+20,0,58,66,29,193,59,94,149,225,59,1,64,178,161,116,2,95,51,54,+187,119,0,52,96,25,128,243,155,231,1,51,54,119,134,0,50,125,161,96,+39,97,216,1,54,55,165,234,192,123,64,38,244,10,2,129,90,65,190,129,+98,0,58,64,49,96,58,243,178,43,0,54,100,77,2,58,51,54,129,6,+243,178,32,1,57,51,243,178,10,3,116,97,105,108,243,178,8,0,65,96,+195,255,51,1,126,150,0,51,119,250,97,205,158,97,64,117,96,196,158,161,+1,51,54,65,124,1,51,54,65,163,0,95,126,161,128,49,158,161,224,11,+0,0,52,192,11,0,58,96,6,252,204,1,182,229,130,124,253,79,4,0,+101,88,72,253,186,0,131,13,156,248,128,142,128,9,98,172,89,43,224,130,+0,0,48,192,11,0,58,96,6,248,175,13,7,67,111,110,116,114,111,108,+46,248,152,0,0,46,215,187,225,40,5,0,69,64,132,2,67,97,108,137,+228,0,58,96,237,97,30,151,145,65,187,0,50,124,71,2,95,51,53,119,+125,99,5,0,58,64,108,64,39,70,52,158,66,96,40,65,0,96,233,0,+50,125,91,128,244,1,54,51,69,1,64,181,0,53,222,119,97,11,105,221,+1,51,52,126,61,0,54,228,240,0,67,65,131,69,64,111,225,71,3,0,+83,230,124,4,89,67,66,65,120,203,1,52,32,128,15,98,107,69,84,1,+51,53,69,181,224,24,2,97,69,225,125,3,4,39,92,92,39,39,161,123,+161,96,96,158,224,82,3,100,34,0,89,118,233,224,17,3,135,132,233,22,+2,224,151,2,0,64,160,35,169,205,224,139,0,97,225,255,83,9,3,92,+92,92,34,230,48,2,0,58,96,131,1,10,65,246,46,1,242,168,1,0,+50,68,5,242,183,2,1,53,49,128,122,79,250,160,122,87,67,239,147,0,+129,97,161,196,183,185,232,137,2,67,182,162,148,97,130,64,59,129,130,202,+136,64,62,193,191,1,51,53,131,164,0,53,162,157,0,67,248,132,0,0,+90,64,28,101,116,64,61,224,217,3,0,38,192,216,130,253,99,8,237,217,+1,168,208,132,57,141,232,232,96,7,224,60,2,141,92,160,223,227,42,0,+161,105,128,56,128,79,96,177,65,32,225,149,6,0,49,96,43,224,180,1,+64,194,226,78,3,69,55,249,66,7,224,210,18,71,166,1,80,32,68,197,+224,30,1,2,78,85,76,96,30,96,25,233,120,4,2,83,79,72,224,25,+1,0,50,224,25,4,1,84,88,224,25,1,0,51,224,25,3,0,69,224,+25,3,0,52,224,25,4,1,79,84,224,25,1,0,53,224,25,4,1,78,+81,224,25,1,0,54,224,25,3,2,65,67,75,224,25,1,137,132,90,18,+97,240,96,19,146,45,91,48,224,19,1,124,165,2,35,49,49,195,156,128,+216,0,48,160,21,0,48,224,21,4,136,195,0,49,67,246,224,21,2,0,+50,128,21,252,231,0,128,21,0,51,160,43,0,52,224,108,4,128,43,226,+134,0,128,42,224,248,4,0,83,146,148,128,25,224,248,4,0,83,137,12,+128,25,224,248,4,2,68,76,69,224,26,2,0,55,224,26,4,1,67,49,+224,26,2,0,56,224,26,5,0,50,224,26,2,0,57,224,26,5,0,51,+225,203,2,226,0,4,2,68,67,52,224,26,2,226,1,4,1,78,65,225,+127,2,93,123,224,187,2,1,89,78,224,26,2,226,3,6,0,66,224,26,+2,225,11,4,1,67,65,224,53,3,226,5,5,0,77,224,25,2,225,12,+4,1,83,85,224,79,3,225,12,4,1,69,83,141,147,128,26,225,12,4,+1,70,83,224,25,2,225,11,4,0,71,224,25,2,0,51,225,10,4,0,+82,224,25,3,225,9,4,0,85,224,25,2,0,49,224,131,5,1,68,69,+131,64,198,9,224,0,21,139,72,111,46,0,58,101,98,69,54,229,30,0,+73,192,0,50,64,147,1,35,52,126,63,137,210,96,17,1,64,35,101,144,+0,58,100,182,104,232,3,52,56,32,58,100,218,198,110,78,90,229,221,1,+73,7,234,12,3,2,95,51,53,80,244,1,56,50,169,252,133,17,128,46,+102,21,64,52,2,50,52,53,192,53,96,35,228,197,1,180,29,96,68,224,+23,4,127,32,224,39,7,103,44,128,112,128,21,202,105,230,181,0,101,153,+136,22,96,11,0,58,96,6,129,13,101,25,160,201,224,154,10,224,195,0,+99,214,197,251,69,139,128,114,69,35,0,50,74,5,95,178,224,36,1,176,+165,224,10,4,96,50,0,50,133,127,203,22,97,89,129,128,139,46,74,5,+224,74,4,0,58,96,102,5,10,65,32,99,104,114,65,131,136,207,0,83,+71,235,102,239,2,95,51,53,64,40,225,215,11,144,131,225,215,4,0,49,+66,238,96,84,136,197,76,131,1,52,57,238,150,3,3,32,60,32,64,99,+20,224,19,8,130,37,161,197,160,19,72,57,236,84,1,236,94,2,224,40,+7,66,79,224,40,12,224,102,8,139,3,224,61,5,65,63,224,102,13,0,+39,70,232,3,67,32,61,61,64,38,138,105,102,154,224,97,3,0,58,97,+34,105,179,190,102,139,180,226,184,8,65,249,1,51,51,193,249,6,50,51,+53,32,95,51,48,137,145,65,188,0,48,74,67,96,84,64,13,0,49,83,+219,70,14,65,196,75,38,160,41,2,64,95,51,103,74,97,218,1,64,58,+97,94,7,10,65,32,111,114,100,32,58,96,18,9,10,65,32,98,115,105,+110,100,101,120,64,16,204,15,0,55,64,92,76,4,128,97,2,95,51,49,+72,84,96,11,233,216,1,71,131,160,169,224,18,4,64,175,224,18,6,129,+251,224,18,4,65,30,224,18,6,129,108,224,18,4,65,107,224,18,6,224,+132,10,65,207,224,18,6,130,31,224,18,4,66,30,224,170,7,224,190,11,+224,191,10,107,82,224,19,7,224,193,10,97,107,224,19,7,224,195,10,70,+244,224,19,8,224,197,10,107,150,224,19,7,224,199,10,70,216,224,19,8,+225,135,11,224,199,10,98,168,224,19,7,224,199,10,98,247,224,19,7,224,+199,10,99,93,224,19,7,163,174,224,19,4,151,122,238,52,17,11,67,104,+97,114,47,85,110,105,99,111,100,101,142,60,4,53,50,58,50,56,238,59,+8,17,111,69,110,117,109,58,32,111,117,116,32,111,102,32,114,97,110,103,+177,212,162,251,64,7,165,195,97,119,64,7,144,85,0,51,97,95,64,7,+108,116,1,95,51,97,71,64,7,101,181,1,95,51,97,47,64,7,101,251,+1,95,51,97,23,64,7,160,79,132,192,1,95,51,96,243,64,7,160,79,+96,219,2,64,95,51,100,231,64,7,160,79,101,4,64,7,160,79,139,18,+1,95,51,142,59,2,95,51,51,160,79,0,51,160,79,0,51,160,79,141,+20,1,95,51,134,115,1,95,51,134,85,2,95,51,52,160,79,79,183,1,+64,85,231,5,3,68,169,96,245,228,209,7,64,49,229,96,53,128,7,96,+8,174,32,229,94,12,128,7,96,8,229,92,40,128,7,96,8,97,33,224,+38,8,128,239,128,7,96,8,140,106,224,99,8,97,224,224,119,7,131,44,+224,80,5,133,166,128,7,96,8,199,59,224,38,4,98,39,0,85,138,99,+128,8,165,102,242,140,2,96,39,131,23,224,59,5,161,22,130,123,64,8,+129,22,64,9,208,58,224,169,6,64,41,224,208,7,64,160,224,19,7,131,+193,224,109,5,65,55,64,90,97,63,64,8,141,161,224,38,7,65,55,64,+29,97,63,64,8,168,175,224,98,6,132,115,224,58,5,65,33,64,49,97,+41,0,85,108,127,224,96,9,65,31,0,85,108,175,96,7,143,90,224,94,+8,64,155,224,18,6,132,109,224,75,4,65,47,0,85,109,41,96,7,200,+210,224,35,4,160,246,192,245,174,150,225,158,7,226,0,10,161,255,193,6,+193,154,130,6,137,16,0,50,73,16,231,17,0,64,98,64,85,111,229,0,+83,175,34,231,178,3,103,148,128,46,224,12,5,143,2,2,95,50,57,82,+145,160,78,99,193,224,25,12,196,195,69,56,224,45,0,72,12,96,11,0,+58,96,6,138,61,189,129,64,8,181,124,0,80,116,189,245,93,3,169,255,+104,63,160,217,216,173,79,217,96,11,192,42,96,134,0,49,86,91,160,192,+224,6,7,0,58,64,136,224,124,5,224,121,35,224,108,6,0,49,224,108,+14,0,58,64,250,64,101,0,80,97,142,114,108,65,46,128,17,0,49,192,+17,138,139,76,244,192,17,138,85,143,169,128,17,137,121,143,161,96,17,69,+88,128,17,0,53,192,17,137,20,143,145,128,17,137,21,143,137,128,17,129,+114,143,135,128,17,213,253,67,5,128,17,224,179,0,64,196,128,18,224,180,+1,192,181,70,16,160,18,192,182,70,43,160,18,192,183,70,70,160,18,192,+184,69,131,160,18,192,185,69,141,160,18,192,186,69,130,160,18,192,187,69,+140,160,18,192,188,65,151,160,18,192,189,69,118,128,18,69,8,128,18,224,+189,0,69,36,128,18,225,115,1,192,189,64,27,160,18,192,189,64,65,160,+18,192,189,64,103,160,18,192,189,64,141,160,18,192,189,64,179,160,18,192,+189,64,217,160,18,192,189,64,255,160,18,192,189,65,37,174,94,108,214,66,+113,183,58,1,49,50,163,220,226,92,0,65,101,12,10,65,32,115,117,98,+116,114,97,99,116,32,58,64,35,224,62,14,1,54,51,224,61,8,128,239,+120,5,0,75,67,169,0,58,96,25,216,60,0,90,128,20,1,64,58,96,+68,110,189,0,48,64,134,1,48,55,64,167,75,164,15,10,65,32,34,94,+95,94,44,94,41,94,66,94,57,94,59,96,5,18,53,94,54,94,57,94,+58,94,57,94,52,94,57,94,57,94,73,94,38,96,7,0,66,96,19,30,+57,94,89,94,32,94,53,94,57,94,54,94,60,94,51,94,60,94,89,94,+33,94,53,94,58,94,54,94,58,124,32,96,75,22,57,94,67,94,59,94,+61,94,57,94,60,94,61,94,50,94,55,94,58,94,45,94,61,96,13,8,+58,94,40,94,40,94,60,94,33,96,75,31,60,94,40,94,50,94,56,94,+66,94,40,94,57,94,86,94,32,94,58,94,70,94,32,94,87,94,33,94,+58,94,71,94,2,33,94,32,224,3,102,224,33,59,224,3,53,224,9,1,+0,66,224,15,6,64,5,0,66,96,5,2,33,94,67,224,19,6,224,43,+3,224,79,13,224,69,9,224,15,1,2,33,94,50,160,67,0,67,96,9,+0,34,96,25,224,5,3,224,3,21,224,33,25,192,37,192,77,224,129,3,+224,3,99,0,70,96,5,128,11,64,5,128,23,193,77,224,3,2,1,124,+68,97,21,28,90,94,33,94,81,94,49,94,67,94,60,94,75,94,49,94,+77,94,60,94,68,94,49,94,70,94,60,94,49,96,3,6,80,94,60,124,+111,94,35,224,57,0,64,21,64,7,4,48,94,48,94,49,97,83,8,57,+94,32,94,67,94,48,94,60,96,25,67,73,2,32,94,48,160,3,64,41,+0,80,96,11,3,72,94,32,124,193,29,225,211,3,224,3,35,64,179,64,+9,0,58,160,15,96,75,5,124,50,94,32,124,47,224,75,40,224,3,13,+8,61,94,68,94,35,94,37,94,37,224,73,56,224,3,37,224,29,19,224,+67,31,224,3,145,1,48,124,65,79,130,49,4,69,94,57,124,40,98,53,+0,52,96,17,18,61,94,61,94,59,94,48,124,44,94,35,94,52,94,35,+94,57,94,35,224,5,4,6,71,94,48,94,90,94,50,98,97,67,189,69,+87,6,74,94,48,94,69,94,45,229,179,0,0,59,96,5,64,73,0,74,+96,53,64,25,14,57,94,95,94,50,94,49,94,73,94,50,94,84,94,35,+101,231,10,67,94,57,94,50,94,50,94,35,124,98,96,73,4,50,94,70,+94,35,101,187,6,69,94,35,94,49,94,49,96,117,4,61,94,67,94,35,+96,39,64,51,2,66,94,50,96,89,8,50,94,77,94,57,94,48,94,45,+64,63,1,94,93,99,59,0,35,64,193,3,124,88,94,50,96,119,64,33,+0,48,64,51,5,124,32,94,50,94,72,160,81,0,61,96,139,0,49,96,+235,6,35,94,59,94,59,94,85,96,205,64,29,128,35,0,66,96,5,66,+119,64,35,0,78,96,101,64,83,64,23,64,17,64,15,16,74,94,50,94,+68,94,48,94,87,94,50,94,60,94,69,94,50,96,137,0,45,96,19,3,+72,94,35,124,70,103,2,49,94,87,96,205,6,95,94,35,94,36,124,53,+96,167,0,36,96,151,8,66,94,36,94,71,94,35,94,67,96,15,2,36,+94,36,160,249,65,27,129,103,199,7,2,49,94,78,160,55,4,36,94,48,+94,71,96,103,0,48,97,11,64,7,64,185,2,48,94,70,96,5,64,85,+129,145,128,217,128,101,64,215,64,15,128,63,128,7,64,27,65,197,64,29,+192,75,65,85,64,121,64,35,64,121,64,21,65,27,2,69,94,40,98,15,+65,157,128,29,64,37,64,75,64,243,224,63,1,224,139,7,224,5,7,64,+55,64,101,64,125,64,247,128,71,64,23,65,85,64,185,2,35,94,70,224,+191,0,65,13,128,135,64,37,128,155,65,17,224,125,1,0,72,224,181,0,+224,121,11,0,68,225,5,6,129,203,192,59,129,3,129,71,0,78,160,51,+224,251,3,66,191,64,127,0,50,98,133,64,55,225,125,27,224,119,7,129,+217,225,127,13,64,93,128,141,225,129,17,66,225,65,125,128,245,64,33,65,+113,65,41,128,245,65,41,64,13,193,101,128,9,192,17,192,39,64,7,0,+75,161,169,128,123,64,5,128,29,64,145,129,145,128,213,0,69,96,35,163,+51,105,35,0,69,97,251,69,131,64,131,128,43,129,5,128,131,0,86,96,+5,0,79,225,109,4,130,213,129,215,64,165,224,237,1,192,53,128,173,225,+119,9,64,39,2,57,94,70,98,113,194,243,0,57,224,111,10,67,37,225,+107,9,0,68,96,117,193,171,128,235,128,123,64,11,64,219,226,143,1,224,+117,3,128,17,2,36,94,75,225,147,0,0,36,226,93,3,99,201,64,23,+227,79,3,225,59,3,68,141,65,93,64,45,0,36,96,189,225,201,7,0,+72,96,209,132,35,192,159,0,81,161,155,68,63,194,205,128,207,66,79,131,+15,128,85,65,173,130,133,66,129,128,201,128,183,128,217,0,57,64,185,1,+124,47,96,115,64,201,68,71,64,57,67,187,68,131,68,103,235,85,0,0,+124,64,123,226,49,1,129,67,128,131,193,89,128,69,69,9,128,143,128,35,+69,47,64,89,224,123,1,66,127,0,95,96,55,2,66,94,61,101,37,75,+129,64,11,64,251,66,57,64,41,0,73,96,251,69,195,128,3,75,237,64,+3,64,185,97,217,0,124,64,103,64,175,0,77,97,27,67,169,134,107,64,+119,69,197,64,33,128,251,64,63,64,87,134,163,0,68,107,247,64,115,96,+213,1,124,42,97,127,129,161,65,37,133,107,129,111,129,191,64,143,2,69,+94,57,97,23,192,21,131,69,193,221,129,63,65,113,134,17,0,76,226,135,+0,128,211,129,239,0,36,163,31,64,13,2,61,94,61,167,75,73,13,137,+101,64,139,71,79,137,141,1,66,124,129,221,197,153,196,47,224,17,0,98,+97,224,13,1,70,171,224,45,18,102,15,2,48,124,56,224,51,4,195,87,+64,201,4,72,94,57,94,83,98,133,131,153,0,73,98,123,2,48,124,85,+167,241,0,69,170,43,4,52,94,68,124,107,98,189,10,57,94,80,94,50,+94,41,94,89,94,50,97,155,3,66,94,48,124,70,223,71,39,2,66,94,+39,97,167,67,71,130,179,65,15,4,72,94,48,94,82,162,229,66,129,0,+57,96,17,64,31,64,17,67,73,65,57,195,181,160,19,1,124,51,224,49,+0,66,73,66,203,129,91,65,229,135,147,142,21,64,37,195,59,130,237,68,+137,64,185,72,163,72,51,64,133,0,45,168,67,64,219,0,34,66,233,1,+124,52,160,167,66,57,3,35,94,35,124,75,79,65,175,3,68,94,48,124,+65,243,69,73,0,94,160,151,199,123,132,213,229,29,1,65,227,128,29,66,+101,65,67,199,139,72,97,195,15,4,74,94,48,124,43,162,183,65,53,195,+147,97,117,0,124,74,181,68,169,226,125,1,64,55,66,167,64,161,128,245,+131,75,130,163,131,11,128,123,0,73,160,45,224,219,0,224,7,0,0,70,+97,33,65,3,64,31,67,45,5,37,94,79,94,35,124,131,139,72,97,0,+46,162,173,67,67,197,17,192,93,64,187,192,201,64,73,66,21,67,227,0,+72,169,15,128,171,64,227,195,65,195,61,131,29,99,61,96,243,128,91,198,+13,128,31,128,99,64,135,0,57,99,207,65,219,64,209,192,69,65,71,67,+175,131,55,130,23,193,83,2,69,94,49,162,65,138,155,65,173,0,42,162,+171,76,149,0,71,102,3,129,179,2,57,94,76,225,61,0,66,251,65,51,+196,177,128,105,129,237,8,43,94,33,124,62,94,49,94,76,77,31,0,124,+76,147,4,36,94,49,124,63,237,53,2,224,3,255,224,3,17,193,143,224,+3,181,64,197,2,71,94,32,228,245,0,0,69,162,89,81,235,64,23,192,+7,224,31,11,207,51,192,3,192,43,0,77,160,43,128,15,0,34,224,7,+8,79,21,0,48,241,53,0,0,34,114,125,2,66,94,60,102,13,224,23,+3,64,19,0,67,160,75,192,21,66,231,0,60,96,73,0,68,111,145,0,+60,163,7,224,81,7,64,23,8,74,94,41,94,68,94,45,94,69,179,57,+6,55,94,56,94,53,94,55,224,7,0,67,57,2,42,94,43,96,35,0,+41,102,23,64,25,69,63,2,51,94,51,99,245,0,58,101,239,0,74,179,+127,4,51,94,73,94,57,160,83,68,119,2,45,94,40,173,39,74,135,77,+219,64,45,77,193,224,13,1,69,233,69,183,70,183,0,59,107,77,67,161,+2,67,94,37,99,245,4,37,94,75,94,35,96,21,71,177,80,149,64,5,+64,11,242,89,1,128,7,192,23,0,58,96,247,71,229,64,15,192,3,64,+245,64,51,145,55,67,249,64,49,64,17,65,227,71,121,80,129,65,75,64,+65,128,25,8,61,94,79,94,40,124,34,94,39,160,51,0,39,104,137,137,+171,64,47,0,68,96,43,0,58,96,147,128,51,192,5,0,70,96,5,0,+94,160,31,192,25,128,17,2,66,94,75,116,41,0,61,232,201,0,0,83,+160,39,64,53,4,53,94,54,124,80,96,15,8,93,94,61,94,88,94,58,+124,39,103,125,1,58,124,64,49,0,85,97,179,10,61,94,84,94,48,124,+59,94,40,124,77,96,19,4,40,94,65,124,54,96,51,69,139,10,58,124,+53,94,61,94,71,94,58,124,110,96,19,2,65,124,119,224,107,2,224,3,+11,4,93,94,40,124,43,105,15,129,145,0,94,160,7,224,3,7,0,79,+64,77,5,92,95,94,61,94,65,225,189,0,224,3,30,1,124,62,224,47,+2,0,95,160,11,6,66,94,65,94,58,124,47,96,207,129,37,64,231,76,+183,66,49,64,103,6,48,124,104,94,61,124,47,242,13,2,193,243,227,163,+3,243,11,1,64,5,67,135,79,165,243,175,111,224,3,73,0,33,162,205,+128,13,70,197,64,7,74,43,67,137,86,135,2,57,124,37,163,223,64,21,+100,15,1,124,55,168,203,71,27,77,145,0,35,104,81,73,101,138,17,224,+5,33,80,125,196,29,64,3,67,247,64,7,128,5,68,21,132,61,64,5,+128,23,196,73,226,7,5,71,191,67,251,64,41,137,133,64,49,2,53,94,+76,177,233,215,203,224,3,3,1,52,124,64,205,0,89,98,11,2,88,94,+61,106,25,6,65,124,85,94,61,94,89,106,157,0,61,184,9,6,61,94,+49,94,50,94,39,226,123,11,96,91,224,87,8,96,5,64,27,2,72,94,+39,232,175,0,0,52,117,41,128,139,0,39,96,81,128,153,74,251,137,187,+72,33,69,59,66,97,3,50,94,52,124,73,187,74,77,64,13,136,119,75,+91,137,233,132,43,79,127,0,61,82,185,1,124,37,96,109,64,23,2,79,+94,50,100,11,138,153,67,233,0,71,100,91,2,78,94,40,98,247,2,73,+94,40,99,7,64,15,2,66,124,63,78,205,2,124,51,124,64,47,0,50,+128,13,5,94,65,124,35,124,125,176,65,4,49,94,72,124,118,141,243,100,+7,4,72,94,48,124,39,233,23,2,68,113,64,37,65,39,64,121,73,55,+72,239,0,83,102,147,226,155,53,224,3,19,73,87,69,193,73,181,66,65,+0,49,224,73,48,179,199,171,131,0,39,173,75,137,213,4,86,94,60,94,+72,118,195,150,197,224,3,13,246,153,41,224,3,69,79,69,224,17,3,224,+35,13,224,195,3,88,213,64,9,224,185,35,70,249,192,5,224,3,19,248,+61,3,64,5,66,217,128,7,128,3,224,47,5,0,84,104,63,129,189,66,+71,2,49,94,33,100,25,211,87,139,71,68,93,235,243,1,71,19,139,181,+147,255,146,5,77,105,77,195,67,251,148,63,1,36,124,67,57,0,79,160,+55,64,19,204,99,76,177,0,81,171,159,66,185,149,221,64,105,64,29,0,+91,108,35,132,151,64,121,78,1,142,9,64,65,0,92,242,191,0,236,213,+3,236,151,5,76,125,68,121,69,33,64,81,71,213,64,77,141,251,85,201,+131,41,112,189,111,97,144,17,192,225,128,7,67,207,129,5,77,33,64,23,+65,75,64,55,141,85,131,113,77,117,144,229,173,189,96,245,144,51,140,123,+64,75,174,117,160,25,0,87,177,103,131,195,79,77,224,121,1,64,17,129,+137,64,19,78,149,146,27,224,7,5,229,235,6,112,83,74,47,64,219,194,+109,6,67,94,48,124,79,94,33,110,255,128,211,224,5,1,0,57,96,9,+192,207,65,143,2,50,124,87,101,143,0,50,101,135,65,119,64,63,64,15,+65,61,2,46,94,70,100,147,2,46,94,46,192,7,1,94,71,160,9,2,+47,124,49,96,9,4,47,94,66,124,109,128,163,1,124,105,101,19,64,157,+0,33,96,79,74,245,70,191,129,227,2,50,94,58,176,3,146,63,128,3,+224,5,0,112,121,4,80,94,60,94,79,65,129,3,124,106,94,50,101,217,+4,79,94,61,124,63,160,95,87,47,71,1,69,125,148,195,94,47,69,125,+83,213,222,55,64,215,64,17,134,149,74,215,230,67,11,224,3,3,65,125,+64,7,144,71,139,7,129,235,134,85,192,3,139,31,0,52,105,43,66,91,+152,211,138,61,64,161,0,65,161,157,87,247,66,69,254,207,58,160,59,192,+165,65,69,2,49,124,44,162,43,80,185,131,145,226,43,9,140,35,128,31,+87,181,0,58,126,251,64,9,65,63,0,67,169,159,66,105,0,66,121,93,+137,163,65,83,144,191,145,205,193,161,114,97,112,99,0,50,66,47,1,124,+122,184,235,64,221,66,49,0,44,178,93,4,72,94,61,124,52,103,127,1,+40,94,74,245,95,105,65,161,76,3,145,59,2,61,124,46,96,47,68,77,+4,65,94,65,94,48,195,219,98,117,76,23,4,35,94,90,94,40,97,85,+90,29,64,73,66,247,0,83,104,13,67,147,0,39,103,151,0,37,96,129,+67,99,0,48,177,135,144,103,64,55,64,37,67,247,2,39,124,41,103,57,+6,32,124,39,94,33,124,77,160,195,210,33,73,117,64,187,0,35,101,63,+135,97,0,71,164,207,132,117,0,74,109,125,0,78,96,5,0,70,253,45,+0,75,177,67,51,0,78,96,5,66,235,141,135,64,195,64,59,66,249,2,+66,124,54,163,175,71,207,65,101,64,147,68,1,71,195,2,48,124,41,109,+69,3,72,94,49,124,64,191,193,175,67,5,81,79,129,117,65,45,128,23,+150,227,69,97,0,40,96,11,65,173,86,85,65,255,69,97,4,72,94,40,+124,47,225,177,4,64,85,2,68,94,40,96,125,141,169,64,63,65,215,64,+25,2,57,124,63,170,79,65,45,65,163,64,51,2,79,94,40,99,101,77,+227,132,199,137,29,138,151,134,21,211,191,65,179,130,97,147,23,69,55,0,+40,99,155,74,61,64,7,64,33,64,89,197,187,73,7,129,5,0,61,101,+235,64,89,131,57,64,55,116,45,99,223,64,169,64,15,201,159,64,243,64,+215,64,133,64,11,84,81,154,21,118,229,65,7,3,124,79,94,48,85,81,+3,124,54,94,48,94,105,1,94,76,96,7,70,211,102,173,162,23,134,141,+243,67,3,64,209,69,183,85,7,146,143,92,223,2,49,94,85,111,181,0,+48,109,195,0,65,64,93,1,94,94,65,27,1,124,41,96,147,64,185,157,+23,129,53,97,19,64,123,96,99,64,237,74,3,129,153,64,197,70,201,66,+197,75,45,77,239,64,193,129,79,75,229,2,48,94,84,96,209,0,40,105,+189,203,209,134,83,84,27,0,78,164,219,65,43,85,195,64,183,230,97,1,+128,45,135,21,68,21,216,143,198,205,68,51,0,45,97,43,134,85,68,151,+156,185,219,77,65,11,2,66,94,35,97,35,148,37,71,133,193,31,70,149,+64,75,131,25,70,83,128,83,128,119,102,189,120,103,64,119,84,59,135,147,+136,15,64,135,134,113,138,159,64,53,133,89,64,199,67,97,65,9,221,71,+244,53,1,64,5,202,15,160,233,107,41,246,247,7,132,147,69,17,101,243,+168,21,64,73,64,193,66,47,192,223,199,101,251,175,33,129,91,128,141,154,+187,251,175,1,153,233,64,47,64,91,85,91,128,53,192,31,84,137,194,77,+64,229,154,155,192,119,132,185,64,9,64,71,156,77,192,95,64,217,64,5,+225,5,1,136,57,65,113,136,203,66,83,64,155,2,92,94,48,98,29,192,+237,64,49,129,63,131,167,213,89,192,57,137,217,0,93,186,21,192,121,192,+221,129,31,128,243,129,167,195,41,0,65,66,161,97,89,194,89,64,169,224,+51,5,0,86,97,235,98,143,102,27,192,97,245,237,1,128,39,137,243,129,+17,129,151,73,173,0,82,173,99,128,37,64,47,192,153,161,215,224,45,0,+0,83,106,37,2,48,94,90,161,75,224,49,1,130,241,65,111,67,37,64,+47,134,119,77,235,65,219,2,65,124,56,165,89,226,167,1,99,29,1,124,+99,102,101,4,32,94,95,94,33,96,55,68,197,68,85,226,39,1,132,131,+226,31,1,91,25,87,149,226,15,1,193,9,66,1,137,211,64,121,67,31,+87,31,64,185,160,77,0,124,67,5,225,71,3,133,3,192,235,64,59,0,+90,96,103,2,73,94,35,173,239,64,89,196,187,65,197,65,151,234,183,1,+67,183,2,45,94,50,183,1,225,99,1,65,253,69,3,74,241,131,231,4,+57,94,65,124,53,186,73,144,61,193,85,122,137,0,124,128,185,152,129,225,+127,1,130,69,128,43,0,82,230,69,0,0,57,248,247,0,0,85,162,189,+64,55,226,17,2,0,124,234,167,1,137,217,66,241,64,85,64,63,198,85,+131,39,139,103,224,141,1,135,9,129,105,71,253,221,193,128,103,194,75,228,+189,1,0,66,64,213,250,119,2,139,73,222,93,64,211,106,113,121,247,64,+29,66,35,64,133,224,75,1,66,131,101,83,0,124,77,21,136,129,2,84,+94,40,115,207,2,67,94,59,104,197,0,76,167,125,10,89,94,50,124,101,+94,48,124,110,94,39,184,189,66,205,1,65,124,66,253,1,84,124,90,207,+0,96,163,173,64,49,0,72,99,9,0,79,122,149,64,215,69,201,65,77,+0,95,98,193,100,53,5,124,70,94,50,124,53,66,157,97,83,85,25,197,+9,64,147,0,77,98,61,0,68,123,217,64,211,154,169,133,153,154,61,197,+3,129,61,250,143,1,157,223,131,139,65,103,221,25,76,43,67,21,193,213,+103,63,166,131,64,145,65,73,0,67,104,75,2,66,94,49,98,131,147,121,+129,35,0,65,96,143,195,47,0,86,105,165,2,57,124,100,188,27,136,7,+71,9,66,17,135,13,0,76,121,99,77,145,64,119,79,243,65,49,65,125,+66,131,4,50,124,47,124,117,97,117,98,3,81,147,0,124,64,141,65,255,+64,65,4,50,124,69,124,102,96,73,158,107,64,5,64,73,73,95,70,139,+65,171,0,50,69,11,168,149,64,13,64,87,65,143,154,123,74,207,0,82,+105,221,76,79,64,225,66,15,138,169,194,69,128,57,158,163,65,37,3,45,+94,94,124,68,103,2,65,124,111,190,177,64,245,4,67,124,51,94,61,97,+227,65,207,64,49,0,86,142,45,4,124,115,94,61,124,75,85,2,65,124,+117,129,89,212,241,0,124,79,33,197,153,75,5,68,55,2,71,94,45,101,+25,137,195,0,35,114,43,3,67,94,35,124,75,157,86,5,0,65,107,39,+4,35,94,61,124,121,167,41,68,143,160,7,1,124,86,178,113,0,88,86,+35,96,191,76,59,76,47,64,7,138,139,0,81,160,13,64,21,234,179,1,+190,135,224,13,0,152,89,88,187,152,111,234,203,1,74,221,224,63,1,64,+37,128,43,128,45,203,9,224,29,7,80,163,64,93,137,191,192,33,224,157,+3,224,7,23,0,91,176,183,10,88,94,32,94,58,94,88,94,33,94,58,+117,251,224,15,55,177,15,1,124,49,67,55,86,237,1,124,54,101,119,1,+61,124,66,143,67,231,1,35,94,87,119,129,147,67,41,66,87,67,67,72,+99,2,35,94,72,106,1,0,73,113,43,0,83,117,187,68,167,2,33,94,+65,100,49,133,51,0,80,162,19,221,195,64,5,172,157,4,124,61,94,49,+124,65,15,2,35,124,111,108,249,202,227,73,215,153,75,195,209,75,27,84,+29,131,201,2,35,94,80,254,83,0,132,15,66,191,2,59,94,67,96,143,+68,67,0,49,224,25,0,85,65,192,53,68,247,228,35,1,2,67,124,95,+229,141,0,137,55,237,209,3,1,65,124,136,239,108,67,64,147,67,127,3,+124,33,94,32,93,33,96,163,64,99,228,115,4,1,94,70,96,151,0,58,+114,5,75,215,0,59,74,221,99,25,78,5,148,227,1,65,124,77,217,128,+111,135,175,128,117,195,165,195,119,192,145,134,213,64,5,129,7,224,3,1,+131,217,224,61,7,224,3,9,224,31,1,128,83,224,241,3,224,101,1,128,+117,0,80,238,189,0,64,13,129,1,0,80,85,145,171,243,0,66,68,69,+121,65,68,57,0,99,182,165,0,78,175,35,128,7,96,5,1,124,36,165,+75,0,76,96,243,4,32,94,61,124,55,108,251,102,51,192,65,121,197,144,+183,0,61,100,159,87,253,0,65,118,239,2,65,124,122,98,115,4,60,94,+69,124,87,160,45,70,113,66,33,175,49,1,124,118,160,135,86,95,65,35,+0,75,160,39,65,105,224,13,0,1,124,55,118,115,64,225,147,149,90,101,+64,15,68,95,64,181,224,53,1,0,61,107,77,1,66,124,90,165,64,215,+66,251,64,33,207,161,64,65,66,183,64,81,64,181,192,247,90,167,136,49,+128,23,2,65,94,82,97,3,0,91,165,37,0,72,161,193,4,66,124,77,+124,93,96,9,66,121,2,50,124,32,97,19,193,223,0,65,101,91,161,201,+2,124,44,92,96,35,166,13,0,58,80,27,229,215,0,2,68,124,107,96,+7,0,83,114,161,0,68,135,33,1,124,97,96,41,0,38,104,99,129,197,+64,97,96,111,5,124,43,124,56,124,80,108,229,74,233,2,95,94,45,96,+93,69,199,4,35,94,67,124,124,109,171,0,47,68,3,1,124,123,96,9,+64,131,224,15,2,31,34,32,58,51,48,55,32,64,10,65,32,95,54,32,+95,50,51,55,32,64,95,54,32,89,32,66,32,66,32,83,32,85,9,32,+95,49,55,49,32,64,64,64,64,64,16,1,90,32,224,7,1,12,83,39,+32,83,32,64,66,32,67,39,32,83,39,64,8,13,83,32,64,95,49,52,+52,32,95,55,50,32,64,35,192,52,0,67,64,23,224,38,0,27,66,32,+64,64,67,32,67,32,95,54,55,32,95,50,52,56,32,64,64,95,49,57,+56,32,95,50,56,49,64,62,5,55,54,32,35,49,50,64,22,160,61,0,+39,64,110,11,95,49,50,53,32,64,67,32,95,49,48,48,160,42,224,54,+19,3,85,32,35,48,224,65,0,31,66,32,80,32,95,49,54,55,32,102,+114,111,109,85,84,70,56,32,34,92,34,46,47,108,105,98,47,68,97,116,+97,47,23,67,104,97,114,47,85,110,105,99,111,100,101,46,104,115,92,34,+44,50,48,50,58,56,34,128,64,64,228,96,231,96,73,128,13,64,136,224,+190,28,128,188,2,64,67,39,64,252,7,95,49,57,55,32,95,57,54,64,+27,192,213,64,205,96,17,64,81,0,49,160,11,192,64,3,95,50,56,51,+64,187,4,51,48,48,32,64,160,56,224,28,0,129,80,64,71,96,152,3,+95,49,51,52,96,163,3,95,51,48,51,225,41,1,160,79,128,142,225,21,+2,64,72,64,11,10,95,51,48,53,32,64,64,58,51,48,54,130,1,2,+51,48,52,66,15,0,53,96,13,7,98,115,117,110,112,97,99,107,64,17,+0,52,96,17,64,111,2,95,51,48,64,234,3,51,48,50,32,64,56,0,+51,96,24,2,66,32,89,64,254,65,165,0,58,96,25,64,44,65,43,0,+67,129,46,3,55,56,32,95,97,181,96,118,129,146,98,86,129,225,128,57,+128,190,0,49,128,190,225,44,0,192,190,65,93,0,49,96,94,0,49,128,+171,65,9,0,80,65,121,5,54,32,64,95,50,57,97,139,6,50,56,48,+32,95,49,56,96,219,96,11,2,50,57,57,97,163,1,56,57,161,72,65,+175,0,48,224,11,2,0,50,224,11,0,0,50,65,49,160,11,67,9,1,+56,52,64,87,0,56,161,32,0,48,96,116,5,117,114,101,109,32,58,96,+84,96,130,1,55,57,98,223,64,176,66,248,1,50,51,160,133,66,29,0,+56,64,121,226,180,24,128,220,3,95,51,54,52,226,160,15,3,87,111,114,+100,96,4,0,56,130,158,6,55,54,58,51,52,58,32,66,160,224,49,1,+128,31,13,115,117,99,99,58,32,111,118,101,114,102,108,111,119,130,194,224,+159,11,65,1,224,159,2,65,107,224,159,66,0,55,224,159,16,8,112,114,+101,100,58,32,117,110,100,224,160,3,97,108,6,55,57,32,64,95,53,51,+161,123,225,122,2,0,67,65,195,0,49,64,4,225,90,8,131,152,128,5,+64,38,1,51,51,195,147,99,114,98,21,0,50,224,57,1,224,244,2,224,+31,12,224,89,2,68,199,2,53,32,73,96,33,96,123,0,55,64,21,224,+20,2,96,54,96,20,0,58,96,62,226,12,6,64,69,160,80,0,57,64,+211,226,5,1,0,54,64,14,129,85,225,83,28,129,82,3,57,54,58,52,+225,82,12,225,241,19,128,132,96,245,224,132,1,97,234,224,132,46,0,55,+224,132,15,225,214,13,65,205,97,201,97,194,129,209,225,17,1,225,188,7,+0,52,64,21,225,150,0,0,53,224,186,6,224,25,1,99,236,224,71,2,+64,19,0,52,192,72,165,173,0,39,162,55,96,83,128,77,160,58,65,174,+134,236,132,155,133,216,224,133,2,101,33,0,83,230,211,1,68,191,0,66,+69,188,100,160,165,202,0,89,160,170,224,66,0,64,13,166,220,135,54,128,+7,96,81,0,50,97,102,98,203,160,28,192,76,64,32,135,15,0,95,68,+195,129,186,3,79,32,64,75,192,11,160,53,160,252,64,177,224,165,2,224,+42,1,165,74,0,58,96,225,224,218,17,96,136,224,218,68,97,44,224,218,+70,64,165,224,218,11,134,146,224,46,0,72,107,96,44,128,179,224,125,5,+160,192,96,202,160,180,163,15,64,91,71,145,128,150,164,221,232,225,0,198,+98,98,81,67,210,2,50,56,56,103,52,2,95,57,49,135,60,0,58,98,+117,11,10,65,32,85,32,75,50,32,75,52,32,65,64,56,0,58,68,16,+224,21,3,96,187,0,58,68,59,160,21,96,84,134,66,96,84,100,240,135,+130,96,9,1,50,53,102,102,100,126,5,10,65,32,80,32,58,64,37,128,+60,0,65,64,60,0,56,169,162,2,49,50,57,134,244,69,161,168,128,0,+54,68,123,137,182,230,181,4,64,54,0,54,96,54,0,73,64,79,129,65,+0,83,98,30,65,2,129,37,162,8,161,31,136,33,128,33,65,55,224,22,+4,168,104,0,49,233,78,20,10,73,110,116,101,103,101,114,95,84,121,112,+169,78,3,53,52,58,49,169,77,128,65,0,55,71,163,0,54,129,141,1,+39,66,65,235,226,27,3,72,5,224,34,2,224,26,3,224,23,2,193,179,+1,95,49,74,108,64,6,72,122,96,253,131,1,105,24,102,206,0,64,97,+66,96,87,2,50,56,50,64,14,161,158,0,56,225,202,12,64,34,107,12,+69,227,72,66,98,192,160,10,132,73,104,88,0,54,103,47,0,50,128,38,+64,11,0,73,97,84,231,107,7,231,80,7,97,73,231,103,15,224,45,14,+64,185,103,32,66,151,64,162,130,87,97,77,96,24,64,19,130,93,64,17,+1,52,57,131,75,0,53,64,166,0,55,64,133,226,95,0,64,44,98,131,+0,53,65,197,0,53,128,103,69,167,2,50,53,50,96,5,64,11,66,182,+2,95,50,53,103,150,135,26,1,53,57,224,73,0,67,13,2,50,54,48,+98,132,64,17,166,77,64,7,224,48,2,0,54,98,226,128,11,65,179,224,+11,0,0,50,224,56,8,131,169,162,108,75,86,234,39,1,224,27,5,103,+223,136,165,67,110,68,121,71,129,128,41,1,95,50,64,198,128,18,224,81,+50,67,163,224,81,6,64,18,3,95,50,55,53,224,196,2,224,232,2,67,+119,0,75,65,74,1,56,32,160,67,0,75,160,8,64,21,0,52,134,114,+64,43,12,10,65,32,112,111,112,99,111,117,110,116,32,58,96,54,164,206,+75,194,2,95,50,55,67,182,1,56,50,170,243,0,58,64,99,129,168,1,+55,52,64,46,131,187,194,169,0,90,224,1,14,0,75,66,30,224,0,4,+0,58,96,88,107,217,231,231,17,7,66,105,116,115,47,66,97,115,163,175,+5,49,49,52,58,49,56,231,232,7,9,97,114,105,116,104,109,101,116,105,+99,232,109,4,0,58,97,37,230,116,0,69,115,102,98,228,89,1,192,5,+1,95,49,66,98,98,177,0,49,227,132,0,164,2,197,162,66,178,134,30,+1,50,54,230,31,0,227,196,3,227,21,3,128,66,0,58,66,83,129,28,+225,22,15,224,1,3,225,34,9,64,0,0,58,96,147,192,197,97,144,100,+100,96,133,0,58,66,193,161,126,0,51,224,94,42,0,58,96,75,224,92,+4,64,230,132,163,2,95,50,54,69,185,128,238,0,58,67,55,160,105,225,+229,17,224,103,14,0,58,96,73,224,195,5,102,11,128,195,0,54,130,80,+96,89,224,92,14,224,84,7,0,58,96,58,194,119,224,49,11,224,61,19,+192,66,162,127,69,39,109,169,69,67,133,61,165,60,100,6,229,60,6,100,+154,131,136,101,26,135,42,68,254,0,58,96,47,102,200,106,205,66,44,98,+32,226,26,2,0,58,64,88,64,35,2,42,32,58,96,105,129,21,3,95,+50,53,52,194,121,226,87,12,101,132,0,58,68,221,160,49,239,250,3,228,+76,10,233,95,2,104,187,0,53,224,29,5,2,95,50,53,108,34,227,229,+1,0,53,64,167,227,229,0,1,64,58,69,88,227,216,3,224,2,3,193,+64,64,51,168,68,224,30,3,225,112,3,0,58,96,104,224,178,62,96,85,+224,178,2,65,174,224,178,4,226,72,0,0,51,224,141,3,226,2,6,0,+58,96,56,224,183,7,226,45,14,0,58,96,117,7,10,65,32,120,111,114,+32,58,102,132,2,10,65,32,128,11,129,200,64,206,224,1,31,68,131,224,+0,11,224,57,25,192,1,224,65,14,224,56,25,128,1,224,62,13,224,55,+25,64,1,224,59,12,224,54,25,224,56,13,224,53,44,224,50,41,224,47,+38,224,44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,+26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,0,+80,225,251,10,131,86,236,128,1,229,180,13,224,1,3,227,146,4,224,68,+3,133,14,76,67,74,89,101,204,73,222,74,223,241,18,0,0,56,113,123,+96,65,224,19,0,149,35,224,19,5,84,8,224,19,7,100,133,224,20,8,+145,205,224,41,7,73,122,224,20,8,224,103,1,0,58,109,18,235,212,9,+0,52,133,31,237,159,6,73,158,231,19,0,70,133,0,58,64,138,224,225,+0,139,31,1,50,51,104,9,78,236,2,95,50,52,141,118,107,43,80,93,+1,95,55,75,25,96,123,0,95,108,21,96,10,0,58,96,6,5,10,65,+32,117,62,61,65,53,132,207,1,117,62,64,11,132,207,1,117,60,96,24,+129,158,1,117,60,64,11,180,96,4,99,109,112,32,58,96,115,96,134,0,+57,71,16,128,231,231,24,2,224,252,1,73,84,192,20,0,58,97,146,106,+53,1,51,54,64,68,128,244,1,98,115,149,196,64,20,160,29,74,83,0,+51,213,228,5,108,101,110,103,116,104,64,17,128,180,197,177,106,205,0,58,+65,135,64,21,0,82,141,250,64,16,213,222,129,204,0,51,135,164,1,50,+55,96,27,181,155,98,32,0,50,108,88,79,146,2,95,50,50,113,183,64,+36,1,95,50,86,193,2,95,50,50,65,86,97,62,96,65,129,62,96,10,+0,58,96,6,225,62,0,64,40,193,62,64,58,225,62,0,64,77,193,62,+64,95,3,10,65,32,105,129,62,64,115,143,45,0,53,64,13,200,130,64,+108,0,50,97,193,0,50,86,188,96,160,3,10,65,32,47,96,76,128,213,+0,61,96,11,205,95,0,89,175,39,145,48,1,95,49,65,11,4,90,32,+95,50,49,110,188,1,95,49,173,226,113,8,2,58,50,50,234,38,0,98,+118,0,58,96,38,173,147,0,54,138,223,0,49,65,6,66,195,89,114,2,+95,50,49,180,66,0,49,128,214,11,94,109,100,53,83,116,114,105,110,103,+32,58,96,27,183,114,2,66,32,95,105,201,0,49,74,36,119,86,64,15,+216,69,97,102,72,72,1,64,95,175,245,64,101,140,93,160,55,104,246,1,+90,32,224,31,0,129,30,4,110,101,119,67,65,128,111,2,76,101,110,64,+114,129,40,228,86,2,2,58,50,49,201,109,184,105,250,1,3,129,25,64,+42,139,241,0,95,107,190,128,148,0,48,64,144,64,71,177,148,2,95,50,+49,65,224,0,49,142,232,73,239,128,138,241,56,2,64,14,225,121,2,64,+71,248,39,0,184,40,97,133,145,228,64,45,169,168,90,165,236,223,13,12,+83,121,115,116,101,109,47,73,79,47,77,68,53,140,222,4,54,48,58,49,+55,236,221,7,16,109,100,53,67,111,109,98,105,110,101,58,32,101,109,112,+116,121,144,176,64,191,69,92,69,30,161,197,65,124,2,49,48,53,64,134,+65,131,91,39,0,80,100,79,108,231,243,62,0,96,170,64,58,248,222,2,+128,81,97,28,65,247,153,193,65,159,0,48,66,70,65,63,250,3,0,1,+95,49,89,88,1,95,50,89,74,229,137,1,65,83,162,38,6,65,114,114,+97,121,32,58,96,58,130,98,0,49,86,168,65,238,1,49,50,82,16,96,+10,0,50,64,69,194,50,100,158,64,14,96,194,160,45,64,35,192,204,160,+46,162,86,192,46,130,90,96,196,224,50,1,179,211,0,58,96,201,166,28,+186,67,239,97,0,142,4,249,252,8,243,157,8,244,117,7,230,218,0,251,+111,7,143,169,113,34,118,6,238,11,2,234,178,2,160,55,84,125,160,69,+224,236,1,96,187,96,8,224,45,2,96,96,148,20,250,117,8,226,190,0,+99,238,193,0,247,74,1,224,43,2,242,145,1,160,38,244,187,0,187,78,+173,69,135,102,0,58,96,135,132,163,70,190,123,83,193,254,129,247,0,35,+100,92,80,75,0,58,97,152,4,10,65,32,35,49,69,215,187,95,219,0,+0,49,113,77,0,49,146,166,0,49,100,88,0,49,81,6,154,244,96,89,+186,244,224,11,0,64,161,128,11,122,244,192,23,80,116,0,58,96,12,243,+67,2,76,43,97,151,76,86,175,229,161,164,131,255,236,116,1,168,145,224,+29,0,188,163,162,13,98,67,71,24,115,151,0,51,64,7,141,124,96,15,+96,23,141,155,1,95,49,119,177,129,213,64,27,98,109,117,224,0,56,150,+30,192,19,196,22,96,95,131,109,64,136,132,118,121,159,176,103,238,36,5,+164,131,96,215,129,247,123,245,96,78,128,48,224,146,17,180,76,64,17,0,+57,97,45,229,244,1,231,52,1,96,27,224,21,1,136,132,96,128,233,141,+0,162,6,96,165,224,63,2,160,20,0,54,160,20,233,153,4,0,58,96,+132,160,44,64,13,199,175,224,37,7,165,178,193,154,106,30,98,103,64,181,+71,195,66,1,226,146,9,96,27,210,149,97,195,1,95,49,86,133,86,128,+66,63,224,27,11,96,136,182,181,233,93,5,96,30,2,10,65,32,125,49,+98,144,98,179,251,36,1,81,85,1,95,49,99,212,67,224,0,51,215,143,+242,170,19,9,69,110,117,109,95,67,108,97,115,115,182,91,3,56,58,52,+49,229,204,7,2,73,110,116,251,23,19,160,119,162,73,80,159,224,119,42,+0,57,224,119,14,251,10,12,1,73,32,144,223,1,95,49,86,114,160,243,+131,51,249,159,0,84,17,162,144,1,95,49,119,196,128,162,224,19,1,73,+71,128,58,64,7,0,51,250,243,13,96,70,128,64,160,51,65,137,130,78,+250,23,12,84,31,250,22,68,68,68,88,148,96,87,128,27,250,21,10,149,+251,247,222,5,161,141,224,243,0,250,21,0,96,163,250,20,9,96,222,224,+215,16,96,134,224,215,67,96,154,224,215,69,64,163,224,215,11,131,216,224,+45,0,90,236,64,43,250,235,33,66,227,64,90,134,214,227,91,1,230,165,+0,192,9,0,58,98,73,67,153,2,56,52,32,83,160,1,95,49,75,136,+218,239,0,35,66,130,96,58,0,58,98,142,192,40,224,36,9,0,58,98,+154,7,10,65,32,117,113,117,111,116,67,241,216,144,224,1,3,238,248,78,+0,58,68,86,132,95,155,31,103,69,99,43,122,77,100,249,97,109,0,58,+103,45,140,190,0,49,76,102,230,17,1,0,58,96,39,96,26,105,48,200,+189,0,48,186,255,123,57,66,75,163,102,96,20,64,137,251,19,42,1,51,+57,251,19,2,71,195,85,248,64,171,121,128,1,54,52,232,215,1,160,30,+139,222,190,241,251,6,9,236,165,2,162,50,130,19,64,158,251,197,6,130,+39,67,8,98,36,64,13,251,129,6,138,178,64,29,251,124,6,65,231,155,+105,65,44,0,54,225,71,0,122,65,0,56,74,70,67,36,193,76,173,131,+1,56,55,97,94,0,95,70,149,0,58,96,32,7,10,65,32,97,110,100,+32,58,96,55,128,66,121,100,160,33,130,102,0,75,64,31,130,81,0,80,+64,10,130,77,64,21,183,77,0,65,64,10,234,253,0,80,3,0,49,119,+68,1,95,49,86,234,0,58,65,142,64,27,0,73,64,38,128,170,1,95,+52,137,47,78,192,1,95,49,79,124,64,6,0,51,224,56,2,79,75,192,+11,66,229,151,149,96,6,171,100,67,74,200,183,1,95,49,124,3,0,58,+64,43,64,31,103,195,128,16,128,216,64,40,162,33,86,83,132,132,0,80,+232,85,3,96,64,224,15,8,64,65,231,160,0,97,20,182,196,105,82,65,+219,208,12,101,24,64,14,85,109,192,68,85,161,224,21,3,128,171,96,21,+64,7,140,123,122,178,64,14,124,62,96,159,65,34,3,53,53,32,58,96,+19,3,10,65,32,90,64,190,0,58,96,39,161,122,182,102,65,83,246,6,+0,0,73,96,35,209,54,71,221,106,54,0,90,160,4,224,14,6,192,184,+165,38,96,145,0,52,113,107,64,202,0,58,96,6,207,171,240,248,5,0,+52,64,17,144,232,240,254,7,224,26,3,0,58,96,91,96,153,104,183,182,+64,96,80,67,4,1,95,49,78,164,0,58,96,46,175,251,96,17,239,239,+0,99,59,64,46,196,102,97,112,0,64,98,56,3,49,32,64,75,96,112,+170,125,128,33,131,79,0,85,224,23,2,204,216,172,142,96,8,164,191,1,+95,49,82,139,96,194,134,19,224,8,3,68,4,0,58,64,206,129,236,229,+217,1,192,9,128,44,128,137,64,12,98,233,242,242,0,224,16,0,129,166,+65,177,178,226,0,75,97,217,64,26,234,65,4,178,166,3,95,49,52,50,+64,43,129,56,67,110,178,166,112,241,0,75,160,183,1,51,53,228,223,2,+23,78,111,110,45,101,120,104,97,117,115,116,105,118,101,32,112,97,116,116,+101,114,110,115,32,132,212,96,44,128,7,65,219,195,106,68,181,96,11,0,+58,96,6,163,82,115,95,0,49,82,172,0,58,113,73,96,22,193,118,110,+119,2,53,32,35,74,154,74,195,64,10,162,59,198,29,224,32,2,142,220,+70,244,193,122,71,224,204,35,0,80,64,103,224,65,2,224,64,5,161,133,+128,58,96,0,0,58,96,154,231,136,0,128,163,97,55,179,103,102,67,0,+54,133,88,0,58,96,29,203,5,64,14,129,121,1,95,49,83,109,97,15,+128,73,98,99,96,140,133,103,135,198,0,58,64,38,128,250,230,218,0,0,+58,114,111,100,184,0,57,80,224,0,48,225,127,2,17,67,111,110,116,114,+111,108,46,69,120,99,101,112,116,105,111,110,46,70,100,3,114,110,97,108,+234,147,5,0,80,129,152,7,77,97,116,99,104,70,97,105,96,29,64,88,+129,223,69,67,179,178,129,55,2,115,101,113,65,55,1,83,32,96,8,103,+95,0,58,103,38,162,23,179,139,193,57,128,1,231,212,80,179,237,141,48,+236,224,2,179,248,64,48,0,95,164,206,72,229,209,60,71,160,77,86,235,+208,14,15,70,111,114,101,105,103,110,47,77,97,114,115,104,97,108,47,113,+74,135,150,3,50,51,58,52,254,249,8,5,109,97,108,108,111,99,96,37,+167,178,0,58,81,98,64,129,0,79,65,18,212,107,1,48,54,67,102,0,+49,113,204,224,8,0,1,95,49,80,14,146,43,2,95,49,49,68,200,192,+11,68,180,160,11,0,50,72,63,192,11,102,157,83,212,0,58,96,18,81,+240,6,112,111,107,101,87,111,114,71,51,180,179,4,94,112,101,101,107,192,+18,181,144,199,215,84,135,64,96,0,56,96,66,248,2,0,247,15,2,96,+34,224,50,3,116,89,192,50,244,182,0,66,158,84,75,67,133,70,210,1,+95,49,116,176,0,58,96,39,6,10,65,32,116,111,73,110,73,234,180,170,+4,116,111,80,116,114,64,14,129,28,238,14,6,180,116,235,2,1,137,97,+136,162,64,8,1,95,49,84,107,163,173,0,95,135,134,111,195,77,60,0,+58,65,59,194,12,239,104,2,212,158,64,76,92,175,0,49,83,35,130,14,+64,64,194,9,2,49,49,49,226,9,18,6,83,116,111,114,97,98,108,169,+155,4,50,53,58,55,50,130,4,128,98,220,130,104,100,0,51,107,225,2,+95,49,49,227,141,3,77,239,4,102,105,110,101,100,163,94,180,198,67,49,+180,163,248,99,2,96,162,130,49,82,65,177,233,0,58,98,47,2,10,65,+32,171,62,179,88,227,62,1,227,66,2,227,105,73,243,187,2,161,70,70,+102,128,150,161,183,202,253,173,73,108,148,80,209,96,78,96,17,97,199,244,+102,1,138,139,1,95,49,114,92,102,12,82,197,0,58,96,90,2,10,65,+32,85,57,0,83,112,155,136,39,212,11,76,218,148,246,102,250,145,156,243,+148,4,165,111,179,19,68,169,0,58,96,49,231,51,4,64,77,133,252,128,+87,73,99,243,154,0,150,125,167,88,244,51,1,165,250,193,55,224,202,2,+1,64,95,81,209,134,28,242,50,1,224,149,5,192,150,195,112,228,178,1,+0,58,114,95,201,206,96,19,0,58,178,33,96,103,202,28,228,195,61,2,+57,58,52,162,190,224,55,1,100,194,0,97,228,195,4,242,141,0,242,61,+5,178,143,0,95,75,11,99,243,74,220,99,76,0,95,75,70,0,83,140,+78,245,142,0,108,83,65,78,83,154,224,186,0,128,1,124,20,224,37,1,+224,33,0,129,48,142,58,103,214,82,214,0,58,178,243,0,66,110,96,1,+64,95,82,220,0,58,242,239,0,129,119,66,114,1,56,53,173,27,0,80,+96,7,98,65,226,64,0,78,192,65,57,116,254,200,39,64,212,168,231,0,+56,86,58,67,112,78,249,179,38,0,89,162,49,246,109,3,237,45,1,194,+33,207,74,76,168,128,191,239,87,5,97,2,239,16,0,66,8,179,98,4,+105,110,118,32,58,179,88,4,115,104,114,32,58,179,72,90,104,179,55,0,+97,96,23,179,46,4,115,104,108,32,58,179,45,2,43,32,58,177,186,2,+45,32,58,176,236,2,73,32,58,176,30,231,22,7,175,200,130,99,100,105,+0,56,202,251,2,56,32,95,77,86,0,95,109,168,77,130,0,95,77,157,+112,83,110,202,123,135,97,169,123,134,96,9,0,58,175,207,139,16,99,139,+241,37,0,87,210,96,242,69,153,175,232,224,29,1,224,49,1,224,39,4,+175,162,227,3,2,175,138,91,229,175,122,2,62,32,58,174,87,91,225,174,+66,2,60,32,58,174,54,155,222,174,54,107,210,115,204,112,200,174,55,75,+208,174,55,65,98,174,55,2,80,32,58,174,54,195,220,164,23,194,34,224,+20,11,224,17,8,224,14,5,224,11,2,192,8,229,80,0,174,152,245,95,+5,174,145,4,110,101,103,32,58,174,146,2,42,32,58,174,92,2,45,32,+58,174,70,2,43,32,58,238,63,0,224,148,66,0,58,238,82,1,103,150,+64,17,238,85,1,188,98,105,77,252,97,25,174,45,73,126,78,68,78,11,+0,58,174,52,6,94,102,114,101,101,32,58,174,52,188,130,64,40,80,3,+109,228,64,12,160,52,1,64,58,64,112,65,203,78,119,174,82,2,73,32,+58,174,78,64,41,66,182,77,209,0,58,174,25,64,29,129,29,64,9,128,+210,0,94,137,162,1,32,58,173,212,224,249,2,0,58,173,219,2,85,32,+58,173,86,225,33,14,0,58,173,69,129,10,104,124,109,76,173,75,104,118,+114,231,173,81,6,114,97,105,115,101,32,58,173,79,7,65,46,114,101,97,+100,32,58,173,80,13,73,79,46,103,101,116,65,114,103,82,101,102,32,58,+173,87,4,95,51,50,32,95,76,247,0,95,76,86,229,155,1,5,115,116,+100,101,114,114,69,150,0,58,173,118,2,73,79,46,128,20,1,32,58,173,+39,96,59,76,117,224,59,9,2,111,117,116,128,59,209,33,112,49,172,185,+128,73,4,111,117,116,32,58,172,179,4,95,51,54,32,58,172,170,2,73,+32,58,204,165,96,95,65,230,76,134,224,95,4,1,105,110,96,94,172,192,+3,75,52,32,58,172,169,128,91,3,105,110,32,58,172,166,129,89,0,95,+75,157,102,206,130,60,252,105,1,127,220,162,161,251,76,3,97,132,0,95,+110,210,64,104,201,110,225,195,1,172,162,254,207,0,0,56,147,176,162,72,+76,147,1,64,58,172,164,92,136,178,31,0,46,162,20,172,69,93,189,0,+58,172,57,13,73,79,46,112,101,114,102,111,114,109,73,79,32,58,171,204,+111,217,232,32,2,0,58,235,217,0,1,32,95,107,148,96,123,99,10,89,+248,225,4,0,3,62,62,32,58,171,149,0,95,64,66,68,145,119,171,0,+51,192,248,1,49,56,128,65,91,110,224,9,0,160,85,1,64,58,171,190,+187,111,113,219,177,161,111,24,99,38,171,197,128,35,96,32,113,223,192,32,+73,169,90,139,128,132,2,55,32,58,171,194,224,47,7,96,150,157,58,64,+48,171,198,81,206,194,229,164,172,0,58,235,195,0,145,68,160,12,68,57,+138,195,128,253,235,118,1,0,49,171,211,192,12,140,136,100,44,171,162,96,+61,76,126,0,58,255,243,1,163,82,171,46,1,95,51,97,243,100,121,129,+219,71,83,129,81,73,67,96,36,127,38,69,243,170,159,128,232,2,75,32,+58,229,113,0,70,11,96,11,2,66,32,58,164,81,9,79,46,114,101,116,+117,114,110,32,58,167,68,65,181,2,61,32,58,128,197,2,80,32,58,229,+111,7,229,91,37,0,58,226,178,1,228,89,11,237,129,3,64,15,64,200,+1,95,57,71,156,224,0,255,224,0,255,224,0,255,224,0,181,1,32,125,+};+const unsigned char *combexpr = data;+const int combexprlen = 45120;+static const struct ffi_entry imp_table[] = {+{ 0,0 }+};+const struct ffi_entry *xffi_table = imp_table;+static struct ffe_entry exp_table[] = {+  { 0,0 }+};+struct ffe_entry *xffe_table = exp_table;++
generated/mhs.c view
@@ -1,6399 +1,7838 @@-static unsigned char data[] = {-122,76,90,49,39,243,1,0,26,118,56,46,48,10,50,51,53,50,10,65,-32,95,48,32,95,50,51,32,64,95,51,52,53,32,64,66,224,15,2,6,-53,55,32,64,64,66,32,224,18,3,17,52,57,32,64,64,64,83,39,32,-66,32,64,66,39,32,67,32,83,64,50,6,83,32,67,39,32,83,39,128,-10,24,64,95,49,50,55,32,95,51,53,57,32,64,102,114,111,109,85,84,-70,56,32,34,45,104,34,64,57,15,64,67,39,66,32,85,32,95,51,57,-57,32,95,52,48,48,64,19,1,75,50,96,25,224,70,29,0,63,224,70,-61,4,45,104,101,108,112,224,74,11,0,52,224,74,41,6,118,101,114,115,-105,111,110,224,77,9,3,50,51,53,32,224,40,1,8,77,105,99,114,111,-72,115,44,32,160,47,0,32,64,48,96,35,4,95,52,49,50,32,128,10,-224,46,1,16,44,32,99,111,109,98,105,110,97,116,111,114,32,102,105,108,-101,224,55,5,2,52,49,51,96,111,224,172,0,2,83,39,32,64,123,2,-64,67,32,224,166,14,6,110,117,109,101,114,105,99,224,174,5,2,66,32,-80,192,250,64,131,224,77,0,96,0,65,250,64,248,96,90,64,5,2,95,-56,50,130,8,64,109,9,95,52,49,52,32,95,50,49,32,64,64,115,5,-52,49,54,32,64,35,64,12,0,66,128,80,64,7,224,209,5,6,102,108,-97,103,115,32,61,96,191,7,64,95,49,49,56,32,95,52,96,62,96,0,-0,67,128,100,162,113,0,83,64,27,96,138,128,121,224,23,4,96,249,224,-23,10,97,187,65,4,0,66,66,159,10,95,52,50,55,32,64,85,32,75,-32,65,128,99,0,67,66,174,2,39,32,64,96,208,9,95,52,50,56,32,-64,95,52,50,57,65,50,3,67,32,95,55,66,253,2,95,49,52,66,243,-0,75,96,161,2,50,50,51,192,105,3,67,39,32,80,64,231,0,39,64,-212,0,50,64,221,8,95,56,52,55,32,95,53,50,50,224,224,2,11,99,-111,109,109,97,110,100,45,108,105,110,101,64,228,2,35,48,32,96,3,129,-86,3,95,51,52,51,226,172,0,128,143,4,95,50,51,49,53,162,54,1,-32,67,98,2,161,16,64,9,2,56,32,64,64,190,97,5,64,198,96,149,-224,43,0,128,149,1,95,50,131,146,163,145,3,32,95,56,49,97,162,0,-51,64,204,1,51,49,64,76,65,133,64,115,129,93,128,60,129,209,1,95,-49,96,224,226,47,2,98,61,1,56,52,192,13,5,79,32,35,52,54,32,-129,14,193,27,3,67,39,32,79,161,220,66,130,224,8,0,160,6,161,60,-192,45,96,0,9,58,50,51,53,49,32,64,10,65,32,65,105,224,1,19,-0,83,65,94,2,51,49,32,65,53,2,95,49,51,64,250,162,70,1,79,-32,224,140,2,96,98,65,196,64,25,97,190,224,205,0,226,254,4,224,192,-4,1,95,55,96,145,160,152,0,79,65,138,0,49,64,4,4,51,32,73,-32,64,227,41,2,5,108,105,98,47,103,109,132,28,96,56,128,241,97,173,-0,53,227,82,3,3,47,108,105,98,224,37,1,224,66,3,3,111,117,116,-46,67,189,162,233,96,199,224,6,28,224,161,3,192,20,0,51,99,152,192,-6,224,27,4,224,113,1,6,100,101,102,97,117,108,116,160,112,64,35,65,-116,0,48,97,116,2,66,32,89,97,241,98,32,0,83,194,201,65,50,4,-67,32,64,64,80,226,245,0,162,21,64,5,64,13,163,253,132,255,228,83,-14,132,68,224,57,42,0,118,224,57,48,0,113,224,57,48,0,114,224,57,-48,0,108,224,57,48,0,115,224,57,48,1,67,82,224,58,49,0,87,224,-58,49,224,57,48,0,84,224,57,48,3,88,67,80,80,224,60,48,0,122,-224,57,48,0,81,224,57,2,195,26,198,78,128,73,231,245,19,0,111,192,-61,64,46,0,82,96,54,229,142,2,197,134,70,93,165,134,224,105,49,2,-112,116,99,224,108,20,128,85,229,249,0,69,58,128,114,103,10,164,182,134,-233,1,64,67,68,202,198,72,224,144,12,161,51,64,14,161,69,96,108,232,-91,4,0,49,64,100,0,35,71,48,128,0,167,187,228,83,0,224,57,2,-96,87,128,105,225,161,1,192,37,224,38,0,225,170,6,128,95,1,49,48,-224,96,0,224,61,43,225,117,0,224,61,45,0,54,224,61,5,224,67,0,-224,61,11,0,67,224,61,6,0,54,71,186,224,60,2,0,66,225,91,1,-225,33,8,224,62,10,0,55,201,218,224,119,9,224,178,18,0,56,200,88,-224,53,36,0,57,199,165,224,53,36,0,55,193,29,224,195,2,226,31,8,-0,49,232,234,0,160,37,102,121,224,51,74,0,49,192,195,224,103,35,108,-200,224,103,38,203,27,224,51,33,227,35,0,128,36,169,186,74,111,2,54,-55,57,200,165,4,89,32,66,32,80,105,222,163,177,2,49,48,54,103,177,-0,80,105,95,3,52,52,50,32,107,89,171,51,0,49,98,93,72,180,106,-40,163,246,0,49,73,130,1,49,49,96,11,104,41,2,50,48,56,224,12,-0,160,0,96,130,228,62,22,109,230,99,59,64,43,128,138,3,64,95,57,-53,227,15,0,224,0,2,224,79,12,107,36,192,77,0,52,234,134,1,1,-49,57,192,137,227,81,1,64,16,129,25,0,85,128,10,160,68,0,67,234,-200,12,202,82,128,49,0,90,224,60,1,224,10,0,224,220,23,224,76,1,-229,27,4,0,57,128,18,229,27,5,224,223,28,0,54,224,223,11,224,130,-20,0,55,224,130,13,1,55,52,67,244,224,130,5,224,70,64,224,197,10,-224,72,0,77,5,230,161,1,224,43,20,230,205,9,225,198,33,224,58,1,-225,198,58,224,76,1,224,252,5,0,57,66,164,225,198,11,109,123,238,145,-9,7,85,110,107,110,111,119,110,32,78,153,1,58,32,103,100,203,230,172,-116,2,35,49,48,128,76,237,184,3,160,156,160,249,64,128,165,34,76,146,-2,49,52,49,140,44,2,50,52,52,231,199,3,0,46,135,196,224,34,20,-136,84,224,25,11,0,97,200,1,160,241,174,138,140,254,224,239,2,232,24,-63,225,196,12,0,52,224,65,1,0,95,231,94,0,224,39,11,68,139,224,-39,27,0,50,224,39,30,228,147,1,224,39,11,80,151,160,40,228,110,1,-224,61,2,228,65,3,224,108,26,224,46,8,224,39,14,228,218,3,224,39,-19,228,34,3,224,39,17,0,50,69,167,224,79,28,227,249,1,224,39,21,-227,216,1,5,95,54,49,32,95,55,112,222,1,53,55,160,9,1,51,50,-166,84,128,0,224,64,0,0,83,224,64,11,97,98,0,48,128,57,82,122,-0,53,177,234,128,57,131,175,135,11,0,58,128,69,84,86,5,56,49,51,-32,75,32,80,184,131,221,224,1,21,136,114,224,0,5,224,53,44,224,50,-41,224,47,38,224,44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,-29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,-192,8,96,5,100,245,72,197,224,0,13,66,88,0,56,226,88,5,0,90,-224,147,4,224,1,15,226,34,10,226,88,255,224,37,23,224,35,4,224,32,-23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,-11,2,192,8,96,5,226,86,19,66,85,0,55,226,85,5,224,101,1,104,-142,225,247,25,64,1,226,46,10,224,55,26,224,53,10,224,50,41,224,47,-38,224,44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,-26,17,224,23,14,224,20,11,226,45,14,66,40,0,54,226,40,15,64,1,-162,44,226,46,255,224,41,20,224,38,29,224,35,26,224,32,23,224,29,20,-224,26,17,226,3,12,66,1,0,53,226,1,17,193,255,224,85,7,224,1,-11,225,254,255,224,38,20,224,35,26,224,32,23,224,29,20,224,26,17,224,-23,14,228,25,13,66,22,0,52,228,24,19,228,26,2,226,28,255,224,41,-19,224,38,29,224,35,26,224,32,23,224,29,20,225,235,11,65,233,0,51,-225,233,21,225,235,3,225,236,255,224,41,19,224,38,29,224,35,26,224,32,-23,225,207,10,65,206,0,50,225,206,23,128,1,225,212,2,225,215,255,224,-41,21,225,110,7,65,107,0,49,225,107,29,192,1,225,115,5,64,0,224,-49,23,64,1,225,119,64,224,193,3,64,189,159,73,224,189,4,64,161,224,-89,23,64,1,226,11,246,224,38,29,224,35,26,224,32,23,224,29,20,224,-26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,238,115,17,-0,58,150,190,227,10,35,227,12,11,226,121,48,224,153,2,64,138,241,82,-6,224,69,11,224,124,3,224,31,11,224,1,7,224,117,11,224,53,44,224,-50,41,224,47,38,224,44,35,224,41,32,224,38,29,224,35,26,226,67,9,-65,176,240,173,16,224,1,7,226,51,6,224,40,17,224,1,1,225,185,205,-225,71,6,65,68,0,54,227,128,35,227,124,8,224,46,21,128,1,225,74,-114,224,239,4,64,237,238,181,18,224,1,7,224,235,7,224,43,19,192,1,-226,53,161,226,9,5,65,26,237,185,22,224,1,11,229,139,10,224,88,2,-64,84,172,36,6,50,48,57,32,95,57,53,89,69,3,57,53,53,32,96,-26,170,112,7,50,48,55,32,95,50,52,54,89,102,96,56,2,95,50,52,-159,172,64,12,14,67,32,83,32,95,49,50,55,32,95,53,49,32,64,35,-92,118,224,18,6,224,37,10,94,123,224,18,6,158,9,224,18,4,0,52,-224,18,9,89,210,0,67,127,233,224,18,0,127,241,76,236,252,128,1,19,-116,111,69,110,117,109,58,32,111,117,116,32,111,102,32,114,97,110,103,101,-156,146,128,220,64,194,1,49,53,127,0,65,12,64,103,90,158,0,50,97,-21,2,95,49,48,122,57,4,64,95,49,56,57,125,69,129,23,3,64,85,-32,83,221,58,2,67,32,60,160,178,224,18,6,160,159,224,18,3,64,159,-1,85,32,96,6,64,7,96,90,224,35,7,64,129,1,85,32,96,6,64,-7,64,88,96,36,224,91,4,129,71,224,55,4,64,194,1,85,32,96,6,-64,7,129,213,1,85,32,97,133,189,155,189,78,97,183,128,252,158,9,128,-5,157,129,5,49,52,50,32,95,54,64,52,3,95,50,52,53,224,47,0,-224,13,6,1,67,39,66,164,3,95,50,49,51,224,81,3,65,25,224,26,-14,161,105,0,56,224,67,1,2,95,50,56,226,70,1,66,98,235,103,28,-226,196,4,224,34,13,224,1,5,230,26,205,224,41,32,224,38,29,231,177,-8,65,143,236,57,10,161,127,224,84,15,224,1,3,225,119,255,224,38,20,-224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,-8,224,14,5,236,49,16,3,58,50,51,50,140,48,0,83,100,18,0,66,-229,190,0,5,51,53,57,32,64,75,64,51,0,66,64,27,1,95,48,68,-7,127,160,0,55,68,66,132,233,95,150,128,9,224,31,0,2,64,67,39,-64,119,3,95,55,57,53,70,155,127,225,8,66,32,95,52,52,48,32,95,-57,86,227,68,229,1,55,57,70,184,1,50,49,96,15,64,31,0,67,96,-75,1,66,32,102,24,4,64,95,50,51,53,230,30,2,11,67,97,110,110,-111,116,32,102,105,110,100,32,134,22,3,64,66,32,85,64,46,133,14,0,-56,101,50,128,155,0,55,64,31,3,95,50,51,50,101,99,224,10,3,64,-9,0,55,103,40,0,50,140,151,64,109,0,54,160,182,224,227,7,73,196,-65,60,3,95,52,49,52,69,148,64,65,224,33,4,4,50,51,50,53,32,-192,235,224,128,0,64,82,1,57,57,158,110,73,25,2,79,32,35,69,112,-97,70,128,29,224,112,1,128,41,224,234,6,0,32,192,224,5,89,32,66,-32,80,32,64,56,128,99,3,67,39,32,89,96,12,0,32,64,15,0,64,-64,28,96,145,126,219,70,96,128,174,1,49,48,102,183,133,226,0,79,96,-94,4,50,54,32,95,49,68,40,193,111,160,141,128,37,129,153,0,64,161,-154,70,6,65,177,65,36,140,11,96,112,98,69,128,6,160,15,64,112,64,-136,7,95,54,54,50,32,64,95,52,81,128,224,6,0,1,51,49,65,113,-4,66,32,95,49,57,224,28,1,64,82,0,54,130,105,4,32,95,49,49,-53,198,203,225,115,2,104,63,130,77,225,81,0,160,37,225,134,1,200,75,-0,51,104,15,2,95,51,53,160,37,226,57,12,22,103,101,116,68,105,114,-101,99,116,111,114,121,67,111,110,116,101,110,116,115,58,32,99,130,79,3,-111,112,101,110,193,110,129,94,2,83,39,32,65,91,64,5,225,233,4,224,-136,1,129,113,98,121,0,83,232,214,0,224,138,5,226,150,0,224,65,3,-104,41,224,24,8,0,51,135,114,129,225,96,217,225,190,0,226,90,8,1,-95,52,66,80,97,85,0,49,224,18,0,97,89,104,250,94,104,163,207,139,-145,9,94,99,95,100,95,110,97,109,101,32,64,19,138,138,7,94,114,101,-97,100,100,105,114,96,18,138,72,0,75,224,145,5,0,55,66,174,225,128,-4,194,168,0,66,130,210,225,91,1,64,91,0,58,129,63,64,167,0,48,-98,204,192,135,224,66,29,6,118,101,114,115,105,111,110,224,69,1,1,52,-48,100,23,1,51,49,97,47,224,69,30,13,99,111,109,112,105,108,101,114,-58,32,109,104,115,45,96,74,1,95,57,98,130,224,64,30,6,100,101,112,-101,110,100,115,224,134,1,1,55,49,128,38,76,221,0,85,99,112,160,51,-0,64,128,231,192,66,2,79,32,35,67,54,99,80,128,187,97,140,2,50,-49,52,160,10,0,67,98,74,192,129,96,126,224,118,1,15,101,120,112,111,-115,101,100,45,109,111,100,117,108,101,115,58,162,138,165,79,227,1,3,0,-85,99,160,73,239,226,19,4,224,79,6,4,111,116,104,101,114,224,77,7,-192,60,130,40,228,127,1,1,95,54,196,128,105,224,228,131,10,64,24,129,-213,0,56,76,89,224,0,1,66,60,140,106,128,170,0,66,224,151,7,226,-188,0,227,181,2,74,181,1,54,53,202,181,0,52,67,255,138,245,229,8,-14,15,66,117,105,108,100,105,110,103,32,112,97,99,107,97,103,101,128,147,-170,186,69,1,163,171,230,123,7,67,158,66,64,5,54,32,64,95,55,54,-99,77,229,51,1,67,180,196,98,132,197,227,232,1,1,95,52,231,33,0,-96,29,128,48,0,39,224,5,8,224,230,3,192,131,224,232,30,192,234,128,-10,224,239,5,3,87,114,105,116,224,238,9,101,211,98,120,226,181,9,2,-32,116,111,161,168,0,55,196,6,224,189,1,128,2,65,153,232,9,0,224,-183,2,161,160,0,39,96,2,64,184,1,54,52,65,46,160,70,160,46,2,-50,51,49,99,203,160,79,134,97,96,8,200,42,77,216,65,126,3,50,51,-49,56,97,6,0,56,66,247,0,85,102,181,3,64,85,32,65,96,156,0,-52,131,137,224,21,5,109,180,195,147,1,51,53,168,74,164,62,227,255,0,-64,15,132,8,161,50,225,170,6,192,196,225,127,29,225,128,22,6,67,111,-109,112,114,101,115,68,143,3,32,116,105,109,193,129,129,74,225,131,0,101,-126,79,76,72,221,134,140,3,55,52,32,95,142,128,0,64,225,156,2,1,-109,115,194,176,136,122,68,81,227,23,0,1,49,50,72,167,64,87,0,54,-101,246,6,51,54,56,32,95,55,56,96,212,195,109,70,53,128,183,97,33,-129,91,131,124,141,132,1,66,32,232,35,1,225,145,1,168,10,248,64,1,-128,7,230,91,4,141,159,65,175,100,210,0,55,71,165,96,88,140,77,0,-83,196,241,2,54,53,49,97,223,0,49,66,24,2,95,50,57,64,179,166,-242,104,80,2,64,35,52,128,82,166,136,131,14,0,80,227,155,1,98,129,-224,50,4,101,47,161,8,168,71,99,148,103,227,65,236,1,95,52,73,157,-193,41,66,20,200,91,0,49,196,46,68,185,65,17,0,54,99,222,64,14,-1,54,54,70,54,64,20,80,126,224,163,11,0,73,64,9,196,198,231,55,-1,98,127,72,55,226,14,8,195,135,103,65,104,45,9,102,32,116,104,101,-32,102,111,114,109,96,20,0,45,198,188,131,131,98,21,0,49,73,107,1,-51,48,175,205,0,58,129,245,97,170,224,1,1,235,177,30,224,11,2,192,-8,73,241,160,86,183,88,2,50,49,54,69,189,0,49,66,126,64,22,137,-178,128,58,0,95,96,144,73,218,0,56,82,51,194,255,0,55,65,42,96,-246,70,9,0,55,99,132,112,118,92,174,3,95,49,57,53,129,209,64,77,-0,54,226,102,0,163,5,200,249,65,100,229,38,5,204,11,195,146,1,67,-32,138,71,241,231,6,15,112,107,103,80,97,116,104,32,105,115,32,101,109,-112,116,121,230,163,0,130,166,129,243,96,6,0,79,66,55,0,79,235,57,-0,192,27,128,135,96,105,134,123,231,41,5,228,17,13,64,12,70,14,1,-54,49,131,168,177,118,228,15,22,6,73,110,115,116,97,108,108,229,147,9,-64,99,168,12,229,144,6,0,105,234,78,0,64,81,230,28,0,233,92,5,-196,82,70,133,224,13,1,229,180,0,224,208,4,4,95,50,51,48,51,68,-113,229,223,0,131,83,96,226,128,50,224,253,10,64,53,147,138,139,219,161,-63,225,172,1,64,54,232,8,0,225,91,2,161,123,135,83,231,204,19,161,-81,146,199,231,192,14,4,99,114,101,97,116,231,182,1,224,84,6,97,66,-224,219,1,69,32,128,107,2,32,95,56,171,70,129,104,96,193,64,176,110,-50,106,104,66,87,133,36,2,95,57,52,101,86,96,9,96,233,236,207,7,-134,158,108,108,1,95,56,67,152,202,162,233,193,10,224,101,3,234,136,4,-238,168,1,64,0,0,75,174,78,66,218,1,95,52,131,236,67,46,139,118,-70,231,2,90,32,75,102,182,64,21,182,3,105,100,69,128,64,83,0,50,-131,173,181,201,68,191,79,82,64,25,141,122,64,32,99,121,129,226,0,80,-109,226,0,32,133,25,68,200,225,100,1,1,46,47,129,95,135,86,167,99,-64,72,0,48,128,72,179,174,1,50,51,86,45,2,50,51,48,164,39,133,-231,129,131,64,121,0,54,165,124,64,28,73,241,233,218,0,67,105,1,95,-53,65,144,64,42,143,61,64,49,128,61,96,54,199,116,64,219,0,53,70,-214,237,239,1,64,48,64,126,64,64,224,125,1,65,5,64,21,229,163,1,-1,95,52,90,120,64,26,129,67,162,112,194,160,80,47,65,231,1,95,52,-103,211,194,143,224,30,8,0,56,150,33,224,30,6,2,95,52,56,65,239,-227,45,8,2,95,51,56,96,83,144,49,96,125,129,171,168,213,96,212,224,-99,2,110,178,105,141,65,242,1,35,53,108,7,1,64,75,64,24,128,36,-65,153,163,14,235,100,0,162,227,167,209,130,4,0,50,96,223,228,65,2,-3,95,52,48,49,64,4,1,51,32,64,66,66,145,0,55,228,248,1,71,-227,129,136,229,15,1,129,155,238,135,0,150,96,231,100,4,128,211,129,9,-228,176,2,229,82,3,131,240,168,21,0,85,71,228,128,52,238,75,4,0,-48,130,163,71,136,160,22,64,193,130,165,0,48,194,165,0,89,230,2,0,-0,66,64,134,136,102,64,17,224,54,2,224,140,0,160,87,130,152,2,94,-109,107,174,141,65,83,166,186,233,229,7,230,102,3,235,233,1,229,93,9,-0,56,94,110,234,253,1,224,42,1,120,60,103,227,114,51,0,90,228,229,-13,71,70,230,10,0,239,98,0,1,64,67,134,109,128,0,64,27,0,85,-160,35,128,9,160,10,224,183,11,229,233,2,205,33,131,209,161,14,160,167,-230,10,2,224,21,8,224,24,1,192,239,165,248,160,80,172,145,224,96,3,-231,13,31,235,19,28,16,116,111,112,32,108,101,118,101,108,32,100,101,102,-110,115,58,32,96,0,236,154,0,229,91,2,2,55,51,57,153,50,235,32,-5,164,145,96,22,231,44,6,7,40,117,110,112,114,117,110,101,179,210,224,-76,3,224,64,2,0,95,107,20,67,19,0,49,232,12,2,225,18,24,237,-170,9,65,11,72,149,0,53,91,27,98,47,186,72,227,173,1,151,62,161,-13,164,69,131,165,239,244,4,224,195,2,0,61,160,187,0,32,64,76,243,-231,1,192,0,225,202,5,130,252,224,180,1,173,125,75,2,64,62,166,200,-226,79,1,226,158,4,103,178,0,55,102,249,64,4,228,115,6,224,55,4,-226,137,12,224,119,5,233,183,4,226,49,68,9,102,105,110,97,108,32,112,-97,115,115,130,43,226,49,3,163,151,97,82,128,59,226,53,0,128,14,237,-89,18,230,243,2,237,89,4,163,239,161,255,129,5,205,1,130,161,238,245,-16,224,225,1,2,95,50,50,169,39,169,94,228,60,1,235,71,3,85,71,-2,49,50,57,160,147,172,131,89,123,64,27,0,57,234,84,0,78,218,160,-115,2,95,52,56,171,109,1,55,48,64,41,0,56,230,241,1,229,242,3,-231,207,2,0,104,192,220,175,24,102,51,0,50,109,127,0,56,129,24,64,-14,241,142,0,161,239,129,142,226,111,1,161,99,192,30,225,87,3,96,19,-96,34,0,50,72,191,117,147,97,226,76,13,64,33,2,35,49,48,172,192,-225,130,17,6,32,108,105,110,101,115,47,225,136,2,236,11,4,229,134,3,-100,237,194,255,160,123,100,211,128,155,109,173,1,50,50,72,124,225,5,2,-3,99,111,109,98,192,91,165,6,224,53,4,126,81,224,53,9,234,107,1,-225,195,3,3,95,57,48,50,226,161,2,3,109,104,115,99,224,42,7,229,-201,0,230,24,11,79,159,72,42,224,46,1,226,86,4,232,65,0,224,168,-0,227,80,7,1,95,55,74,61,225,208,0,121,62,64,189,129,206,0,57,-212,54,234,252,6,224,11,0,209,151,239,84,1,193,223,3,95,50,50,54,-135,147,1,50,57,209,39,98,57,192,128,2,95,51,54,162,227,3,95,50,-49,56,66,119,237,143,5,31,84,104,101,32,45,114,32,102,108,97,103,32,-99,117,114,114,101,110,116,108,121,32,111,110,108,121,32,119,111,114,107,115,-4,32,119,105,116,104,85,85,161,46,64,104,162,12,209,222,1,50,50,75,-49,64,117,104,162,7,95,49,49,57,56,32,95,56,112,82,112,179,225,121,-2,2,97,105,110,227,186,3,2,58,50,50,66,183,107,52,130,41,197,200,-255,53,0,78,74,97,249,64,103,121,146,3,90,32,64,83,96,106,0,39,-96,113,128,16,161,25,3,95,56,57,48,224,123,1,1,57,51,64,11,228,-93,1,228,168,5,5,68,117,112,108,105,99,76,161,0,105,77,232,1,110,-99,237,222,3,197,248,64,7,112,246,166,1,230,2,10,1,97,116,128,55,-118,53,96,41,224,119,2,224,0,1,66,233,72,72,224,91,0,1,95,52,-140,240,225,207,2,227,167,4,236,159,1,68,123,102,88,81,234,71,80,147,-65,224,131,2,0,125,225,85,1,64,31,1,85,32,172,162,228,17,2,90,-59,224,13,1,238,120,2,174,123,160,250,224,17,2,192,20,227,202,2,224,-48,8,224,51,10,224,57,3,227,188,3,224,29,17,224,65,3,135,35,195,-103,163,109,224,203,7,96,2,128,41,224,37,8,230,192,0,236,191,1,161,-209,65,102,1,49,50,115,68,137,194,73,217,1,95,49,72,15,68,224,0,-95,86,211,134,226,2,95,55,54,161,154,167,214,65,84,1,75,52,161,119,-224,159,6,68,101,1,49,50,109,33,2,49,50,53,244,173,3,128,1,100,-90,224,234,8,225,5,2,192,40,194,196,129,41,64,133,198,82,224,34,3,-224,62,0,99,227,128,120,224,34,3,64,18,229,231,1,242,64,0,163,45,-4,64,83,32,95,57,113,11,1,49,49,141,44,224,96,1,128,146,133,159,-147,149,224,100,6,100,202,105,44,160,17,2,95,49,49,100,203,192,107,225,-10,11,225,4,2,192,162,224,166,5,192,157,160,221,234,200,1,160,185,193,-22,132,93,0,56,230,165,1,96,61,96,147,96,209,102,230,64,211,214,134,-227,64,1,67,80,143,24,231,8,4,128,0,226,48,0,0,67,97,231,0,-50,175,186,235,248,6,3,64,66,32,82,64,214,122,24,64,0,173,247,128,-238,233,133,5,236,32,1,143,34,228,48,5,1,65,32,227,172,0,224,122,-1,143,62,226,112,1,161,21,96,21,228,139,3,128,207,254,81,0,228,57,-12,228,23,2,2,64,94,42,231,69,0,143,160,160,65,87,238,234,171,3,-163,127,138,103,160,9,131,32,231,217,3,1,95,49,151,142,96,238,100,98,-160,133,193,60,65,59,192,86,2,80,32,90,241,7,0,132,182,192,25,65,-31,0,85,96,42,130,129,3,85,32,75,51,64,2,160,11,224,53,0,86,-167,224,11,1,229,227,0,0,55,81,5,98,155,229,236,13,229,162,8,1,-78,111,76,189,3,105,110,105,116,87,218,4,102,111,117,110,100,85,197,187,-237,197,217,227,111,0,70,149,181,94,182,104,246,83,10,65,64,246,83,3,-5,95,52,52,50,32,35,65,126,64,62,176,246,0,54,169,246,0,54,96,-61,0,54,248,147,0,228,115,6,130,201,140,232,170,100,0,57,73,117,0,-57,96,44,192,68,0,49,98,229,202,117,163,119,64,108,0,54,209,141,114,-80,2,95,50,50,145,251,98,12,125,223,137,100,129,216,97,56,119,206,115,-90,0,52,128,7,65,81,248,75,10,196,8,130,206,197,117,133,85,65,150,-130,246,109,86,248,91,0,195,10,224,94,36,162,116,165,19,224,108,0,96,-176,143,181,162,5,224,107,4,96,106,227,122,0,103,127,0,54,128,224,195,-47,65,43,226,14,8,10,35,105,110,99,108,117,100,101,32,92,34,237,188,-0,64,47,2,79,32,35,78,15,238,175,1,64,103,235,167,15,7,109,104,-115,102,102,105,46,104,131,94,98,149,4,49,32,95,51,53,66,74,225,73,-24,150,236,224,245,6,224,13,0,100,117,192,36,224,46,2,224,10,6,164,-158,225,125,5,129,15,129,19,225,25,0,225,17,0,130,59,1,50,50,98,-105,228,78,0,224,212,1,31,115,116,97,116,105,99,32,115,116,114,117,99,-116,32,102,102,105,95,101,110,116,114,121,32,116,97,98,108,101,91,93,32,-2,61,32,123,64,239,228,122,6,192,84,67,192,224,77,3,4,123,32,48,-44,48,136,154,224,22,3,1,125,59,224,17,7,224,111,8,1,42,120,64,-11,96,117,1,32,61,128,125,96,52,228,177,3,234,200,6,24,85,110,105,-109,112,108,101,109,101,110,116,101,100,32,70,70,73,32,102,101,97,116,117,-114,101,225,160,0,2,50,50,56,122,235,227,144,1,81,238,161,178,64,29,-99,93,2,50,50,56,164,111,225,197,1,65,98,65,186,232,197,1,225,142,-1,133,43,160,5,193,231,0,83,99,112,0,83,66,50,64,63,72,54,229,-45,0,96,3,96,12,167,126,198,41,136,39,224,85,0,99,106,76,230,4,-61,61,32,64,35,166,116,231,77,5,232,10,1,243,114,2,117,176,2,50,-50,57,168,22,226,7,2,68,18,148,224,141,75,192,100,199,126,116,244,0,-83,96,15,165,255,100,56,232,13,0,212,97,97,49,225,121,1,5,100,121,-110,97,109,105,173,79,64,73,0,85,97,107,76,150,224,226,3,224,73,26,-6,119,114,97,112,112,101,114,224,73,7,68,233,192,73,225,24,1,224,65,-2,227,163,15,130,206,236,112,2,97,9,0,95,124,43,193,205,192,232,186,-209,193,210,138,136,72,111,239,177,26,224,97,0,194,40,104,148,1,50,50,-118,94,0,49,102,159,96,28,0,85,150,62,128,23,119,227,64,0,224,135,-12,226,106,11,128,19,225,58,3,246,55,8,242,130,4,128,47,196,115,224,-96,0,194,162,224,87,3,225,83,4,150,65,168,133,196,151,233,152,1,98,-229,225,138,4,0,66,71,251,66,115,185,128,246,98,0,225,255,3,225,185,-36,3,118,97,108,117,163,185,224,105,13,103,42,1,67,39,64,106,0,95,-105,146,192,245,224,141,7,224,17,4,224,142,6,226,234,1,104,193,133,121,-226,105,1,64,38,238,80,18,230,85,6,1,98,97,104,84,9,101,105,103,-110,32,105,109,112,111,114,174,22,254,23,11,99,138,0,51,167,157,0,65,-135,172,151,75,105,36,64,14,151,30,2,75,50,32,64,12,247,26,1,64,-1,223,188,224,13,9,231,61,1,254,44,0,0,58,130,110,224,105,2,67,-79,224,105,2,67,168,1,10,65,230,6,4,5,71,69,84,82,65,87,229,-165,7,11,71,69,84,84,73,77,69,77,73,76,76,73,224,27,7,2,97,-99,111,112,33,224,19,4,6,100,100,95,70,73,76,69,224,23,11,3,117,-116,102,56,224,23,8,0,115,144,28,224,19,4,1,116,97,224,19,12,0,-50,224,20,7,4,99,97,108,108,111,99,234,224,21,4,3,108,111,115,101,-114,71,224,21,4,224,171,9,2,101,120,112,224,18,7,4,102,108,117,115,-104,224,59,8,3,102,111,112,101,224,145,8,2,102,114,101,98,172,224,19,-3,2,103,101,116,224,60,8,5,103,101,116,101,110,118,224,21,7,7,105,-115,119,105,110,100,111,119,224,148,8,2,108,111,103,224,18,7,0,109,224,-230,12,6,109,100,53,65,114,114,97,127,76,224,23,6,0,66,225,129,11,-7,109,100,53,83,116,114,105,110,224,94,9,3,101,109,99,112,224,70,9,-4,101,109,109,111,118,224,225,8,1,112,117,224,225,9,225,194,10,3,115,-113,114,116,224,19,8,4,121,115,116,101,109,224,21,7,225,235,10,5,116,-109,112,110,97,109,224,122,8,1,117,110,225,94,11,5,117,110,108,105,110,-107,224,21,7,3,114,101,97,100,224,42,8,3,119,114,105,116,226,24,9,-5,112,101,101,107,80,116,102,127,224,22,4,2,111,107,101,224,22,14,3,-87,111,114,100,224,69,11,224,23,11,66,247,13,108,122,55,55,95,99,111,-109,112,114,101,115,115,111,224,82,8,224,34,0,1,100,101,224,36,21,2,-114,108,101,224,70,22,64,33,224,69,23,2,98,119,116,224,69,22,64,33,-224,69,19,64,235,4,95,117,105,110,116,227,205,8,65,29,224,25,14,192,-51,1,49,54,224,52,16,224,26,10,192,53,0,51,227,251,8,224,53,0,-224,26,10,192,53,1,54,52,224,53,16,224,26,10,64,53,224,212,16,224,-211,16,224,210,17,224,209,17,224,208,17,224,207,17,224,206,17,224,205,17,-3,117,115,104,111,227,135,9,129,3,224,26,13,64,53,224,52,17,224,51,-17,65,82,225,107,16,224,207,15,224,205,15,224,97,13,1,108,111,228,186,-9,128,98,224,25,12,64,51,224,50,16,224,49,16,1,117,108,224,102,18,-224,103,17,224,104,17,224,51,16,1,102,108,224,255,13,224,23,10,5,115,-105,122,101,111,102,225,25,11,160,25,224,100,11,192,26,224,27,11,70,206,-1,100,105,227,215,8,103,56,224,23,10,69,76,224,46,11,2,95,100,95,-229,167,11,1,99,104,224,44,10,127,241,224,20,7,4,103,101,116,99,119,-229,50,8,6,103,101,116,95,98,117,102,224,180,11,3,98,95,114,100,224,-27,17,1,119,114,224,27,11,6,110,101,119,95,109,112,122,224,144,8,4,-112,122,95,97,98,231,126,8,96,22,0,100,224,147,8,96,22,0,110,224,-22,12,1,99,109,232,69,8,64,22,64,197,224,47,12,64,24,1,115,105,-224,25,15,0,117,224,25,12,82,197,1,95,115,224,56,16,224,30,0,224,-61,14,229,194,9,64,22,2,109,117,108,224,22,14,1,95,50,233,26,10,-64,27,1,110,101,232,61,9,8,112,122,95,112,111,112,99,111,117,226,158,-9,64,27,1,115,117,231,113,8,64,22,5,102,100,105,118,95,113,224,104,-16,0,116,96,30,224,182,12,4,116,115,116,98,105,224,106,12,0,120,224,-231,9,5,119,97,110,116,95,103,129,161,240,71,3,224,0,94,75,105,0,-54,244,84,4,1,95,52,125,121,179,239,118,74,80,143,237,28,1,240,140,-1,1,95,49,80,187,160,32,0,54,91,218,157,161,240,173,1,64,94,147,-238,2,85,32,90,114,26,0,90,176,27,141,247,86,187,1,50,50,124,167,-143,4,96,10,128,5,96,60,144,24,219,134,80,119,77,229,108,94,208,104,-214,19,192,26,0,95,237,0,5,4,123,32,92,34,38,65,93,88,99,246,-176,3,224,34,1,5,92,34,44,32,48,44,92,78,67,89,1,114,95,96,-45,211,126,224,38,1,1,125,44,96,24,96,0,109,132,224,104,9,224,103,-32,224,98,24,193,22,224,106,21,112,181,128,68,224,39,11,64,112,128,39,-174,54,192,151,247,150,2,65,172,110,91,224,61,8,224,169,30,128,174,225,-184,2,65,183,142,69,66,68,83,212,64,7,118,26,2,95,49,54,111,35,-64,34,142,89,225,218,12,250,79,0,208,116,146,14,175,24,149,124,96,8,-151,121,1,50,50,81,58,224,189,6,225,201,1,97,36,112,225,3,55,51,-32,64,155,74,152,197,96,211,64,121,65,68,1,50,55,94,146,1,50,54,-66,226,224,17,4,0,55,64,49,122,217,239,116,7,1,49,50,121,243,224,-116,1,207,105,16,38,32,109,117,115,116,32,98,101,32,80,116,114,47,70,-117,110,171,168,78,254,240,92,15,2,40,72,115,128,40,0,41,193,89,224,-43,7,176,189,64,5,96,186,241,89,7,64,171,149,112,211,59,225,26,0,-162,76,96,244,97,6,160,43,129,13,227,63,1,147,9,65,143,97,149,129,-136,97,113,179,140,158,251,160,87,97,40,243,62,0,82,4,0,50,68,11,-207,247,225,145,6,5,114,101,116,117,114,110,162,144,96,42,222,104,226,194,-1,224,50,6,1,59,32,160,52,66,137,64,22,6,95,85,110,105,116,40,-115,162,214,250,103,12,2,79,32,35,88,71,225,21,0,146,245,227,144,2,-64,32,222,186,224,65,0,88,15,1,48,55,226,253,4,194,249,1,53,54,-150,72,100,218,1,53,54,91,57,68,151,161,58,224,110,6,185,46,90,47,-163,83,97,103,0,85,221,164,195,1,227,51,10,145,91,225,56,10,64,252,-1,116,111,162,204,227,201,3,64,92,66,141,224,49,8,225,33,35,64,122,-145,201,67,139,130,9,117,220,154,19,122,71,0,85,250,103,0,0,55,96,-223,64,120,249,233,0,65,241,67,236,3,49,51,57,56,224,131,3,98,199,-64,31,250,181,1,0,56,70,31,4,95,49,48,48,56,113,228,64,250,1,-10,65,227,127,5,99,81,184,45,64,34,0,54,224,92,12,12,80,114,105,-109,105,116,105,118,101,115,46,73,79,192,103,134,105,116,208,131,0,224,202,-0,96,179,180,218,192,31,244,130,0,224,244,9,213,4,64,29,0,85,226,-251,1,195,21,225,9,4,160,43,245,80,1,128,139,134,184,227,7,12,226,-203,0,163,9,96,93,68,203,225,212,5,229,208,11,225,215,0,226,6,5,-254,62,3,229,198,10,229,194,4,227,30,7,64,172,133,173,69,36,155,71,-101,105,163,216,2,67,32,60,161,64,132,13,247,254,3,96,21,161,79,103,-145,0,85,164,50,224,36,3,165,111,86,101,192,89,226,77,9,101,117,160,-32,64,57,226,108,7,96,68,224,211,1,229,81,3,226,20,2,192,18,128,-0,224,115,2,100,219,1,95,54,249,88,2,130,137,2,50,50,55,96,195,-184,139,253,189,12,165,228,225,87,8,17,78,111,116,32,97,32,118,97,108,-105,100,32,67,32,116,121,112,101,221,185,1,49,53,133,134,65,90,134,229,-164,119,229,252,17,226,207,2,4,70,108,111,97,116,116,230,246,135,16,224,-34,2,0,64,224,85,30,0,73,138,252,224,82,16,192,31,224,79,31,210,-74,224,80,16,224,32,0,224,81,20,3,68,97,116,97,96,75,96,4,112,-192,224,81,20,128,33,224,82,20,132,119,224,69,16,70,64,224,68,25,0,-83,116,10,8,46,73,79,46,72,97,110,100,108,151,244,225,22,16,194,119,-231,137,1,75,73,157,51,97,250,225,200,16,136,47,8,46,67,46,84,121,-112,101,115,46,128,70,64,35,236,35,3,3,67,67,104,97,236,56,8,1,-67,83,224,21,12,0,85,224,43,13,241,23,11,1,67,85,224,22,13,162,-10,224,42,5,224,20,11,0,76,239,185,10,1,67,85,224,21,12,5,80,-116,114,100,105,102,238,250,8,3,67,83,105,122,239,158,8,1,67,83,224,-21,12,0,76,224,110,14,224,22,12,1,84,105,143,246,237,82,10,67,149,-135,106,230,84,18,228,96,1,64,46,135,30,224,46,18,224,43,1,68,200,-231,197,13,64,9,1,95,116,235,83,1,232,152,9,224,43,1,8,40,105,-110,116,32,115,41,32,123,229,187,5,224,32,1,0,59,158,192,128,206,73,-138,103,70,169,171,4,95,50,50,52,54,128,6,137,140,160,9,75,248,5,-48,54,32,35,49,50,100,221,2,50,50,54,196,166,0,54,135,136,64,18,-139,4,0,53,103,124,64,31,3,10,65,32,94,246,35,10,90,0,64,37,-192,235,0,51,104,213,96,10,0,48,64,173,96,126,0,53,155,121,0,39,-102,76,192,23,198,187,101,108,78,52,160,19,3,32,95,51,54,192,34,101,-173,92,141,0,52,73,109,1,50,53,134,6,154,226,134,154,224,58,1,64,-31,137,4,96,232,0,53,105,172,0,53,74,245,1,51,53,170,96,224,26,-5,124,254,0,53,70,94,71,59,3,51,50,50,32,169,202,224,153,2,224,-156,5,97,43,64,35,235,87,0,192,168,1,95,57,128,160,137,12,224,30,-16,159,39,188,211,225,9,2,160,152,0,54,64,191,123,24,224,65,0,224,-222,1,126,178,251,247,0,224,245,2,0,54,96,7,1,49,49,224,165,0,-224,0,1,65,156,136,129,0,94,154,108,97,174,135,230,141,113,2,39,32,-95,79,162,64,70,0,49,98,25,97,11,3,55,32,95,50,75,27,160,66,-134,188,4,112,97,99,107,67,153,153,2,76,101,110,96,73,131,63,0,94,-179,8,96,18,163,35,5,56,57,32,75,32,95,98,12,192,7,0,95,71,-69,161,4,1,95,57,225,131,0,106,7,224,12,3,64,218,128,12,160,157,-98,175,66,73,125,244,160,163,96,245,193,14,2,49,48,52,192,30,0,95,-108,65,0,58,128,65,224,137,22,96,47,160,137,96,11,192,137,160,12,128,-137,64,12,224,137,1,2,50,50,53,98,145,224,138,2,158,139,201,137,2,-50,53,55,224,139,1,64,5,64,139,131,153,0,94,85,56,1,80,116,99,-52,64,37,96,18,153,213,96,18,0,54,96,18,174,207,109,93,0,53,65,-156,227,37,9,141,155,2,95,49,48,104,181,64,58,195,130,64,51,0,51,-126,198,72,123,236,84,0,64,71,68,26,128,163,97,44,174,223,162,0,224,-189,0,0,32,162,105,64,217,128,58,130,46,0,94,156,113,96,167,130,15,-0,94,91,98,96,15,162,6,244,220,3,96,23,222,24,3,95,55,49,54,-237,118,2,228,190,1,30,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,229,185,-0,64,165,197,33,114,156,2,50,50,52,96,164,6,50,50,52,56,32,35,-50,170,91,224,90,3,1,125,59,101,24,224,20,5,224,104,5,10,42,99,-111,109,98,101,120,112,114,32,61,96,116,128,49,159,182,229,138,8,69,137,-192,47,5,108,101,110,32,61,32,192,45,224,153,0,241,77,3,106,177,2,-79,32,35,66,133,239,175,2,129,82,69,132,97,24,0,89,64,55,75,8,-3,85,32,95,49,96,209,129,237,95,53,224,7,1,229,39,1,69,182,206,-83,107,164,238,79,1,0,53,95,177,192,95,173,105,2,55,52,50,240,223,-1,241,238,7,101,69,76,5,0,52,160,161,64,56,130,148,64,97,1,75,-52,160,2,2,90,32,90,64,6,228,81,1,70,83,64,93,1,57,52,127,-254,0,52,130,122,5,67,32,95,56,56,55,71,28,65,140,64,23,211,179,-1,75,51,128,63,64,19,130,75,64,248,2,66,32,80,96,199,205,129,133,-108,0,67,105,43,225,4,11,225,12,0,161,5,96,0,64,18,140,235,1,-56,51,66,212,0,55,107,175,64,104,210,85,1,75,50,102,193,76,234,192,-15,160,211,224,1,5,224,225,1,224,230,0,207,12,0,75,224,46,10,224,-56,16,160,60,67,93,135,138,1,32,80,140,115,226,82,0,76,115,164,233,-2,54,32,35,111,86,195,125,135,172,100,52,198,249,128,14,163,56,0,35,-69,204,194,71,2,75,50,32,181,32,237,176,1,0,83,237,176,8,99,197,-237,112,0,224,25,3,97,67,109,132,237,224,4,65,189,0,85,128,140,160,-161,231,151,0,224,195,3,0,50,96,6,224,196,4,64,0,102,82,237,245,-3,96,101,102,106,224,62,27,2,85,32,83,128,144,5,95,49,54,53,32,-95,103,107,99,74,110,98,100,159,129,14,0,50,80,57,224,17,2,98,220,-1,52,52,96,5,86,138,2,49,52,54,233,114,6,64,9,169,42,128,44,-163,18,0,55,68,223,64,69,131,125,96,0,225,73,12,193,6,224,223,5,-96,21,66,35,161,139,224,34,10,101,163,224,34,4,225,78,9,1,49,48,-67,26,225,15,5,66,70,227,200,2,64,163,0,54,98,204,64,170,111,167,-111,64,72,193,0,49,101,205,3,95,52,56,53,73,213,96,101,65,217,96,-31,73,58,97,72,2,35,50,48,68,24,0,64,224,23,8,2,54,53,53,-64,89,98,71,224,24,4,4,49,49,49,52,49,112,215,3,95,51,52,51,-229,71,3,2,116,102,56,76,96,5,58,32,98,97,100,32,204,106,226,78,-3,0,83,197,69,64,147,96,238,1,56,48,137,105,164,191,0,35,200,96,-177,123,224,46,18,68,226,2,35,49,50,137,91,149,178,224,44,30,224,41,-32,131,84,133,43,3,50,32,95,51,120,251,160,168,67,116,224,27,22,224,-26,4,160,20,97,13,225,8,28,0,50,128,47,224,216,81,224,187,47,224,-184,22,178,234,224,139,38,224,111,12,203,212,0,67,64,74,64,39,66,230,-0,54,200,62,131,21,136,166,195,49,67,18,119,253,135,24,69,224,162,187,-131,12,107,203,70,44,0,54,68,15,128,18,105,38,227,0,4,160,24,99,-113,64,22,224,75,3,114,122,134,206,128,124,224,28,15,0,57,224,28,19,-0,49,97,221,224,49,7,164,241,224,137,9,131,189,64,214,224,71,8,64,-24,224,48,10,99,170,227,186,2,224,235,4,227,178,1,1,92,92,142,110,-73,16,192,148,225,184,8,0,49,85,123,97,185,129,144,227,30,5,128,59,-96,237,225,243,18,224,71,18,161,237,160,77,224,155,3,0,63,175,10,193,-254,192,107,65,39,224,20,2,224,129,29,160,115,133,70,160,56,228,192,6,-4,113,117,111,116,101,140,203,196,185,224,72,1,1,50,50,93,3,156,254,-128,74,107,154,64,0,89,106,233,47,2,66,137,7,10,65,32,80,32,35,-52,32,182,168,64,30,130,181,203,174,3,95,51,57,57,234,77,7,17,87,-101,108,99,111,109,101,32,116,111,32,105,110,116,101,114,97,99,80,64,15,-32,77,105,99,114,111,72,115,44,32,118,101,114,115,105,111,153,36,7,95,-52,48,56,32,95,52,49,102,71,96,169,224,89,0,1,52,49,79,166,91,-89,0,55,73,186,96,105,224,100,1,8,85,115,105,110,103,32,71,77,80,-230,247,0,239,126,3,1,95,56,70,93,174,3,238,137,5,1,55,54,74,-39,0,50,98,120,96,33,72,180,0,52,109,26,0,49,174,116,0,49,161,-201,238,119,0,181,58,74,6,0,49,134,172,76,74,0,51,96,181,1,95,-49,160,188,65,31,188,18,5,56,49,51,32,75,32,72,105,128,1,137,202,-192,13,224,1,19,0,67,128,105,224,0,4,224,53,44,224,50,41,224,47,-38,224,44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,-26,17,224,23,14,224,20,11,224,17,8,66,54,162,230,224,0,4,66,55,-139,209,224,93,5,224,1,15,226,34,11,226,91,255,224,41,19,224,38,29,-224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,-8,224,14,5,224,11,2,192,8,110,120,224,0,6,66,120,182,36,69,116,-0,55,159,50,0,49,116,59,70,110,96,15,0,55,91,229,102,129,192,34,-69,164,0,55,70,166,112,184,0,49,93,25,1,95,56,81,38,1,95,56,-78,153,69,124,224,77,0,64,39,229,184,6,88,4,7,32,39,58,113,117,-105,116,39,70,34,64,8,13,44,32,39,58,104,101,108,112,39,32,102,111,-114,32,64,9,133,213,224,73,2,0,51,85,180,0,55,90,106,2,95,50,-49,93,203,230,244,6,2,84,104,101,230,109,4,0,115,120,220,25,32,99,-117,114,114,101,110,116,108,121,32,111,110,108,121,32,119,111,114,107,115,32,-119,105,116,104,86,163,160,100,2,50,50,50,148,187,97,17,179,227,225,0,-0,1,56,48,77,172,64,233,0,56,114,63,128,227,148,255,224,33,2,2,-50,49,56,237,68,1,224,28,1,129,129,129,47,166,109,160,33,0,50,138,-97,96,30,72,217,244,226,1,64,26,71,146,224,220,1,4,46,109,104,115,-105,96,173,224,19,1,1,62,32,128,190,0,80,70,143,64,192,113,104,160,-203,205,167,65,252,233,105,2,0,35,149,195,225,206,5,70,240,97,86,161,-6,224,190,4,64,21,1,56,32,64,100,225,202,10,1,66,121,154,51,225,-66,3,129,69,64,13,176,34,1,95,54,87,186,96,223,129,46,167,47,108,-17,96,179,226,46,20,11,85,110,114,101,99,111,103,110,105,122,101,100,82,-163,2,109,97,110,187,114,224,82,9,194,238,81,114,96,10,71,119,144,126,-112,34,120,60,64,25,0,85,64,107,0,49,128,177,80,231,226,223,13,119,-241,152,82,232,224,5,8,65,109,98,105,103,117,111,117,115,192,144,189,20,-116,12,67,14,115,198,1,54,55,173,212,224,169,12,64,0,64,118,0,55,-81,239,64,8,81,16,1,56,56,106,227,112,25,0,54,129,59,0,52,223,-175,0,54,193,73,192,87,65,116,111,13,65,111,143,75,91,237,234,7,3,-2,105,116,32,96,0,96,9,169,127,105,117,0,56,130,112,160,147,175,147,-224,61,5,4,99,108,101,97,114,96,61,128,9,13,97,108,108,32,100,101,-102,105,110,105,116,105,111,110,224,70,0,228,57,2,0,50,86,96,105,92,-105,72,227,189,3,2,56,49,49,129,100,73,62,0,56,76,73,169,61,233,-82,0,0,49,85,197,201,82,169,130,1,95,55,153,188,225,63,12,224,173,-5,5,114,101,108,111,97,100,64,173,160,9,5,109,111,100,117,108,101,224,-166,0,227,172,5,100,174,227,195,9,163,219,227,194,19,1,95,56,113,75,-226,48,8,64,224,224,204,0,224,224,3,225,6,4,165,92,226,14,14,224,-209,5,9,100,101,108,101,116,101,32,100,32,32,192,9,225,124,0,3,40,-115,41,32,99,4,224,134,8,97,131,64,8,0,54,182,151,194,90,64,192,-66,105,128,26,0,52,84,191,226,110,4,66,96,120,62,225,109,12,224,153,-5,0,116,69,193,0,101,65,107,4,115,104,111,119,32,96,14,2,111,102,-32,100,11,228,90,9,227,252,12,224,81,6,4,107,105,110,100,32,98,171,-96,81,96,14,2,111,102,32,125,141,224,81,8,108,28,224,81,23,13,109,-97,105,110,32,97,114,103,115,32,114,117,110,32,96,13,101,245,7,97,114,-103,117,109,101,110,116,98,24,224,90,9,66,131,224,90,23,3,100,101,102,-115,131,86,96,172,166,97,227,27,23,0,50,115,9,225,248,9,224,91,5,-70,250,128,91,7,116,104,105,115,32,116,101,120,97,3,224,76,5,229,37,-0,100,150,64,91,121,13,0,49,77,216,100,120,176,84,153,233,132,46,228,-44,0,227,78,14,174,73,64,0,68,78,147,132,224,151,1,0,67,132,231,-3,115,58,94,42,120,83,128,0,8,101,118,97,108,117,97,116,101,32,64,-19,1,101,115,77,212,5,94,42,100,101,102,110,160,31,11,97,100,100,32,-116,111,112,32,108,101,118,101,228,60,3,2,94,42,34,110,78,64,183,231,-107,9,0,56,111,227,195,113,133,130,96,45,250,6,2,70,176,229,150,8,-0,95,65,225,0,65,65,243,101,141,103,100,248,28,3,1,49,50,65,25,-64,4,0,51,67,37,98,243,69,81,231,84,2,98,41,134,94,64,113,238,-238,0,224,161,11,228,39,14,1,50,49,111,79,103,121,150,8,250,27,0,-118,128,97,105,65,142,128,130,0,80,228,91,0,64,57,64,141,0,75,228,-150,13,230,149,10,1,49,53,91,7,64,103,0,50,154,219,0,52,133,125,-231,138,1,128,198,216,152,80,7,111,249,103,123,185,159,2,80,32,79,64,-109,240,154,1,231,65,4,199,69,224,13,1,0,85,224,13,2,96,25,245,-19,0,104,113,0,64,91,220,103,111,136,119,0,55,122,44,161,15,248,220,-1,128,18,64,184,69,42,1,50,50,100,171,96,172,248,220,2,0,75,65,-85,64,19,138,165,225,240,8,100,121,199,121,163,11,96,252,224,41,8,250,-209,0,161,147,225,139,3,128,98,137,246,224,49,1,74,166,1,95,105,67,-125,0,58,128,84,226,8,80,93,253,226,8,65,0,49,81,42,162,8,0,-48,248,123,0,128,228,69,139,226,8,51,225,250,64,131,195,153,43,225,249,-0,64,185,202,51,0,56,82,21,0,56,93,99,189,230,146,127,64,43,251,-118,0,64,220,64,19,210,166,1,95,57,114,38,96,5,64,23,131,188,226,-8,6,136,22,98,12,130,49,0,56,92,175,226,40,2,14,119,104,101,114,-101,94,42,105,109,112,111,114,116,32,83,108,69,12,46,73,79,46,80,114,-105,110,116,79,114,82,117,132,226,25,97,117,108,116,32,78,117,109,32,40,-73,110,116,101,103,101,114,44,32,68,111,117,98,108,101,41,224,30,1,1,-73,115,147,132,1,32,40,128,7,224,26,2,0,83,70,57,3,40,40,41,-41,101,10,128,199,195,165,226,99,13,161,103,1,32,83,108,57,75,208,1,-48,54,72,75,2,50,49,57,66,43,178,252,198,201,98,122,65,210,226,83,-7,1,64,90,133,64,69,0,0,95,202,159,65,144,0,90,66,63,156,164,-96,84,64,97,0,50,73,126,64,44,105,169,226,228,53,118,156,226,228,10,-66,1,168,119,72,179,192,26,222,46,224,86,0,227,185,16,70,10,97,55,-224,157,4,227,36,2,2,56,55,54,93,190,150,73,2,95,51,55,68,112,-237,109,2,224,42,0,0,80,96,205,148,54,64,72,180,72,224,61,1,224,-32,0,244,25,9,128,70,0,51,65,195,130,219,0,48,96,79,131,135,226,-102,0,193,24,94,100,64,192,65,23,152,34,160,202,221,200,108,168,99,150,-0,83,126,51,148,220,0,55,75,229,64,102,91,78,229,12,9,18,114,97,-110,115,108,97,116,101,58,32,110,111,116,32,102,111,117,110,100,98,231,221,-147,161,78,0,55,105,230,255,91,0,97,197,0,49,141,12,228,11,3,97,-96,228,3,3,99,218,130,3,163,203,159,188,80,89,130,82,0,57,255,190,-0,192,0,214,74,65,14,191,26,162,71,0,83,128,110,98,210,194,91,189,-171,64,14,96,86,196,87,193,89,129,108,99,247,196,141,131,21,64,76,64,-17,128,13,254,28,3,128,67,224,32,13,130,98,164,194,224,32,11,225,52,-0,160,135,252,244,0,192,24,0,85,64,155,99,56,128,165,253,165,18,5,-100,121,110,115,121,109,136,89,160,42,106,16,0,50,104,221,128,0,224,103,-8,96,161,0,85,225,251,31,65,247,6,32,112,114,105,109,111,112,161,247,-232,245,1,200,240,67,70,5,54,55,57,32,95,51,76,136,98,128,229,150,-0,175,31,255,68,5,86,195,129,125,2,95,52,48,66,243,1,50,48,202,-70,96,255,96,250,64,21,196,75,161,202,225,79,11,230,13,0,255,177,11,-237,121,1,225,1,3,96,21,0,85,193,255,224,116,5,2,49,51,54,170,-188,224,32,3,225,36,24,69,217,5,115,115,105,98,108,101,175,181,161,38,-0,49,196,15,0,58,130,202,70,59,106,47,152,124,203,88,129,183,96,24,-81,240,219,219,96,53,135,94,3,95,52,48,50,128,43,67,231,224,57,0,-0,50,66,27,137,245,1,95,50,98,33,1,52,54,161,74,64,59,134,252,-76,13,2,79,32,35,69,119,67,59,67,121,160,18,83,102,64,18,0,79,-224,18,2,0,53,128,18,128,22,236,70,3,1,67,39,172,222,224,43,0,-64,106,64,39,65,152,192,18,160,62,68,8,224,62,5,0,83,96,62,99,-139,160,43,68,255,64,43,67,236,192,125,0,51,128,18,67,148,192,37,160,-18,67,77,192,18,160,100,67,172,192,18,160,201,0,89,224,119,8,0,66,-96,119,0,66,224,119,2,0,57,160,119,72,109,192,62,0,50,128,18,0,-82,224,62,8,1,75,50,64,62,100,31,224,24,6,0,51,96,24,65,223,-224,24,6,0,52,96,24,69,131,225,64,7,0,66,129,65,225,129,2,66,-84,64,120,0,43,224,18,2,160,221,0,45,224,18,2,160,158,0,42,224,-83,8,91,150,64,84,64,7,224,28,8,1,114,101,100,28,2,114,101,109,-224,26,8,0,117,192,56,96,8,224,30,9,160,58,64,7,224,28,8,1,-110,101,124,2,2,110,101,103,224,26,8,179,71,2,97,110,100,224,26,8,-1,111,114,64,25,1,111,114,224,24,8,0,120,128,25,0,120,224,26,10,-2,105,110,118,64,26,2,105,110,118,224,26,8,2,115,104,108,64,26,2,-115,104,108,224,26,10,96,80,1,115,104,224,80,9,0,97,160,27,64,7,-224,55,9,2,117,98,116,85,233,96,60,160,11,224,36,8,6,112,111,112,-99,111,117,110,96,36,192,11,224,36,8,2,99,108,122,64,31,2,99,108,-122,224,26,9,0,116,128,26,0,116,224,26,9,1,61,61,64,25,68,162,-224,24,6,0,47,96,24,0,47,192,24,67,102,162,194,0,60,224,43,8,-0,60,96,43,0,60,224,43,3,162,60,0,62,224,43,8,0,62,96,43,-0,62,224,112,9,1,117,60,64,24,0,117,224,93,9,0,117,128,94,0,-117,224,95,0,224,26,2,0,62,96,25,224,101,9,0,117,128,102,0,117,-224,103,10,1,111,114,98,46,1,111,114,226,46,9,0,99,129,168,0,99,-225,167,10,1,102,43,64,25,0,102,195,50,224,24,2,0,45,96,24,195,-56,224,24,2,107,16,0,102,227,62,9,1,102,47,96,24,0,47,224,24,-9,129,140,0,102,225,141,10,0,102,129,142,0,102,225,143,0,224,26,2,-97,55,0,102,225,55,9,0,102,129,55,0,102,225,55,10,0,102,97,55,-0,102,225,55,9,0,102,129,55,0,102,225,55,10,0,102,163,130,64,7,-224,28,9,82,65,96,29,114,74,224,30,8,2,114,101,97,97,117,96,8,-224,30,8,3,105,116,111,102,64,29,64,7,224,28,8,2,115,101,113,64,-27,2,115,101,113,224,26,11,1,117,97,131,146,96,9,224,32,8,224,31,-0,224,30,13,2,115,99,109,121,159,64,7,224,148,9,160,28,64,7,224,-28,8,0,117,160,28,64,7,224,28,8,1,114,110,96,205,1,114,110,224,-204,9,3,73,79,46,62,129,98,128,9,224,32,13,224,31,0,224,30,11,-4,114,101,116,117,114,113,218,224,12,0,224,38,11,0,112,77,230,160,37,-96,11,224,36,11,7,115,101,114,105,97,108,105,122,116,241,224,15,3,224,-44,11,1,100,101,224,46,7,224,17,2,224,93,12,1,116,100,146,131,192,-11,224,36,14,1,111,117,192,168,128,12,224,38,14,1,101,114,99,157,224,-12,0,224,38,11,7,103,101,116,65,114,103,82,101,97,128,224,15,3,225,-34,12,7,101,114,102,111,114,109,73,79,193,38,192,15,224,89,12,0,99,-192,82,0,99,225,240,9,2,97,105,115,97,19,96,8,224,30,8,4,99,-97,116,99,104,64,30,96,8,224,30,8,235,81,1,128,9,224,32,8,4,-110,101,119,67,65,143,121,1,76,101,97,80,224,17,5,224,48,8,4,112,-97,99,107,67,128,30,64,45,224,14,2,224,42,19,160,91,224,17,5,224,-48,8,2,116,111,73,130,87,96,8,224,30,10,1,80,116,97,166,96,8,-224,30,10,1,68,98,99,144,96,8,224,30,10,2,70,117,110,224,64,0,-128,11,224,36,8,5,65,46,97,108,108,111,97,142,160,10,224,34,10,3,-99,111,112,121,128,33,64,9,224,32,10,0,115,162,198,128,9,224,32,10,-196,178,128,9,224,32,10,3,119,114,105,116,160,66,96,10,224,34,10,133,-208,64,7,224,28,8,2,98,115,43,102,82,64,7,224,28,12,0,46,192,-29,0,46,224,30,10,128,88,64,7,224,28,10,134,43,64,7,224,28,10,-102,45,1,98,115,230,46,9,1,98,115,134,47,64,7,224,28,10,100,148,-1,98,115,228,146,9,1,98,115,132,208,64,7,224,28,10,165,40,96,8,-224,30,10,66,109,128,31,64,9,224,32,10,1,117,110,224,34,1,128,11,-224,36,10,6,114,101,112,108,105,99,97,129,142,224,14,2,224,42,10,4,-108,101,110,103,116,99,141,192,11,224,36,10,3,115,117,98,115,130,133,192,-11,224,36,10,4,105,110,100,101,120,128,35,96,10,224,34,8,192,9,64,-35,224,21,0,224,36,7,1,116,111,192,34,128,9,224,32,8,3,104,101,-97,100,192,34,192,11,224,69,9,2,97,105,108,224,71,0,160,11,224,143,-9,0,112,136,196,0,112,232,197,10,1,112,50,97,166,64,7,224,28,10,-1,110,101,135,220,64,8,224,30,10,0,102,133,230,96,8,224,90,11,0,-98,122,72,96,8,225,71,10,1,50,102,162,33,1,50,102,224,123,9,5,-73,79,46,102,111,114,97,255,160,10,224,34,11,2,116,104,105,99,171,160,-10,225,30,9,2,104,110,117,101,97,96,8,224,65,13,4,114,111,119,116,-111,224,68,0,96,13,224,40,11,3,121,105,101,108,192,107,96,11,224,36,-11,5,110,101,119,109,118,97,198,174,160,13,224,118,12,2,97,107,101,224,-41,2,192,14,224,42,11,2,112,117,116,224,41,2,160,13,224,40,11,68,-174,224,41,2,192,14,224,126,12,1,114,121,224,129,7,224,17,1,224,48,-14,224,135,5,224,16,1,224,46,14,224,141,6,224,17,2,225,134,14,6,-101,97,100,100,101,108,97,101,189,224,17,5,224,48,17,4,115,116,97,116,-117,98,100,224,18,6,224,50,8,1,105,115,169,22,96,8,176,115,224,0,-128,81,63,0,54,152,60,219,243,185,87,149,124,149,102,242,14,6,1,32,-61,83,44,0,110,151,211,114,9,224,44,0,0,50,246,102,10,86,192,250,-32,4,2,95,105,116,105,2,64,27,252,39,0,224,65,2,242,128,9,250,-132,20,64,70,152,1,224,98,4,160,96,150,227,3,95,49,57,55,86,152,-2,48,49,50,64,5,0,56,146,75,2,49,51,54,128,36,251,37,0,0,-56,86,72,0,66,88,42,0,56,96,41,1,49,57,86,124,0,51,151,103,-147,60,184,85,64,54,149,155,6,95,56,49,51,32,75,32,85,192,149,245,-148,16,64,172,1,56,52,180,60,64,47,96,75,224,139,2,1,49,51,151,-177,128,132,120,140,129,135,211,203,186,47,64,80,115,223,83,185,0,57,210,-142,64,4,64,53,146,253,214,108,150,88,224,59,1,122,107,128,10,64,213,-0,85,83,59,83,58,116,74,0,80,118,82,0,79,96,169,193,86,0,51,-175,71,128,4,4,90,32,90,32,83,182,6,1,85,32,96,14,0,67,64,-48,161,220,65,31,4,51,32,95,49,51,224,229,0,224,109,2,2,95,55,-48,115,245,85,51,96,33,0,35,64,232,224,34,2,119,15,1,51,52,152,-106,2,54,54,50,192,72,4,66,32,95,52,52,88,106,2,53,55,55,117,-193,0,49,96,13,0,55,65,241,91,14,91,32,128,41,120,14,192,0,247,-9,0,184,246,160,101,148,69,0,56,181,197,193,31,194,234,0,49,88,190,-96,59,224,17,6,96,9,151,8,161,188,0,54,180,102,226,100,2,86,50,-3,105,116,105,118,104,5,224,25,3,1,99,97,139,158,224,19,4,2,108,-97,115,100,49,224,20,3,3,100,97,116,97,224,19,8,154,233,224,22,9,-2,114,105,118,171,96,224,23,4,102,67,224,17,3,1,101,108,224,125,9,-4,102,111,114,97,108,107,8,224,21,6,2,101,105,103,103,75,224,22,3,-0,105,108,205,224,17,4,123,212,224,21,8,224,57,9,2,110,102,105,104,-162,224,20,8,224,123,8,96,21,101,165,224,21,5,4,115,116,97,110,99,-224,191,8,1,108,101,224,125,8,156,144,224,21,7,5,110,101,119,116,121,-112,224,22,8,143,239,224,17,3,4,112,97,116,116,101,142,215,224,22,3,-1,116,104,140,149,224,19,4,224,80,10,124,237,64,20,229,207,18,66,54,-132,252,68,28,0,90,67,243,157,216,64,24,196,249,250,55,0,163,154,154,-58,0,39,87,174,192,17,117,77,99,48,0,83,90,75,248,43,6,154,87,-0,55,67,63,0,54,158,183,160,79,0,51,91,224,227,24,1,64,56,224,-55,1,99,71,68,218,64,35,2,95,49,57,96,42,0,64,224,131,1,96,-114,250,177,1,164,86,254,140,2,64,195,221,120,128,150,157,128,120,12,3,-67,32,95,52,89,39,2,95,52,54,195,120,195,242,192,34,64,240,188,10,-160,117,252,61,4,2,52,56,55,101,137,0,39,220,120,65,57,252,125,2,-1,95,54,123,141,96,0,193,49,69,192,69,181,156,126,0,56,131,200,225,-59,0,224,91,0,165,76,121,179,221,180,93,212,1,50,49,96,82,65,208,-97,212,153,49,161,58,224,93,5,96,85,2,95,56,53,64,188,0,55,159,-135,253,25,4,129,30,134,123,96,103,65,250,65,111,132,217,128,239,129,124,-64,40,198,127,164,178,192,102,1,95,52,93,66,0,51,126,166,225,68,1,-225,102,1,64,84,164,163,64,10,70,151,64,77,220,50,98,91,187,166,229,-29,0,102,77,255,20,0,155,194,224,24,3,224,25,11,155,229,96,0,224,-71,0,224,29,3,224,61,2,224,33,2,224,42,3,224,69,6,224,37,11,-224,2,4,224,40,1,224,113,17,224,23,0,224,44,2,64,189,224,87,19,-224,48,9,225,31,8,128,34,224,5,2,64,2,224,49,31,224,17,6,224,-53,3,225,189,0,224,1,9,224,94,5,225,27,23,224,2,3,224,56,5,-224,57,4,225,9,24,225,6,5,225,249,16,224,61,15,224,125,9,224,65,-42,224,68,11,225,40,2,224,55,12,224,2,7,224,64,9,224,134,6,101,-49,224,86,3,224,145,22,224,86,15,225,184,9,224,1,7,0,83,232,158,-3,0,35,132,127,224,0,6,224,195,13,224,2,17,225,103,12,224,138,40,-133,221,224,0,6,224,108,13,224,2,21,224,138,57,233,178,2,224,0,1,-225,177,3,192,108,161,182,224,96,6,224,177,19,224,89,8,224,143,13,224,-1,1,224,153,5,230,79,0,224,0,2,226,209,12,224,2,19,224,131,54,-234,114,0,224,0,2,224,116,25,192,2,227,82,15,224,131,37,198,110,224,-65,31,224,114,11,224,47,19,225,119,8,72,137,224,0,7,224,223,19,224,-2,9,224,126,52,231,179,0,224,63,15,224,115,28,224,106,13,128,1,224,-112,6,237,46,3,128,0,224,97,13,192,2,226,228,19,224,118,34,228,143,-9,224,115,31,224,118,52,227,240,9,227,75,14,195,240,224,92,8,224,41,-7,224,80,5,224,130,11,128,1,229,3,6,227,223,8,227,220,11,228,117,-28,224,129,5,224,124,13,225,7,8,224,126,7,230,156,1,96,44,225,19,-7,225,13,16,227,228,9,224,122,9,224,124,7,112,178,224,0,0,224,202,-3,231,31,10,136,183,224,14,15,224,154,1,224,110,3,192,142,224,19,3,-225,126,6,227,228,1,224,73,3,64,38,1,64,67,64,134,3,95,49,51,-51,143,225,0,52,112,11,64,179,112,143,108,77,80,75,128,18,228,46,4,-224,127,1,64,65,235,159,1,64,0,193,70,128,106,145,241,75,28,96,99,-236,199,0,224,69,3,235,90,12,234,83,8,224,253,7,1,67,32,64,80,-1,56,52,160,233,1,64,35,236,153,5,224,88,17,160,152,224,83,0,192,-43,231,48,6,224,46,7,64,14,224,40,12,160,210,224,37,0,224,34,10,-129,58,210,159,224,25,3,229,245,5,0,73,192,13,173,218,64,5,233,77,-2,96,126,65,82,224,220,5,97,116,64,16,1,64,80,225,59,1,226,228,-8,130,62,160,236,98,93,224,248,1,224,25,2,77,125,177,136,165,48,225,-208,3,224,74,10,226,203,11,65,10,192,139,224,18,2,226,44,5,2,95,-51,54,224,192,1,226,55,19,242,38,0,109,198,224,85,5,179,108,224,16,-20,77,143,224,16,4,143,167,1,50,48,240,88,2,31,92,34,109,104,115,-47,83,121,115,116,101,109,47,67,111,110,115,111,108,101,47,83,105,109,112,-108,101,82,101,97,100,108,13,105,110,101,46,104,115,92,34,44,49,55,57,-58,53,80,129,224,136,6,163,85,225,117,1,224,233,17,224,138,5,238,121,-18,224,41,9,226,206,10,225,227,0,228,89,0,64,5,225,144,8,227,45,-8,192,62,130,181,192,65,128,8,130,204,66,70,227,220,5,226,150,1,224,-2,0,239,252,11,224,120,3,224,67,4,64,45,64,35,116,250,0,56,84,-156,235,34,1,225,255,2,96,128,160,5,64,136,224,132,3,245,115,2,6,-32,95,56,48,32,95,55,97,8,112,168,160,71,64,53,128,31,148,147,245,-60,3,224,42,3,64,41,64,230,226,96,12,224,0,1,224,199,0,145,108,-224,238,10,161,98,97,64,224,171,2,97,177,128,36,99,86,224,163,3,196,-44,209,5,210,115,160,54,64,219,224,243,1,128,43,128,5,224,48,5,224,-55,1,100,58,164,63,224,6,3,225,133,10,241,164,2,192,87,129,251,193,-111,227,123,18,224,168,2,128,44,225,162,9,224,235,5,224,181,11,224,174,-5,224,127,0,166,226,160,175,162,143,224,147,1,128,107,134,175,2,95,52,-50,67,36,160,6,225,130,1,231,38,0,128,15,247,136,5,225,3,12,226,-170,2,227,135,1,3,50,49,56,54,151,149,224,234,1,228,193,10,98,137,-96,252,194,135,96,246,236,210,0,229,68,2,2,64,64,85,244,26,0,225,-58,1,224,241,2,161,75,227,81,5,1,85,32,237,30,1,227,31,8,226,-63,3,231,93,6,224,95,12,225,12,2,226,204,9,224,105,2,224,32,2,-227,223,15,225,51,31,97,195,243,198,9,211,226,225,55,15,224,220,8,224,-22,2,225,196,4,96,115,228,151,1,224,171,9,226,139,5,228,126,8,162,-60,164,50,130,116,64,179,225,148,2,101,14,192,35,134,213,129,246,100,95,-148,94,244,88,3,128,43,160,72,128,2,167,9,225,223,0,97,18,103,102,-160,120,227,135,3,160,83,225,207,1,224,93,7,245,64,0,131,22,192,5,-64,166,99,38,64,185,227,213,14,97,134,224,95,7,64,97,160,8,200,126,-224,169,0,224,180,7,130,123,136,33,224,228,6,166,113,160,118,224,117,1,-224,169,7,211,159,227,245,2,227,180,4,161,18,196,56,195,117,128,219,128,-81,197,220,192,200,229,221,0,215,80,96,199,155,79,138,200,224,135,6,225,-43,1,192,80,162,114,192,83,227,77,4,193,21,160,155,230,142,7,228,88,-14,225,211,3,229,82,3,165,72,166,142,230,87,19,130,128,224,13,3,65,-120,129,31,227,57,6,230,90,2,91,199,93,251,194,227,3,95,52,48,49,-64,18,1,51,32,64,199,232,240,1,4,94,40,32,94,40,200,199,157,99,-161,61,251,167,0,165,242,128,135,0,82,224,10,1,224,178,10,195,136,228,-166,7,235,251,12,192,20,128,200,228,63,5,175,165,224,26,5,233,22,4,-97,178,70,7,247,248,0,134,41,67,101,107,120,167,244,249,203,3,64,23,-249,216,1,101,10,96,4,161,164,162,194,64,210,102,93,125,11,94,38,166,-94,98,26,107,181,0,51,89,94,4,64,64,95,53,56,96,24,226,123,1,-231,192,3,98,48,64,207,164,94,0,58,152,37,122,144,160,123,225,97,5,-64,32,158,135,130,134,89,166,96,20,158,102,3,95,51,56,56,160,255,64,-20,0,54,128,20,234,10,2,0,52,233,170,6,68,70,2,52,49,52,66,-206,129,123,77,199,122,18,0,35,64,4,3,95,51,52,51,234,250,2,12,-103,101,116,82,97,119,32,102,97,105,108,101,100,130,17,225,94,3,1,95,-52,138,106,64,122,155,86,7,94,71,69,84,82,65,87,32,64,17,155,79,-5,85,32,75,50,32,65,153,8,1,56,51,128,159,0,54,219,120,1,95,-55,66,87,64,25,153,153,64,25,126,30,1,54,55,103,195,0,56,95,145,-64,30,153,143,3,95,49,49,49,96,90,153,80,226,108,0,224,208,1,2,-95,50,49,96,204,195,10,224,246,17,81,5,160,242,1,57,57,129,116,224,-247,1,1,83,97,93,216,6,32,99,97,99,104,101,32,64,247,3,95,49,-49,56,65,231,64,159,126,185,1,95,55,187,71,96,115,2,55,56,32,192,-16,1,58,50,95,96,64,158,64,131,64,143,66,45,3,50,49,55,55,96,-201,64,215,64,201,2,50,49,54,97,5,1,55,54,128,22,161,206,5,49,-48,55,57,32,85,228,254,2,98,74,229,15,4,161,133,128,1,64,215,123,-141,64,0,192,33,204,102,224,30,5,227,125,2,224,23,3,129,41,251,213,-0,131,142,97,125,224,10,3,70,8,64,228,0,49,97,7,2,50,49,54,-172,35,192,22,0,48,68,116,3,49,48,56,55,125,54,192,13,124,201,1,-50,49,139,134,224,46,2,2,50,49,55,100,184,224,41,1,131,255,65,8,-162,194,225,8,8,225,14,1,225,16,8,225,22,1,225,24,1,225,28,8,-230,86,17,224,44,11,224,40,7,192,37,225,39,1,225,111,11,199,72,0,-66,225,93,2,232,229,2,161,96,130,154,157,67,225,62,0,188,177,193,30,-130,91,225,93,7,201,64,225,152,3,225,164,10,193,94,225,157,16,0,54,-130,145,226,192,0,160,32,2,49,49,57,224,44,14,2,49,49,50,233,108,-1,65,165,131,237,225,165,7,226,120,1,224,255,38,131,93,0,49,181,16,-224,21,6,0,48,135,78,226,130,7,193,133,224,22,7,160,45,64,165,132,-129,224,165,4,224,139,47,225,21,5,96,29,64,108,234,210,0,225,106,15,-96,13,103,60,224,13,5,128,0,64,164,165,19,96,164,0,67,160,139,70,-38,64,27,165,21,227,12,9,226,148,4,227,226,5,225,135,51,192,161,128,-78,224,21,5,193,17,225,40,2,226,101,25,224,53,1,225,34,51,197,253,-129,6,224,71,7,129,240,64,39,134,22,128,39,0,80,225,239,33,226,245,-27,224,116,7,168,176,160,22,1,50,49,147,173,224,83,37,0,58,133,71,-224,178,0,224,99,4,1,50,49,148,26,64,36,166,51,192,36,0,56,71,-127,128,30,64,29,134,58,145,217,64,23,0,53,98,63,64,25,0,54,96,-25,224,255,2,128,97,96,27,131,193,161,16,64,111,103,38,4,32,95,55,-52,57,77,22,0,53,169,239,232,60,5,136,111,85,241,160,30,69,53,192,-60,2,95,55,53,103,96,0,54,194,113,239,17,7,64,27,136,54,70,238,-160,219,131,163,64,135,1,95,51,69,252,128,38,64,94,64,29,131,28,11,-73,79,46,115,101,114,105,97,108,105,122,101,71,255,64,30,72,108,18,97,-100,100,95,108,122,55,55,95,99,111,109,112,114,101,115,115,111,114,96,30,-130,47,3,85,32,75,52,64,2,0,90,224,1,4,0,75,226,143,0,160,-128,162,52,75,52,67,139,6,95,56,48,53,32,95,56,118,217,160,221,96,-23,65,90,1,53,54,85,71,4,66,32,95,55,57,131,255,0,53,65,245,-0,75,65,240,160,37,172,16,2,58,50,49,74,13,97,124,64,38,78,9,-0,56,65,188,0,56,72,186,96,30,201,212,104,126,0,64,232,127,6,13,-42,42,42,32,69,120,99,101,112,116,105,111,110,58,104,129,96,52,129,234,-168,216,160,174,1,52,51,64,14,64,91,0,53,203,32,224,204,7,0,53,-97,145,193,233,224,25,3,0,52,174,56,205,202,224,88,1,64,70,128,230,-2,56,53,51,137,31,1,95,56,66,27,224,165,1,2,46,104,115,244,237,-0,132,122,225,45,1,128,109,96,64,128,10,0,56,75,168,128,254,129,227,-0,53,96,133,160,179,97,85,225,69,0,3,64,95,52,57,64,23,68,242,-64,60,203,150,162,173,224,163,4,64,255,1,64,95,167,11,224,31,7,64,-102,72,124,224,92,6,75,114,224,0,2,65,89,0,54,225,89,0,90,22,-83,99,0,49,66,185,1,49,53,65,1,0,51,154,42,64,39,166,248,4,-56,49,51,32,75,107,179,145,60,2,95,56,52,128,200,64,35,130,210,245,-118,0,247,139,2,64,80,0,49,64,201,1,83,32,66,41,192,61,224,7,-3,77,200,172,128,64,14,243,63,5,64,19,5,67,32,95,57,53,55,195,-115,1,50,49,99,169,194,71,172,62,225,163,1,13,99,111,109,98,105,110,-97,116,111,114,115,58,94,42,97,174,68,131,169,145,237,41,2,225,9,0,-131,114,1,80,32,94,249,132,71,64,97,224,208,14,129,229,100,252,128,30,-226,1,2,97,229,66,96,2,95,49,57,65,95,241,138,5,193,192,0,89,-165,160,226,152,5,1,50,49,65,214,160,96,69,61,227,96,5,193,48,192,-81,196,105,192,121,130,7,107,240,0,55,103,163,235,241,4,226,218,0,225,-53,19,2,112,105,108,76,2,14,117,115,101,100,32,98,111,111,116,32,109,-111,100,117,108,140,13,64,164,194,66,225,166,1,224,249,18,246,98,2,226,-163,11,67,86,129,139,160,64,96,163,0,85,98,242,241,106,4,145,109,226,-17,7,237,1,4,224,233,8,224,225,13,17,116,111,116,97,108,32,105,109,-112,111,114,116,32,116,105,109,101,32,64,0,96,220,64,96,110,131,65,38,-3,51,57,32,35,146,106,105,94,0,57,98,56,224,70,1,0,109,228,1,-1,129,149,239,125,4,251,168,2,128,140,65,203,64,7,143,147,1,95,56,-116,18,64,102,124,96,0,48,69,255,98,210,131,75,209,93,66,130,168,2,-206,31,1,56,48,114,248,68,82,111,45,110,71,96,40,133,206,226,87,18,-246,223,1,72,28,224,158,1,64,45,1,83,32,239,215,2,226,83,5,65,-73,89,170,225,180,1,211,33,226,154,4,1,83,39,192,121,1,80,32,97,-244,98,29,146,182,129,31,117,107,243,33,1,96,24,97,215,129,238,1,95,-49,78,63,1,95,55,145,181,128,237,0,50,240,65,0,128,33,253,42,1,-129,57,2,50,49,52,240,79,1,66,76,134,253,70,235,79,121,96,21,134,-111,0,85,231,3,2,64,21,134,80,128,138,229,188,13,162,96,0,55,65,-249,1,95,57,101,8,113,3,4,48,32,95,57,52,145,77,64,29,82,78,-0,56,79,25,64,140,164,93,193,231,65,58,67,206,226,132,8,17,67,97,-110,110,111,116,32,102,105,110,100,32,112,97,99,107,97,103,227,95,7,163,-5,225,141,7,230,155,0,0,52,168,73,1,95,57,161,215,64,212,0,54,-96,212,230,167,2,3,112,107,103,34,100,201,64,153,226,70,4,81,210,64,-60,144,133,64,67,143,156,1,51,57,72,72,64,180,169,64,226,73,3,0,-55,173,94,187,79,226,221,2,128,11,2,95,56,48,97,142,128,13,246,40,-0,161,101,228,167,29,167,177,231,175,7,0,56,233,119,2,231,6,5,75,-6,225,96,8,0,91,64,10,129,82,227,213,3,1,52,50,73,104,249,191,-0,163,81,65,113,4,79,32,79,32,35,65,37,66,187,132,180,4,79,32,-35,57,51,251,36,1,96,107,128,70,224,107,5,132,75,69,51,229,34,7,-226,94,20,2,32,95,57,83,216,224,71,1,200,84,128,53,68,47,230,89,-8,1,95,57,67,230,216,42,99,199,96,82,227,174,4,224,98,0,242,38,-10,225,102,5,166,213,229,84,27,161,126,229,84,14,0,32,149,53,225,89,-1,242,53,7,65,76,83,215,193,76,96,71,224,12,0,230,0,4,64,129,-72,11,230,226,2,205,214,224,231,182,246,217,1,234,113,9,105,125,1,95,-57,140,125,167,72,118,170,199,72,160,79,1,50,49,149,30,225,254,15,227,-89,26,227,49,13,226,197,1,115,252,0,100,226,204,7,234,73,4,134,57,-0,67,102,203,0,57,101,130,0,95,75,163,119,125,4,95,51,50,50,32,-135,132,64,0,68,77,233,70,0,232,174,41,224,172,23,104,161,224,170,5,-227,117,37,3,46,104,115,45,64,68,213,228,131,122,229,185,16,233,17,3,-101,194,3,111,117,110,100,172,168,229,188,2,202,206,225,239,22,1,50,49,-171,61,225,240,3,0,48,76,237,225,59,0,135,255,103,161,107,153,0,49,-66,109,235,153,0,65,65,135,22,133,187,128,51,136,10,103,8,64,110,0,-58,128,26,229,208,0,97,15,229,212,1,5,57,52,32,95,52,51,96,78,-192,188,224,184,5,225,73,0,230,125,0,0,57,75,44,128,0,224,40,2,-227,169,1,157,140,189,146,225,241,30,102,90,234,160,7,225,125,6,6,112,-97,114,115,105,110,103,161,111,192,0,168,202,97,246,148,221,224,148,1,104,-96,250,230,5,224,143,7,204,87,128,18,1,95,57,110,219,235,41,24,64,-138,1,101,100,236,90,2,112,192,214,30,224,152,6,192,2,128,157,233,123,-7,96,13,224,161,0,251,142,1,233,138,8,162,217,225,61,2,228,251,1,-217,164,1,49,48,82,13,1,95,56,153,104,0,95,88,141,201,83,97,122,-98,214,128,10,224,208,5,194,212,7,97,109,101,32,100,111,101,115,98,222,-12,97,103,114,101,101,32,119,105,116,104,32,102,105,160,29,193,125,161,203,-133,8,130,250,160,14,0,79,158,243,154,4,231,14,1,225,20,14,221,38,-224,25,10,193,211,226,173,17,64,0,225,237,4,224,2,3,230,59,4,228,-15,6,65,175,0,55,211,14,197,26,2,49,48,55,227,164,3,1,57,49,-64,218,132,192,224,0,2,227,69,1,224,1,1,157,255,224,31,17,106,252,-224,31,18,64,1,224,229,21,224,56,18,233,46,8,1,49,48,128,233,224,-0,3,130,60,226,140,9,224,70,2,184,75,224,88,3,224,41,3,224,128,-9,224,29,5,225,193,14,225,202,1,225,3,22,226,203,0,229,41,9,129,-155,0,52,95,103,0,75,231,79,1,224,0,0,226,1,16,226,10,4,227,-248,22,1,49,48,121,175,227,249,24,9,116,121,112,101,32,99,104,101,99,-107,227,255,1,232,17,2,2,48,55,55,100,9,67,127,224,52,1,0,45,-64,0,160,44,224,187,8,225,54,20,225,94,2,226,57,49,224,97,20,64,-2,235,210,0,229,237,4,242,59,2,245,224,36,224,0,4,224,180,15,64,-1,227,54,3,224,43,23,224,228,24,224,230,19,225,69,1,224,88,9,225,-1,3,187,104,224,80,10,248,121,4,224,83,3,224,74,9,224,2,4,224,-80,4,224,31,10,224,94,3,224,79,8,192,85,226,4,2,224,30,9,128,-118,224,103,3,224,102,16,224,36,0,229,51,17,128,41,128,103,109,190,224,-8,12,231,219,14,227,82,7,0,49,107,93,227,82,24,6,100,101,115,117,-103,97,114,231,79,3,131,70,243,176,0,224,0,4,196,40,232,112,13,224,-5,9,225,0,1,228,5,6,64,0,102,198,225,1,4,234,144,17,64,0,-225,117,1,138,156,224,19,6,234,168,15,2,100,111,110,175,227,224,116,9,-231,68,5,224,79,2,224,77,6,0,44,224,64,0,128,30,236,135,6,178,-164,192,29,231,223,7,0,115,172,189,64,31,231,187,4,224,60,4,224,57,-10,1,32,43,160,119,224,53,16,224,50,16,224,161,12,237,35,6,224,0,-6,128,100,227,19,0,96,203,254,95,0,224,8,27,225,225,5,234,22,1,-96,26,233,59,17,1,95,55,122,88,129,85,96,17,82,113,233,62,1,3,-95,56,52,56,224,225,2,10,73,110,116,101,114,97,99,116,105,118,101,225,-85,0,1,95,52,81,72,226,50,8,96,120,140,127,96,10,99,3,225,104,-11,3,108,111,97,100,205,121,233,94,18,225,102,2,174,143,160,38,225,88,-16,228,100,3,225,44,6,235,51,0,128,14,225,61,6,1,64,67,196,15,-138,152,228,25,0,199,152,224,13,0,1,49,49,244,63,2,164,106,68,15,-80,199,242,115,3,83,186,0,50,105,123,160,165,250,67,8,224,137,1,240,-23,6,192,194,64,27,224,94,3,72,19,115,238,128,37,81,210,142,138,132,-129,84,84,228,69,2,128,187,224,33,0,224,46,4,64,0,65,245,0,55,-65,245,192,17,224,16,7,224,32,8,0,83,64,169,70,141,85,124,212,255,-212,252,193,15,180,188,64,192,79,53,0,49,255,66,6,253,86,0,0,51,-179,99,2,85,32,75,192,32,224,247,4,229,199,2,224,23,2,196,231,160,-120,112,54,128,62,2,95,49,51,148,150,121,121,110,15,160,0,224,171,11,-249,142,1,170,178,224,10,4,224,201,4,65,121,192,0,224,248,11,202,111,-161,4,7,32,67,32,61,61,32,64,35,129,246,64,84,143,33,245,214,5,-225,203,4,193,2,64,204,172,205,1,57,54,237,102,0,78,240,162,67,78,-224,222,42,7,57,55,48,32,95,53,49,53,64,4,64,43,0,57,97,103,-64,44,156,185,67,39,96,7,0,54,116,249,64,66,189,5,0,53,87,90,-2,95,54,49,72,218,128,53,155,134,224,186,0,80,56,2,64,95,53,75,-96,0,53,111,138,128,37,227,142,1,2,101,111,102,131,187,64,197,3,95,-51,54,51,64,84,0,50,226,216,1,64,111,0,54,224,111,6,1,50,48,-146,132,99,28,119,107,192,53,96,247,92,227,228,119,4,3,77,97,105,110,-96,100,0,79,64,128,1,57,56,224,31,7,0,109,192,31,164,6,64,115,-219,187,0,50,192,116,3,49,57,55,51,237,250,8,135,120,224,152,0,1,-49,57,66,224,170,17,96,18,64,158,225,89,9,129,113,1,49,57,92,230,-5,49,57,55,55,32,35,112,211,64,11,74,42,96,37,2,95,50,48,86,-25,192,31,130,225,192,13,137,198,224,250,5,3,67,39,32,79,96,47,93,-55,128,200,131,183,224,194,15,3,119,104,101,114,229,136,1,138,44,225,96,-10,194,208,224,107,3,193,104,225,163,1,188,199,81,115,64,239,1,64,67,-224,9,30,224,49,21,224,79,33,0,67,160,9,2,95,50,48,121,222,1,-95,49,192,172,110,182,1,52,57,64,215,78,156,2,95,49,54,86,146,97,-13,129,126,225,19,3,3,100,97,116,97,129,212,2,50,49,49,131,73,0,-50,75,191,128,242,224,82,1,224,92,10,0,49,122,103,224,86,13,5,110,-101,119,116,121,112,162,46,2,50,48,57,99,188,226,0,4,0,54,103,47,-224,87,12,1,54,56,64,37,89,126,128,5,64,146,194,236,0,56,93,220,-1,49,48,64,248,0,54,100,23,1,50,55,65,8,96,28,244,93,5,130,-50,69,44,0,50,70,135,71,32,236,12,0,224,227,13,224,217,3,104,142,-224,217,11,224,214,28,1,50,48,196,118,224,85,3,0,57,127,47,224,85,-12,138,3,193,136,202,208,136,101,226,239,2,224,13,2,176,158,224,176,0,-182,228,128,94,224,9,2,64,39,192,113,224,119,9,5,102,111,114,101,105,-103,132,12,224,147,18,103,227,194,112,224,38,6,4,99,99,97,108,108,128,-37,224,26,8,2,97,112,105,224,63,0,67,100,73,66,224,35,6,4,117,-110,115,97,102,195,149,224,37,1,2,50,48,53,161,160,1,50,48,64,117,-193,55,1,50,48,78,65,225,96,4,226,164,11,225,212,13,113,201,225,6,-11,3,99,108,97,115,153,89,65,213,134,71,161,222,228,205,13,225,239,0,-1,49,50,65,120,1,95,53,110,242,96,31,97,122,225,166,12,71,13,97,-69,117,138,128,214,225,159,1,1,50,48,85,180,224,32,9,224,123,4,96,-124,229,30,2,228,162,1,163,42,96,184,0,54,125,22,96,78,226,226,16,-156,149,226,140,13,5,110,115,116,97,110,99,226,230,0,129,106,224,87,1,-161,121,226,143,19,0,55,97,59,226,123,3,228,116,4,4,101,102,97,117,-108,162,90,225,243,1,229,142,1,99,238,205,135,230,87,0,1,49,57,68,-24,225,14,4,96,131,75,127,0,51,98,46,157,101,224,104,1,1,40,41,-194,152,0,49,192,71,161,18,5,57,56,53,32,95,54,115,7,198,125,64,-230,225,94,5,225,60,15,0,50,106,199,224,219,13,228,31,4,170,95,226,-185,5,110,238,96,23,192,80,0,85,97,86,96,192,224,83,12,5,112,97,-116,116,101,114,163,165,1,50,49,85,55,225,216,17,0,54,84,137,64,65,-231,113,3,224,77,16,226,184,2,161,118,225,2,5,160,182,228,211,3,227,-103,24,86,61,225,248,15,4,114,105,118,105,110,94,112,227,89,13,227,173,-3,73,191,224,69,12,1,118,105,198,178,0,48,135,176,69,206,160,155,227,-16,1,141,90,224,65,13,226,225,13,130,100,82,54,129,229,2,48,56,57,-114,187,2,54,54,48,160,78,195,100,130,216,129,96,224,5,3,226,8,13,-224,24,6,1,114,111,169,71,226,34,1,231,216,12,224,54,6,5,110,111,-109,105,110,97,229,105,14,6,112,104,97,110,116,111,109,165,70,224,113,8,-11,101,112,114,101,115,101,110,116,97,116,105,111,224,67,0,228,90,6,72,-212,159,210,233,23,3,67,199,108,21,207,8,67,113,225,184,8,233,121,11,-199,12,233,107,9,124,12,96,21,227,226,27,66,240,143,37,233,150,11,143,-1,76,68,0,32,140,110,96,34,0,49,105,18,140,138,0,79,160,89,0,-50,123,57,110,101,66,16,1,48,52,116,144,0,52,185,141,239,15,2,224,-202,8,1,57,52,225,75,2,1,60,45,161,61,224,213,15,175,147,235,16,-3,100,223,224,213,5,229,26,15,234,163,2,128,56,131,152,244,199,0,225,-3,13,238,243,5,111,78,73,11,65,55,239,82,0,96,0,65,228,157,105,-96,93,169,77,132,255,120,193,109,199,137,85,186,17,64,50,156,96,0,85,-74,238,109,177,3,64,67,32,60,187,142,224,18,6,64,241,224,18,6,65,-96,237,35,4,132,232,100,197,1,85,32,237,63,6,131,101,160,27,2,95,-54,56,82,16,193,255,128,235,238,39,6,224,44,17,224,42,4,103,165,192,-42,0,75,125,35,193,82,0,67,224,174,5,64,22,237,210,5,224,58,3,-161,221,146,13,160,108,224,116,2,109,212,224,90,0,65,58,157,103,129,182,-2,80,32,35,70,232,161,198,193,170,0,58,133,251,160,37,2,80,32,35,-103,183,0,80,110,122,70,103,67,145,229,42,19,139,228,0,48,108,157,65,-211,159,106,230,26,23,229,248,4,0,48,69,62,163,180,133,248,229,247,8,-64,140,175,7,224,140,9,2,50,48,57,66,106,233,118,14,166,14,230,143,-15,232,13,3,160,138,224,126,13,0,54,96,126,97,174,232,123,5,164,150,-232,140,5,224,139,9,112,78,75,134,106,79,225,82,10,229,250,0,159,95,-71,148,0,48,224,168,2,5,83,79,85,82,67,69,165,128,233,121,3,1,-57,53,169,106,130,74,101,38,165,197,233,37,6,234,12,5,64,121,170,4,-224,177,13,179,26,192,38,99,233,64,21,160,91,224,132,4,232,21,0,229,-152,5,235,121,5,225,125,9,0,97,170,247,1,49,57,182,168,0,83,192,-47,233,223,17,138,200,230,168,1,225,55,1,66,249,224,97,7,2,104,105,-100,199,242,224,178,13,169,141,240,12,5,107,88,226,146,4,128,42,224,107,-21,8,113,117,97,108,105,102,105,101,100,161,165,230,224,6,77,88,130,66,-231,110,0,239,91,20,225,146,10,225,224,1,92,170,250,19,0,114,233,217,-100,96,65,229,67,2,2,95,49,57,70,109,134,204,105,254,178,180,2,50,-49,50,130,21,1,57,57,99,189,193,8,64,104,96,237,227,80,10,128,51,-224,50,0,236,1,10,224,45,6,141,78,179,63,224,26,9,234,35,25,160,-106,224,144,24,235,13,22,128,129,224,176,10,225,165,8,145,91,2,90,32,-90,115,255,64,17,136,152,67,38,212,123,64,7,197,61,134,209,0,90,128,-21,192,50,134,179,103,103,1,48,57,160,171,66,220,0,53,65,151,160,108,-100,17,135,178,230,157,11,128,31,0,90,161,203,140,98,96,0,64,95,133,-216,2,95,53,48,64,206,229,12,4,88,198,64,34,80,98,192,130,235,12,-23,108,237,233,87,9,228,61,15,2,95,51,52,64,80,0,56,116,110,235,-55,48,229,177,15,64,85,235,83,2,224,117,2,1,51,53,107,17,241,105,-5,166,251,239,41,12,237,102,27,228,239,3,149,232,241,247,0,192,168,65,-77,135,10,227,177,23,235,190,1,0,49,240,110,11,4,115,116,111,99,107,-235,38,0,224,44,3,164,110,235,114,4,242,197,2,224,47,8,235,162,10,-2,97,110,121,240,73,1,226,235,6,1,50,49,79,213,226,235,8,65,99,-5,10,65,32,75,52,32,64,12,0,54,128,12,0,51,87,36,64,15,132,-174,1,75,50,118,228,64,16,131,25,0,75,64,34,96,15,235,176,13,135,-34,66,217,193,33,66,94,96,16,230,151,5,193,119,67,73,226,51,1,242,-198,0,238,28,6,97,152,96,30,144,245,96,226,0,50,168,237,245,155,6,-152,192,208,146,226,211,4,64,183,131,177,0,85,250,78,3,245,178,23,245,-175,11,143,209,235,17,8,140,171,0,80,114,252,66,178,96,165,234,67,0,-217,94,64,25,64,129,2,95,49,52,73,23,66,123,2,49,56,57,123,33,-87,129,236,17,1,64,176,132,77,120,181,138,2,248,187,0,224,2,1,70,-16,128,169,224,1,1,134,46,7,95,49,53,54,57,32,95,56,108,150,224,-36,9,64,1,68,182,128,0,224,82,3,224,2,7,224,36,0,166,121,254,-218,22,192,152,219,191,128,19,170,224,192,29,232,126,0,134,130,235,250,2,-220,95,245,100,2,188,230,203,59,129,108,224,2,3,224,104,2,161,1,128,-16,96,74,254,205,1,128,149,128,39,64,33,91,46,75,149,0,54,65,193,-97,102,101,204,160,9,236,34,9,0,51,150,172,165,192,0,83,64,79,157,-89,2,95,49,50,120,70,224,32,0,238,14,0,64,66,137,78,109,251,224,-0,5,224,175,1,129,200,224,79,0,98,31,124,31,74,226,206,64,0,55,-109,236,128,0,225,255,1,226,5,3,225,182,9,251,152,0,67,121,1,54,-56,128,130,225,22,1,3,83,32,95,52,75,238,154,8,64,172,65,74,193,-129,1,52,54,93,113,97,119,96,14,0,55,69,162,253,50,5,224,153,7,-96,56,0,52,96,181,64,114,99,8,128,59,101,23,0,52,188,68,224,172,-7,226,212,1,224,72,1,224,204,4,224,25,1,206,236,96,21,254,55,0,-224,224,31,219,221,224,207,0,251,233,3,224,219,5,224,134,1,158,196,4,-64,95,53,54,53,129,33,130,38,66,82,65,215,186,141,128,9,128,18,69,-15,80,102,120,79,2,56,57,51,98,206,64,67,0,79,68,199,227,232,0,-96,149,226,26,5,161,60,160,140,64,154,100,40,128,36,93,157,224,42,0,-98,197,64,100,1,57,48,195,229,224,106,4,193,25,255,154,6,15,66,97,-100,32,71,65,68,84,32,114,101,115,117,108,116,32,230,108,2,160,47,70,-245,68,231,0,56,98,187,3,95,49,50,54,69,132,135,246,64,13,96,28,-232,150,0,202,127,172,55,128,0,68,189,168,171,72,145,3,95,51,51,57,-224,53,0,133,128,96,149,0,79,155,147,129,12,162,117,97,107,128,131,168,-105,224,194,8,1,58,58,96,176,225,153,0,128,45,128,167,65,97,91,185,-229,73,0,0,95,75,128,192,123,0,58,128,7,105,32,0,89,103,195,132,-18,96,245,0,57,73,118,163,220,161,10,0,52,102,140,207,90,222,54,228,-234,1,0,95,214,113,74,14,255,25,1,160,61,65,41,1,57,57,96,229,-0,52,224,145,1,224,69,2,224,63,8,126,168,195,70,224,62,12,224,44,-3,222,143,128,0,82,109,129,161,65,253,64,233,175,199,246,226,6,230,250,-4,174,242,230,231,5,103,157,96,130,224,20,3,243,64,0,224,23,3,234,-137,9,143,116,1,50,49,87,20,242,199,7,1,45,62,200,165,192,73,224,-99,5,245,18,1,224,29,0,242,116,4,224,25,1,196,221,224,11,0,192,-8,255,253,3,65,3,240,62,16,246,80,12,224,9,11,234,39,0,225,183,-2,132,121,196,112,96,168,196,244,0,66,83,252,0,67,64,4,161,177,193,-80,193,67,161,27,96,7,102,216,192,15,224,135,30,160,117,224,86,11,96,-216,0,50,124,169,96,252,0,54,96,252,0,83,234,169,2,224,68,0,0,-52,72,117,233,126,4,194,62,145,52,224,40,0,71,34,82,130,67,47,64,-232,0,80,130,163,161,3,96,250,133,61,227,255,3,235,126,4,224,195,10,-169,250,242,18,36,0,49,81,211,235,197,8,160,186,132,240,131,30,224,227,-1,129,146,64,125,147,57,124,176,235,14,8,65,46,100,169,224,167,13,2,-50,48,57,109,158,140,23,64,47,139,16,224,47,26,0,55,128,47,171,48,-226,131,9,2,50,48,57,140,1,76,177,162,14,64,48,138,169,190,121,1,-49,57,75,94,64,6,0,49,128,78,138,22,227,155,4,0,57,134,130,192,-18,1,64,80,81,79,0,51,64,91,172,205,227,75,8,97,171,64,77,206,-82,242,153,19,208,245,2,55,32,35,184,252,241,81,8,0,58,128,133,224,-74,14,226,83,5,237,113,10,70,113,0,48,65,197,64,12,154,193,1,50,-48,123,244,239,187,9,64,106,244,162,17,132,126,0,48,176,102,1,57,52,-101,63,231,113,0,224,77,13,132,36,237,219,1,66,69,225,220,16,185,60,-194,84,0,48,113,77,227,190,15,192,59,131,46,114,195,228,33,8,192,67,-161,233,224,15,1,226,167,5,109,101,226,71,26,160,69,64,48,162,216,224,-48,12,129,31,0,56,109,227,96,62,64,41,1,54,48,149,48,0,50,252,-208,3,4,85,73,100,101,110,117,42,247,55,11,138,243,100,33,173,236,171,-222,139,31,0,54,66,29,1,95,52,72,243,235,30,10,137,33,89,10,1,-50,32,192,30,98,151,96,159,224,187,16,245,247,16,0,50,97,7,1,50,-48,67,42,224,24,3,2,50,48,55,66,194,2,50,48,54,238,109,5,160,-107,227,111,4,153,85,64,6,0,52,129,27,205,134,239,249,11,224,97,0,-247,16,11,229,190,15,247,17,50,224,83,14,124,54,229,105,15,240,179,22,-156,106,64,118,239,4,3,4,105,110,102,105,120,219,180,224,45,3,0,57,-222,134,224,45,8,0,114,240,179,10,2,49,54,54,240,227,10,96,46,128,-45,239,166,5,241,207,11,226,147,12,3,100,105,103,105,226,146,11,97,126,-194,146,0,75,109,231,112,152,185,60,82,67,128,237,242,77,11,65,28,160,-32,224,33,8,170,239,160,91,194,190,224,36,0,160,0,228,94,4,224,64,-12,240,225,7,0,48,193,78,230,212,2,227,247,7,249,206,1,0,80,160,-71,121,168,97,243,66,183,187,83,194,62,128,12,101,76,0,54,238,160,5,-131,103,138,207,64,63,133,69,240,84,0,230,63,1,130,195,0,54,135,223,-205,49,65,76,237,71,1,239,124,0,233,126,1,64,68,145,3,205,221,224,-30,3,228,26,0,192,14,112,125,160,74,96,56,224,16,0,149,105,224,67,-2,182,235,233,131,4,253,120,0,230,214,3,165,101,233,127,3,107,148,203,-153,224,8,0,224,91,0,112,59,160,159,225,2,5,160,21,0,66,133,234,-226,168,6,224,29,2,233,68,3,245,174,0,224,169,2,0,39,131,160,105,-35,174,186,233,57,0,103,78,247,184,5,137,92,241,0,3,240,251,3,160,-115,253,139,6,96,101,198,93,167,92,238,204,9,65,242,166,234,225,71,2,-224,242,2,64,166,66,204,237,4,2,232,102,3,229,60,9,178,17,225,70,-5,255,93,2,224,18,0,255,99,10,121,206,64,132,192,221,224,218,22,76,-223,161,152,96,201,0,54,160,201,206,128,160,138,241,223,0,180,115,142,160,-81,93,224,17,0,129,133,229,45,1,229,46,5,231,220,4,0,56,176,175,-224,50,8,234,104,3,242,48,2,154,165,176,48,101,10,71,147,224,83,12,-225,13,5,247,116,7,232,66,40,80,124,224,8,1,65,32,250,119,29,224,-9,29,236,67,2,226,16,2,68,112,248,67,18,192,185,103,152,181,200,226,-66,1,127,29,193,13,225,247,5,241,18,2,233,138,13,0,83,98,18,160,-38,64,34,0,54,72,200,224,54,0,250,61,0,252,135,1,1,50,48,188,-106,103,74,131,85,231,63,3,104,166,254,48,6,69,146,102,11,248,76,5,-104,30,236,134,11,80,119,161,245,224,89,0,64,73,0,48,158,141,0,48,-108,126,224,100,10,136,173,230,22,5,224,100,16,219,22,233,1,16,184,35,-224,194,6,2,50,48,56,136,72,224,126,3,1,50,48,105,151,128,109,224,-197,19,2,49,51,48,230,56,0,224,92,4,114,204,227,40,3,224,52,9,-108,30,224,52,4,149,244,224,51,13,0,54,68,12,225,35,10,128,197,225,-35,16,165,119,224,194,5,231,72,7,64,111,137,231,224,93,7,174,251,225,-231,2,227,4,2,230,21,3,226,142,13,165,113,131,16,227,235,4,90,64,-251,103,20,227,35,2,0,53,103,178,249,17,9,193,186,227,35,6,1,50,-48,198,21,0,95,250,35,2,0,48,131,8,241,119,5,1,46,46,233,108,-11,193,44,239,74,10,65,44,139,128,114,101,64,14,252,239,10,96,128,136,-128,2,55,57,32,64,15,174,76,237,208,6,86,30,0,58,96,35,235,210,-14,192,243,173,173,0,53,164,214,227,160,5,74,224,2,50,48,55,198,168,-64,8,64,84,251,161,19,224,9,11,228,199,0,1,50,48,117,75,70,215,-139,172,2,50,48,54,98,69,64,25,203,116,161,41,1,50,48,86,184,226,-79,7,64,130,239,137,6,65,177,243,31,21,1,50,48,138,47,230,235,8,-1,95,53,64,12,150,69,134,226,64,159,224,219,47,194,58,224,219,48,174,-59,224,201,1,225,181,9,226,254,1,75,13,64,72,145,161,226,141,0,107,-44,64,47,254,130,4,0,111,246,110,0,230,75,4,91,92,1,48,53,162,-233,118,216,232,70,0,232,64,13,83,116,106,220,119,225,225,82,12,1,49,-54,130,47,96,209,238,227,19,4,81,117,97,108,68,96,152,238,227,19,96,-151,106,168,238,203,3,74,171,224,7,3,97,135,255,189,1,224,249,8,238,-232,0,169,25,64,12,105,183,152,46,2,52,48,55,240,179,5,192,0,64,-195,131,148,231,151,2,232,54,4,228,157,15,1,50,52,190,149,132,89,237,-138,4,0,102,128,147,196,100,132,149,64,41,224,9,3,231,70,0,229,109,-3,224,74,7,3,116,104,101,110,164,103,192,77,224,76,49,2,101,108,115,-184,150,224,154,1,228,15,4,111,208,224,237,13,114,248,224,237,22,130,110,-99,113,246,163,16,242,44,9,230,83,9,64,7,109,156,2,80,32,35,95,-41,69,26,64,22,165,25,224,160,14,233,12,4,224,160,3,1,108,101,110,-213,224,161,1,189,189,224,206,14,129,111,193,33,64,119,217,117,224,119,13,-226,6,16,1,99,97,161,110,232,40,4,224,39,9,0,111,225,64,7,97,-21,0,58,132,94,228,47,4,1,49,57,70,29,187,36,230,211,2,160,208,-142,25,235,167,2,141,144,226,204,2,235,115,0,231,34,3,103,79,100,230,-135,112,136,66,160,96,232,206,0,226,202,3,224,61,1,2,50,48,54,164,-142,224,255,21,224,217,3,231,51,7,64,233,180,123,241,108,13,233,76,0,-141,46,128,146,96,54,237,121,0,232,77,1,64,36,157,238,230,66,3,86,-11,161,247,228,209,10,98,221,128,81,0,54,224,81,0,232,92,9,225,117,-3,224,232,3,3,119,104,101,114,227,88,1,98,177,245,19,12,0,54,236,-61,0,225,168,7,110,156,97,127,96,173,106,142,237,13,4,0,39,76,151,-92,56,96,75,100,195,69,16,99,252,227,204,2,227,72,6,65,8,99,72,-225,88,15,226,68,3,1,49,50,96,184,234,14,5,70,59,160,31,168,211,-224,120,10,64,105,165,68,111,42,96,200,0,89,248,215,0,223,2,222,126,-184,219,64,41,110,125,240,88,3,161,133,180,60,225,193,3,0,48,232,4,-25,140,141,97,223,224,39,20,138,64,96,40,239,27,7,198,107,143,128,167,-6,64,169,104,66,65,16,96,59,145,178,168,93,109,39,224,186,0,244,217,-9,237,239,1,232,115,31,232,135,20,228,124,2,109,154,2,95,50,48,97,-79,224,25,10,205,178,64,35,237,159,53,65,231,226,7,5,192,13,236,217,-11,173,156,237,148,14,0,50,181,209,160,19,237,123,20,2,50,48,53,230,-120,4,237,123,2,74,250,128,69,120,156,0,53,171,232,224,147,5,224,82,-13,239,55,7,192,82,0,53,139,8,192,82,64,97,224,82,7,227,149,3,-194,14,167,135,130,161,224,87,8,229,90,3,130,121,225,58,18,64,58,0,-51,65,121,0,53,188,57,0,49,111,125,224,85,1,228,119,3,8,95,112,-114,105,109,105,116,105,118,229,102,0,211,42,225,140,3,0,56,72,224,224,-150,4,208,38,186,119,228,52,7,166,238,233,211,12,5,115,116,114,105,110,-103,233,211,10,97,217,246,36,1,169,130,131,19,64,149,231,207,0,65,1,-135,207,65,59,248,34,3,65,193,68,91,1,56,52,211,182,3,95,56,52,-56,236,189,4,96,54,133,244,67,169,64,79,96,102,149,187,65,215,237,12,-13,173,54,226,14,11,138,32,135,89,235,103,2,64,117,0,52,128,117,193,-174,130,247,64,103,133,199,192,129,97,198,160,129,171,15,228,184,2,67,57,-229,241,10,224,16,33,243,99,0,226,92,7,209,228,224,108,6,103,245,106,-197,182,41,64,167,224,85,0,224,23,40,244,214,4,225,54,0,229,61,0,-177,129,212,84,165,219,160,6,226,251,2,224,185,8,230,181,1,232,166,0,-224,92,1,71,241,164,113,96,53,239,121,11,224,64,10,193,188,128,64,144,-244,239,180,12,166,37,229,250,3,224,205,3,244,12,9,249,84,8,243,142,-10,218,130,231,81,41,233,85,9,86,163,224,253,34,224,250,2,64,60,128,-136,224,249,16,224,247,3,224,244,0,224,236,3,233,159,8,69,176,195,193,-131,226,96,21,203,167,96,23,100,76,163,6,231,4,7,244,234,2,235,69,-12,0,55,73,52,64,112,101,119,220,43,207,93,241,170,0,244,181,18,0,-55,94,216,129,195,0,55,98,184,172,18,229,59,15,236,20,15,237,74,5,-224,55,9,236,30,6,97,45,224,200,4,136,38,96,28,229,89,7,65,250,-241,172,15,225,172,4,1,60,45,128,100,209,189,1,56,53,64,157,97,156,-0,58,129,23,146,17,1,52,55,82,33,65,46,242,33,3,98,135,0,50,-104,1,64,29,177,80,224,116,11,226,94,0,242,33,23,78,235,131,84,0,-53,128,84,0,54,228,231,9,235,116,6,233,160,12,98,240,132,105,248,209,-3,129,183,248,206,10,154,63,0,49,99,202,144,145,64,131,164,248,241,235,-21,96,166,133,168,0,85,233,208,1,2,67,32,60,166,172,0,83,224,18,-5,126,18,230,209,4,96,17,181,159,102,210,192,121,224,39,6,134,55,160,-38,0,90,224,38,3,80,211,220,36,64,141,245,42,0,134,239,73,145,231,-69,6,100,47,149,221,64,114,1,85,32,224,165,6,65,134,224,48,4,136,-36,224,48,0,160,135,224,162,13,224,37,10,225,40,0,131,223,226,153,13,-234,37,13,88,124,64,23,107,116,224,19,3,96,79,228,25,4,97,14,132,-25,65,201,160,24,96,26,129,171,64,12,70,121,89,136,64,36,221,156,71,-93,64,82,132,110,66,139,219,103,237,240,2,99,194,0,57,237,241,7,100,-42,226,237,9,159,251,255,249,1,226,69,8,3,83,32,95,51,151,3,0,-52,130,244,96,121,163,97,225,30,9,224,113,2,73,176,227,0,4,225,75,-9,255,194,2,111,85,227,123,0,242,151,0,224,35,2,1,50,48,70,62,-241,74,17,231,53,9,73,60,0,52,106,85,64,224,135,128,160,9,64,196,-164,8,246,72,0,133,101,91,85,64,29,0,54,224,29,0,0,52,68,84,-64,22,227,225,6,74,46,227,225,23,138,82,227,155,23,64,95,131,12,236,-245,149,65,50,192,30,236,245,24,64,73,140,248,128,9,103,83,184,197,242,-233,0,237,19,17,98,144,192,19,160,191,230,63,6,65,92,2,10,65,32,-71,76,0,83,106,25,166,251,0,52,83,25,191,133,64,121,161,209,175,68,-235,199,12,6,108,105,116,101,114,97,108,139,200,228,100,11,224,18,5,201,-20,228,168,5,245,194,1,101,190,64,12,144,0,76,193,98,192,223,185,224,-35,18,0,51,199,70,0,83,64,207,229,144,2,224,90,19,1,49,51,170,-95,228,231,10,224,149,22,2,49,50,57,192,149,129,84,196,145,68,108,228,-107,1,228,130,2,65,15,128,21,64,207,226,180,6,248,30,2,121,229,227,-192,2,2,56,52,56,227,184,9,210,189,224,41,18,0,61,224,41,1,98,-19,226,5,6,67,183,232,69,28,192,71,232,69,0,0,54,77,113,200,69,-64,91,224,70,28,192,184,232,140,2,173,24,96,70,0,54,224,70,18,170,-234,230,57,14,93,85,226,241,0,198,57,65,68,251,34,2,69,2,135,51,-64,63,232,195,12,233,157,3,4,102,111,114,97,108,98,213,224,175,2,0,-55,67,138,165,94,76,140,228,179,7,0,50,193,88,231,4,17,195,228,133,-97,100,64,68,107,2,95,49,49,122,239,64,69,124,166,71,15,68,64,234,-227,11,128,55,224,40,1,230,142,4,0,50,132,80,64,133,163,182,100,17,-64,15,182,245,225,167,24,1,58,58,224,247,7,79,119,225,167,0,194,208,-248,221,5,235,72,4,0,83,116,104,174,116,67,137,174,131,239,234,7,129,-191,233,24,1,136,89,211,22,100,135,68,148,128,20,99,134,230,42,8,235,-206,5,224,134,2,72,2,96,176,71,210,225,249,1,165,118,96,121,1,50,-48,67,112,64,34,227,9,16,128,34,161,141,1,50,48,96,177,64,48,162,-243,137,129,1,49,57,66,117,69,173,154,242,1,49,57,101,139,64,39,162,-212,229,58,12,4,76,73,100,101,110,108,60,250,214,19,225,72,1,0,67,-65,72,79,81,97,83,1,95,49,167,70,0,54,109,165,0,52,100,12,251,-117,0,2,50,48,48,134,176,251,10,2,164,195,144,168,129,95,250,237,0,-128,173,208,142,64,233,0,50,100,148,139,97,146,147,132,253,230,216,2,239,-148,4,255,231,1,250,67,13,238,11,9,77,170,102,133,66,28,85,35,133,-9,136,138,97,214,65,122,0,53,64,73,64,74,96,54,64,29,72,15,160,-23,160,191,64,76,166,210,247,111,15,236,36,0,160,148,0,49,115,22,64,-171,233,255,0,224,37,12,104,103,245,218,5,224,40,11,82,235,224,77,8,-232,224,0,1,54,49,225,254,0,204,138,236,180,1,65,246,0,66,99,54,-65,95,96,14,98,5,96,121,5,66,32,85,32,64,90,162,4,220,185,0,-49,70,84,0,35,86,219,228,246,0,128,12,97,102,3,50,48,48,57,97,-129,132,9,224,187,6,97,43,203,84,1,95,56,66,67,0,85,96,45,64,-192,64,27,132,37,197,54,64,22,128,42,0,52,72,75,98,17,4,95,52,-57,53,32,99,161,2,95,53,48,160,54,0,48,230,208,9,246,143,51,0,-57,214,38,239,55,9,4,109,111,100,117,108,180,167,172,52,64,9,229,40,-11,0,57,78,38,201,197,197,81,0,57,138,226,224,51,29,252,99,10,224,-45,5,0,57,138,251,168,68,224,26,9,224,194,12,5,112,97,116,116,101,-114,175,255,234,100,0,224,144,22,224,71,10,2,116,121,112,245,176,0,170,-195,224,176,22,1,50,48,194,179,224,77,9,5,100,101,102,97,117,108,176,-204,192,149,232,51,7,78,131,3,10,65,32,90,96,1,0,85,64,33,64,-20,232,1,16,1,50,48,128,138,165,62,73,55,96,48,0,54,224,48,18,-67,214,0,50,106,245,64,41,172,61,229,64,12,136,80,229,60,19,138,123,-0,83,244,139,1,255,249,11,237,9,0,128,35,195,101,96,37,232,166,5,-229,46,0,142,118,196,148,64,152,139,213,224,23,15,128,245,239,182,4,168,-213,230,52,10,65,1,230,52,17,0,81,230,53,28,192,202,230,40,40,224,-194,22,132,57,140,56,4,67,32,95,54,50,97,214,64,122,224,162,1,178,-217,224,36,21,4,100,101,114,105,118,184,1,224,42,22,4,99,108,97,115,-115,128,39,209,195,225,163,4,224,42,2,248,200,6,224,38,15,254,80,0,-64,224,101,39,224,89,24,3,100,97,116,97,224,83,20,227,62,3,224,87,-2,224,217,20,234,101,2,224,128,25,0,111,224,126,20,1,101,108,224,210,-40,5,102,111,114,101,105,103,161,172,224,44,23,1,105,102,224,126,20,4,-105,109,112,111,114,224,252,0,224,254,30,3,110,101,119,116,196,194,226,82,-23,3,102,105,120,114,224,169,30,64,43,224,172,21,224,77,1,225,45,33,-6,105,110,115,116,97,110,99,160,173,224,45,23,214,21,224,31,15,230,197,-2,225,46,32,2,116,104,101,225,172,30,0,111,225,172,21,230,127,3,225,-0,33,225,170,0,224,32,15,3,119,104,101,114,224,210,0,68,44,172,112,-0,52,192,43,68,227,0,57,204,26,224,5,3,160,24,160,137,172,6,160,-6,224,45,25,224,52,3,224,45,18,224,84,3,160,52,224,45,25,224,98,-4,0,53,114,238,97,149,1,95,53,105,99,232,254,0,137,38,5,115,99,-109,112,32,58,128,66,167,37,2,66,32,90,73,97,65,17,136,18,148,120,-235,70,6,233,23,21,243,237,1,0,57,210,151,249,145,12,64,24,138,175,-2,49,57,56,197,190,168,244,178,226,0,57,242,130,0,231,217,5,137,22,-230,117,16,5,83,121,109,79,112,101,99,50,241,229,8,64,113,230,136,4,-111,141,231,129,2,220,141,98,52,138,187,211,221,96,229,224,23,2,0,49,-102,156,236,180,1,134,134,1,67,32,140,179,0,79,75,144,244,225,0,224,-31,12,64,88,192,30,224,150,6,237,85,37,103,29,96,96,0,56,73,199,-135,53,98,250,2,49,55,57,194,251,64,29,64,7,237,102,34,97,106,0,-54,225,106,18,231,223,36,109,155,224,160,1,231,196,27,130,35,139,211,1,-49,57,76,42,98,91,86,175,0,53,97,136,130,17,108,120,76,170,224,129,-7,175,163,236,152,4,225,71,0,228,26,5,128,251,239,212,0,160,125,169,-5,240,134,11,75,205,226,178,1,194,152,169,14,233,54,4,137,45,64,29,-212,156,226,73,5,1,64,35,82,162,83,164,74,156,64,39,164,140,225,115,-13,226,223,200,233,255,11,226,210,45,226,75,18,97,87,132,249,0,79,242,-63,8,224,17,3,0,60,124,134,224,17,3,132,179,224,17,3,139,133,224,-17,3,148,118,0,79,242,130,5,128,14,235,146,0,128,14,244,143,0,225,-26,1,0,58,128,199,176,18,155,248,139,0,0,54,66,143,64,30,197,140,-239,169,2,70,5,64,47,252,82,4,65,18,252,80,8,239,86,4,64,77,-133,62,222,69,0,54,119,181,240,172,5,79,50,64,41,0,54,230,4,0,-145,87,64,6,248,61,5,229,168,0,108,17,99,16,131,177,0,90,65,192,-96,6,224,7,0,114,231,64,35,227,87,18,0,55,178,195,160,248,163,80,-240,158,0,2,49,57,56,71,247,66,201,247,174,0,134,123,189,54,206,63,-66,44,100,102,4,51,53,32,95,56,248,203,0,96,232,128,203,97,45,224,-205,7,242,38,6,249,1,13,157,159,192,104,0,85,226,7,2,1,91,93,-102,223,224,88,4,152,236,160,11,175,63,165,114,242,103,6,128,246,224,239,-4,241,142,3,250,95,5,77,37,0,55,112,231,0,79,195,103,64,64,215,-217,97,126,192,4,199,212,80,170,144,250,146,198,97,51,64,73,135,189,64,-141,160,189,100,145,239,161,8,3,58,49,57,55,130,169,117,83,0,66,129,-68,244,209,10,154,2,97,79,224,106,20,131,251,226,195,3,96,125,163,213,-240,32,8,64,127,131,10,230,17,7,83,75,230,18,4,1,95,53,96,135,-2,53,57,56,64,25,2,50,32,75,132,118,100,122,230,50,13,151,153,230,-50,4,229,165,3,96,0,64,128,168,124,224,179,0,64,19,0,54,229,177,-18,0,85,231,38,39,99,245,231,37,35,67,51,164,30,0,66,68,17,97,-44,96,47,2,52,48,55,68,117,253,107,1,100,66,0,50,92,232,226,55,-5,64,78,231,104,78,231,102,4,231,101,10,66,196,100,13,3,50,48,32,-85,64,107,0,54,67,48,0,80,96,117,0,49,64,79,247,138,7,99,79,-65,134,1,64,85,147,219,160,71,131,59,0,75,65,234,64,14,167,69,3,-49,57,54,57,74,232,67,242,191,133,148,32,100,69,96,170,97,21,64,97,-2,64,95,52,69,173,224,25,9,132,104,192,30,99,83,192,25,0,66,96,-53,98,60,0,53,144,159,161,122,153,242,192,19,160,15,0,58,96,142,129,-173,192,2,64,31,224,13,5,64,180,66,189,0,51,127,142,0,73,96,207,-0,54,130,248,0,75,224,39,2,97,96,227,92,1,1,95,52,196,106,0,-54,64,142,96,131,133,179,0,54,139,82,0,52,103,46,64,75,130,195,88,-200,227,198,0,98,20,3,66,32,95,55,88,48,132,90,160,201,64,25,231,-50,2,1,94,42,139,195,224,27,10,11,32,32,102,111,117,110,100,58,32,-32,32,32,128,36,129,37,224,92,0,98,212,66,227,96,16,133,156,99,168,-231,77,4,2,69,79,70,64,61,167,33,160,62,72,113,0,48,162,177,224,-120,10,8,101,120,112,101,99,116,101,100,58,128,120,96,200,77,29,2,55,-50,49,233,227,1,226,43,0,65,16,194,12,1,49,57,96,29,129,74,65,-44,64,249,160,25,0,54,129,238,1,95,55,236,231,1,90,171,125,52,96,-4,65,110,197,26,65,117,216,36,158,171,243,206,0,199,5,69,136,243,232,-6,233,191,7,64,22,247,96,13,224,65,0,162,127,110,10,233,179,6,198,-95,224,69,12,196,251,224,69,5,138,22,96,22,163,177,224,91,6,97,61,-225,107,1,240,15,5,159,129,192,114,133,247,102,154,104,197,130,69,3,64,-83,32,83,67,169,67,172,64,100,0,66,227,88,2,224,159,3,102,18,132,-69,161,251,65,85,196,153,0,89,155,175,224,176,0,224,13,1,104,87,164,-253,1,85,32,99,53,224,174,1,7,108,97,121,111,117,116,76,83,160,176,-128,240,225,125,6,64,144,192,25,224,2,0,128,47,64,37,128,1,225,169,-4,128,170,224,132,0,96,199,160,43,224,59,0,224,56,12,120,188,224,29,-1,98,117,225,3,3,224,31,6,103,185,135,66,192,99,129,63,64,7,64,-247,226,192,0,69,58,215,70,167,249,129,99,0,80,97,201,71,8,217,136,-224,52,1,192,0,224,140,14,192,229,224,139,2,65,37,64,91,225,57,0,-66,49,96,239,196,194,225,9,1,228,209,2,193,240,192,202,224,24,2,225,-36,0,100,135,93,143,162,119,0,53,169,110,128,34,192,91,96,11,241,16,-1,1,32,95,94,147,0,54,231,161,0,224,245,3,72,20,120,218,98,135,-224,252,13,96,121,224,44,10,128,32,64,73,228,32,0,228,28,0,64,0,-64,11,138,49,227,43,0,128,28,198,192,96,0,224,213,0,96,7,130,114,-195,107,226,21,3,129,183,193,100,226,128,1,104,16,129,103,64,5,102,132,-163,57,161,123,97,47,64,125,1,54,53,161,6,163,230,192,122,225,8,11,-96,33,224,219,4,72,22,128,192,232,23,2,224,230,3,129,165,132,201,161,-235,193,140,161,201,225,164,0,96,185,225,22,1,224,152,0,128,226,224,151,-24,160,106,225,164,0,129,209,193,94,64,81,170,91,224,158,3,224,88,43,-128,172,192,88,234,207,1,64,94,226,59,13,96,46,64,30,1,95,55,125,-234,224,0,0,128,89,229,182,14,225,60,1,99,65,228,197,2,99,43,224,-29,0,131,15,192,13,239,165,5,189,221,224,31,0,225,94,1,229,253,11,-129,50,132,30,224,240,1,64,97,226,165,1,2,48,54,32,162,41,64,0,-227,188,3,98,96,229,35,1,192,23,227,150,3,5,95,49,53,55,32,95,-109,171,2,51,50,50,224,72,2,160,59,224,122,7,227,57,2,0,67,131,-110,74,230,0,56,230,86,3,133,167,7,32,101,114,114,111,114,32,125,205,-70,84,187,96,59,132,220,228,226,1,128,0,224,232,13,227,169,5,160,146,-96,38,64,23,170,170,228,4,1,164,147,226,3,2,160,239,102,87,225,216,-3,97,191,224,16,3,96,89,128,22,225,184,0,131,33,224,13,9,225,71,-1,64,159,1,56,52,164,224,193,59,224,166,3,76,190,0,50,231,64,3,-229,176,8,161,69,108,45,226,165,0,225,76,1,5,115,121,110,116,97,120,-129,76,225,74,25,71,101,139,132,64,125,139,96,0,85,138,116,171,83,0,-50,75,65,68,214,170,53,0,65,168,241,139,83,0,73,64,29,64,157,96,-29,229,220,1,194,84,130,217,228,51,3,199,194,162,198,192,39,225,40,0,-225,101,0,96,8,74,219,2,49,57,53,129,10,224,70,3,234,73,0,96,-22,165,51,226,202,3,64,36,65,157,97,92,68,216,129,72,80,240,131,12,-0,53,115,191,0,53,111,241,151,71,141,113,237,120,0,229,14,2,199,122,-226,37,6,163,235,229,194,5,224,7,3,162,4,226,102,1,226,13,0,165,-195,64,178,64,60,224,88,4,226,90,2,224,57,6,129,32,160,45,98,45,-230,54,0,224,38,13,130,44,101,26,161,245,105,181,137,186,173,65,128,226,-205,78,164,32,0,64,66,7,65,235,64,7,206,64,100,6,0,55,64,118,-238,13,9,64,91,238,13,4,174,18,184,92,138,114,164,71,0,55,80,171,-224,0,3,129,153,225,148,6,66,140,64,12,145,252,78,61,78,39,225,160,-2,3,95,56,52,56,233,238,2,5,80,114,101,108,117,100,170,158,66,150,-141,54,224,37,6,8,77,104,115,46,66,117,105,108,116,158,0,64,39,141,-18,0,75,98,202,0,54,236,29,0,129,73,64,75,224,11,2,192,8,210,-207,0,53,210,243,1,80,32,97,1,131,59,66,101,160,69,160,44,64,20,-195,103,128,1,132,57,226,177,7,194,29,233,57,0,64,12,134,50,102,48,-160,36,192,153,130,220,227,20,3,99,56,160,37,2,95,49,51,69,167,97,-94,65,118,0,56,144,66,165,37,110,96,64,42,228,209,2,195,72,163,83,-227,89,1,227,209,2,233,199,1,128,76,224,25,10,97,29,228,251,3,224,-174,3,64,201,160,17,128,6,224,60,0,128,32,64,154,150,2,1,55,50,-81,83,0,50,85,246,226,54,2,1,95,54,114,162,110,83,0,48,142,91,-110,76,1,49,57,113,172,1,95,56,132,21,224,32,1,194,191,224,15,1,-130,215,128,159,1,95,49,110,45,160,241,1,95,55,98,251,128,146,0,95,-64,10,129,108,3,95,51,54,56,226,183,1,1,67,39,76,146,64,25,0,-80,128,91,160,252,227,224,1,171,32,141,101,132,42,64,18,64,44,131,128,-160,162,161,12,163,114,128,143,129,166,135,178,0,56,112,174,2,95,49,51,-85,143,96,0,163,167,161,5,5,66,32,95,56,51,52,67,32,0,55,232,-2,0,77,114,96,202,77,63,2,95,49,53,131,77,0,54,78,189,64,14,-80,1,64,7,84,17,100,35,103,28,96,96,64,6,97,60,226,63,0,0,-48,233,46,3,65,102,132,85,106,143,177,233,65,175,152,197,128,164,192,68,-66,116,233,41,0,194,182,225,111,1,224,20,4,0,89,225,74,0,197,105,-194,56,161,25,194,81,64,0,96,24,234,129,2,224,36,0,128,53,232,133,-0,64,129,1,52,57,226,246,1,224,100,11,192,9,96,10,246,176,3,192,-153,199,196,226,228,0,192,107,226,233,1,2,95,55,50,238,19,0,224,0,-1,194,148,140,202,67,255,135,80,111,14,73,227,192,128,224,117,7,224,7,-3,224,205,2,64,18,134,86,131,244,227,119,2,224,2,7,224,140,0,128,-15,227,176,1,224,36,12,224,37,20,224,40,4,224,41,34,235,147,0,0,-39,131,240,228,194,2,97,87,199,231,195,44,132,182,225,118,1,141,44,100,-170,128,92,167,46,224,5,3,231,58,1,192,148,235,83,4,99,189,161,227,-132,86,0,53,236,206,0,66,181,2,52,54,50,227,209,1,131,133,242,154,-1,196,51,3,95,55,52,50,64,12,93,29,224,22,2,192,228,224,88,3,-224,85,9,192,50,165,117,66,144,236,190,0,229,12,1,224,2,17,226,244,-3,225,25,2,161,53,225,113,5,224,28,19,225,176,3,230,72,0,161,24,-229,250,4,224,20,0,224,8,2,1,95,49,247,4,1,225,171,0,225,109,-1,224,198,3,64,15,226,31,3,0,89,160,32,224,102,0,225,251,7,171,-101,160,42,192,19,197,173,96,130,160,173,226,106,7,192,92,160,62,192,196,-98,27,224,5,3,193,66,224,57,3,162,48,224,25,10,160,2,224,25,17,-226,168,1,225,113,3,192,164,64,19,226,246,1,225,39,5,133,233,69,98,-233,0,6,160,68,231,182,2,130,139,238,234,0,224,224,7,68,213,165,164,-64,39,134,176,64,53,202,116,228,56,0,64,126,156,84,71,241,230,193,7,-224,28,16,71,73,228,208,4,102,181,150,141,192,0,224,246,2,226,20,3,-232,163,4,128,210,160,247,224,128,7,224,215,0,224,236,3,224,218,0,198,-231,224,249,2,200,48,226,93,11,226,193,1,228,1,2,226,92,255,226,92,-45,226,90,1,96,0,226,2,14,225,67,3,64,13,226,8,29,159,201,224,-166,3,96,27,193,5,231,205,4,128,156,192,150,74,20,64,28,244,241,3,-64,0,96,150,64,107,227,3,14,0,51,72,136,224,121,8,224,138,11,237,-138,3,96,59,174,100,227,108,19,128,215,160,187,79,221,157,68,92,198,226,-241,4,230,205,2,160,3,234,69,5,225,79,2,224,90,1,232,142,3,98,-150,225,178,3,240,166,1,226,249,3,200,181,229,238,1,161,8,98,124,227,-145,17,64,84,243,98,3,128,0,225,105,4,128,179,64,40,0,80,138,3,-239,120,4,232,148,3,204,136,233,105,1,193,42,224,98,1,226,85,6,233,-160,1,224,89,8,163,82,64,251,64,66,65,62,135,86,224,80,4,224,75,-16,225,207,1,161,172,203,143,64,67,196,18,224,72,2,203,100,2,52,48,-49,76,52,0,51,124,108,238,67,1,2,110,111,116,90,117,4,111,114,116,-101,100,217,13,128,0,73,231,223,135,0,82,64,108,110,250,66,71,2,56,-57,48,202,138,0,95,75,213,1,95,56,124,21,129,116,219,36,251,111,6,-0,32,145,192,0,56,139,133,128,93,191,199,225,22,4,225,116,3,132,96,-229,37,0,228,143,4,226,218,5,164,66,224,26,0,224,69,0,225,205,1,-64,0,224,71,3,224,25,5,227,234,1,229,23,0,193,179,224,46,0,226,-148,0,224,11,1,84,222,168,83,229,158,28,162,188,228,238,0,98,0,144,-116,247,202,1,128,1,243,142,5,163,48,128,16,96,142,229,200,2,165,188,-192,156,227,62,4,228,129,2,96,56,172,77,0,49,86,21,224,0,3,230,-139,5,225,85,0,230,132,7,224,38,50,225,92,5,64,38,228,53,21,225,-39,14,99,42,192,108,244,202,0,164,39,224,21,14,165,147,161,11,129,246,-65,186,133,137,245,142,7,225,74,1,225,181,25,250,232,6,225,182,5,224,-146,2,237,125,1,224,13,11,245,122,14,161,42,230,71,2,98,148,224,185,-1,224,0,3,230,55,0,224,183,29,224,182,18,224,171,88,224,170,37,225,-97,19,224,170,93,96,142,226,209,4,224,84,0,227,232,1,224,19,3,232,-232,3,128,1,224,219,14,224,109,1,224,60,1,192,183,224,19,5,233,201,-2,224,23,0,228,7,14,224,137,4,132,13,224,75,5,231,24,2,224,20,-1,96,254,249,159,0,229,94,2,224,180,0,179,160,198,119,129,16,232,156,-1,137,15,2,54,53,49,228,249,0,159,153,75,153,0,50,72,247,1,48,-52,230,145,5,196,132,102,54,2,49,53,53,117,28,113,226,224,0,4,210,-15,2,95,49,50,119,211,163,191,193,146,128,8,160,5,239,71,4,192,184,-169,182,160,191,137,129,146,56,177,213,224,137,0,196,9,225,236,0,102,30,-230,47,1,192,173,192,123,224,238,3,192,68,210,59,0,90,83,233,128,176,-96,240,84,193,182,88,82,83,0,58,113,208,230,255,4,192,97,230,166,5,-160,17,96,196,100,200,153,49,243,143,2,2,95,55,57,64,102,231,153,18,-231,142,8,15,117,110,100,101,102,105,110,101,100,32,109,111,100,117,108,101,-231,158,7,111,233,97,192,0,79,225,141,0,192,244,199,104,226,34,4,231,-188,6,128,2,162,143,224,21,6,160,81,226,80,1,96,69,163,123,3,95,-49,48,48,134,153,131,160,80,179,231,133,0,201,253,104,222,245,69,2,1,-49,57,162,89,225,68,1,96,61,65,29,202,233,99,85,96,209,236,89,7,-224,149,1,171,97,99,5,192,136,244,185,1,137,92,1,90,32,254,90,3,-130,202,64,12,226,58,4,171,230,246,167,0,213,8,224,78,4,96,203,248,-203,0,224,134,38,1,64,75,224,58,0,192,64,66,81,152,38,97,187,118,-116,0,56,224,94,1,194,38,96,39,152,38,248,78,6,1,46,46,184,69,-65,77,247,243,8,65,157,160,20,237,26,5,132,62,2,95,51,55,96,93,-224,11,2,129,223,128,12,138,195,65,46,197,29,170,79,133,151,64,20,192,-65,128,0,224,48,16,224,40,7,131,122,73,131,64,164,152,173,226,146,1,-226,17,1,226,67,1,224,9,4,224,29,1,224,9,4,233,251,1,234,5,-2,228,68,3,107,184,75,119,65,153,2,51,55,57,167,83,98,200,1,50,-57,130,209,118,29,98,194,1,95,54,215,212,1,95,56,109,192,64,0,66,-155,6,51,54,53,32,95,57,49,151,243,0,50,245,224,1,141,234,0,57,-66,1,147,182,97,3,250,128,3,133,94,128,21,224,23,10,140,88,246,39,-13,167,11,228,197,1,169,22,132,91,226,222,2,161,93,233,30,8,224,148,-6,224,128,0,96,15,225,216,6,224,7,9,235,36,27,224,166,2,96,16,-231,179,1,239,85,3,161,181,229,231,1,238,69,1,133,142,193,79,66,253,-182,217,224,223,8,224,0,3,65,133,128,236,2,95,57,49,101,205,0,57,-217,81,225,173,19,195,178,225,176,36,225,24,5,239,78,4,97,35,130,106,-0,80,225,196,13,224,84,1,129,79,193,6,129,1,192,39,227,168,7,64,-195,0,52,67,35,243,23,0,226,3,30,160,228,224,85,25,150,21,226,89,-50,68,182,69,243,165,175,224,239,9,228,53,6,193,250,193,75,226,54,1,-224,13,5,199,65,96,153,160,43,236,159,2,236,162,1,226,72,5,160,34,-224,61,0,126,168,227,85,15,236,119,0,226,241,7,160,132,224,10,2,225,-175,1,133,99,225,49,6,70,228,173,33,166,20,233,72,9,193,73,66,233,-206,60,161,65,0,56,123,71,0,57,126,98,160,119,163,92,224,157,13,241,-140,17,192,54,193,57,227,124,1,225,52,0,193,41,133,19,64,52,224,93,-2,0,83,160,53,124,177,226,121,3,0,85,96,43,235,228,4,0,95,105,-31,0,85,101,244,192,216,227,194,1,64,0,226,151,12,224,166,26,160,146,-64,169,228,23,7,224,80,6,228,40,2,224,0,2,64,180,97,98,229,213,-5,89,66,105,41,133,2,227,167,16,225,218,6,124,164,224,213,2,224,104,-4,1,51,50,138,36,0,52,102,38,161,195,130,179,224,5,0,64,64,0,-57,121,223,131,64,224,6,5,224,14,0,100,173,102,120,87,26,160,9,66,-64,166,130,2,95,55,54,64,7,71,54,0,51,103,54,3,85,32,75,52,-96,191,64,18,155,226,64,183,93,77,228,249,1,2,56,51,48,167,12,132,-4,129,214,126,186,93,142,65,103,160,18,157,79,0,48,66,183,169,159,64,-188,137,148,228,51,0,98,216,224,57,26,160,212,98,27,204,64,98,230,64,-171,210,166,128,72,64,17,146,90,122,181,98,130,77,223,96,117,96,11,138,-152,128,13,227,98,1,227,230,2,184,80,65,162,96,150,1,49,50,97,150,-225,129,0,96,31,0,50,98,40,227,162,2,96,87,65,63,64,160,228,220,-1,160,85,64,204,0,49,76,50,0,50,165,35,64,87,224,18,2,192,48,-128,167,129,113,1,49,52,190,181,77,32,97,10,160,251,64,101,94,211,0,-51,102,117,129,246,157,165,0,56,64,251,64,94,226,142,1,131,149,130,127,-132,71,133,97,105,255,204,28,2,79,32,35,64,71,99,12,6,95,49,49,-56,32,95,50,70,205,96,13,1,53,53,206,23,7,95,50,49,50,32,95,-50,56,159,142,75,71,124,102,2,50,50,32,240,82,0,96,103,67,208,224,-43,2,81,181,67,68,96,249,0,58,131,77,129,177,2,56,56,55,127,156,-99,19,0,50,107,206,1,56,48,137,204,68,39,94,101,65,116,137,136,161,-174,230,131,0,161,137,182,215,164,204,0,83,97,141,64,251,65,26,234,224,-3,1,45,62,148,225,129,175,107,63,0,48,99,69,0,57,99,16,196,7,-160,68,128,71,164,56,224,74,7,0,61,160,74,225,254,2,64,36,0,57,-66,145,192,72,228,122,3,160,76,160,162,192,79,3,79,32,35,49,65,250,-192,121,226,142,5,192,41,1,53,55,99,174,135,104,226,68,4,228,190,1,-79,189,0,55,70,6,66,41,96,8,64,6,162,128,128,94,225,25,5,0,-55,100,208,225,9,1,96,15,64,192,65,74,224,48,11,160,175,3,56,53,-57,52,192,176,225,71,20,224,200,1,224,241,6,3,56,54,53,56,224,242,-0,225,62,16,193,18,225,19,1,98,223,224,16,3,98,19,238,99,22,65,-52,135,97,97,63,227,116,8,230,1,3,136,0,163,120,97,67,65,77,0,-50,220,64,64,36,227,114,7,226,234,23,101,23,240,255,6,225,199,20,102,-96,1,57,57,96,5,64,98,225,215,0,199,20,65,223,99,190,65,116,103,-53,128,87,99,203,66,79,0,48,195,196,67,65,141,231,3,35,49,53,32,-64,13,0,54,133,20,160,96,99,212,160,6,64,29,141,223,129,166,4,95,-49,54,56,56,128,22,141,81,224,52,6,224,65,9,96,43,134,70,0,75,-233,12,0,0,83,163,71,130,74,224,5,4,65,34,132,49,193,164,0,95,-175,197,102,97,64,134,0,50,96,5,66,17,224,37,0,175,91,224,41,20,-96,137,134,189,203,150,0,51,100,229,1,49,48,69,0,1,95,52,97,114,-154,48,100,120,0,35,192,77,196,119,134,78,71,221,0,75,64,83,64,18,-166,79,0,54,71,4,0,54,239,56,7,10,80,114,105,109,105,116,105,118,-101,115,46,164,98,98,204,70,30,2,95,54,49,165,35,229,45,15,224,79,-21,164,103,224,79,25,200,77,0,58,142,126,97,134,0,75,96,206,64,54,-175,184,129,15,0,56,65,46,1,50,53,104,95,1,51,54,65,65,96,12,-82,152,174,154,253,156,2,66,171,224,34,0,66,109,0,56,203,226,224,78,-24,0,56,234,127,3,166,213,224,74,5,0,56,169,84,131,152,224,76,6,-102,182,3,67,32,95,57,64,232,192,96,0,49,82,225,131,38,0,56,80,-206,242,217,8,10,101,120,112,97,110,100,101,100,58,94,42,146,210,2,49,-48,54,201,207,134,59,64,84,66,129,218,204,224,190,2,0,49,147,46,224,-171,11,105,136,166,111,224,164,3,104,116,224,41,1,64,40,98,94,0,49,-67,221,160,35,135,81,224,15,4,97,152,131,157,100,147,225,133,3,0,55,-73,169,148,44,224,179,2,96,147,235,103,1,192,13,96,5,237,147,2,164,-234,161,79,144,160,0,60,247,240,1,192,21,80,213,224,35,9,129,175,227,-104,1,248,230,7,99,213,238,211,0,237,124,5,165,103,235,4,9,199,170,-128,44,246,250,6,196,41,192,69,64,7,238,207,9,130,31,237,139,0,224,-26,7,240,15,0,0,83,69,71,133,254,66,126,0,50,239,232,16,160,78,-224,228,6,193,34,224,146,1,237,184,2,237,64,2,237,195,0,166,89,224,-83,1,238,3,2,224,38,0,160,13,240,221,7,224,27,1,162,253,137,155,-205,36,105,10,227,28,0,206,177,2,95,55,50,67,255,148,187,181,28,192,-0,226,98,2,248,181,0,128,1,226,93,10,86,130,96,0,203,21,238,197,-0,131,25,96,54,2,49,57,50,101,83,247,31,0,132,14,135,135,167,131,-129,212,137,157,247,254,9,107,58,1,54,52,236,187,0,108,186,0,56,98,-77,222,52,131,51,192,142,109,78,142,84,245,105,3,225,229,1,138,229,1,-54,55,237,163,0,67,72,0,54,99,72,0,80,70,228,64,73,195,84,1,-49,51,96,38,129,93,1,95,56,71,162,1,49,57,66,21,1,95,51,151,-152,226,75,0,101,133,96,136,99,160,64,71,134,247,3,85,32,75,51,70,-5,77,223,102,12,160,29,134,233,3,95,56,49,51,110,3,193,105,225,216,-1,225,125,1,224,1,7,226,50,2,224,37,16,224,35,4,224,32,23,224,-29,20,224,26,17,224,23,14,180,205,224,0,0,64,237,135,77,70,253,235,-174,2,7,52,48,49,32,95,52,48,51,111,175,229,128,1,1,37,84,139,-25,231,78,0,66,201,231,139,0,230,44,16,1,57,48,97,145,237,170,0,-164,163,248,100,5,229,146,3,233,207,2,1,48,55,224,85,1,130,59,65,-240,64,150,133,176,226,221,1,227,235,1,128,67,130,87,0,57,87,98,234,-8,2,164,230,64,1,82,210,220,128,96,165,130,119,236,142,2,171,224,98,-110,1,52,56,87,101,229,69,2,163,43,64,30,128,144,160,145,160,221,160,-57,229,132,4,232,239,0,229,168,19,193,1,196,29,224,213,3,145,70,128,-29,196,199,129,41,225,244,2,196,125,96,24,243,22,2,207,25,96,46,129,-29,74,218,1,64,95,96,219,184,111,0,57,163,61,160,0,128,81,224,136,-4,64,196,192,135,160,31,101,24,128,88,228,112,5,235,157,3,148,188,80,-7,167,69,0,55,111,131,106,247,121,84,0,50,197,23,224,253,10,224,252,-13,225,164,3,224,225,0,160,77,224,200,4,142,100,74,154,0,52,73,50,-71,216,65,188,100,59,146,19,0,67,68,120,0,57,250,59,3,97,210,102,-177,64,94,182,206,128,105,161,110,230,253,14,234,213,2,230,51,4,166,110,-224,180,3,230,243,9,135,230,232,197,0,192,36,226,143,3,254,15,1,129,-36,129,85,181,142,205,52,128,246,99,89,77,48,161,109,231,50,5,227,101,-0,227,122,1,105,124,96,13,132,6,66,225,227,132,4,65,88,224,224,4,-227,246,2,64,27,133,236,226,11,0,227,213,3,227,206,7,224,61,9,0,-48,98,16,64,70,132,165,96,33,1,51,54,77,149,1,50,53,96,27,170,-19,192,154,96,0,225,26,1,64,112,124,17,226,35,0,206,74,128,17,227,-140,10,128,20,98,10,227,133,9,227,130,12,0,49,76,128,64,27,220,116,-160,4,100,87,225,90,1,227,53,11,160,58,226,193,2,201,25,64,43,146,-225,227,24,3,224,129,8,224,128,8,230,144,3,65,93,116,81,252,14,0,-129,115,116,212,233,187,82,178,124,64,17,206,201,192,0,70,34,141,94,133,-236,110,225,78,118,221,229,1,49,52,101,68,213,19,166,35,224,162,5,225,-189,12,229,171,1,229,71,23,192,178,230,31,7,230,9,4,191,205,224,49,-14,128,108,161,241,128,1,235,213,17,161,22,133,120,195,157,236,111,4,0,-53,81,36,161,100,129,64,236,64,4,160,62,3,95,49,56,48,245,48,0,-0,49,192,91,128,55,226,179,12,98,208,224,187,8,96,21,0,85,66,6,-0,50,96,132,239,74,0,224,231,10,225,24,2,128,89,197,200,224,191,3,-138,10,1,55,32,232,23,2,13,116,121,112,101,32,115,105,103,110,97,116,-117,114,101,136,35,128,218,249,54,4,231,240,21,130,20,0,55,120,222,0,-49,233,195,0,161,73,237,202,5,155,191,224,153,6,225,135,7,225,91,11,-132,34,1,49,48,96,14,225,88,9,96,0,224,49,4,0,58,132,139,148,-207,224,106,8,0,52,95,56,64,85,79,195,235,161,5,228,20,1,64,133,-224,238,5,64,56,225,172,5,103,140,0,52,158,67,1,57,51,88,194,175,-136,239,1,6,26,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,97,117,245,49,0,149,229,2,-49,50,54,133,12,224,70,6,2,94,42,32,64,0,14,102,117,108,108,121,-32,113,117,97,108,105,102,105,101,100,160,67,79,187,171,189,64,0,65,1,-144,101,195,155,82,183,156,12,249,112,5,0,73,106,18,65,80,213,254,97,-142,115,66,150,190,150,90,0,52,70,91,234,68,2,64,74,114,134,225,65,-3,64,23,139,238,105,92,229,227,2,227,198,5,230,32,6,233,233,2,154,-133,245,163,1,96,9,225,133,4,66,197,128,188,226,202,21,194,75,162,206,-160,13,238,61,0,192,91,65,124,227,231,4,0,57,165,199,192,61,192,63,-167,151,192,211,224,32,1,160,14,224,31,3,97,117,99,1,226,125,2,0,-52,164,64,224,92,5,96,129,66,105,240,195,5,98,90,120,226,102,12,1,-57,52,193,176,251,166,11,101,8,193,208,0,85,101,28,83,43,192,108,224,-115,10,231,161,7,160,32,225,176,1,191,223,224,5,3,215,214,128,156,0,-57,97,201,103,187,2,32,95,55,66,47,72,114,197,13,225,46,18,150,9,-64,9,131,64,160,51,225,52,0,96,31,228,66,1,0,49,117,238,236,11,-4,100,13,0,53,71,79,116,17,96,21,174,133,64,79,117,124,2,49,52,-54,173,51,137,75,192,73,0,79,117,37,201,84,64,63,0,65,96,38,161,-45,252,126,4,110,250,128,21,2,95,49,54,225,130,1,224,0,1,66,239,-142,150,119,115,0,55,224,168,2,64,26,142,147,97,47,228,240,18,242,60,-2,140,194,133,197,226,16,4,97,30,165,133,107,17,1,49,55,132,113,96,-143,64,159,0,56,158,114,214,212,129,164,229,19,2,138,97,253,193,6,64,-214,182,42,66,245,68,46,64,49,0,49,96,173,169,56,64,213,64,31,213,-131,226,126,4,160,35,226,127,5,227,193,2,224,251,7,227,3,0,225,224,-0,179,193,230,86,5,0,89,133,93,102,95,64,4,107,87,97,246,0,55,-91,126,2,95,49,53,87,84,194,12,230,242,15,119,212,225,38,1,133,164,-1,49,50,194,24,128,157,237,5,4,132,109,1,49,53,224,206,1,226,72,-2,224,52,7,192,223,137,205,226,238,7,128,82,224,154,1,195,67,245,79,-7,0,85,227,137,4,166,133,99,96,0,48,87,209,107,210,64,134,71,98,-128,147,234,144,0,224,131,2,225,99,3,0,57,203,100,128,209,224,132,3,-235,217,6,97,33,236,56,0,70,67,98,59,230,233,0,225,24,1,109,168,-228,218,3,228,46,1,128,13,160,38,225,199,6,133,94,1,49,57,65,173,-100,209,81,254,227,99,3,128,234,128,118,106,102,87,77,254,99,1,160,115,-103,108,96,106,171,118,226,53,13,160,76,211,25,97,201,0,53,64,79,1,-48,54,97,68,128,204,132,197,165,31,229,38,1,232,230,2,225,163,5,96,-191,96,63,128,82,227,83,2,128,136,155,81,2,95,49,54,83,252,224,220,-1,160,88,0,85,132,96,2,95,49,56,131,240,130,149,1,55,52,64,130,-132,122,97,178,211,121,100,198,0,56,139,86,160,0,67,124,139,142,76,35,-72,108,112,184,0,58,98,33,228,96,0,237,146,10,225,36,9,161,33,193,-241,205,143,101,134,237,227,2,228,108,0,98,55,237,141,53,225,192,0,232,-1,5,198,165,86,187,228,32,9,96,167,230,160,4,225,106,1,0,80,239,-16,11,224,99,6,192,151,237,236,1,224,247,12,162,16,224,251,10,130,107,-237,147,0,224,163,49,0,75,224,35,4,133,77,64,0,142,47,230,80,5,-224,198,8,225,41,0,225,35,53,229,159,5,226,23,0,232,112,5,74,31,-2,54,56,48,224,38,0,66,69,0,52,192,32,230,162,2,236,199,20,226,-7,51,131,24,92,63,229,174,3,139,83,235,75,8,31,105,110,102,101,114,-32,114,101,99,117,114,115,105,118,101,32,112,97,116,116,101,114,110,32,115,-121,110,111,110,121,109,32,74,16,0,115,202,7,225,91,12,173,97,128,215,-225,11,4,237,116,5,247,196,9,226,114,13,196,132,110,158,99,56,96,210,-228,78,11,229,202,9,224,100,12,225,184,9,229,231,11,141,26,241,160,4,-236,190,21,198,21,224,30,5,229,167,20,96,147,232,149,10,234,152,4,229,-29,8,229,19,10,64,0,162,125,197,244,209,252,96,62,128,162,128,10,147,-224,163,161,0,52,86,153,0,53,163,138,230,70,8,230,90,12,160,182,128,-0,69,44,141,15,0,83,168,78,224,170,6,242,17,1,235,183,8,174,53,-95,186,196,236,136,39,225,10,2,252,116,5,0,95,77,5,65,112,102,54,-229,231,0,96,204,224,93,5,225,150,9,239,51,5,0,52,134,52,225,91,-12,1,52,52,230,219,1,235,238,3,230,78,1,64,245,141,216,236,237,2,-89,240,70,101,103,110,65,158,171,16,64,57,2,53,54,53,96,134,64,35,-170,72,225,131,0,1,50,51,75,87,117,104,129,145,0,50,181,119,64,11,-65,171,246,11,0,64,118,0,54,142,29,225,70,2,0,54,71,118,0,75,-225,89,9,0,54,149,214,166,244,239,158,0,226,189,7,244,205,4,194,39,-230,245,4,1,53,57,64,47,133,96,225,46,5,0,95,131,208,232,86,2,-64,162,142,168,193,148,130,255,130,214,65,6,96,34,139,219,0,67,129,220,-64,195,128,22,139,215,154,205,0,67,218,199,1,52,51,74,153,154,199,67,-215,64,135,64,44,139,87,236,2,18,166,113,229,98,1,222,66,199,110,229,-81,8,97,32,224,25,12,104,250,229,133,13,169,2,229,133,7,162,162,194,-126,128,117,128,146,130,148,96,9,67,174,243,107,0,224,68,8,96,117,66,-130,228,16,4,224,43,13,96,187,2,85,32,83,192,157,96,169,64,1,253,-215,1,161,15,2,95,49,50,185,220,228,203,9,137,228,64,21,255,235,6,-137,169,162,63,224,27,3,101,120,237,195,10,128,134,224,240,1,193,116,225,-56,1,128,45,192,153,225,61,5,224,27,1,254,160,21,195,127,224,98,0,-249,240,1,224,13,3,228,33,0,222,4,230,63,8,254,32,2,105,146,160,-64,238,22,12,224,122,3,196,46,0,54,121,198,224,119,1,224,23,4,232,-158,1,224,85,0,2,95,49,52,74,101,67,106,67,159,218,8,66,188,64,-149,253,255,0,234,178,3,193,38,128,95,0,53,172,83,238,120,3,128,51,-1,49,56,133,32,224,112,1,68,66,227,19,0,224,66,1,0,54,161,221,-224,66,4,128,129,219,3,254,134,9,0,64,253,145,7,225,161,17,130,250,-226,9,0,225,112,6,129,91,161,139,226,82,3,225,70,2,146,34,245,42,-5,225,164,2,224,40,1,225,170,16,226,39,4,164,143,225,178,5,225,149,-1,182,105,224,30,17,199,93,161,72,129,75,193,99,1,51,54,177,41,97,-217,225,185,1,225,182,40,226,4,20,226,97,2,161,211,224,139,4,216,196,-192,33,138,209,251,182,18,184,209,176,50,161,141,155,62,193,192,224,80,0,-80,235,240,233,6,130,204,74,223,0,55,152,186,130,61,70,190,102,210,99,-211,136,116,99,213,115,88,224,0,0,226,122,38,222,87,226,45,7,192,75,-192,19,175,237,248,209,0,128,249,234,12,8,232,92,5,236,214,2,237,224,-15,245,34,11,2,63,63,63,139,15,2,95,49,56,106,116,160,70,0,67,-226,138,11,160,0,70,190,145,246,96,87,230,192,15,160,135,174,43,1,67,-32,164,161,66,229,64,144,101,73,224,99,6,226,26,6,226,13,1,152,167,-199,221,0,49,100,113,97,89,96,215,77,140,147,140,83,193,0,51,201,88,-64,44,168,217,168,181,243,17,2,96,242,146,230,64,21,226,21,4,64,224,-175,90,82,213,96,179,77,8,1,56,50,169,147,233,235,0,3,49,54,57,-48,180,111,227,250,0,130,117,163,71,98,142,96,160,0,85,64,34,96,153,-128,158,192,38,99,81,64,35,100,204,244,175,16,64,63,96,125,160,230,0,-58,128,200,104,135,106,186,168,30,225,116,1,226,251,0,163,49,166,156,128,-195,130,18,238,39,5,96,35,212,177,65,40,98,197,162,204,160,14,192,58,-68,217,229,25,0,136,89,227,202,2,228,228,9,128,237,229,54,2,130,22,-128,26,96,40,224,53,5,224,26,0,192,207,246,152,8,228,151,3,130,95,-192,232,192,75,128,85,181,73,203,111,241,225,7,203,134,97,168,0,50,66,-185,64,9,108,121,105,224,0,56,170,206,98,121,1,49,52,93,148,236,78,-2,225,160,1,192,80,100,153,192,84,99,168,64,4,224,245,5,224,232,42,-224,226,0,225,95,4,115,112,224,18,0,96,92,128,7,224,229,5,224,6,-0,160,234,224,162,3,102,21,64,246,224,179,4,186,126,0,55,68,248,66,-17,226,11,0,75,237,160,180,102,141,230,113,11,224,29,1,80,59,97,30,-160,18,224,42,6,224,30,0,98,205,141,136,130,249,90,106,5,51,32,95,-53,50,51,184,204,64,32,250,140,0,228,113,9,154,228,129,8,228,248,10,-0,48,64,36,160,18,1,67,39,230,79,6,161,155,234,227,1,65,86,233,-147,2,193,184,233,222,1,193,153,128,31,250,73,5,193,137,160,19,230,152,-1,198,149,228,32,0,234,160,3,236,198,4,94,82,233,172,5,64,196,237,-230,2,160,189,192,222,128,42,132,219,230,82,3,225,203,0,225,50,11,0,-55,65,90,224,65,1,165,7,104,4,110,166,156,20,96,0,65,123,0,54,-193,123,108,221,64,42,140,222,0,56,81,13,172,222,96,40,141,62,6,95,-56,49,51,32,75,32,76,64,224,1,13,138,216,192,0,64,85,226,8,1,-141,94,132,197,97,56,71,87,101,248,77,202,128,237,253,90,4,104,107,124,-3,0,49,253,24,2,5,101,120,112,111,114,116,102,221,64,85,0,51,96,-85,82,82,251,43,11,2,51,52,51,224,58,2,6,116,121,81,73,100,101,-110,128,60,1,64,85,117,88,160,70,237,183,11,0,50,166,153,115,46,1,-51,55,110,252,1,50,53,181,67,67,209,116,45,161,246,74,69,97,123,1,-95,51,102,137,97,217,129,140,128,97,135,90,1,80,32,72,112,125,60,64,-246,134,140,226,222,13,156,16,224,29,15,245,214,24,70,215,160,47,224,45,-9,226,154,6,0,56,123,234,164,29,240,146,3,240,230,3,1,49,56,80,-63,97,186,232,158,3,224,92,25,0,56,224,134,32,0,56,169,84,2,58,-49,56,68,65,222,89,232,48,3,195,172,229,187,0,227,64,1,242,35,4,-104,238,231,208,0,224,176,15,2,49,53,53,129,172,227,156,11,186,44,229,-152,1,230,251,1,229,222,3,160,2,192,24,224,43,2,192,5,227,168,11,-1,53,54,199,119,224,112,1,98,106,231,232,6,225,250,4,192,94,135,165,-161,17,0,64,246,182,0,113,228,245,83,1,64,235,88,254,227,0,1,85,-76,7,97,32,99,108,97,115,115,32,99,4,1,95,56,72,205,234,167,5,-224,147,9,225,14,2,224,25,10,227,243,0,224,48,7,228,12,1,236,234,-5,224,2,4,224,237,3,251,46,6,64,219,224,5,0,212,55,73,69,210,-16,0,85,98,26,241,49,14,133,144,240,137,4,213,128,248,42,3,1,95,-54,66,116,128,125,101,201,0,67,74,130,0,57,232,30,0,192,192,224,76,-4,131,95,224,76,9,224,68,21,225,101,4,100,123,247,7,15,1,49,50,-68,109,235,207,2,26,115,117,112,101,114,102,108,111,117,115,32,105,110,115,-116,97,110,99,101,32,98,105,110,100,105,110,103,246,247,3,64,0,64,133,-129,13,161,89,129,151,219,182,225,112,0,225,175,0,187,222,128,1,109,55,-240,129,5,225,208,1,3,95,49,53,56,163,33,227,22,6,159,230,224,69,-1,224,95,0,195,25,224,9,0,0,67,235,185,4,1,64,64,248,186,3,-224,105,1,224,115,3,226,152,8,232,168,6,224,2,6,160,138,128,79,192,-160,239,16,0,225,6,30,128,68,128,11,139,235,246,218,7,232,250,0,140,-61,239,131,1,128,28,225,29,4,225,32,1,224,82,0,160,60,0,48,192,-215,224,240,3,2,53,49,55,206,108,128,26,227,60,4,64,32,66,121,101,-239,140,77,0,49,236,251,0,160,216,165,45,220,254,64,43,76,129,103,108,-224,57,2,71,238,140,20,1,55,56,140,62,224,138,1,128,48,192,13,255,-2,2,177,78,132,217,234,77,0,224,166,1,64,191,65,9,192,205,1,54,-51,253,161,0,224,120,0,128,64,96,29,107,15,128,26,1,56,50,128,11,-237,182,4,74,198,225,88,1,64,40,227,91,7,133,102,0,89,224,114,0,-169,255,193,106,225,229,2,204,217,130,13,249,204,6,192,48,233,247,2,191,-197,129,193,240,126,0,160,73,0,66,75,66,230,10,2,204,179,104,44,1,-52,56,65,8,1,52,52,128,90,224,179,8,0,89,224,166,0,192,160,224,-154,14,135,150,192,148,160,140,64,234,130,98,128,115,96,166,96,139,224,135,-2,160,174,0,67,128,24,224,0,2,193,159,160,0,250,129,3,253,106,5,-106,121,0,56,130,133,228,150,0,96,144,2,95,49,54,88,15,240,66,2,-71,176,139,232,97,214,98,85,162,125,64,68,175,225,128,14,0,52,71,121,-194,146,97,46,0,54,89,109,64,136,1,35,54,175,11,0,56,139,249,96,-87,140,31,69,247,0,57,72,20,64,28,119,176,96,35,172,90,0,57,66,-52,0,49,128,21,138,170,229,59,1,69,48,0,34,128,26,170,130,1,32,-83,65,115,179,230,161,87,246,5,10,128,20,230,93,8,0,49,96,163,193,-127,232,145,1,96,22,188,219,233,208,18,68,41,64,42,104,217,230,87,6,-96,67,2,95,53,48,65,38,0,54,77,24,224,197,1,69,237,165,234,98,-12,229,2,2,232,209,3,69,89,129,58,65,39,230,124,4,162,200,246,209,-9,224,79,20,175,54,128,86,202,107,192,209,234,111,3,96,65,64,116,64,-18,105,158,251,159,5,224,103,64,192,99,135,126,128,36,234,6,13,65,242,-140,31,227,216,2,195,229,224,126,4,224,112,1,224,31,0,224,117,6,128,-119,3,48,32,95,51,174,39,64,92,204,53,98,33,225,240,2,0,83,101,-30,133,105,2,53,54,57,195,42,67,81,106,112,0,75,239,165,0,136,194,-99,179,0,83,142,93,64,77,116,252,160,7,132,95,0,83,173,51,224,77,-2,1,95,53,139,46,192,217,224,56,3,225,17,5,128,19,135,125,100,41,-2,95,54,54,231,79,4,128,91,232,134,11,65,21,226,132,1,9,109,97,-108,102,111,114,109,101,100,32,72,131,11,100,97,108,111,110,101,32,100,101,-114,105,118,232,136,2,128,127,225,107,6,235,2,11,0,54,101,239,224,52,-1,230,230,1,227,66,10,131,133,170,17,139,135,138,247,162,85,64,26,227,-197,11,226,243,13,78,193,201,177,225,40,3,165,204,64,46,104,165,140,102,-226,200,6,224,60,15,224,56,3,226,156,1,224,85,0,225,96,17,235,168,-13,12,100,97,116,97,47,110,101,119,116,121,112,101,32,235,173,5,64,0,-225,89,1,171,152,160,187,230,20,3,233,0,0,96,33,232,143,1,224,173,-0,131,177,109,9,229,204,1,163,162,151,87,152,25,96,0,66,241,246,32,-1,224,123,6,97,148,224,96,0,237,40,0,166,216,198,222,192,11,192,82,-224,20,0,224,64,0,224,55,20,83,240,224,56,6,130,20,225,15,2,128,-22,64,32,224,40,8,224,94,1,233,130,0,0,66,192,30,65,179,0,51,-163,100,0,49,71,170,0,51,110,25,107,209,158,13,230,242,2,0,79,225,-170,2,4,68,97,116,97,46,224,4,0,65,167,224,29,8,7,84,121,112,-101,97,98,108,101,224,8,0,224,37,7,11,71,72,67,46,71,101,110,101,-114,105,99,115,192,8,224,35,7,29,76,97,110,103,117,97,103,101,46,72,-97,115,107,101,108,108,46,84,72,46,83,121,110,116,97,120,46,76,105,102,-112,211,224,46,3,17,84,101,120,116,46,82,101,97,100,46,73,110,116,101,-114,110,97,108,96,13,224,38,12,3,83,104,111,119,96,4,64,29,232,3,-4,228,56,0,96,5,73,139,153,41,226,74,1,226,92,4,233,3,0,224,-48,2,100,163,72,255,71,219,153,104,229,67,0,224,93,14,225,157,3,65,-160,226,99,3,224,115,58,160,36,99,74,224,106,7,105,128,224,108,7,160,-20,224,110,36,195,79,2,95,49,56,102,223,67,60,145,239,200,32,239,219,-11,96,79,0,52,104,229,107,255,230,217,6,108,71,153,94,138,96,64,35,-129,176,0,58,128,209,163,156,192,212,224,183,9,225,65,5,224,27,25,224,-2,4,195,156,224,25,7,128,22,197,126,205,108,227,179,4,195,158,163,151,-224,14,2,225,4,4,193,6,192,141,128,8,64,20,224,118,2,240,47,0,-1,49,54,147,114,1,49,56,111,47,65,144,152,21,230,253,5,91,109,241,-27,6,227,1,1,2,66,97,100,230,194,8,239,169,4,224,150,1,225,15,-9,192,2,224,195,6,128,49,224,194,5,224,5,27,228,223,1,234,157,6,-164,163,224,67,23,252,31,12,1,56,52,70,99,236,6,3,198,41,225,74,-2,239,24,30,239,36,4,224,244,5,225,156,98,96,0,192,133,224,141,0,-249,96,7,227,221,7,231,26,7,207,186,207,37,250,59,0,64,0,230,149,-6,102,22,239,225,1,224,119,4,82,152,242,149,0,96,8,79,16,159,115,-154,87,170,212,239,210,1,160,68,193,135,224,150,6,107,192,92,104,160,110,-227,73,2,248,109,2,102,147,0,51,168,227,96,62,0,85,240,53,0,226,-160,0,112,118,224,44,4,192,227,224,95,2,97,162,97,53,225,67,5,162,-34,64,2,244,193,21,233,184,2,160,166,228,215,7,194,201,135,173,180,176,-64,182,225,247,4,244,175,49,193,140,239,186,0,240,168,1,224,10,17,212,-161,225,229,3,230,88,10,193,3,227,227,6,192,67,236,71,21,129,179,236,-72,5,192,55,128,172,224,95,0,225,39,1,224,21,9,232,229,0,228,136,-12,224,25,17,132,54,224,144,3,192,1,129,212,243,92,10,128,30,229,201,-11,0,83,243,231,2,227,87,3,243,29,10,225,244,2,236,222,0,96,17,-162,85,67,76,2,32,95,53,66,5,127,247,160,5,224,88,2,151,249,197,-6,164,85,254,237,9,171,251,107,225,130,78,0,52,89,167,80,90,111,138,-96,17,0,50,66,180,82,120,73,218,240,251,2,192,238,67,54,64,80,64,-45,0,51,101,45,99,11,250,59,4,14,109,107,77,101,116,104,111,100,58,-32,97,114,105,116,121,228,140,2,225,118,12,128,2,244,139,4,225,88,0,-163,43,96,2,244,2,2,224,74,40,224,1,1,3,95,49,50,51,66,131,-228,96,4,96,55,226,196,0,229,232,4,225,100,0,230,66,9,2,95,49,-52,81,38,110,170,1,50,49,240,129,3,4,99,111,101,114,99,106,186,224,-134,7,68,63,226,219,2,132,214,224,33,2,64,31,193,176,224,17,1,242,-219,1,225,129,1,128,63,225,134,1,130,44,101,158,174,179,240,84,7,225,-194,0,0,54,178,101,101,65,101,169,98,223,244,73,13,96,64,128,69,191,-32,165,253,0,83,147,143,98,118,238,53,3,130,112,98,111,0,90,96,177,-67,188,194,218,224,42,5,209,84,239,149,1,180,131,225,117,2,224,47,9,-224,48,2,110,91,96,4,78,74,66,202,3,95,49,52,54,237,249,1,160,-0,8,95,49,50,54,52,32,67,32,80,160,224,64,15,134,57,174,85,130,-208,97,23,80,119,196,152,161,35,238,245,4,194,97,170,89,129,25,144,112,-0,55,229,158,3,129,200,193,189,144,196,192,141,244,19,5,238,224,5,161,-100,96,57,134,161,129,20,64,138,69,132,132,223,197,108,64,121,224,19,2,-96,18,64,14,3,80,32,64,83,64,4,193,81,233,35,6,128,39,6,64,-66,32,82,32,64,75,96,134,148,220,224,51,4,239,186,0,225,107,2,224,-47,0,128,0,128,11,160,17,228,6,6,175,143,2,68,101,114,163,8,75,-119,148,249,100,176,227,116,1,226,58,6,0,80,227,158,0,66,105,137,141,-64,59,148,221,190,187,149,59,0,52,99,135,104,109,73,208,135,156,65,140,-82,126,97,79,64,30,126,142,2,48,48,55,225,115,0,98,72,128,241,1,-95,55,120,17,64,95,0,54,224,155,9,224,153,6,2,85,32,75,127,242,-162,52,64,52,149,66,117,155,3,49,52,51,54,149,156,64,183,227,201,0,-64,37,149,77,66,165,1,35,49,64,110,0,85,117,100,68,9,159,74,105,-19,135,232,147,219,133,137,128,19,64,41,255,116,0,224,41,8,0,50,64,-116,224,41,2,240,118,1,243,45,2,127,151,1,49,56,99,25,205,102,228,-99,2,135,22,224,11,2,192,8,225,124,1,255,128,0,151,157,239,242,19,-64,104,0,56,96,224,64,111,5,10,65,32,79,32,80,239,231,7,6,66,-111,117,110,100,101,100,192,7,66,33,64,151,64,196,224,45,10,5,69,110,-117,109,95,67,72,219,96,10,192,45,65,94,224,45,10,240,97,4,64,39,-78,116,224,85,11,3,113,46,69,113,160,35,0,54,65,17,224,35,10,6,-70,117,110,99,116,111,114,192,7,192,45,224,167,14,4,73,120,46,73,120,-224,35,22,2,79,114,100,64,3,192,37,65,49,224,37,10,241,7,12,64,-47,68,133,224,47,5,241,17,15,224,131,13,241,27,26,64,56,225,90,9,-1,84,101,241,37,16,64,48,67,17,224,48,10,241,47,4,64,39,239,134,-1,192,0,66,39,217,16,164,198,237,194,5,128,11,0,83,101,182,0,55,-137,10,144,57,162,168,130,231,226,183,0,234,195,9,133,42,238,126,11,176,-66,168,58,246,66,0,224,12,0,165,101,111,204,224,13,1,234,251,4,224,-20,7,224,21,7,234,143,14,236,167,0,192,28,224,29,4,224,83,1,170,-92,253,219,14,224,49,7,224,2,3,233,6,2,234,44,2,224,2,8,166,-199,224,83,26,233,87,6,224,81,11,201,164,221,46,226,13,1,7,115,104,-111,119,115,80,114,101,98,154,224,109,21,221,79,192,104,224,1,1,138,232,-224,25,11,140,158,224,22,17,224,104,11,178,191,237,147,2,224,202,4,240,-45,7,106,56,130,33,82,90,97,15,137,10,226,207,4,224,210,12,128,2,-192,34,224,208,2,235,241,1,208,75,64,22,71,112,103,131,67,49,235,133,-2,224,220,5,224,224,4,224,28,22,224,243,3,128,28,245,231,1,96,2,-240,244,1,224,67,14,224,65,8,241,6,0,224,8,13,64,44,160,218,97,-67,130,29,2,56,50,54,65,53,226,23,5,4,80,97,114,101,110,194,23,-192,100,128,70,141,0,128,52,2,79,32,35,69,46,161,109,161,31,0,50,-90,182,103,210,228,18,3,162,155,96,51,88,95,193,161,169,54,169,78,253,-248,0,225,105,4,223,208,2,85,32,35,152,211,224,150,1,224,2,0,241,-245,4,128,239,64,71,192,235,64,8,236,44,4,161,252,225,238,2,193,70,-128,75,132,118,128,137,235,198,1,128,146,3,79,32,35,49,82,30,226,101,-0,128,116,64,50,96,223,73,4,224,223,1,96,215,163,64,128,13,111,59,-228,215,1,224,111,27,70,55,192,82,1,85,32,229,108,0,64,12,96,141,-0,53,225,133,1,65,159,108,129,139,125,0,54,149,225,160,44,138,201,127,-29,72,47,96,59,0,48,236,147,4,96,10,64,4,161,177,104,225,3,64,-95,55,49,187,175,0,95,209,122,224,31,1,1,49,48,64,110,226,67,7,-2,83,116,114,242,248,1,194,27,105,218,224,59,4,0,56,226,127,11,228,-151,3,226,86,6,224,51,2,65,106,0,54,224,188,0,2,95,49,51,112,-191,137,146,173,70,174,8,235,211,8,175,82,2,56,52,56,97,63,87,94,-228,51,3,169,145,71,8,138,227,68,233,68,114,0,54,89,103,1,95,52,-64,127,177,240,64,132,193,65,0,67,161,183,64,19,225,176,1,69,33,137,-149,64,79,0,54,160,79,198,71,193,250,66,160,231,78,7,234,24,0,130,-55,64,128,126,61,134,117,64,29,143,51,227,7,0,231,78,15,96,110,237,-56,16,64,128,166,116,128,17,101,92,230,54,14,3,114,101,97,100,225,157,-0,128,46,64,61,239,195,2,128,61,66,18,238,206,0,239,145,10,2,101,-114,114,137,189,176,186,65,187,130,32,224,107,9,0,32,124,82,3,101,102,-105,110,138,152,64,0,226,167,0,128,4,225,222,5,136,195,140,9,3,75,-32,75,52,224,249,3,204,202,64,33,140,5,0,75,133,85,109,131,168,218,-225,140,18,173,251,221,68,244,90,8,0,51,142,36,65,27,132,125,232,43,-8,228,185,3,135,194,232,126,0,240,122,2,232,6,0,163,44,161,83,197,-39,98,222,65,57,240,37,2,224,92,4,181,62,167,42,225,205,14,6,116,-121,112,101,82,101,112,161,84,192,120,4,53,49,55,32,79,127,239,229,221,-2,128,87,160,128,96,83,241,108,15,8,109,107,84,121,67,111,110,65,112,-224,87,1,137,178,224,55,29,128,52,177,74,195,210,132,58,131,70,224,30,-26,78,93,66,15,1,48,48,65,251,242,90,0,226,47,0,130,46,1,56,-57,231,202,1,66,14,0,51,234,244,119,64,43,226,49,10,225,211,7,227,-176,2,227,198,2,225,233,21,5,99,111,109,112,97,114,179,2,70,36,0,-55,116,247,97,151,160,153,235,109,14,235,119,4,249,68,2,96,234,235,17,-0,128,5,245,99,0,167,241,64,22,201,167,64,49,100,110,243,5,3,241,-6,5,0,83,184,128,247,150,4,134,123,229,214,0,193,241,228,97,24,1,-60,62,234,217,1,160,140,96,48,0,53,68,24,224,78,41,225,64,4,64,-0,199,77,224,53,20,1,69,81,192,48,200,106,225,173,0,225,26,1,97,-17,227,112,6,224,84,19,1,76,84,233,155,4,224,79,8,75,15,160,76,-225,109,3,224,82,19,0,71,192,82,161,152,180,82,232,49,22,160,37,224,-29,5,232,170,2,227,111,0,229,159,8,231,100,5,145,76,1,75,52,96,-195,230,226,9,229,189,14,145,88,227,174,205,1,61,61,227,169,0,64,38,-104,86,99,182,106,73,230,170,2,0,67,227,190,3,171,220,235,77,0,227,-120,0,237,27,2,64,46,237,40,7,227,133,82,1,38,38,227,133,68,193,-23,64,0,227,128,28,2,84,114,117,227,179,0,226,205,22,226,198,15,232,-229,5,227,90,0,227,176,34,3,70,97,108,115,192,133,128,45,227,25,31,-179,229,65,134,94,108,226,183,0,97,254,78,34,2,95,49,53,64,116,111,-134,98,8,193,252,140,114,96,10,235,15,1,164,38,138,190,98,114,231,9,-5,244,195,1,105,142,92,28,1,50,57,192,152,74,241,4,49,50,32,95,-50,183,149,0,55,149,209,4,95,51,50,50,32,184,9,72,254,84,119,85,-224,64,4,128,0,0,58,129,86,1,10,65,96,193,163,125,234,202,22,64,-137,227,117,11,227,108,5,129,154,65,113,99,94,164,29,161,183,64,118,146,-199,64,52,1,56,53,65,6,128,54,253,172,8,11,87,97,114,110,105,110,-103,58,32,99,97,110,138,108,4,114,105,118,101,32,97,178,227,127,0,129,-15,184,169,224,66,8,4,32,121,101,116,44,128,49,99,45,225,91,0,225,-218,2,64,145,204,80,130,109,99,214,96,210,97,194,64,32,0,54,246,47,-0,10,73,79,46,112,101,114,102,111,114,109,73,203,167,65,182,65,130,97,-53,5,51,57,48,32,95,52,143,37,97,21,96,22,96,68,183,5,229,27,-51,115,99,129,174,229,20,0,224,31,3,132,216,3,64,95,54,56,65,21,-0,56,159,119,229,55,5,239,149,5,225,207,12,232,114,12,132,205,224,13,-2,211,149,164,168,224,2,2,229,124,7,224,130,1,224,2,6,168,154,128,-142,171,83,128,2,243,112,3,192,218,235,142,7,241,73,0,197,212,129,192,-189,0,128,189,66,178,164,214,249,175,4,172,42,65,64,160,234,199,247,96,-149,163,155,164,131,102,43,205,13,174,243,64,0,3,95,53,54,54,163,122,-239,254,1,129,59,160,168,128,165,224,5,0,230,100,26,1,116,111,215,188,-96,194,230,104,4,224,207,29,97,90,230,110,6,225,110,1,224,204,10,132,-242,196,141,224,216,12,229,110,14,96,57,128,205,238,91,59,128,251,12,58,-32,111,117,116,32,111,102,32,114,97,110,103,230,39,0,164,63,97,231,231,-2,2,170,223,194,34,225,86,16,6,101,110,117,109,70,114,111,225,88,1,-161,14,235,37,0,233,246,3,198,60,135,21,237,27,16,192,83,1,84,111,-160,164,224,255,3,96,127,241,203,6,192,195,227,5,13,224,215,3,131,67,-224,203,22,1,84,104,244,16,1,224,83,14,236,7,0,130,61,224,17,7,-247,88,0,196,14,195,100,236,31,20,96,22,193,55,164,87,224,110,0,194,-122,162,240,224,78,0,0,52,233,135,0,201,14,242,113,3,225,98,15,0,-62,200,90,129,90,98,51,231,53,0,224,17,7,192,151,160,183,102,193,163,-172,192,176,224,27,9,124,173,0,90,64,130,0,48,206,145,225,199,9,224,-144,1,1,120,49,225,235,15,224,35,2,0,50,232,86,3,193,53,64,7,-4,67,32,95,53,56,95,15,224,114,6,226,92,19,2,104,101,110,194,96,-224,106,9,64,9,228,47,1,232,183,21,92,9,166,196,225,59,0,64,31,-97,123,64,31,0,51,96,31,2,85,32,75,64,67,104,51,106,114,202,120,-64,34,140,20,129,72,235,222,57,198,192,226,76,0,230,158,32,226,189,3,-230,172,1,224,16,0,224,13,13,128,173,224,93,2,230,170,13,224,48,3,-128,2,198,166,128,51,198,165,230,162,2,193,10,130,215,128,92,230,147,0,-94,84,230,147,2,224,81,1,0,82,241,200,7,160,23,224,52,20,4,66,-32,82,32,64,130,69,226,95,3,96,5,226,31,9,2,109,97,120,126,60,-226,63,15,2,109,105,110,224,31,2,226,63,6,119,21,138,225,97,139,244,-80,3,128,243,64,20,106,234,129,1,0,95,100,52,234,111,9,230,91,4,-128,104,226,149,1,174,49,133,191,0,90,116,232,165,202,2,52,51,48,211,-69,224,152,7,233,233,8,0,67,234,35,9,167,0,1,53,55,115,149,96,-171,228,47,7,96,128,203,206,129,100,162,205,120,139,192,138,231,90,2,232,-162,0,226,154,3,66,151,131,113,194,89,2,95,51,54,96,175,201,128,194,-57,87,39,94,53,165,7,101,26,0,56,236,5,1,128,58,138,215,183,211,-96,18,1,55,50,64,108,0,52,128,40,3,67,39,32,89,128,146,0,80,-142,60,96,92,233,23,2,239,54,14,96,2,224,37,2,0,66,64,70,194,-188,229,182,4,154,230,224,50,3,128,47,128,121,224,206,0,192,52,128,46,-195,3,142,243,195,108,96,190,0,52,89,125,160,10,100,75,130,45,6,49,-52,54,50,32,95,55,98,35,97,239,1,55,48,231,128,4,153,44,2,49,-52,54,152,160,225,53,1,224,97,15,225,34,2,97,237,193,229,65,99,130,-180,64,9,202,86,132,252,224,36,0,171,174,161,210,0,58,132,106,3,10,-65,32,80,129,145,1,95,56,88,102,217,192,160,14,160,20,96,45,140,213,-0,83,96,151,109,138,1,54,57,194,189,99,72,193,47,69,235,1,50,48,-64,132,115,238,224,155,1,224,250,1,64,78,140,146,0,83,149,162,233,226,-1,3,95,49,54,56,85,85,2,49,54,49,98,71,96,43,0,54,165,184,-97,10,226,150,0,246,252,7,129,195,241,22,7,161,202,195,199,108,247,246,-189,3,161,132,0,56,89,80,192,111,140,200,138,199,227,5,3,2,53,53,-52,160,56,2,95,49,54,89,143,69,34,96,124,193,174,229,207,3,64,123,-128,21,224,181,11,0,53,89,229,128,182,165,91,193,245,129,96,3,64,95,-55,57,130,56,155,188,64,7,203,205,224,7,13,128,55,128,43,225,80,1,-199,146,0,64,132,230,225,30,4,98,218,104,32,194,34,192,0,163,170,228,-162,19,228,160,6,68,157,7,97,32,99,108,97,115,115,32,100,158,2,95,-56,48,130,215,80,12,92,16,132,172,224,79,0,82,12,177,75,97,90,96,-44,192,237,225,183,0,243,8,7,98,127,228,198,1,210,139,150,80,64,5,-64,4,78,213,192,3,226,23,1,111,71,69,13,1,95,49,192,154,196,239,-98,118,224,233,1,66,18,0,85,223,12,66,57,226,233,0,227,69,6,224,-92,0,229,14,5,64,162,161,123,1,49,56,106,24,79,66,0,49,97,2,-97,10,2,95,49,54,97,220,160,0,66,115,232,188,3,2,80,32,35,162,-253,97,5,2,32,64,64,64,139,64,37,0,51,163,9,98,91,5,32,67,-32,61,61,32,190,244,224,150,2,96,246,67,45,129,69,160,69,168,46,224,-9,0,64,154,192,131,64,90,136,250,128,128,96,211,227,104,16,228,168,0,-229,119,0,235,30,3,128,2,229,135,4,192,123,239,75,9,224,55,3,224,-27,0,134,56,128,104,224,143,1,129,8,224,46,16,192,28,233,46,5,224,-107,9,192,82,240,79,4,160,16,246,9,6,230,8,1,98,88,67,236,114,-182,230,243,2,104,53,0,50,97,22,224,101,1,237,115,3,138,90,224,132,-0,104,226,224,161,0,147,75,228,142,3,136,80,69,35,224,23,6,250,79,-1,224,121,0,128,70,239,136,1,224,187,5,98,148,227,57,1,99,86,128,-228,132,182,224,201,1,128,197,136,51,251,218,8,96,0,192,190,231,41,4,-243,44,8,162,20,226,112,3,65,2,232,39,4,192,70,160,32,224,29,5,-224,28,3,224,25,4,160,43,227,192,0,66,187,0,51,128,174,0,48,73,-138,194,166,1,53,53,224,187,3,224,15,6,224,43,4,131,65,228,21,4,-99,99,224,67,7,193,29,229,52,4,64,125,83,105,231,190,7,64,23,160,-11,65,71,64,10,238,241,0,71,186,64,68,102,54,160,85,1,51,54,96,-63,132,139,132,45,134,164,230,147,7,192,47,245,93,0,198,16,64,196,100,-166,224,103,20,135,82,224,97,10,245,163,0,232,132,4,162,161,180,127,232,-27,2,3,64,64,64,89,233,149,0,201,146,163,125,162,27,228,147,0,234,-46,1,224,171,1,137,92,225,229,2,233,140,1,227,135,2,168,215,0,67,-197,127,192,146,231,184,7,68,179,139,91,0,85,110,108,130,192,64,21,138,-240,162,69,69,110,96,87,0,83,69,130,104,143,107,196,0,51,84,254,224,-142,2,2,95,57,49,97,8,167,151,0,58,129,203,1,10,65,64,53,2,-51,32,75,168,125,224,1,5,180,158,64,0,224,28,9,128,1,228,117,0,-224,37,18,224,35,4,224,32,23,64,210,225,170,0,64,165,246,109,0,98,-30,97,111,193,144,64,59,65,69,249,195,2,3,95,51,54,56,202,147,128,-253,224,25,14,96,91,214,55,224,134,3,224,11,2,192,8,97,169,64,47,-0,54,169,212,0,73,128,131,164,113,69,204,2,67,32,60,70,169,64,40,-224,157,1,230,193,1,128,77,247,101,4,242,168,3,100,187,236,162,5,227,-186,4,98,218,180,70,241,201,2,98,198,2,49,56,51,113,123,241,224,6,-224,82,46,160,78,193,32,202,41,232,95,5,0,52,83,252,197,15,228,119,-4,128,64,0,51,104,9,140,244,2,50,55,57,96,5,193,122,136,32,227,-105,11,233,213,3,142,71,0,83,134,66,181,27,67,93,227,92,1,64,24,-224,57,1,64,1,67,136,224,243,0,229,159,1,99,109,227,107,5,224,222,-0,136,148,133,42,163,163,224,79,1,96,245,232,36,22,128,2,231,158,0,-232,54,6,110,132,226,243,4,232,16,1,232,41,13,224,83,1,224,89,1,-232,126,0,161,201,224,23,1,224,61,8,160,62,224,29,7,96,2,238,212,-9,128,0,129,103,241,188,11,224,16,0,224,192,2,224,42,0,162,59,128,-0,193,58,96,105,225,65,1,224,81,8,145,136,161,10,65,156,0,54,73,-150,226,127,3,229,232,2,143,105,160,40,134,69,64,55,64,24,130,181,225,-212,3,224,236,6,245,146,0,128,105,101,117,167,199,224,35,0,166,111,226,-61,13,192,7,201,70,162,138,160,57,247,149,12,64,100,2,53,51,50,240,-160,1,166,91,215,108,241,235,0,224,172,3,234,71,2,233,83,0,224,91,-33,209,9,160,87,96,69,163,23,0,64,228,239,6,167,17,131,124,128,0,-224,141,8,224,139,1,130,65,129,124,224,5,18,143,183,235,174,6,97,182,-1,95,49,102,127,212,140,226,113,4,96,101,225,88,2,226,126,6,227,46,-3,129,31,224,18,3,194,68,225,242,5,224,60,11,243,223,2,226,85,0,-128,2,241,197,0,228,38,0,160,250,162,197,160,151,64,38,0,55,96,230,-246,41,5,64,23,128,88,101,68,153,11,185,12,160,131,143,145,225,176,9,-232,145,14,225,236,9,248,58,4,64,112,96,44,249,198,19,192,104,96,12,-230,9,0,225,36,3,224,2,6,193,71,224,249,3,225,79,18,245,122,5,-225,94,85,0,51,138,24,225,94,63,228,31,20,96,148,135,29,225,116,7,-0,51,200,43,224,55,0,228,51,57,64,38,225,184,0,228,66,49,228,67,-8,224,12,3,128,157,165,167,128,119,224,116,3,232,43,5,192,53,193,11,-129,118,228,62,6,96,152,1,49,57,229,171,5,228,152,26,228,118,16,128,-66,205,246,224,47,0,65,116,96,162,98,51,107,207,73,164,246,241,2,6,-114,101,99,83,101,108,69,252,141,1,145,183,1,56,57,128,111,242,255,9,-1,56,48,130,76,71,239,0,51,232,206,2,224,37,1,3,95,56,52,56,-241,233,2,2,103,101,116,215,78,224,74,3,64,63,144,67,224,42,1,6,-115,101,116,70,105,101,108,87,126,64,30,139,174,224,30,1,13,68,97,116,-97,46,82,101,99,111,114,100,115,46,83,224,43,5,139,196,224,117,4,224,-30,2,67,238,224,74,17,2,72,97,115,224,43,3,203,33,128,215,250,23,-0,0,56,77,34,64,31,234,229,1,192,29,160,7,64,28,0,54,172,98,-225,204,18,227,85,10,64,57,138,27,66,84,237,144,0,64,22,209,232,107,-37,175,146,235,14,7,97,145,97,132,235,15,11,98,138,243,231,2,227,95,-1,247,37,4,96,175,233,159,19,224,38,1,224,106,5,160,28,195,248,164,-179,214,72,248,72,6,128,5,137,201,233,87,3,117,252,224,101,3,100,12,-224,13,0,231,17,4,164,191,64,130,239,121,6,224,56,11,224,90,1,224,-112,3,224,248,4,138,16,228,2,2,97,101,193,60,228,10,15,233,20,4,-165,68,233,128,8,254,198,3,239,108,6,160,57,207,111,234,141,1,246,124,-22,229,149,15,224,191,3,202,25,160,241,229,54,0,165,67,161,253,233,197,-0,97,92,224,56,0,194,187,0,50,68,43,64,143,164,242,244,147,4,96,-184,84,149,65,113,181,154,245,151,0,196,130,2,95,49,49,122,110,64,15,-0,54,100,121,97,22,0,67,133,73,100,139,228,111,3,164,92,246,37,3,-5,77,101,116,104,111,100,228,159,2,64,89,224,180,1,1,95,54,77,15,-165,86,240,109,32,130,181,64,228,131,22,162,130,236,219,9,96,173,67,250,-97,127,130,134,1,95,55,217,179,224,125,46,0,49,240,236,7,224,126,16,-96,0,224,87,3,0,83,192,87,199,16,224,92,8,172,68,130,90,231,80,-12,96,195,250,12,1,96,0,244,47,5,100,119,133,219,98,130,153,97,0,-56,95,144,64,25,133,181,108,176,2,95,49,52,78,193,225,176,1,2,100,-102,108,101,237,64,39,133,190,228,84,18,96,205,245,142,1,227,89,1,239,-254,3,244,133,0,224,28,6,225,145,2,235,42,1,139,41,192,110,215,207,-111,187,206,218,163,14,163,121,117,139,244,197,11,225,157,1,232,142,7,224,-23,5,193,187,0,56,71,205,245,15,13,224,74,66,65,86,242,174,2,225,-88,8,0,54,130,168,161,254,64,74,104,40,146,172,64,61,64,90,129,148,-146,234,73,157,146,229,0,49,116,162,146,229,64,40,135,5,242,205,8,64,-168,192,95,224,1,9,242,121,3,224,37,15,224,35,4,224,32,23,224,29,-20,224,26,17,224,23,14,224,20,11,224,17,8,243,49,4,96,0,65,14,-231,244,3,0,52,98,53,170,15,225,131,0,64,57,2,55,57,48,227,152,-0,247,95,5,106,236,247,96,2,64,43,99,171,160,43,224,70,2,99,158,-242,3,2,65,156,65,214,96,124,227,75,9,0,56,196,78,130,217,96,7,-252,90,8,97,225,0,52,224,17,0,98,120,197,230,247,39,3,0,52,96,-105,193,23,224,196,6,64,108,216,159,224,162,5,232,158,1,199,41,228,239,-3,104,158,241,45,6,163,149,131,192,171,113,232,63,2,128,123,225,20,18,-224,193,17,199,236,192,196,128,1,241,172,8,160,223,97,244,131,121,128,189,-123,238,67,5,229,136,6,224,105,6,65,79,0,53,128,245,192,242,228,134,-1,97,145,71,21,71,16,241,214,5,254,33,5,223,167,88,69,192,37,66,-109,0,54,162,109,0,89,220,167,230,82,5,159,241,229,45,7,128,104,224,-33,18,238,69,5,224,177,4,192,25,255,152,2,136,173,224,184,1,224,49,-5,230,196,0,97,198,64,43,202,10,224,44,11,224,43,1,234,190,1,203,-60,133,165,160,248,245,32,1,69,25,231,64,5,175,52,233,78,1,65,240,-128,13,130,27,96,35,160,55,194,132,65,208,64,39,162,93,70,29,225,218,-2,224,96,34,69,8,192,103,234,74,2,224,57,41,226,231,1,128,140,2,-64,95,57,173,220,97,1,253,216,1,85,160,128,160,192,100,66,172,199,252,-0,80,141,207,5,49,32,64,95,55,54,96,89,224,245,23,0,95,166,13,-224,67,1,224,251,9,224,8,10,160,205,224,244,0,142,219,99,46,160,5,-224,68,8,224,50,19,224,44,18,225,25,1,225,31,4,98,82,166,170,232,-181,1,65,43,168,163,142,220,195,39,195,203,193,60,163,13,128,113,227,16,-5,225,14,9,227,89,13,128,134,161,242,224,33,12,196,212,226,250,9,228,-238,2,96,223,64,34,145,173,228,180,0,67,11,0,55,75,0,1,95,49,-167,237,132,41,248,9,5,128,216,229,22,6,193,51,155,170,105,167,1,55,-57,105,92,227,96,0,240,12,0,244,87,6,98,18,1,53,48,73,196,0,-54,64,50,233,196,1,2,98,105,110,79,11,228,195,0,237,234,6,1,64,-64,107,2,7,95,49,53,50,49,32,95,53,74,41,224,59,1,2,78,117,-109,171,167,228,79,7,64,251,253,166,6,229,81,6,179,0,64,161,69,18,-0,52,64,19,141,43,224,213,0,233,222,3,128,0,226,96,2,225,189,0,-129,98,193,155,210,252,228,27,0,131,163,162,137,130,134,69,244,192,39,226,-134,5,225,169,4,0,85,97,169,235,42,0,228,4,8,129,182,230,104,4,-224,159,3,224,29,8,225,27,33,134,147,96,8,96,32,225,7,5,231,29,-12,97,235,195,13,98,114,224,96,17,101,17,110,16,226,114,3,224,18,13,-232,94,9,66,66,0,53,226,66,4,5,102,117,110,100,101,112,98,9,93,-108,226,65,8,224,176,9,136,64,227,138,0,163,202,230,222,7,192,216,231,-248,10,1,56,48,96,95,233,79,9,226,79,4,1,48,54,128,45,135,151,-231,121,3,227,188,1,227,36,2,177,251,225,107,5,224,130,16,111,253,224,-130,50,225,29,1,228,71,8,215,32,160,123,226,54,3,224,129,1,97,5,-103,202,224,112,18,128,0,193,104,133,54,228,209,9,230,229,0,229,20,15,-234,117,3,224,169,4,232,24,4,225,37,18,224,162,22,224,89,10,229,74,-2,195,85,163,183,227,92,0,229,84,5,0,51,133,84,0,56,157,95,96,-9,230,64,1,167,251,228,50,12,160,104,228,49,4,228,46,12,228,45,4,-228,42,8,224,205,1,225,177,3,227,138,7,224,189,11,64,96,181,202,1,-56,48,235,115,13,72,88,167,31,224,171,119,0,54,140,131,227,212,7,224,-187,0,224,188,22,227,98,7,3,95,51,52,54,114,166,71,227,144,109,106,-253,130,76,167,8,227,100,9,128,156,224,132,7,192,21,241,11,8,96,42,-224,62,0,80,201,163,134,128,26,130,30,237,69,8,66,175,182,230,166,155,-66,197,0,55,89,75,230,26,3,192,96,162,255,224,69,1,229,214,6,115,-65,236,8,0,224,58,4,160,178,224,16,3,143,124,232,9,1,230,124,0,-197,149,64,16,192,231,206,134,133,252,166,2,238,146,3,129,200,0,52,174,-22,65,222,2,67,32,95,83,180,99,139,0,35,98,51,96,243,2,52,51,-48,208,136,147,173,2,49,50,55,65,240,229,238,1,11,66,97,100,32,100,-101,114,105,118,105,110,103,231,254,1,224,168,0,231,31,4,192,163,226,104,-4,234,78,6,224,171,8,225,197,4,162,198,213,38,97,97,245,25,15,0,-67,82,168,227,244,1,195,1,96,250,239,159,6,143,60,202,73,160,5,64,-4,70,152,192,3,242,95,9,128,127,226,191,3,0,67,255,74,0,128,238,-238,199,5,64,44,226,69,8,226,59,0,95,154,64,174,233,119,4,205,34,-64,58,3,55,52,32,95,97,125,117,141,224,6,0,224,223,3,224,112,3,-0,83,161,111,224,212,20,226,148,5,65,69,1,56,48,66,208,186,103,133,-55,246,133,1,231,14,6,224,253,8,67,220,98,61,171,166,148,8,1,80,-32,64,11,146,189,0,90,160,1,130,225,0,58,128,110,108,246,133,219,169,-161,96,2,64,79,2,52,51,52,140,238,1,50,55,96,13,135,56,0,52,-83,11,96,0,236,152,11,91,97,100,150,233,165,27,228,243,3,224,29,8,-224,20,0,228,243,5,98,85,233,144,1,240,96,5,151,104,129,28,225,90,-1,0,52,82,31,129,111,233,174,11,231,44,8,233,150,0,2,53,52,56,-96,209,0,48,64,255,231,199,2,224,96,8,152,74,224,96,14,131,63,163,-133,232,63,11,160,129,0,54,138,16,130,197,224,126,19,96,0,65,190,251,-51,3,1,80,32,231,64,2,67,234,165,202,70,208,3,10,65,32,83,108,-57,128,79,64,86,64,25,0,54,224,62,0,1,80,32,135,230,0,80,128,-24,240,15,1,96,26,201,5,224,87,5,239,50,1,64,122,96,156,160,62,-142,32,225,13,7,237,44,8,64,42,134,103,128,105,128,72,162,92,128,16,-229,86,0,192,120,96,52,214,226,241,156,0,138,188,239,177,1,244,30,5,-0,54,153,29,192,100,130,253,128,11,101,218,236,155,7,226,194,0,197,19,-192,86,230,153,6,199,25,129,176,224,94,5,230,41,7,192,29,231,60,8,-229,173,9,79,158,236,66,0,2,95,49,52,102,228,254,30,3,64,19,100,-181,0,67,83,95,165,128,103,11,0,85,154,16,64,0,235,255,12,97,61,-132,11,68,241,2,57,32,58,128,55,225,199,2,98,67,97,199,110,23,96,-41,69,220,1,95,56,254,94,4,19,80,114,105,109,105,116,105,118,101,115,-46,67,111,110,115,116,114,97,105,110,158,112,64,56,245,182,1,64,82,226,-89,1,111,110,161,186,237,37,2,164,43,235,17,45,238,104,0,193,69,239,-106,1,192,25,3,85,32,64,90,129,236,167,202,234,230,22,160,37,138,167,-194,4,234,164,3,163,216,224,80,0,224,15,7,230,175,10,224,34,1,237,-201,9,64,211,2,95,51,52,68,17,105,14,225,185,5,3,67,32,95,55,-104,175,99,56,198,193,64,0,65,80,227,170,3,233,87,3,254,71,6,171,-118,98,101,64,70,0,51,132,134,99,163,144,167,99,99,152,254,192,91,227,-225,1,224,93,22,226,222,0,247,42,19,236,254,4,232,127,10,227,180,5,-237,158,0,224,90,1,64,172,183,10,226,18,1,131,157,227,57,2,229,100,-2,65,181,96,237,65,61,130,109,93,104,183,111,158,42,230,130,6,255,34,-0,132,17,64,60,65,108,225,28,6,224,75,14,161,54,132,254,0,75,96,-177,218,105,192,102,212,117,186,27,96,47,133,3,224,47,7,1,66,32,224,-43,11,132,250,132,120,233,173,6,65,30,1,52,51,84,153,137,149,136,69,-233,12,12,231,7,39,0,55,156,139,134,136,0,52,177,178,128,72,226,169,-1,2,95,49,55,123,66,253,147,34,138,33,224,247,1,160,171,253,146,7,-64,248,132,181,194,64,71,43,232,161,25,96,207,66,130,154,58,64,161,98,-62,0,58,128,208,224,79,1,232,238,21,135,86,64,60,0,55,100,196,64,-67,101,23,2,55,56,54,69,65,64,22,181,16,132,163,224,9,1,161,166,-213,26,161,7,230,79,2,160,39,226,230,1,228,219,11,226,236,2,224,47,-22,195,105,224,47,0,165,53,224,47,15,219,113,160,89,224,47,23,184,176,-225,207,1,224,47,23,204,2,128,27,229,115,9,224,31,5,174,44,129,62,-103,250,66,115,232,16,2,224,64,9,160,144,192,61,231,202,16,227,230,5,-234,147,1,231,140,4,161,226,224,27,0,206,31,249,147,2,224,136,15,193,-73,192,136,197,233,100,54,77,201,237,182,6,15,116,121,112,101,32,97,112,-112,108,105,99,97,116,105,111,110,237,190,1,225,183,0,232,55,2,247,73,-15,93,31,224,51,1,193,52,128,40,230,181,5,229,76,4,173,206,160,194,-128,56,184,125,104,114,129,5,132,96,1,49,53,64,218,0,67,68,236,100,-228,5,67,32,95,53,54,51,64,47,246,232,0,118,139,96,0,105,226,65,-147,224,236,1,1,36,120,192,218,225,26,1,194,249,237,161,9,235,82,2,-146,61,228,171,7,2,95,49,53,68,226,192,79,128,248,230,57,6,0,51,-79,90,1,53,51,128,242,225,26,1,108,26,226,10,5,224,237,2,137,73,-1,49,53,129,232,226,9,0,225,53,2,225,243,9,195,109,225,85,2,237,-69,4,224,155,7,128,227,254,199,0,225,1,6,243,153,18,244,173,3,227,-122,3,144,132,128,126,171,44,224,13,0,128,30,64,57,226,154,2,224,1,-1,200,168,234,169,3,160,85,255,163,9,182,211,224,49,12,224,131,5,69,-248,96,36,225,116,0,232,238,9,96,46,160,28,129,108,131,228,84,163,97,-125,0,75,104,223,128,5,225,231,0,133,247,224,70,1,145,35,0,53,70,-239,241,29,3,0,79,74,195,0,53,231,145,1,225,237,5,225,243,5,197,-168,64,73,176,174,195,55,71,219,96,97,117,54,226,254,1,231,250,2,65,-20,2,95,49,48,194,150,0,49,102,52,96,86,96,41,233,88,0,192,0,-227,216,0,227,205,16,160,240,227,205,11,224,40,5,161,70,228,39,1,129,-162,160,7,224,42,4,222,98,229,31,0,160,128,128,49,228,99,0,199,157,-165,130,128,1,160,31,225,39,2,225,181,2,225,243,3,226,29,2,224,42,-4,224,123,0,224,36,5,225,147,2,224,181,1,160,29,225,155,0,226,4,-3,194,10,192,56,160,36,67,77,1,50,51,65,251,1,48,48,128,5,67,-249,129,131,64,43,0,79,77,155,236,190,2,2,79,32,35,75,47,162,26,-233,179,0,160,161,227,191,6,226,54,6,227,170,7,129,100,162,178,64,136,-0,54,70,43,226,138,4,145,229,64,0,131,84,194,244,244,26,3,64,26,-160,33,235,25,32,0,50,227,208,8,142,115,224,68,20,224,74,21,224,75,-2,224,77,0,226,94,5,244,36,4,227,243,5,227,222,9,78,161,130,251,-224,67,11,194,71,228,57,7,228,35,8,129,48,128,170,192,80,226,60,5,-224,70,0,160,67,97,76,224,79,0,244,202,5,64,67,234,23,1,234,187,-5,64,29,1,50,52,192,121,64,0,195,16,224,182,4,232,45,6,0,54,-81,72,232,91,32,160,45,224,124,26,64,32,236,56,4,225,182,6,1,54,-55,160,8,230,164,0,228,9,27,242,29,1,224,91,21,168,242,224,91,0,-128,176,230,221,10,0,80,66,255,0,50,255,166,1,224,132,1,160,51,196,-235,225,145,0,130,89,225,90,2,96,170,164,84,229,24,2,71,10,67,40,-163,247,192,140,136,128,233,84,13,19,98,97,100,32,102,105,110,97,108,32,-100,111,32,115,116,97,116,101,109,101,176,145,226,100,4,166,247,224,16,8,-231,86,3,192,138,229,179,3,228,205,9,163,185,224,74,2,230,165,10,65,-80,230,5,0,229,27,4,224,2,0,224,29,3,241,10,0,169,142,97,5,-224,8,40,230,226,3,160,90,224,158,1,160,32,128,47,226,172,0,192,66,-96,68,169,217,193,140,224,16,2,128,34,240,51,5,74,158,112,189,160,15,-239,38,1,160,0,128,52,160,129,234,80,8,224,33,5,109,126,0,51,228,-2,1,193,38,227,85,2,0,50,109,152,226,53,1,71,139,128,168,136,123,-128,161,1,54,51,105,213,1,49,54,144,163,231,188,0,0,80,106,241,0,-79,64,182,70,27,0,53,118,56,224,48,0,97,213,129,195,128,242,224,236,-0,138,218,0,49,255,109,4,2,97,105,108,162,96,64,160,2,95,49,51,-74,179,2,95,49,50,83,82,249,167,3,3,98,105,110,100,160,40,64,135,-230,162,0,102,73,224,86,8,2,62,62,61,128,44,235,77,11,0,98,194,-209,193,21,226,77,0,226,2,5,226,11,13,229,189,1,160,34,225,236,69,-225,109,0,224,213,12,225,42,0,230,159,9,237,120,4,130,2,144,249,192,-80,224,0,2,228,234,5,196,98,128,171,233,37,4,171,157,227,216,1,224,-39,14,229,66,4,195,231,224,39,10,160,230,224,79,0,237,107,15,231,157,-4,233,79,2,197,65,160,2,224,101,14,162,250,224,141,24,174,248,224,39,-11,224,141,4,161,5,224,130,2,225,128,11,226,40,9,96,17,177,24,114,-74,225,202,1,9,70,114,111,109,84,104,101,110,84,111,226,253,2,0,66,-203,51,0,66,64,7,227,222,5,224,125,23,235,143,2,96,16,224,115,18,-163,25,224,101,83,160,213,224,99,13,225,151,24,174,156,225,151,24,236,220,-2,224,179,12,192,173,64,18,224,169,14,96,167,224,159,4,224,77,2,196,-199,228,31,0,233,93,5,229,61,0,0,89,224,44,3,192,127,64,53,147,-252,224,147,1,234,58,12,96,23,232,202,3,136,21,241,46,1,230,206,0,-231,86,7,224,21,1,96,18,128,185,231,86,13,224,124,5,183,35,160,0,-226,204,17,96,77,96,97,224,249,7,160,25,105,146,74,16,111,148,84,114,-79,254,207,211,225,179,1,96,95,65,130,0,55,205,119,224,66,1,101,101,-229,71,0,68,179,128,40,211,39,226,108,0,172,81,236,69,17,0,48,64,-177,236,69,20,98,9,128,115,128,107,64,104,160,174,224,101,4,96,25,176,-254,224,52,11,149,12,139,17,229,117,0,228,170,4,201,169,194,37,232,38,-14,235,95,5,128,44,234,1,1,128,135,125,166,225,97,11,97,213,226,58,-5,102,108,92,61,149,133,79,121,224,0,1,224,151,2,130,53,194,219,173,-72,95,163,189,230,128,1,226,50,12,195,14,232,79,1,247,69,6,224,200,-40,227,73,0,226,102,4,199,73,242,186,2,240,223,0,224,247,5,224,244,-0,142,191,160,237,224,85,77,128,67,129,69,229,236,1,225,89,5,231,92,-0,162,156,116,125,65,92,186,249,227,200,1,168,16,96,146,87,50,81,139,-2,64,95,56,224,5,1,224,198,18,130,237,1,55,52,243,217,3,177,253,-224,200,5,64,191,231,201,1,172,125,227,213,7,96,75,120,156,192,52,206,-217,194,12,226,207,5,162,0,224,29,0,226,204,9,226,4,8,226,252,0,-226,13,2,162,178,0,53,105,31,64,82,74,2,65,115,160,253,224,202,17,-160,206,164,254,160,130,230,28,1,249,23,5,229,157,4,195,218,227,154,8,-238,110,7,129,221,128,161,227,101,2,233,91,0,224,96,2,196,207,229,232,-18,224,43,5,164,105,236,231,4,0,55,99,184,224,76,1,225,245,8,160,-18,226,189,5,101,46,174,251,224,171,12,193,143,225,50,2,160,2,224,51,-0,64,1,231,131,4,196,55,230,118,0,64,2,224,46,17,192,98,230,165,-1,230,149,8,224,46,3,195,77,192,28,130,90,128,11,110,76,192,24,253,-12,13,227,140,0,224,154,1,224,160,2,226,162,3,160,2,167,51,224,158,-4,199,159,224,47,6,96,18,224,39,4,224,245,7,133,47,224,79,2,224,-2,7,192,157,224,196,1,160,57,225,47,9,224,67,6,224,153,0,224,67,-27,227,7,2,224,35,3,96,199,247,99,3,224,39,14,129,115,64,19,240,-146,5,226,195,12,192,44,128,128,236,57,2,225,120,4,224,132,2,224,193,-0,224,114,11,224,239,2,228,67,4,226,52,0,224,53,2,224,242,4,201,-18,225,142,5,248,80,4,225,56,9,160,117,224,16,1,245,147,0,224,70,-3,228,30,1,224,75,0,220,57,225,55,15,224,79,77,225,81,1,104,220,-130,109,1,95,49,67,197,103,210,3,55,32,95,55,134,32,2,49,55,51,-100,87,224,22,8,233,129,1,64,13,102,83,224,0,1,224,121,8,224,120,-3,128,173,224,78,6,111,223,96,0,195,38,64,239,160,89,64,6,226,205,-1,230,95,17,133,219,101,9,103,88,240,16,15,8,114,111,109,83,116,114,-105,110,103,251,206,0,224,174,5,224,97,5,239,135,2,229,187,6,1,52,-57,229,17,1,224,238,12,146,180,225,111,0,194,122,229,200,2,217,84,64,-166,207,224,224,0,1,224,88,1,227,113,8,225,15,1,224,125,10,224,192,-2,227,106,19,227,105,12,224,209,4,227,99,0,224,100,10,128,1,227,29,-8,226,129,0,224,50,16,226,4,14,1,56,52,92,86,0,55,149,126,96,-0,226,10,10,104,66,155,123,1,55,53,92,9,0,55,171,125,128,0,226,-27,60,0,82,125,234,0,97,210,52,226,29,144,224,89,2,226,32,10,227,-145,2,224,39,3,229,146,114,224,17,1,226,52,17,224,56,12,230,187,6,-224,121,1,224,45,4,0,83,228,85,9,245,211,1,66,75,224,67,46,226,-143,1,230,83,15,225,10,11,224,73,11,217,197,224,56,6,229,14,10,0,-56,225,16,0,229,92,1,227,13,21,0,53,75,86,1,55,54,192,172,136,-144,226,89,0,133,178,0,54,128,49,1,50,56,104,233,64,49,163,60,64,-127,2,52,48,56,99,85,211,201,224,110,14,224,60,9,128,0,227,121,60,-6,73,110,116,101,103,101,114,227,120,152,193,148,6,80,32,75,32,95,51,-54,112,5,70,193,1,95,51,158,28,64,231,68,204,2,50,53,48,64,75,-0,57,64,20,2,95,49,52,80,52,128,199,224,118,2,128,146,0,83,167,-223,226,98,0,160,2,224,184,5,232,170,6,241,4,6,228,4,10,224,33,-8,129,9,225,6,2,226,189,0,226,49,0,170,126,193,3,183,47,226,35,-3,0,52,141,86,224,122,21,233,37,8,224,122,62,234,214,2,250,214,0,-81,122,250,227,1,192,100,96,112,192,109,67,84,160,30,192,27,233,65,1,-226,68,10,1,54,55,129,180,207,125,161,153,131,15,160,242,192,95,96,66,-234,65,8,224,132,10,192,7,225,254,1,64,96,120,141,248,107,1,224,55,-2,228,177,1,224,106,1,0,83,64,166,0,48,77,126,0,55,204,164,228,-213,1,224,38,5,0,48,130,141,227,56,3,224,232,6,3,95,49,54,53,-238,55,0,224,172,2,160,211,224,42,2,2,83,32,73,184,197,129,51,193,-230,0,50,98,98,242,33,6,0,85,65,205,64,67,0,95,143,236,67,74,-2,95,55,50,68,156,2,95,49,52,178,243,160,236,227,10,2,195,117,64,-0,128,19,64,45,252,63,4,29,95,32,99,97,110,110,111,116,32,98,101,-32,117,115,101,100,32,97,115,32,97,32,118,97,114,105,97,98,108,101,164,-56,224,189,9,110,209,0,52,106,75,115,180,0,56,126,166,225,66,1,128,-132,242,99,8,194,212,96,209,0,90,64,24,130,98,64,75,64,247,240,56,-8,153,130,224,220,1,1,95,51,79,52,187,13,224,197,1,6,116,99,69,-120,112,114,58,192,203,7,104,97,110,100,108,101,58,32,96,190,64,132,123,-59,96,92,100,69,0,54,96,93,244,109,4,160,82,4,79,32,35,51,50,-182,88,224,45,0,224,131,0,224,50,4,8,58,49,55,56,54,32,64,10,-65,97,220,86,79,226,93,12,130,200,228,140,6,230,237,2,224,49,2,226,-42,1,228,151,6,228,29,0,226,152,0,228,205,27,226,21,0,225,117,1,-192,33,240,68,19,241,37,3,228,134,10,224,31,6,226,225,0,226,115,1,-0,55,70,209,224,34,0,224,64,8,160,150,192,60,231,232,4,224,109,9,-224,108,9,99,8,163,122,228,102,15,192,85,128,56,196,151,163,208,160,104,-228,95,7,224,144,0,118,58,182,251,118,219,224,130,3,224,134,0,230,118,-2,232,254,4,224,38,1,228,88,10,224,52,1,228,245,2,192,58,224,55,-3,196,105,228,106,2,228,109,19,224,59,0,230,19,3,160,92,228,115,89,-225,81,2,226,219,3,175,98,96,210,225,215,7,164,149,224,180,2,192,38,-233,190,10,2,56,52,56,227,235,2,8,68,97,116,97,46,70,117,110,99,-76,84,1,46,36,232,219,0,0,82,192,8,160,141,226,141,8,64,25,67,-206,0,52,137,199,64,104,89,180,163,224,248,119,1,224,38,31,225,157,1,-227,94,1,225,157,5,244,67,2,227,41,21,68,75,0,53,100,75,100,133,-69,14,0,50,101,172,65,117,64,28,0,52,228,104,0,132,106,230,130,6,-150,150,226,214,0,228,94,7,227,81,4,243,199,19,224,207,4,162,230,192,-39,96,95,169,85,225,243,4,162,202,250,135,7,186,207,224,40,25,96,31,-64,27,193,110,224,197,0,96,13,1,83,32,154,9,169,246,0,85,96,44,-233,21,1,65,97,170,38,1,85,32,160,35,224,0,1,196,44,224,2,0,-225,170,1,245,167,13,196,32,140,110,0,52,70,127,134,134,2,95,49,49,-204,253,227,248,0,224,63,6,108,61,88,117,71,119,72,126,2,95,49,53,-153,128,251,188,7,224,148,2,105,159,193,101,160,86,2,49,52,55,65,165,-128,13,94,94,0,80,252,235,0,183,136,0,53,242,32,6,231,113,2,98,-91,226,30,5,96,99,225,109,1,226,164,5,1,55,56,161,50,225,230,1,-225,249,4,228,159,0,161,32,192,2,98,134,226,30,5,64,1,160,22,229,-31,8,130,56,224,39,1,224,20,2,226,99,7,65,252,128,0,224,114,6,-224,138,0,199,74,197,69,231,82,4,251,172,1,128,36,225,165,4,97,65,-224,73,1,224,87,0,97,172,139,35,1,52,53,202,58,229,124,4,226,60,-3,226,188,4,237,155,7,109,148,247,236,2,3,66,32,95,57,92,176,2,-95,49,54,145,139,254,39,2,227,167,8,227,31,13,224,98,3,224,94,7,-64,176,233,37,2,96,206,226,226,1,192,2,161,105,225,104,2,254,111,6,-225,170,0,233,177,5,205,73,225,201,7,160,52,230,65,5,192,22,230,73,-4,129,112,3,95,49,54,48,67,170,128,71,226,211,7,170,13,224,53,3,-128,0,225,172,4,128,113,225,169,0,96,0,163,75,1,95,53,110,52,174,-90,0,67,169,241,128,0,2,95,54,49,143,91,236,72,5,64,1,196,239,-192,75,225,46,5,225,26,5,225,70,3,225,72,4,225,7,4,252,115,2,-225,137,2,228,230,4,96,50,226,164,1,239,108,14,224,97,0,131,140,160,-231,255,120,9,185,15,225,69,0,160,28,227,226,4,0,52,230,178,2,237,-25,1,255,110,6,70,102,0,51,102,102,2,75,32,89,96,121,67,202,128,-131,104,56,226,92,11,226,11,12,161,3,199,207,136,209,0,52,123,126,96,-240,232,103,5,71,92,227,16,0,192,240,131,71,233,130,6,224,225,29,160,-224,64,206,0,50,167,53,161,60,251,185,14,224,31,3,240,101,1,66,101,-0,49,220,144,102,136,87,187,101,220,76,33,161,48,0,49,135,180,2,49,-51,57,149,107,0,57,135,174,0,48,224,22,6,0,56,96,22,82,175,224,-22,3,82,25,64,22,0,56,96,22,232,225,1,15,80,114,105,109,105,116,-105,118,101,115,46,87,111,114,100,34,128,37,0,55,224,60,5,168,25,70,-147,64,22,93,153,0,95,146,175,3,95,50,49,52,65,175,64,14,0,57,-96,103,97,144,224,22,0,1,54,57,114,218,224,21,6,245,254,0,96,22,-64,89,168,144,192,89,0,55,96,36,0,55,101,34,1,55,55,106,214,134,-165,243,154,2,6,57,50,54,32,95,53,51,98,96,64,31,65,40,224,31,-19,65,128,224,31,16,67,182,8,54,57,54,32,80,32,95,53,57,69,63,-0,53,165,62,160,56,109,217,224,227,4,115,23,147,183,135,126,0,49,80,-228,224,22,11,139,53,224,61,4,96,111,128,34,2,38,49,46,66,1,1,-38,48,96,6,224,39,6,128,28,224,27,14,96,21,192,27,65,68,137,184,-64,114,5,32,95,51,50,50,32,100,131,128,9,64,35,64,34,131,116,224,-34,2,98,125,224,34,4,130,200,67,70,64,108,67,134,96,209,2,64,95,-55,102,178,224,88,0,96,44,130,147,2,102,47,32,64,12,130,137,4,85,-32,75,32,75,65,140,0,58,128,64,64,111,2,52,49,32,225,252,0,0,-56,67,23,129,29,226,17,3,0,52,224,21,10,0,52,224,42,11,225,58,-1,226,103,4,68,94,224,21,7,1,50,51,224,43,11,225,159,3,96,164,-131,19,96,164,1,49,55,70,223,64,6,130,130,73,73,64,6,3,57,32,-64,83,130,59,105,158,0,55,75,177,193,123,114,192,224,149,3,68,157,108,-88,0,54,130,205,224,43,2,225,248,9,192,25,160,14,64,28,0,54,99,-109,64,35,97,78,199,231,96,140,1,80,32,128,40,128,162,162,3,160,73,-0,64,69,74,0,80,160,20,196,106,192,211,96,8,0,54,66,218,112,145,-130,169,64,82,128,22,64,21,1,95,50,244,27,2,96,130,0,54,96,130,-3,105,116,111,102,65,224,64,61,97,40,99,61,0,57,66,18,103,191,128,-225,64,7,128,152,0,54,155,246,1,54,50,128,6,86,115,160,103,96,39,-0,53,98,194,96,11,64,84,130,181,2,102,62,61,96,98,0,51,160,13,-96,12,130,138,1,102,60,128,26,162,107,0,60,96,12,130,107,3,102,110,-101,103,64,14,65,159,64,14,0,42,96,12,164,227,0,45,96,12,129,69,-1,102,43,96,12,128,207,0,85,66,159,0,65,128,126,82,10,101,183,1,-80,32,112,0,0,85,97,123,87,150,192,21,69,151,160,21,128,156,229,106,-1,133,83,77,62,96,44,240,239,1,134,199,102,176,241,64,1,241,10,20,-203,177,166,223,166,239,240,200,7,160,30,244,151,8,230,109,3,235,255,1,-184,54,224,87,19,98,175,224,87,51,130,103,192,220,192,25,203,201,205,197,-225,25,6,224,248,3,135,192,240,214,1,224,32,8,135,108,224,32,18,231,-56,0,224,220,7,192,24,135,201,249,38,2,245,175,0,160,27,101,220,0,-52,71,252,2,95,49,53,73,214,224,44,4,233,102,0,224,73,11,192,28,-224,159,18,136,110,224,32,18,131,116,224,192,10,192,24,224,118,9,226,15,-1,224,27,9,218,169,224,27,10,104,108,128,0,245,15,0,66,193,163,90,-232,21,11,2,73,110,116,136,20,64,59,224,36,4,0,68,81,28,185,245,-4,95,84,121,112,101,192,12,128,47,64,135,224,84,15,5,70,108,111,97,-116,87,160,39,232,146,7,96,87,3,66,121,116,101,159,231,96,85,3,114,-110,97,108,224,19,2,160,57,131,219,137,163,65,89,139,98,139,178,1,95,-56,185,185,152,134,64,46,0,54,227,190,6,0,52,128,69,132,1,224,167,-12,2,67,104,97,192,205,241,21,1,67,37,225,172,1,3,95,49,55,49,-104,90,234,174,2,238,244,6,70,133,128,141,128,29,234,147,3,139,82,64,-96,132,92,202,30,140,197,98,193,1,95,53,69,120,64,34,132,104,154,184,-112,133,139,59,138,196,66,80,226,127,18,131,254,240,205,3,103,249,179,251,-224,70,1,96,217,235,12,5,96,26,128,57,3,95,49,50,50,68,11,160,-55,179,68,163,235,137,87,112,45,0,95,74,173,192,38,241,41,2,235,48,-1,75,133,224,204,5,241,109,7,224,64,1,0,85,132,70,224,192,6,136,-186,219,180,224,162,0,243,208,6,2,49,55,51,241,182,2,224,139,3,128,-134,235,62,5,0,53,65,134,0,58,128,51,197,211,96,121,65,230,1,54,-32,167,97,78,75,228,218,5,97,250,160,128,96,156,245,42,1,130,46,64,-1,112,174,226,39,2,109,169,98,0,173,174,130,29,97,119,0,67,128,24,-224,0,1,231,206,0,236,86,3,239,155,2,64,160,132,214,132,105,128,151,-239,96,3,77,23,228,139,0,96,109,128,41,238,20,4,160,130,239,243,2,-210,108,1,49,56,193,7,0,57,225,7,34,133,189,225,7,3,209,206,225,-8,47,238,159,0,109,42,2,95,49,54,159,111,224,200,5,225,26,7,207,-161,64,10,201,247,86,86,97,227,0,95,99,89,64,26,137,121,64,33,96,-24,118,150,70,182,230,179,11,226,141,6,137,2,134,89,162,141,0,90,129,-149,162,111,224,45,4,161,143,64,45,1,85,32,69,163,0,79,240,161,0,-96,129,0,54,96,129,74,112,0,66,119,69,224,131,14,230,49,8,96,21,-84,155,1,55,50,97,12,0,57,166,159,224,40,8,97,217,0,85,226,222,-1,225,58,3,0,54,73,161,228,176,2,129,185,0,90,131,128,226,49,7,-206,171,128,48,238,176,0,228,232,8,2,95,49,48,162,98,128,0,224,28,-3,64,241,133,133,229,203,1,64,85,136,117,137,101,79,14,250,255,2,131,-81,241,83,3,128,58,226,252,3,130,140,192,141,192,1,231,93,1,231,216,-0,131,50,208,107,229,67,5,96,8,99,59,200,78,224,122,0,225,6,2,-252,163,7,2,49,50,54,102,99,0,50,99,112,230,91,1,4,102,99,110,-83,34,192,118,160,236,160,2,128,171,224,167,1,244,74,10,230,26,1,0,-55,179,4,160,42,227,176,5,97,59,193,134,98,137,194,65,0,85,64,201,-243,47,5,254,220,5,192,79,224,35,3,224,163,0,83,73,224,33,0,1,-50,51,77,69,169,73,246,2,2,64,25,152,206,0,79,131,213,160,36,221,-96,130,229,64,67,65,51,115,58,2,95,49,54,101,163,160,105,64,102,162,-45,163,18,195,25,96,0,193,31,210,171,160,156,169,95,132,245,226,205,3,-0,53,76,56,224,58,5,128,125,96,199,225,194,2,193,193,225,173,4,0,-68,225,173,0,228,120,2,245,158,3,162,131,97,160,104,123,0,56,201,127,-225,219,7,160,121,117,11,192,133,225,228,5,96,151,96,138,224,173,1,225,-139,19,229,199,0,99,154,249,153,1,128,144,225,20,1,224,113,1,120,240,-224,202,0,203,162,183,179,129,212,161,186,161,175,193,129,98,78,128,5,229,-128,2,224,49,17,231,55,1,226,14,26,225,247,23,227,83,11,225,33,1,-98,8,131,173,227,253,1,128,34,224,21,2,225,130,2,247,245,0,225,111,-4,160,27,102,236,1,53,49,132,27,225,144,9,193,78,161,2,100,169,245,-255,2,68,168,137,200,64,44,191,168,228,90,8,192,128,192,189,194,187,64,-163,64,224,0,54,137,83,192,18,128,153,231,166,6,98,108,74,90,160,71,-229,108,6,97,151,225,37,3,219,78,64,11,227,174,2,160,76,130,13,226,-176,0,224,41,0,224,22,1,0,64,161,82,192,21,224,83,3,224,22,4,-192,75,253,130,10,224,63,7,185,251,225,122,2,96,147,109,142,129,130,226,-25,1,99,158,71,167,228,13,1,224,52,4,68,77,248,77,3,128,134,81,-236,108,250,130,109,192,7,64,0,193,94,67,144,106,51,225,49,1,96,30,-192,247,69,250,80,215,130,131,229,209,8,23,66,97,100,32,114,101,113,117,-105,114,101,100,32,116,121,112,101,32,97,114,103,117,109,101,109,54,128,0,-66,20,208,35,225,240,0,193,128,161,199,109,208,225,244,24,229,234,8,64,-58,97,92,128,27,226,2,2,128,210,166,226,64,129,139,111,192,129,193,59,-64,209,229,123,2,224,123,16,2,95,49,54,75,42,224,103,9,236,192,0,-64,135,71,193,162,221,72,132,201,13,192,104,149,32,224,118,3,129,165,65,-151,129,150,0,58,128,23,136,9,0,83,130,65,135,133,129,225,229,216,4,-0,50,232,166,1,96,32,205,152,96,44,129,212,141,155,224,103,0,128,18,-239,208,2,224,83,5,98,120,64,231,160,86,64,167,0,54,77,249,248,190,-5,120,159,98,251,64,77,199,136,137,8,0,56,224,146,0,192,32,0,50,-202,111,64,254,5,10,65,32,90,32,90,96,169,64,17,202,104,0,89,230,-74,0,165,145,100,31,0,67,120,175,249,67,0,227,88,2,160,44,228,211,-2,225,172,4,226,185,1,89,224,249,123,6,192,49,195,126,192,84,227,179,-0,225,53,1,224,114,0,162,23,101,10,110,33,225,179,3,160,221,0,54,-225,254,4,71,211,139,190,224,153,2,242,78,5,0,54,101,54,224,188,5,-3,95,49,51,55,85,96,0,52,155,92,225,247,10,65,147,0,52,88,221,-6,95,51,51,53,32,95,56,69,110,224,41,17,249,98,0,1,95,52,112,-6,236,23,7,250,63,1,96,135,231,107,6,100,90,66,224,229,226,3,96,-236,212,53,224,185,3,0,50,84,53,230,114,1,226,171,4,1,55,50,130,-19,229,97,4,161,89,162,234,224,132,0,139,186,0,52,164,168,128,18,100,-248,199,83,239,114,2,4,67,32,95,55,57,174,231,79,152,236,130,2,96,-56,2,50,51,54,183,173,160,72,97,179,129,41,1,54,56,195,143,64,25,-0,54,69,39,224,244,0,1,95,51,118,231,0,51,130,51,128,163,229,94,-4,129,46,1,53,57,68,19,229,164,1,64,21,71,226,0,49,90,42,129,-129,125,38,229,119,0,101,187,226,4,8,0,75,226,1,16,225,147,5,1,-95,52,100,66,224,0,4,226,162,0,65,167,224,168,10,64,73,118,150,130,-110,168,195,224,85,2,225,49,3,0,95,69,222,176,57,160,89,163,154,142,-236,201,83,229,64,0,164,156,225,112,0,75,67,227,95,10,175,106,231,18,-3,200,196,224,44,11,231,89,2,224,61,0,129,249,231,85,13,192,53,231,-81,0,224,70,14,227,230,4,205,5,226,216,0,224,67,5,237,69,0,233,-56,4,64,10,230,181,0,241,237,0,96,32,242,50,4,224,0,0,157,203,-227,208,1,67,60,141,201,3,85,32,75,52,160,2,87,139,128,26,201,59,-226,15,9,0,53,153,91,64,134,230,231,6,98,191,142,19,128,174,226,9,-1,161,171,230,21,0,173,211,68,149,0,51,74,76,161,233,128,86,212,61,-128,196,225,43,3,166,138,163,106,0,66,67,29,0,51,106,220,68,22,232,-10,1,16,103,101,116,83,117,112,101,114,67,108,97,115,115,101,115,58,32,-104,1,1,95,49,68,133,1,56,49,193,173,193,98,175,81,237,127,9,64,-7,128,125,64,121,173,34,68,1,81,116,65,101,1,53,55,230,161,0,160,-217,91,173,115,152,240,72,2,144,127,132,57,224,0,5,97,147,230,87,0,-65,118,136,157,3,95,56,57,52,90,111,172,17,230,55,0,97,103,0,90,-64,30,230,71,4,64,56,200,84,240,71,12,0,55,125,17,162,59,98,85,-194,70,234,119,4,169,189,97,106,160,33,227,193,4,229,39,0,2,95,52,-49,92,37,0,50,89,112,193,34,1,95,49,84,72,3,66,32,95,52,103,-167,164,32,224,15,7,97,72,105,199,214,22,224,203,3,225,193,1,30,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,86,135,4,32,98,105,110,100,150,130,-160,0,224,189,1,96,144,231,136,2,65,172,232,78,2,226,190,11,225,73,-0,244,135,1,86,45,112,242,83,104,97,93,162,128,226,134,8,227,36,2,-153,155,224,94,8,179,59,229,36,0,224,157,3,161,62,104,159,244,9,9,-149,72,0,53,70,211,67,18,156,155,0,53,91,46,96,7,129,86,224,111,-13,64,186,136,235,0,83,93,112,225,29,1,242,166,5,224,56,4,252,230,-1,97,151,97,226,231,192,5,178,204,83,240,165,216,225,70,4,64,116,137,-78,93,168,195,93,163,98,228,78,9,0,51,163,249,228,23,0,230,221,10,-0,51,103,18,130,177,2,95,56,49,64,31,0,51,84,108,1,95,51,153,-57,132,70,4,53,32,95,57,49,96,4,228,252,0,64,84,225,75,2,160,-217,224,96,2,224,93,0,224,88,14,224,220,7,160,223,0,54,170,64,96,-215,170,67,74,127,171,215,228,64,3,65,136,64,29,133,107,244,65,6,227,-104,1,230,150,8,228,165,3,64,1,230,150,3,226,134,0,163,92,1,49,-50,131,224,160,225,205,133,117,145,235,5,0,232,27,0,0,67,103,161,132,-155,237,248,1,161,27,228,54,3,161,223,229,193,0,246,198,16,224,149,0,-224,62,4,233,224,2,96,141,226,65,0,65,19,252,196,1,224,62,0,224,-176,6,227,44,14,75,20,140,255,155,84,183,19,249,217,1,96,0,149,238,-224,18,0,65,128,198,209,0,89,239,211,0,230,157,1,232,70,1,69,111,-101,20,224,242,0,240,196,0,193,137,161,187,185,211,235,203,1,247,204,2,-253,96,12,177,46,177,26,224,33,12,130,101,96,23,161,115,192,25,150,160,-0,75,243,233,1,129,179,232,67,7,192,64,84,95,230,113,0,236,205,0,-224,81,4,166,181,0,85,166,166,224,9,1,64,0,167,178,224,170,0,224,-253,15,224,139,1,241,94,3,225,79,2,224,112,2,130,209,64,23,66,117,-70,218,208,180,225,123,0,233,151,4,160,91,192,48,228,67,1,128,216,128,-50,97,204,0,80,96,185,130,222,1,95,53,75,77,128,200,253,90,0,160,-72,103,78,224,189,2,68,39,225,84,5,162,85,128,48,225,208,23,140,178,-226,34,1,224,32,8,130,224,243,251,1,224,32,8,218,156,227,253,8,250,-181,9,207,83,228,38,12,225,240,6,163,215,165,82,225,250,8,169,191,224,-50,3,224,87,8,184,191,0,75,67,194,226,113,0,226,23,3,128,67,226,-17,9,128,42,226,60,0,224,39,15,231,134,2,226,197,9,224,27,1,64,-199,235,115,4,169,235,160,30,226,10,0,226,83,9,160,225,226,150,1,160,-55,139,7,128,28,0,82,224,220,4,234,78,16,7,112,97,116,86,97,114,-115,32,170,69,1,50,54,131,243,111,95,64,209,112,173,72,253,165,136,2,-95,49,48,189,110,106,193,96,113,68,129,242,122,1,235,87,13,228,246,0,-227,73,0,177,112,231,18,6,2,95,51,54,229,103,3,1,53,56,128,194,-101,10,230,236,19,64,42,66,146,231,176,10,138,62,93,118,64,46,2,55,-48,57,136,247,137,11,229,51,2,66,230,229,25,1,64,63,229,65,5,129,-247,130,112,186,14,160,43,96,2,202,110,226,16,1,225,234,1,226,36,10,-229,92,0,160,68,224,121,5,224,54,16,246,151,1,224,54,3,228,201,0,-224,54,16,231,227,0,129,58,228,206,1,160,57,224,51,11,168,106,128,47,-226,199,7,224,28,2,228,193,2,0,90,64,34,3,95,49,54,57,243,53,-0,227,98,4,224,75,14,160,156,192,75,228,202,0,225,106,1,161,137,66,-140,1,50,57,227,34,0,112,29,4,49,54,32,95,53,230,28,0,189,248,-96,229,65,147,0,80,248,22,1,84,170,2,56,32,79,106,112,0,50,165,-70,66,15,68,102,204,205,225,23,0,222,24,96,113,85,56,253,61,4,236,-222,0,1,55,48,239,98,1,161,89,228,146,8,230,141,2,64,34,235,32,-8,123,60,192,206,226,189,4,225,43,1,160,89,138,250,3,95,49,51,48,-232,14,1,225,54,1,164,151,245,92,14,99,210,119,99,163,121,201,201,232,-219,7,244,242,14,228,170,1,232,179,6,0,52,76,229,224,47,3,128,49,-227,235,3,224,149,5,237,119,4,116,10,0,48,232,207,2,161,126,236,95,-9,224,27,0,236,145,8,226,30,2,224,241,4,96,21,77,29,233,65,1,-2,95,49,52,68,0,224,100,9,0,67,106,57,160,100,161,170,224,236,8,-96,78,100,65,3,95,49,53,48,230,107,1,128,216,225,191,33,162,195,192,-0,227,254,9,192,80,228,50,5,195,72,195,244,235,98,2,128,138,160,178,-226,123,2,171,106,128,26,239,30,2,239,75,12,0,54,255,147,2,224,132,-2,160,56,224,16,1,136,68,162,241,139,145,224,76,7,224,46,3,128,61,-192,44,224,2,3,224,126,5,1,55,48,192,57,228,165,6,130,176,247,161,-2,239,185,7,101,124,192,49,242,117,5,137,39,226,93,5,168,111,98,64,-0,57,235,149,3,224,182,4,225,204,33,242,144,6,224,41,1,233,240,7,-199,182,161,231,224,139,1,254,79,8,227,131,2,224,37,1,227,179,1,192,-15,224,239,5,64,100,224,239,15,129,81,135,72,1,49,53,90,42,65,72,-100,218,71,246,110,252,101,23,224,199,3,242,55,7,163,81,227,254,4,2,-53,51,52,80,75,224,61,1,85,155,224,131,5,224,78,1,225,24,9,163,-8,224,212,3,227,118,7,228,160,7,1,55,48,64,113,64,92,131,133,208,-50,176,51,224,119,2,225,177,3,239,126,7,96,28,64,66,1,55,48,87,-226,160,51,152,153,252,74,2,161,174,194,96,161,188,231,111,23,249,253,0,-227,218,0,244,225,2,227,229,21,206,57,228,128,0,128,167,224,60,3,235,-99,6,192,152,225,89,5,224,27,2,227,249,4,224,10,0,225,139,8,228,-43,2,225,138,1,229,109,10,225,86,24,160,238,229,218,7,114,9,71,86,-73,139,170,103,226,80,8,101,98,252,126,3,193,143,117,250,0,55,115,135,-96,151,227,157,4,227,154,7,129,60,79,139,185,146,128,6,96,130,0,48,-68,102,64,6,225,164,0,192,0,196,168,228,120,6,237,243,13,195,209,225,-44,1,249,143,8,98,155,161,59,180,167,225,132,3,161,219,229,198,2,97,-231,192,22,160,25,160,26,231,55,7,225,103,2,128,168,231,72,8,129,37,-0,53,121,19,131,246,0,51,96,249,0,56,246,142,0,225,67,3,66,63,-100,155,0,80,101,201,97,47,109,35,128,41,192,15,152,161,193,72,160,19,-151,90,64,0,161,162,160,0,226,99,10,129,115,97,0,128,91,64,0,230,-255,3,226,240,2,224,251,2,161,94,231,11,2,224,100,4,230,89,0,192,-59,224,47,8,193,18,224,144,8,192,24,103,242,226,140,7,2,95,49,54,-66,137,230,31,13,130,45,192,13,199,19,64,1,227,174,0,143,191,229,166,-6,148,229,69,129,160,119,146,31,88,232,0,55,129,155,117,20,75,233,237,-167,1,5,110,101,103,97,116,101,246,15,1,235,101,19,224,158,2,225,83,-1,192,146,151,199,141,196,161,121,195,201,226,229,1,243,123,6,224,108,15,-193,120,231,198,12,161,151,232,97,18,192,165,227,188,4,231,221,11,64,113,-0,56,224,56,4,226,185,3,0,67,124,13,64,146,236,107,5,206,37,224,-155,9,84,220,224,65,28,96,106,239,56,13,5,116,99,80,97,116,58,119,-191,7,104,97,110,100,108,101,100,32,97,157,68,4,111,141,96,98,116,23,-0,54,96,123,248,216,4,160,78,2,79,32,35,66,7,172,138,160,45,245,-225,4,103,178,100,89,170,52,133,31,69,62,99,130,67,221,226,46,10,1,-61,61,162,42,236,162,1,224,128,5,0,58,138,198,143,24,0,50,199,52,-239,30,1,65,248,149,211,65,152,131,24,87,111,100,82,128,40,64,167,68,-83,102,104,133,179,96,57,151,32,3,85,32,75,51,128,15,0,54,246,29,-0,96,2,105,53,195,37,137,128,228,243,4,234,69,6,192,41,130,195,64,-47,70,64,0,55,97,165,82,221,225,197,0,144,252,64,112,150,172,234,225,-0,161,33,2,52,51,52,128,8,67,104,1,49,52,113,48,64,7,194,102,-96,41,0,95,184,170,102,162,66,251,64,79,150,222,66,34,0,53,64,59,-195,4,226,63,1,64,36,0,51,224,229,2,196,129,109,114,224,237,10,224,-16,3,0,56,65,62,64,64,209,65,225,212,17,2,84,114,117,132,1,64,-46,219,20,224,46,17,3,70,97,108,115,224,47,1,208,238,156,197,229,104,-1,232,139,7,253,205,2,232,235,1,232,176,34,224,46,2,224,43,10,240,-83,36,68,116,160,92,224,47,12,224,27,0,133,137,224,37,0,225,132,1,-224,130,11,230,253,0,224,81,10,224,27,2,203,51,79,49,104,122,235,228,-1,193,5,230,0,3,129,71,98,94,248,175,12,230,84,5,0,53,99,51,-224,231,10,101,108,168,102,66,156,75,150,228,56,11,225,229,1,2,66,97,-100,252,53,0,97,236,228,71,7,0,58,101,186,65,252,206,54,232,102,3,-193,40,227,128,3,64,242,242,220,6,130,199,161,52,161,82,179,3,193,13,-234,128,8,131,72,224,34,3,225,169,0,192,14,128,139,132,20,68,46,232,-18,0,224,49,1,225,221,5,192,126,198,47,96,133,233,24,6,225,122,2,-192,2,164,215,224,69,3,97,149,165,83,89,156,136,152,192,23,109,32,164,-115,96,16,1,54,57,204,115,97,174,64,53,233,11,0,160,0,64,87,129,-42,233,148,1,64,19,244,225,6,65,31,0,66,245,188,1,225,46,1,96,-129,96,238,0,90,123,126,200,145,224,36,9,101,91,228,250,8,192,0,65,-251,1,52,32,102,211,165,212,130,11,255,85,2,225,77,5,231,193,8,0,-54,238,209,0,225,133,8,224,16,1,99,28,224,151,4,1,95,53,77,73,-3,49,54,57,55,228,134,3,94,202,232,183,1,224,81,17,233,64,3,128,-95,65,74,227,56,5,0,52,233,136,0,224,39,1,227,254,11,240,14,3,-225,242,2,230,89,5,242,208,2,229,176,1,67,116,96,252,64,14,236,99,-4,101,177,200,39,224,111,0,139,251,225,70,13,1,53,54,252,66,3,236,-178,7,192,174,164,167,128,184,71,28,130,131,252,205,6,64,97,167,247,165,-241,224,0,2,225,10,8,192,241,160,149,225,17,2,226,140,4,98,136,0,-89,105,250,66,66,64,31,251,155,13,176,33,128,90,194,148,225,254,2,96,-231,226,119,26,96,160,182,37,99,86,3,55,52,32,95,128,28,235,209,2,-160,0,193,19,228,151,3,225,193,5,234,58,4,242,36,5,129,71,0,89,-192,13,160,212,132,181,225,137,6,179,247,225,51,2,96,16,228,104,10,224,-5,10,226,160,8,245,11,2,224,85,1,128,1,226,167,1,228,159,5,224,-100,0,239,8,5,240,137,6,224,73,11,224,254,16,226,247,1,69,184,160,-6,224,49,6,225,200,0,224,91,1,141,118,224,249,5,130,147,250,154,0,-224,10,3,98,138,228,82,1,96,0,192,70,129,85,192,172,224,182,2,193,-203,224,161,7,227,162,11,248,9,2,193,190,224,193,7,236,45,13,243,213,-3,227,118,5,227,115,0,138,74,225,172,2,128,131,224,45,7,224,205,3,-224,0,6,231,62,1,253,77,0,80,112,2,54,32,95,131,44,161,71,133,-198,64,150,1,54,53,160,26,229,187,8,132,120,224,180,0,236,102,2,16,-111,111,32,109,97,110,121,32,97,114,103,117,109,101,110,116,115,165,75,224,-49,20,2,102,101,119,224,48,8,232,71,5,112,5,72,26,139,231,2,95,-53,48,74,252,96,145,140,240,64,27,139,201,100,28,227,244,10,134,139,225,-47,4,222,112,130,19,64,66,0,54,136,121,109,11,2,57,32,64,76,240,-0,55,140,240,64,29,139,169,0,75,161,70,232,156,1,162,155,224,11,8,-194,59,138,95,224,13,1,165,69,234,214,4,234,217,0,224,39,5,224,75,-0,224,25,3,230,37,4,224,34,8,170,79,224,69,2,160,88,226,2,0,-224,23,0,224,105,3,226,50,1,224,31,3,252,41,0,227,116,0,232,53,-3,224,24,6,64,1,226,122,0,224,154,1,192,92,228,70,2,160,23,162,-177,192,8,72,216,65,139,96,69,81,176,234,102,0,224,233,3,134,108,227,-89,6,129,121,192,86,64,72,108,101,80,60,0,54,93,148,251,15,1,231,-17,0,224,96,0,82,47,76,232,3,95,51,51,53,109,55,144,236,128,98,-0,79,201,81,0,56,109,110,239,116,1,160,62,96,58,192,83,137,97,240,-112,8,229,58,3,96,74,66,138,128,240,0,50,102,178,129,34,107,142,0,-50,158,22,241,31,4,224,71,1,2,95,49,52,90,29,1,49,54,204,124,-224,26,17,129,22,72,223,99,221,1,95,51,67,206,186,78,224,58,4,224,-148,41,64,57,224,110,5,224,13,4,224,40,1,225,182,2,97,179,160,114,-136,54,96,107,1,56,48,167,81,147,231,67,173,161,177,103,97,213,228,161,-136,130,23,0,53,82,122,72,89,3,51,50,50,32,160,33,170,219,106,106,-128,11,171,7,0,49,115,243,0,51,147,244,232,155,2,116,104,97,241,111,-71,104,163,3,95,49,52,54,161,30,2,85,32,75,202,187,0,50,180,86,-64,229,0,54,133,126,228,32,3,79,219,160,113,224,21,3,0,56,192,21,-64,52,68,109,68,64,143,154,224,39,3,65,117,196,94,0,51,164,191,235,-112,26,234,12,0,129,160,234,4,2,230,190,6,241,17,0,167,33,224,78,-6,224,43,4,64,8,74,214,227,167,4,224,96,4,224,46,8,130,100,224,-24,1,96,11,192,8,230,133,9,233,115,24,65,6,144,89,131,187,0,50,-80,103,234,197,1,0,85,131,10,67,162,113,87,142,230,161,230,128,61,144,-104,234,23,0,134,231,225,75,7,130,51,192,201,194,232,98,234,244,214,0,-150,127,159,171,194,134,129,206,65,186,64,106,208,163,248,38,0,64,6,64,-5,78,208,0,51,70,142,64,44,100,98,0,58,128,53,1,10,65,239,10,-2,13,80,114,105,109,105,116,105,118,101,115,46,61,62,34,96,82,64,44,-114,140,64,174,245,129,11,0,85,224,164,26,64,71,135,10,225,147,14,64,-32,0,54,224,32,2,0,80,195,68,224,36,7,134,239,160,34,132,86,0,-80,128,167,130,200,2,83,32,83,162,170,166,100,64,42,240,189,5,135,90,-224,33,18,82,4,230,115,1,224,33,12,136,219,129,249,0,83,98,245,224,-30,4,98,25,163,23,236,179,6,230,35,0,226,246,1,167,248,65,181,112,-119,0,53,124,74,0,54,161,77,249,201,2,64,20,235,184,1,224,115,6,-161,139,162,140,224,72,0,97,143,64,27,224,60,1,224,37,13,239,200,1,-192,98,128,213,162,173,225,64,2,160,221,236,232,7,64,70,224,90,15,163,-19,192,90,225,3,8,128,83,0,85,228,68,0,224,63,3,69,53,98,203,-1,54,56,67,159,250,135,3,250,228,4,1,53,51,237,0,1,131,63,225,-150,6,0,49,164,145,225,150,11,227,198,2,96,22,65,49,225,144,6,0,-52,73,212,224,197,1,2,95,51,54,224,42,1,128,0,226,83,18,217,181,-128,31,224,28,6,152,34,160,178,224,25,4,101,250,228,43,8,178,251,110,-9,240,227,11,99,58,226,80,7,102,82,251,184,4,226,91,17,142,177,224,-16,0,130,229,225,75,4,142,213,225,33,6,122,206,224,86,18,167,123,224,-170,3,250,205,2,81,179,227,44,7,224,52,0,226,133,9,225,51,16,135,-14,227,101,8,129,19,225,229,25,87,132,225,229,2,224,204,3,226,221,11,-68,152,225,59,5,224,100,26,141,243,224,100,2,227,116,3,228,53,12,96,-66,249,71,13,9,100,115,69,70,105,101,108,100,115,32,244,189,11,69,26,-135,197,165,52,131,106,165,52,215,50,69,76,64,106,0,85,128,22,215,26,-96,198,238,79,0,3,95,49,51,55,66,69,0,51,107,17,225,100,2,239,-203,2,238,75,3,91,251,98,170,64,36,238,150,2,161,30,224,42,2,64,-83,137,207,224,245,4,64,138,230,209,0,1,51,54,224,65,1,3,66,32,-95,57,153,68,0,53,111,223,0,58,128,105,160,179,212,124,128,11,145,234,-96,130,151,223,225,62,6,3,101,110,117,109,173,224,64,70,134,238,193,43,-99,73,129,43,73,84,168,4,199,193,229,27,10,97,25,224,26,12,134,85,-226,177,13,226,178,14,194,179,140,69,97,79,133,72,225,37,0,2,95,49,-49,196,244,142,57,128,33,229,159,18,224,36,4,229,135,9,96,191,0,85,-99,137,224,37,0,228,184,17,98,74,224,210,12,228,210,0,224,94,4,96,-21,100,90,160,91,228,164,8,72,38,228,65,8,224,136,1,238,224,3,228,-16,11,228,98,11,192,24,228,98,0,1,54,55,108,118,236,206,0,227,114,-0,224,24,7,225,105,5,98,83,66,8,0,54,162,34,0,89,222,240,192,-143,185,249,239,36,5,131,69,224,170,10,230,158,0,232,166,19,224,207,11,-192,25,96,181,224,73,1,224,245,16,96,154,242,24,4,225,83,0,205,105,-106,234,73,199,249,164,4,166,91,161,220,254,210,5,224,82,10,254,153,2,-160,119,0,90,164,21,246,5,5,159,176,246,252,4,129,245,255,209,2,128,-119,149,207,160,71,96,4,239,11,0,0,90,64,127,77,123,98,50,0,75,-66,46,239,35,0,129,231,130,75,0,64,89,22,224,27,3,64,0,227,65,-13,225,237,9,97,238,189,12,65,219,208,172,247,29,0,230,93,4,224,235,-9,97,92,246,114,6,96,222,226,199,1,226,41,1,160,9,130,4,226,55,-2,253,205,7,101,62,129,181,0,50,255,209,3,100,226,148,88,128,71,78,-223,90,22,224,56,1,129,203,130,166,96,91,226,51,13,236,131,1,165,221,-162,225,141,121,1,57,51,224,118,2,229,178,7,243,86,18,91,103,13,115,-101,99,116,105,111,110,32,102,105,120,105,116,121,243,136,2,0,53,77,252,-224,43,1,1,36,120,128,27,147,114,0,56,217,77,65,142,139,231,215,113,-195,107,225,145,14,128,30,225,149,6,195,108,70,61,0,57,64,210,209,135,-195,14,135,158,134,60,225,187,4,96,29,96,170,224,152,3,224,182,9,225,-228,57,128,203,225,227,6,162,96,99,163,214,29,227,160,0,248,160,0,225,-214,14,160,84,239,39,2,100,60,224,21,6,224,60,30,64,58,249,253,8,-85,161,226,28,4,128,174,227,251,4,225,115,9,224,0,1,226,57,87,233,-6,1,232,213,13,160,234,224,215,3,225,152,6,194,31,236,119,2,227,46,-0,246,193,0,148,135,224,100,5,197,31,225,73,0,161,75,224,13,0,251,-187,7,227,86,7,128,21,132,242,160,14,100,7,180,150,228,91,0,100,4,-1,49,54,123,55,64,7,228,246,4,226,134,1,193,181,66,96,64,42,96,-142,129,125,227,211,8,65,58,177,0,96,51,226,204,10,102,232,224,13,5,-160,174,128,2,160,14,227,9,13,0,89,225,21,3,103,85,225,10,3,129,-78,241,58,0,64,5,71,47,128,58,131,97,129,18,245,105,0,128,36,96,-117,166,100,73,59,0,52,80,236,191,30,96,5,255,41,0,224,184,2,224,-2,3,192,29,192,130,199,159,224,2,0,214,109,225,154,0,238,113,3,99,-222,129,142,2,85,32,95,74,59,128,141,97,5,169,155,128,58,65,249,224,-7,7,101,161,227,35,6,224,9,0,224,165,2,250,122,2,160,252,96,86,-224,210,6,96,17,194,47,64,92,65,225,182,29,228,88,2,192,224,228,71,-2,224,229,0,160,99,183,182,224,113,2,97,24,1,85,32,71,100,224,72,-2,162,15,96,35,232,86,7,225,235,3,193,91,248,13,0,224,26,3,224,-143,4,219,125,225,173,15,129,10,224,66,9,226,132,0,224,127,14,224,106,-0,96,170,224,35,21,128,1,169,114,192,0,233,236,1,96,2,128,178,226,-154,0,160,14,224,50,4,224,88,15,0,67,98,56,224,0,3,224,234,14,-224,2,3,224,246,0,64,0,228,130,9,253,116,16,193,217,128,122,225,231,-0,130,35,128,181,2,95,49,51,97,212,227,129,0,147,229,0,53,101,38,-123,116,224,227,0,2,95,49,52,96,21,224,42,2,1,56,52,100,135,96,-65,64,44,190,174,64,65,192,22,64,8,181,242,128,0,163,32,168,116,253,-137,0,226,232,5,224,173,2,225,74,2,161,98,192,44,224,62,4,128,166,-225,32,6,224,181,12,252,121,1,96,223,225,13,0,96,186,225,13,23,224,-225,14,213,167,163,126,227,13,7,160,190,227,166,13,96,16,154,9,170,237,-252,130,3,8,95,52,48,49,32,95,52,48,51,105,9,231,2,1,28,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,167,57,226,92,10,161,83,96,127,64,228,129,-57,96,21,224,244,1,88,232,225,33,2,224,213,10,224,176,42,9,98,97,-100,32,112,114,101,102,105,120,224,168,11,228,251,2,3,95,51,50,48,239,-186,2,14,92,34,115,114,99,47,77,105,99,114,111,72,115,47,70,104,25,-9,46,104,115,92,34,44,54,53,58,55,192,64,251,28,0,250,43,3,97,-214,171,45,170,236,3,95,55,52,50,164,205,235,35,1,129,28,247,213,1,-0,54,78,33,0,54,177,91,96,0,0,80,89,139,79,87,96,167,165,234,-1,64,89,100,83,64,230,229,40,3,233,85,1,96,64,139,163,64,79,249,-176,0,202,56,128,113,96,122,192,115,141,117,64,9,0,57,225,87,6,103,-198,194,103,154,177,135,8,233,168,0,171,247,100,96,64,139,198,147,64,34,-0,80,192,180,130,138,193,200,96,183,242,170,1,128,7,193,62,224,63,3,-225,28,0,224,34,1,225,7,1,161,29,186,234,160,21,72,81,146,98,77,-206,99,34,1,35,54,145,100,248,192,1,104,211,137,224,0,49,233,224,3,-5,110,101,103,97,116,101,97,220,0,58,129,11,4,10,65,32,65,32,64,-11,145,187,0,90,65,66,64,14,145,176,0,75,96,26,0,54,233,251,2,-234,247,0,67,98,184,88,0,54,223,72,0,65,128,59,140,101,2,95,52,-56,99,6,139,15,143,156,64,178,78,50,174,34,206,41,128,24,64,11,174,-81,224,24,11,160,49,142,113,1,95,51,121,155,132,42,64,115,202,159,0,-89,165,162,98,62,227,167,2,225,163,1,240,77,11,227,183,0,248,143,20,-79,190,188,79,226,152,13,128,41,244,106,14,10,103,101,116,65,112,112,67,-111,110,58,32,244,107,11,160,99,167,33,0,85,128,191,96,218,212,103,5,-66,32,95,55,50,56,225,246,1,253,57,7,222,9,3,67,32,95,55,123,-64,64,60,130,42,1,75,50,97,200,194,32,235,194,13,134,78,129,47,107,-114,154,241,0,53,67,59,0,58,139,129,115,195,65,148,224,214,1,3,118,-97,108,117,98,81,224,18,1,2,116,121,112,130,99,224,18,1,3,107,105,-110,100,224,18,6,3,115,111,114,116,64,18,64,90,244,56,1,245,51,25,-102,83,129,105,224,12,1,64,167,64,242,65,146,171,138,236,196,5,164,154,-131,115,238,207,7,66,199,100,29,0,53,89,43,236,252,5,128,160,180,191,-228,12,0,68,224,170,204,233,241,4,162,52,129,74,231,49,0,226,84,19,-128,145,159,162,64,129,160,234,226,96,1,226,94,0,247,238,4,90,153,196,-49,224,43,10,132,208,224,96,2,140,229,64,96,203,186,98,166,225,142,2,-9,101,116,83,76,111,99,69,120,112,114,196,31,65,13,81,189,96,245,210,-78,129,97,1,50,50,150,114,128,78,128,98,0,54,97,81,224,98,0,192,-20,64,182,192,20,64,84,252,133,1,235,189,7,196,82,96,38,208,170,179,-6,64,35,164,110,64,102,96,26,129,8,0,56,83,89,96,23,227,40,1,-241,130,0,96,83,200,134,237,76,1,64,8,0,95,86,246,189,119,193,204,-228,41,1,224,12,1,224,25,0,6,95,53,49,53,32,95,55,179,13,96,-19,177,225,224,25,4,163,124,160,6,67,180,64,8,3,95,49,54,52,131,-160,96,48,103,229,128,10,228,37,5,9,117,110,100,101,102,105,110,101,100,-32,135,130,97,110,103,106,224,42,8,196,71,0,56,196,148,130,135,140,105,-96,228,72,67,237,187,3,128,33,224,126,0,192,13,224,86,5,233,1,1,-208,40,179,51,135,240,224,49,10,160,136,168,27,128,39,160,149,160,14,2,-79,32,35,65,28,103,166,130,21,80,169,96,33,71,236,0,80,104,1,232,-56,1,194,18,232,61,0,95,127,207,205,224,0,2,160,220,65,251,217,117,-228,154,3,1,91,93,96,151,224,229,2,2,79,32,35,65,140,169,18,225,-194,1,224,219,0,166,62,0,80,73,105,233,110,2,64,55,0,51,244,13,-2,224,82,2,224,40,8,66,142,238,111,0,131,47,224,97,1,128,0,64,-176,133,139,0,83,66,91,0,95,69,227,67,208,97,54,68,254,0,53,120,-112,128,13,106,44,0,83,65,203,192,175,71,216,107,41,64,49,0,35,144,-190,90,19,73,163,1,95,56,126,138,96,99,66,112,131,191,203,184,241,84,-5,1,52,57,67,57,128,203,113,81,238,51,2,236,3,3,241,198,7,130,-205,131,55,231,97,18,1,95,52,100,36,225,47,1,229,219,5,0,54,248,-43,0,128,102,235,57,1,224,111,3,96,53,1,49,52,191,95,235,252,0,-231,125,1,161,97,224,17,6,251,76,5,96,20,64,254,1,51,54,77,89,-156,86,192,158,229,59,0,134,58,68,15,234,32,5,226,239,8,21,110,111,-116,32,112,111,108,121,109,111,114,112,104,105,99,32,101,110,111,117,103,104,-163,5,67,240,83,165,1,95,51,66,28,227,155,1,242,24,6,107,51,106,-166,64,149,0,56,228,136,1,224,42,9,97,202,135,33,167,17,1,54,32,-128,93,1,49,54,138,96,105,10,66,7,231,43,0,64,50,134,179,90,143,-0,90,160,47,0,56,141,134,96,29,0,54,160,29,137,179,64,71,103,220,-2,95,49,52,88,162,130,218,1,49,54,72,201,224,248,1,3,66,111,111,-108,198,28,66,230,1,10,65,225,21,2,4,68,97,116,97,46,64,33,6,-95,84,121,112,101,46,34,128,87,197,171,67,83,0,35,96,154,156,17,76,-46,130,155,251,25,3,71,186,65,226,65,137,0,53,64,34,2,95,49,55,-152,137,226,165,21,221,65,226,222,4,0,53,104,185,195,131,66,92,194,95,-226,27,3,130,189,226,25,4,64,134,97,77,171,135,64,66,163,68,64,5,-224,101,2,96,167,73,99,226,49,5,227,23,4,143,46,227,66,3,232,25,-1,226,177,1,164,255,64,182,100,211,227,104,2,229,170,0,246,14,14,173,-8,103,225,228,120,0,129,163,133,21,224,136,0,227,200,6,128,83,0,54,-97,113,227,210,0,0,85,102,237,97,147,0,32,163,34,224,123,8,143,171,-64,55,64,62,128,174,244,247,8,64,183,2,10,65,32,229,223,11,160,141,-131,206,131,119,0,48,164,20,0,51,129,179,96,65,64,89,128,190,0,79,-101,66,2,49,50,51,68,245,174,145,1,54,51,64,7,0,75,98,77,64,-53,128,41,64,36,0,52,193,20,75,42,96,45,64,126,128,10,64,44,131,-24,234,105,11,0,52,141,133,96,240,226,36,1,3,95,49,53,57,64,42,-164,176,96,176,226,3,3,228,215,6,133,232,161,94,224,98,15,231,86,0,-226,145,9,129,110,64,114,107,203,230,56,0,225,134,8,149,187,161,43,0,-54,132,32,224,111,14,72,19,129,205,224,217,8,168,165,224,56,8,0,53,-90,45,227,31,0,226,57,2,129,186,247,198,2,234,102,0,224,40,5,64,-123,96,66,194,105,235,118,5,64,255,64,193,64,131,202,147,224,64,5,111,-139,98,161,125,59,240,137,3,160,6,0,85,230,55,1,225,66,3,193,61,-239,189,0,226,202,2,225,109,6,2,95,51,54,224,112,0,95,92,72,81,-250,51,1,96,234,255,97,0,225,141,1,225,229,0,251,194,9,224,19,5,-194,52,65,161,197,98,172,9,100,83,64,161,225,32,15,235,16,2,160,33,-154,167,228,92,5,164,98,225,64,1,224,28,10,228,181,5,225,224,0,0,-56,224,180,3,204,206,192,49,235,50,0,64,2,224,39,1,128,136,128,1,-226,193,1,64,205,233,58,0,169,229,195,238,64,147,229,178,1,160,64,136,-45,160,59,165,110,164,243,246,240,6,224,117,6,224,150,0,228,203,4,96,-137,64,74,129,10,129,229,1,52,50,146,5,224,152,25,136,65,64,143,142,-9,224,132,4,65,235,96,101,238,24,4,111,158,177,155,96,0,225,62,6,-245,100,8,163,172,129,55,201,45,160,9,128,147,162,232,155,153,224,126,0,-224,65,1,154,244,129,226,232,232,1,192,2,244,129,3,224,32,0,201,195,-237,14,0,192,99,228,87,3,224,26,0,253,27,2,224,31,4,224,131,2,-176,158,224,84,1,224,133,1,224,219,0,128,192,160,203,224,92,5,163,243,-251,116,1,97,68,97,151,68,112,252,190,0,131,48,136,97,0,79,75,141,-0,54,73,74,102,111,1,50,50,195,225,64,7,64,28,203,14,137,65,2,-95,56,52,67,176,0,52,137,7,64,39,64,105,224,39,16,1,53,57,99,-159,3,95,49,54,49,68,31,224,39,16,0,54,71,106,96,39,107,154,224,-39,17,83,112,130,52,253,204,1,96,194,64,29,178,220,1,54,49,198,148,-192,234,137,38,227,115,1,64,26,129,113,250,55,5,130,89,161,163,225,249,-2,160,43,96,17,226,105,2,128,1,227,250,10,79,218,128,0,224,38,1,-230,25,6,0,54,171,189,232,174,1,64,5,236,31,8,233,115,13,230,221,-0,224,51,35,224,139,0,229,212,14,1,54,50,226,145,0,227,109,0,239,-180,2,224,63,3,169,59,0,50,171,125,65,142,65,182,228,212,3,225,86,-3,225,102,1,225,15,2,164,37,229,85,6,134,82,224,41,6,131,0,251,-5,0,64,19,229,66,4,224,106,0,227,52,13,185,31,107,125,163,24,224,-11,3,224,191,1,207,199,128,60,225,70,3,105,67,231,147,7,234,180,13,-2,95,49,52,192,51,128,1,230,195,6,192,253,130,71,64,122,204,153,224,-42,5,64,13,66,223,128,224,73,107,1,48,48,76,52,134,241,248,50,1,-192,0,160,187,2,95,49,50,67,6,66,245,209,176,67,174,73,180,206,195,-163,69,64,34,138,193,225,238,3,229,248,4,229,13,3,148,181,99,90,64,-18,0,79,64,80,254,5,0,225,194,4,225,142,0,64,1,133,86,224,71,-13,65,6,0,79,97,153,254,78,1,77,76,0,54,107,236,179,74,64,166,-138,235,129,9,64,166,230,212,0,111,224,135,238,226,180,2,225,125,1,160,-29,180,22,233,233,2,192,144,243,210,0,224,28,3,64,179,243,26,0,129,-133,160,225,64,173,0,80,240,128,4,224,74,10,184,238,224,73,37,160,215,-200,133,224,204,182,99,220,132,105,247,191,4,2,95,51,49,97,213,96,76,-131,169,160,118,224,40,14,224,120,0,195,214,160,48,2,95,49,51,84,18,-99,58,128,15,79,228,113,227,167,89,228,159,1,228,169,2,128,0,96,187,-163,65,0,58,128,28,235,220,12,1,54,50,64,131,88,114,234,197,3,171,-143,224,178,9,227,188,1,152,93,235,184,0,179,110,165,166,97,64,224,12,-4,192,4,193,124,64,121,99,168,0,51,68,114,71,156,68,192,137,113,112,-142,128,15,224,24,6,224,0,6,1,95,56,104,34,64,223,215,255,131,64,-64,93,132,96,97,56,230,189,17,128,32,65,91,198,26,166,57,1,95,57,-124,36,67,131,64,242,0,54,192,126,64,107,218,217,142,57,64,25,164,131,-2,51,55,56,132,131,0,49,65,123,1,54,50,76,116,0,51,154,110,64,-40,139,190,6,95,56,49,51,32,75,32,65,100,193,56,224,134,0,224,1,-7,235,54,2,224,37,16,224,35,4,224,32,23,224,29,20,224,26,17,224,-23,14,224,20,11,224,17,8,224,14,5,65,36,226,168,4,129,26,215,171,-0,89,165,93,97,200,108,221,232,154,1,167,76,192,79,138,72,231,234,2,-96,13,230,176,2,227,228,5,230,129,1,128,1,133,180,224,173,1,171,27,-224,65,3,224,68,9,253,229,0,224,55,8,195,187,64,62,96,233,166,43,-132,231,164,41,199,166,233,245,3,176,189,0,49,248,74,1,102,205,93,138,-230,51,3,224,0,3,139,1,66,152,64,13,128,8,65,68,138,2,75,13,-1,75,52,115,179,64,1,0,75,139,68,161,103,135,47,243,114,6,5,67,-111,101,114,99,101,128,6,2,105,98,108,91,121,64,43,231,56,4,161,134,-168,228,128,250,206,76,96,11,225,119,15,224,126,0,225,106,10,128,1,193,-200,224,30,10,224,85,16,236,88,10,224,85,12,231,148,2,65,127,104,144,-75,178,74,47,216,209,128,0,167,176,64,248,135,138,225,36,6,84,146,13,-76,105,116,115,46,75,110,111,119,110,83,121,109,98,116,201,0,58,139,215,-225,40,144,194,246,225,40,75,76,239,253,116,18,1,53,56,231,88,2,224,-34,6,224,44,2,0,50,91,168,0,83,163,58,242,198,10,0,50,124,208,-99,37,133,87,0,52,105,225,133,87,69,108,0,48,158,194,2,64,35,49,-88,235,96,161,234,141,2,64,47,236,134,0,225,40,0,161,37,134,44,187,-94,241,114,1,199,152,224,185,0,129,50,225,225,5,233,149,0,224,5,7,-209,73,192,60,192,1,236,13,1,224,28,8,224,149,5,228,109,8,224,77,-11,225,199,0,64,0,164,108,224,2,4,192,108,224,52,5,229,187,12,64,-22,236,122,0,224,77,13,224,56,9,226,114,3,102,245,156,174,224,36,1,-224,58,7,224,17,8,224,14,5,192,157,133,15,1,54,49,92,2,1,49,-54,103,133,160,62,236,58,17,108,106,243,216,5,96,0,226,185,0,224,143,-74,133,81,67,10,115,147,76,189,66,146,0,75,123,136,96,119,101,135,192,-12,64,43,0,54,235,227,0,192,2,241,231,11,162,63,224,38,3,128,2,-2,95,49,54,162,225,192,46,224,168,4,64,157,162,242,226,202,9,192,47,-128,109,225,187,5,193,8,128,8,64,120,128,126,166,202,161,236,66,218,250,-241,1,239,155,1,238,23,11,224,205,0,238,24,12,193,187,225,151,2,224,-84,0,64,102,68,124,129,117,0,48,86,122,241,235,0,128,165,75,136,64,-182,149,249,1,54,49,69,55,231,36,1,224,116,8,224,110,2,162,168,226,-42,1,224,51,2,138,191,128,7,160,221,90,74,242,79,1,96,71,251,197,-5,31,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,0,114,222,214,128,131,-1,53,55,138,81,0,53,242,185,1,98,21,138,22,255,117,1,96,217,130,-185,69,17,128,47,64,64,5,51,48,51,32,95,53,146,189,104,41,75,131,-64,65,201,61,225,150,3,0,83,100,72,129,215,141,82,160,93,173,122,228,-111,10,171,1,64,173,237,7,2,249,2,1,230,6,1,139,252,193,207,149,-33,226,195,4,181,42,224,19,4,228,255,1,227,121,3,160,2,160,26,227,-24,3,227,27,18,96,12,246,247,1,163,6,162,72,160,244,66,27,0,50,-76,204,245,97,0,192,68,201,250,227,91,5,181,47,96,101,161,30,66,41,-137,164,224,104,3,161,101,181,232,91,249,77,141,67,156,74,216,180,140,192,-0,165,164,65,165,137,158,195,75,198,70,141,248,96,71,67,72,1,54,48,-97,101,139,7,227,127,1,193,200,128,232,160,15,131,194,224,202,1,231,190,-0,141,119,64,1,224,83,3,96,162,227,158,1,97,42,128,157,144,142,174,-106,161,237,110,18,224,21,0,227,53,7,128,93,236,187,2,236,198,4,64,-104,0,53,64,58,231,70,4,129,39,131,180,166,41,65,22,209,194,64,1,-97,45,193,33,192,197,209,177,192,198,224,99,1,110,192,224,21,0,134,133,-3,49,54,48,55,98,179,64,235,226,185,1,239,15,3,192,0,192,174,224,-98,7,64,7,244,80,5,132,154,225,97,0,224,142,3,192,139,220,230,252,-173,9,128,205,193,149,131,89,248,164,6,2,95,49,51,219,212,224,151,4,-225,132,5,224,28,4,64,79,181,167,227,246,3,163,139,128,35,195,133,160,-49,163,78,64,11,224,147,5,227,76,0,234,26,1,215,247,227,28,9,227,-5,9,194,250,224,0,0,225,139,1,0,49,232,195,2,65,236,140,83,129,-164,192,74,64,66,64,27,139,118,122,6,129,253,100,176,229,154,7,195,229,-96,197,128,209,228,46,0,163,86,225,36,1,166,182,146,78,203,96,228,96,-3,224,46,18,78,147,160,47,225,9,1,231,112,0,224,44,7,242,170,37,-64,31,1,95,55,103,75,3,67,32,95,54,77,251,0,53,233,60,3,114,-57,128,69,144,129,160,23,224,90,8,128,163,96,48,197,158,224,174,1,227,-63,1,224,168,1,196,205,224,73,8,192,24,149,244,162,234,167,129,229,239,-2,64,104,128,12,149,133,252,233,1,65,195,66,6,191,177,135,199,231,121,-1,228,160,2,228,232,5,224,42,8,226,169,0,227,119,1,98,132,228,3,-3,128,222,229,35,1,197,177,85,54,225,78,2,129,169,200,109,128,11,250,-163,5,228,38,3,129,62,224,8,4,128,25,64,217,204,235,188,11,162,254,-125,240,160,59,224,22,2,224,25,6,224,26,6,224,29,7,199,136,192,37,-192,183,128,11,224,196,0,252,212,4,64,146,202,122,151,183,67,134,128,170,-0,54,227,72,7,100,41,64,234,66,46,160,87,1,95,53,72,120,128,72,-136,129,112,56,70,31,64,18,136,82,65,157,96,71,192,145,228,66,0,227,-112,5,128,29,227,109,11,252,206,0,245,228,27,128,154,227,55,5,237,140,-7,100,162,130,23,225,251,9,227,76,6,161,57,229,66,4,228,209,4,137,-107,96,22,224,99,1,224,131,4,64,198,245,168,8,169,25,212,224,224,50,-35,194,183,116,164,82,5,0,57,96,151,192,47,229,238,8,160,157,242,93,-7,225,72,10,228,36,0,224,144,8,224,96,3,225,70,4,192,41,226,102,-2,224,58,20,224,35,0,233,65,4,226,185,8,227,169,4,160,101,232,108,-1,224,19,0,199,9,225,68,12,70,55,225,68,10,225,63,9,147,51,225,-63,20,66,207,137,124,1,95,49,160,28,1,85,32,160,49,64,168,117,224,-135,249,224,62,2,64,53,136,155,229,138,0,87,122,0,56,131,99,179,28,-227,200,1,83,107,96,151,0,67,193,150,96,245,1,83,32,237,51,0,64,-232,202,141,202,37,64,195,0,55,99,121,0,85,115,173,0,85,225,5,10,-157,243,86,47,2,95,56,56,72,242,248,2,0,3,95,49,53,54,64,11,-2,49,52,53,103,103,1,95,56,238,31,0,96,0,0,83,104,12,65,61,-168,9,129,138,231,52,5,196,101,238,12,1,77,60,0,55,229,66,1,82,-6,2,57,32,95,64,105,0,64,105,195,1,95,54,86,231,96,0,128,45,-228,153,0,166,39,65,32,199,205,5,80,32,95,51,52,51,237,53,2,18,-109,105,110,105,109,117,109,58,32,101,109,112,116,121,32,108,105,115,116,205,-37,2,95,51,54,75,73,1,54,57,64,106,0,58,96,118,128,68,98,85,-238,74,4,192,19,133,217,131,212,166,243,224,13,1,99,220,194,226,166,203,-128,8,0,54,65,53,0,49,64,95,160,226,96,27,64,203,0,51,69,13,-8,95,49,49,52,54,32,79,32,35,82,88,203,207,240,95,6,64,159,134,-20,244,41,20,1,78,97,64,222,64,44,133,174,162,37,97,57,140,3,132,-191,206,244,163,84,128,187,229,98,1,68,222,183,18,64,174,72,18,65,151,-100,107,160,7,193,19,67,125,243,136,5,0,55,165,140,192,91,99,141,224,-9,0,97,246,64,250,1,53,57,171,159,240,62,9,128,45,253,56,3,97,-52,254,46,77,1,52,56,194,79,224,42,5,193,239,128,183,254,46,20,226,-50,25,224,116,1,224,70,4,224,69,1,226,69,0,80,112,228,196,0,111,-155,192,102,254,143,4,201,9,65,234,0,54,228,55,1,193,108,0,83,169,-87,97,194,133,38,191,158,65,120,132,138,128,7,192,222,252,97,74,225,128,-1,169,181,194,113,160,65,188,228,192,252,252,243,8,128,237,252,89,3,98,-51,104,60,224,125,4,135,186,146,250,68,221,164,196,128,49,136,91,131,8,-226,84,21,163,185,226,74,9,225,221,8,231,201,0,226,50,19,138,104,96,-100,99,229,132,204,228,16,0,196,214,68,197,226,7,1,64,177,198,61,3,-52,55,52,32,64,15,134,23,227,105,10,0,54,160,116,246,198,1,64,20,-226,164,2,253,102,2,87,33,0,55,235,64,1,64,87,134,85,64,160,252,-74,5,0,52,87,35,252,74,1,0,53,69,32,229,24,0,227,242,12,0,-54,128,84,226,198,1,237,233,6,96,54,247,108,3,242,245,1,64,149,235,-33,0,76,168,225,126,1,161,143,224,55,2,64,46,65,53,227,210,6,3,-58,49,53,56,197,188,224,204,7,1,53,54,224,204,5,64,63,96,40,190,-74,226,19,5,67,37,100,190,229,11,3,143,177,103,88,99,71,128,95,251,-45,1,64,100,163,90,132,75,64,102,133,127,234,184,0,226,119,3,180,110,-0,53,139,70,98,13,196,32,224,40,4,143,220,229,32,3,161,215,128,153,-201,162,0,64,193,108,238,186,3,224,7,3,241,47,4,233,138,0,199,140,-237,147,6,224,38,7,231,194,0,192,52,228,37,0,252,237,31,243,137,0,-224,64,2,144,60,252,236,29,96,67,172,206,134,60,200,51,0,55,137,141,-2,49,53,55,162,8,64,44,163,231,226,109,3,102,110,232,69,0,224,0,-4,162,99,1,49,56,96,45,137,1,236,250,3,160,194,224,80,5,65,232,-197,140,1,53,56,172,216,97,251,127,169,96,81,227,36,9,0,56,128,164,-128,81,64,15,231,70,0,238,38,4,64,73,132,229,227,106,18,226,190,0,-243,11,8,98,253,225,125,4,227,8,11,232,197,8,128,42,192,131,160,134,-133,58,97,61,64,118,1,75,50,106,79,64,25,132,162,227,59,7,229,76,-2,74,64,233,241,3,196,21,224,103,3,65,148,246,242,1,231,206,3,134,-187,134,199,224,170,1,162,206,128,13,129,233,64,52,224,33,16,128,27,128,-113,236,116,0,232,255,1,226,160,64,224,219,4,237,50,4,250,232,0,192,-49,232,139,10,64,58,202,58,177,136,2,32,95,57,95,59,162,183,74,54,-232,110,3,247,25,2,128,10,160,16,224,149,5,224,165,1,224,117,8,224,-249,2,243,214,1,192,16,128,123,1,95,55,102,91,226,38,4,168,155,244,-0,2,234,241,0,161,42,207,39,138,93,246,170,0,70,199,128,73,224,17,-6,135,40,0,95,70,178,128,59,149,246,0,54,160,241,0,53,128,242,0,-95,69,93,1,95,50,131,46,0,64,232,31,4,227,103,13,97,169,128,247,-0,53,100,33,0,67,139,235,6,95,57,49,53,32,95,56,89,102,1,57,-51,211,111,98,206,214,21,227,111,21,0,90,225,80,2,227,102,32,192,30,-193,237,227,99,7,135,132,227,99,1,0,51,107,190,64,195,71,243,2,56,-49,56,72,2,66,3,167,129,235,112,17,192,154,0,53,126,159,99,93,169,-53,64,171,234,33,7,239,222,2,160,10,160,13,227,123,0,202,61,224,228,-3,192,13,241,104,9,131,236,99,234,162,82,195,254,192,23,224,71,1,245,-7,5,230,197,2,226,183,4,230,160,8,238,109,1,224,36,1,227,132,0,-199,177,160,186,224,112,5,224,98,62,230,135,2,160,217,225,48,4,64,32,-2,95,49,51,67,56,174,154,192,95,192,131,225,44,3,92,223,0,54,94,-199,128,115,242,87,0,225,161,1,65,226,66,182,192,34,164,27,242,76,8,-224,22,13,224,174,0,192,121,193,235,224,44,13,224,198,0,233,186,10,243,-77,2,232,12,3,225,63,18,225,57,5,224,136,37,224,102,2,232,112,22,-224,99,2,128,94,64,5,225,167,5,224,55,12,224,56,5,192,155,118,254,-131,51,225,126,0,160,14,224,0,2,160,199,163,208,128,59,148,11,173,96,-229,32,1,70,218,230,223,0,2,95,56,57,85,250,0,50,131,156,96,70,-253,224,6,1,105,110,93,217,20,105,115,116,101,110,116,32,116,121,112,101,-32,101,113,117,97,108,105,116,121,32,208,178,65,49,64,52,96,153,138,54,-224,68,6,1,32,126,128,44,192,32,160,0,64,234,141,146,1,83,32,66,-155,194,130,195,183,211,213,96,156,194,6,225,54,1,96,22,252,107,0,225,-247,16,193,84,164,63,96,103,143,237,117,39,0,55,101,140,227,28,0,1,-64,64,77,13,107,111,2,95,49,50,122,210,68,171,139,56,64,26,0,57,-75,212,2,95,49,48,82,26,64,25,0,54,233,21,32,234,249,1,229,171,-47,224,194,1,229,173,3,65,188,233,17,6,65,19,64,25,137,43,3,95,-49,51,57,74,74,0,52,73,194,64,22,169,40,128,50,0,55,113,71,239,-249,2,64,33,198,123,0,89,199,252,224,2,0,133,38,224,21,7,224,24,-1,229,170,4,224,28,8,224,55,10,64,2,224,29,21,229,242,0,64,0,-193,47,225,55,1,192,25,96,42,232,241,2,192,57,224,99,6,224,39,9,-233,134,0,224,57,4,224,148,3,229,195,2,192,23,224,129,1,162,172,96,-8,160,5,3,95,49,50,50,232,215,0,224,178,8,226,44,13,227,211,4,-229,120,3,192,126,230,40,11,165,152,224,24,4,234,44,3,3,32,64,95,-55,79,82,128,0,228,84,2,224,8,0,128,54,239,17,15,160,79,3,95,-52,49,52,96,21,100,52,163,23,228,82,2,1,49,50,66,180,129,28,101,-54,3,95,55,50,57,110,38,0,50,78,132,1,95,56,189,4,68,106,96,-250,164,112,226,199,1,225,25,0,234,21,5,226,4,3,201,232,225,162,7,-225,179,0,193,198,227,32,0,162,214,233,156,0,192,100,192,1,199,66,225,-162,11,108,193,224,28,26,128,123,193,158,128,30,224,19,0,231,248,5,224,-75,13,239,132,4,224,36,16,238,11,1,1,95,52,81,184,224,0,0,225,-15,2,226,199,9,226,50,8,97,232,224,97,6,242,111,5,224,30,8,232,-103,8,224,89,2,192,234,221,36,194,67,176,63,98,42,232,189,7,159,232,-235,63,2,231,56,3,139,139,128,10,171,144,96,94,64,50,178,172,171,138,-224,84,5,192,90,236,82,14,96,146,166,121,192,17,226,60,23,224,0,1,-192,49,129,245,224,83,3,225,148,11,225,252,0,225,26,0,225,93,6,224,-64,1,237,170,0,225,87,6,225,84,5,102,27,2,49,53,54,114,99,166,-173,68,55,225,69,6,248,246,2,64,70,135,146,124,208,224,152,0,224,21,-2,173,174,185,140,167,69,142,251,128,14,153,164,3,95,49,53,53,65,109,-70,19,185,239,96,219,191,185,227,250,12,131,243,99,235,203,243,65,177,64,-66,140,64,0,75,253,84,8,97,8,225,53,1,193,139,232,8,7,128,179,-64,23,134,82,224,31,6,100,148,130,166,232,3,0,97,52,182,3,241,186,-6,246,39,21,96,33,96,90,241,123,3,231,204,0,182,62,234,35,2,246,-15,1,64,237,172,217,199,62,65,50,2,49,53,49,98,184,227,177,0,247,-85,0,98,158,130,64,197,162,225,28,2,186,184,224,183,0,224,51,2,96,-151,224,13,0,131,115,136,221,161,143,250,198,3,2,95,49,49,233,125,2,-66,11,72,111,98,60,65,248,1,32,95,65,174,4,95,51,50,50,32,162,-75,64,62,1,55,52,128,23,225,125,0,64,139,192,107,3,95,56,52,56,-233,230,2,1,36,120,105,229,65,1,141,219,98,103,1,75,52,96,2,130,-253,64,27,137,75,242,145,16,175,227,192,213,79,135,160,14,242,145,7,66,-102,233,123,28,126,119,192,80,239,36,51,236,18,3,64,128,137,121,3,95,-56,49,51,124,190,192,82,224,1,3,230,42,2,224,114,0,224,1,7,232,-155,1,224,37,17,224,35,4,64,197,197,4,64,135,243,19,7,131,223,64,-25,137,234,0,85,65,127,161,136,130,230,64,27,189,218,119,92,155,76,92,-224,64,25,131,234,225,217,1,3,97,100,105,99,187,195,64,34,125,246,0,-73,162,219,141,9,195,75,0,50,145,85,1,32,83,64,85,1,51,54,132,-19,131,26,242,46,0,65,40,96,171,100,90,224,222,2,130,223,65,98,227,-115,3,68,141,224,48,16,160,46,100,214,225,15,0,64,38,240,153,17,0,-53,128,89,233,98,0,227,163,3,232,252,8,67,134,233,250,5,192,126,238,-114,1,175,228,160,154,228,146,4,242,81,0,224,32,15,129,47,166,134,228,-209,8,122,67,225,102,0,225,100,1,236,250,0,230,241,2,236,192,0,98,-244,161,230,224,58,8,96,110,99,151,224,58,11,162,233,224,236,0,224,174,-8,131,27,232,93,1,238,196,6,96,122,240,95,1,225,78,4,224,159,2,-133,97,197,197,228,171,0,138,169,224,151,8,99,67,116,180,69,143,66,86,-71,112,110,185,0,56,92,102,1,64,64,226,168,1,14,98,97,100,32,115,-121,110,111,110,121,109,32,117,115,101,142,162,96,0,156,161,133,6,225,227,-4,143,82,0,53,98,154,66,59,242,150,3,65,253,160,158,194,34,225,34,-0,148,82,0,85,250,215,0,236,249,8,172,243,130,47,97,73,203,194,226,-53,3,224,2,0,224,45,8,225,119,4,226,222,0,134,32,236,23,1,160,-197,224,51,10,162,90,64,29,224,46,0,231,90,15,130,81,225,254,2,226,-110,9,225,184,3,97,144,2,95,49,53,124,220,224,183,2,240,188,0,194,-1,74,111,128,5,154,170,226,146,2,80,154,236,153,0,224,119,12,192,244,-224,119,4,224,48,5,225,62,0,162,176,225,65,18,224,169,5,227,146,18,-195,145,240,79,8,244,209,1,224,141,0,192,12,225,195,1,224,78,8,128,-196,224,222,10,192,24,0,85,219,179,227,86,21,254,130,5,224,197,0,224,-47,11,192,30,242,75,2,116,9,242,219,1,224,69,4,224,42,0,192,44,-192,193,97,81,96,16,174,76,227,164,0,136,28,225,255,0,224,69,5,192,-49,242,234,0,230,31,8,227,140,0,224,169,6,129,225,195,65,232,234,1,-160,136,227,91,7,129,196,192,38,160,28,161,49,249,184,3,128,129,148,183,-70,191,235,71,2,224,66,4,65,179,233,246,1,1,52,52,202,17,97,55,-172,141,204,140,128,61,225,4,1,160,81,236,163,12,64,67,235,40,26,235,-142,7,0,75,103,112,68,153,135,194,2,52,32,90,224,1,0,0,75,248,-42,3,70,209,113,231,73,150,1,95,56,233,148,4,13,80,114,105,109,105,-116,105,118,101,115,46,84,121,112,133,17,64,50,178,52,240,17,5,3,95,-51,52,55,229,28,1,3,95,49,53,52,96,198,69,31,152,2,95,132,103,-89,147,177,164,84,225,169,0,225,230,6,128,83,231,129,2,237,47,1,1,-49,53,128,6,135,147,0,51,156,175,193,238,229,162,5,101,250,67,79,129,-153,64,58,65,106,128,175,1,51,53,136,192,65,171,64,25,193,178,65,130,-90,49,97,149,142,76,0,48,65,119,255,32,1,198,144,98,124,129,84,238,-63,8,64,241,137,65,161,91,139,66,64,22,211,33,0,83,227,245,0,254,-225,3,228,220,0,64,42,137,77,0,85,128,98,98,31,0,54,170,131,64,-29,137,79,106,234,160,196,1,52,56,96,98,65,123,141,112,130,200,96,231,-90,34,203,214,1,49,52,104,245,3,95,49,52,50,247,139,2,101,90,0,-55,95,234,64,74,172,146,64,82,105,181,102,131,228,173,18,128,151,224,32,-18,165,148,232,210,25,224,33,19,132,130,228,191,10,224,25,0,0,85,232,-194,17,128,95,0,85,224,60,0,161,107,192,237,224,51,12,214,44,98,9,-0,52,98,139,224,45,6,232,239,13,131,197,230,11,10,192,24,198,11,192,-7,224,40,8,246,132,5,66,47,156,136,99,46,220,149,130,244,0,52,69,-154,130,8,77,137,247,155,5,224,176,0,253,105,2,104,125,224,199,0,167,-228,225,112,12,225,145,23,129,178,235,18,2,199,33,160,31,96,98,96,194,-128,22,64,118,65,170,192,186,1,51,48,65,83,224,177,4,133,16,165,15,-225,108,1,231,87,148,226,107,9,64,28,66,106,161,161,87,24,192,205,80,-196,143,155,204,14,198,131,218,64,140,204,224,253,3,128,0,101,40,227,84,-4,113,116,192,101,113,246,192,53,224,61,2,224,174,4,134,79,109,93,121,-203,230,77,8,67,245,134,58,98,82,70,165,66,98,151,224,65,188,184,208,-128,19,64,102,0,52,128,26,248,78,0,0,56,141,181,0,53,67,47,64,-24,184,77,77,107,86,224,1,57,32,235,120,2,1,91,93,70,89,64,37,-133,47,97,16,2,95,49,53,192,111,174,107,235,75,0,235,81,4,96,44,-224,251,2,64,27,160,10,0,83,98,109,95,40,67,25,64,174,211,20,160,-9,128,8,78,104,98,149,0,50,68,9,162,135,1,54,56,236,33,10,8,-99,111,109,112,111,115,101,83,101,78,207,161,86,65,30,89,213,1,53,56,-178,66,226,181,0,67,189,1,95,54,176,146,103,145,102,54,136,191,187,68,-64,222,243,27,0,224,149,23,128,143,224,142,1,7,104,97,115,70,105,101,-108,100,128,140,64,42,0,50,129,48,175,102,224,81,41,2,115,101,116,224,-81,12,64,225,97,152,131,190,0,51,65,219,224,64,2,1,95,56,117,169,-224,71,1,10,114,101,99,67,111,110,69,114,114,111,114,161,218,0,51,166,-68,164,37,244,162,2,66,185,68,4,160,167,0,53,124,13,252,3,5,26,-67,111,110,116,114,111,108,46,69,120,99,101,112,116,105,111,110,46,73,110,-116,101,114,110,97,108,46,193,136,128,88,64,62,101,7,0,67,180,173,252,-79,9,4,44,32,97,116,32,188,81,136,83,193,161,64,165,130,244,133,13,-165,237,224,160,3,3,95,49,50,57,144,70,83,116,0,51,161,89,0,48,-137,155,0,79,225,104,3,193,103,224,196,2,1,104,97,97,12,130,9,128,-110,131,73,67,233,103,60,0,85,129,108,131,68,234,134,0,247,229,3,64,-85,0,57,194,60,132,216,235,0,2,172,228,224,21,8,64,193,228,150,1,-132,25,232,173,0,244,189,0,224,56,4,196,205,96,62,235,87,2,139,61,-224,29,7,128,100,64,2,139,53,239,188,3,132,174,89,214,1,48,54,67,-133,235,76,4,244,60,7,133,91,67,171,70,1,232,235,0,165,215,211,144,-107,2,0,90,161,163,0,51,254,145,6,226,211,7,7,78,101,115,116,101,-100,32,102,66,215,11,115,32,110,111,116,32,97,108,108,111,119,101,162,228,-96,0,241,10,13,198,52,240,138,4,96,22,0,32,71,60,224,50,5,160,-162,224,147,19,226,140,9,4,101,120,116,114,97,128,154,2,40,115,41,130,-150,3,66,32,95,55,85,236,132,71,131,89,192,145,234,153,4,234,14,5,-193,189,64,36,234,137,4,224,22,1,226,52,0,102,44,131,201,96,18,96,-30,153,61,64,26,247,163,1,254,232,7,160,0,64,56,97,189,132,234,1,-51,57,94,246,169,126,231,181,0,0,51,235,9,0,98,212,212,102,230,189,-0,0,85,104,191,229,21,15,64,61,70,48,84,133,164,41,64,21,203,57,-64,71,108,70,75,23,224,242,5,235,167,4,224,26,6,99,164,84,94,0,-53,80,151,227,173,0,197,188,160,53,64,255,227,114,14,226,131,1,200,208,-163,7,227,94,5,133,104,226,6,8,167,94,229,39,4,11,111,114,100,32,-119,105,108,100,99,97,114,100,226,157,9,138,117,224,193,1,84,84,200,57,-231,242,0,0,54,107,149,160,212,224,254,0,160,219,225,176,4,225,143,2,-134,117,67,73,153,175,64,3,0,75,64,163,203,246,64,48,107,246,64,88,-0,56,236,24,0,0,58,97,14,129,133,96,127,225,41,0,69,47,202,218,-231,160,0,252,161,4,97,251,97,80,96,152,228,69,3,224,39,3,64,32,-64,132,226,204,8,247,189,0,64,143,184,7,245,164,9,0,52,69,197,128,-93,148,80,96,26,75,197,224,78,5,86,186,96,41,227,48,5,64,94,200,-251,0,90,66,166,96,17,0,54,224,242,0,237,170,3,64,144,64,29,197,-177,168,100,135,19,65,72,64,28,130,249,231,141,42,0,103,231,141,14,0,-50,131,27,0,83,161,98,119,46,102,169,165,143,199,89,176,185,102,185,96,-117,102,188,228,82,0,230,172,19,4,80,114,111,120,121,165,32,224,156,3,-64,125,195,131,97,77,0,57,105,39,138,217,142,73,224,248,1,130,98,1,-95,56,240,83,4,1,66,64,168,17,64,45,111,28,0,53,71,134,96,212,-0,58,154,230,208,91,97,30,0,49,138,152,1,53,49,128,84,0,49,245,-98,3,91,4,2,95,49,50,72,91,144,239,64,36,160,155,2,80,32,35,-194,51,64,24,129,191,239,15,13,0,52,121,193,97,37,239,15,1,226,221,-9,208,110,177,61,130,228,231,26,3,85,241,229,93,1,101,71,109,162,104,-153,244,176,0,128,88,203,246,237,123,1,224,2,3,128,24,242,137,4,96,-2,165,58,65,121,69,32,239,204,15,64,205,195,250,247,81,1,245,79,1,-224,5,0,102,174,227,161,3,64,19,0,83,128,154,238,141,13,228,246,0,-128,24,128,127,0,55,134,143,220,35,67,88,198,148,193,71,1,49,52,197,-24,64,12,100,73,64,8,107,227,64,72,3,80,32,95,55,153,231,98,157,-2,95,49,52,111,118,96,20,224,0,0,193,89,161,92,65,38,66,25,180,-84,207,22,64,158,193,149,173,77,177,228,224,68,7,148,100,225,1,4,224,-172,3,224,11,3,64,234,96,181,128,179,192,159,224,152,0,130,2,244,117,-0,215,235,135,76,2,49,53,49,98,106,230,152,1,64,42,254,33,7,224,-164,3,248,24,0,66,187,196,93,226,142,13,128,61,226,116,0,232,172,3,-97,97,0,49,105,227,2,51,53,32,135,112,192,44,224,244,2,166,72,224,-56,2,71,211,129,134,232,74,4,64,140,173,200,1,51,54,224,138,1,1,-57,49,103,240,106,70,64,34,132,158,224,175,21,194,22,128,103,235,190,1,-0,48,196,79,136,237,64,83,230,200,1,64,92,228,125,1,224,96,15,193,-151,225,148,18,251,171,5,64,187,96,133,225,23,27,104,41,225,23,10,167,-79,99,160,68,21,64,203,69,109,128,188,64,33,211,172,224,185,25,192,35,-97,32,136,154,231,45,4,135,68,0,48,169,161,129,37,128,134,64,114,255,-32,0,210,93,3,66,32,95,57,129,65,128,82,255,9,5,64,70,3,10,-65,32,90,64,46,64,14,173,2,253,163,14,129,39,131,249,0,48,97,156,-106,66,240,230,2,147,78,163,118,228,135,0,0,85,228,44,7,0,56,230,-21,4,2,75,105,110,235,143,0,64,132,0,54,130,101,118,81,100,220,131,-238,168,86,227,222,0,96,9,66,57,164,66,110,102,0,95,110,174,224,6,-6,106,100,64,3,100,223,192,76,0,83,123,132,143,170,192,32,224,106,19,-109,71,224,108,1,111,247,64,114,224,108,31,0,82,224,108,26,65,70,96,-100,0,83,172,89,224,110,6,160,103,224,117,2,224,106,9,224,63,3,224,-113,2,173,139,151,14,192,147,224,40,0,224,108,18,224,115,2,128,67,224,-61,13,160,106,3,95,51,50,48,225,219,2,31,92,34,115,114,99,47,77,-105,99,114,111,72,115,47,84,67,77,111,110,97,100,46,104,115,92,34,44,-50,51,55,58,50,0,51,237,136,2,130,51,67,92,199,143,1,53,48,231,-157,3,1,53,48,74,162,224,13,1,0,52,224,13,1,0,53,79,204,192,-11,0,57,224,11,0,66,77,197,64,74,9,73,242,64,19,172,143,132,35,-231,197,1,96,61,101,230,102,86,130,222,64,47,132,212,224,47,11,224,57,-2,0,54,99,17,160,57,224,64,6,242,197,1,224,54,7,224,152,1,224,-53,9,242,28,0,224,2,0,131,184,241,72,2,228,225,2,231,204,5,70,-68,227,246,0,239,215,3,224,50,4,71,0,229,14,4,64,55,229,253,11,-64,22,0,57,128,149,228,202,1,72,243,128,71,254,163,2,232,203,4,133,-17,96,112,64,0,192,44,130,230,249,242,5,160,59,196,230,233,10,0,160,-94,130,186,68,16,132,84,224,96,4,96,17,224,137,1,164,158,224,38,4,-96,35,224,75,6,192,37,193,20,96,150,97,35,225,20,9,0,56,99,6,-225,20,4,192,112,156,188,128,85,252,83,1,230,121,11,225,160,6,0,57,-224,71,5,192,73,96,26,239,216,7,224,100,72,192,14,162,135,224,17,0,-224,15,0,224,133,3,224,47,2,159,74,164,170,226,128,31,64,115,224,104,-1,224,141,3,224,143,0,224,19,2,191,173,226,13,6,98,68,128,32,226,-24,2,129,175,131,12,0,64,162,103,224,73,1,234,199,8,226,108,2,224,-37,1,224,131,18,224,70,0,195,112,192,136,224,119,0,134,216,124,89,184,-185,96,5,64,0,226,87,9,226,93,12,231,222,7,199,228,130,115,242,87,-0,126,70,64,74,248,63,11,236,82,0,224,189,2,224,21,15,160,132,248,-107,6,201,103,192,0,254,174,2,252,222,8,226,0,57,69,155,100,81,228,-224,0,226,212,10,196,57,128,12,224,94,6,160,222,192,86,66,173,81,205,-2,49,52,57,204,53,192,54,129,202,164,193,96,119,136,245,128,243,232,140,-6,12,99,97,110,110,111,116,45,104,97,112,112,101,110,102,156,64,48,246,-26,0,237,144,1,64,13,224,144,3,64,95,250,144,1,128,1,162,86,197,-6,226,60,0,192,34,67,181,224,46,0,237,142,7,224,178,1,161,23,226,-35,6,236,186,11,0,57,65,177,64,38,0,79,236,114,5,229,252,30,224,-103,0,75,227,71,94,0,50,159,23,96,93,0,52,148,21,84,31,66,57,-0,67,64,35,0,56,244,30,4,225,137,0,64,18,225,82,1,5,83,117,-98,115,117,109,119,187,11,32,99,104,101,99,107,32,102,97,105,108,101,201,-243,226,93,7,65,111,0,54,199,47,224,227,2,3,95,49,48,55,224,173,-0,77,47,131,15,241,213,6,95,173,96,66,135,247,2,75,32,89,97,120,-65,49,134,162,252,171,0,134,95,64,218,166,16,254,133,4,225,112,1,228,-59,7,97,214,84,120,161,41,226,3,6,244,41,0,64,60,238,96,8,116,-65,129,172,230,74,7,71,219,184,184,224,0,1,225,249,3,224,136,0,240,-76,2,188,235,0,67,232,14,0,197,10,230,221,0,229,69,1,226,47,7,-195,147,226,85,3,226,129,4,192,36,128,177,224,179,7,228,2,0,164,225,-224,191,3,242,133,0,160,168,225,14,40,164,150,65,81,76,214,224,0,1,-224,42,5,0,80,212,179,162,55,137,216,64,80,232,155,1,108,205,229,141,-11,228,91,2,230,31,8,163,45,194,32,64,112,129,78,160,174,224,197,0,-240,239,1,225,37,0,224,27,10,227,125,0,162,107,230,1,7,227,156,8,-68,25,232,117,1,129,3,225,39,8,207,210,225,151,6,226,160,31,228,27,-0,65,57,138,226,250,117,12,227,118,3,117,99,0,57,109,230,1,52,54,-129,152,225,192,13,65,52,96,159,129,245,166,190,130,50,166,90,184,44,160,-71,160,13,230,134,1,64,149,207,240,225,83,4,118,104,224,115,8,224,186,-0,158,125,249,122,3,160,117,98,155,181,1,160,14,2,79,32,35,64,20,-97,9,156,18,0,50,101,66,192,127,139,129,225,217,11,246,110,4,227,168,-1,170,105,228,100,0,96,42,114,45,193,38,0,52,146,213,75,229,160,105,-96,58,225,239,2,96,121,213,32,4,52,56,56,32,58,128,24,226,217,2,-230,81,1,129,98,97,111,132,197,134,96,226,111,0,226,114,0,199,122,192,-204,224,50,2,132,248,249,229,1,227,41,6,171,67,224,172,1,224,60,10,-192,203,224,32,1,228,181,8,224,34,9,135,30,160,77,167,25,232,12,5,-192,231,231,53,4,227,173,2,192,82,128,21,129,66,226,129,1,224,101,3,-235,58,8,225,61,0,225,62,2,85,170,92,167,150,5,224,24,1,142,241,-102,219,0,54,252,189,1,226,124,0,132,95,224,133,11,224,18,11,224,23,-0,234,156,8,246,36,4,96,182,133,8,104,110,224,13,5,224,56,12,224,-57,3,235,60,3,228,87,1,228,119,6,192,184,160,58,134,16,64,9,226,-192,0,224,103,5,129,23,224,42,1,197,35,193,28,241,226,1,253,85,12,-225,81,0,165,145,162,88,228,251,2,225,183,1,225,227,13,96,195,227,133,-8,247,150,0,167,214,226,239,1,227,6,4,96,35,224,17,9,225,52,2,-65,165,67,157,241,17,1,225,69,1,171,146,64,220,96,133,253,204,5,138,-54,6,32,117,110,105,102,121,32,136,216,228,117,4,2,49,50,54,132,4,-224,55,6,3,32,97,110,100,128,47,192,34,224,236,3,162,3,226,66,9,-68,17,138,196,234,147,1,229,180,5,0,52,129,227,193,76,64,16,128,93,-64,70,69,21,64,66,217,49,64,19,153,15,133,60,1,49,52,116,142,64,-34,0,54,96,34,250,28,3,10,105,109,105,116,105,118,101,115,46,126,34,-80,16,96,42,250,19,0,135,246,224,9,0,197,207,64,38,231,155,1,230,-101,12,0,52,146,97,235,44,4,134,224,64,142,0,50,162,201,229,38,6,-65,16,229,160,0,226,86,8,228,58,32,235,204,7,133,167,0,57,235,67,-6,160,39,229,226,6,66,248,107,8,110,2,102,159,131,38,226,59,33,4,-121,99,108,105,99,226,53,10,110,92,66,20,252,173,0,226,63,9,0,61,-226,61,17,229,96,5,233,125,7,225,113,1,192,216,0,67,129,112,224,193,-0,192,192,161,112,224,132,0,161,122,247,140,3,227,147,18,225,6,8,126,-140,128,141,163,27,1,52,56,101,80,224,217,6,5,101,114,114,111,114,58,-161,22,96,113,222,182,2,67,32,80,224,40,2,3,116,121,112,101,64,36,-224,17,1,0,107,214,80,224,18,1,3,115,111,114,116,224,18,6,4,114,-101,97,108,109,156,143,96,128,236,112,47,65,68,0,58,130,46,153,28,0,-53,140,115,235,147,5,226,150,3,129,201,226,78,1,167,67,225,48,1,224,-39,21,202,163,193,180,234,165,0,224,36,4,130,13,231,135,17,98,29,130,-203,128,107,205,208,130,199,250,156,1,230,221,3,140,13,0,90,64,208,0,-90,64,49,192,25,224,100,8,237,42,2,0,75,179,138,169,29,165,153,224,-215,10,230,254,2,224,79,8,236,242,9,64,29,128,34,160,25,64,106,128,-11,2,95,49,50,65,163,154,74,129,164,100,169,65,170,164,239,0,51,64,-11,68,239,0,49,65,225,0,52,118,241,0,51,156,76,64,40,133,24,78,-60,96,165,132,88,196,81,196,84,163,85,236,58,7,200,49,140,54,148,175,-99,35,235,186,9,225,82,1,231,174,3,237,34,5,67,118,80,216,106,208,-2,49,50,55,163,229,64,45,141,231,237,105,1,225,161,6,130,123,235,254,-6,192,63,160,232,0,54,163,82,161,136,143,228,236,5,24,87,109,236,246,-5,237,191,9,242,178,2,235,239,12,64,0,224,53,3,64,141,134,73,4,-83,32,85,32,95,127,250,1,90,32,76,198,0,89,249,35,3,129,143,97,-127,227,80,1,231,202,5,226,86,6,212,195,226,127,0,224,46,21,253,218,-0,133,137,224,47,2,224,44,10,225,243,1,168,84,227,138,49,162,187,96,-11,160,238,227,42,0,160,92,160,135,224,13,0,232,194,0,225,6,0,224,-53,2,224,175,2,140,138,0,39,241,194,0,97,132,0,48,241,186,8,96,-59,226,217,3,226,230,4,127,187,129,209,193,75,64,30,129,37,98,59,1,-49,52,91,255,4,64,95,53,54,53,148,119,0,90,64,49,222,214,226,19,-4,224,35,1,194,171,166,122,136,46,160,0,128,121,64,172,0,50,160,172,-64,11,194,118,96,145,144,111,104,225,192,10,178,4,242,254,11,230,134,3,-96,171,97,10,160,211,224,57,0,130,167,1,56,51,169,108,1,67,39,66,-129,64,137,149,116,226,130,3,128,161,247,20,1,193,21,161,19,129,190,107,-175,100,109,3,49,49,55,57,225,118,3,129,84,221,38,239,4,1,227,34,-2,229,11,11,226,53,2,96,180,0,52,160,169,139,244,226,132,13,207,171,-196,104,224,77,0,239,196,1,209,234,228,145,5,235,252,14,207,223,227,37,-0,64,12,129,174,0,48,91,47,224,11,0,111,246,64,32,2,79,32,64,-193,143,198,18,224,198,5,0,55,236,198,1,226,205,1,225,101,1,227,83,-5,128,42,227,208,5,224,39,10,231,83,0,173,55,116,8,128,50,160,33,-169,87,178,137,64,177,65,94,97,136,192,141,225,129,8,230,221,10,227,221,-11,224,37,1,229,222,1,64,231,145,129,128,98,64,15,193,190,128,69,97,-79,224,166,8,97,27,224,75,8,133,251,231,161,9,98,88,0,55,195,237,-0,54,226,117,5,96,41,1,95,51,66,53,234,79,8,3,115,117,98,115,-108,198,8,109,112,108,101,109,101,110,116,101,236,158,0,81,29,2,49,50,-54,226,172,1,69,177,203,212,179,224,66,4,64,22,0,51,234,27,0,1,-80,32,129,7,0,80,135,129,202,52,1,80,32,101,151,0,85,128,21,137,-216,169,58,99,55,129,216,130,96,228,234,3,129,226,128,16,176,234,245,208,-3,226,11,1,227,154,0,227,5,10,229,48,2,227,197,2,226,106,16,231,-113,0,161,145,232,191,15,0,50,161,26,160,24,225,195,9,0,50,226,107,-1,229,237,0,193,179,160,10,217,162,160,167,224,43,3,224,223,1,224,226,-20,230,191,0,224,227,22,224,153,5,230,199,0,224,143,4,64,141,160,43,-175,78,64,13,65,9,171,186,228,174,8,224,93,2,228,180,12,224,242,25,-225,89,1,228,167,11,224,244,1,236,219,5,224,13,3,228,185,14,224,44,-14,174,100,194,102,197,189,228,211,0,224,155,0,228,180,3,225,142,7,193,-145,224,98,0,228,134,13,226,205,3,161,151,224,49,0,225,210,18,205,117,-129,126,128,26,226,132,2,225,201,4,237,210,2,225,101,0,232,15,4,224,-19,5,228,221,30,224,179,0,230,97,1,224,236,17,228,103,0,229,157,1,-224,53,26,225,93,0,192,29,229,79,14,225,199,8,225,21,0,129,186,129,-194,134,114,68,36,231,206,7,225,7,4,227,32,1,192,56,225,25,3,128,-36,227,244,1,160,105,64,146,250,251,5,128,31,130,5,224,27,6,196,8,-152,66,201,126,237,89,2,224,4,1,128,116,229,152,14,9,102,114,101,101,-84,121,86,97,114,115,175,18,229,144,7,97,50,166,88,208,10,2,85,32,-65,101,100,100,65,0,75,134,108,174,181,133,120,142,246,96,32,0,58,131,-198,1,10,65,190,95,254,101,1,128,246,128,180,119,95,0,56,166,124,2,-54,32,35,125,108,247,57,7,7,64,95,53,54,54,32,95,50,80,2,162,-13,224,67,11,233,161,4,1,95,50,141,137,1,54,55,67,235,64,4,1,-49,50,65,240,64,150,189,174,5,50,48,55,32,95,50,85,160,128,38,3,-64,95,50,52,108,137,160,12,88,195,1,95,50,176,170,2,54,52,32,122,-28,64,27,64,6,96,155,64,8,0,54,224,23,11,1,50,56,132,199,128,-72,0,56,224,98,1,64,126,253,252,0,98,33,227,126,1,227,251,5,162,-132,119,241,1,52,50,246,68,0,243,159,1,64,8,135,243,65,220,80,76,-161,152,193,188,96,85,74,200,1,49,51,161,60,224,64,2,64,50,0,53,-224,50,0,139,21,162,39,78,182,129,233,128,0,224,114,90,66,200,224,114,-3,224,43,6,224,15,7,65,69,0,54,193,196,0,57,66,42,1,51,32,-101,149,128,9,4,49,49,49,52,49,111,124,64,40,206,4,132,52,180,218,-224,196,13,196,66,130,60,160,191,64,206,143,18,131,18,224,13,1,224,192,-17,128,81,64,125,136,208,0,95,121,116,64,44,213,31,0,54,108,125,71,-193,64,24,250,151,0,0,53,160,80,0,51,76,183,2,95,57,50,174,201,-64,45,192,57,0,53,98,144,192,57,131,113,196,175,78,232,156,191,64,171,-199,110,192,7,143,8,188,223,224,32,9,255,138,0,103,144,0,51,98,175,-128,0,0,58,128,117,122,64,100,36,0,53,76,214,147,191,187,64,64,34,-209,14,73,163,65,34,137,141,64,36,96,22,244,47,8,179,0,251,8,12,-176,132,166,223,140,32,164,250,1,95,54,81,79,101,76,0,90,150,138,237,-228,0,164,22,224,101,4,96,7,133,116,248,174,4,246,196,1,65,86,243,-131,3,0,48,192,79,0,85,112,47,224,28,14,96,219,130,133,132,139,114,-3,161,104,210,8,1,53,52,242,8,1,238,51,3,197,179,213,32,96,237,-64,80,130,173,7,95,56,49,51,32,75,32,85,230,218,0,224,1,5,142,-30,160,0,224,34,13,233,0,2,96,0,64,158,168,242,64,102,130,150,129,-2,143,7,1,53,50,129,173,130,163,230,40,1,2,100,105,99,84,233,64,-26,245,161,1,253,63,9,160,134,241,183,5,97,142,65,118,98,115,64,13,-246,136,0,64,7,64,117,186,250,253,41,7,64,148,1,10,65,125,79,0,-54,101,212,64,19,188,195,224,123,2,0,50,64,200,0,83,83,51,135,250,-130,100,225,229,3,128,148,0,50,161,231,3,83,32,95,51,110,22,193,159,-120,158,193,159,254,248,5,83,205,80,212,64,57,2,95,49,53,90,138,106,-162,2,50,50,32,200,146,64,64,181,174,65,4,166,250,82,101,224,1,3,-0,75,233,173,0,128,219,64,50,225,227,3,66,99,225,194,27,224,35,26,-224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,-5,224,11,2,192,8,96,5,226,158,2,224,0,2,65,44,132,61,3,95,-57,51,50,181,129,64,20,0,54,193,108,0,52,192,2,96,59,64,26,131,-64,0,67,145,81,231,79,1,64,109,234,85,5,228,96,0,224,33,15,172,-196,228,130,3,224,33,7,128,67,234,91,11,192,25,112,7,250,13,5,217,-41,132,172,0,80,64,252,226,118,2,229,39,15,228,193,10,64,26,101,136,-227,115,3,96,0,0,85,224,145,0,64,98,0,95,71,141,1,49,50,67,-191,233,57,1,229,199,0,96,70,99,19,245,147,3,64,65,224,40,11,64,-67,192,146,64,0,224,11,2,225,4,8,129,98,68,196,115,170,224,72,2,-70,222,64,57,224,198,0,192,78,235,217,1,225,176,9,225,175,23,204,103,-237,175,8,192,24,139,127,180,33,128,12,226,32,18,225,219,16,225,218,2,-84,145,225,124,5,238,170,11,224,47,19,96,0,224,50,13,225,130,0,226,-12,11,224,24,14,129,178,224,98,2,247,207,3,224,132,17,248,225,4,67,-69,253,92,1,1,80,32,161,199,145,113,65,178,3,10,65,32,80,72,207,-66,12,251,178,0,71,244,225,104,1,65,193,177,188,66,91,231,35,20,249,-44,3,225,10,0,2,95,49,51,67,67,64,30,104,135,64,72,165,255,231,-27,13,231,19,0,224,22,5,224,1,1,229,76,127,228,234,6,0,58,129,-0,250,71,0,0,54,145,15,73,254,1,49,51,65,121,193,2,64,40,134,-57,196,247,230,90,0,64,26,133,39,130,51,226,71,4,2,95,51,49,65,-213,0,85,215,31,224,32,15,196,172,96,38,129,196,224,41,3,131,183,128,-41,227,75,2,128,33,68,153,0,49,65,232,78,148,0,49,232,61,2,1,-61,62,222,78,224,22,4,255,245,2,160,33,224,91,5,1,95,49,98,137,-0,67,177,49,225,43,3,0,54,130,4,1,52,56,103,243,97,44,111,37,-96,132,96,7,77,143,66,77,66,66,99,26,224,6,3,224,33,0,64,13,-128,39,224,33,21,160,26,224,40,3,224,33,13,224,40,3,3,64,95,51,-48,100,225,117,245,64,182,134,150,0,75,98,11,254,221,17,98,39,0,83,-64,208,96,39,111,186,128,10,239,189,5,22,97,115,115,101,114,116,84,67,-77,111,100,101,58,32,101,120,112,101,99,116,101,100,61,255,242,13,175,215,-96,142,160,190,139,231,0,79,96,18,0,51,160,8,1,50,48,192,8,0,-49,248,232,2,224,122,8,4,44,32,103,111,116,128,105,160,90,160,85,225,-162,1,132,60,1,75,51,68,35,64,94,108,55,3,49,57,32,75,191,107,-3,95,50,57,57,224,81,2,5,84,67,69,120,112,114,128,81,224,25,7,-0,84,191,140,224,26,10,0,75,223,149,224,26,9,0,83,223,157,98,121,-70,252,128,163,65,117,224,12,0,64,156,132,192,122,202,1,49,52,231,35,-0,65,3,86,225,0,57,66,243,135,189,3,49,52,51,48,197,31,157,58,-1,56,57,157,136,225,30,6,15,77,117,108,116,105,112,108,121,32,100,101,-102,105,110,101,100,209,93,1,56,48,99,243,1,95,52,117,213,64,123,182,-164,2,56,57,48,97,39,205,200,64,124,3,56,32,64,95,77,54,0,58,-96,136,192,162,112,234,250,58,0,194,139,132,94,141,218,193,136,196,116,250,-70,0,224,2,1,194,102,200,27,64,16,96,20,194,185,128,10,80,251,64,-125,254,225,0,226,178,15,226,207,15,199,36,224,31,15,242,101,2,235,180,-8,64,31,148,119,179,43,232,250,8,101,42,65,158,162,80,78,16,68,128,-167,10,125,236,96,20,224,100,19,1,52,49,192,100,140,165,231,77,1,224,-183,18,167,75,129,65,0,66,112,75,224,185,12,224,214,13,98,81,195,160,-224,140,10,232,29,9,64,25,0,57,98,20,238,118,2,79,252,210,193,196,-139,99,191,163,189,96,7,98,170,68,65,249,141,3,2,99,99,32,227,30,-3,210,241,96,92,129,69,161,74,131,53,128,23,1,49,52,131,54,128,13,-178,219,192,12,100,87,194,212,64,7,130,173,178,49,252,234,8,226,120,0,-175,0,145,129,96,0,201,183,128,29,2,52,50,52,241,130,0,177,114,160,-6,64,103,133,78,77,109,71,10,98,246,64,22,132,121,210,111,224,123,33,-96,20,244,100,1,224,106,4,132,192,1,75,50,81,221,64,15,132,51,1,-75,50,180,228,65,111,101,217,64,133,64,15,213,3,237,252,4,0,58,97,-198,195,225,105,5,78,95,137,0,0,49,238,132,2,64,40,238,31,6,130,-140,224,1,1,239,253,1,224,25,7,192,1,232,234,101,232,208,5,64,192,-244,225,0,66,242,249,215,1,1,51,57,66,44,0,48,118,181,86,162,0,-79,132,198,0,57,98,130,0,49,65,40,0,79,129,250,72,9,97,165,115,-5,96,33,131,9,81,77,1,49,52,106,143,214,131,96,112,0,54,129,49,-96,48,3,95,56,52,56,232,106,13,226,247,0,64,50,130,65,224,39,12,-166,89,64,37,203,7,224,203,24,66,189,0,79,64,181,224,210,1,1,51,-57,97,21,158,170,128,22,150,75,0,48,68,5,96,191,224,52,9,1,52,-48,98,6,224,52,1,96,16,224,52,24,135,215,224,52,2,104,153,224,52,-22,100,101,224,52,3,145,207,224,52,1,128,27,128,52,0,52,126,199,224,-45,3,161,140,64,175,225,140,0,130,44,225,194,15,97,82,236,64,2,64,-36,97,183,1,52,49,69,106,96,121,224,12,7,96,141,64,43,167,47,3,-49,52,48,57,96,59,231,48,2,67,205,128,6,64,5,129,123,132,198,64,-164,96,62,71,126,128,46,128,36,119,153,114,151,64,28,163,113,96,173,64,-15,165,95,109,59,64,15,194,95,193,57,0,52,128,54,226,67,18,0,45,-74,214,64,35,130,65,224,35,12,1,78,97,179,89,65,120,224,36,15,5,-83,121,109,98,111,108,160,39,129,47,224,39,12,8,67,111,110,115,116,114,-97,105,110,192,83,193,47,227,19,21,233,69,0,64,50,129,82,224,39,12,-169,136,0,58,130,196,100,158,1,52,55,193,104,64,21,161,66,2,53,50,-50,224,64,2,6,98,117,105,108,116,105,110,64,96,76,64,64,3,64,43,-214,17,108,111,142,38,67,79,64,20,167,27,0,57,144,32,154,13,1,51,-57,71,21,1,51,57,69,44,1,51,57,133,80,224,21,12,64,70,181,64,-76,31,134,5,0,90,69,106,224,9,0,176,212,0,50,83,206,123,81,64,-60,199,157,199,118,171,189,128,85,64,84,129,196,77,66,240,146,8,0,83,-168,158,255,147,3,73,139,120,152,138,48,135,241,237,115,6,231,152,4,5,-103,101,116,73,100,101,97,186,182,118,224,142,3,1,85,32,123,207,64,136,-130,40,65,32,70,235,216,6,65,4,129,60,187,172,64,32,110,59,0,56,-74,87,2,64,95,55,88,86,64,39,248,71,1,230,131,5,0,51,122,230,-230,131,0,104,168,230,131,7,216,45,224,1,11,239,92,127,224,23,14,224,-20,11,224,17,8,224,14,5,224,11,2,244,156,11,0,58,129,50,225,76,-14,231,208,4,106,18,231,208,13,167,202,224,16,1,224,1,5,225,85,170,-225,43,8,64,255,208,155,1,75,51,247,24,15,64,37,0,54,192,37,0,-50,144,220,224,34,4,64,32,233,244,5,96,2,192,26,227,160,0,227,104,-3,64,135,235,81,2,99,68,129,125,235,217,10,172,45,139,181,1,51,54,-236,12,2,141,57,65,214,107,82,1,49,49,70,4,195,217,160,127,195,151,-226,12,0,97,28,242,227,0,1,51,56,70,204,242,227,8,0,57,72,184,-64,29,226,41,0,131,199,97,3,248,68,17,64,40,206,61,226,82,0,180,-212,224,1,11,226,70,170,224,17,8,224,14,5,224,11,2,192,8,227,164,-11,97,41,200,39,224,1,15,225,29,5,225,68,245,243,110,7,97,82,164,-227,0,50,91,147,71,174,198,140,66,230,236,233,2,226,173,15,96,42,199,-241,160,70,103,71,64,108,64,75,64,31,0,54,130,206,0,49,78,143,64,-15,131,234,99,65,1,49,49,81,42,96,162,171,123,0,49,143,70,96,17,-1,49,49,113,135,176,34,0,55,120,159,67,92,66,14,67,222,0,56,177,-248,0,48,64,98,160,140,246,220,1,148,195,152,1,248,77,11,148,92,224,-25,6,106,201,224,25,12,74,147,64,80,231,238,5,185,58,191,150,104,243,-231,76,1,149,109,161,139,102,14,239,6,3,65,147,241,3,1,160,119,241,-204,6,206,237,128,7,96,54,128,148,174,229,228,111,1,112,176,96,32,65,-122,129,37,228,204,2,64,12,131,65,128,74,2,95,49,49,65,42,161,132,-65,77,165,29,1,49,49,69,138,2,95,49,49,147,45,161,148,154,94,96,-0,224,164,3,159,181,64,0,226,125,0,133,79,0,53,72,168,128,229,0,-39,128,145,224,196,0,224,110,3,161,229,79,169,224,100,0,160,186,64,157,-224,120,5,160,99,148,251,128,39,96,111,0,89,232,186,0,176,12,224,119,-0,224,50,0,161,44,96,50,96,227,229,229,2,73,205,243,254,0,160,103,-1,95,50,69,217,112,46,254,29,13,0,95,133,213,130,227,76,107,235,129,-3,1,36,102,137,234,64,122,0,89,224,150,0,192,237,64,138,82,32,94,-41,244,97,8,1,36,120,245,124,2,255,52,1,195,16,224,150,23,242,125,-0,254,219,0,139,6,192,173,241,55,10,226,165,2,130,89,193,56,226,227,-0,243,21,0,64,1,67,84,226,208,3,128,10,65,130,251,29,2,225,241,-0,226,235,0,209,148,231,95,8,224,0,3,227,89,4,176,21,139,113,195,-198,226,120,0,0,79,64,63,161,206,98,239,162,141,0,64,65,111,94,31,-65,213,0,50,220,233,235,157,5,149,73,68,217,224,29,6,131,203,160,29,-0,67,236,72,5,225,225,5,237,59,2,1,73,79,182,140,192,0,97,35,-130,135,130,218,64,5,99,68,1,52,54,224,66,2,9,73,79,46,112,101,-114,102,111,114,109,224,65,1,98,76,225,151,0,131,26,162,235,225,74,3,-0,50,111,220,67,102,0,55,85,195,97,239,111,79,176,177,98,210,229,164,-1,224,227,4,64,22,225,86,0,131,144,96,233,82,249,160,23,193,219,100,-161,137,28,1,54,52,128,38,0,49,75,22,226,173,2,0,103,224,251,5,-228,17,1,64,67,237,77,8,194,158,101,91,237,88,4,181,151,0,85,225,-225,7,196,51,132,210,229,5,1,64,146,137,93,0,54,128,177,3,95,49,-51,53,67,21,247,189,2,240,180,1,229,179,7,229,178,7,0,90,201,97,-96,11,160,13,224,133,1,128,9,64,130,229,81,7,225,214,0,2,79,32,-35,68,211,160,111,209,43,128,0,224,98,3,133,232,229,35,8,227,86,2,-65,120,162,215,64,2,225,246,1,224,127,8,64,0,229,252,7,65,163,1,-51,55,227,242,2,164,15,101,50,65,0,0,95,119,245,90,9,66,230,96,-168,225,10,1,133,236,0,54,106,225,64,71,74,220,65,101,96,22,0,56,-89,236,192,0,245,78,2,99,53,130,185,64,0,71,130,242,4,1,64,67,-64,11,134,207,97,205,1,67,39,91,4,5,95,49,56,52,32,95,72,45,-128,58,231,165,8,89,34,1,95,54,131,145,1,50,56,165,168,1,51,54,-139,245,1,51,55,96,116,118,206,64,100,139,47,166,146,225,177,0,128,116,-193,97,230,246,4,160,21,226,82,1,100,54,0,39,98,154,96,139,230,218,-1,128,61,156,128,130,75,192,51,225,175,2,231,5,1,224,29,5,230,227,-2,0,53,76,136,228,8,11,2,115,101,113,250,206,0,230,238,0,224,82,-1,192,13,194,7,103,251,160,196,128,92,108,211,103,19,195,177,64,5,164,-190,97,98,96,246,131,19,230,68,4,97,187,64,41,1,55,52,166,47,198,-71,232,11,28,230,246,16,230,244,1,198,93,193,42,160,87,231,3,46,65,-250,65,65,226,125,7,98,4,140,10,0,90,161,212,136,214,97,37,129,231,-166,26,225,227,143,128,65,1,51,54,67,123,128,79,117,156,166,1,67,3,-245,208,2,224,42,0,225,146,5,228,238,0,225,127,104,65,128,67,155,131,-133,234,82,1,226,68,10,226,51,6,215,179,96,206,240,0,4,236,114,19,-69,245,180,79,100,54,104,212,229,92,3,65,227,136,143,132,247,65,217,65,-15,154,77,64,55,192,162,199,111,170,134,225,114,0,129,99,115,102,118,165,-192,121,0,54,172,95,1,80,32,139,252,0,85,100,130,64,40,250,156,2,-225,100,0,96,106,0,80,134,169,193,192,0,83,234,178,35,64,11,0,83,-201,78,194,36,160,73,220,163,1,49,50,69,155,183,142,196,253,134,185,96,-124,128,34,97,132,160,34,230,161,1,167,250,96,195,187,96,1,32,83,128,-196,229,147,8,71,169,96,62,224,25,12,108,93,224,25,12,125,185,108,106,-231,244,4,181,77,97,156,64,134,96,195,245,89,2,131,82,104,151,245,111,-4,133,3,65,114,236,74,1,64,63,71,255,227,15,4,70,89,235,129,30,-3,79,32,35,49,91,220,167,17,226,249,7,235,120,25,96,0,197,167,232,-106,1,96,249,74,102,160,24,214,161,93,75,193,201,224,7,7,64,0,203,-135,242,238,4,206,96,169,38,225,103,9,225,253,0,224,131,4,128,130,226,-59,3,128,61,79,144,96,208,1,48,48,94,15,1,48,48,74,170,136,11,-96,0,64,51,64,35,116,239,155,23,224,159,0,192,237,224,131,8,96,62,-224,131,8,96,21,128,79,65,177,230,56,16,2,95,53,54,64,138,238,16,-2,224,42,14,224,145,10,139,204,74,8,225,91,2,160,168,131,69,224,171,-7,195,144,224,197,9,208,31,96,25,226,180,4,98,19,161,135,64,107,0,-55,234,14,0,106,122,1,49,50,103,70,193,244,138,233,101,129,198,150,163,-210,224,109,8,224,32,19,139,213,132,207,225,87,4,192,24,176,119,229,100,-2,161,198,224,49,8,96,107,161,137,196,230,102,91,1,95,50,203,53,227,-170,10,65,41,88,247,1,51,54,131,130,226,100,15,64,33,195,16,236,188,-0,160,24,75,159,192,59,226,186,37,224,140,0,196,150,224,37,10,96,255,-145,241,193,113,236,61,0,165,89,237,231,4,229,79,0,235,121,0,224,52,-22,180,126,224,52,6,224,10,0,224,52,13,233,77,0,224,41,2,192,229,-139,179,107,148,238,104,17,9,68,97,116,97,46,76,105,115,116,95,91,163,-2,46,43,43,237,112,0,128,83,230,87,3,227,210,1,224,0,6,196,117,-163,86,228,109,9,65,159,233,214,2,5,49,50,54,52,32,67,94,24,98,-218,64,15,143,188,162,220,70,43,139,227,138,140,231,55,1,110,236,227,181,-9,96,197,4,82,97,116,105,111,128,198,2,95,109,107,96,13,1,110,97,-92,251,64,0,128,201,127,12,0,49,142,196,224,17,4,65,124,64,117,140,-77,70,161,159,179,66,183,67,130,0,53,69,202,2,95,54,49,76,54,102,-70,96,20,128,10,2,51,53,57,69,222,0,48,76,246,160,5,204,250,129,-29,140,107,96,66,165,211,7,50,49,52,55,52,56,51,54,163,69,224,219,-25,11,73,110,116,101,103,101,114,46,95,105,110,116,65,173,1,84,111,160,-17,224,222,2,101,72,237,100,0,195,127,233,217,0,64,237,226,152,0,224,-111,30,161,77,1,105,110,224,112,12,227,223,6,230,183,0,64,0,65,76,-173,53,129,76,131,138,0,95,93,153,225,9,3,96,145,195,86,103,57,97,-101,64,70,227,119,0,0,85,225,122,3,64,0,0,89,169,120,148,92,108,-133,0,51,127,177,225,149,1,224,92,1,229,158,0,234,151,2,224,170,1,-2,85,32,65,96,36,99,156,74,27,161,177,5,50,51,50,32,95,53,103,-161,65,225,208,246,129,176,64,220,140,13,3,83,32,85,32,224,107,2,128,-150,99,128,64,2,163,141,160,250,237,46,1,224,226,7,224,255,0,224,229,-2,99,204,104,132,137,237,83,113,128,26,65,69,224,12,0,224,156,0,3,-95,49,57,55,64,138,101,99,224,254,3,0,58,98,160,64,172,128,21,2,-51,50,55,75,10,64,22,139,17,143,51,170,211,224,194,4,64,184,132,186,-64,8,3,95,49,51,48,64,175,129,169,1,50,50,96,201,138,26,96,54,-0,79,227,251,0,202,241,110,52,232,78,0,206,96,177,107,170,66,64,85,-0,55,233,23,0,0,51,164,36,64,157,139,130,134,178,98,66,234,188,1,-165,74,96,13,229,24,13,196,164,128,47,165,27,224,13,0,192,63,224,64,-3,241,12,0,224,67,0,106,183,224,69,4,192,71,193,20,129,44,224,88,-4,97,42,231,109,0,192,178,225,93,3,193,7,210,198,147,1,1,48,49,-231,232,14,128,32,171,94,0,49,90,144,131,115,65,127,98,85,0,51,104,-142,1,48,48,72,174,233,93,1,225,144,9,226,151,1,178,250,96,89,0,-80,97,156,128,42,0,48,232,108,0,236,51,1,0,95,110,48,200,246,235,-218,4,64,0,142,225,160,248,135,66,182,0,181,180,99,124,114,107,236,99,-0,224,51,1,226,96,0,131,1,198,99,0,49,132,177,192,130,232,184,5,-68,79,225,113,0,193,200,225,87,14,65,140,129,144,224,16,1,218,1,96,-142,132,152,160,93,128,156,192,200,0,95,78,49,199,52,1,49,49,114,180,-224,164,11,224,17,3,231,26,0,142,6,96,29,226,159,0,132,121,0,51,-77,212,0,80,67,139,0,48,229,116,2,7,92,34,92,34,44,48,58,48,-101,93,161,97,96,219,224,41,21,132,187,96,0,69,255,0,49,234,200,3,-0,109,229,169,0,96,118,0,52,64,204,250,250,2,67,155,0,83,91,141,-225,58,7,180,7,160,239,160,62,155,39,96,11,1,52,48,66,151,212,95,-66,23,133,36,224,126,6,0,112,245,185,2,123,89,64,41,97,49,67,219,-0,54,174,228,132,26,251,63,14,131,143,227,210,4,245,86,4,66,220,202,-218,224,39,2,133,22,182,129,226,240,1,129,135,174,173,245,204,10,161,117,-64,157,239,107,0,96,152,128,105,111,163,65,0,144,229,234,11,1,177,188,-248,60,3,194,73,227,114,2,238,81,7,230,150,0,164,66,99,63,64,58,-97,8,165,107,250,65,0,154,145,243,31,6,96,14,140,148,101,84,204,177,-227,197,1,229,81,3,149,6,169,169,132,51,162,218,225,184,6,210,72,129,-38,143,247,0,53,173,82,227,251,1,65,38,143,206,100,131,0,49,105,248,-65,115,64,24,137,187,76,4,66,38,141,45,100,61,64,7,64,116,64,36,-181,184,236,194,3,194,4,193,57,133,214,97,22,100,41,194,170,96,45,202,-95,131,106,128,5,225,80,1,161,117,229,126,4,152,96,129,14,64,21,138,-1,97,141,98,250,133,136,1,52,57,96,242,144,199,193,6,120,253,133,124,-136,31,160,200,161,9,136,233,73,116,0,52,143,120,225,83,6,0,118,210,-132,64,72,98,248,165,36,164,204,164,225,224,179,0,253,151,4,228,207,0,-133,46,160,186,64,15,231,125,0,131,43,160,2,229,221,1,133,114,128,21,-64,43,67,44,224,35,1,128,30,65,210,230,55,0,211,253,0,80,73,42,-73,170,213,214,177,223,229,252,0,225,169,0,229,57,2,229,141,1,128,13,-237,71,8,210,229,192,192,231,147,3,161,181,64,166,0,48,225,58,3,0,-68,74,141,13,66,111,111,108,46,111,116,104,101,114,119,105,115,101,228,88,-0,212,220,224,249,0,245,107,4,65,132,129,28,245,87,0,225,53,1,129,-220,128,24,0,58,129,243,191,212,99,69,1,80,32,91,189,0,90,101,174,-202,133,64,11,0,50,149,228,244,250,15,250,214,1,255,61,0,192,0,133,-131,74,164,72,215,96,115,137,125,68,39,77,30,196,215,122,39,96,4,161,-252,196,60,183,128,64,47,216,209,229,183,1,167,93,226,65,1,194,243,107,-34,102,201,215,168,0,51,89,114,192,208,96,19,96,246,128,221,132,135,66,-29,161,233,224,144,5,224,37,0,163,156,226,197,0,97,247,199,234,192,151,-225,4,0,100,249,96,8,232,160,2,65,15,170,233,64,107,203,136,64,22,-128,53,65,35,234,3,3,163,210,232,72,2,96,144,0,51,102,168,224,28,-0,190,41,128,1,212,252,224,16,0,233,248,4,192,1,169,211,224,19,2,-65,198,224,16,16,197,223,232,80,1,193,235,192,21,101,142,224,163,3,143,-51,229,240,5,194,180,224,176,4,169,52,226,211,3,226,220,4,224,42,2,-228,33,0,68,111,70,89,205,221,224,60,4,248,69,2,194,18,128,33,224,-191,1,161,58,128,24,196,134,235,107,2,227,229,1,229,129,1,220,15,220,-21,96,27,64,42,67,194,76,170,249,236,4,224,100,1,192,198,224,71,8,-167,4,96,70,100,51,250,51,9,1,95,49,245,159,0,162,197,225,255,0,-227,148,13,241,70,2,195,159,161,201,225,186,6,129,173,224,0,0,129,89,-224,198,1,224,43,0,237,96,1,224,159,4,245,178,8,167,113,66,248,99,-46,164,250,96,68,224,53,0,103,126,245,221,4,167,163,224,222,0,226,220,-0,64,183,249,25,8,224,116,7,229,93,1,73,174,0,51,129,151,129,10,-163,189,196,156,224,20,2,162,215,64,0,67,110,0,54,134,199,73,216,0,-80,103,202,79,225,230,175,3,70,24,131,194,225,205,1,128,9,128,90,227,-11,1,64,60,215,239,94,12,0,57,97,174,2,52,52,49,193,182,111,176,-1,51,52,97,31,64,44,0,51,195,234,64,28,103,131,100,242,64,35,0,-49,128,139,136,49,250,125,13,225,207,4,166,248,64,0,64,62,0,48,128,-62,135,164,132,34,128,203,100,28,194,225,195,138,195,26,98,157,164,106,229,-104,0,226,48,5,229,76,0,160,171,64,101,199,224,100,243,246,50,0,1,-50,52,173,194,1,64,67,69,93,228,149,0,161,226,101,221,96,181,229,33,-0,0,58,129,5,111,182,67,221,1,57,49,105,220,0,50,176,145,88,219,-64,34,134,68,136,185,0,51,114,204,0,51,142,15,169,139,65,102,225,131,-3,224,169,1,64,38,64,93,3,49,51,51,52,95,73,64,22,168,196,146,-65,223,166,72,98,64,31,201,238,132,223,128,97,129,118,70,47,0,80,160,-213,240,77,0,228,123,6,64,72,131,23,192,33,227,166,1,224,27,0,230,-211,3,192,20,129,143,134,255,0,85,162,230,160,149,224,28,8,198,226,169,-21,224,29,6,96,98,224,29,16,96,20,224,29,1,100,60,130,38,131,185,-228,14,1,145,127,131,196,227,132,6,238,0,0,65,48,130,209,99,59,132,-82,103,143,232,44,5,229,197,2,236,80,3,192,7,236,22,2,107,5,225,-50,0,123,66,230,56,4,230,162,0,225,68,2,64,56,234,51,4,224,56,-1,224,19,3,224,62,2,161,22,111,176,230,32,3,160,108,192,28,64,16,-115,203,198,116,130,231,232,244,0,128,41,227,142,0,225,252,1,128,0,238,-211,8,27,115,114,99,47,77,105,99,114,111,72,115,47,73,110,116,77,97,-112,46,104,115,92,34,44,55,51,58,49,238,72,2,97,86,132,6,131,21,-64,129,130,212,64,135,0,95,67,141,64,34,131,234,236,128,5,64,20,75,-216,64,145,64,35,195,168,80,226,97,243,132,0,129,13,231,148,0,193,159,-81,38,227,159,4,160,40,234,114,0,235,15,0,160,239,0,49,213,218,225,-225,2,193,80,235,62,0,0,80,244,115,2,226,250,4,253,218,0,64,73,-0,56,64,37,137,29,192,7,167,108,192,60,97,112,192,92,64,131,96,130,-134,170,228,165,1,160,12,0,50,67,215,0,58,132,14,132,0,1,49,57,-96,46,132,49,64,30,128,22,1,50,50,68,23,64,22,193,40,96,42,160,-224,68,137,70,175,64,34,0,54,224,50,0,0,52,114,48,64,19,198,57,-165,87,194,103,136,223,224,237,3,164,15,225,46,1,243,55,2,99,124,96,-88,130,103,224,47,5,131,193,193,118,245,96,2,160,25,96,237,237,32,2,-133,138,199,40,229,246,0,226,226,3,233,25,10,160,24,236,240,1,232,199,-2,227,88,3,128,134,224,133,1,231,160,15,224,75,59,232,54,2,224,75,-23,167,158,224,75,17,227,152,2,224,248,1,229,156,0,181,249,117,237,137,-160,160,36,236,122,1,224,32,7,224,124,0,228,53,4,96,41,224,40,6,-224,41,8,224,11,0,160,48,224,47,7,98,204,65,209,64,7,133,108,66,-107,168,104,161,174,111,40,225,139,27,224,40,26,129,104,244,221,0,225,69,-23,128,175,131,59,96,12,224,6,1,194,200,224,30,7,224,31,1,187,171,-224,34,2,224,35,14,192,37,224,30,8,224,38,1,136,91,66,235,225,49,-6,65,46,134,152,0,75,131,222,201,85,64,1,171,28,224,10,6,225,144,-1,0,32,200,250,64,56,133,100,234,93,4,64,28,64,26,133,91,0,73,-64,95,68,48,3,10,65,32,80,96,11,232,173,0,177,161,128,157,137,229,-64,183,0,75,74,187,65,114,64,44,132,119,224,44,3,133,88,147,10,1,-52,51,250,179,10,70,55,0,33,134,47,0,73,96,234,68,248,162,25,133,-197,171,145,194,193,192,132,249,154,1,128,31,204,107,228,32,9,228,27,11,-231,40,7,129,54,228,16,33,224,63,0,163,116,227,254,32,128,56,166,88,-227,229,28,225,66,1,224,11,5,224,12,17,227,113,7,65,85,133,219,91,-38,0,50,74,46,102,104,72,251,64,27,244,21,1,237,47,1,192,27,130,-120,0,90,73,90,64,14,194,122,0,90,104,252,64,17,188,50,132,47,243,-197,3,234,52,3,64,5,128,25,245,45,0,151,122,169,179,89,28,0,52,-231,51,1,251,94,1,168,50,136,39,134,0,192,99,108,243,226,240,1,247,-222,9,128,21,0,51,126,59,149,57,64,118,149,92,237,149,2,129,212,109,-199,231,157,0,64,54,0,57,128,223,188,53,103,249,235,102,4,96,11,136,-135,0,58,128,46,225,7,3,198,188,127,9,166,184,246,78,5,96,223,160,-143,3,67,32,95,54,151,24,128,135,237,49,3,128,82,253,8,0,0,56,-82,133,118,16,0,53,94,195,0,49,67,185,96,180,65,0,2,32,95,50,-125,0,128,0,3,95,50,49,50,238,122,14,162,142,64,184,210,212,105,73,-193,57,138,115,230,165,1,192,176,226,233,0,151,244,200,165,224,40,24,134,-18,227,157,3,224,40,15,229,12,0,168,42,227,42,2,160,33,248,78,1,-237,148,0,194,104,252,8,7,184,174,101,89,0,48,160,89,224,20,3,225,-45,0,96,108,72,196,224,111,10,185,129,224,52,2,235,51,3,224,120,6,-161,17,224,158,3,225,29,25,172,131,224,39,24,170,199,246,105,2,204,94,-224,38,4,73,240,64,22,204,86,224,156,0,192,24,249,10,1,251,197,1,-224,40,4,201,186,64,243,105,149,203,186,1,49,48,80,95,128,6,85,149,-131,76,1,49,50,78,248,224,0,0,64,88,224,82,8,235,131,2,64,116,-129,221,195,24,1,53,54,93,63,96,91,226,240,1,1,51,48,249,241,0,-221,90,131,198,131,35,224,104,15,161,76,224,229,3,242,86,0,254,121,13,-162,3,224,41,4,226,125,0,104,72,237,56,1,146,3,197,154,128,196,128,-174,1,48,48,67,214,192,11,132,220,142,170,236,209,1,91,136,64,6,235,-220,0,160,0,128,72,230,79,9,163,101,161,141,226,108,9,225,166,1,238,-66,1,193,71,193,37,226,138,4,65,171,199,174,95,196,99,249,0,80,143,-5,133,208,64,155,168,93,160,23,72,35,64,24,204,30,97,68,69,177,65,-210,128,179,161,198,1,49,50,108,169,131,225,248,176,5,64,141,205,137,65,-1,144,161,65,38,231,236,2,80,243,199,13,243,128,0,224,25,9,138,94,-67,139,0,56,176,209,1,95,50,81,86,69,238,244,130,5,0,35,149,198,-232,124,7,10,116,117,112,108,101,67,111,110,115,116,114,174,170,85,3,64,-75,224,35,1,1,40,41,218,1,64,171,225,17,1,132,89,161,18,187,17,-225,123,0,161,163,120,201,227,108,1,65,212,164,245,242,177,0,224,52,0,-227,231,1,137,167,224,40,0,160,226,2,49,50,57,82,110,188,206,147,142,-194,249,130,108,1,50,53,115,152,74,130,0,50,157,175,128,58,181,219,239,-226,0,239,8,0,250,236,8,0,120,224,234,0,243,113,0,166,185,230,162,-0,225,32,9,16,67,111,110,116,114,111,108,46,69,120,99,101,112,116,105,-111,110,73,206,8,101,114,110,97,108,46,112,97,116,64,9,8,77,97,116,-99,104,70,97,105,108,129,100,135,14,0,53,128,84,1,50,57,114,218,70,-178,1,49,50,155,209,96,128,207,227,1,80,32,99,150,98,147,96,43,193,-103,161,53,64,65,73,51,103,133,2,49,50,57,153,162,97,43,240,71,1,-207,175,100,195,0,75,200,29,196,4,188,226,212,227,90,63,71,255,227,42,-0,193,68,167,182,0,50,138,95,224,46,7,255,208,5,1,57,51,103,185,-143,52,224,106,1,225,214,2,230,248,5,242,40,1,192,5,128,74,230,10,-1,224,55,0,230,25,1,96,0,128,66,224,1,1,231,69,5,202,110,64,-0,226,158,9,224,140,5,224,77,9,224,75,5,199,55,228,131,4,248,78,-5,216,18,253,189,3,231,176,6,96,23,69,92,124,236,224,116,4,192,83,-231,189,7,224,34,2,153,240,161,3,129,21,224,84,0,96,66,96,111,128,-17,231,70,12,243,124,6,231,26,8,235,217,2,224,115,5,224,165,3,138,-123,1,95,52,67,25,2,95,49,48,152,41,224,34,0,219,210,225,112,3,-249,42,2,221,217,131,144,234,137,0,128,0,99,203,241,68,1,237,182,1,-233,49,6,225,188,3,228,50,0,193,114,225,208,0,192,77,64,80,115,6,-249,224,15,242,182,4,1,50,57,128,214,223,71,192,10,234,116,11,0,54,-234,116,16,96,142,169,43,196,214,171,86,192,102,117,189,227,55,1,128,41,-226,162,4,64,27,129,84,231,8,10,243,161,10,233,173,16,224,129,14,0,-54,224,129,5,225,64,1,231,93,9,226,183,0,97,77,226,129,0,224,83,-5,231,117,0,160,85,243,244,16,224,81,4,163,9,135,146,1,95,56,187,-43,135,53,235,176,12,165,193,248,113,2,100,248,230,156,2,96,253,102,156,-96,228,224,25,2,96,64,160,25,199,201,231,226,6,98,0,236,11,1,193,-59,245,69,5,226,169,0,225,10,19,225,95,1,225,9,17,64,111,199,89,-166,109,128,6,134,37,64,5,0,54,230,164,2,2,115,101,113,167,171,64,-56,250,88,1,192,168,226,15,1,0,85,231,13,8,227,195,0,151,50,224,-13,9,132,44,228,70,0,128,197,224,66,2,134,2,141,236,224,65,3,160,-119,2,39,32,85,79,55,247,32,17,6,68,101,115,117,103,97,114,151,33,-5,52,49,49,58,49,48,247,35,2,227,212,3,129,85,227,204,3,64,0,-240,212,4,224,2,6,224,71,1,230,52,3,229,39,1,192,83,230,58,1,-224,191,1,224,197,6,192,10,111,127,224,85,11,229,68,8,224,96,4,224,-102,8,224,103,6,224,55,5,230,170,11,224,50,14,96,98,230,32,4,224,-52,26,224,195,3,224,31,11,253,72,2,225,95,12,249,116,13,224,23,1,-205,96,233,198,3,194,60,224,8,10,96,242,224,11,2,169,183,195,25,128,-68,228,148,8,225,154,1,131,114,230,85,4,192,66,128,11,226,174,2,101,-217,163,81,0,51,169,92,192,83,229,109,5,231,189,4,138,167,198,74,146,-83,236,170,2,192,165,225,6,1,128,204,140,228,228,25,2,76,236,120,221,-64,187,199,105,187,155,157,253,228,69,3,225,215,11,64,41,141,188,0,90,-209,238,216,87,237,59,4,204,205,194,177,64,77,196,126,229,114,1,192,209,-1,95,54,152,106,96,15,64,164,224,103,2,128,137,224,136,5,180,226,224,-38,5,66,54,1,95,57,251,27,4,226,96,12,226,179,8,248,76,2,224,-48,12,226,175,2,224,26,7,226,170,1,226,159,7,192,33,226,180,9,226,-155,26,226,134,27,226,48,13,130,42,128,35,224,122,3,128,86,226,16,1,-196,51,96,21,129,112,64,43,130,30,128,24,226,31,2,160,62,162,34,192,-122,226,37,9,193,73,128,46,175,176,128,36,255,253,0,128,110,66,48,1,-50,53,78,147,192,0,226,49,0,96,54,226,37,1,226,30,0,3,95,54,-32,85,226,11,5,109,119,130,10,64,47,182,239,224,0,2,225,148,9,228,-79,3,224,168,0,224,11,15,228,24,39,128,86,228,178,6,64,56,0,48,-230,243,4,196,214,227,177,10,226,60,9,85,250,0,50,224,62,4,226,63,-8,160,101,224,104,5,132,132,109,202,0,50,222,88,230,208,7,193,205,192,-1,224,170,10,226,192,5,97,125,161,59,143,220,105,6,109,233,235,53,0,-194,102,169,234,192,232,103,252,129,226,128,66,66,17,170,185,96,164,225,187,-1,128,141,232,42,5,64,17,64,49,64,41,160,104,162,132,80,127,130,82,-83,15,0,52,189,169,228,202,2,100,249,1,49,50,86,28,128,8,93,162,-80,179,2,49,50,56,234,148,1,99,204,182,77,128,167,96,17,192,93,224,-83,0,225,184,1,163,77,66,175,226,174,0,224,186,13,153,23,0,57,161,-134,226,209,5,0,83,161,187,231,117,3,226,229,4,164,241,97,57,0,85,-90,105,228,253,0,224,39,5,131,13,192,38,224,37,2,160,152,192,227,129,-122,160,227,0,90,111,21,1,83,32,82,5,161,219,229,246,4,244,111,2,-235,41,3,233,223,0,192,59,192,249,228,52,3,226,90,3,196,58,192,19,-193,155,224,111,13,224,59,5,165,127,225,122,2,238,224,9,106,193,224,55,-0,96,93,194,99,230,155,3,228,128,19,160,0,74,196,241,108,0,169,54,-97,101,227,112,0,160,203,224,216,5,234,30,9,233,190,4,195,53,129,73,-163,94,192,224,234,252,13,224,61,0,206,159,228,88,3,174,95,160,232,101,-182,128,97,160,101,187,225,1,49,56,162,3,0,75,64,7,96,4,96,13,-160,128,67,1,121,77,98,155,160,242,64,76,194,146,86,1,0,55,213,96,-2,49,50,56,123,12,0,50,128,84,64,8,140,244,2,50,56,56,96,68,-64,75,244,136,1,4,64,85,32,95,55,101,47,224,215,2,225,209,2,224,-21,24,224,236,0,239,96,5,166,73,224,60,6,160,49,195,241,64,250,102,-234,64,27,163,168,192,99,128,48,82,46,164,43,224,90,0,180,2,64,28,-227,229,0,98,66,96,29,117,55,96,90,1,55,52,97,94,116,219,64,14,-96,70,131,31,161,167,194,42,129,71,229,212,5,195,10,224,118,0,226,56,-6,224,25,1,229,226,4,241,87,7,134,169,224,17,1,226,69,5,232,155,-0,230,28,0,224,132,1,232,103,1,143,207,98,160,132,234,2,32,95,55,-65,228,160,88,128,135,208,139,192,249,192,0,130,83,130,74,247,249,0,128,-23,161,248,1,75,51,192,9,96,0,66,34,254,182,1,128,209,167,74,162,-193,192,5,235,38,0,224,209,0,86,103,187,159,96,17,128,208,251,179,2,-160,79,161,75,228,206,0,134,130,160,88,66,170,142,205,102,172,192,7,136,-183,162,223,134,35,1,56,53,129,167,97,70,133,54,224,14,5,2,95,54,-50,163,23,160,0,252,23,1,233,66,1,228,43,2,225,236,0,196,140,225,-2,1,98,99,64,115,235,64,3,96,0,113,222,246,14,2,0,110,142,155,-224,22,7,1,116,116,182,38,99,144,126,49,0,80,130,0,64,130,153,154,-131,202,183,148,0,54,132,29,0,56,87,146,129,238,189,59,225,189,13,64,-88,0,54,196,31,64,60,239,222,1,79,95,208,128,194,82,132,155,194,130,-224,7,1,193,21,160,59,81,74,128,57,161,207,112,209,0,79,198,104,161,-50,227,2,1,193,56,230,123,2,99,175,226,13,1,244,86,2,229,84,15,-229,86,0,68,231,230,164,5,224,48,11,225,164,3,229,98,0,130,163,143,-78,128,44,233,206,0,131,146,228,65,6,227,123,4,196,204,160,79,130,174,-224,28,6,160,104,96,97,131,88,64,47,237,97,2,192,94,226,75,0,128,-23,240,233,8,12,108,105,98,47,68,97,116,97,47,76,105,115,116,144,227,-4,53,51,54,58,53,240,226,2,224,0,5,225,156,21,101,2,225,162,0,-228,239,3,208,94,128,215,240,114,0,224,215,26,233,78,2,128,204,64,44,-154,161,226,10,0,224,39,12,64,15,224,142,3,160,0,66,171,243,69,1,-66,32,227,121,0,224,2,1,225,70,2,128,1,105,132,200,161,224,23,2,-192,189,224,26,0,235,186,5,229,88,2,224,52,0,228,128,1,224,74,7,-226,62,4,197,189,230,50,1,160,52,224,41,1,167,202,96,82,224,23,0,-224,17,6,96,8,128,43,251,135,1,133,171,251,112,0,245,48,0,224,93,-2,96,36,233,131,1,224,89,1,224,8,0,92,51,193,103,69,40,94,99,-0,49,243,254,10,1,61,61,162,77,96,38,158,132,1,50,56,236,64,0,-131,99,233,155,2,128,1,166,156,224,16,16,64,117,126,127,84,137,173,6,-83,201,64,145,253,233,1,253,73,1,224,1,1,132,146,245,184,6,225,212,-8,160,110,224,22,7,239,234,0,224,45,28,224,22,0,193,193,228,172,1,-224,14,0,224,51,3,179,129,193,119,172,154,189,159,225,107,17,2,79,32,-35,70,104,162,228,225,102,13,64,94,226,65,1,226,125,3,226,87,4,99,-87,160,50,192,0,160,142,199,112,231,228,0,67,73,214,118,1,80,32,103,-35,155,244,64,117,1,10,65,92,6,64,12,149,240,0,80,134,42,91,121,-128,3,70,6,2,90,32,90,166,125,232,19,21,139,110,2,95,52,56,64,-172,159,217,98,216,0,90,129,99,128,193,64,20,66,156,160,20,232,172,6,-237,22,2,64,96,236,251,1,128,65,194,226,1,85,32,224,29,2,224,71,-10,224,59,4,96,31,160,129,103,219,224,28,0,224,109,2,224,36,1,233,-62,7,69,143,0,48,65,201,142,101,64,232,139,100,226,45,5,66,196,0,-58,110,148,129,106,229,128,8,229,83,0,134,134,64,102,160,23,229,19,8,-230,34,1,64,81,233,106,0,119,36,96,39,66,223,161,99,229,163,1,228,-78,0,128,230,224,70,1,128,135,224,86,2,192,148,160,154,64,100,216,229,-96,182,128,90,197,48,237,63,3,197,43,250,12,4,128,23,161,15,252,147,-3,0,85,174,83,232,4,2,238,146,19,224,37,10,129,132,96,36,195,165,-97,58,0,54,75,185,162,79,137,117,0,54,129,56,0,50,133,42,96,211,-0,54,130,143,2,56,57,52,239,159,9,0,49,67,27,239,179,11,224,19,-7,224,39,11,139,70,224,239,11,2,95,56,57,66,93,1,50,54,131,25,-67,65,192,18,160,152,224,57,9,144,124,4,75,32,95,53,50,132,7,64,-12,0,83,163,38,224,61,5,131,137,160,98,159,217,0,57,160,85,160,90,-224,168,5,66,218,224,110,7,64,99,224,168,2,96,69,192,155,96,134,224,-175,7,224,196,12,225,19,7,0,49,64,240,224,19,7,64,155,224,126,7,-132,127,192,81,0,56,91,68,128,100,224,98,7,224,56,6,0,49,74,215,-224,183,5,224,60,2,224,161,11,225,12,6,0,49,64,24,224,84,7,64,-64,224,122,8,224,78,12,224,37,2,229,173,0,224,239,6,225,2,11,64,-238,224,19,7,225,149,10,0,49,129,149,225,223,3,225,127,10,224,240,0,-224,62,8,146,45,224,60,9,0,85,114,87,226,72,3,161,240,133,27,224,-86,7,225,51,7,65,115,224,106,6,65,211,225,11,2,141,219,225,189,9,-226,97,15,225,13,8,64,248,224,18,6,225,168,10,129,167,226,252,7,0,-55,197,163,227,103,27,64,169,179,223,243,230,0,226,34,7,226,175,10,225,-88,16,226,35,18,225,80,2,100,136,138,200,228,136,13,64,255,224,134,6,-64,169,224,134,6,64,97,226,30,24,224,20,23,224,237,31,224,56,6,227,-14,22,225,223,7,64,240,136,111,160,240,225,181,8,118,155,226,135,4,160,-54,0,51,224,54,1,136,119,224,118,5,224,13,13,226,10,4,64,69,136,-201,160,69,219,34,243,14,4,225,82,0,224,25,13,101,82,230,209,8,100,-63,227,139,12,230,180,7,96,63,229,74,3,228,172,4,224,49,11,96,139,-225,41,7,224,49,3,224,141,8,130,205,225,228,11,224,91,7,100,173,224,-183,11,72,216,1,52,51,236,2,2,25,72,97,115,76,111,99,32,69,68,-101,102,58,32,117,110,105,109,112,108,101,109,101,110,116,101,100,140,26,65,-92,137,227,80,141,1,57,52,65,56,214,141,96,92,160,35,137,30,225,253,-6,192,119,0,58,134,179,224,68,4,0,80,198,251,224,74,7,0,54,136,-251,226,17,0,0,75,224,78,8,224,15,9,224,232,8,64,71,136,222,3,-95,49,49,57,84,69,120,56,200,48,73,83,86,67,224,19,0,64,47,0,-54,128,47,3,54,32,95,57,85,13,4,95,49,48,53,48,105,223,64,45,-174,148,97,61,136,252,120,253,225,72,1,11,105,109,112,111,115,115,105,98,-108,101,58,32,129,58,130,95,153,36,169,233,0,49,135,191,96,234,97,10,-0,51,157,84,186,135,224,86,0,2,79,32,35,74,162,209,77,96,56,96,-40,239,45,0,64,150,163,113,224,224,4,134,83,204,166,249,162,0,160,120,-3,32,95,51,48,178,247,224,107,3,76,60,208,18,224,23,0,160,53,1,-50,57,98,101,224,44,1,87,120,96,44,224,31,4,64,0,225,81,0,64,-132,64,160,131,219,0,80,76,107,89,248,114,221,227,156,17,102,86,234,84,-15,89,20,178,171,226,238,9,96,57,185,95,192,36,224,37,9,100,45,161,-27,250,187,6,240,137,5,238,130,4,64,187,131,0,66,140,172,50,5,66,-32,95,55,50,56,130,13,226,2,1,7,99,111,110,65,114,105,116,121,175,-84,3,67,32,95,54,90,175,236,232,3,128,132,129,199,64,89,131,54,0,-66,251,187,2,64,6,106,127,130,61,0,56,252,64,2,130,67,1,50,53,-65,112,2,95,52,52,64,157,162,86,224,35,1,2,95,50,51,99,2,0,-58,156,65,96,182,178,168,140,43,121,60,236,236,0,247,1,0,65,204,64,-16,140,209,65,227,108,127,224,153,3,225,181,1,117,207,226,213,0,224,186,-4,96,76,236,246,0,252,146,3,155,227,220,107,64,32,224,186,6,248,245,-5,112,32,64,138,163,198,225,32,7,225,28,6,225,25,0,1,95,51,111,-10,224,91,5,216,46,64,79,0,54,193,114,1,49,50,81,112,67,134,2,-32,64,80,140,181,64,31,167,184,96,29,0,83,76,104,192,136,195,110,96,-27,0,50,205,188,96,68,212,20,96,157,0,52,73,65,96,26,96,9,225,-183,1,224,40,12,0,90,224,40,2,2,95,51,54,101,216,97,34,64,114,-167,28,128,230,0,48,96,172,128,71,189,78,224,224,1,0,49,125,19,183,-26,100,10,128,11,0,50,129,55,192,80,131,133,0,73,67,145,64,70,64,-92,0,51,96,143,225,169,3,69,2,225,152,4,0,95,128,80,175,10,64,-7,129,65,0,54,66,225,64,186,160,194,3,58,49,50,52,130,116,96,97,-64,18,96,97,0,54,158,100,111,80,80,254,96,47,0,54,128,47,229,165,-0,241,51,3,66,92,99,142,64,33,129,176,224,33,7,0,57,224,33,2,-197,159,0,89,98,22,214,34,64,214,66,241,97,53,0,48,145,118,64,6,-2,95,49,50,253,132,1,163,28,160,5,224,21,10,225,193,0,129,183,96,-80,132,167,192,105,96,39,131,27,224,42,4,180,120,192,16,208,55,232,50,-5,224,33,3,242,195,0,224,16,16,224,67,8,248,196,0,224,50,17,252,-111,1,64,210,197,21,224,168,2,252,145,0,224,17,0,97,34,129,250,225,-12,1,187,69,192,38,69,13,224,13,1,64,48,102,7,180,157,64,42,103,-227,2,49,48,52,98,77,196,101,128,38,165,106,252,212,0,160,126,228,55,-0,160,168,96,29,224,183,2,224,17,11,134,43,224,137,1,128,155,96,16,-224,39,6,225,224,1,225,11,19,128,80,64,168,233,51,0,224,71,9,225,-11,0,224,118,5,151,214,163,52,224,208,0,244,46,1,0,79,99,246,3,-51,56,32,79,96,96,194,194,224,100,5,130,76,160,94,160,148,182,169,193,-105,109,162,224,133,0,226,222,15,204,239,160,229,88,224,127,79,99,129,224,-64,3,194,201,160,90,128,21,192,76,224,82,2,225,204,6,128,96,224,82,-2,193,213,224,22,6,128,54,96,204,133,135,67,253,0,49,251,4,3,0,-104,246,134,2,96,43,224,41,16,1,118,115,248,255,1,226,121,0,113,195,-224,14,0,1,48,48,167,44,151,87,231,38,2,1,48,48,64,143,65,12,-248,124,10,226,232,2,224,77,1,99,9,105,241,130,217,102,36,224,26,2,-162,35,130,111,68,137,213,116,64,1,1,80,32,143,226,161,197,0,32,83,-131,128,37,133,214,192,35,64,34,0,80,133,12,133,158,134,59,101,144,244,-149,1,158,226,128,51,96,182,130,93,192,218,64,136,96,10,0,56,102,75,-98,138,233,197,9,64,0,5,95,53,54,54,32,95,118,31,128,123,64,120,-235,226,0,0,53,73,180,106,231,97,126,0,49,220,68,0,52,171,224,1,-49,50,64,147,2,49,50,50,66,196,67,223,2,50,51,48,164,135,192,15,-215,225,96,165,160,32,244,117,1,66,245,200,90,2,49,50,51,188,213,2,-49,50,51,147,221,0,79,70,219,160,45,64,64,224,56,2,134,77,106,77,-64,54,225,65,1,97,132,129,65,65,144,181,56,224,82,22,64,44,134,55,-128,81,225,185,1,0,80,87,30,224,81,1,167,131,224,248,43,0,49,224,-248,4,206,163,0,52,65,143,0,51,99,85,3,50,57,32,64,235,82,3,-64,38,167,150,224,38,7,227,4,1,1,91,93,222,50,64,129,1,10,65,-227,31,2,4,68,97,116,97,46,92,48,6,95,84,121,112,101,46,34,96,-193,64,61,226,148,0,117,81,224,10,6,194,154,96,44,129,101,97,5,171,-122,96,22,199,166,1,50,50,120,58,67,156,96,38,104,201,71,218,96,37,-169,59,132,36,77,143,254,236,5,0,102,191,3,66,100,184,179,138,16,224,-40,14,96,83,193,152,0,67,106,119,65,132,0,51,74,217,224,45,1,1,-40,41,96,45,3,80,32,95,51,83,102,66,89,202,228,0,49,97,163,153,-27,96,28,100,98,75,215,66,33,1,56,48,187,101,250,149,1,96,158,64,-32,135,89,1,95,56,77,46,64,133,162,5,5,54,32,95,55,48,54,134,-33,66,25,68,168,128,198,0,48,192,94,96,15,98,220,1,48,56,96,24,-64,6,128,87,100,169,64,77,205,12,64,18,227,29,0,64,24,129,252,246,-185,95,196,57,64,171,0,57,204,240,208,57,128,154,64,0,246,188,16,117,-74,128,11,135,186,0,95,133,187,132,120,3,51,51,53,32,243,117,0,224,-78,2,242,148,8,246,178,19,2,49,50,49,101,8,160,60,128,118,224,74,-0,237,205,0,128,196,96,22,224,105,3,246,176,53,224,91,3,185,163,224,-135,5,168,33,246,181,13,225,31,3,224,165,12,1,49,48,176,223,192,19,-225,142,0,1,53,56,98,50,253,10,11,246,224,34,192,172,225,205,6,129,-84,207,37,246,206,72,200,242,224,237,4,208,87,225,166,13,225,105,20,224,-102,8,66,246,66,186,67,193,225,154,13,224,77,2,0,51,69,69,65,16,-219,7,226,80,0,97,57,225,82,11,246,255,16,0,83,78,35,233,77,0,-112,202,235,131,1,64,81,184,173,226,178,6,193,114,224,158,0,224,32,9,-247,30,50,225,88,4,160,217,113,14,225,16,14,226,126,4,64,5,204,133,-247,57,13,78,97,227,228,1,224,53,1,202,226,246,95,32,224,130,15,225,-251,21,224,57,16,226,204,3,221,55,101,64,135,17,225,23,7,64,131,194,-245,0,58,128,244,229,102,11,64,213,247,151,31,226,231,56,224,30,39,247,-201,32,192,50,225,247,21,194,254,226,143,10,65,33,136,6,226,95,13,227,-72,6,98,110,64,51,136,35,224,51,13,172,9,128,99,64,44,0,54,167,-2,0,80,225,170,13,224,253,4,224,107,5,64,61,136,104,247,234,77,226,-80,0,195,235,247,228,8,227,21,1,224,36,10,96,120,96,72,175,18,224,-109,11,131,94,224,249,17,224,88,11,99,115,227,47,13,227,149,7,96,19,-244,194,3,65,56,225,155,16,102,94,64,8,195,30,0,51,233,236,0,0,-48,73,236,64,32,1,10,65,67,255,244,239,5,246,242,1,202,144,69,156,-209,137,64,103,75,23,97,40,236,172,0,64,121,160,43,131,170,0,75,167,-4,72,39,96,3,160,177,0,48,131,163,101,116,0,90,239,5,0,1,95,-49,76,170,73,84,64,71,148,99,96,18,233,241,4,0,64,107,81,238,3,-0,224,31,10,106,18,116,67,224,29,4,1,55,56,98,110,2,56,52,54,-224,230,2,171,111,224,45,30,170,141,224,36,21,1,45,62,238,198,1,65,-121,0,48,103,142,64,245,195,119,101,108,96,228,64,21,131,89,171,1,78,-197,3,104,101,97,100,96,74,249,208,8,0,68,76,2,4,84,101,120,116,-46,64,35,4,58,32,101,109,112,182,145,64,72,0,54,128,72,109,30,2,-55,32,95,116,146,0,95,107,136,70,198,64,33,131,89,115,191,0,48,237,-19,4,98,252,141,19,79,97,226,77,0,247,95,4,171,101,94,130,135,36,-224,32,14,218,69,147,37,64,97,224,41,4,97,50,160,41,96,29,82,212,-96,37,147,130,194,6,1,50,48,240,29,3,161,85,224,22,7,10,80,114,-105,109,105,116,105,118,101,115,46,193,119,224,91,4,140,16,0,64,210,208,-192,0,64,231,207,143,0,85,130,131,225,209,8,160,38,130,245,139,4,79,-111,0,57,235,5,0,236,211,2,4,115,117,112,101,114,160,160,239,146,3,-64,64,131,10,150,255,236,219,4,1,36,67,64,49,3,58,49,49,57,131,-14,67,45,0,66,64,140,225,95,2,1,95,56,140,224,2,49,49,57,169,-213,64,47,130,72,5,98,115,43,43,46,32,64,15,194,66,64,49,97,65,-6,49,57,53,32,95,55,57,64,203,88,206,1,48,54,96,127,1,56,52,-248,26,9,75,200,181,232,113,1,110,58,116,87,64,76,0,80,64,142,0,-90,96,83,2,56,57,48,196,115,251,143,3,225,11,8,20,100,117,112,108,-105,99,97,116,101,32,100,101,102,105,110,105,116,105,111,110,32,129,26,0,-56,67,247,192,0,249,95,7,6,104,101,99,107,68,117,112,162,205,0,49,-64,92,246,136,0,64,192,0,95,128,195,0,54,64,174,134,55,0,53,65,-175,108,140,0,50,217,124,141,237,129,134,92,138,64,72,130,244,64,194,140,-192,0,49,98,18,0,95,111,13,160,15,88,121,0,53,133,32,96,54,224,-47,3,164,237,1,83,32,71,76,186,128,64,16,66,175,245,37,1,79,111,-224,7,1,194,249,229,41,2,128,57,96,73,117,147,242,162,2,180,154,195,-44,241,242,0,224,64,1,96,8,224,61,0,71,21,192,14,192,115,224,13,-11,247,46,2,150,55,224,48,19,180,162,227,176,0,64,2,128,153,128,108,-160,46,214,164,84,112,233,18,0,165,254,192,113,192,43,182,46,197,222,64,-74,178,188,233,214,1,192,62,192,18,181,221,3,95,51,50,48,226,28,2,-13,92,34,115,114,99,47,77,105,99,114,111,72,115,47,81,3,9,46,104,-115,92,34,44,51,51,58,53,229,108,2,224,0,5,225,126,21,114,58,225,-132,0,129,136,128,167,136,87,128,169,160,14,160,185,224,232,1,243,148,0,-96,65,244,111,5,224,39,10,64,15,244,150,10,66,109,133,109,130,134,132,-246,112,45,98,163,231,109,7,192,196,128,167,130,47,199,58,224,103,0,128,-10,207,155,98,137,0,85,254,131,1,1,95,54,102,22,128,123,132,218,103,-133,245,29,1,226,53,2,129,42,1,75,32,183,203,194,44,192,7,161,214,-128,9,128,2,161,56,160,13,160,81,225,18,5,224,23,8,224,17,17,193,-121,226,171,1,162,84,224,123,0,224,119,4,224,61,8,224,64,2,224,65,-2,96,218,224,46,14,160,93,130,215,247,219,0,65,17,194,6,96,23,105,-183,228,139,2,249,170,1,225,63,0,224,60,3,96,2,230,128,0,224,137,-3,221,111,104,177,160,121,64,132,193,215,163,129,224,5,15,70,82,224,58,-0,225,35,2,138,7,128,87,225,252,0,227,151,1,225,108,14,100,99,227,-36,0,160,196,160,136,225,216,8,129,67,227,31,0,224,83,0,160,98,102,-140,226,236,0,227,72,2,224,72,14,225,129,5,224,31,4,129,193,128,87,-100,199,164,82,152,134,132,72,98,160,128,4,192,33,196,150,64,62,228,181,-0,129,22,103,82,229,206,1,229,216,2,224,58,9,196,158,84,242,224,42,-5,195,200,225,119,1,128,222,96,249,101,55,64,163,224,18,1,64,14,64,-63,159,36,224,177,6,251,45,1,224,245,0,224,8,0,226,174,18,224,28,-1,224,29,41,224,190,8,65,182,227,47,0,227,2,0,160,138,225,227,3,-224,51,0,194,70,227,44,0,64,35,149,60,235,35,2,132,112,129,74,160,-20,1,51,48,224,25,2,0,95,251,142,1,225,59,0,98,221,0,52,121,-223,225,222,8,121,168,215,124,168,182,176,196,128,67,1,95,53,69,86,96,-112,177,212,98,219,129,216,193,81,225,35,5,252,151,5,128,219,226,194,3,-225,4,0,226,191,91,226,174,3,240,25,0,235,212,1,100,109,133,121,132,-63,224,24,4,2,64,95,54,73,169,100,151,129,26,96,4,226,238,13,0,-90,232,213,3,128,233,226,200,31,0,75,183,70,226,200,13,225,15,15,224,-13,4,101,18,226,103,0,161,171,237,130,3,98,31,165,92,64,151,137,221,-96,9,1,53,55,77,240,168,51,2,95,53,54,121,75,226,110,4,64,138,-224,162,0,160,8,160,7,226,61,3,165,31,194,61,0,89,161,211,161,188,-199,99,96,150,131,30,64,39,128,229,132,43,135,37,160,63,132,44,135,129,-197,119,64,24,106,43,224,116,1,64,237,69,188,120,160,107,130,164,22,106,-185,96,9,236,48,0,4,79,32,35,54,52,232,55,2,64,8,71,189,204,-87,236,43,7,192,91,110,63,236,200,0,96,74,173,240,1,95,56,125,188,-64,36,136,108,64,43,112,20,2,49,56,54,76,80,64,22,172,96,96,14,-0,54,128,30,249,218,2,64,21,235,88,0,0,66,134,137,121,50,197,96,-64,5,96,214,5,52,54,32,79,32,35,64,125,192,193,197,76,64,67,139,-108,64,61,0,50,96,105,0,51,192,83,241,218,3,64,48,149,36,170,70,-96,25,226,39,6,236,210,0,230,103,1,227,131,1,129,154,224,13,10,196,-22,163,166,231,28,0,98,142,226,81,6,227,164,8,201,39,227,21,0,173,-107,228,251,8,64,155,65,142,254,98,0,73,62,231,18,0,99,6,65,2,-0,49,129,64,236,75,6,109,207,206,5,97,56,160,0,96,77,160,55,65,-59,202,49,140,45,224,238,5,231,127,10,228,96,0,163,243,74,6,225,1,-7,229,196,9,228,156,2,192,150,255,56,4,233,1,4,193,175,225,73,6,-232,14,0,170,178,233,93,3,5,67,32,95,51,54,56,224,43,0,193,57,-163,88,192,255,96,107,128,221,64,70,224,24,1,228,77,0,193,0,193,32,-227,96,1,160,170,1,95,52,123,60,225,39,1,237,98,0,64,1,191,135,-228,186,3,109,160,224,32,0,200,237,224,191,3,97,91,196,203,163,134,1,-55,57,224,203,3,112,93,192,56,224,53,40,224,50,13,239,217,5,228,92,-0,237,98,0,65,169,2,56,52,56,97,177,79,170,2,79,32,35,80,48,-96,223,240,173,5,125,189,3,54,32,95,50,67,150,234,211,3,164,114,64,-96,181,153,0,80,140,249,100,218,138,109,156,23,160,172,224,180,0,229,15,-1,224,18,0,82,253,191,55,96,17,254,190,0,157,93,69,16,1,54,56,-98,209,0,55,132,178,224,111,21,98,30,226,38,8,127,206,226,114,1,224,-31,0,224,124,3,64,17,227,48,2,193,248,229,165,0,226,96,0,230,181,-1,131,241,162,172,224,220,2,163,4,64,84,191,76,65,113,65,105,0,53,-128,180,64,25,0,54,224,205,2,64,135,122,237,118,111,0,51,98,153,224,-10,3,192,30,64,55,215,15,1,95,51,102,229,229,60,0,75,221,96,191,-0,90,64,149,96,4,132,52,191,239,96,40,255,178,0,1,52,57,129,46,-132,44,0,55,132,44,0,83,147,116,67,250,225,90,2,255,189,0,64,44,-224,7,0,96,8,65,193,0,75,128,65,246,14,2,228,104,1,225,48,1,-128,75,143,106,135,218,0,83,229,81,5,96,104,72,182,227,154,0,64,8,-99,198,228,99,4,0,54,82,52,97,94,128,82,224,135,0,0,64,87,207,-96,65,128,237,199,16,164,116,2,95,49,49,74,87,247,156,0,101,170,64,-20,167,36,160,99,99,111,138,128,250,49,0,160,37,233,123,2,2,49,51,-55,160,42,0,53,114,195,160,143,128,107,244,230,0,224,74,1,224,42,2,-161,82,181,142,133,50,99,107,1,49,49,66,231,224,246,0,0,58,128,234,-230,254,3,96,79,165,249,0,54,65,25,202,166,224,113,10,192,34,64,7,-162,224,64,94,129,228,225,1,12,192,187,128,68,215,52,226,242,2,131,17,-225,3,2,96,174,228,244,0,166,40,234,38,0,64,230,75,250,64,41,64,-249,161,53,99,74,97,1,98,135,0,53,164,107,162,22,97,225,225,18,3,-0,54,129,9,163,70,192,53,1,54,53,128,22,0,54,192,22,232,92,3,-64,44,100,206,64,33,131,45,64,50,89,0,224,39,1,242,77,1,1,67,-39,146,51,64,45,179,236,225,33,33,224,252,1,224,23,0,129,21,224,207,-3,199,44,224,190,1,66,223,64,111,163,145,224,191,5,72,245,224,191,0,-131,152,224,191,19,0,83,224,191,2,195,132,227,183,2,192,118,96,31,131,-19,224,223,13,230,218,1,160,216,102,126,225,203,9,249,110,3,192,19,66,-114,64,102,129,185,224,207,6,69,183,167,62,96,36,133,205,67,13,226,220,-2,196,16,128,139,130,100,232,139,0,227,134,4,224,169,7,224,162,0,226,-116,11,228,195,0,226,137,12,226,127,0,226,191,2,224,79,16,71,51,224,-79,9,166,110,238,178,0,64,82,139,69,64,231,196,128,228,53,2,226,4,-0,226,178,4,0,54,225,34,1,0,73,128,61,130,241,225,200,3,160,7,-64,28,0,54,226,55,12,0,48,226,55,1,64,214,128,33,135,226,192,27,-64,26,235,100,0,225,164,4,226,116,2,68,126,230,73,6,0,90,182,52,-64,29,226,146,0,139,215,0,53,122,77,100,208,224,86,10,166,240,96,33,-229,145,0,96,151,1,52,32,184,97,97,120,129,125,226,153,2,226,92,8,-97,178,224,38,18,225,137,3,224,38,18,226,0,3,224,77,26,64,7,224,-77,26,64,7,224,38,17,0,52,169,4,224,77,22,90,232,224,194,26,192,-38,113,14,224,38,26,166,41,230,67,9,104,216,139,158,226,244,0,226,238,-5,225,126,2,169,5,225,223,3,228,131,1,1,75,52,215,119,224,31,14,-0,51,224,31,22,0,50,224,31,21,2,67,39,66,224,32,11,66,216,0,-50,228,92,4,224,59,10,0,66,165,31,224,58,9,194,155,224,26,9,79,-77,224,26,14,70,81,224,26,3,162,1,96,7,0,58,128,7,227,120,4,-164,252,64,26,231,127,11,132,247,240,76,8,144,81,67,253,157,14,230,122,-1,189,54,129,141,224,32,5,237,160,1,0,51,69,93,227,126,3,98,40,-224,110,12,192,89,128,64,247,227,5,96,4,192,99,206,225,224,135,19,128,-35,0,80,96,71,224,44,3,128,149,127,144,96,147,233,45,1,238,110,0,-224,186,4,160,180,224,35,21,2,79,32,35,68,82,224,223,0,101,196,128,-154,224,38,7,0,49,224,38,0,65,170,240,142,5,226,197,11,224,38,21,-226,204,0,224,38,21,226,211,0,160,0,243,21,1,224,58,1,98,23,197,-234,1,80,32,97,78,0,85,128,21,0,54,96,21,93,111,83,150,133,66,-81,168,229,153,1,240,27,5,203,230,64,85,226,129,0,224,181,7,64,31,-133,221,224,31,8,96,174,64,31,229,223,0,174,29,161,99,64,26,229,227,-0,224,58,4,137,65,64,31,133,225,224,58,0,201,137,0,58,133,33,224,-26,4,166,241,64,26,242,110,0,128,26,198,138,64,26,233,247,0,160,26,-237,63,1,68,151,97,10,237,65,1,109,44,237,65,13,0,64,98,159,130,-143,226,187,4,192,32,96,31,226,54,3,129,76,78,85,237,165,5,96,46,-64,7,69,86,96,97,237,164,3,96,10,64,55,129,132,0,79,82,197,64,-41,127,207,64,11,129,92,179,166,192,1,65,190,232,215,4,168,138,96,103,-108,219,64,58,233,220,3,162,235,128,217,224,14,3,224,11,2,192,8,154,-106,64,65,169,254,94,203,68,151,0,95,72,21,67,44,72,108,159,54,192,-108,0,50,207,107,132,25,209,192,224,109,1,224,182,2,224,19,20,99,150,-0,39,86,87,79,10,224,47,9,117,197,3,50,32,95,57,109,250,0,51,-110,229,128,0,225,13,2,241,106,5,100,20,128,53,1,49,49,81,181,224,-54,3,160,111,224,2,0,128,39,1,56,49,78,193,224,38,1,160,73,224,-86,1,3,67,32,95,57,150,62,65,115,93,116,160,130,243,193,1,241,84,-4,96,0,65,39,240,52,1,160,251,192,88,65,117,64,32,208,0,7,49,-51,32,75,32,85,32,90,192,197,224,43,3,96,5,1,95,55,236,40,0,-96,56,0,54,128,56,3,54,32,95,55,64,153,214,23,0,50,71,188,64,-31,130,153,0,85,172,128,177,0,1,56,48,66,187,160,14,227,161,1,2,-32,61,32,100,140,145,224,2,49,49,50,147,30,64,70,228,45,0,5,57,-32,95,51,51,57,224,29,0,64,120,0,57,98,37,2,49,49,50,130,243,-0,50,128,128,176,111,64,7,227,26,0,4,95,49,48,48,48,130,210,64,-10,136,153,96,13,2,57,57,56,224,67,3,128,7,128,250,224,41,11,108,-86,1,48,48,116,251,128,8,3,95,57,57,57,100,135,231,233,0,160,108,-0,64,192,25,69,42,229,222,1,224,96,0,96,30,64,44,105,1,64,177,-131,124,3,80,32,35,51,106,123,64,18,196,209,2,48,55,57,224,202,1,-0,55,65,36,0,48,86,231,192,155,0,51,80,223,192,25,1,49,50,99,-38,224,14,6,224,42,12,128,68,224,42,8,224,15,0,0,49,97,136,64,-136,210,250,128,138,228,175,1,224,2,3,99,7,227,62,2,128,107,128,123,-227,44,13,224,33,0,224,29,3,224,26,5,192,22,224,19,2,224,201,26,-1,48,56,78,143,2,48,56,55,129,49,64,28,224,14,3,97,243,0,48,-78,201,192,0,224,56,5,1,49,49,163,98,224,22,7,173,71,225,32,1,-224,28,3,208,24,160,30,129,57,0,49,216,201,0,89,226,127,0,65,64,-232,130,1,64,4,0,80,118,206,207,173,224,217,12,224,84,1,225,119,4,-225,61,4,224,2,1,96,134,225,137,1,68,145,225,140,0,224,63,2,225,-110,1,66,216,225,140,4,215,112,224,23,1,128,156,224,16,1,68,117,160,-146,224,171,1,129,82,224,187,7,224,188,1,224,52,2,161,31,199,94,65,-22,68,46,225,238,43,1,49,49,137,181,225,174,14,64,102,199,170,192,102,-224,83,32,64,60,0,54,224,60,24,161,253,224,14,6,96,60,206,235,128,-60,243,182,0,5,67,32,60,32,64,35,96,39,224,19,6,67,245,224,19,-8,224,39,11,100,1,65,50,224,19,2,137,162,224,211,1,136,44,224,180,-36,224,84,9,65,9,224,84,3,129,229,225,173,33,73,164,227,156,8,0,-57,162,143,224,126,9,244,203,1,160,127,101,134,224,147,6,64,131,224,147,-3,129,241,160,66,225,225,14,69,164,224,112,11,225,30,38,225,136,7,100,-45,224,19,7,111,115,224,179,6,65,6,226,124,30,224,200,0,224,18,8,-224,84,6,67,64,225,8,8,227,120,0,224,217,28,193,144,229,15,1,225,-128,6,99,10,224,119,7,64,97,224,158,9,225,74,38,224,64,2,0,48,-217,215,225,74,7,225,93,11,65,73,224,19,7,226,37,10,102,192,226,167,-32,224,165,14,225,148,10,225,194,35,224,147,8,64,126,225,151,30,225,197,-20,1,48,57,72,241,230,31,5,227,9,0,0,48,226,172,0,225,204,7,-113,229,224,146,5,66,171,225,137,3,128,81,226,123,10,227,112,16,225,141,-8,65,120,224,18,6,226,68,10,130,67,225,77,13,128,198,230,80,5,225,-130,22,226,215,13,167,246,96,28,226,103,4,224,142,8,64,61,224,142,15,-226,26,6,163,43,224,45,28,195,95,161,205,227,95,10,228,43,10,226,36,-33,224,228,3,168,234,225,151,2,227,145,49,226,126,0,166,200,203,139,230,-200,12,65,84,224,18,6,130,104,224,18,4,229,20,10,99,202,228,191,9,-139,38,226,28,20,192,36,224,195,0,0,48,205,195,224,78,16,224,143,7,-231,65,10,231,64,7,224,142,6,224,88,15,224,25,17,231,182,8,225,22,-9,66,76,226,138,12,224,83,1,128,77,227,146,3,64,101,157,119,224,25,-7,160,121,225,104,7,229,175,6,128,57,224,99,3,229,255,0,65,237,0,-51,225,237,2,64,28,0,49,224,90,0,64,29,209,133,108,152,202,18,210,-217,0,53,118,190,239,178,2,74,221,64,53,208,35,128,55,248,173,0,64,-127,141,80,1,56,55,86,45,0,80,151,123,107,36,0,80,131,179,141,165,-110,62,96,73,140,143,2,85,32,65,109,39,64,23,96,14,157,237,64,45,-224,187,3,226,225,2,64,29,234,10,5,228,183,10,225,157,6,64,55,225,-75,6,137,16,230,86,92,227,168,18,224,46,36,228,114,31,224,57,7,228,-132,34,230,116,2,230,40,18,65,130,0,54,235,141,26,64,54,228,214,1,-224,95,1,224,76,3,224,127,7,162,193,64,98,235,118,3,79,56,225,44,-33,224,227,22,128,99,64,98,229,16,20,68,253,232,161,11,224,19,7,64,-99,227,169,7,194,94,225,22,11,234,39,15,235,139,32,224,212,6,231,96,-14,233,73,53,239,121,8,97,204,203,241,224,109,8,224,156,1,136,209,128,-45,230,125,0,232,254,42,226,110,1,234,58,12,233,146,50,96,94,194,104,-193,17,129,20,240,186,47,224,177,3,225,65,30,224,61,6,227,39,5,129,-19,224,13,5,224,53,11,224,198,1,234,16,13,225,217,21,241,68,5,224,-143,7,192,115,226,152,34,225,251,2,166,238,224,85,2,225,229,5,225,223,-18,64,24,224,18,6,231,229,25,83,138,226,104,17,235,216,30,227,181,19,-225,20,3,224,72,8,229,201,38,232,80,13,224,138,4,195,172,224,204,24,-227,107,7,225,244,23,227,206,28,232,122,14,228,59,70,85,133,226,210,10,-233,144,1,224,111,69,192,95,160,23,224,118,15,64,0,70,27,233,62,3,-228,191,15,228,89,10,224,140,1,158,231,225,244,1,64,84,233,117,3,228,-121,64,192,234,224,209,6,192,121,226,56,6,225,127,2,0,48,228,114,4,-160,183,81,98,228,205,4,224,214,6,245,137,5,224,45,5,224,233,2,234,-41,6,138,8,234,43,0,105,232,119,68,192,15,0,65,96,64,64,57,219,-228,225,35,5,161,38,161,39,225,41,1,246,121,58,0,57,108,117,224,14,-1,236,148,5,230,159,8,230,181,4,224,22,8,225,23,4,193,159,213,46,-64,224,100,170,232,216,24,227,229,13,224,138,7,224,36,7,96,14,64,98,-235,63,3,0,67,160,90,139,195,96,237,233,186,28,230,208,7,207,119,64,-67,0,54,225,221,5,0,66,183,0,128,42,128,34,233,190,5,65,139,121,-125,0,83,224,5,0,64,4,64,52,192,3,224,103,0,128,119,192,174,233,-163,3,225,45,17,225,30,11,231,249,12,192,36,192,94,237,37,11,130,2,-64,29,227,175,7,225,168,24,193,52,64,60,249,251,5,225,132,5,226,228,-3,128,213,227,240,35,227,140,7,200,5,224,148,6,224,250,14,226,111,40,-249,195,48,234,154,5,192,182,97,35,228,52,3,0,58,150,230,225,44,15,-72,168,250,187,8,0,83,224,146,9,228,93,7,228,94,9,96,77,226,255,-27,226,56,6,226,248,0,64,224,224,166,16,248,39,5,225,209,38,228,116,-7,225,58,7,204,180,96,155,226,177,9,96,31,64,29,226,207,12,96,93,-64,29,130,207,0,75,224,186,8,197,173,250,227,6,64,11,131,217,160,187,-224,209,7,161,95,224,8,2,96,78,207,220,0,58,128,71,96,11,125,16,-96,36,190,208,254,67,6,7,84,109,111,100,117,108,101,32,126,72,0,64,-154,242,126,116,95,194,80,31,2,95,56,51,97,36,224,59,0,1,79,32,-108,11,129,235,134,6,128,49,1,64,67,91,154,64,146,66,143,224,38,4,-96,131,130,1,3,85,32,75,52,98,23,64,18,129,215,1,80,32,73,139,-160,169,129,206,0,67,191,226,0,57,98,180,159,226,64,29,161,133,2,57,-51,56,96,229,129,118,64,154,0,89,252,27,1,64,5,0,80,68,233,0,-95,64,54,2,95,49,52,146,222,226,186,3,96,8,64,41,0,95,113,103,-96,26,224,20,6,97,121,94,182,161,112,163,147,64,117,222,112,68,65,128,-94,160,100,160,6,97,7,160,63,96,66,0,48,97,181,252,32,7,128,111,-231,90,0,220,147,225,240,4,0,80,224,124,2,224,132,0,224,8,0,64,-140,130,67,131,224,65,110,1,95,49,97,175,64,26,196,237,5,49,57,32,-95,51,51,98,152,0,54,140,161,0,90,226,10,11,226,9,4,163,52,97,-216,130,8,66,17,224,48,5,12,40,46,46,46,41,32,119,104,101,114,101,-94,42,96,54,64,97,199,117,2,95,49,50,103,155,96,114,0,58,128,7,-64,142,3,54,32,95,57,68,119,64,26,0,55,97,243,64,50,132,105,0,-57,70,191,3,95,51,51,53,80,21,65,69,139,176,0,83,163,20,235,190,-4,129,213,225,73,1,95,231,1,61,61,224,24,2,3,85,32,64,90,96,-128,161,186,224,42,10,132,97,160,42,224,44,4,97,173,2,95,49,48,90,-123,160,22,3,95,57,57,57,164,226,96,181,194,207,240,192,79,0,57,72,-79,64,133,96,8,160,16,96,132,225,130,1,6,100,101,102,97,117,108,116,-129,179,2,95,49,48,73,198,128,168,224,35,1,1,58,58,128,30,64,31,-0,53,137,189,3,85,32,75,50,192,98,224,81,8,14,114,105,118,105,110,-103,32,105,110,115,116,97,110,99,101,224,91,0,160,59,240,226,15,223,153,-162,208,0,90,64,44,226,241,2,0,39,164,193,96,204,194,94,224,226,27,-6,112,97,116,116,101,114,110,224,134,1,65,76,96,35,3,79,32,35,54,-98,243,224,221,0,99,205,96,80,1,51,52,96,72,65,100,0,66,98,115,-3,49,48,50,51,128,90,4,79,32,35,53,57,224,54,0,96,29,127,94,-103,213,132,44,64,75,239,227,0,225,146,7,225,137,27,224,126,1,193,148,-167,23,76,139,96,8,67,173,128,8,67,16,224,74,4,0,44,163,131,99,-8,225,120,3,64,0,241,150,33,96,93,93,239,224,176,13,225,223,16,64,-57,96,237,128,61,232,135,6,225,191,9,224,94,13,4,99,108,97,115,115,-224,91,1,199,218,97,189,96,8,218,78,241,66,13,130,75,166,94,224,115,-14,104,148,228,147,6,4,105,110,102,105,120,96,118,101,157,2,52,48,49,-64,4,0,51,103,77,102,146,0,56,161,249,224,26,9,67,145,130,20,224,-27,5,162,40,224,115,0,6,95,49,49,56,32,95,50,68,170,160,22,225,-205,36,162,13,129,105,225,90,12,224,243,19,225,103,8,19,102,111,114,101,-105,103,110,32,105,109,112,111,114,116,32,99,99,97,108,108,226,132,9,160,-149,160,187,5,49,50,54,32,95,51,224,136,1,228,56,33,242,55,53,238,-87,18,1,49,48,176,33,224,30,3,224,27,6,226,135,44,129,23,166,212,-77,18,185,108,2,49,48,53,64,167,64,7,103,186,132,43,224,60,6,13,-123,45,35,32,83,79,85,82,67,69,32,35,45,125,161,13,1,64,80,193,-85,224,44,5,8,113,117,97,108,105,102,105,101,100,192,39,225,236,0,226,-57,0,65,145,0,75,129,142,226,182,5,2,32,97,115,130,38,1,95,56,-225,150,0,192,102,228,125,0,129,7,192,76,0,80,64,73,224,65,2,5,-104,105,100,105,110,103,160,123,228,107,22,3,79,32,35,52,226,237,1,196,-102,147,204,192,0,230,135,36,2,116,121,112,228,72,1,226,75,23,222,4,-244,7,19,224,116,8,224,197,31,161,62,226,202,25,224,106,14,68,245,193,-219,230,96,15,244,74,35,64,147,64,165,160,154,224,87,10,225,105,50,231,-11,19,163,176,244,82,25,96,108,231,145,35,2,110,101,119,224,133,31,0,-54,97,234,64,8,133,45,104,38,0,83,64,88,123,87,227,192,27,3,100,-97,116,97,224,106,5,224,79,1,64,59,72,104,192,7,224,215,53,224,105,-9,224,212,10,229,238,23,2,32,92,124,160,67,162,144,129,2,225,5,4,-128,0,74,67,0,54,235,19,0,1,49,48,107,106,192,52,68,140,64,32,-141,14,97,54,230,21,35,201,197,228,247,3,228,182,14,4,115,116,111,99,-107,160,178,225,231,19,224,27,5,2,97,110,121,231,225,2,0,75,160,90,-64,0,228,122,41,96,253,67,90,2,95,56,51,233,117,0,224,179,8,165,-158,224,6,2,224,250,13,1,118,105,225,196,2,131,4,65,72,142,57,230,-129,1,230,95,2,129,84,226,60,23,64,195,129,155,100,4,232,212,3,132,-115,0,80,133,163,110,116,193,198,96,127,96,22,0,54,225,17,3,96,31,-192,139,198,223,228,142,15,228,54,0,228,206,13,96,99,225,90,9,128,0,-64,249,143,36,224,104,1,128,6,192,49,0,49,73,227,161,141,224,18,0,-0,53,160,18,64,62,142,237,73,146,131,178,193,86,198,144,192,53,65,186,-160,71,193,120,64,62,142,159,1,75,50,79,175,65,57,111,220,0,80,228,-6,0,0,85,235,33,1,99,194,96,4,230,239,4,224,30,1,226,87,3,-0,53,65,27,233,81,9,224,229,5,225,56,9,3,40,46,46,41,225,58,-1,64,32,0,58,134,248,227,133,0,144,51,226,174,13,64,43,142,171,0,-65,64,206,72,56,64,55,1,52,56,225,28,0,0,80,175,135,175,133,96,-15,64,9,128,21,66,240,0,48,130,237,72,123,64,66,0,54,96,66,2,-83,32,85,195,65,78,135,226,216,3,97,143,224,129,0,227,83,31,231,71,-23,225,58,5,224,68,0,193,247,224,104,2,225,100,10,161,9,132,154,224,-186,6,224,106,5,66,6,64,59,68,246,225,137,6,1,61,62,161,135,96,-75,131,157,64,177,1,80,32,103,58,1,64,80,129,154,130,188,140,146,160,-145,226,30,1,149,135,136,110,160,166,246,8,1,69,192,147,147,1,53,48,-97,173,246,24,0,0,52,81,10,65,149,64,21,162,146,0,39,82,65,247,-40,1,119,55,241,140,0,160,12,167,73,160,15,114,54,128,2,0,67,121,-102,234,206,2,2,66,32,83,147,191,98,146,192,68,224,61,0,138,251,224,-46,3,240,145,0,235,102,0,151,188,111,53,66,88,128,5,103,50,160,81,-241,23,2,109,45,128,10,210,229,224,80,0,161,182,128,102,0,85,128,62,-224,132,1,192,11,96,74,160,208,197,25,160,96,160,58,128,35,2,95,54,-52,138,37,146,163,241,152,2,0,66,66,252,229,69,6,128,90,225,26,5,-163,196,235,233,13,229,137,0,96,59,160,14,98,56,164,86,128,205,0,75,-128,64,224,176,46,224,161,6,96,158,224,155,6,224,128,13,224,119,0,225,-245,0,226,10,0,193,2,129,128,193,150,68,140,69,22,236,115,0,0,51,-64,191,99,171,160,145,160,24,101,46,64,13,86,150,85,2,3,64,95,56,-49,194,13,96,10,193,66,128,94,236,198,1,0,51,107,181,227,86,1,1,-91,93,195,86,224,43,0,224,100,4,224,87,2,175,99,64,244,125,52,1,-48,48,167,193,245,200,0,186,122,3,64,95,52,50,68,175,118,18,147,15,-79,70,192,43,192,4,96,159,66,97,161,61,96,246,213,55,161,97,195,22,-160,202,129,49,161,54,234,164,2,96,136,198,34,235,105,5,96,186,224,26,-13,96,53,129,246,224,26,7,96,133,99,102,224,22,4,142,150,64,207,194,-36,0,85,130,23,226,11,2,248,242,4,0,49,167,170,129,186,128,12,231,-155,8,199,156,228,1,0,224,117,6,140,232,98,238,240,194,11,0,95,136,-191,240,102,6,241,150,3,194,164,232,175,8,136,163,232,250,3,160,192,225,-17,9,224,219,0,64,26,224,159,5,101,127,225,10,0,192,111,160,11,101,-129,192,11,230,127,1,243,81,2,101,138,128,122,250,51,0,96,100,96,99,-232,55,18,224,27,9,80,168,232,207,3,225,159,24,129,6,129,158,227,188,-2,225,92,1,0,45,198,118,193,156,226,75,13,0,49,116,6,224,26,13,-98,42,225,57,13,175,237,0,85,232,194,6,232,149,13,76,87,233,174,4,-160,221,225,2,5,224,34,7,237,207,7,64,227,179,235,235,116,1,88,146,-65,133,224,76,7,0,52,225,78,0,160,136,224,121,3,230,11,0,229,134,-1,225,89,14,128,203,234,47,2,225,194,1,226,35,0,226,32,7,239,169,-9,96,186,234,118,12,96,0,133,91,225,124,7,98,89,225,124,12,0,49,-163,227,129,67,64,174,232,214,10,226,66,13,224,232,16,226,66,12,243,22,-12,163,207,242,126,9,0,102,236,140,0,1,50,57,224,28,7,226,140,0,-192,0,64,128,229,22,17,226,147,18,97,202,224,26,13,227,232,17,145,135,-225,16,2,225,18,2,224,17,3,163,206,227,104,2,183,204,0,79,237,132,-16,192,246,227,159,6,224,48,17,2,116,104,101,183,226,200,24,224,43,17,-2,101,108,115,174,148,227,60,9,225,215,6,225,209,1,226,240,4,194,91,-225,14,5,97,203,226,31,21,229,103,1,192,76,243,157,2,66,191,213,116,-239,140,4,0,111,96,173,236,155,23,0,46,160,39,195,69,1,50,49,125,-23,128,117,240,27,2,134,204,128,0,229,219,12,99,87,228,41,8,151,88,-65,206,131,119,228,109,2,168,214,229,242,38,238,107,2,229,242,2,160,73,-226,199,19,216,84,224,25,9,227,221,17,227,220,3,225,112,4,192,8,225,-76,6,1,108,101,181,243,225,74,21,160,249,226,105,15,0,105,226,147,0,-160,124,228,41,4,128,128,162,174,162,25,224,71,13,1,99,97,226,177,0,-224,25,6,0,111,195,40,224,167,20,0,51,245,154,1,225,213,6,72,243,-2,85,32,75,130,230,157,85,0,52,177,67,160,22,230,23,2,230,9,2,-1,57,50,230,9,2,1,52,52,64,23,242,26,9,228,159,8,249,146,0,-202,248,131,40,228,112,5,192,207,129,166,231,37,10,225,202,0,128,33,4,-64,95,53,54,51,138,58,161,86,69,176,163,46,64,10,64,6,226,243,2,-96,37,74,103,240,48,1,66,215,191,230,128,32,64,92,192,117,96,131,225,-54,1,128,3,194,123,140,31,234,224,0,193,70,162,132,64,121,89,47,75,-183,250,20,5,226,35,3,2,115,116,36,129,39,202,219,161,115,160,74,236,-64,1,235,64,8,247,237,2,225,76,0,227,144,0,224,14,0,132,152,97,-44,92,217,99,106,235,89,2,65,231,0,65,96,11,64,9,129,212,125,224,-101,31,64,15,0,58,110,243,174,231,226,191,1,0,51,94,194,3,64,95,-56,56,185,8,65,65,64,42,144,226,79,216,0,79,161,87,96,84,79,220,-96,143,143,118,129,111,64,47,145,6,0,66,79,186,64,205,0,85,128,69,-0,54,239,210,3,96,193,143,210,65,209,160,24,154,150,245,201,0,160,218,-225,222,1,225,1,0,164,93,162,81,230,77,3,96,146,99,122,225,42,0,-227,220,0,236,206,0,230,79,0,135,133,230,53,0,64,141,212,23,247,209,-6,64,112,255,216,10,106,195,229,83,5,233,144,7,129,2,97,38,106,219,-97,141,113,211,96,18,212,185,1,53,56,70,148,1,54,54,237,72,0,0,-85,173,26,224,98,6,251,76,16,96,45,64,104,251,209,10,224,22,14,248,-182,13,229,155,8,228,98,12,128,80,192,75,170,113,64,226,98,67,96,28,-1,53,50,64,4,0,57,227,170,0,224,36,2,135,52,96,146,1,48,52,-197,116,248,154,12,224,50,0,130,10,224,12,2,160,100,224,95,0,224,43,-6,237,47,7,97,221,0,51,177,243,0,49,81,242,1,50,49,96,126,106,-186,74,179,192,139,0,95,74,121,192,12,64,53,210,57,64,53,1,51,51,-64,58,192,53,1,48,52,99,190,160,47,64,19,64,47,146,89,4,102,115,-104,111,119,82,105,64,35,182,107,195,208,135,244,98,145,234,9,21,0,58,-133,236,226,146,11,129,154,224,18,4,64,79,225,69,6,64,254,238,42,2,-0,51,97,45,230,182,6,182,110,102,182,224,13,0,224,27,2,232,169,4,-119,152,231,242,10,177,141,232,196,7,0,46,235,28,2,233,34,0,224,140,-3,224,119,86,224,111,10,224,97,24,224,190,21,225,116,7,96,182,230,210,-9,162,142,64,115,224,101,32,224,171,14,100,207,232,83,0,225,11,6,246,-13,2,228,243,1,128,8,237,109,19,234,53,3,138,6,159,4,160,228,66,-119,133,247,224,143,3,160,11,234,0,33,64,70,134,14,234,237,5,232,120,-2,251,74,0,224,17,0,206,61,64,60,0,54,213,164,1,51,52,183,74,-64,21,198,50,218,14,129,127,71,202,64,41,82,189,1,57,56,65,131,102,-127,64,48,214,79,149,212,232,176,11,178,160,1,51,55,247,173,2,128,30,-168,149,64,12,129,247,64,2,224,59,4,227,128,5,224,25,1,224,27,5,-229,185,16,6,75,51,32,95,51,52,51,226,16,2,8,115,101,112,49,32,-65,98,111,118,202,37,224,37,17,4,66,101,115,105,100,224,38,0,224,124,-1,228,6,12,1,95,57,154,172,224,37,0,214,0,128,168,100,19,192,26,-66,119,0,55,134,175,128,79,64,189,231,116,1,64,88,0,67,64,34,103,-253,161,47,64,51,65,120,199,197,128,0,129,93,225,56,2,224,97,0,230,-125,8,128,28,224,144,1,224,142,1,224,205,4,170,209,224,195,2,224,79,-0,74,63,0,57,189,87,160,55,224,182,1,128,11,3,95,49,55,52,181,-86,192,113,224,71,15,138,67,224,71,10,97,1,66,108,96,181,137,8,224,-85,0,245,161,0,96,59,224,202,1,224,199,8,128,38,192,124,128,123,2,-95,57,54,106,28,225,103,39,224,196,4,137,6,0,55,166,95,66,254,160,-0,1,95,55,64,210,67,18,135,10,99,18,161,160,224,161,5,96,184,0,-64,152,153,225,146,2,225,195,21,221,174,128,26,198,102,248,124,0,224,30,-5,225,112,0,223,178,226,99,0,224,66,18,226,191,12,160,135,64,234,64,-31,64,14,64,11,65,94,193,202,1,56,48,166,238,132,25,252,189,2,115,-219,235,86,0,193,205,1,57,55,69,38,97,111,226,213,12,164,104,97,74,-221,18,227,240,6,65,117,228,3,49,7,111,110,101,76,105,110,101,114,228,-7,25,224,41,0,228,11,6,228,2,20,74,131,193,35,64,0,234,10,12,-227,116,8,136,195,131,96,224,61,1,224,21,0,84,103,224,83,1,233,207,-12,0,75,228,132,1,64,140,0,55,230,111,2,137,54,0,83,65,175,197,-164,217,202,225,254,6,164,153,224,64,1,64,62,137,101,238,55,3,118,185,-64,7,74,110,0,58,139,235,64,97,98,194,118,128,224,94,0,98,231,128,-174,230,26,5,96,196,96,205,195,143,224,19,0,128,17,167,148,64,5,102,-193,239,69,0,250,156,4,186,42,160,48,170,203,103,36,64,159,205,58,64,-168,192,195,233,163,4,96,99,232,2,1,160,17,232,70,6,2,32,92,124,-240,227,2,232,6,39,192,177,64,134,167,178,1,32,80,202,178,96,117,232,-129,3,72,116,224,126,6,1,60,45,233,43,6,192,7,129,139,241,146,54,-64,150,0,54,160,150,64,212,112,219,189,180,81,118,253,218,3,64,156,225,-231,0,98,14,208,24,160,206,1,49,48,87,154,69,86,161,187,224,151,3,-3,119,104,101,114,195,68,224,154,28,128,156,133,79,76,128,0,54,96,131,-132,20,229,136,1,132,67,64,25,130,231,224,198,2,168,214,64,147,169,112,-187,23,162,141,231,153,6,229,11,7,211,89,163,53,231,200,7,224,46,7,-1,95,57,81,236,65,23,99,131,96,189,64,135,225,241,19,130,72,0,55,-226,81,10,248,65,1,161,21,174,17,192,32,0,54,233,223,0,226,15,5,-224,76,36,235,48,14,64,184,131,49,80,57,0,56,105,248,0,54,96,83,-75,31,2,51,54,53,103,57,78,32,165,201,170,45,96,56,240,165,1,178,-43,103,10,97,124,126,4,0,67,80,33,128,141,240,99,1,182,232,177,109,-97,194,108,182,96,0,64,85,0,54,160,85,227,170,22,5,102,111,114,97,-108,108,227,173,6,249,8,0,234,69,0,96,53,170,220,64,7,1,83,32,-114,83,242,122,15,206,53,224,31,5,225,88,4,96,164,131,46,0,85,229,-8,2,133,103,194,57,226,49,6,64,241,136,159,192,135,64,164,98,252,225,-162,2,161,23,114,171,227,102,0,237,99,8,246,231,10,249,63,3,152,130,-96,164,131,195,66,51,0,49,67,79,64,25,96,180,0,75,254,235,0,0,-55,71,211,4,64,95,56,52,54,108,54,249,213,1,64,46,175,179,226,23,-24,103,245,226,23,3,198,133,0,73,229,130,3,225,17,0,101,46,108,118,-96,246,70,249,192,35,2,95,57,57,108,214,141,40,160,118,128,115,128,219,-129,40,64,99,131,232,67,109,0,75,135,134,129,68,224,10,4,224,12,2,-0,58,158,144,240,67,0,1,95,56,69,200,96,7,0,54,163,69,4,48,-55,32,95,56,99,215,1,95,55,180,101,64,53,131,29,2,75,32,89,100,-83,65,60,233,114,4,138,151,130,198,208,24,162,17,119,169,129,103,0,51,-253,204,0,99,45,106,65,64,134,193,135,117,14,98,99,170,94,130,131,1,-52,51,96,33,0,56,77,184,105,150,128,34,128,0,64,156,198,101,192,103,-128,71,2,56,54,53,179,89,224,22,5,0,53,97,162,1,95,54,131,200,-171,9,230,2,0,64,190,212,116,137,81,96,21,238,40,1,244,138,2,0,-48,206,13,1,80,32,185,5,96,21,130,96,238,167,15,81,196,238,167,5,-81,230,206,167,66,245,133,211,1,57,57,105,4,192,150,130,77,247,145,4,-161,159,64,29,194,7,2,95,57,54,66,140,104,204,0,58,96,37,224,76,-4,102,31,100,77,230,30,93,65,166,230,30,2,96,133,160,121,97,52,129,-198,128,60,117,198,64,35,129,128,227,112,4,0,57,79,202,227,111,1,0,-50,229,135,9,103,79,64,54,64,250,0,58,96,21,227,124,18,98,91,227,-124,21,167,167,128,130,96,127,96,109,164,86,96,8,224,201,3,237,223,2,-224,201,1,129,203,206,5,65,42,193,101,225,60,2,161,61,225,63,9,224,-24,0,224,168,1,192,19,97,83,192,85,96,71,129,101,225,103,0,130,45,-0,65,65,9,130,26,2,95,57,56,65,71,86,27,2,58,57,56,130,23,-6,95,57,56,55,32,35,49,66,60,1,80,32,75,149,104,156,0,58,96,-36,5,10,65,32,80,32,58,64,32,130,65,77,20,1,57,56,145,16,136,-131,74,122,0,75,96,77,129,176,0,85,88,43,0,58,96,23,162,168,64,-13,195,33,133,200,226,105,1,203,143,71,8,253,201,4,139,73,79,19,0,-57,68,45,235,46,2,1,95,57,81,82,209,145,96,37,99,98,68,88,138,-125,2,95,52,48,239,142,0,0,58,96,173,194,3,64,87,237,44,10,192,-138,1,95,57,68,110,224,89,0,226,50,0,229,173,5,224,47,3,79,152,-224,47,1,0,58,96,9,138,41,227,34,0,238,227,2,129,181,237,211,8,-241,50,3,224,39,15,164,233,239,51,0,240,201,15,165,46,226,31,2,64,-8,207,16,224,7,5,224,190,7,224,54,4,224,145,0,227,218,2,192,13,-133,233,163,75,101,238,69,87,1,57,55,184,107,224,89,8,160,165,225,220,-0,2,95,57,55,65,211,128,37,129,194,139,61,160,15,224,51,0,224,219,-5,242,115,7,192,171,161,17,226,76,1,242,105,0,224,88,7,224,104,11,-225,119,1,160,226,238,180,5,224,94,0,160,32,224,145,4,242,206,1,209,-111,130,166,128,224,242,55,2,224,118,7,224,50,7,133,176,160,130,229,140,-0,227,37,3,160,217,228,29,7,224,225,9,128,88,144,160,160,0,164,104,-224,193,11,224,53,5,225,61,0,88,64,146,54,224,188,10,132,100,0,58,-96,16,209,242,128,86,130,17,164,225,225,85,15,193,52,227,93,8,192,24,-0,85,199,25,224,33,8,165,166,239,230,1,138,195,112,41,2,79,32,35,-70,11,201,178,96,255,99,247,0,95,65,139,0,58,97,145,68,237,1,52,-56,97,68,64,143,1,95,52,72,247,139,2,1,51,48,69,24,98,194,0,-58,96,6,227,198,3,192,193,242,210,6,227,114,3,225,209,5,228,79,3,-225,66,2,232,205,0,227,200,2,225,221,12,163,238,225,0,0,158,45,115,-180,97,4,195,90,128,54,227,231,20,224,67,5,97,221,104,27,96,64,224,-76,4,161,56,64,164,221,202,226,52,0,130,138,246,209,9,98,239,132,22,-224,210,0,228,235,22,160,25,224,27,5,242,200,34,0,97,82,191,3,78,-101,115,116,242,201,25,224,42,1,246,214,58,225,178,13,228,108,1,129,250,-97,47,193,238,161,198,224,24,16,64,0,225,54,24,161,155,224,126,1,224,-39,1,228,140,10,226,18,7,197,170,246,196,19,224,151,7,246,208,7,224,-82,2,132,223,131,235,224,74,0,78,197,72,24,132,195,130,47,134,41,193,-48,225,54,2,225,55,0,232,232,10,160,151,224,138,2,224,205,4,131,3,-224,150,0,101,56,247,37,11,230,187,0,225,42,15,160,40,224,92,4,128,-1,228,246,2,225,179,16,192,52,183,16,96,0,108,168,0,58,96,36,197,-18,227,64,29,192,153,225,79,0,129,56,128,60,226,21,18,225,237,2,229,-72,14,224,167,0,129,179,2,64,95,56,233,22,1,229,91,29,96,125,225,-76,0,192,72,1,95,49,107,12,133,59,71,252,3,54,53,32,95,99,48,-128,67,225,70,2,193,33,96,16,0,55,96,253,0,50,92,6,101,169,225,-55,1,65,56,138,47,128,240,230,68,34,192,48,224,28,4,96,227,224,224,-8,96,21,232,63,5,225,57,14,97,54,128,198,152,242,225,57,4,225,58,-26,253,209,0,137,25,1,53,49,229,182,0,99,132,70,112,0,58,96,90,-140,170,2,50,32,58,100,67,172,73,1,80,32,133,42,0,80,98,81,206,-9,1,67,39,98,84,194,200,98,151,228,19,0,76,105,226,195,0,135,159,-128,39,201,19,226,73,25,227,52,11,224,39,4,229,190,4,254,179,6,64,-213,65,19,225,108,4,229,140,6,0,98,69,135,0,103,213,164,229,101,4,-160,84,164,97,192,135,197,102,160,198,110,214,96,172,105,31,226,223,1,160,-169,228,228,2,194,241,251,152,7,163,146,224,227,17,228,24,0,164,178,231,-239,11,234,211,1,224,124,8,103,222,65,162,99,110,233,236,11,228,95,0,-226,48,5,128,138,225,3,0,192,193,225,223,0,97,187,224,37,0,225,190,-11,225,55,1,193,194,224,46,13,196,177,192,28,225,200,50,0,49,225,201,-11,224,88,0,226,133,3,225,208,4,227,173,0,132,232,64,61,97,82,225,-213,2,229,148,0,72,192,160,70,225,187,5,224,220,13,225,113,1,226,205,-11,225,197,10,224,109,5,160,79,253,170,3,195,235,78,160,102,111,228,10,-0,253,148,2,224,68,8,225,231,2,226,138,14,229,104,4,0,64,111,52,-104,194,64,6,64,4,0,58,110,229,111,126,68,57,0,73,100,10,207,195,-3,54,56,32,58,96,95,210,117,64,137,82,117,64,25,160,34,0,54,64,-34,241,103,1,0,80,152,114,132,83,71,167,128,37,0,52,64,37,210,212,-96,37,98,78,128,37,132,159,129,113,129,164,64,138,0,58,99,132,234,32,-1,226,112,8,1,95,57,87,163,128,13,224,246,3,3,95,54,57,48,166,-40,97,236,0,58,96,82,208,86,167,28,1,52,54,230,75,3,128,123,230,-14,2,64,109,230,14,11,195,147,131,42,230,14,36,199,136,230,14,11,192,-86,230,14,0,96,217,98,7,255,157,12,252,161,15,150,21,128,110,222,22,-227,84,6,3,102,105,116,115,246,183,0,115,237,96,108,130,1,0,53,162,-1,65,25,85,127,0,50,230,15,1,96,240,225,132,1,233,109,0,225,148,-0,193,166,198,9,65,229,227,166,8,227,48,2,230,38,15,225,37,3,229,-26,2,224,35,4,235,7,2,228,67,3,64,22,224,238,6,10,100,105,115,-112,108,97,121,32,108,97,121,203,148,192,141,195,49,231,116,5,192,29,65,-79,173,227,225,178,0,229,167,13,129,103,192,55,97,191,2,50,51,53,78,-39,87,47,224,67,0,211,51,195,250,0,66,64,5,96,41,232,174,9,160,-240,64,157,96,32,224,172,0,228,26,15,225,101,7,233,237,7,225,97,10,-225,187,1,225,94,61,0,50,225,95,7,133,83,225,23,3,224,210,36,225,-118,70,65,207,100,252,64,9,97,1,96,5,99,254,0,58,115,251,229,4,-5,87,204,189,7,128,134,192,131,96,7,128,16,128,143,1,95,49,87,81,-86,47,91,46,0,53,105,200,224,11,1,2,95,57,53,130,91,74,193,0,-49,155,7,117,219,1,53,54,96,102,133,58,96,147,1,75,52,224,2,1,-128,170,96,154,0,54,192,154,0,54,192,154,182,123,112,97,0,66,137,157,-228,140,8,97,195,228,166,17,129,250,225,82,6,178,26,0,85,85,223,225,-249,4,64,24,164,192,228,90,3,224,43,12,97,197,224,43,10,224,114,13,-171,182,224,70,9,97,70,224,114,30,98,152,224,114,11,224,115,0,225,0,-4,96,30,224,141,12,98,23,224,97,11,64,24,224,141,31,98,12,224,141,-11,224,44,11,107,173,224,186,12,178,41,98,79,0,58,96,6,185,229,0,-48,66,232,138,167,0,52,66,183,1,95,52,102,200,94,15,0,49,128,26,-1,95,51,124,229,66,155,192,44,1,95,56,90,61,130,205,2,95,56,50,-192,21,0,52,109,22,70,102,160,58,2,64,95,49,120,139,130,122,231,128,-0,0,83,98,101,167,21,210,174,83,17,98,232,0,55,131,180,132,46,3,-95,56,49,50,64,183,126,24,128,207,190,118,131,164,68,64,227,175,2,228,-75,1,17,114,101,99,117,114,115,105,118,101,32,109,111,100,117,108,101,58,-32,132,81,160,180,100,53,1,95,56,92,80,64,176,224,59,5,13,44,32,-105,109,112,111,114,116,32,99,104,97,105,110,160,57,4,66,32,95,55,49,-65,32,126,159,128,57,161,91,0,56,64,177,2,58,57,53,189,109,4,56,-49,51,32,75,186,237,195,228,227,237,3,101,162,0,55,136,110,193,27,212,-148,0,66,97,100,0,55,77,87,7,95,55,57,52,32,95,52,51,128,39,-234,241,0,98,100,130,132,224,42,0,161,1,64,48,128,168,90,80,1,95,-57,193,255,128,57,167,74,191,188,71,78,200,168,193,130,1,95,56,72,235,-189,64,2,56,57,51,64,11,240,208,3,225,38,6,0,77,97,88,9,32,-110,111,116,32,102,111,117,110,100,193,98,161,186,225,101,0,2,49,49,56,-65,20,137,66,224,71,10,13,94,42,115,101,97,114,99,104,32,112,97,116,-104,61,128,67,128,178,165,220,65,51,96,69,125,215,64,145,224,69,12,6,-112,97,99,107,97,103,101,224,70,3,224,57,3,225,14,0,98,67,0,50,-95,10,64,4,0,51,223,186,160,228,230,246,3,161,191,225,105,3,193,102,-1,95,52,90,94,128,0,96,237,114,144,135,38,0,39,131,20,161,154,224,-31,1,82,109,112,127,235,160,1,225,37,0,197,254,1,50,51,128,223,122,-30,233,173,6,128,5,101,243,1,95,52,90,46,1,57,52,200,105,192,171,-226,61,2,209,230,224,157,3,169,108,217,4,1,95,56,95,27,227,73,22,-193,86,3,100,111,101,115,97,236,6,99,111,110,116,97,105,110,163,88,161,-244,97,105,193,174,199,59,246,218,0,227,47,4,224,169,8,226,231,3,224,-201,1,68,68,225,66,0,162,82,240,51,0,130,96,99,74,0,80,66,234,-0,52,153,197,65,237,239,61,6,128,0,65,78,0,55,94,59,1,95,56,-126,213,1,57,52,158,126,1,57,53,138,156,224,238,1,2,46,116,120,79,-236,0,58,96,33,103,42,2,95,57,52,123,96,64,5,0,58,96,105,108,-134,75,244,0,49,96,25,0,55,76,91,128,5,0,58,96,37,163,202,65,-109,108,148,95,242,224,100,4,161,83,75,59,0,58,97,196,165,24,226,57,-5,163,69,1,52,49,64,209,81,82,101,132,104,32,1,95,55,178,153,1,-52,49,215,93,226,155,1,65,205,127,100,225,200,5,7,76,111,97,100,105,-110,103,32,193,208,201,98,228,73,4,226,223,0,0,55,72,179,195,135,224,-148,2,132,121,224,147,2,98,169,4,56,52,32,95,51,124,243,1,95,57,-70,46,1,95,52,102,52,226,90,22,0,80,160,137,29,99,111,109,112,105,-108,101,32,118,101,114,115,105,111,110,32,109,105,115,109,97,116,99,104,58,-32,102,105,108,101,163,203,102,14,98,97,229,176,10,160,211,128,42,64,145,-132,122,128,139,224,44,7,160,110,0,114,96,45,192,169,96,0,96,163,0,-56,100,40,1,95,57,96,181,66,35,67,179,223,11,97,13,102,147,0,49,-135,27,199,255,224,24,0,1,56,49,65,62,160,24,70,215,192,47,224,22,-2,161,217,0,57,67,236,2,95,57,51,68,73,1,95,57,75,180,130,219,-4,32,95,51,54,53,96,81,0,57,65,222,1,95,56,67,72,2,95,57,-51,98,179,1,95,55,101,160,229,30,0,3,95,57,52,48,96,5,163,64,-228,91,4,135,43,67,52,2,95,57,52,64,54,0,58,96,214,138,36,70,-166,96,17,134,184,0,85,106,45,160,36,134,144,128,36,65,7,0,58,96,-101,3,10,65,32,90,69,31,0,58,96,139,192,32,74,94,0,58,96,190,-191,60,64,71,64,140,0,58,96,218,245,33,0,224,5,1,67,141,79,169,-225,8,0,0,49,99,97,197,168,64,6,224,25,6,162,90,255,85,2,192,-26,0,50,148,163,96,6,224,26,0,1,50,49,65,93,105,246,0,57,100,-148,160,6,0,58,97,114,203,35,160,184,163,127,204,63,0,66,244,128,1,-64,1,236,121,1,67,207,128,96,140,73,162,47,1,57,50,65,51,101,0,-65,182,2,95,57,49,72,32,1,51,48,152,78,229,110,0,245,124,9,96,-62,140,111,144,43,224,43,27,133,197,129,74,149,168,137,48,160,249,231,194,-15,231,189,9,16,117,108,116,105,112,108,101,32,105,110,115,116,97,110,99,-101,115,232,232,3,65,89,232,1,4,224,0,4,1,95,56,97,90,97,118,-0,52,65,104,165,165,65,76,170,90,128,200,0,90,64,198,192,9,2,95,-57,51,67,30,234,17,1,64,54,80,24,1,32,89,97,92,129,116,128,217,-235,100,6,96,109,224,25,12,0,50,101,233,129,50,235,96,1,236,54,2,-139,40,160,133,224,37,22,246,248,1,160,0,224,49,6,236,70,2,128,48,-0,90,192,232,224,38,23,128,89,0,57,198,228,160,0,240,148,18,128,40,-130,107,224,90,2,100,153,209,252,226,62,2,97,252,128,17,224,49,19,160,-32,104,225,212,219,192,49,128,28,153,39,244,216,1,225,64,19,236,110,2,-225,63,3,171,192,160,0,0,58,65,245,65,230,238,97,21,206,71,224,25,-9,101,21,237,122,12,100,12,237,122,12,138,108,224,184,16,96,30,224,185,-10,134,193,224,244,2,129,86,225,83,8,100,140,225,133,7,128,44,225,82,-0,161,72,224,88,5,162,6,130,180,224,104,3,224,164,10,101,11,224,163,-20,225,21,13,99,175,225,21,12,191,214,224,111,14,102,132,225,19,26,224,-58,10,239,209,2,224,170,15,224,59,16,227,132,14,224,59,3,227,249,14,-224,231,3,224,25,4,98,192,240,32,22,227,183,28,128,138,1,49,51,204,-33,224,58,17,129,234,224,58,8,0,57,76,97,0,53,103,223,224,65,23,-64,58,224,65,11,224,124,1,226,234,14,224,210,20,227,253,3,224,85,2,-224,146,2,224,58,16,227,35,14,229,29,2,240,86,0,100,214,0,58,96,-6,163,232,5,95,50,49,52,32,73,225,6,1,136,185,224,20,0,74,46,-160,20,0,58,96,225,192,54,1,57,50,135,211,0,56,72,99,64,32,75,-54,3,47,61,32,58,96,18,64,12,0,61,96,12,203,100,118,76,99,110,-75,151,64,189,132,200,163,185,228,228,14,228,230,1,96,159,224,7,2,160,-210,64,150,1,50,54,224,150,0,1,75,50,209,77,160,240,99,192,0,58,-96,6,202,24,244,139,1,144,219,71,71,0,53,76,18,107,0,105,231,113,-18,2,64,95,55,104,170,0,58,71,58,128,61,96,198,160,152,81,120,76,-66,201,200,205,181,233,214,2,162,235,171,17,177,13,101,174,0,58,96,98,-236,125,7,72,158,193,44,194,60,149,202,0,83,194,74,64,171,0,55,184,-195,2,95,56,49,174,114,100,165,160,124,160,81,64,204,89,122,105,126,113,-66,162,159,200,18,0,58,73,122,233,96,0,138,95,64,239,202,25,66,78,-0,58,105,199,202,61,64,14,129,219,128,151,224,148,26,91,126,72,162,97,-233,233,117,3,107,46,224,141,1,0,58,96,37,113,147,0,51,73,22,96,-107,129,214,2,85,32,58,96,192,241,176,3,129,129,105,239,241,159,0,0,-58,107,183,224,37,7,64,35,128,45,97,30,241,205,1,0,58,108,22,245,-131,2,96,18,235,95,3,224,2,0,169,51,0,58,112,151,128,253,161,235,-129,245,129,162,225,238,0,2,95,56,56,199,9,128,2,124,136,162,205,211,-152,111,105,65,98,226,59,0,223,102,224,55,23,98,75,96,59,207,199,2,-79,32,35,78,68,182,251,226,140,1,192,80,192,14,227,84,2,224,78,11,-208,11,0,49,80,106,160,76,130,230,244,95,5,164,136,227,175,2,3,95,-51,52,55,192,80,122,57,0,95,102,103,1,56,56,132,76,241,128,0,97,-106,0,95,116,123,224,70,9,224,68,3,241,179,2,161,88,244,254,15,194,-241,161,61,164,98,235,91,32,0,70,78,204,243,23,7,147,7,242,115,6,-224,168,23,196,90,225,92,2,2,95,56,57,96,28,170,60,96,2,225,121,-2,65,232,196,38,236,176,2,133,28,216,93,0,56,81,10,96,146,226,56,-1,0,57,181,12,245,191,3,160,14,96,242,129,245,66,175,131,206,225,243,-5,3,95,57,48,50,225,1,2,6,109,104,115,105,110,46,104,220,28,162,-32,106,119,128,10,100,136,246,59,8,131,209,194,184,224,30,1,128,53,3,-67,32,95,56,86,69,160,150,225,115,5,9,35,108,105,110,101,32,49,32,-92,34,240,46,7,224,40,6,3,92,34,94,42,192,150,128,72,224,194,16,-2,111,117,116,224,195,1,192,192,165,64,227,72,5,224,169,2,1,95,57,-101,145,192,226,225,182,0,161,211,97,143,64,60,224,252,2,0,57,115,134,-226,102,0,224,23,6,225,165,3,160,0,0,58,97,172,247,194,9,0,49,-101,147,1,57,48,64,105,64,26,113,166,69,144,96,28,71,117,103,190,135,-219,251,124,5,5,114,101,109,111,118,101,98,185,5,102,97,105,108,101,100,-128,246,0,58,96,131,11,10,65,32,94,117,110,108,105,110,107,32,58,96,-93,225,255,9,2,51,53,54,238,93,3,6,72,83,67,80,80,72,83,225,-255,5,224,46,4,161,239,252,191,1,96,2,225,249,8,161,20,224,201,4,-146,244,168,249,146,235,226,15,8,7,82,117,110,32,99,112,112,104,206,214,-227,126,12,1,95,57,88,200,224,160,1,160,108,130,54,7,55,50,56,32,-95,52,48,49,64,4,0,51,72,183,0,64,224,93,1,96,89,226,69,0,-224,222,1,224,131,5,7,32,45,45,115,116,114,105,112,128,129,225,252,3,-65,156,136,45,96,54,120,89,226,213,1,2,95,57,48,238,214,0,160,39,-3,67,39,32,79,224,229,0,224,149,15,1,45,73,162,251,0,32,118,31,-224,25,2,10,115,114,99,47,114,117,110,116,105,109,101,128,34,101,137,65,-60,1,51,53,192,117,85,176,197,240,230,4,2,224,19,0,70,231,179,19,-227,130,3,245,231,3,227,117,17,2,32,45,79,225,46,1,98,86,0,54,-98,69,0,79,224,35,2,8,45,68,95,95,77,72,83,95,95,64,41,0,-75,71,172,65,6,135,26,226,229,11,64,14,133,198,226,231,19,128,169,244,-131,16,8,99,97,108,108,67,111,109,109,97,69,168,130,249,161,174,225,125,-2,130,60,0,50,89,86,97,53,224,66,5,0,44,226,97,18,96,234,136,-65,6,94,115,121,115,116,101,109,67,65,201,165,227,190,3,117,219,64,217,-73,39,131,190,0,54,97,241,160,20,125,196,1,95,56,66,236,128,44,228,-89,0,0,51,93,195,228,60,8,100,110,230,227,7,79,154,1,95,57,96,-157,96,46,228,90,1,165,222,64,29,122,205,71,187,161,122,2,54,53,49,-102,59,65,87,141,12,0,35,74,208,120,133,0,49,170,83,141,133,176,231,-109,188,226,164,5,130,30,103,248,2,51,50,48,229,142,4,4,108,105,98,-47,83,97,26,13,47,73,79,46,104,115,92,34,44,51,48,56,58,56,129,-133,0,90,129,38,87,229,96,109,97,17,2,48,54,32,128,130,160,19,96,-0,0,67,64,36,180,119,64,195,82,90,115,227,0,58,96,240,65,129,8,-116,109,112,110,97,109,101,32,58,97,70,255,42,5,0,90,224,1,0,105,-182,193,189,103,42,97,172,0,95,97,222,85,107,2,54,32,89,135,94,134,-8,65,58,131,255,72,214,240,22,0,235,105,3,192,13,97,36,238,87,3,-1,35,49,197,217,96,36,96,46,96,10,204,185,65,120,224,45,1,217,240,-96,33,249,12,1,224,42,11,100,93,192,0,109,215,224,129,15,153,155,96,-123,224,117,13,190,73,96,112,224,33,14,130,240,224,33,19,139,176,224,67,-20,138,224,64,33,148,58,98,86,224,36,7,96,138,242,209,1,224,0,3,-225,132,8,131,20,225,133,26,193,44,225,132,71,0,49,241,234,3,239,192,-7,224,133,9,192,181,163,81,74,236,90,101,99,115,255,207,4,132,14,132,-41,66,243,230,153,4,132,141,126,167,0,54,68,26,138,81,76,253,106,58,-108,204,91,115,0,56,68,207,0,58,106,196,173,158,64,13,133,114,0,85,-67,35,132,183,0,85,67,192,0,58,74,240,160,58,0,49,64,27,132,30,-0,73,64,10,163,107,135,1,133,104,231,72,5,97,250,229,52,6,254,45,-0,0,58,75,86,96,89,0,54,71,8,79,41,227,95,14,68,59,232,179,-4,72,146,1,116,58,90,46,0,115,90,216,10,92,92,101,110,100,123,99,-111,100,101,125,160,91,128,134,242,33,3,228,160,16,228,145,2,224,70,12,-207,104,165,55,1,48,54,129,123,0,85,226,108,1,226,126,2,239,193,1,-237,213,1,160,30,192,135,5,54,56,56,32,95,54,209,135,202,245,246,11,-6,224,173,28,4,98,101,103,105,110,224,175,4,176,130,224,76,6,98,213,-128,11,128,152,106,192,160,150,98,139,224,13,2,227,40,23,224,41,2,160,-57,224,16,0,217,50,224,75,3,227,199,8,248,50,0,177,172,225,94,0,-224,56,1,227,81,13,0,54,195,247,128,55,3,66,39,32,85,226,22,22,-13,98,108,97,110,107,32,98,101,102,111,114,101,32,62,234,145,3,71,99,-96,119,134,81,161,199,65,210,227,106,1,225,224,5,96,40,230,217,11,224,-54,6,227,159,4,0,65,104,64,109,120,0,54,67,44,1,64,58,110,195,-146,57,108,213,0,56,192,222,225,229,15,236,134,0,175,45,173,147,1,95,-56,69,119,0,58,112,26,140,13,129,49,111,125,0,56,64,216,135,31,128,-6,0,58,64,103,128,118,114,10,129,65,224,183,2,192,18,129,84,224,246,-2,96,85,192,29,193,159,243,67,7,99,203,64,116,135,45,255,223,0,1,-56,48,91,15,0,56,96,76,96,55,126,96,128,10,1,56,56,156,5,196,-42,100,180,0,56,225,138,0,96,81,177,165,2,51,56,57,75,235,100,198,-64,53,224,101,34,0,51,105,52,224,101,21,196,221,0,56,68,221,64,70,-209,177,64,28,180,216,1,50,57,67,221,0,56,78,170,2,95,56,55,70,-173,116,205,65,138,0,85,64,23,64,101,2,58,56,56,242,238,0,188,97,-96,24,64,63,2,49,49,57,142,68,98,120,74,175,64,13,64,35,1,95,-51,147,109,65,76,80,88,96,92,0,95,70,61,160,11,0,58,96,6,97,-7,2,48,32,75,75,183,68,24,1,48,49,226,246,2,25,67,111,110,116,-114,111,108,46,69,120,99,101,112,116,105,111,110,46,73,110,116,101,114,110,-97,108,66,58,224,39,1,3,83,111,109,101,224,35,0,98,85,137,52,96,-215,123,187,132,139,64,227,101,190,168,245,0,52,177,120,70,145,202,54,1,-95,52,69,188,64,59,193,247,130,123,0,53,129,123,99,246,164,74,1,95,-56,70,139,2,95,56,55,119,102,85,93,96,55,171,225,164,36,163,16,1,-52,57,182,128,168,3,224,22,3,98,170,224,22,9,97,202,224,22,9,174,-67,160,137,160,20,105,223,2,95,51,48,71,3,1,53,56,96,154,185,159,-128,19,0,54,96,19,0,54,224,19,10,0,55,180,237,224,19,4,131,60,-224,19,5,96,142,1,95,56,66,154,0,58,96,242,9,10,65,32,105,115,-105,110,116,32,58,96,20,71,48,0,51,64,11,130,105,149,25,0,58,96,-75,138,183,103,140,64,110,234,198,1,96,145,226,135,2,82,170,1,95,56,-116,122,3,95,56,54,54,160,124,64,11,0,55,224,11,0,1,51,49,224,-11,0,0,58,96,6,129,164,145,75,66,93,127,134,243,131,4,131,50,84,-246,134,150,105,142,132,202,194,166,224,15,7,96,92,240,22,1,0,95,69,-174,128,89,64,141,104,101,0,54,130,32,2,80,32,58,96,16,224,198,3,-0,50,96,198,140,202,99,197,192,147,96,210,160,11,224,81,0,0,58,96,-6,227,78,37,128,92,131,78,96,11,0,58,96,6,227,78,64,4,65,115,-121,110,99,227,83,12,64,220,192,171,0,75,97,119,0,80,64,248,0,57,-224,104,2,13,115,116,97,99,107,32,111,118,101,114,102,108,111,119,137,188,-224,33,5,3,104,101,97,112,224,32,5,224,33,7,9,116,104,114,101,97,-100,32,107,105,108,241,185,0,224,33,6,5,117,115,101,114,32,105,64,193,-3,114,117,112,116,167,5,193,30,98,66,161,30,134,160,64,6,225,30,60,-225,26,18,130,220,1,80,32,67,164,106,98,67,133,226,24,2,0,53,70,-192,1,56,53,106,60,130,24,67,172,194,24,192,11,66,24,96,11,0,58,-96,6,225,108,1,2,85,32,83,200,250,252,23,1,202,83,252,16,2,228,-161,0,254,137,1,0,85,225,163,7,19,82,97,116,105,111,90,101,114,111,-68,101,110,111,109,105,110,97,116,111,114,161,67,224,43,8,64,34,1,114,-109,129,7,224,32,13,6,105,118,105,100,101,66,121,64,79,192,36,224,151,-6,65,132,224,151,6,67,160,224,74,8,11,76,111,115,115,79,102,80,114,-101,99,105,115,193,94,224,38,10,2,85,110,100,226,60,3,224,33,10,0,-79,226,93,4,64,0,162,27,129,126,130,27,96,11,0,58,96,6,226,27,-61,3,114,105,116,104,226,27,12,65,250,250,68,4,102,60,9,10,65,32,-99,97,116,99,104,32,58,102,96,104,241,100,111,240,226,8,1,56,53,198,-15,244,77,6,136,71,246,112,0,0,58,118,80,229,128,2,64,55,250,171,-4,0,56,82,73,104,25,92,159,0,56,70,63,2,58,56,53,130,186,224,-201,1,96,223,4,97,99,116,105,118,83,95,0,58,96,38,128,52,93,50,-64,123,0,58,64,63,128,178,113,216,3,95,56,52,52,96,5,0,54,96,-27,197,60,1,95,56,78,93,1,116,111,96,86,64,24,129,8,77,103,64,-24,165,65,64,58,160,46,73,186,113,121,2,56,49,50,64,61,64,253,0,-51,137,207,125,12,2,95,56,52,97,10,1,58,56,77,152,225,83,5,64,-25,96,165,250,218,0,0,90,169,230,102,70,84,66,64,0,0,58,96,85,-245,242,0,236,204,0,64,8,77,155,0,58,96,41,251,207,1,0,56,84,-50,104,72,115,155,96,231,0,55,157,159,245,255,0,5,55,53,57,32,95,-55,153,108,0,66,250,14,4,0,55,70,41,248,198,1,225,188,1,246,208,-5,115,46,96,237,0,55,70,121,246,21,0,96,81,105,241,238,112,6,3,-76,111,97,100,76,14,11,115,97,118,101,100,32,99,97,99,104,101,32,66,-114,243,182,8,192,150,102,188,205,160,224,159,7,2,58,56,51,225,206,0,-209,55,176,101,0,67,96,11,1,95,55,136,63,140,101,1,51,54,202,168,-207,222,122,204,171,72,234,196,0,0,55,105,28,128,23,144,44,64,44,64,-24,79,125,96,131,96,40,125,237,240,222,2,203,148,224,73,0,235,3,4,-71,235,83,206,225,11,1,249,153,2,132,118,128,64,242,200,1,249,169,0,-252,233,1,180,74,128,94,192,91,1,95,56,247,64,12,65,179,224,40,6,-131,111,128,41,161,1,97,204,0,55,137,42,212,95,0,51,146,4,224,0,-1,1,95,54,106,255,128,96,255,39,1,224,141,7,75,254,64,7,70,25,-110,73,1,95,56,224,73,0,128,49,122,63,224,114,3,193,64,64,253,196,-37,225,162,0,96,198,224,45,2,248,117,8,96,213,248,125,16,9,105,110,-118,97,108,105,100,97,116,101,130,105,182,83,130,107,0,56,75,78,160,0,-192,203,225,49,4,99,212,2,95,56,50,138,128,171,83,226,66,3,96,157,-120,159,176,106,96,220,0,55,110,92,2,95,56,51,138,144,128,0,2,95,-56,51,100,97,66,200,173,250,65,232,68,0,242,142,0,102,101,161,38,111,-187,225,162,0,143,149,98,25,1,95,56,237,46,0,143,223,64,168,145,223,-110,139,0,58,96,104,68,78,67,73,109,97,110,31,159,139,0,58,96,42,-100,20,64,128,131,44,112,58,224,105,4,150,133,192,135,196,3,206,126,80,-144,64,169,96,32,96,55,222,42,224,61,3,100,159,97,108,65,27,0,58,-96,126,100,156,107,67,64,147,96,13,181,231,0,58,96,214,102,206,2,54,-53,32,101,50,131,176,98,79,67,58,0,51,100,179,106,79,0,67,89,132,-175,240,1,95,55,74,66,0,58,97,109,229,27,0,66,160,242,108,0,189,-129,128,225,160,169,64,162,2,95,56,49,66,154,130,100,195,225,0,56,72,-212,0,55,74,46,98,98,128,10,193,12,225,152,0,161,45,134,215,224,2,-1,193,239,196,12,129,96,224,126,0,226,228,1,225,232,0,96,8,1,95,-54,66,117,109,193,161,207,212,174,128,155,96,181,65,2,122,158,224,125,2,-68,46,224,44,1,0,58,65,34,129,3,230,135,0,76,62,230,135,0,110,-18,0,50,77,24,194,42,66,218,208,136,224,178,0,134,200,0,85,161,6,-226,6,1,160,117,133,92,210,142,0,55,71,231,225,39,7,160,45,225,27,-10,225,52,0,225,18,8,78,233,225,18,25,128,73,128,134,233,152,0,0,-64,104,34,216,48,224,34,4,192,110,73,106,224,38,11,110,240,64,31,66,-188,0,54,85,169,102,122,0,56,108,183,160,6,64,165,195,40,160,45,129,-138,103,194,105,197,0,75,146,97,96,9,122,32,65,150,103,63,141,228,107,-1,224,52,0,128,34,224,61,9,96,53,197,158,225,227,15,65,191,99,191,-0,80,68,134,192,226,168,3,193,134,0,90,225,120,6,226,174,0,227,8,-1,160,2,97,27,194,221,102,110,224,80,4,225,91,6,128,38,66,138,160,-167,160,16,160,168,128,28,250,196,0,224,182,4,208,212,224,182,68,226,64,-0,164,139,224,180,12,192,36,101,222,161,148,224,181,18,192,14,96,5,96,-234,248,59,1,0,58,96,64,228,102,5,224,178,0,168,121,229,47,0,159,-75,229,91,2,1,53,55,162,95,198,216,0,56,70,74,226,105,2,160,6,-134,220,224,89,2,118,33,128,114,225,23,6,192,114,224,227,1,234,22,1,-224,11,0,160,9,160,133,128,207,128,19,228,238,17,225,61,0,225,44,1,-224,200,0,137,95,0,82,220,236,224,75,23,251,201,2,225,222,5,225,39,-1,64,15,137,161,227,132,8,71,255,161,38,1,95,56,152,193,128,24,224,-78,17,227,210,18,224,77,18,165,94,225,188,3,162,171,0,75,104,20,128,-114,129,13,198,6,224,13,19,224,156,1,226,194,1,224,35,1,128,17,128,-243,1,52,54,224,164,18,0,50,224,24,2,96,0,1,95,56,107,120,2,-95,56,50,193,170,226,27,1,224,176,10,224,177,65,162,112,96,158,224,177,-39,136,129,0,50,194,7,128,21,97,111,0,58,98,143,236,213,2,224,195,-17,169,19,128,1,231,13,0,192,8,0,58,96,94,224,72,33,224,234,1,-224,86,1,226,57,0,224,5,1,71,7,192,61,229,148,4,96,49,233,176,-0,233,185,1,225,57,0,224,167,5,160,58,129,26,90,72,227,106,1,96,-16,224,15,0,192,224,224,168,0,224,119,34,192,35,225,39,19,128,26,228,-225,4,192,24,129,69,0,51,173,80,196,81,227,5,16,225,143,2,224,124,-3,224,79,0,224,103,17,0,58,98,188,224,101,34,226,154,3,225,181,2,-225,46,6,160,67,224,24,3,192,152,225,150,76,224,98,10,225,129,60,138,-202,3,35,50,32,58,99,76,87,152,224,249,0,224,180,2,96,2,165,255,-160,13,132,81,160,5,135,36,224,225,1,224,51,1,235,189,0,71,241,171,-7,231,51,4,231,65,7,224,108,3,192,188,169,180,101,247,230,209,8,102,-105,230,222,5,134,214,228,24,0,79,60,0,58,96,248,99,179,176,242,65,-90,144,204,64,148,193,5,69,169,227,217,0,228,202,21,225,228,3,227,217,-0,64,8,167,222,0,58,96,174,168,138,80,166,2,75,50,32,128,153,0,-75,113,54,64,32,183,24,241,143,8,224,81,6,1,95,55,117,165,160,85,-204,222,0,58,64,54,128,10,117,77,87,210,146,36,0,55,88,71,64,60,-249,184,1,109,211,144,70,0,58,110,110,213,55,3,95,51,51,57,206,162,-2,95,56,48,66,153,147,252,96,17,0,58,96,6,179,32,1,95,55,123,-87,0,58,96,37,215,250,78,224,0,55,124,202,1,56,48,99,18,65,160,-142,154,235,253,0,79,153,114,201,65,236,96,171,64,42,96,17,156,117,0,-75,220,147,0,58,111,204,224,197,17,110,186,65,96,96,202,0,58,112,5,-97,98,3,95,52,56,50,95,101,64,207,64,8,1,56,48,129,98,80,174,-13,10,65,32,94,109,100,53,66,70,73,76,69,32,58,96,25,228,17,2,-64,172,142,213,105,178,113,202,92,117,2,95,56,48,160,145,225,87,0,78,-229,75,99,254,161,4,1,64,35,83,179,96,144,1,95,52,146,62,221,166,-64,64,225,59,8,244,74,6,0,58,96,24,65,141,2,55,57,55,64,13,-129,43,207,171,0,83,160,106,0,51,87,43,107,189,173,51,2,51,50,48,-240,127,2,31,92,34,109,104,115,47,83,121,115,116,101,109,47,70,105,108,-101,80,97,116,104,46,104,115,92,34,44,49,49,56,58,49,0,52,177,254,-194,198,228,218,1,130,99,1,95,52,96,196,129,188,157,52,158,249,84,132,-64,209,175,16,96,231,0,58,64,169,160,216,2,51,32,90,224,1,14,233,-139,0,192,0,0,58,97,97,161,121,126,133,179,97,186,140,238,202,5,245,-227,4,64,252,1,95,52,179,166,196,250,64,185,66,10,113,9,96,157,226,-242,8,64,14,98,131,163,147,96,232,96,69,0,58,96,50,226,104,2,96,-249,192,115,226,117,8,128,63,0,58,114,4,226,249,9,0,55,100,124,226,-249,10,115,198,245,131,0,160,18,194,78,239,10,7,0,80,91,133,64,35,-192,224,133,77,238,254,3,160,32,160,212,225,206,1,129,50,230,22,5,229,-187,2,139,214,64,107,64,79,238,241,3,160,73,164,24,96,187,66,138,86,-197,96,113,113,31,0,90,145,38,1,90,32,128,58,158,22,97,22,224,28,-4,73,171,224,28,16,76,146,224,28,16,107,61,224,29,17,0,52,224,117,-4,1,95,53,65,119,96,191,0,95,118,84,158,145,96,6,224,187,1,97,-150,115,100,151,254,1,55,55,66,205,96,161,116,38,128,16,128,149,224,16,-2,160,137,224,17,3,128,125,128,17,96,122,128,80,96,122,96,10,0,58,-96,6,224,122,0,95,252,2,95,55,56,117,222,0,56,119,10,0,56,100,-94,0,56,88,4,3,55,56,55,32,192,70,122,207,128,70,122,206,96,6,-8,10,65,32,98,115,62,61,32,58,96,41,128,13,64,12,0,54,160,12,-0,60,96,26,130,186,2,98,115,60,64,12,130,146,4,98,115,99,109,112,-64,14,196,221,96,2,227,234,0,141,74,98,75,2,64,95,50,79,219,231,-175,9,96,143,96,159,99,35,1,95,53,87,215,96,7,88,154,65,77,128,-229,0,56,193,154,225,161,0,130,161,130,82,123,188,97,104,101,62,96,6,-160,54,161,81,96,45,65,38,225,99,0,86,9,160,17,0,58,96,71,224,-48,1,64,143,0,55,86,18,0,58,96,32,96,233,0,47,65,4,64,19,-96,13,0,61,96,13,129,45,0,73,64,10,129,43,84,243,80,255,69,123,-69,149,0,58,99,165,101,104,1,55,48,227,223,4,0,83,67,222,134,80,-119,144,103,26,64,38,0,50,166,127,100,32,243,35,0,228,38,1,71,152,-65,73,191,70,160,13,196,121,224,53,28,0,90,224,53,2,3,95,51,54,-51,160,118,64,137,129,200,0,95,106,167,121,244,231,17,12,100,153,0,95,-83,131,150,43,0,95,93,32,128,67,0,95,106,86,128,10,0,50,118,76,-160,89,213,0,132,199,128,167,202,94,224,220,15,224,118,6,184,61,96,182,-96,101,129,236,64,6,193,134,129,198,224,85,13,103,18,224,77,2,0,58,-121,61,160,57,64,32,219,147,0,52,230,91,28,0,58,122,19,97,219,1,-54,49,183,36,160,5,117,181,224,11,0,0,53,66,71,89,208,128,43,66,-118,96,31,224,5,8,0,58,96,43,237,228,2,233,224,6,0,58,64,60,-160,69,0,50,64,179,129,173,0,75,96,11,197,225,224,59,2,233,214,11,-97,64,0,58,105,219,252,92,4,3,46,109,104,115,120,69,92,90,122,156,-136,16,231,18,15,102,58,231,77,7,130,115,251,76,0,185,143,166,182,73,-212,165,250,1,95,55,127,76,64,136,191,142,225,174,3,71,91,92,219,160,-105,224,132,3,1,95,55,93,74,225,222,7,248,99,1,233,36,6,0,49,-144,69,225,244,2,253,169,4,1,95,55,93,119,2,95,55,53,65,146,93,-251,160,32,224,109,2,115,204,98,134,224,213,7,226,73,3,96,200,212,186,-170,21,0,55,94,94,0,58,96,65,66,98,14,79,46,100,101,115,101,114,-105,97,108,105,122,101,32,58,96,29,74,35,20,97,100,100,95,108,122,55,-55,95,100,101,99,111,109,112,114,101,115,115,111,114,64,31,194,9,0,83,-107,65,171,165,241,191,0,1,95,51,186,210,243,26,1,225,17,3,129,138,-202,107,224,207,0,0,51,173,238,224,53,1,224,216,5,156,77,2,64,95,-52,64,157,192,215,130,114,0,83,160,215,161,13,225,34,2,67,132,169,62,-255,3,2,74,209,94,231,1,95,50,106,226,227,119,5,191,15,6,94,117,-110,103,101,116,98,64,237,130,189,192,100,228,187,5,1,95,52,70,95,225,-229,0,235,10,1,96,122,0,95,67,124,69,101,180,88,66,6,118,248,224,-35,2,95,145,66,241,5,35,50,48,57,53,49,124,77,2,35,53,53,128,-153,228,97,3,1,95,52,70,229,104,13,127,196,71,61,0,51,71,19,252,-214,2,17,104,71,101,116,67,104,97,114,58,32,115,117,114,114,111,103,97,-116,67,50,224,52,6,0,55,95,188,224,52,10,160,41,0,58,97,53,102,-47,1,35,52,140,157,96,49,239,11,0,228,186,2,0,52,64,24,201,179,-86,78,2,52,55,57,65,38,0,48,253,107,3,9,111,112,101,110,66,105,-110,97,114,121,75,135,128,101,230,2,7,1,95,52,65,101,230,28,0,64,-73,97,230,1,95,52,227,140,0,67,117,203,98,229,5,10,229,1,5,1,-58,55,95,110,102,183,71,74,131,74,75,209,78,119,1,58,55,68,252,130,-248,18,112,101,114,102,111,114,109,73,79,32,94,119,97,110,116,95,103,109,-112,96,32,0,54,228,177,2,192,165,1,95,52,188,88,196,200,224,24,0,-2,51,53,54,228,174,2,4,77,72,83,67,67,222,94,226,26,1,99,6,-240,38,4,227,1,5,83,202,1,51,51,159,221,1,95,52,92,75,0,64,-156,70,2,52,52,56,253,89,4,3,99,108,117,100,193,215,96,0,227,79,-1,224,2,0,224,86,40,3,99,98,105,116,255,19,0,192,184,247,76,3,-96,13,64,250,96,190,224,96,2,2,64,95,55,124,231,128,137,224,1,3,-120,213,224,22,7,241,194,5,224,1,5,225,80,0,229,147,0,125,227,2,-52,48,49,64,4,0,51,100,109,109,243,225,113,9,11,69,88,84,82,65,-67,67,70,76,65,71,83,224,198,4,237,72,4,141,37,128,193,224,5,24,-192,54,228,61,7,96,169,127,26,118,15,255,25,0,105,238,255,17,16,8,-69,120,101,99,117,116,101,58,32,255,8,2,1,49,50,79,159,79,1,225,-19,1,229,228,5,143,63,64,23,166,88,224,136,1,131,65,224,135,4,138,-55,74,157,64,58,185,113,2,95,51,52,65,82,224,141,5,13,99,111,109,-109,97,110,100,32,102,97,105,108,101,100,160,148,192,130,226,240,7,229,173,-1,224,245,15,128,54,96,248,128,10,224,109,5,1,67,32,70,63,7,105,-108,97,116,105,111,110,32,192,0,128,115,160,215,143,79,96,59,4,55,51,-57,32,35,250,46,0,129,41,0,50,142,208,64,227,0,55,103,17,128,175,-224,98,1,0,109,226,188,5,160,0,227,25,10,192,2,1,95,55,87,56,-103,140,226,96,5,224,83,1,2,36,73,78,224,84,5,227,18,4,224,2,-6,224,80,3,224,66,2,2,79,85,84,129,240,1,55,52,132,60,224,151,-0,224,2,10,98,238,224,35,1,128,1,224,193,1,240,116,1,224,29,1,-128,1,225,111,6,15,32,45,119,32,45,87,97,108,108,32,45,79,51,32,-45,73,224,197,2,231,167,2,225,10,1,224,87,1,224,86,20,11,47,115,-114,99,47,114,117,110,116,105,109,101,226,49,1,224,169,8,224,78,14,96,-22,2,79,32,35,146,223,224,59,3,231,242,4,96,60,65,77,118,20,100,-169,224,133,5,224,206,4,224,97,2,224,95,12,224,30,6,225,233,15,8,-45,68,95,95,77,72,83,95,95,224,90,1,224,88,30,0,67,224,238,2,-224,48,19,229,77,5,224,229,1,1,52,50,224,155,13,64,62,210,225,66,-246,96,48,224,190,15,0,39,225,141,0,1,95,55,67,236,128,140,225,142,-6,224,155,2,225,210,13,5,47,101,118,97,108,45,160,73,224,219,5,224,-57,10,1,46,99,160,116,165,16,225,183,5,1,52,50,105,174,227,217,0,-225,208,4,192,87,224,134,2,2,42,46,99,160,120,226,197,2,10,36,73,-78,32,45,108,109,32,45,111,32,227,71,0,224,0,19,2,95,55,52,104,-5,1,58,55,83,165,210,102,237,45,9,232,51,13,64,0,0,58,96,65,-232,102,2,232,105,2,224,45,2,0,58,97,101,210,180,64,254,76,112,72,-85,193,119,197,255,160,45,138,66,0,85,237,190,15,237,192,11,68,46,232,-130,0,126,239,194,94,116,238,160,109,197,64,179,254,217,158,224,19,3,132,-90,224,63,0,128,11,1,95,54,139,110,64,37,116,217,64,73,227,187,3,-0,58,68,205,64,128,171,62,128,23,229,172,0,145,47,64,59,229,142,0,-1,95,56,68,224,98,244,138,53,66,191,241,31,0,118,168,0,64,109,151,-0,49,150,223,96,40,128,69,64,207,96,14,235,23,2,241,54,0,96,107,-0,58,96,6,237,140,9,0,49,88,50,2,95,55,51,65,62,235,45,3,-246,149,3,96,78,102,167,1,95,55,96,197,199,27,0,58,103,94,78,165,-1,32,58,96,18,3,10,65,32,90,72,181,0,58,96,39,76,5,0,115,-118,65,64,30,172,106,236,204,6,1,95,55,92,251,99,0,234,12,13,234,-9,0,163,126,234,50,18,232,187,4,193,236,224,48,18,2,79,78,70,227,-18,0,230,72,4,96,20,130,10,128,175,122,118,162,31,224,8,13,1,95,-55,94,12,2,95,55,50,173,92,231,54,5,232,118,2,66,11,232,5,2,-76,202,84,34,158,147,0,52,122,109,143,130,233,6,0,99,247,2,66,32,-79,225,20,3,12,111,117,108,100,32,110,111,116,32,102,105,110,100,96,196,-3,67,39,32,79,192,128,224,42,3,3,105,110,32,102,172,54,230,52,1,-225,31,3,238,234,3,226,246,2,0,39,238,14,0,2,55,50,55,224,79,-2,6,100,101,102,97,117,108,116,167,147,0,50,235,2,4,164,130,96,22,-229,120,0,231,146,1,192,114,234,216,0,232,91,8,234,42,24,225,46,15,-234,54,17,11,70,111,117,110,100,32,116,97,114,103,101,116,234,59,9,2,-55,50,57,100,122,64,11,138,71,234,83,8,160,0,224,188,1,225,51,6,-225,53,7,64,32,220,112,128,192,144,191,130,69,97,77,128,77,225,61,14,-100,21,1,53,49,86,54,131,210,0,54,78,19,121,174,230,190,15,192,58,-192,167,225,128,1,224,76,44,3,102,108,97,103,234,13,3,133,145,161,200,-224,81,43,2,111,110,102,230,123,4,231,174,10,224,45,1,3,117,110,105,-120,135,68,234,185,2,0,95,116,14,96,0,0,58,109,45,69,23,1,53,-48,107,173,77,151,114,163,68,177,98,228,1,95,53,66,49,160,159,0,53,-116,191,96,11,0,58,96,6,213,3,106,185,114,179,165,66,217,44,224,12,-2,249,239,0,213,7,107,208,149,7,128,10,117,7,96,10,0,58,96,6,-213,7,249,124,0,224,66,1,116,215,114,188,0,58,96,6,198,255,127,2,-66,28,98,89,0,57,85,195,245,35,3,0,52,64,109,156,205,132,149,198,-152,0,95,208,226,83,9,84,220,129,172,96,24,3,95,50,57,57,73,66,-71,142,163,247,224,41,1,86,197,193,138,0,49,98,199,125,162,64,151,72,-118,190,98,134,132,65,244,244,181,19,66,206,250,144,0,103,239,160,2,160,-99,0,58,100,145,231,234,6,244,82,0,64,73,122,76,229,124,0,175,39,-250,94,1,198,133,98,98,224,225,0,180,107,0,53,96,182,128,102,189,185,-99,114,238,4,4,0,52,87,217,192,97,163,124,123,184,104,51,224,44,7,-121,59,186,252,96,44,134,8,1,95,55,96,31,170,21,228,165,2,196,121,-228,119,6,2,67,97,110,69,159,3,112,97,114,115,235,235,1,167,254,228,-225,44,174,29,245,151,1,232,193,0,243,160,10,224,85,32,229,55,16,2,-82,101,97,197,54,0,115,102,65,9,46,32,80,111,115,115,105,98,108,101,-192,22,165,78,206,98,101,56,229,61,4,0,89,97,237,66,9,193,231,64,-151,80,192,97,128,201,54,160,0,229,85,5,224,231,9,221,107,224,163,1,-160,135,0,46,228,96,0,0,58,104,77,184,36,246,75,0,5,52,57,49,-32,95,54,194,114,1,95,55,64,253,115,207,0,53,67,14,116,90,148,95,-65,51,91,245,1,95,55,182,91,0,52,91,136,0,58,97,249,184,63,97,-88,0,55,79,184,240,222,0,0,79,96,104,235,166,2,88,25,0,54,121,-59,224,170,1,2,58,94,42,229,222,1,96,51,225,113,8,2,32,32,102,-70,171,225,85,1,0,52,67,57,141,193,0,53,95,32,161,235,224,59,13,-5,101,120,112,101,99,116,240,138,0,236,47,0,2,55,50,49,227,59,1,-227,148,2,216,82,2,95,55,50,101,7,67,199,0,58,64,44,227,171,7,-235,150,0,206,249,193,183,195,10,128,27,1,95,55,96,21,132,124,163,90,-160,106,180,252,235,117,1,75,176,3,95,55,49,56,134,87,97,56,96,84,-138,251,128,53,64,188,228,53,7,1,52,51,224,242,2,16,102,111,108,100,-114,49,58,32,101,109,112,116,121,32,108,105,115,136,147,224,169,0,0,83,-68,233,160,14,179,53,224,10,2,101,68,160,105,132,225,0,85,139,98,244,-93,1,1,95,52,230,240,0,100,139,192,168,242,120,9,96,255,225,144,5,-210,17,224,83,0,235,76,9,224,26,13,246,242,6,224,90,10,2,108,105,-110,196,81,163,232,224,152,2,177,231,224,52,8,4,44,32,99,111,108,128,-53,224,40,4,238,48,4,6,101,110,100,45,111,102,45,202,47,224,26,3,-5,110,111,32,108,111,99,114,127,196,204,224,28,17,0,58,99,3,119,2,-129,241,225,231,1,173,45,0,35,84,156,71,213,172,71,64,7,193,237,244,-54,0,64,4,0,85,99,92,74,217,0,53,66,155,130,192,165,157,171,169,-129,213,65,241,65,180,250,34,1,226,77,0,224,46,30,96,146,162,215,230,-39,0,224,39,11,132,162,230,34,3,224,39,12,131,114,224,205,4,231,231,-0,0,83,224,82,6,164,246,152,223,192,130,66,162,250,244,4,0,35,79,-150,129,221,0,54,67,97,3,67,32,95,54,78,36,0,35,195,54,224,109,-29,224,69,0,192,108,200,84,224,108,12,128,228,224,77,5,1,67,39,156,-33,0,49,136,171,131,239,1,95,54,88,98,1,64,64,232,96,1,96,52,-1,95,54,121,47,98,2,96,173,71,60,73,52,66,227,169,32,78,249,200,-192,111,92,1,53,49,238,125,0,187,238,160,141,160,228,171,96,225,121,3,-0,54,153,1,128,14,225,150,2,99,202,0,54,130,11,225,30,29,140,175,-193,30,224,109,12,103,80,224,157,1,1,95,54,91,210,1,35,49,68,234,-224,160,15,224,50,14,169,215,192,142,68,149,106,15,224,43,10,0,57,128,-152,70,186,65,249,107,114,3,51,50,50,32,129,254,72,2,0,49,80,244,-225,56,7,100,196,224,19,6,169,74,224,76,11,96,100,1,95,54,104,41,-224,32,12,131,179,2,95,54,54,235,146,0,248,31,0,97,77,161,114,0,-50,102,178,133,136,225,108,18,177,57,1,32,83,225,47,0,229,172,2,167,-198,64,126,130,226,192,105,134,131,71,194,65,20,160,69,231,219,1,163,22,-224,160,0,224,134,24,177,180,166,208,189,144,221,149,234,132,2,69,162,160,-86,128,155,114,7,128,68,236,208,15,229,175,3,64,201,130,218,88,105,161,-141,132,120,65,62,118,194,128,194,65,206,104,159,120,128,113,35,2,95,54,-54,95,32,64,7,0,52,224,134,3,242,67,2,96,36,129,25,128,36,96,-90,128,42,160,48,2,95,54,54,247,35,1,225,24,25,228,152,29,165,106,-225,158,7,96,134,66,56,135,247,85,147,0,51,197,196,225,173,8,228,196,-3,128,150,131,62,96,9,162,25,218,254,200,139,229,171,0,133,224,96,122,-64,98,2,95,54,55,64,249,228,154,8,160,91,232,180,0,136,202,130,69,-96,76,129,9,227,68,8,140,109,0,54,153,54,226,103,26,228,148,0,96,-119,224,21,8,0,55,170,63,195,48,96,21,225,78,3,105,62,197,150,65,-3,224,29,4,214,26,135,25,197,90,0,56,96,254,231,246,5,16,85,110,-114,101,99,111,103,110,105,122,101,100,32,105,110,112,117,241,3,5,200,193,-144,43,97,227,4,83,32,95,54,56,230,91,3,96,220,192,171,130,5,131,-38,102,4,65,21,127,87,0,75,97,190,96,53,0,56,235,163,3,7,73,-108,108,101,103,97,108,32,95,33,7,32,108,105,116,101,114,97,108,168,65,-206,8,0,90,132,98,224,225,7,174,37,109,234,2,95,49,53,79,125,72,-230,132,131,225,113,0,0,95,132,142,226,200,1,162,56,230,211,13,129,88,-97,81,64,187,226,206,16,128,38,225,17,14,99,18,2,95,54,56,64,120,-192,195,98,57,224,67,9,160,195,224,37,37,225,15,10,224,37,2,225,15,-12,242,139,0,129,19,0,54,176,179,225,212,21,224,194,6,224,118,42,225,-134,9,226,180,2,227,94,9,227,54,14,98,76,133,25,227,168,0,167,66,-131,170,163,252,204,120,98,126,66,144,228,92,4,236,151,2,192,105,232,116,-14,107,102,119,108,224,0,2,96,130,1,55,48,207,252,229,19,2,64,3,-196,217,64,5,101,113,128,216,1,54,53,101,74,224,113,2,128,109,229,10,-1,224,48,6,1,55,48,96,29,224,48,11,64,0,65,171,1,95,55,65,-111,70,66,238,249,0,225,32,3,0,55,170,166,225,32,5,225,18,1,0,-55,72,80,225,18,6,225,17,42,192,48,1,95,54,79,114,160,18,96,20,-184,41,192,29,160,52,225,220,15,0,58,96,21,109,254,101,200,197,194,64,-7,77,158,227,129,3,5,67,32,61,61,32,64,136,128,139,250,202,17,104,-219,64,202,96,102,133,223,66,242,65,37,0,58,96,146,108,60,0,80,136,-189,120,128,64,37,242,183,2,225,60,5,198,98,230,104,0,194,98,196,63,-224,16,2,235,28,14,162,238,224,39,4,206,114,224,20,1,64,1,134,177,-224,115,5,129,186,152,104,224,123,2,246,46,1,234,184,5,203,131,230,64,-0,105,14,228,187,2,131,54,0,85,227,63,1,0,85,224,236,2,64,0,-192,43,96,169,193,119,130,106,226,19,27,64,252,218,228,224,172,0,233,155,-0,227,200,1,134,148,128,166,143,96,162,153,130,151,130,67,0,52,98,52,-224,82,2,160,83,162,162,224,50,0,131,25,129,20,224,151,0,224,163,15,-227,208,6,224,138,2,228,65,14,164,60,128,140,160,153,227,35,7,224,84,-0,0,58,97,41,162,79,170,18,136,39,192,237,227,241,0,235,133,1,1,-51,54,71,98,113,122,249,145,3,1,108,101,112,169,224,18,3,3,119,104,-101,114,111,114,224,20,3,1,100,111,224,17,7,0,111,114,229,237,38,0,-161,25,104,240,194,157,128,110,224,50,1,0,105,183,121,77,174,66,74,91,-158,64,55,227,109,0,100,131,156,60,77,129,230,2,7,0,49,83,80,192,-32,246,133,0,160,127,225,79,0,134,213,165,19,0,55,177,251,129,96,0,-58,97,248,155,249,129,25,130,189,224,14,2,64,91,224,14,1,108,55,233,-126,6,165,34,0,58,98,210,161,133,2,80,32,35,96,104,0,80,64,99,-69,86,118,182,225,149,3,141,75,0,80,70,172,242,57,4,2,105,109,112,-180,201,8,58,32,102,105,114,115,116,32,99,72,156,8,105,115,32,97,32,-100,105,103,105,178,72,64,100,67,206,225,226,0,228,43,8,170,154,227,238,-3,228,45,23,224,42,5,228,48,1,228,49,4,228,51,1,224,22,2,228,-28,0,95,253,212,14,226,5,0,228,86,1,96,24,163,66,102,18,160,69,-143,18,65,13,116,227,224,92,3,128,131,160,96,250,201,5,196,165,225,4,-0,160,13,96,33,194,249,128,95,224,107,3,106,26,149,62,227,177,4,64,-188,224,11,0,232,0,4,160,133,224,239,2,224,163,1,228,188,3,137,182,-68,69,96,92,99,171,6,52,48,32,95,54,57,54,80,147,0,53,122,45,-0,53,175,195,2,95,55,48,77,109,0,80,71,217,0,52,224,30,8,128,-13,192,14,136,219,224,70,11,168,235,229,77,2,96,128,224,199,0,224,224,-25,96,0,98,156,244,94,1,192,5,170,181,64,53,96,176,85,237,195,66,-172,146,166,19,87,0,224,36,10,96,140,224,232,21,0,51,126,150,183,253,-224,231,30,96,86,212,140,192,242,229,195,0,85,237,194,134,66,144,95,253,-160,0,225,138,13,192,0,226,72,13,160,86,226,163,9,194,24,226,21,5,-226,170,5,226,19,11,226,21,22,225,63,1,226,34,78,226,29,2,224,247,-0,182,201,64,175,219,1,227,189,1,244,72,19,128,70,128,59,119,70,192,-61,232,83,1,230,228,2,239,46,2,170,193,244,1,15,224,49,1,228,215,-5,228,127,0,128,67,160,73,239,102,10,242,211,14,0,48,135,145,228,165,-0,192,68,251,183,0,232,254,1,96,240,0,80,96,81,66,107,0,53,105,-214,124,76,225,29,1,227,92,13,236,139,7,161,17,70,196,167,33,64,10,-220,234,98,178,229,52,1,225,55,25,227,156,0,225,55,4,205,103,225,55,-128,193,42,225,41,19,129,26,225,24,29,224,185,2,107,146,224,183,41,226,-156,1,224,190,63,96,93,224,190,29,0,64,124,102,226,38,19,229,146,0,-224,24,7,163,187,1,95,54,64,22,227,206,1,160,213,0,58,110,26,152,-210,250,135,6,15,114,111,109,74,117,115,116,58,32,78,111,116,104,105,110,-103,104,61,127,59,64,152,251,77,13,165,5,225,19,0,129,1,235,16,0,-0,58,123,76,122,148,0,65,96,72,237,67,2,75,75,1,48,50,73,55,-0,57,109,16,221,88,129,66,206,24,160,2,96,77,231,62,2,118,135,162,-151,129,132,99,121,68,97,195,135,151,189,82,73,0,50,108,17,151,151,114,-89,0,48,97,176,161,64,224,9,1,200,149,206,41,224,15,6,224,66,3,-224,82,21,192,45,99,158,235,91,7,103,2,0,95,73,73,224,163,33,130,-176,1,53,55,224,35,5,224,51,21,226,13,3,73,197,245,157,0,160,130,-128,149,160,23,76,254,98,81,224,8,0,224,238,46,254,173,0,65,152,230,-21,1,70,158,68,115,64,136,64,198,224,9,3,224,104,35,0,58,70,220,-130,139,225,237,52,0,58,96,142,239,87,2,196,50,114,71,96,31,141,39,-162,133,226,224,0,66,234,205,32,225,212,8,1,49,52,118,231,224,139,25,-224,208,1,225,216,36,224,54,0,227,233,4,241,161,1,64,8,1,95,54,-67,231,230,121,0,233,121,3,65,219,0,57,140,129,134,166,224,116,37,160,-77,224,71,4,128,250,230,250,0,0,55,85,135,192,123,224,60,1,225,18,-37,0,58,72,201,132,52,1,75,51,100,53,223,120,228,15,5,242,153,2,-0,83,194,123,227,89,34,225,131,68,98,60,0,89,228,181,12,225,158,5,-224,169,3,70,129,128,107,118,242,224,178,35,224,179,60,160,172,168,67,224,-172,13,98,80,0,56,224,70,6,98,250,195,2,69,171,165,34,200,112,101,-165,229,210,0,141,204,96,34,82,231,227,47,3,70,88,224,89,1,224,211,-51,162,237,225,128,1,224,129,9,139,74,226,158,0,96,139,224,138,84,224,-68,0,160,114,128,30,199,184,231,126,6,31,68,97,116,97,46,73,110,116,-101,103,114,97,108,46,92,94,58,32,110,101,103,97,116,105,118,101,32,101,-120,112,111,110,1,101,110,175,206,160,76,0,58,99,130,135,76,133,109,226,-81,31,128,184,225,44,0,80,170,77,86,224,242,24,224,55,0,224,230,4,-224,54,39,96,11,0,58,98,83,131,226,0,50,96,37,0,58,100,182,245,-95,0,200,33,81,73,232,26,28,160,13,232,11,0,224,11,3,232,29,61,-166,205,66,240,176,158,102,219,174,240,232,60,8,103,6,232,78,64,225,3,-151,93,185,225,4,88,225,5,20,64,38,195,248,170,24,104,130,224,177,1,-225,2,61,234,36,73,108,49,137,134,231,150,34,224,68,21,1,57,51,224,-69,46,0,90,134,159,234,24,0,96,44,224,146,37,234,171,48,236,210,0,-224,129,7,224,77,38,224,129,55,0,58,108,145,204,240,231,36,1,64,28,-232,116,14,2,49,54,53,224,77,0,224,125,34,205,253,231,151,5,234,95,-3,234,110,2,137,104,232,228,1,224,110,62,225,238,46,192,75,224,238,57,-204,146,228,206,0,131,179,67,174,236,150,44,224,153,0,228,30,0,96,30,-243,173,1,236,149,0,236,255,1,108,142,143,127,224,9,1,64,83,2,54,-57,52,224,83,1,192,7,0,58,100,67,172,29,236,240,14,98,59,128,22,-160,118,226,59,16,231,180,38,231,113,44,161,103,146,29,135,240,169,2,139,-206,114,16,224,9,1,224,90,24,0,58,97,24,135,193,0,52,232,145,0,-141,83,1,95,54,103,191,0,73,137,239,97,131,248,73,8,159,216,0,83,-69,133,249,168,6,244,124,0,1,95,54,69,85,0,55,233,35,2,2,92,-92,110,105,3,64,25,2,51,51,53,124,227,3,95,54,56,56,90,229,65,-177,126,108,2,52,48,49,64,55,0,51,64,127,186,99,0,95,116,232,112,-178,64,138,144,158,65,252,64,68,99,78,77,184,3,95,54,56,57,163,115,-197,10,160,4,221,118,128,101,161,199,102,63,192,35,96,86,3,54,57,48,-32,182,155,118,96,160,0,97,172,241,185,3,0,48,96,0,128,32,129,130,-192,208,0,89,243,142,0,161,60,96,108,226,197,1,211,175,142,120,225,79,-4,128,78,230,249,0,225,112,8,122,248,224,65,0,97,2,192,19,242,107,-8,248,208,2,130,208,1,95,50,65,40,66,120,1,50,51,98,164,103,240,-96,44,126,169,87,57,0,50,64,195,98,87,158,249,192,93,0,85,226,129,-0,128,7,2,95,54,57,160,94,1,58,54,66,5,105,243,0,85,210,81,-2,90,32,90,97,110,1,54,55,251,192,5,83,157,161,123,98,50,0,79,-159,84,0,90,96,160,129,208,224,88,1,96,90,238,67,0,0,50,66,161,-99,184,0,58,65,161,229,216,0,129,106,79,237,232,213,6,2,95,51,55,-164,116,160,75,87,141,176,115,66,111,148,29,65,17,0,58,66,124,98,242,-2,51,54,53,180,91,156,92,0,58,96,38,251,226,1,96,80,91,226,2,-54,56,54,224,23,3,97,35,128,23,132,82,228,76,0,193,242,165,31,232,-226,3,160,2,78,111,224,17,5,219,52,224,17,2,192,69,224,21,3,246,-44,2,197,124,224,104,4,226,114,0,224,26,0,224,61,1,226,143,0,97,-56,226,35,2,224,33,6,188,81,225,90,0,192,2,160,23,224,42,4,224,-21,0,192,147,67,114,192,64,224,19,2,160,187,228,73,11,224,84,1,169,-255,224,87,3,224,84,8,230,13,0,225,99,1,128,1,195,89,163,233,227,-112,2,224,121,11,250,221,1,96,36,161,18,224,172,28,224,30,1,128,35,-0,54,94,26,0,35,165,123,131,157,96,43,224,12,0,158,190,224,23,0,-224,0,1,224,73,13,98,111,224,47,6,132,80,225,37,4,130,11,96,177,-70,190,128,186,213,190,129,215,96,20,2,95,54,56,147,190,0,66,79,201,-77,149,192,124,161,30,2,95,55,49,118,165,96,125,64,134,101,82,224,110,-0,226,77,4,193,108,225,142,2,226,88,3,225,145,13,225,68,11,226,62,-0,224,53,27,230,87,0,224,53,36,165,87,224,106,38,249,94,5,226,10,-13,197,144,225,184,11,161,171,225,218,4,1,95,54,157,52,129,211,225,91,-2,224,32,2,64,60,128,32,224,237,0,224,93,12,240,123,6,13,98,97,-100,32,115,116,114,105,110,103,32,103,97,112,144,102,227,185,4,101,115,0,-39,69,116,96,73,2,56,32,64,224,60,1,18,117,110,116,101,114,109,105,-110,97,116,101,100,32,67,104,97,114,47,83,128,74,6,108,105,116,101,114,-97,108,96,78,135,135,225,69,2,64,15,225,170,24,224,46,30,161,12,224,-92,31,161,156,227,6,2,106,105,225,38,9,106,9,152,200,225,142,64,107,-181,202,77,210,58,210,146,128,5,135,9,2,58,54,56,137,96,232,185,0,-224,250,12,64,49,64,115,199,2,99,166,64,7,64,24,0,58,96,14,199,-96,225,243,5,12,66,97,100,32,92,92,32,101,115,99,97,112,101,129,242,-130,218,225,52,13,171,37,224,33,17,191,66,224,32,18,104,21,224,99,19,-87,114,224,133,22,101,113,224,33,20,164,185,224,33,18,224,135,23,66,222,-224,66,21,0,50,225,12,23,104,2,66,131,118,179,64,29,253,130,8,134,-60,101,2,128,34,116,168,64,8,168,70,74,52,0,49,98,141,0,54,64,-42,0,67,94,84,160,17,255,74,0,133,126,129,251,74,198,72,67,108,30,-201,157,91,246,66,23,64,5,128,71,130,29,228,160,1,96,114,76,187,156,-32,64,204,64,75,133,155,238,137,6,100,204,133,180,98,234,228,217,0,192,-26,224,23,2,7,95,54,55,57,32,95,51,53,131,26,164,75,0,79,162,-173,100,72,169,194,96,143,97,80,107,104,131,113,224,162,1,224,101,3,145,-107,224,94,9,224,82,8,224,81,22,227,46,7,96,29,0,49,131,165,253,-63,1,64,17,0,56,224,16,0,160,33,0,54,224,16,3,231,174,4,97,-242,224,81,0,231,183,0,224,20,11,100,130,224,21,9,66,254,224,21,8,-66,140,224,20,8,106,129,224,63,8,100,143,160,21,0,58,100,1,202,234,-129,51,161,197,198,149,234,45,11,96,17,238,167,2,224,25,0,229,81,1,-128,10,98,249,160,26,64,128,98,178,0,54,239,172,0,0,52,75,40,228,-243,0,170,35,96,70,98,176,236,105,0,96,43,224,12,0,97,85,0,53,-232,123,2,161,166,98,215,224,218,3,139,219,2,79,32,80,228,208,2,2,-78,85,76,68,198,97,157,224,25,5,2,83,79,72,96,25,64,156,224,25,-6,1,84,88,96,25,65,121,224,25,5,0,69,160,25,64,113,224,25,6,-1,79,84,96,25,67,76,224,25,6,1,78,81,96,25,64,172,224,25,5,-2,65,67,75,96,25,64,218,224,25,5,1,66,69,128,181,65,209,224,25,-6,0,83,96,24,65,255,224,24,5,0,72,128,127,66,89,224,24,5,1,-76,70,128,230,225,1,9,0,86,128,50,98,162,224,25,5,0,70,160,51,-225,1,9,1,67,82,128,25,225,1,9,1,83,79,128,25,225,1,9,1,-83,73,128,25,225,1,9,2,68,76,69,128,26,225,2,9,2,68,67,49,-128,26,225,3,9,2,68,67,50,128,26,225,5,9,2,68,67,51,128,26,-225,7,9,2,68,67,52,96,26,101,166,224,26,5,1,78,65,129,136,0,-50,226,11,10,1,89,78,128,26,226,12,11,0,66,128,26,225,11,9,1,-67,65,160,53,226,14,10,0,77,128,25,225,12,9,1,83,85,160,79,225,-12,9,2,69,83,67,128,26,225,12,9,0,70,130,16,82,37,224,25,6,-0,71,160,25,225,10,9,0,82,128,25,70,113,224,25,6,0,85,160,25,-225,8,10,0,80,128,25,225,7,9,0,68,162,172,70,198,233,211,0,224,-0,20,0,58,101,136,238,214,1,230,33,1,196,10,1,54,55,64,75,197,-212,105,48,64,93,2,95,54,55,103,134,1,95,51,98,154,73,43,1,95,-49,139,248,0,58,69,250,64,83,114,146,0,58,96,40,239,211,3,1,80,-32,160,52,196,246,224,95,0,64,92,224,67,0,143,158,114,66,231,150,2,-105,212,224,20,8,65,36,224,20,7,112,108,224,20,8,66,33,224,20,7,-0,49,98,55,224,21,9,66,24,224,106,8,135,235,224,20,5,102,229,0,-67,241,16,5,0,35,71,215,2,64,95,49,97,166,144,115,224,7,55,3,-58,54,55,54,170,46,242,128,0,69,240,185,104,230,19,1,106,226,3,67,-32,61,61,231,46,1,134,28,0,85,64,12,64,8,0,90,249,155,8,198,-116,134,75,241,113,2,237,23,1,103,205,226,109,1,2,99,97,115,170,152,-231,179,5,154,106,171,44,129,203,181,141,96,1,168,138,104,149,137,154,198,-216,166,192,137,144,2,67,32,60,178,188,230,159,0,224,218,7,224,28,0,-128,216,179,232,233,31,3,192,234,224,34,1,240,41,1,160,68,134,216,224,-67,7,224,245,2,226,35,3,192,0,106,5,169,212,0,54,82,140,2,95,-54,55,64,31,175,193,224,104,93,0,58,97,105,140,129,7,54,55,50,32,-64,90,32,85,157,150,225,63,1,64,116,224,18,6,148,15,224,18,4,130,-190,224,18,4,102,164,104,20,192,191,168,190,64,104,1,64,85,117,188,251,-118,1,192,15,224,68,6,67,1,98,81,224,18,1,68,76,160,45,224,60,-1,206,125,224,61,5,64,104,224,80,6,131,167,224,80,4,66,108,160,65,-224,80,7,224,41,6,67,73,224,41,1,194,157,65,70,141,132,2,95,53,-50,126,235,88,201,149,58,64,49,67,64,0,58,96,245,100,195,0,80,137,-220,0,85,96,20,136,230,228,13,7,105,100,228,77,9,228,56,11,142,30,-224,63,7,224,41,11,73,191,228,98,8,0,49,102,160,228,99,44,2,58,-54,55,213,106,133,147,164,40,131,156,116,242,3,64,58,54,54,213,88,246,-1,6,98,222,130,152,248,135,0,2,54,54,56,249,137,1,0,95,86,32,-0,95,243,165,0,82,147,0,51,192,15,0,58,96,41,181,175,0,53,98,-211,82,142,64,245,0,58,64,54,97,139,0,54,153,67,173,36,2,54,54,-53,86,188,119,156,64,81,3,58,54,54,54,198,182,3,95,53,54,51,171,-65,211,12,74,190,0,53,99,39,202,191,160,13,107,10,0,57,68,202,129,-57,170,204,249,135,1,0,58,64,105,160,88,142,60,65,114,235,45,0,129,-36,0,67,184,7,70,200,239,179,4,17,33,33,58,32,105,110,100,101,120,-32,116,111,111,32,108,97,114,103,197,32,164,15,227,236,1,64,247,224,78,-0,144,218,238,20,1,253,105,1,242,9,7,64,97,7,110,101,103,97,116,-105,118,101,128,106,96,96,1,58,54,66,52,132,10,224,48,5,15,105,110,-105,116,58,32,101,109,112,116,121,32,108,105,115,116,96,46,225,207,4,249,-37,7,165,197,65,84,131,30,64,9,231,191,3,66,133,67,85,199,171,128,-20,134,47,80,198,135,219,64,22,225,145,0,96,8,232,89,2,97,3,200,-59,160,101,184,106,66,87,71,207,238,238,0,128,14,239,119,11,112,210,239,-119,5,176,163,239,165,12,135,206,224,45,3,67,2,128,124,131,201,224,54,-11,0,52,185,63,224,54,2,0,53,64,73,1,58,54,66,17,248,16,3,-210,217,205,120,214,232,130,104,161,106,207,177,129,102,122,184,0,56,218,120,-231,170,0,173,92,117,178,242,243,6,175,45,64,37,0,85,190,251,243,35,-0,96,52,128,31,128,86,129,154,181,250,97,220,96,74,250,74,4,225,129,-1,71,221,248,248,1,97,254,120,248,64,73,96,23,128,230,176,109,132,139,-67,151,155,81,251,68,6,128,203,193,225,128,153,98,46,245,162,1,64,102,-229,137,0,243,118,1,243,119,2,97,11,231,38,0,224,5,0,153,89,224,-15,3,66,142,228,186,0,134,49,128,2,151,241,225,162,0,246,198,0,248,-188,9,155,214,128,21,224,48,0,247,124,0,160,54,104,180,224,53,3,160,-202,224,74,8,128,146,229,234,4,207,65,233,91,1,181,187,242,94,1,218,-209,224,126,3,103,131,126,186,225,181,2,252,178,8,224,91,0,230,244,0,-96,74,224,51,28,96,199,165,242,225,42,11,225,176,0,224,46,1,224,1,-3,208,167,128,125,225,56,11,129,53,160,47,240,170,2,197,20,225,65,134,-129,66,224,62,0,225,68,42,66,195,98,204,168,110,64,4,227,22,2,227,-43,13,160,180,230,195,47,0,58,100,98,203,101,228,200,0,3,49,51,54,-32,228,195,0,64,12,1,64,35,132,138,224,38,10,197,79,128,38,197,74,-133,237,224,39,3,197,73,128,39,133,68,230,118,6,8,100,105,103,105,116,-84,111,73,110,134,112,64,218,244,244,9,224,16,0,180,254,134,250,161,13,-224,49,27,96,176,224,49,21,96,39,96,255,65,33,0,54,225,33,0,1,-95,54,79,89,96,9,0,49,78,83,65,84,1,49,49,65,84,0,48,224,-198,2,10,92,34,108,105,98,47,68,97,116,97,47,89,57,9,46,104,115,-92,34,44,49,57,49,58,113,17,97,124,108,236,106,207,95,134,78,95,64,-135,226,48,0,245,237,18,98,206,224,200,2,96,161,136,125,2,95,54,50,-73,46,1,53,51,101,127,135,218,2,79,32,67,69,151,64,54,144,179,138,-40,160,22,103,80,145,27,224,23,4,74,118,107,135,224,21,4,64,241,98,-118,179,89,128,42,224,19,255,224,19,195,0,51,98,90,224,81,58,0,51,-224,241,150,224,159,151,224,19,255,224,19,37,115,217,160,21,0,49,224,81,-50,69,5,96,19,0,52,182,116,224,81,45,0,52,183,135,224,61,20,109,-217,0,52,183,229,224,83,16,226,175,0,0,49,107,169,224,83,7,1,52,-48,229,220,3,224,21,1,150,145,224,189,25,224,127,4,224,63,1,184,19,-224,43,6,183,82,224,43,7,224,151,11,225,83,13,224,63,12,183,61,224,-107,7,224,85,22,226,35,40,0,52,72,133,225,19,29,224,41,3,228,47,-20,224,83,28,129,231,0,51,225,81,11,224,187,33,225,99,31,224,19,2,-220,243,186,225,224,247,26,224,39,70,224,19,142,230,1,171,224,179,0,225,-123,51,0,49,120,213,224,61,7,147,238,224,83,47,224,19,255,224,19,88,-122,59,224,201,178,228,141,0,3,50,49,53,57,64,8,160,23,226,113,20,-0,51,189,116,224,41,6,2,49,53,56,227,7,2,227,207,20,1,51,56,-225,55,2,226,243,1,229,79,12,1,49,52,224,65,2,227,9,92,65,8,-224,41,28,229,223,11,83,236,128,19,189,226,96,21,77,222,96,21,92,3,-224,82,3,64,35,0,35,123,115,224,83,7,0,49,231,107,3,64,42,102,-177,152,52,160,21,65,99,127,242,238,76,5,65,212,64,59,238,52,5,224,-88,1,224,65,2,224,173,1,225,79,82,224,19,130,80,242,129,4,0,49,-226,129,2,226,171,20,1,49,51,224,20,1,226,126,11,64,60,97,197,228,-12,4,97,154,145,18,117,97,192,64,64,128,80,187,225,156,5,95,198,225,-135,228,224,19,91,75,67,225,24,255,224,19,255,224,19,9,86,156,192,20,-233,103,131,241,17,255,224,19,255,224,19,255,224,19,159,67,191,0,51,120,-225,88,52,224,41,0,0,57,119,233,128,24,2,49,52,53,233,227,3,126,-39,96,70,224,24,6,232,180,1,224,23,5,1,55,50,64,100,0,55,159,-12,1,55,55,224,26,3,104,80,168,126,224,125,2,1,50,48,228,226,11,-64,145,107,100,2,35,54,48,104,179,160,23,0,52,120,172,224,23,9,0,-51,96,119,225,224,247,224,19,255,224,19,255,224,19,255,224,19,255,224,19,-175,237,54,1,3,49,53,50,50,242,223,182,224,19,255,224,19,255,224,19,-243,99,216,138,120,245,191,3,74,93,138,41,224,21,7,224,43,13,224,65,-31,244,242,0,224,21,3,224,151,0,224,20,45,75,33,224,127,8,85,103,-224,171,36,224,21,13,149,94,224,129,6,128,20,0,52,64,49,224,151,8,-224,20,2,94,88,75,241,64,21,249,183,2,245,114,1,224,43,7,224,108,-18,0,57,247,26,3,64,65,224,43,17,0,50,75,136,224,152,9,224,20,-2,224,108,1,1,50,53,224,65,12,0,53,224,174,2,224,218,12,1,50,-57,248,35,0,3,49,53,48,51,224,91,2,246,80,2,1,55,54,225,77,-3,224,23,1,0,53,224,160,3,226,16,0,0,53,236,146,2,0,52,97,-122,98,61,247,47,3,0,51,76,122,226,192,7,0,56,85,179,0,35,120,-124,1,35,53,226,216,3,1,56,54,64,69,97,165,0,35,237,109,3,64,-11,227,26,18,2,49,52,56,224,182,11,1,55,54,77,163,224,22,8,3,-50,49,52,53,224,205,2,237,2,61,1,49,53,246,52,3,224,107,3,0,-57,224,131,13,0,53,225,105,12,64,23,224,155,2,224,115,11,224,175,11,-65,78,130,6,1,49,54,231,233,255,224,19,255,224,19,255,224,19,211,251,-253,31,229,140,11,3,51,49,48,53,252,255,11,225,107,255,224,19,168,251,-45,255,224,19,7,1,49,51,232,69,21,224,19,101,227,114,255,224,19,255,-224,19,83,0,49,253,15,40,2,55,48,54,234,135,3,253,79,91,230,155,-11,224,39,0,1,56,52,235,95,4,235,179,31,227,100,200,2,56,52,54,-238,239,4,224,23,2,122,138,224,23,10,236,15,3,224,23,3,0,48,224,-23,14,239,187,12,2,56,52,53,224,119,14,236,175,4,224,23,3,0,50,-238,144,2,238,73,1,0,56,238,51,3,226,86,91,224,19,60,0,57,225,-115,14,239,161,4,192,23,3,55,48,55,54,237,243,12,224,108,30,2,56,-52,54,238,206,12,224,43,2,226,215,11,230,220,60,2,56,53,49,225,183,-3,79,162,224,44,9,1,50,51,113,103,143,191,1,54,52,224,170,2,0,-50,79,186,124,255,0,64,124,185,224,24,0,0,55,64,48,80,11,224,23,-6,0,57,64,121,82,207,2,64,35,55,252,245,2,144,237,64,89,224,22,-5,64,69,66,63,224,21,4,80,214,110,252,224,42,4,1,55,55,64,67,-0,53,96,90,0,49,253,81,3,1,50,48,64,48,96,229,224,188,4,1,-50,56,112,101,0,51,224,24,9,1,49,57,105,83,224,25,9,3,51,49,-52,50,65,138,113,76,1,35,54,64,100,2,75,32,64,224,0,255,224,0,-255,224,0,136,1,58,54,82,255,12,10,65,32,83,39,32,95,49,52,49,-32,64,95,102,37,9,67,32,95,49,50,55,32,95,49,51,99,53,100,244,-1,58,54,83,160,16,10,65,32,66,32,89,32,64,66,32,66,32,83,32,-85,32,80,64,55,2,55,32,64,128,5,64,0,1,67,39,64,27,1,67,-39,64,83,0,66,64,18,64,16,2,67,32,64,192,41,192,17,96,32,1,-80,32,128,13,7,95,49,48,54,32,64,85,32,99,52,2,85,32,65,163,-59,1,58,54,84,204,192,115,128,80,64,119,3,64,66,32,85,96,165,0,-55,70,139,224,87,0,64,85,96,124,3,32,64,67,39,64,97,0,64,224,-198,2,132,92,2,64,64,64,128,52,96,92,0,48,96,92,2,67,32,83,-224,239,3,131,216,224,20,7,68,159,224,20,8,0,54,68,8,224,20,7,-0,52,68,3,224,20,8,64,114,224,20,7,0,53,68,39,224,83,8,64,-166,224,20,8,224,125,11,85,104,224,20,8,100,129,224,20,8,224,125,11,-77,4,224,20,9,65,73,224,251,8,225,16,11,0,51,224,188,11,0,52,-224,167,12,224,83,11,0,49,69,47,224,21,10,224,148,11,104,88,224,20,-7,1,56,55,106,7,224,22,8,0,54,225,85,12,1,56,53,224,196,12,-1,56,53,225,215,12,2,56,55,48,64,45,99,21,65,80,5,66,32,95,-52,52,52,98,105,65,157,227,45,2,65,131,2,95,54,52,64,114,3,64,-64,95,49,75,95,224,7,183,3,58,54,52,57,132,20,97,21,64,241,1,-95,54,161,195,1,95,54,66,53,31,102,114,111,109,85,84,70,56,32,34,-33,92,34,35,37,38,39,40,41,42,44,45,46,47,58,59,63,64,91,92,-92,93,3,95,123,125,34,64,79,0,58,97,24,99,97,6,95,50,57,48,-32,64,83,67,243,1,83,39,67,186,0,60,199,215,224,19,7,162,0,224,-19,4,96,124,100,70,3,67,32,61,61,192,17,1,95,49,120,95,1,85,-32,192,191,224,10,3,0,67,164,97,192,66,67,1,224,30,1,224,40,2,-224,128,8,130,16,224,61,5,66,128,224,61,12,224,149,5,64,19,224,149,-9,65,7,0,55,225,81,9,131,147,225,81,7,10,36,43,60,61,62,92,-94,96,92,124,126,193,67,0,54,225,67,19,72,144,225,47,7,104,210,224,-153,4,96,17,225,47,20,0,83,224,241,6,67,91,224,30,1,224,230,5,-66,237,224,230,13,0,53,198,77,101,163,67,86,133,149,101,152,230,86,5,-132,148,0,64,65,9,65,93,97,10,68,62,105,193,1,58,54,67,110,97,-49,160,150,101,213,0,66,160,90,192,72,0,51,68,2,225,59,1,5,83,-79,85,82,67,69,97,54,160,118,134,87,1,64,95,139,159,64,20,6,95,-51,51,53,32,95,54,100,103,5,66,32,95,53,55,55,65,130,64,29,3,-95,52,52,51,64,11,230,199,2,224,147,4,96,75,160,181,0,58,96,180,-102,152,102,154,68,18,192,159,70,119,96,8,166,125,70,194,107,58,96,37,-70,193,64,5,0,80,102,163,0,79,96,203,0,54,69,75,224,198,1,18,-85,110,99,108,111,115,101,100,32,123,45,32,99,111,109,109,101,110,116,96,-211,138,81,129,233,71,89,135,131,128,7,225,37,0,0,83,230,244,6,123,-174,96,249,193,143,192,47,225,146,10,98,147,231,195,0,128,251,96,159,123,-165,161,165,4,56,48,32,95,55,107,192,161,247,224,147,39,192,101,224,146,-28,0,49,108,92,224,147,23,2,49,55,52,224,148,14,64,85,192,97,130,-62,232,22,14,224,46,30,67,23,224,187,0,224,231,4,224,84,4,226,110,-0,224,175,5,192,156,192,24,1,95,54,102,80,224,16,4,224,192,0,168,-168,0,58,96,24,7,10,65,32,85,32,66,32,90,66,54,129,100,1,95,-51,126,152,128,177,2,95,53,50,194,167,225,163,11,0,58,96,86,96,67,-193,102,128,49,67,35,0,52,192,44,131,48,67,87,167,134,224,71,2,125,-137,67,248,96,4,64,80,201,60,105,147,192,85,224,154,4,160,99,224,73,-5,64,59,65,11,163,60,142,175,2,64,64,80,70,120,67,7,229,38,6,-168,186,229,38,7,10,32,94,41,94,42,94,43,94,44,94,45,165,38,67,-183,234,157,3,74,111,100,162,170,22,96,20,135,182,225,170,3,160,144,0,-54,128,204,65,0,64,26,1,54,51,70,154,133,112,1,95,50,80,169,0,-58,96,137,5,10,65,32,95,52,56,128,244,196,229,230,61,5,96,226,224,-26,12,129,10,224,26,13,97,2,224,26,13,97,110,196,94,229,163,4,113,-207,139,10,65,214,229,238,3,64,25,229,161,10,224,44,13,229,206,14,224,-117,15,101,31,224,72,12,231,148,13,224,44,14,101,151,224,117,11,225,7,-14,65,144,224,145,14,97,115,224,100,12,64,25,224,145,32,97,242,225,7,-33,99,226,224,72,12,102,77,224,117,31,64,37,225,7,13,226,97,14,194,-16,225,35,10,98,207,224,173,13,96,86,224,128,12,131,16,224,173,30,64,-97,225,35,33,104,69,224,72,12,96,25,224,117,31,232,112,15,224,118,2,-225,34,5,195,78,224,145,10,226,189,16,234,82,14,224,44,14,226,189,16,-224,45,12,226,134,15,225,200,15,96,164,225,253,13,96,58,224,26,13,98,-144,224,245,13,99,60,224,154,12,226,244,15,224,44,12,226,216,15,224,117,-14,64,39,224,72,13,226,244,15,224,44,12,226,160,15,225,7,14,98,115,-224,144,13,99,31,224,99,12,226,215,15,224,44,11,226,186,15,224,116,13,-99,174,224,70,11,226,212,15,224,43,11,226,155,15,225,3,15,194,10,224,-25,9,198,159,224,168,9,99,52,224,124,11,226,235,15,224,43,11,226,233,-16,224,114,12,226,150,16,226,149,35,226,148,16,228,28,14,225,0,16,226,-174,16,226,173,36,228,24,35,229,77,16,73,59,2,51,48,54,200,136,0,-58,96,6,233,25,6,103,110,243,184,6,1,95,54,96,76,0,58,108,209,-233,73,7,96,109,0,54,86,188,0,58,96,38,211,247,64,43,1,95,53,-105,16,74,163,0,54,169,113,224,17,0,1,64,35,73,6,64,52,138,67,-238,137,15,238,116,8,224,221,12,225,0,26,0,58,96,171,160,190,75,221,-127,175,1,49,55,99,5,0,54,136,175,0,54,68,185,0,58,96,244,224,-146,2,225,138,25,0,58,96,63,224,197,22,227,76,9,224,18,6,114,75,-226,176,25,224,10,13,240,92,7,224,51,4,225,6,4,65,226,193,197,96,-240,225,207,1,74,203,1,49,49,75,170,1,48,32,235,22,1,25,92,34,-108,105,98,47,68,97,116,97,47,67,104,97,114,46,104,115,92,34,44,49,-57,54,58,49,143,21,1,95,54,137,44,0,73,130,234,3,95,50,57,51,-140,3,235,158,0,107,2,237,77,0,1,95,50,89,10,96,5,1,35,57,-102,149,128,11,98,35,96,161,0,54,139,20,1,54,50,79,59,73,66,0,-58,96,98,2,10,65,32,185,26,64,54,0,35,186,33,65,73,217,171,0,-52,161,254,3,35,49,52,56,252,9,2,79,87,137,20,224,46,4,121,93,-121,240,224,21,3,64,90,96,67,0,50,116,120,192,43,224,89,0,224,19,-255,224,19,206,0,52,226,33,4,224,81,50,66,115,224,241,147,224,159,151,-224,19,255,224,19,27,225,203,51,212,73,2,35,53,57,71,151,224,21,7,-0,51,103,167,224,103,38,224,39,11,229,155,1,224,19,1,71,130,224,59,-17,121,93,224,61,18,224,163,1,111,248,224,21,7,2,56,53,49,101,243,-224,87,7,0,50,123,13,225,57,58,224,59,11,0,53,225,13,50,225,73,-51,224,59,1,109,7,160,21,225,95,11,225,53,1,224,121,21,224,39,71,-224,19,131,224,179,0,1,49,53,72,128,224,181,158,224,19,11,226,31,11,-225,145,31,226,131,31,224,19,255,224,19,87,225,143,171,77,220,224,19,7,-66,147,64,14,2,35,50,49,142,32,224,23,2,224,43,7,229,47,11,224,-163,71,227,15,0,3,50,49,53,54,230,41,11,64,23,224,167,2,224,23,-4,230,131,2,224,23,0,0,52,116,105,224,21,9,224,135,6,97,3,1,-52,48,224,43,2,225,1,0,2,52,48,51,224,179,10,1,52,48,76,210,-224,87,7,1,56,52,120,195,192,23,226,37,0,224,89,4,224,45,4,224,-203,2,224,91,1,115,104,224,45,10,237,40,3,224,23,2,225,17,13,2,-56,52,54,116,166,224,93,9,229,71,2,225,17,1,118,7,224,67,22,225,-109,2,237,180,4,224,47,4,224,139,2,225,67,1,224,93,3,224,137,0,-3,50,49,52,57,225,45,2,224,139,2,225,91,2,224,67,2,224,183,2,-0,56,224,67,2,0,53,225,247,2,224,45,1,122,56,224,113,7,64,159,-226,37,12,224,45,3,225,181,0,65,89,224,45,24,224,21,0,0,49,126,-57,224,21,2,130,83,126,91,224,135,7,154,134,160,21,231,249,0,0,52,-224,65,4,225,224,3,233,28,3,224,23,3,225,156,4,0,54,239,14,0,-1,49,54,226,132,3,228,171,31,224,39,11,64,19,111,140,233,137,4,0,-52,228,74,0,112,37,224,152,2,96,43,0,55,224,242,2,64,64,96,165,-239,184,4,66,130,128,64,0,54,226,118,6,124,98,224,42,3,228,181,1,-225,255,3,225,95,0,158,31,160,21,228,181,1,121,131,225,48,7,0,49,-227,87,3,224,237,0,81,2,224,42,9,0,48,227,36,11,119,200,225,65,-18,224,19,211,225,4,1,125,219,225,26,9,228,225,11,227,108,12,0,50,-84,71,224,106,9,0,57,224,21,2,230,126,11,230,146,12,64,20,96,78,-226,51,4,83,135,129,172,224,151,6,227,33,1,225,80,121,224,19,191,69,-240,225,24,255,224,19,255,224,19,0,239,179,51,224,19,71,228,128,1,228,-18,2,225,104,191,224,19,255,224,19,255,224,19,223,0,53,70,125,107,55,-1,35,57,233,157,3,0,57,74,45,0,35,122,22,2,35,54,48,235,39,-3,0,52,78,199,224,23,10,0,55,72,65,126,192,233,231,5,0,49,250,-170,2,1,50,53,234,23,13,1,50,53,238,14,12,3,49,50,52,56,234,-180,13,2,52,56,51,224,215,11,2,50,52,56,224,71,14,233,116,13,1,-50,51,235,63,7,96,23,2,55,48,53,124,138,225,75,19,125,235,160,45,-0,54,236,230,3,224,237,0,0,55,157,106,192,92,233,59,0,2,55,48,-55,236,95,3,0,49,65,45,225,231,88,224,19,255,224,19,255,224,19,255,-224,19,255,224,19,255,224,19,71,250,150,1,244,54,3,250,172,11,225,65,-255,224,19,255,224,19,255,224,19,139,74,41,107,51,246,64,5,234,255,0,-224,21,7,224,43,13,224,65,31,246,151,2,224,150,11,224,20,44,74,189,-224,127,13,64,230,2,35,49,52,234,161,2,64,64,0,51,96,21,0,55,-235,21,2,118,153,64,21,1,50,48,64,93,224,43,2,128,21,0,53,224,-130,6,128,21,0,50,235,41,2,224,43,2,224,87,6,225,47,35,224,197,-19,224,21,2,241,73,1,235,123,4,224,21,0,0,52,250,99,4,235,146,-1,224,45,3,251,237,0,224,110,25,224,64,1,245,194,3,237,9,1,224,-86,2,1,51,52,225,224,0,0,53,247,140,3,97,96,98,13,245,240,4,-244,46,11,0,56,120,164,119,202,1,35,53,226,167,3,1,56,56,89,233,-64,96,237,223,5,248,129,1,224,45,2,224,157,0,3,50,49,53,56,246,-142,11,64,23,0,51,224,138,2,227,45,30,224,19,11,246,73,11,255,224,-12,225,161,1,224,120,61,224,19,255,224,19,255,224,19,255,224,19,119,228,-144,11,224,39,11,241,44,11,101,152,146,196,2,49,52,53,252,231,3,241,-165,1,224,24,6,235,129,1,224,48,6,2,48,57,57,235,157,255,224,19,-188,251,93,255,224,19,7,1,49,51,226,230,131,233,24,1,225,65,161,224,-19,255,224,19,167,234,82,32,253,124,91,230,206,11,248,15,31,224,199,0,-70,177,224,180,99,225,165,92,224,160,151,225,165,31,225,144,11,228,238,11,-229,142,52,237,78,11,0,56,90,219,160,21,0,56,238,89,3,95,191,1,-35,55,77,224,3,35,55,55,55,232,253,3,3,50,49,52,53,64,74,142,-73,91,208,192,25,1,49,50,64,65,105,79,160,59,192,24,0,55,64,184,-0,51,96,48,224,23,4,0,57,123,174,96,126,0,55,251,196,3,64,191,-111,20,224,22,5,64,69,66,198,224,21,4,78,188,64,209,224,42,5,1,-55,57,64,163,92,185,91,194,224,25,4,64,69,0,50,96,49,224,188,3,-1,50,56,105,211,111,70,224,24,5,1,49,57,104,32,224,25,9,3,51,-49,52,50,96,51,64,19,1,35,54,64,100,2,75,32,64,224,0,255,224,-0,255,224,0,152,1,58,54,83,112,12,10,65,32,67,39,32,83,32,64,-67,39,32,67,128,5,18,39,32,89,32,64,64,83,39,32,66,32,64,66,-39,32,66,39,32,80,66,222,1,66,32,128,1,0,67,64,23,64,0,128,-43,1,67,39,64,14,160,26,96,11,224,41,1,96,82,224,42,3,192,2,-128,21,224,98,3,64,2,64,134,5,95,52,54,32,95,54,67,191,160,33,-224,101,3,224,131,2,128,85,0,66,64,55,128,33,9,64,66,32,83,39,-32,64,95,53,55,192,63,7,67,32,95,56,48,32,95,55,68,127,96,14,-160,64,2,95,52,56,64,18,64,61,224,32,1,2,95,54,50,84,104,128,-0,224,55,4,101,38,2,64,95,50,82,246,3,58,54,50,51,97,51,9,-83,39,32,95,49,56,50,32,95,54,68,36,64,106,2,54,50,49,192,13,-100,151,4,66,32,95,54,49,160,69,5,67,32,95,49,53,57,224,30,4,-64,74,0,50,96,74,3,85,32,75,52,224,2,1,2,90,32,90,64,6,-160,136,0,58,64,85,64,36,5,95,49,54,48,32,95,83,191,1,95,51,-69,187,1,95,54,83,254,1,95,54,69,27,1,95,54,86,6,3,95,49,-54,56,192,97,2,95,49,55,224,140,1,0,48,64,27,3,55,50,32,80,-160,17,160,216,2,95,49,55,224,145,0,2,95,49,56,224,47,0,3,95,-49,56,51,224,11,2,0,54,224,55,7,129,190,65,171,1,67,32,225,172,-1,129,36,224,27,4,1,49,52,65,30,96,70,0,55,96,241,1,95,54,-116,218,161,79,1,49,56,69,56,128,19,224,83,51,111,218,224,82,5,97,-13,0,56,224,221,2,1,57,48,224,11,0,11,54,49,57,32,64,75,32,-95,49,57,50,32,160,67,0,75,160,8,64,21,74,0,65,117,0,48,97,-117,9,112,111,112,99,111,117,110,116,32,58,96,54,5,10,65,32,115,104,-108,64,12,0,56,96,12,2,105,110,118,64,12,0,55,96,12,2,120,111,-114,64,12,0,54,96,12,128,11,0,53,226,42,1,70,43,98,154,0,49,-112,118,70,165,66,21,224,17,0,70,173,66,127,1,58,54,70,255,1,10,-65,98,229,144,250,2,64,64,80,66,120,80,200,66,8,0,52,64,184,2,-53,48,50,67,42,224,10,1,5,53,49,57,32,95,53,67,208,1,95,54,-86,172,2,95,54,48,66,68,224,6,0,64,215,1,58,54,71,96,64,67,-66,74,0,48,65,37,1,54,49,64,10,119,120,0,85,99,99,5,67,32,-67,32,61,61,199,157,3,95,53,48,53,66,117,64,102,96,36,13,102,114,-111,109,85,84,70,56,32,34,101,111,102,34,98,165,7,85,32,75,32,95,-51,54,51,160,137,0,73,162,186,0,58,96,114,96,200,3,95,52,57,51,-97,227,67,222,0,53,64,88,2,66,32,90,228,112,0,64,30,99,128,0,-53,120,43,96,57,129,125,1,95,49,192,84,2,95,49,56,64,38,64,177,-0,53,72,127,224,249,3,1,54,48,65,90,128,231,64,7,0,56,64,232,-65,2,64,65,0,54,96,191,161,22,96,240,64,39,0,58,96,37,224,97,-14,0,80,96,37,65,139,3,95,53,50,54,225,95,0,3,57,57,32,35,-67,120,64,28,72,139,0,58,96,79,128,99,193,67,225,29,1,4,118,97,-108,117,101,65,31,225,85,7,64,64,0,51,65,134,129,55,66,133,161,46,-64,85,69,140,66,47,132,206,128,5,1,95,53,99,233,0,53,99,59,129,-232,64,67,225,112,0,1,95,49,119,194,0,58,64,234,96,143,1,53,48,-64,26,64,207,129,179,0,95,82,196,224,160,7,2,92,92,110,224,158,10,-64,98,2,95,49,51,224,158,1,99,14,160,159,130,151,226,116,4,225,31,-6,73,214,225,60,1,96,17,73,34,0,58,97,162,129,42,2,49,32,58,-96,31,225,56,15,2,107,101,121,224,151,10,98,139,225,54,0,0,50,225,-55,5,194,102,133,218,96,113,230,89,2,226,116,1,230,133,7,134,197,198,-182,230,29,0,96,68,65,225,134,94,64,24,1,83,39,99,196,1,52,57,-97,31,0,53,99,95,0,53,129,26,2,67,32,79,68,78,96,139,226,208,-17,64,8,164,9,225,140,1,97,219,130,211,0,57,97,172,2,50,32,75,-128,235,132,206,3,64,66,32,85,130,6,225,9,2,96,88,129,161,128,31,-2,90,32,95,74,231,2,95,49,51,128,52,2,64,64,58,65,121,228,66,-2,101,181,68,66,64,102,64,23,2,85,32,83,64,138,71,45,2,67,32,-60,171,91,224,18,6,66,100,98,138,224,18,1,97,67,0,67,65,59,224,-19,2,65,4,66,42,225,193,1,3,84,82,97,119,132,25,224,24,6,2,-69,79,70,160,23,96,24,5,66,32,95,50,51,53,224,31,2,3,123,45,-35,32,96,32,0,67,128,25,226,21,2,3,32,35,45,125,192,59,224,151,-8,133,74,224,150,4,65,167,224,149,6,5,73,110,100,101,110,116,224,152,-12,4,84,66,114,97,99,99,173,128,27,0,65,128,9,225,17,6,66,87,-224,121,6,65,196,224,121,6,65,108,64,93,0,67,166,175,225,154,1,0,-35,102,182,224,23,11,65,204,226,71,1,224,151,1,6,125,32,108,97,121,-111,117,160,180,225,40,2,224,23,4,227,170,0,98,67,64,4,130,189,224,-25,6,224,20,0,225,213,7,224,195,9,227,254,2,3,56,32,95,51,162,-197,224,18,2,0,49,67,247,224,23,0,193,206,67,56,7,48,55,32,79,-32,35,52,54,195,19,105,99,97,204,227,40,3,64,0,0,58,98,250,101,-131,102,186,1,51,51,72,104,0,53,94,91,1,95,53,99,63,3,64,95,-49,50,68,201,96,185,2,95,49,50,69,201,96,11,0,58,96,6,96,58,-1,48,56,96,53,0,55,69,224,1,53,56,134,178,72,202,128,65,1,95,-53,73,161,160,11,94,94,224,11,1,96,76,128,35,0,57,64,60,1,50,-51,96,106,64,17,0,73,99,42,133,76,68,62,70,209,102,176,131,79,3,-95,51,52,51,226,60,2,21,73,110,116,101,103,101,114,58,32,100,105,118,-105,115,105,111,110,32,98,121,32,48,161,154,160,54,70,236,100,143,96,79,-0,85,64,68,4,49,57,57,32,95,127,29,165,191,224,17,9,128,64,96,-61,224,7,0,132,146,164,144,70,40,64,39,132,181,2,83,32,95,157,129,-228,184,0,68,225,2,95,53,56,134,3,125,180,160,42,0,85,64,10,192,-36,235,192,2,236,8,0,1,95,53,69,95,227,9,0,192,36,107,109,160,-5,160,88,164,159,76,32,193,233,66,13,161,228,72,225,133,144,224,0,2,-0,58,97,113,133,14,0,83,140,91,1,95,50,86,113,3,95,52,52,50,-97,123,134,45,201,248,98,157,0,89,161,61,224,19,0,66,174,96,8,64,-63,226,92,4,224,173,2,236,156,5,64,31,103,92,224,28,0,64,238,128,-69,71,107,100,120,102,210,102,200,160,220,66,101,66,117,67,181,0,48,69,-187,192,28,96,241,76,40,112,90,101,247,224,12,0,1,95,50,103,4,103,-176,95,79,0,64,64,220,103,29,97,219,0,58,97,95,226,193,3,0,57,-65,247,0,50,135,219,0,50,75,243,1,95,50,74,15,194,181,96,58,162,-181,160,11,224,138,0,194,187,128,11,104,223,96,12,128,94,0,57,98,109,-64,148,1,95,53,96,129,3,66,32,95,51,76,196,128,42,64,43,134,156,-161,84,129,94,96,7,129,159,129,64,64,11,107,133,192,7,68,197,1,53,-52,99,119,0,55,167,92,65,83,73,61,0,53,109,94,160,6,194,33,96,-26,70,241,64,21,64,59,69,14,2,95,53,55,161,38,64,32,160,49,64,-28,0,53,104,236,192,85,66,144,165,61,2,95,53,54,128,26,132,177,65,-211,137,47,0,83,142,181,128,162,231,251,0,128,33,97,251,98,214,65,124,-2,95,53,54,97,145,160,117,136,14,66,8,226,112,0,137,128,98,97,232,-47,0,2,95,53,56,101,65,192,95,160,163,128,220,160,12,64,158,128,37,-64,253,99,195,139,14,224,197,16,64,39,162,60,96,66,225,16,3,228,17,-2,64,139,165,70,96,8,141,50,3,95,49,55,52,206,189,0,56,115,81,-205,10,1,67,39,67,16,3,95,53,56,56,227,22,0,224,77,3,224,13,-5,0,58,100,27,1,10,65,228,219,9,14,108,97,115,116,58,32,101,109,-112,116,121,32,108,105,115,134,112,129,44,104,121,0,90,64,239,128,200,0,-58,96,8,98,114,224,89,0,0,79,116,144,64,127,0,58,97,13,227,211,-0,133,115,0,75,66,168,64,253,104,146,0,65,96,13,197,117,132,163,207,-253,227,195,1,240,136,0,2,95,53,53,132,215,107,147,65,141,130,204,68,-148,3,10,65,32,89,160,45,170,52,162,184,129,230,192,93,96,70,138,72,-132,69,229,31,0,69,105,224,10,7,64,133,73,133,167,186,140,10,0,49,-109,191,99,92,3,51,50,50,32,169,183,192,116,133,244,240,133,3,128,48,-64,10,128,47,228,73,0,176,102,0,58,101,193,161,39,130,187,1,95,50,-73,236,129,29,132,51,224,27,7,129,71,163,240,2,50,48,55,64,164,64,-113,1,53,55,69,121,224,104,2,64,188,66,49,224,24,8,96,10,1,64,-95,135,69,0,55,68,100,128,33,1,53,55,69,12,192,11,167,106,110,200,-71,166,96,20,100,94,224,20,4,0,58,103,135,133,222,224,170,1,198,178,-129,213,224,2,0,225,103,0,192,11,99,128,2,95,49,54,102,71,230,126,-0,99,61,165,205,129,253,117,244,224,46,0,70,55,224,46,0,160,23,111,-93,168,244,224,65,24,1,53,55,224,64,21,134,211,0,58,64,239,160,218,-96,71,100,23,224,72,17,96,15,231,17,1,0,58,65,67,130,223,166,206,-69,154,135,235,133,34,165,110,0,82,224,22,4,166,127,96,63,227,69,0,-129,92,164,241,161,66,224,41,1,230,241,0,140,227,229,17,2,67,125,105,-39,128,177,98,16,96,49,104,245,64,238,224,159,3,224,82,1,192,76,133,-81,96,66,114,212,69,79,226,202,4,0,58,96,241,230,123,2,226,28,3,-134,121,0,58,105,175,110,75,73,170,132,247,134,14,69,22,2,95,53,53,-109,96,69,165,67,113,99,117,0,54,73,200,128,67,134,111,1,95,53,113,-179,224,13,1,67,114,128,196,131,66,228,136,5,0,49,196,136,64,39,224,-29,0,0,51,71,105,224,29,4,199,55,233,140,6,0,58,96,102,147,172,-229,152,4,1,64,58,96,167,66,19,130,18,234,39,1,233,208,10,234,15,-1,234,88,11,224,48,20,97,126,228,196,5,76,75,232,239,8,132,201,130,-78,234,8,3,98,244,64,97,229,52,1,102,135,97,87,199,15,0,75,100,-183,160,60,227,167,1,226,101,1,160,114,231,22,0,245,250,3,165,67,224,-115,21,224,113,5,224,111,3,224,49,18,203,13,224,0,0,0,58,98,40,-166,41,2,95,53,54,68,212,0,53,165,232,96,16,0,53,167,46,3,95,-51,51,53,66,62,103,50,144,70,5,53,54,54,32,95,50,70,39,165,174,-105,17,96,44,224,155,4,0,58,96,119,245,159,0,112,200,64,59,227,32,-4,64,180,0,85,227,173,0,224,18,0,1,66,39,224,21,3,168,36,224,-29,0,160,165,227,172,0,96,88,198,249,231,132,8,5,102,111,108,100,108,-49,231,134,8,64,173,99,75,0,54,212,47,227,179,0,226,1,3,96,91,-131,16,234,250,1,0,85,66,78,238,135,2,97,104,136,56,235,72,0,192,-189,233,79,0,164,117,128,182,1,95,50,81,210,201,50,101,6,78,198,1,-95,50,81,141,64,0,169,52,235,30,1,235,31,5,128,151,230,207,1,212,-13,128,144,1,53,51,103,219,99,157,64,83,103,25,64,164,96,45,201,110,-132,39,0,58,100,57,99,127,0,73,194,240,136,159,227,60,4,140,48,227,-245,2,233,17,7,64,144,64,79,115,130,128,189,0,64,227,4,0,138,68,-171,33,225,92,1,236,143,10,233,182,5,64,163,136,10,203,57,128,89,199,-6,101,24,0,50,162,246,72,194,192,155,106,15,130,61,106,65,162,84,179,-144,224,46,1,224,102,1,227,35,0,160,155,235,31,1,224,184,3,224,134,-15,107,204,64,169,224,137,8,192,90,224,134,27,224,181,2,225,11,3,224,-73,1,170,219,65,218,0,48,226,226,2,10,92,34,108,105,98,47,68,97,-116,97,47,175,78,96,7,13,114,110,97,108,46,104,115,92,34,44,53,52,-58,49,98,245,0,58,97,249,116,229,0,53,72,155,67,171,0,58,96,115,-162,224,97,148,128,236,240,213,0,98,186,96,23,162,95,98,240,163,253,225,-236,0,64,41,227,206,4,132,156,128,5,227,149,8,19,105,109,112,111,115,-115,105,98,108,101,58,32,120,115,32,62,61,32,121,115,96,161,84,157,224,-221,38,3,57,48,58,54,242,221,0,237,130,2,64,145,226,86,0,227,125,-3,168,96,227,124,2,0,53,96,21,227,184,4,195,81,0,53,95,156,228,-213,0,196,131,224,80,12,168,247,224,80,6,97,176,96,69,97,127,0,54,-229,120,0,98,76,141,213,106,87,159,98,163,179,160,6,208,144,100,13,224,-37,1,64,106,224,14,3,228,40,1,239,57,0,0,58,96,114,163,241,145,-55,231,33,21,166,55,96,172,0,51,228,220,11,64,82,252,241,0,1,95,-51,69,114,234,160,1,131,14,163,23,129,116,153,181,3,64,95,52,50,151,-23,101,175,160,120,200,22,1,53,51,194,142,72,202,162,142,132,215,228,27,-6,129,43,229,119,9,161,154,229,121,8,225,244,15,96,188,64,110,161,159,-230,102,1,99,126,105,70,199,208,226,76,46,224,91,0,226,76,10,224,95,-3,226,76,32,224,80,1,161,159,193,142,247,187,3,129,32,130,58,226,57,-0,100,69,230,69,2,224,11,3,0,58,96,71,1,10,65,77,119,0,58,-96,147,106,83,102,64,111,231,0,52,138,121,108,214,0,52,131,5,145,7,-96,29,85,21,170,81,84,128,96,10,0,58,96,6,230,148,6,192,251,96,-78,151,123,165,1,128,6,0,58,96,80,224,52,27,224,59,2,0,58,96,-139,224,52,20,224,98,2,160,59,0,58,96,198,224,52,27,224,112,2,0,-58,97,1,102,215,134,208,226,149,3,142,162,224,19,0,115,6,166,10,2,-95,53,52,197,34,167,255,101,28,0,53,124,174,230,49,1,97,136,64,123,-135,57,96,86,75,246,73,113,69,12,160,47,198,59,64,65,128,87,194,57,-160,128,134,142,96,18,135,203,145,58,171,249,102,65,96,17,192,118,0,58,-96,7,193,241,99,75,1,95,49,127,32,0,49,67,128,1,95,49,67,154,-1,95,49,67,241,1,95,49,133,3,97,241,131,115,97,241,64,10,0,58,-96,6,3,10,65,32,75,144,130,64,155,64,13,2,50,32,58,96,185,96,-25,111,98,64,208,96,110,64,70,138,47,84,181,0,58,98,108,202,139,0,-52,65,107,64,25,0,53,96,25,161,226,235,139,1,234,236,9,132,99,232,-247,2,192,13,0,51,84,109,132,35,96,238,64,82,160,127,225,103,2,97,-240,218,17,64,15,64,9,219,184,2,95,51,48,71,37,96,86,0,58,96,-6,105,40,2,95,53,50,109,97,130,29,64,128,96,164,64,24,88,146,101,-170,71,83,65,239,67,181,85,217,64,49,224,15,3,64,40,239,49,1,174,-3,130,47,2,95,53,51,98,224,64,94,96,111,255,214,6,96,38,64,67,-85,232,241,28,0,242,205,1,5,95,50,57,54,32,35,69,158,160,43,134,-46,224,46,6,96,36,144,114,64,107,129,196,137,174,246,207,0,243,212,0,-169,198,228,255,2,229,28,1,175,179,100,158,224,250,49,128,13,203,43,134,-74,208,227,224,105,0,67,242,224,105,55,129,16,119,194,241,97,8,160,10,-167,49,224,240,7,96,20,244,211,1,123,244,128,11,233,34,0,224,161,3,-67,226,174,40,224,171,53,233,58,6,31,78,117,109,101,114,105,99,46,115,-104,111,119,73,110,116,65,116,66,97,115,101,58,32,110,101,103,97,116,105,-118,101,32,4,97,114,103,117,109,251,171,1,242,48,5,70,101,240,227,2,-163,84,128,12,65,240,160,177,197,26,70,146,237,132,0,224,46,27,87,255,-160,118,224,236,33,224,10,1,224,234,29,14,117,110,115,117,112,112,111,114,-116,101,100,32,98,97,115,220,122,128,148,113,211,226,199,6,194,189,3,83,-32,95,51,112,246,192,179,225,253,4,224,49,2,194,121,160,83,192,11,226,-133,8,224,70,4,110,154,160,49,89,226,160,124,193,49,128,60,97,79,224,-250,1,97,97,129,50,224,10,2,224,55,2,242,123,2,1,95,49,94,128,-144,40,128,65,149,21,224,92,1,97,125,225,87,2,67,216,244,76,0,224,-222,3,96,7,227,94,82,96,146,227,93,8,163,39,64,116,129,83,128,5,-64,248,1,54,53,196,221,243,129,4,175,230,0,35,71,182,64,0,65,99,-67,105,226,121,1,224,40,7,228,239,0,224,62,13,199,47,224,70,6,160,-38,194,26,226,187,35,0,58,102,12,208,65,237,52,2,125,152,96,136,143,-76,167,192,65,103,64,24,224,245,5,163,100,98,166,198,218,65,9,106,235,-77,109,101,168,160,22,3,95,50,57,57,227,37,2,2,32,37,32,163,1,-224,45,5,64,0,126,3,96,6,65,2,0,58,94,224,199,107,64,136,156,-92,249,241,3,70,215,134,52,226,216,2,194,59,194,154,119,203,225,101,0,-1,95,52,159,28,167,154,198,45,1,95,52,66,174,3,64,95,53,48,103,-44,135,81,252,105,3,130,26,1,95,52,94,43,1,95,53,176,71,2,58,-53,50,242,54,0,0,51,72,70,96,18,0,54,96,18,3,80,32,58,53,-64,199,108,48,3,50,48,32,80,117,31,0,50,76,57,160,229,107,109,125,-17,0,49,104,90,0,50,181,40,2,53,50,50,65,191,66,157,152,39,64,-47,161,7,64,201,0,80,96,19,135,111,2,66,32,80,167,138,0,85,96,-21,135,25,96,123,219,233,198,166,1,95,49,92,57,109,112,0,95,95,216,-0,52,95,147,227,208,1,225,240,0,0,53,75,141,2,95,53,49,97,150,-88,94,73,147,165,88,1,58,53,66,13,226,63,8,107,248,0,48,83,152,-96,94,128,14,97,40,89,28,225,252,1,114,214,97,254,225,209,2,228,242,-0,138,9,115,124,229,164,0,193,208,77,153,90,71,163,169,91,147,97,138,-65,139,97,171,225,219,2,192,18,160,50,104,164,0,49,137,169,0,49,64,-198,0,58,96,219,136,172,135,17,2,95,53,49,128,173,98,197,110,47,129,-3,106,85,97,167,0,58,96,59,225,234,0,128,17,129,233,0,85,65,249,-161,252,64,71,192,89,195,89,224,74,0,132,168,0,56,128,21,128,112,130,-9,129,131,129,121,0,58,96,171,212,138,64,14,193,253,1,95,53,105,224,-97,138,225,63,4,226,215,51,0,58,97,162,236,101,0,131,79,1,90,32,-224,34,1,0,58,96,52,183,13,64,13,194,87,67,219,90,137,64,92,0,-56,64,25,64,98,251,222,1,64,19,119,93,162,21,224,177,2,229,105,1,-224,173,0,161,170,224,25,3,227,205,1,97,222,160,33,226,0,39,225,20,-0,0,95,91,37,97,59,0,95,152,157,0,54,227,14,0,0,58,96,23,-163,55,65,139,224,197,2,252,164,1,195,126,193,113,228,84,0,163,147,96,-71,225,186,0,0,51,101,116,0,58,97,210,65,6,0,50,163,112,193,4,-228,79,11,225,34,40,96,25,227,31,4,224,20,1,97,35,128,110,102,80,-225,39,27,1,95,49,76,152,164,34,77,53,128,10,0,50,97,58,161,41,-203,231,213,18,197,140,230,199,2,189,73,225,196,2,160,177,64,34,255,177,-6,128,186,0,54,166,90,224,51,4,64,15,250,205,3,160,45,236,94,3,-231,38,2,136,198,194,239,120,16,160,0,0,58,96,230,109,77,0,57,100,-247,67,10,99,213,209,216,65,126,80,90,1,49,48,192,0,1,32,58,96,-38,229,117,6,96,92,64,72,0,51,230,146,3,224,174,1,128,164,225,170,-0,225,124,2,193,96,0,57,162,6,64,75,130,115,0,90,71,113,0,58,-96,31,226,104,0,254,136,1,162,90,0,58,96,71,3,10,65,32,73,64,-152,130,100,96,10,130,93,152,181,128,39,227,205,3,1,82,32,127,183,0,-52,95,243,128,133,70,79,1,52,57,209,137,0,90,72,28,64,16,128,255,-160,138,64,45,179,55,0,48,72,66,161,115,67,235,1,95,52,97,118,1,-95,52,95,226,2,58,52,56,199,160,0,89,100,111,99,148,0,56,163,235,-224,62,3,1,95,52,94,234,236,181,3,64,33,243,28,1,79,201,0,64,-72,221,106,35,205,95,193,77,96,41,69,57,224,42,0,0,67,69,161,72,-58,4,50,48,57,53,49,67,116,3,64,35,53,53,78,36,229,1,0,224,-123,3,129,139,104,228,160,20,138,220,82,31,1,52,56,194,40,124,122,1,-51,56,127,223,64,222,230,183,2,21,104,71,101,116,67,111,110,116,101,110,-116,115,58,32,115,117,114,114,111,103,97,116,203,202,69,102,71,36,160,110,-93,183,64,174,224,18,0,65,60,92,137,1,95,52,64,92,79,175,128,24,-203,148,65,72,130,11,134,89,0,58,96,39,99,100,148,0,144,221,66,209,-4,35,49,49,49,52,177,246,236,125,5,29,68,97,116,97,46,67,104,97,-114,46,99,104,114,58,32,105,110,118,97,108,105,100,32,99,111,100,101,112,-111,105,205,96,143,87,0,58,96,244,166,83,125,211,96,19,130,86,6,94,-103,101,116,98,32,58,97,177,98,234,6,55,51,32,79,32,95,52,75,95,-0,79,64,14,0,53,198,24,97,234,255,251,0,225,112,0,2,64,95,52,-89,91,139,250,2,95,52,55,66,242,94,66,224,171,1,6,111,112,101,110,-70,105,108,129,63,225,148,2,0,58,98,99,101,135,66,3,93,224,96,57,-234,3,1,0,51,97,203,200,172,190,46,5,51,56,53,32,95,51,70,198,-96,152,64,3,160,14,161,245,67,19,108,118,164,22,96,6,224,142,1,1,-58,32,206,125,0,58,64,173,226,251,11,126,164,130,251,113,134,128,26,177,-137,225,236,4,129,255,224,34,2,135,114,64,90,180,108,226,247,2,0,52,-91,21,64,88,64,213,81,58,117,87,75,217,224,33,6,0,51,100,213,224,-54,8,132,83,0,52,127,214,1,95,52,181,52,192,122,83,64,0,58,96,-141,96,117,1,95,51,119,113,0,52,65,191,0,58,96,43,65,236,4,102,-108,117,115,104,65,238,191,200,64,128,227,57,1,93,20,161,221,224,224,0,-212,58,244,146,3,122,84,0,83,128,114,64,3,224,131,4,224,13,6,227,-46,7,159,249,1,95,52,115,211,0,52,127,224,227,50,3,95,224,96,199,-130,157,135,87,0,58,96,22,211,108,0,90,132,201,96,51,225,108,0,165,-6,2,32,95,52,75,132,107,71,96,29,64,244,4,99,108,111,115,101,96,-244,223,231,133,38,90,221,2,52,54,56,238,23,0,0,58,96,156,12,10,-65,32,116,111,70,117,110,80,116,114,32,58,64,30,128,50,0,75,64,50,-0,51,97,137,64,40,129,102,3,95,51,57,54,64,67,99,85,64,178,226,-101,1,5,115,116,100,101,114,114,66,105,0,58,97,184,69,193,1,79,46,-128,21,64,87,172,42,160,64,66,58,99,114,224,64,4,1,105,110,160,63,-166,1,96,63,1,105,110,64,62,163,173,1,52,56,163,40,69,227,136,247,-97,89,224,9,1,128,30,72,252,221,25,116,127,251,174,2,74,101,130,98,-0,58,96,6,132,5,0,50,64,101,181,61,0,51,64,11,239,171,3,227,-252,4,0,48,128,100,227,40,3,163,142,230,24,8,64,138,85,209,96,36,-0,52,134,6,0,52,253,69,0,131,189,0,56,69,170,67,73,99,198,233,-16,4,90,159,64,6,174,65,0,58,99,167,182,154,0,80,164,179,129,135,-224,6,2,98,255,188,89,3,75,52,32,58,96,37,100,98,230,57,8,69,-119,166,171,226,180,5,98,41,155,37,207,44,224,55,2,0,51,140,118,192,-192,228,223,0,201,244,0,51,136,20,96,176,226,9,0,11,112,101,114,102,-111,114,109,73,79,32,94,38,162,160,64,31,130,22,2,102,112,102,97,230,-186,210,4,102,112,110,101,119,64,14,129,245,8,94,97,100,100,95,70,73,-76,69,64,18,129,176,96,18,3,117,116,102,56,64,18,223,76,229,166,5,-98,18,0,49,76,135,160,191,128,11,161,58,1,48,49,64,4,0,51,77,-145,4,64,79,32,35,49,76,148,101,246,224,26,10,0,57,198,203,224,27,-8,72,227,224,26,11,226,213,1,1,119,43,165,124,1,95,52,154,104,229,-31,3,130,149,1,95,51,97,135,225,74,3,194,12,226,97,8,0,58,98,-126,100,217,70,101,1,32,58,96,85,165,209,0,52,81,112,1,95,52,105,-243,0,52,185,251,76,197,0,52,69,113,128,8,181,221,128,12,0,51,160,-29,88,85,0,52,82,111,96,165,99,53,0,58,96,69,108,223,123,221,81,-103,1,95,52,81,186,0,58,96,41,74,77,1,52,54,64,126,129,192,247,-188,5,0,58,96,83,201,57,195,44,155,125,98,218,119,241,139,214,207,160,-0,58,64,143,130,220,160,27,89,149,0,55,209,147,64,4,224,70,2,69,-19,96,206,102,52,215,108,233,90,0,135,91,185,83,0,89,105,139,74,102,-130,8,96,50,160,117,171,33,96,245,100,95,1,51,57,64,212,129,99,2,-95,52,51,66,95,185,57,98,79,103,96,96,61,1,95,52,89,42,1,64,-58,64,35,129,14,0,55,64,43,230,142,0,162,121,227,110,3,88,179,225,-254,16,231,101,6,128,103,231,101,7,231,154,7,96,127,129,142,133,245,1,-100,105,69,108,185,93,0,94,66,34,160,17,193,143,149,147,236,118,2,125,-199,176,16,254,135,1,131,244,96,149,65,138,1,95,52,64,110,129,127,137,-227,161,63,64,127,235,163,2,110,19,96,43,129,62,76,103,184,205,11,94,-71,69,84,84,73,77,69,77,73,76,76,75,218,181,11,139,218,96,2,70,-164,0,90,112,20,128,0,1,58,52,179,204,194,92,91,129,128,247,0,58,-126,198,160,208,193,97,0,95,82,96,228,206,1,193,119,73,22,167,34,229,-93,0,165,213,231,244,1,164,229,231,79,3,129,146,171,69,183,73,169,152,-228,100,3,244,35,2,224,78,1,224,71,5,229,34,3,96,187,207,141,234,-227,6,5,104,101,97,100,58,32,114,68,3,32,108,105,115,138,211,107,48,-179,115,8,65,46,119,114,105,116,101,32,58,96,92,167,166,225,63,0,64,-2,198,229,1,58,52,179,109,145,188,225,98,1,225,94,0,1,58,52,64,-145,128,33,0,51,224,68,4,192,30,161,197,68,255,2,75,32,85,165,95,-224,2,43,193,208,224,0,3,224,68,40,224,2,3,224,80,11,224,81,53,-224,84,15,224,85,56,96,2,217,229,224,0,9,135,67,224,1,31,246,110,-9,5,70,108,97,103,115,123,250,93,0,224,0,10,162,178,224,2,52,96,-192,224,126,11,7,118,101,114,98,111,115,101,61,173,125,86,239,1,95,50,-71,253,248,122,0,224,0,10,224,231,25,224,1,1,192,114,2,79,32,35,-70,82,238,82,0,224,0,9,224,231,56,224,228,16,4,114,117,110,73,116,-224,226,4,0,52,85,43,224,226,18,224,215,25,192,1,224,223,32,224,222,-50,100,234,66,129,224,112,3,224,222,1,5,109,104,115,100,105,114,160,223,-144,37,152,183,224,223,16,224,212,23,192,1,224,220,31,224,219,44,64,213,-219,66,224,221,18,4,112,97,116,104,115,224,220,34,224,209,21,192,1,224,-217,30,224,216,48,224,208,18,4,111,117,116,112,117,194,142,224,209,26,224,-202,23,64,1,224,206,29,224,205,45,227,85,15,6,108,111,97,100,105,110,-103,227,87,32,224,197,62,224,196,41,224,193,16,4,115,112,101,101,100,224,-191,31,224,188,59,224,187,38,224,184,16,7,114,101,97,100,67,97,99,104,-229,183,5,224,188,17,224,185,56,224,184,35,224,181,16,104,250,224,182,34,-224,179,53,224,178,32,224,175,16,6,117,115,101,84,105,99,107,196,124,224,-173,21,224,170,50,224,169,29,224,166,16,4,100,111,67,80,80,224,163,27,-224,160,47,224,159,20,229,197,30,5,99,112,112,65,114,103,229,199,27,224,-163,44,224,162,17,224,159,31,224,157,29,224,154,41,225,60,21,225,211,15,-6,99,111,109,112,114,101,115,226,122,25,224,142,38,224,141,8,225,30,2,-126,12,225,36,20,6,98,117,105,108,100,80,107,197,242,225,39,16,224,146,-35,224,145,5,251,41,3,224,140,22,77,95,224,139,25,224,134,29,224,132,-2,238,13,2,232,147,18,5,107,103,80,97,116,104,224,123,20,224,117,23,-224,115,3,226,6,15,6,105,110,115,116,97,108,108,224,230,1,226,8,11,-224,102,20,96,101,236,193,0,224,205,13,4,116,97,114,103,101,232,144,18,-224,92,14,224,74,11,3,100,117,109,112,108,209,224,175,4,1,49,50,81,-109,0,49,85,4,233,182,16,224,0,11,192,115,0,49,79,44,128,116,128,-75,0,51,158,142,128,12,224,17,3,79,232,0,48,224,18,6,96,39,0,-51,79,207,115,56,64,76,160,11,0,58,96,6,210,229,120,52,81,43,115,-199,0,57,130,4,0,80,224,225,7,6,78,111,116,104,105,110,103,161,44,-245,90,0,0,52,64,48,65,56,1,52,50,210,240,177,241,225,115,13,4,-74,117,115,116,32,225,113,0,161,111,160,49,160,176,160,171,96,166,145,106,-120,194,96,79,80,212,0,35,82,228,64,61,92,213,128,16,216,92,64,140,-239,249,3,121,183,147,145,3,60,32,64,35,64,91,224,18,6,64,103,225,-0,0,128,18,66,48,0,85,224,183,7,3,68,97,108,108,160,182,224,27,-9,8,99,111,109,98,105,110,97,116,111,120,69,128,218,224,82,4,80,154,-224,54,9,6,116,111,112,108,101,118,101,224,87,17,5,100,101,115,117,103,-97,224,84,0,244,124,1,128,85,120,72,224,104,5,81,69,224,104,10,7,-121,112,101,99,104,101,99,107,224,105,18,2,114,105,118,221,54,224,31,10,-3,112,97,114,115,224,30,0,226,88,0,98,217,162,88,96,11,0,58,96,-6,225,129,1,226,69,8,2,70,97,108,160,71,224,24,6,2,84,114,117,-192,95,192,92,83,209,192,92,148,176,64,6,157,28,2,49,54,53,162,110,-1,95,52,84,174,1,58,52,83,221,250,49,0,224,1,17,243,164,1,224,-0,0,0,58,96,65,96,87,0,85,244,82,1,155,164,87,92,87,214,224,-167,0,6,118,56,46,48,94,42,34,96,113,217,217,1,48,56,64,162,0,-49,96,19,212,64,1,49,48,67,192,0,48,93,153,0,35,64,40,224,12,-0,0,48,228,163,0,0,58,96,51,128,65,85,187,89,75,96,193,0,58,-64,15,128,10,67,97,1,48,55,100,127,0,54,160,56,3,95,51,51,53,-65,95,0,56,65,91,152,174,0,58,64,130,128,193,96,48,125,74,0,52,-83,255,0,58,64,61,128,25,246,129,0,131,187,181,8,246,231,10,229,160,-1,213,44,224,47,2,160,110,129,108,1,95,51,65,134,182,89,150,142,64,-123,64,25,64,20,1,95,52,68,137,253,211,6,9,94,42,79,112,116,105,-111,110,115,58,97,70,248,126,16,2,45,104,32,224,0,7,14,80,114,105,-110,116,32,117,115,97,103,101,94,42,45,63,224,31,22,4,45,104,101,108,-112,224,31,10,7,116,104,105,115,32,109,101,115,192,38,6,118,101,114,115,-105,111,110,224,38,9,1,101,32,160,26,64,37,6,110,117,109,101,114,105,-99,224,45,1,224,37,8,10,32,110,117,109,98,101,114,94,42,45,118,224,-116,3,96,0,6,73,110,99,114,101,97,115,96,43,31,98,111,115,105,116,-121,32,40,102,108,97,103,32,99,97,110,32,98,101,32,114,101,112,101,97,-116,101,100,41,94,42,45,0,113,224,61,8,1,68,101,224,61,33,0,108,-224,61,8,27,83,104,111,119,32,101,118,101,114,121,32,116,105,109,101,32,-97,32,109,111,100,117,108,101,32,105,115,32,78,202,5,101,100,94,42,45,-115,224,54,13,73,142,2,105,108,97,65,175,0,32,110,52,14,32,105,110,-32,108,105,110,101,115,47,115,94,42,45,114,224,53,8,16,82,117,110,32,-100,105,114,101,99,116,108,121,94,42,45,67,82,224,32,8,2,101,97,100,-224,86,4,0,99,77,23,64,42,0,87,224,42,7,0,87,118,49,224,43,-12,224,42,7,128,86,3,97,110,100,32,150,102,224,52,11,3,88,67,80,-80,224,52,6,8,117,110,32,99,112,112,104,115,32,64,222,9,111,117,114,-99,101,32,102,105,108,101,64,218,3,68,120,120,120,224,45,5,4,80,97,-115,115,32,128,23,1,116,111,128,55,3,94,42,45,73,224,39,14,96,23,-224,39,2,0,84,224,36,5,23,32,32,32,71,101,110,101,114,97,116,101,-32,100,121,110,97,109,105,99,32,102,117,110,99,96,177,98,193,9,32,115,-116,97,116,105,115,116,105,99,64,62,0,122,224,62,8,0,67,171,41,64,-235,166,124,6,32,99,111,100,101,32,103,160,87,97,171,66,159,1,46,99,-96,213,7,94,42,45,105,80,65,84,72,224,69,4,3,65,100,100,32,96,-20,1,116,111,194,22,6,115,101,97,114,99,104,32,82,126,3,94,42,45,-111,124,189,224,0,3,0,79,113,198,64,48,64,26,1,94,42,224,28,4,-128,0,1,73,102,96,27,4,32,101,110,100,115,64,133,0,46,64,163,6,-32,112,114,111,100,117,99,66,128,224,178,2,128,153,224,67,28,224,64,2,-0,67,224,55,17,7,79,116,104,101,114,119,105,115,194,4,0,101,97,3,-224,113,1,5,115,32,116,111,103,101,64,36,4,32,119,105,116,104,96,29,-2,114,117,110,99,26,5,115,121,115,116,101,109,64,218,224,106,1,15,114,-101,103,117,108,97,114,32,101,120,101,99,117,116,97,98,97,72,0,97,224,-118,8,9,67,108,101,97,114,32,112,97,99,107,97,187,225,67,4,0,97,-225,118,20,224,51,13,3,76,80,75,71,224,50,4,8,32,76,105,115,116,-32,97,108,108,161,167,3,115,32,111,102,224,59,0,6,80,75,71,94,42,-45,80,224,51,8,0,66,76,184,224,37,6,0,81,64,7,5,32,91,68,-73,82,93,160,37,0,73,139,109,224,39,6,5,116,84,65,82,71,69,226,-183,3,6,83,101,108,101,99,116,32,139,54,225,124,12,7,68,105,115,116,-114,105,98,117,66,125,128,38,21,115,58,32,100,101,102,97,117,108,116,44,-32,101,109,115,99,114,105,112,116,101,110,224,60,12,0,84,128,48,196,213,-4,100,101,102,105,110,162,197,128,25,4,46,99,111,110,102,66,147,9,112,-116,99,32,79,80,84,73,79,78,160,58,166,82,3,32,102,111,114,97,208,-0,67,193,252,69,142,0,100,75,156,4,45,80,65,83,83,192,105,7,68,-101,98,117,103,44,32,112,101,194,9,65,83,84,32,97,102,116,101,114,32,-64,34,224,153,12,16,80,111,115,115,105,98,108,101,32,112,97,115,115,101,-115,58,32,105,14,1,44,32,137,53,1,44,32,233,95,0,64,18,105,178,-1,44,32,201,220,0,44,226,123,2,0,44,65,191,134,246,103,69,136,92,-0,75,70,254,0,50,102,254,0,58,71,7,232,4,0,136,75,0,85,64,-25,0,58,71,37,232,137,5,0,85,68,37,14,58,32,109,104,115,32,91,-45,104,92,124,63,93,32,91,134,244,96,8,166,149,96,11,230,188,6,64,-19,0,118,64,4,0,113,64,4,0,108,64,4,0,115,64,4,0,114,64,-4,6,67,91,82,92,124,87,93,64,10,69,49,64,7,3,68,68,69,70,-64,7,0,73,66,178,64,8,0,84,64,4,0,122,64,4,100,81,64,8,-100,39,64,8,1,97,91,96,18,64,10,0,76,96,10,4,92,124,80,75,-71,96,15,66,159,64,7,226,129,2,64,14,162,104,96,69,225,217,1,64,-14,225,185,1,16,93,32,91,77,79,68,85,76,69,78,65,77,69,46,46,-92,124,96,110,105,134,72,99,104,139,1,57,48,64,4,5,56,32,64,58,-51,57,172,7,1,51,57,77,15,8,57,55,32,64,95,51,55,52,32,232,-94,2,4,115,116,100,111,117,124,167,0,58,96,51,5,10,65,32,73,79,-46,128,21,1,32,58,96,50,169,79,0,66,64,65,108,96,236,244,0,255,-24,0,1,51,57,253,184,0,109,60,253,148,3,64,115,201,159,64,135,192,-79,91,174,0,80,96,164,137,42,78,163,0,52,96,44,1,50,32,107,210,-2,66,32,95,73,80,1,51,57,64,74,0,58,96,98,64,157,64,149,130,-28,6,65,46,97,108,108,111,99,64,16,170,110,1,51,50,64,12,130,33,-0,83,155,184,253,210,1,2,95,51,56,141,163,2,51,56,56,76,53,75,-53,0,58,65,45,128,145,2,95,51,54,224,207,1,64,33,0,58,96,47,-96,153,113,38,0,67,74,32,0,83,96,84,127,252,0,53,140,119,2,95,-51,54,77,187,4,50,48,57,53,49,66,201,4,64,35,53,53,50,64,231,-170,47,1,51,55,94,127,1,51,55,138,83,79,92,1,51,56,96,17,0,-56,64,17,225,137,1,17,104,80,117,116,67,104,97,114,58,32,115,117,114,-114,111,103,97,116,172,8,0,95,96,77,0,58,96,147,126,116,0,35,75,-93,67,12,96,66,225,158,2,0,56,97,133,188,180,159,251,224,9,2,110,-216,1,51,56,106,164,65,48,107,70,1,95,51,64,76,192,6,0,58,96,-154,224,81,0,193,166,240,205,2,128,14,224,11,2,225,202,2,97,225,64,-95,97,138,3,56,51,32,58,96,145,107,6,0,56,64,17,0,50,96,179,-172,46,1,50,57,127,63,1,55,56,97,11,111,154,2,51,48,53,160,38,-64,144,66,178,192,11,0,55,192,11,0,58,96,6,205,89,108,169,192,154,-0,90,96,129,97,246,242,67,3,178,73,253,196,0,129,20,64,174,139,236,-64,20,253,228,2,144,177,2,51,55,57,64,11,237,155,5,0,58,239,176,-0,128,43,96,30,224,36,16,193,27,131,42,0,54,66,121,0,83,162,57,-2,51,53,57,140,196,224,72,28,128,162,192,185,242,156,3,160,171,0,56,-176,7,224,94,8,240,120,11,1,32,40,128,86,224,122,9,77,92,0,49,-242,57,1,224,118,0,206,137,161,164,110,137,128,11,0,58,96,6,238,230,-1,0,66,128,108,0,64,240,112,8,65,76,224,18,6,78,81,224,19,8,-97,139,224,19,6,67,37,239,221,6,111,99,0,85,224,212,2,10,105,110,-116,101,114,114,117,112,116,101,100,128,221,224,28,3,1,114,101,170,211,5,-118,97,110,105,115,104,192,34,224,35,4,72,246,165,7,240,181,9,79,22,-224,45,4,7,117,110,115,117,112,112,111,114,71,222,1,111,112,74,101,2,-105,111,110,224,120,9,8,104,97,114,100,119,97,114,101,32,103,247,194,22,-224,243,7,132,69,224,19,5,66,233,224,132,7,68,152,224,243,5,7,97,-112,112,114,111,112,114,105,75,60,71,122,224,129,9,14,105,110,118,97,108,-105,100,32,97,114,103,117,109,101,110,192,131,224,34,3,3,102,97,105,108,-225,18,0,224,115,7,66,88,224,44,3,11,112,114,111,116,111,99,111,108,-32,101,114,114,209,228,224,31,3,170,56,224,29,2,224,240,9,225,247,10,-225,246,10,225,245,10,225,244,7,2,117,110,115,76,25,2,102,105,101,77,-73,8,110,115,116,114,97,105,110,116,115,224,149,9,3,117,115,101,114,224,-147,4,224,210,4,4,101,114,109,105,115,110,184,3,100,101,110,105,225,10,-15,226,2,7,6,105,108,108,101,103,97,108,225,254,19,2,101,110,100,74,-155,75,161,225,251,14,225,230,10,225,229,7,226,188,0,5,101,120,104,97,-117,115,226,224,21,3,98,117,115,121,225,201,14,224,86,6,12,100,111,101,-115,32,110,111,116,32,101,120,105,115,162,22,224,31,3,1,97,108,92,98,-0,121,128,30,161,82,128,0,196,11,114,115,164,11,135,73,64,6,196,11,-2,95,51,51,64,4,101,69,3,85,32,75,50,100,26,240,255,4,5,72,-97,110,100,108,101,132,140,0,67,177,60,228,129,8,96,94,96,68,0,58,-96,6,102,88,0,48,74,41,1,51,51,68,232,1,48,49,224,81,2,0,-83,98,124,4,46,73,79,46,69,193,235,224,28,1,5,73,79,69,120,99,-101,107,30,96,114,96,99,0,58,102,125,9,10,65,32,94,112,117,116,98,-32,58,103,164,96,99,3,55,51,32,79,64,6,0,52,64,148,2,95,51,-55,214,127,0,58,103,205,74,172,0,50,64,2,64,15,134,239,3,75,32,-75,51,96,14,134,240,72,40,218,117,70,151,230,161,2,167,59,0,39,233,-62,3,0,54,66,9,242,113,1,96,29,232,184,1,166,157,4,51,54,52,-32,95,118,183,136,117,71,82,0,54,65,27,4,64,95,51,52,51,225,8,-2,3,66,97,100,32,129,94,77,35,226,124,0,2,95,51,55,128,102,64,-166,135,132,118,59,96,151,96,4,130,50,224,151,0,182,90,1,51,55,65,-223,168,203,0,49,72,61,233,223,1,96,75,167,144,1,55,57,65,65,171,-158,2,112,50,112,64,13,162,18,1,52,56,98,142,128,97,224,5,0,86,-207,98,161,64,1,71,138,69,11,2,95,49,51,103,243,224,6,11,224,42,-2,64,15,128,48,224,42,30,160,28,224,49,10,224,42,15,224,49,10,224,-42,22,224,49,3,72,205,72,193,97,161,0,58,96,6,212,152,1,51,54,-181,210,84,41,65,199,128,25,71,171,1,51,54,103,215,84,218,64,26,194,-142,84,94,0,49,67,26,128,99,0,58,96,38,160,78,0,89,244,202,0,-72,211,104,32,64,32,213,202,0,82,65,96,245,202,2,66,69,64,25,0,-85,66,178,69,139,0,58,96,27,98,12,0,95,88,110,85,153,0,58,98,-145,1,10,65,114,74,0,58,106,224,224,109,2,156,50,98,168,0,80,96,-93,64,240,64,92,232,162,5,128,138,85,62,104,159,98,252,0,58,75,100,-194,18,2,95,51,53,105,252,97,39,72,179,1,64,58,96,6,10,10,65,-32,115,101,113,117,97,108,32,58,96,33,97,2,1,52,55,130,116,1,95,-51,96,57,0,52,72,181,226,136,1,3,95,51,53,54,227,1,2,5,77,-72,83,68,73,82,98,248,2,58,51,53,129,69,227,113,3,96,179,108,92,-0,53,98,219,75,214,233,60,0,97,196,1,51,53,64,39,76,204,0,56,-85,242,235,51,0,2,95,51,53,108,203,224,123,0,171,57,64,103,129,147,-236,199,0,1,53,52,107,113,96,102,64,188,153,174,0,58,96,64,1,10,-65,112,101,6,67,83,116,114,105,110,103,64,231,171,40,1,57,55,119,26,-0,58,96,127,227,58,0,98,54,96,158,0,49,65,139,64,92,224,6,4,-129,65,64,135,0,58,96,6,6,10,65,32,116,111,73,110,77,193,64,33,-68,225,5,103,101,116,101,110,118,64,16,229,166,0,128,192,247,83,2,0,-58,97,86,108,99,0,58,65,102,129,244,1,95,51,64,31,65,196,0,58,-65,133,96,227,64,31,128,238,193,83,2,95,50,52,99,216,225,99,3,194,-78,155,81,228,237,0,92,66,96,108,129,8,76,5,228,191,4,11,116,97,-105,108,58,32,101,109,112,116,121,32,93,229,97,199,0,65,96,126,197,93,-140,80,122,239,2,95,51,52,99,18,0,52,129,48,78,31,64,16,236,98,-2,0,51,98,101,97,126,172,98,160,56,108,98,192,11,65,251,96,11,0,-58,96,6,230,201,6,128,61,230,194,5,104,82,171,166,166,171,96,38,0,-58,96,6,3,10,65,32,90,131,239,102,219,66,49,122,26,64,79,96,93,-230,200,16,6,67,111,110,116,114,111,108,230,198,11,96,18,0,67,219,131,-166,146,64,223,78,240,133,204,230,112,1,64,7,133,210,238,12,1,1,95,-51,64,226,132,134,0,51,65,135,77,189,184,211,153,81,1,51,51,171,247,-131,209,0,58,64,160,64,94,103,198,64,14,129,247,249,48,10,255,59,0,-249,35,0,0,58,100,200,96,155,0,85,225,229,7,4,109,100,53,67,111,-82,17,0,101,161,235,134,167,64,143,68,200,90,164,64,164,1,50,32,68,-111,1,95,56,99,134,65,71,0,89,96,115,140,222,1,67,39,100,144,228,-117,1,197,2,249,165,2,160,235,67,28,96,48,112,144,0,51,98,161,67,-169,2,48,32,95,71,194,1,64,95,76,202,1,95,51,69,147,192,0,0,-58,97,33,67,60,9,109,100,53,65,114,114,97,121,32,58,96,57,130,130,-194,248,0,55,192,154,2,95,51,50,65,225,138,202,231,191,2,231,83,3,-2,95,51,51,94,159,224,46,2,163,221,224,46,0,0,95,112,23,227,49,-5,97,180,128,145,130,218,66,229,64,20,132,111,144,153,97,223,67,118,1,-53,55,222,130,142,24,240,5,2,168,122,225,52,0,192,25,168,149,234,157,-0,2,95,52,54,220,87,0,49,64,78,65,34,3,95,51,50,50,100,156,-128,0,229,234,3,134,17,192,69,232,64,1,64,51,104,161,224,44,2,96,-95,0,66,134,55,1,55,52,161,125,106,160,133,151,193,184,232,102,3,224,-43,10,194,116,229,136,1,128,16,0,58,65,96,226,175,0,220,232,0,58,-96,135,99,211,0,48,67,111,0,50,68,209,193,251,129,245,108,95,0,95,-72,191,0,58,97,152,2,10,65,32,78,144,0,58,96,28,128,57,0,56,-100,78,68,232,1,95,50,113,107,0,95,82,61,1,95,51,68,231,3,95,-50,50,52,160,88,64,11,67,72,192,11,192,112,68,63,75,59,128,11,65,-77,64,106,0,54,96,93,2,114,101,109,64,106,177,60,1,49,48,100,185,-96,156,97,133,99,9,102,109,64,53,64,54,130,153,102,200,128,131,179,53,-0,58,96,39,96,26,98,135,162,19,69,216,97,187,236,130,2,0,95,70,-177,165,159,98,111,80,76,1,50,48,227,163,2,31,92,34,108,105,98,47,-68,97,116,97,47,73,110,116,101,103,101,114,95,84,121,112,101,46,104,115,-92,34,44,51,57,58,0,49,170,91,100,5,0,51,106,155,64,169,64,182,-1,52,51,226,43,1,96,30,0,50,84,160,70,178,130,24,2,49,57,57,-160,19,253,111,0,106,35,113,174,0,67,99,244,164,184,98,96,64,233,73,-41,160,83,171,41,96,69,128,13,0,79,64,209,0,79,236,60,0,132,4,-64,29,224,21,3,1,95,50,86,62,64,6,66,87,0,58,97,76,84,72,-65,122,200,227,134,90,159,210,2,51,49,57,97,163,130,81,67,116,64,16,-230,90,2,86,155,1,95,51,96,77,166,90,192,56,70,90,192,11,66,0,-165,252,64,6,128,102,102,14,82,192,0,65,128,36,65,23,0,58,64,43,-128,31,178,216,1,95,51,113,40,99,181,0,80,128,47,179,182,97,71,224,-15,7,64,65,130,80,0,85,172,144,191,211,65,15,132,151,136,229,95,89,-101,0,0,51,66,62,224,68,0,65,29,224,21,2,160,154,131,112,136,232,-97,86,96,245,112,145,0,58,96,159,102,206,0,55,65,30,130,123,0,75,-64,10,228,169,1,191,223,151,193,96,90,200,217,236,127,6,224,14,5,192,-170,101,84,129,191,136,233,96,188,0,58,96,6,202,74,2,50,49,52,64,-93,192,50,233,41,0,65,236,192,26,0,56,67,160,224,26,3,0,58,96,-91,198,204,172,253,72,247,138,191,172,159,204,153,1,75,50,171,246,96,0,-133,73,98,133,0,85,224,23,2,197,98,235,3,5,133,22,0,49,102,117,-171,248,224,8,4,64,214,96,142,234,170,0,229,177,0,192,9,128,44,236,-142,4,0,58,96,54,136,74,2,52,32,58,66,127,64,13,73,188,185,82,-243,151,0,179,153,227,217,1,11,110,111,32,109,97,116,99,104,32,97,116,-32,131,196,147,186,96,104,68,164,130,211,136,213,163,45,185,147,232,184,26,-207,106,0,46,68,53,2,114,110,97,104,174,224,39,1,2,80,97,116,64,-22,0,77,64,128,2,70,97,105,232,204,4,185,237,142,34,183,195,0,49,-162,121,99,53,135,29,163,64,2,95,49,50,98,16,228,21,1,137,109,96,-5,234,217,2,64,0,72,207,98,128,186,66,161,28,245,55,1,0,49,70,-57,0,35,73,158,181,57,3,49,51,49,32,128,15,99,20,149,46,74,76,-224,24,2,246,37,8,4,39,92,92,39,39,165,23,193,75,165,194,224,82,-0,102,147,136,200,224,17,3,248,100,0,229,161,0,224,151,1,0,64,160,-35,168,46,224,139,0,98,138,245,230,9,3,92,92,92,34,241,182,2,0,-58,96,131,100,184,3,51,53,32,58,97,234,105,150,160,106,100,24,66,158,-1,95,49,74,187,224,14,1,0,50,67,235,64,136,67,60,160,136,109,8,-97,18,64,39,138,221,130,168,174,29,168,14,64,168,151,103,161,150,1,79,-32,96,59,129,144,160,200,96,62,193,205,0,50,122,40,152,240,143,108,207,-106,0,90,64,28,99,45,64,61,224,231,3,0,38,192,230,131,101,100,67,-129,75,99,131,200,230,136,159,113,92,225,89,7,224,60,1,104,125,192,223,-128,77,160,223,96,224,112,171,135,82,195,206,225,163,6,101,172,100,49,128,-180,121,239,226,92,2,113,129,240,40,6,224,210,18,2,64,64,79,89,239,-0,48,251,177,3,2,78,85,76,96,30,96,25,0,49,224,25,3,2,83,-79,72,224,25,1,0,50,224,25,4,1,84,88,224,25,1,0,51,224,25,-3,0,69,224,25,3,252,25,4,2,69,79,84,224,25,1,0,53,224,25,-4,1,78,81,224,25,1,0,54,224,25,3,2,65,67,75,224,25,1,0,-55,110,91,65,180,97,240,96,19,0,56,128,19,0,56,224,19,3,0,57,-96,19,0,49,70,183,224,20,1,70,36,96,21,0,48,224,21,4,0,49,-160,21,224,64,4,68,29,64,21,68,58,224,21,2,142,219,0,49,65,146,-224,108,2,128,43,226,134,0,128,42,224,248,4,1,83,79,225,95,2,224,-248,4,1,83,73,224,25,2,224,248,4,2,68,76,69,224,26,2,0,55,-224,26,4,0,67,137,37,128,26,0,56,224,26,5,0,50,224,26,2,0,-57,224,26,5,0,51,225,203,2,226,0,4,2,68,67,52,224,26,2,226,-1,4,1,78,65,225,127,2,72,220,224,187,2,1,89,78,224,26,2,226,-3,6,0,66,224,26,2,225,11,4,1,67,65,224,53,3,226,5,5,0,-77,224,25,2,225,12,4,1,83,85,224,79,3,225,12,4,2,69,83,67,-224,26,2,225,12,4,1,70,83,224,25,2,225,11,4,0,71,224,25,2,-67,69,224,25,1,0,82,224,25,3,225,9,4,0,85,224,25,2,103,57,-225,63,2,0,69,131,64,198,23,224,0,21,111,5,140,149,0,58,101,112,-158,90,165,30,77,27,0,49,70,8,0,35,104,54,173,124,96,17,1,64,-35,82,120,64,52,172,63,2,50,56,57,69,121,0,54,230,124,1,74,215,-237,114,10,209,50,0,50,94,242,2,95,54,49,172,247,235,34,5,198,32,-1,54,53,192,53,101,51,228,197,1,81,93,101,75,255,154,0,160,23,100,-242,224,39,7,135,58,96,112,128,21,164,154,198,195,165,153,104,15,128,11,-0,58,96,6,191,104,64,139,160,201,224,154,10,224,195,0,154,81,235,190,-0,192,114,109,246,237,37,0,224,36,0,238,12,1,224,10,1,96,50,0,-51,133,127,206,17,97,89,129,128,64,41,0,50,104,18,224,74,4,0,58,-96,102,5,10,65,32,99,104,114,65,131,136,200,0,83,103,249,65,15,2,-95,50,57,64,239,225,215,11,101,170,225,215,5,72,115,128,84,168,171,64,-147,71,53,225,204,1,121,221,64,37,224,19,7,130,37,161,197,160,19,64,-84,234,67,1,234,77,2,224,40,7,66,79,224,40,12,224,102,8,65,243,-224,61,7,65,180,224,102,13,108,27,3,67,32,61,61,64,38,137,247,102,-154,224,97,3,0,58,97,34,107,43,73,49,97,42,66,36,226,184,8,65,-171,1,52,50,240,61,0,1,52,52,84,250,143,198,65,188,96,15,208,226,-1,50,52,66,78,68,222,65,196,72,0,160,41,84,78,65,22,97,218,64,-123,136,189,4,111,114,100,32,58,96,18,9,10,65,32,98,115,105,110,100,-101,120,64,16,182,36,0,50,66,68,0,50,64,142,128,97,1,95,50,108,-26,96,11,233,230,1,85,17,160,169,224,18,4,108,251,224,18,5,129,251,-224,18,4,64,159,224,18,6,129,108,224,18,4,105,18,224,18,5,66,13,-224,18,6,224,151,10,130,31,224,18,4,109,169,224,170,6,224,190,11,224,-191,10,190,72,224,19,5,224,193,10,104,182,224,19,7,224,195,10,223,160,-224,19,4,224,197,10,110,236,224,19,7,224,199,10,97,249,224,19,7,225,-135,11,224,199,10,182,100,224,19,5,224,199,10,98,247,224,19,7,224,199,-10,99,93,224,19,7,163,174,224,19,4,98,151,246,177,6,9,111,69,110,-117,109,58,32,111,117,116,93,242,3,114,97,110,103,187,118,162,199,2,64,-95,50,120,105,64,7,143,77,0,50,119,174,64,7,142,20,0,50,88,1,-96,7,165,183,81,156,96,7,146,230,0,50,89,9,96,7,160,79,99,95,-64,7,160,79,156,67,1,95,50,89,205,96,7,160,79,90,9,96,7,160,-79,122,124,64,7,160,79,188,66,0,50,123,229,64,7,160,79,156,44,1,-95,50,92,42,96,7,160,79,134,139,1,95,50,93,8,96,7,160,79,93,-74,1,64,85,230,209,3,126,120,64,45,228,157,7,64,89,229,44,53,128,-7,96,8,141,3,229,42,13,128,7,96,8,134,72,229,40,34,128,7,96,-8,96,249,224,38,8,65,23,64,29,97,31,64,8,165,41,224,99,7,99,-12,224,119,7,130,248,224,80,5,133,114,128,7,96,8,199,7,224,38,4,-99,71,0,85,138,47,128,8,177,31,231,129,0,160,39,130,227,224,59,5,-161,22,96,7,96,8,129,22,64,9,168,98,224,169,7,64,41,224,208,7,-103,43,224,19,6,131,141,224,109,5,65,55,64,90,97,63,64,8,133,220,-224,38,7,65,55,64,29,166,151,128,95,224,137,9,132,63,224,58,5,65,-33,64,49,97,41,0,85,108,75,224,96,9,130,152,96,6,64,7,96,251,-224,94,9,64,155,224,18,6,132,57,224,75,4,65,47,0,85,108,245,96,-7,129,52,224,35,6,160,246,192,245,166,209,225,158,7,226,0,10,161,255,-193,6,193,154,130,6,168,220,0,49,88,39,198,221,64,238,64,85,149,46,-174,238,231,126,3,135,96,96,46,224,12,5,142,206,2,95,50,49,73,219,-160,78,99,193,224,25,12,196,195,0,56,224,64,0,2,95,50,56,231,102,-0,0,58,96,6,138,9,190,24,64,8,250,31,0,107,104,243,20,2,218,-110,72,11,160,217,145,232,143,165,96,11,192,42,160,134,164,123,106,171,224,-6,5,0,58,64,136,224,124,5,224,121,35,224,108,6,97,92,224,108,10,-0,58,64,250,232,99,0,70,37,183,83,2,95,50,55,130,151,0,95,92,-116,184,154,230,28,5,17,73,110,116,46,115,117,99,99,58,32,111,118,101,-114,102,108,111,119,134,26,224,69,4,0,56,169,58,72,255,224,69,16,8,-112,114,101,100,58,32,117,110,100,224,70,3,0,73,127,123,66,26,122,193,-128,143,226,20,3,183,232,225,216,0,0,56,85,189,128,112,224,19,1,113,-235,96,58,64,13,0,49,192,59,130,178,66,162,224,70,0,128,64,160,51,-65,24,139,89,129,193,0,83,105,215,224,119,1,98,251,0,83,194,230,98,-158,65,162,203,205,242,53,1,209,166,96,65,178,90,210,67,128,84,113,140,-167,28,138,37,128,27,236,25,1,145,250,161,138,129,97,248,16,2,129,91,-224,243,0,204,181,128,163,224,41,1,218,70,96,222,224,215,16,96,134,224,-215,67,135,100,224,215,68,132,189,224,215,9,245,96,0,185,101,76,238,0,-53,118,254,163,55,224,123,1,160,189,96,199,160,177,162,177,64,90,155,196,-226,247,1,249,201,0,192,9,0,58,98,73,67,53,3,54,51,32,95,78,-14,1,50,50,78,9,0,48,132,211,100,233,154,180,98,142,192,40,224,36,-9,0,58,98,154,118,219,64,20,85,197,100,173,128,17,0,49,192,17,132,-133,146,252,128,17,0,54,192,17,0,51,192,17,215,35,69,158,128,17,130,-191,146,228,128,17,129,249,146,220,128,17,129,51,146,212,128,17,128,216,146,-210,128,17,128,193,146,208,96,17,73,89,160,161,192,180,73,116,160,18,192,-181,73,143,160,18,192,182,73,170,160,18,192,183,73,197,160,18,192,184,73,-224,160,18,192,185,73,251,160,18,192,186,74,22,160,18,192,187,74,49,160,-18,192,188,70,45,160,18,192,189,74,103,128,18,72,135,128,18,224,189,0,-72,163,128,18,225,115,1,192,189,68,37,160,18,192,189,66,95,160,18,192,-189,74,238,160,18,192,189,67,4,160,18,192,189,75,36,160,18,192,189,75,-63,160,18,192,189,75,90,160,18,192,189,66,163,177,169,119,42,69,240,183,-39,1,52,55,167,91,229,219,0,80,58,12,10,65,32,115,117,98,116,114,-97,99,116,32,58,64,35,224,62,14,0,52,189,103,224,61,2,128,239,123,-112,126,109,0,58,96,25,254,130,8,96,68,102,66,0,52,94,178,67,55,-0,58,110,239,15,10,65,32,34,94,95,94,44,94,41,94,66,94,57,94,-59,96,5,18,53,94,54,94,57,94,58,94,57,94,52,94,57,94,57,94,-73,94,38,96,7,0,66,96,19,30,57,94,89,94,32,94,53,94,57,94,-54,94,60,94,51,94,60,94,89,94,33,94,53,94,58,94,54,94,58,124,-32,96,75,22,57,94,67,94,59,94,61,94,57,94,60,94,61,94,50,94,-55,94,58,94,45,94,61,96,13,8,58,94,40,94,40,94,60,94,33,96,-75,31,60,94,40,94,50,94,56,94,66,94,40,94,57,94,86,94,32,94,-58,94,70,94,32,94,87,94,33,94,58,94,71,94,2,33,94,32,224,3,-102,224,33,59,224,3,53,224,9,1,0,66,224,15,6,64,5,0,66,96,-5,2,33,94,67,224,19,6,224,43,3,224,79,13,224,69,9,224,15,1,-2,33,94,50,160,67,0,67,96,9,0,34,96,25,224,5,3,224,3,21,-224,33,25,192,37,192,77,224,129,3,224,3,99,0,70,96,5,128,11,64,-5,128,23,193,77,224,3,2,1,124,68,97,21,28,90,94,33,94,81,94,-49,94,67,94,60,94,75,94,49,94,77,94,60,94,68,94,49,94,70,94,-60,94,49,96,3,6,80,94,60,124,111,94,35,224,57,0,64,21,64,7,-4,48,94,48,94,49,97,83,8,57,94,32,94,67,94,48,94,60,96,25,-67,73,2,32,94,48,160,3,64,41,0,80,96,11,3,72,94,32,124,193,-29,225,211,3,224,3,35,64,179,64,9,0,58,160,15,96,75,5,124,50,-94,32,124,47,224,75,40,224,3,13,8,61,94,68,94,35,94,37,94,37,-224,73,56,224,3,37,224,29,19,224,67,31,224,3,145,1,48,124,65,79,-130,49,4,69,94,57,124,40,98,53,0,52,96,17,18,61,94,61,94,59,-94,48,124,44,94,35,94,52,94,35,94,57,94,35,224,5,4,6,71,94,-48,94,90,94,50,98,97,67,189,69,87,6,74,94,48,94,69,94,45,229,-179,0,0,59,96,5,64,73,0,74,96,53,64,25,14,57,94,95,94,50,-94,49,94,73,94,50,94,84,94,35,101,231,10,67,94,57,94,50,94,50,-94,35,124,98,96,73,4,50,94,70,94,35,101,187,6,69,94,35,94,49,-94,49,96,117,4,61,94,67,94,35,96,39,64,51,2,66,94,50,96,89,-8,50,94,77,94,57,94,48,94,45,64,63,1,94,93,99,59,0,35,64,-193,3,124,88,94,50,96,119,64,33,0,48,64,51,5,124,32,94,50,94,-72,160,81,0,61,96,139,0,49,96,235,6,35,94,59,94,59,94,85,96,-205,64,29,128,35,0,66,96,5,66,119,64,35,0,78,96,101,64,83,64,-23,64,17,64,15,16,74,94,50,94,68,94,48,94,87,94,50,94,60,94,-69,94,50,96,137,0,45,96,19,3,72,94,35,124,70,103,2,49,94,87,-96,205,6,95,94,35,94,36,124,53,96,167,0,36,96,151,8,66,94,36,-94,71,94,35,94,67,96,15,2,36,94,36,160,249,65,27,129,103,199,7,-2,49,94,78,160,55,4,36,94,48,94,71,96,103,0,48,97,11,64,7,-64,185,2,48,94,70,96,5,64,85,129,145,128,217,128,101,64,215,64,15,-128,63,128,7,64,27,65,197,64,29,192,75,65,85,64,121,64,35,64,121,-64,21,65,27,2,69,94,40,98,15,65,157,128,29,64,37,64,75,64,243,-224,63,1,224,139,7,224,5,7,64,55,64,101,64,125,64,247,128,71,64,-23,65,85,64,185,2,35,94,70,224,191,0,65,13,128,135,64,37,128,155,-65,17,224,125,1,0,72,224,181,0,224,121,11,0,68,225,5,6,129,203,-192,59,129,3,129,71,0,78,160,51,224,251,3,66,191,64,127,0,50,98,-133,64,55,225,125,27,224,119,7,129,217,225,127,13,64,93,128,141,225,129,-17,66,225,65,125,128,245,64,33,65,113,65,41,128,245,65,41,64,13,193,-101,128,9,192,17,192,39,64,7,0,75,161,169,128,123,64,5,128,29,64,-145,129,145,128,213,0,69,96,35,163,51,105,35,0,69,97,251,69,131,64,-131,128,43,129,5,128,131,0,86,96,5,0,79,225,109,4,130,213,129,215,-64,165,224,237,1,192,53,128,173,225,119,9,64,39,2,57,94,70,98,113,-194,243,0,57,224,111,10,67,37,225,107,9,0,68,96,117,193,171,128,235,-128,123,64,11,64,219,226,143,1,224,117,3,128,17,2,36,94,75,225,147,-0,0,36,226,93,3,99,201,64,23,227,79,3,225,59,3,68,141,65,93,-64,45,0,36,96,189,225,201,7,0,72,96,209,132,35,192,159,0,81,161,-155,68,63,194,205,128,207,66,79,131,15,128,85,65,173,130,133,66,129,128,-201,128,183,128,217,0,57,64,185,1,124,47,96,115,64,201,68,71,64,57,-67,187,68,131,68,103,235,85,0,0,124,64,123,226,49,1,129,67,128,131,-193,89,128,69,69,9,128,143,128,35,69,47,64,89,224,123,1,66,127,0,-95,96,55,2,66,94,61,101,37,75,129,64,11,64,251,66,57,64,41,0,-73,96,251,69,195,128,3,75,237,64,3,64,185,97,217,0,124,64,103,64,-175,0,77,97,27,67,169,134,107,64,119,69,197,64,33,128,251,64,63,64,-87,134,163,0,68,107,247,64,115,96,213,1,124,42,97,127,129,161,65,37,-133,107,129,111,129,191,64,143,2,69,94,57,97,23,192,21,131,69,193,221,-129,63,65,113,134,17,0,76,226,135,0,128,211,129,239,0,36,163,31,64,-13,2,61,94,61,167,75,73,13,137,101,64,139,71,79,137,141,1,66,124,-129,221,197,153,196,47,224,17,0,98,97,224,13,1,70,171,224,45,18,102,-15,2,48,124,56,224,51,4,195,87,64,201,4,72,94,57,94,83,98,133,-131,153,0,73,98,123,2,48,124,85,167,241,0,69,170,43,4,52,94,68,-124,107,98,189,10,57,94,80,94,50,94,41,94,89,94,50,97,155,3,66,-94,48,124,70,223,71,39,2,66,94,39,97,167,67,71,130,179,65,15,4,-72,94,48,94,82,162,229,66,129,0,57,96,17,64,31,64,17,67,73,65,-57,195,181,160,19,1,124,51,224,49,0,66,73,66,203,129,91,65,229,135,-147,142,21,64,37,195,59,130,237,68,137,64,185,72,163,72,51,64,133,0,-45,168,67,64,219,0,34,66,233,1,124,52,160,167,66,57,3,35,94,35,-124,75,79,65,175,3,68,94,48,124,65,243,69,73,0,94,160,151,199,123,-132,213,229,29,1,65,227,128,29,66,101,65,67,199,139,72,97,195,15,4,-74,94,48,124,43,162,183,65,53,195,147,97,117,0,124,74,181,68,169,226,-125,1,64,55,66,167,64,161,128,245,131,75,130,163,131,11,128,123,0,73,-160,45,224,219,0,224,7,0,0,70,97,33,65,3,64,31,67,45,5,37,-94,79,94,35,124,131,139,72,97,0,46,162,173,67,67,197,17,192,93,64,-187,192,201,64,73,66,21,67,227,0,72,169,15,128,171,64,227,195,65,195,-61,131,29,99,61,96,243,128,91,198,13,128,31,128,99,64,135,0,57,99,-207,65,219,64,209,192,69,65,71,67,175,131,55,130,23,193,83,2,69,94,-49,162,65,138,155,65,173,0,42,162,171,76,149,0,71,102,3,129,179,2,-57,94,76,225,61,0,66,251,65,51,196,177,128,105,129,237,8,43,94,33,-124,62,94,49,94,76,77,31,0,124,76,147,4,36,94,49,124,63,237,53,-2,224,3,255,224,3,17,193,143,224,3,181,64,197,2,71,94,32,228,245,-0,0,69,162,89,81,235,64,23,192,7,224,31,11,207,51,192,3,192,43,-0,77,160,43,128,15,0,34,224,7,8,79,21,0,48,241,53,0,0,34,-114,125,2,66,94,60,102,13,224,23,3,64,19,0,67,160,75,192,21,66,-231,0,60,96,73,0,68,111,145,0,60,163,7,224,81,7,64,23,8,74,-94,41,94,68,94,45,94,69,179,57,6,55,94,56,94,53,94,55,224,7,-0,67,57,2,42,94,43,96,35,0,41,102,23,64,25,69,63,2,51,94,-51,99,245,0,58,101,239,0,74,179,127,4,51,94,73,94,57,160,83,68,-119,2,45,94,40,173,39,74,135,77,219,64,45,77,193,224,13,1,69,233,-69,183,70,183,0,59,107,77,67,161,2,67,94,37,99,245,4,37,94,75,-94,35,96,21,71,177,80,149,64,5,64,11,242,89,1,128,7,192,23,0,-58,96,247,71,229,64,15,192,3,64,245,64,51,145,55,67,249,64,49,64,-17,65,227,71,121,80,129,65,75,64,65,128,25,8,61,94,79,94,40,124,-34,94,39,160,51,0,39,104,137,137,171,64,47,0,68,96,43,0,58,96,-147,128,51,192,5,0,70,96,5,0,94,160,31,192,25,128,17,2,66,94,-75,116,41,0,61,232,201,0,0,83,160,39,64,53,4,53,94,54,124,80,-96,15,8,93,94,61,94,88,94,58,124,39,103,125,1,58,124,64,49,0,-85,97,179,10,61,94,84,94,48,124,59,94,40,124,77,96,19,4,40,94,-65,124,54,96,51,69,139,10,58,124,53,94,61,94,71,94,58,124,110,96,-19,2,65,124,119,224,107,2,224,3,11,4,93,94,40,124,43,105,15,129,-145,0,94,160,7,224,3,7,0,79,64,77,5,92,95,94,61,94,65,225,-189,0,224,3,30,1,124,62,224,47,2,0,95,160,11,6,66,94,65,94,-58,124,47,96,207,129,37,64,231,76,183,66,49,64,103,6,48,124,104,94,-61,124,47,242,13,2,193,243,227,163,3,243,11,1,64,5,67,135,79,165,-243,175,111,224,3,73,0,33,162,205,128,13,70,197,64,7,74,43,67,137,-86,135,2,57,124,37,163,223,64,21,100,15,1,124,55,168,203,71,27,77,-145,0,35,104,81,73,101,138,17,224,5,33,80,125,196,29,64,3,67,247,-64,7,128,5,68,21,132,61,64,5,128,23,196,73,226,7,5,71,191,67,-251,64,41,137,133,64,49,2,53,94,76,177,233,215,203,224,3,3,1,52,-124,64,205,0,89,98,11,2,88,94,61,106,25,6,65,124,85,94,61,94,-89,106,157,0,61,184,9,6,61,94,49,94,50,94,39,226,123,11,96,91,-224,87,8,96,5,64,27,2,72,94,39,232,175,0,0,52,117,41,128,139,-0,39,96,81,128,153,74,251,137,187,72,33,69,59,66,97,3,50,94,52,-124,73,187,74,77,64,13,136,119,75,91,137,233,132,43,79,127,0,61,82,-185,1,124,37,96,109,64,23,2,79,94,50,100,11,138,153,67,233,0,71,-100,91,2,78,94,40,98,247,2,73,94,40,99,7,64,15,2,66,124,63,-78,205,2,124,51,124,64,47,0,50,128,13,5,94,65,124,35,124,125,176,-65,4,49,94,72,124,118,141,243,100,7,4,72,94,48,124,39,233,23,2,-68,113,64,37,65,39,64,121,73,55,72,239,0,83,102,147,226,155,53,224,-3,19,73,87,69,193,73,181,66,65,0,49,224,73,48,179,199,171,131,0,-39,173,75,137,213,4,86,94,60,94,72,118,195,150,197,224,3,13,246,153,-41,224,3,69,79,69,224,17,3,224,35,13,224,195,3,88,213,64,9,224,-185,35,70,249,192,5,224,3,19,248,61,3,64,5,66,217,128,7,128,3,-224,47,5,0,84,104,63,129,189,66,71,2,49,94,33,100,25,211,87,139,-71,68,93,235,243,1,71,19,139,181,147,255,146,5,77,105,77,195,67,251,-148,63,1,36,124,67,57,0,79,160,55,64,19,204,99,76,177,0,81,171,-159,66,185,149,221,64,105,64,29,0,91,108,35,132,151,64,121,78,1,142,-9,64,65,0,92,242,191,0,236,213,3,236,151,5,76,125,68,121,69,33,-64,81,71,213,64,77,141,251,85,201,131,41,112,189,111,97,144,17,192,225,-128,7,67,207,129,5,77,33,64,23,65,75,64,55,141,85,131,113,77,117,-144,229,173,189,96,245,144,51,140,123,64,75,174,117,160,25,0,87,177,103,-131,195,79,77,224,121,1,64,17,129,137,64,19,78,149,146,27,224,7,5,-229,235,6,112,83,74,47,64,219,194,109,6,67,94,48,124,79,94,33,110,-255,128,211,224,5,1,0,57,96,9,192,207,65,143,2,50,124,87,101,143,-0,50,101,135,65,119,64,63,64,15,65,61,2,46,94,70,100,147,2,46,-94,46,192,7,1,94,71,160,9,2,47,124,49,96,9,4,47,94,66,124,-109,128,163,1,124,105,101,19,64,157,0,33,96,79,74,245,70,191,129,227,-2,50,94,58,176,3,146,63,128,3,224,5,0,112,121,4,80,94,60,94,-79,65,129,3,124,106,94,50,101,217,4,79,94,61,124,63,160,95,87,47,-71,1,69,125,148,195,94,47,69,125,83,213,222,55,64,215,64,17,134,149,-74,215,230,67,11,224,3,3,65,125,64,7,144,71,139,7,129,235,134,85,-192,3,139,31,0,52,105,43,66,91,152,211,138,61,64,161,0,65,161,157,-87,247,66,69,254,207,58,160,59,192,165,65,69,2,49,124,44,162,43,80,-185,131,145,226,43,9,140,35,128,31,87,181,0,58,126,251,64,9,65,63,-0,67,169,159,66,105,0,66,121,93,137,163,65,83,144,191,145,205,193,161,-114,97,112,99,0,50,66,47,1,124,122,184,235,64,221,66,49,0,44,178,-93,4,72,94,61,124,52,103,127,1,40,94,74,245,95,105,65,161,76,3,-145,59,2,61,124,46,96,47,68,77,4,65,94,65,94,48,195,219,98,117,-76,23,4,35,94,90,94,40,97,85,90,29,64,73,66,247,0,83,104,13,-67,147,0,39,103,151,0,37,96,129,67,99,0,48,177,135,144,103,64,55,-64,37,67,247,2,39,124,41,103,57,6,32,124,39,94,33,124,77,160,195,-210,33,73,117,64,187,0,35,101,63,135,97,0,71,164,207,132,117,0,74,-109,125,0,78,96,5,0,70,253,45,0,75,177,67,51,0,78,96,5,66,-235,141,135,64,195,64,59,66,249,2,66,124,54,163,175,71,207,65,101,64,-147,68,1,71,195,2,48,124,41,109,69,3,72,94,49,124,64,191,193,175,-67,5,81,79,129,117,65,45,128,23,150,227,69,97,0,40,96,11,65,173,-86,85,65,255,69,97,4,72,94,40,124,47,225,177,4,64,85,2,68,94,-40,96,125,141,169,64,63,65,215,64,25,2,57,124,63,170,79,65,45,65,-163,64,51,2,79,94,40,99,101,77,227,132,199,137,29,138,151,134,21,211,-191,65,179,130,97,147,23,69,55,0,40,99,155,74,61,64,7,64,33,64,-89,197,187,73,7,129,5,0,61,101,235,64,89,131,57,64,55,116,45,99,-223,64,169,64,15,201,159,64,243,64,215,64,133,64,11,84,81,154,21,118,-229,65,7,3,124,79,94,48,85,81,3,124,54,94,48,94,105,1,94,76,-96,7,70,211,102,173,162,23,134,141,243,67,3,64,209,69,183,85,7,146,-143,92,223,2,49,94,85,111,181,0,48,109,195,0,65,64,93,1,94,94,-65,27,1,124,41,96,147,64,185,157,23,129,53,97,19,64,123,96,99,64,-237,74,3,129,153,64,197,70,201,66,197,75,45,77,239,64,193,129,79,75,-229,2,48,94,84,96,209,0,40,105,189,203,209,134,83,84,27,0,78,164,-219,65,43,85,195,64,183,230,97,1,128,45,135,21,68,21,216,143,198,205,-68,51,0,45,97,43,134,85,68,151,156,185,219,77,65,11,2,66,94,35,-97,35,148,37,71,133,193,31,70,149,64,75,131,25,70,83,128,83,128,119,-102,189,120,103,64,119,84,59,135,147,136,15,64,135,134,113,138,159,64,53,-133,89,64,199,67,97,65,9,221,71,244,53,1,64,5,202,15,160,233,107,-41,246,247,7,132,147,69,17,101,243,168,21,64,73,64,193,66,47,192,223,-199,101,251,175,33,129,91,128,141,154,187,251,175,1,153,233,64,47,64,91,-85,91,128,53,192,31,84,137,194,77,64,229,154,155,192,119,132,185,64,9,-64,71,156,77,192,95,64,217,64,5,225,5,1,136,57,65,113,136,203,66,-83,64,155,2,92,94,48,98,29,192,237,64,49,129,63,131,167,213,89,192,-57,137,217,0,93,186,21,192,121,192,221,129,31,128,243,129,167,195,41,0,-65,66,161,97,89,194,89,64,169,224,51,5,0,86,97,235,98,143,102,27,-192,97,245,237,1,128,39,137,243,129,17,129,151,73,173,0,82,173,99,128,-37,64,47,192,153,161,215,224,45,0,0,83,106,37,2,48,94,90,161,75,-224,49,1,130,241,65,111,67,37,64,47,134,119,77,235,65,219,2,65,124,-56,165,89,226,167,1,99,29,1,124,99,102,101,4,32,94,95,94,33,96,-55,68,197,68,85,226,39,1,132,131,226,31,1,91,25,87,149,226,15,1,-193,9,66,1,137,211,64,121,67,31,87,31,64,185,160,77,0,124,67,5,-225,71,3,133,3,192,235,64,59,0,90,96,103,2,73,94,35,173,239,64,-89,196,187,65,197,65,151,234,183,1,67,183,2,45,94,50,183,1,225,99,-1,65,253,69,3,74,241,131,231,4,57,94,65,124,53,186,73,144,61,193,-85,122,137,0,124,128,185,152,129,225,127,1,130,69,128,43,0,82,230,69,-0,0,57,248,247,0,0,85,162,189,64,55,226,17,2,0,124,234,167,1,-137,217,66,241,64,85,64,63,198,85,131,39,139,103,224,141,1,135,9,129,-105,71,253,221,193,128,103,194,75,228,189,1,0,66,64,213,250,119,2,139,-73,222,93,64,211,106,113,121,247,64,29,66,35,64,133,224,75,1,66,131,-101,83,0,124,77,21,136,129,2,84,94,40,115,207,2,67,94,59,104,197,-0,76,167,125,10,89,94,50,124,101,94,48,124,110,94,39,184,189,66,205,-1,65,124,66,253,1,84,124,90,207,0,96,163,173,64,49,0,72,99,9,-0,79,122,149,64,215,69,201,65,77,0,95,98,193,100,53,5,124,70,94,-50,124,53,66,157,97,83,85,25,197,9,64,147,0,77,98,61,0,68,123,-217,64,211,154,169,133,153,154,61,197,3,129,61,250,143,1,157,223,131,139,-65,103,221,25,76,43,67,21,193,213,103,63,166,131,64,145,65,73,0,67,-104,75,2,66,94,49,98,131,147,121,129,35,0,65,96,143,195,47,0,86,-105,165,2,57,124,100,188,27,136,7,71,9,66,17,135,13,0,76,121,99,-77,145,64,119,79,243,65,49,65,125,66,131,4,50,124,47,124,117,97,117,-98,3,81,147,0,124,64,141,65,255,64,65,4,50,124,69,124,102,96,73,-158,107,64,5,64,73,73,95,70,139,65,171,0,50,69,11,168,149,64,13,-64,87,65,143,154,123,74,207,0,82,105,221,76,79,64,225,66,15,138,169,-194,69,128,57,158,163,65,37,3,45,94,94,124,68,103,2,65,124,111,190,-177,64,245,4,67,124,51,94,61,97,227,65,207,64,49,0,86,142,45,4,-124,115,94,61,124,75,85,2,65,124,117,129,89,212,241,0,124,79,33,197,-153,75,5,68,55,2,71,94,45,101,25,137,195,0,35,114,43,3,67,94,-35,124,75,157,86,5,0,65,107,39,4,35,94,61,124,121,167,41,68,143,-160,7,1,124,86,178,113,0,88,86,35,96,191,76,59,76,47,64,7,138,-139,0,81,160,13,64,21,234,179,1,190,135,224,13,0,152,89,88,187,152,-111,234,203,1,74,221,224,63,1,64,37,128,43,128,45,203,9,224,29,7,-80,163,64,93,137,191,192,33,224,157,3,224,7,23,0,91,176,183,10,88,-94,32,94,58,94,88,94,33,94,58,117,251,224,15,55,177,15,1,124,49,-67,55,86,237,1,124,54,101,119,1,61,124,66,143,67,231,1,35,94,87,-119,129,147,67,41,66,87,67,67,72,99,2,35,94,72,106,1,0,73,113,-43,0,83,117,187,68,167,2,33,94,65,100,49,133,51,0,80,162,19,221,-195,64,5,172,157,4,124,61,94,49,124,65,15,2,35,124,111,108,249,202,-227,73,215,153,75,195,209,75,27,84,29,131,201,2,35,94,80,254,83,0,-132,15,66,191,2,59,94,67,96,143,68,67,0,49,224,25,0,85,65,192,-53,68,247,228,35,1,2,67,124,95,229,141,0,137,55,237,209,3,1,65,-124,136,239,108,67,64,147,67,127,3,124,33,94,32,93,33,96,163,64,99,-228,115,4,1,94,70,96,151,0,58,114,5,75,215,0,59,74,221,99,25,-78,5,148,227,1,65,124,77,217,128,111,135,175,128,117,195,165,195,119,192,-145,134,213,64,5,129,7,224,3,1,131,217,224,61,7,224,3,9,224,31,-1,128,83,224,241,3,224,101,1,128,117,0,80,238,189,0,64,13,129,1,-0,80,85,145,171,243,0,66,68,69,121,65,68,57,0,99,182,165,0,78,-175,35,128,7,96,5,1,124,36,165,75,0,76,96,243,4,32,94,61,124,-55,108,251,102,51,192,65,121,197,144,183,0,61,100,159,87,253,0,65,118,-239,2,65,124,122,98,115,4,60,94,69,124,87,160,45,70,113,66,33,175,-49,1,124,118,160,135,86,95,65,35,0,75,160,39,65,105,224,13,0,1,-124,55,118,115,64,225,147,149,90,101,64,15,68,95,64,181,224,53,1,0,-61,107,77,1,66,124,90,165,64,215,66,251,64,33,207,161,64,65,66,183,-64,81,64,181,192,247,90,167,136,49,128,23,2,65,94,82,97,3,0,91,-165,37,0,72,161,193,4,66,124,77,124,93,96,9,66,121,2,50,124,32,-97,19,193,223,0,65,101,91,161,201,2,124,44,92,96,35,166,13,0,58,-80,27,229,215,0,2,68,124,107,96,7,0,83,114,161,0,68,135,33,1,-124,97,96,41,0,38,104,99,129,197,64,97,96,111,5,124,43,124,56,124,-80,108,229,74,233,2,95,94,45,96,93,69,199,4,35,94,67,124,124,109,-171,0,47,68,3,1,124,123,96,9,64,131,224,15,2,31,34,32,58,50,-52,50,32,64,10,65,32,95,54,32,95,49,52,54,32,64,95,54,32,89,-32,66,32,66,32,83,32,85,64,18,5,55,32,64,64,64,64,64,16,1,-90,32,224,7,1,12,83,39,32,83,32,64,66,32,67,39,32,83,39,64,-8,14,83,32,64,95,49,50,55,32,95,53,49,32,64,35,49,160,52,0,-67,64,23,224,38,0,9,66,32,64,64,67,32,67,32,95,52,64,108,12,-53,54,32,64,64,95,49,53,55,32,95,49,57,64,120,7,51,50,50,32,-35,49,50,56,96,59,128,53,64,110,10,95,49,48,54,32,64,67,32,95,-56,48,160,41,224,53,19,3,85,32,35,48,224,64,0,31,66,32,80,32,-95,51,50,48,32,102,114,111,109,85,84,70,56,32,34,92,34,108,105,98,-47,68,97,116,97,47,67,104,21,97,114,47,85,110,105,99,111,100,101,46,-104,115,92,34,44,50,48,50,58,56,34,128,62,64,225,96,228,96,71,128,-13,64,133,224,187,28,128,185,2,64,67,39,64,249,7,95,49,55,52,32,-95,55,53,64,27,160,210,64,202,96,16,64,80,192,11,192,63,3,95,49,-57,56,64,184,4,50,51,52,32,64,160,55,224,28,0,129,76,64,70,96,-151,2,95,50,51,64,31,96,8,0,56,225,37,0,160,78,128,140,225,17,-2,64,71,64,11,2,95,50,52,64,6,3,58,50,52,49,129,252,2,50,-51,57,66,10,0,48,96,13,9,98,115,117,110,112,97,99,107,32,58,64,-22,64,17,64,110,2,95,50,51,64,232,5,50,51,55,32,64,58,96,108,-5,10,65,32,66,32,89,65,247,65,160,0,58,96,25,64,44,65,41,0,-67,129,44,65,32,0,54,64,106,96,118,97,142,130,81,129,220,128,57,128,-189,129,227,225,42,1,192,190,0,64,128,49,0,58,96,33,96,139,64,115,-64,61,0,80,128,6,160,68,64,33,0,53,128,205,1,49,48,129,63,64,-23,2,95,50,50,96,241,6,49,57,53,32,95,50,50,64,84,192,11,0,-50,97,9,1,50,52,161,105,64,11,64,23,192,11,0,55,224,11,1,1,-51,51,224,11,0,0,54,64,87,65,151,1,50,48,64,165,0,58,96,22,-1,10,65,162,222,99,7,129,245,66,57,129,8,64,2,64,160,162,81,226,-87,0,66,13,225,201,1,192,37,64,16,128,52,64,77,96,5,99,88,97,-37,66,3,4,66,32,85,32,65,161,53,1,50,57,128,15,0,75,128,166,-225,231,0,0,67,64,175,97,64,64,145,1,95,54,64,10,224,19,1,7,-64,64,83,32,73,32,64,75,65,0,162,145,224,134,0,1,83,39,65,87,-194,102,99,226,129,149,66,72,64,102,96,181,98,250,224,121,0,224,137,16,-163,22,160,149,128,80,130,162,96,16,224,63,24,0,64,128,233,96,17,0,-50,98,3,0,51,97,108,64,38,2,75,52,32,128,192,0,58,96,27,224,-21,2,160,20,130,218,2,85,32,90,96,1,0,75,64,193,96,23,130,228,-96,105,0,58,96,118,224,37,11,65,104,129,213,128,2,97,19,3,95,49,-48,55,98,81,98,238,65,147,128,72,0,50,224,57,0,0,58,96,27,130,-165,161,208,6,95,50,50,51,32,64,65,96,49,130,159,224,27,7,128,136,-130,70,96,77,224,196,1,64,30,8,10,65,32,117,114,101,109,32,58,98,-177,64,13,3,113,117,111,116,64,14,195,188,1,48,55,101,104,65,168,66,-181,1,49,53,131,227,5,48,56,32,95,50,49,97,73,229,61,22,129,108,-3,95,51,52,51,229,41,2,19,87,111,114,100,56,46,115,117,99,99,58,-32,111,118,101,114,102,108,111,119,133,27,224,108,11,1,49,49,224,108,3,-99,198,224,109,42,8,112,114,101,100,58,32,117,110,100,224,110,3,102,154,-0,57,67,115,100,235,64,14,1,54,51,227,129,0,66,214,1,49,50,66,-65,224,245,8,131,103,128,5,64,148,1,52,50,197,186,162,139,2,95,50,-49,67,217,160,57,224,194,2,224,31,12,224,89,2,64,25,0,52,67,67,-160,123,1,49,57,98,31,224,20,1,64,54,128,20,0,58,96,62,225,167,-6,1,54,56,96,191,96,80,134,23,161,160,0,55,64,157,129,34,225,32,-10,225,141,19,128,82,128,195,192,82,129,134,224,83,22,225,115,13,65,106,-97,102,97,95,101,72,224,174,2,225,89,7,0,53,97,137,193,51,99,36,-224,137,2,224,25,1,224,246,7,64,19,0,54,192,72,227,108,0,128,187,-96,83,128,77,160,58,1,64,58,97,83,131,151,165,98,135,154,160,133,100,-15,0,83,96,26,101,56,101,68,68,173,134,33,131,120,0,89,160,170,224,-66,0,64,13,168,157,136,247,128,7,96,81,99,213,1,95,54,96,6,128,-28,192,76,64,32,136,208,1,95,54,128,203,3,64,67,32,79,99,205,128,-11,160,53,160,252,64,177,224,165,2,224,42,1,167,16,0,58,96,225,224,-218,17,96,75,224,218,68,97,44,224,218,70,64,22,224,218,11,168,25,192,-46,106,44,64,44,128,179,224,125,5,229,30,1,134,154,129,1,66,222,64,-91,73,85,128,150,164,72,234,162,0,232,40,0,66,81,131,111,0,57,104,-250,2,95,55,48,137,2,0,58,98,117,5,10,65,32,75,32,95,136,198,-0,49,229,117,5,102,108,0,58,67,189,229,139,10,0,49,230,101,1,64,-13,229,124,0,0,57,132,157,137,88,96,9,0,50,98,186,0,58,100,43,-5,10,65,32,80,32,58,64,37,128,60,102,8,0,48,201,61,224,1,3,-103,253,64,0,224,20,11,224,17,8,224,14,5,224,11,2,192,8,102,177,-96,184,70,180,137,22,0,57,105,128,101,138,170,194,0,54,75,31,69,76,-232,215,6,64,54,129,70,0,73,64,189,129,54,0,83,98,156,65,128,129,-163,162,134,161,157,138,101,128,33,65,181,224,22,4,64,149,1,95,49,68,-19,235,142,16,10,73,110,116,101,103,101,114,95,84,121,112,171,142,3,53,-52,58,49,171,141,128,63,1,57,57,64,165,134,100,1,39,66,66,103,226,-151,3,105,41,224,34,1,224,26,3,224,23,2,194,47,2,95,50,48,106,-12,2,50,48,51,97,146,130,9,66,197,1,54,50,65,15,74,22,1,48,-50,162,102,0,58,96,37,109,38,0,54,102,193,1,95,55,104,143,64,32,-128,53,1,54,57,224,20,1,130,26,0,75,65,56,226,1,0,64,128,97,-67,170,39,137,65,168,223,96,184,96,14,130,107,76,0,226,151,9,96,34,-64,131,1,52,49,64,47,0,53,163,157,160,10,106,157,96,10,2,49,55,-51,96,11,0,55,64,11,103,131,0,73,97,179,231,179,7,231,152,7,166,-217,231,175,13,224,45,14,96,185,108,166,64,115,0,58,96,31,162,217,128,-24,64,19,130,61,96,243,140,163,1,49,53,99,52,64,50,195,44,96,44,-98,165,0,54,71,7,74,177,161,137,0,49,103,236,0,49,64,224,67,201,-64,10,0,56,192,61,2,95,49,55,97,11,96,73,96,27,1,55,50,130,-227,96,51,102,249,64,7,224,110,0,2,95,49,56,224,48,0,3,95,49,-56,51,224,11,2,0,54,224,56,8,132,134,162,203,77,247,236,202,1,224,-27,5,104,89,96,28,1,95,55,135,103,0,54,103,115,96,41,2,95,49,-56,102,194,64,18,224,81,51,72,77,224,81,6,66,115,1,49,56,224,220,-2,0,57,105,228,160,11,0,49,66,254,4,95,49,57,50,32,160,67,0,-75,160,8,64,21,75,51,65,117,130,214,3,90,32,85,32,64,13,130,206,-7,112,111,112,99,111,117,110,116,66,181,130,203,99,239,0,66,96,109,71,-194,1,54,49,173,164,0,58,64,113,129,182,3,56,56,32,58,64,139,226,-183,3,139,84,224,1,9,171,102,224,0,2,0,58,96,88,64,72,232,161,-5,9,97,114,105,116,104,109,101,116,105,99,232,245,4,0,58,97,1,231,-45,0,68,239,103,27,228,148,1,192,5,3,95,49,56,52,160,7,0,53,-227,96,0,164,63,198,91,66,142,134,215,1,49,55,143,100,236,226,0,131,-160,226,241,3,128,66,0,58,66,47,128,234,224,228,15,224,1,3,224,240,-9,64,0,0,58,96,147,230,22,0,96,169,192,211,129,108,98,255,64,147,-0,58,66,171,161,90,0,51,224,108,42,0,58,96,75,224,92,4,64,244,-132,141,1,95,49,77,145,160,252,0,58,67,33,160,105,225,193,17,224,103,-14,0,58,96,73,224,102,4,0,55,74,13,160,195,0,55,226,30,0,0,-52,224,92,15,224,84,7,0,58,96,58,237,103,1,224,1,21,225,103,12,-0,58,96,131,197,56,69,51,101,45,133,39,165,38,99,240,229,38,7,111,-54,97,246,101,4,135,225,64,52,0,58,96,47,103,17,143,27,98,68,64,-232,226,40,1,0,58,64,88,160,184,238,31,1,96,45,5,10,65,32,42,-32,58,96,126,129,42,1,95,49,68,28,130,89,226,122,12,99,190,0,58,-68,220,160,49,176,66,130,195,228,75,9,234,59,2,102,209,70,32,224,29,-2,1,95,49,100,77,137,106,129,165,66,0,227,214,0,64,106,226,4,0,-137,3,224,2,2,225,85,0,239,73,1,224,30,3,225,133,3,0,58,96,-104,224,178,62,234,29,1,96,178,0,54,65,111,224,178,3,72,109,195,33,-224,141,2,226,23,6,0,58,96,56,224,183,7,226,66,14,0,58,96,117,-226,178,0,134,227,66,65,7,10,65,32,120,111,114,32,58,102,150,2,10,-65,32,128,11,129,208,2,97,110,100,64,12,181,87,1,52,56,173,155,2,-49,52,57,66,57,66,84,233,251,8,224,1,21,234,25,0,224,0,6,224,-57,25,192,1,224,65,14,224,56,25,128,1,224,62,13,224,55,25,64,1,-224,59,12,224,54,25,224,56,13,224,53,44,224,50,41,224,47,38,224,44,-35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,26,17,224,-23,14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,204,188,224,0,-6,0,58,74,28,229,83,1,224,1,23,227,202,4,224,68,2,70,249,140,-217,106,144,228,11,1,171,103,69,125,99,186,203,43,1,95,49,67,197,0,-49,88,218,224,11,0,118,61,160,11,137,112,128,11,139,135,128,11,107,158,-0,53,96,10,109,109,106,246,96,10,0,58,96,6,5,10,65,32,117,62,-61,64,134,132,82,1,117,62,64,11,132,81,1,117,60,96,24,132,82,1,-117,60,64,11,179,254,2,99,109,112,64,13,174,128,96,105,196,100,192,121,-68,106,64,99,129,45,0,47,64,73,64,18,160,244,0,52,128,244,0,75,-64,10,206,27,1,52,53,64,13,128,147,1,98,115,151,254,64,20,160,29,-0,51,64,13,128,152,7,98,115,108,101,110,103,116,104,64,17,232,147,0,-101,30,149,142,74,186,64,21,0,82,141,240,64,16,170,68,152,15,0,49,-88,84,88,207,79,129,0,49,184,115,129,107,85,155,1,95,49,120,246,0,-49,114,128,0,49,120,115,0,49,79,172,1,95,49,88,115,129,77,96,65,-129,77,96,10,0,58,96,6,225,77,0,184,156,97,77,184,148,129,77,184,-66,97,77,184,44,0,105,129,77,183,197,90,241,118,105,0,49,182,105,65,-35,182,94,112,159,1,58,49,182,87,129,119,86,38,1,95,49,86,68,0,-58,96,188,193,108,182,86,0,61,96,11,226,98,1,1,64,58,96,245,217,-56,111,71,145,206,1,95,49,82,217,0,90,64,82,171,226,79,149,64,6,-139,102,182,86,120,11,97,30,86,11,0,58,96,29,96,22,71,52,192,73,-3,48,54,32,35,75,183,153,152,0,35,108,14,227,116,2,224,32,2,143,-175,122,168,183,254,82,65,219,120,0,80,64,103,224,65,2,224,64,5,66,-13,64,0,96,58,163,88,182,196,139,145,128,163,128,244,129,76,105,88,92,-30,0,48,96,20,241,79,0,128,202,232,112,0,99,134,0,58,97,8,167,-40,164,18,0,58,97,36,194,112,96,36,179,52,0,66,80,87,137,134,81,-226,112,214,64,16,1,95,49,82,12,96,40,129,119,11,94,109,100,53,83,-116,114,105,110,103,32,58,96,27,186,221,2,66,32,95,97,86,82,16,85,-81,0,39,96,15,219,174,64,170,0,95,141,115,168,107,178,72,73,172,128,-55,0,51,73,176,1,90,32,224,31,0,129,9,4,110,101,119,67,65,128,-111,2,76,101,110,64,114,129,9,224,212,5,129,8,0,65,64,30,129,4,-129,148,2,115,101,113,142,15,96,8,101,19,1,58,49,242,83,1,81,206,-192,75,224,1,1,229,136,78,0,58,91,83,193,122,229,91,2,0,58,121,-18,3,10,65,32,79,64,144,129,79,2,95,56,57,83,97,98,97,192,7,-1,95,57,79,106,114,90,0,95,112,163,128,10,1,49,48,78,176,192,11,-87,158,192,11,107,154,81,148,0,58,96,18,65,186,3,112,111,107,101,86,-177,64,105,129,94,4,94,112,101,101,107,192,18,162,99,65,177,117,23,128,-118,99,154,177,166,241,78,6,177,167,192,49,152,173,160,48,226,123,1,0,-95,81,117,67,87,68,214,0,95,81,152,1,64,58,177,203,2,116,111,73,-79,36,177,172,6,116,111,80,116,114,32,58,177,164,244,60,5,177,22,245,-47,1,142,170,97,102,67,182,1,64,95,113,43,189,21,99,90,0,95,144,-131,3,73,32,64,58,177,64,229,102,5,177,47,237,104,0,79,187,65,179,-128,61,1,67,32,96,63,0,95,76,249,64,44,229,168,0,202,197,175,234,-0,95,80,49,75,235,0,35,77,160,175,237,154,95,175,217,226,51,1,226,-55,2,226,94,72,176,56,203,221,64,31,1,95,48,92,176,64,32,0,95,-79,38,163,149,224,20,0,163,154,0,56,89,126,101,42,131,159,120,118,132,-175,0,58,176,82,64,37,114,182,64,226,176,55,6,94,102,114,101,101,32,-58,175,196,140,157,224,91,5,0,95,78,119,0,95,79,11,140,115,96,33,-224,109,0,97,171,64,31,135,238,224,116,0,0,58,175,209,128,50,64,226,-64,165,133,85,96,244,0,39,92,228,224,48,0,0,73,160,255,224,247,3,-193,209,225,62,1,224,118,3,1,64,95,80,8,128,162,253,77,0,255,49,-6,101,95,176,76,205,13,64,154,226,4,0,0,50,133,61,176,18,0,89,-109,145,65,138,2,66,32,90,134,11,113,61,2,83,32,95,79,176,65,121,-98,80,224,104,8,128,103,197,183,228,21,1,0,58,176,4,68,183,0,58,-175,243,96,199,103,172,130,164,192,75,226,169,7,175,237,242,6,6,90,157,-4,102,105,110,101,100,113,252,175,206,253,180,7,175,147,111,229,99,172,72,-158,99,14,0,95,72,200,0,83,238,118,11,65,128,238,68,2,143,254,85,-206,211,126,143,244,192,33,128,249,240,18,1,0,95,79,206,0,58,175,232,-0,66,188,151,112,33,175,231,0,85,97,203,91,162,112,116,142,204,0,80,-96,7,97,114,225,113,0,112,151,64,120,97,11,99,226,128,212,129,180,2,-95,54,55,163,167,73,81,176,7,0,89,162,99,143,57,247,137,7,194,83,-249,51,0,0,57,192,191,65,5,214,217,161,2,0,55,185,34,97,210,175,-251,4,105,110,118,32,58,175,228,4,115,104,114,32,58,175,203,72,213,175,-107,0,97,128,23,129,143,4,115,104,108,32,58,175,47,2,43,32,58,175,-38,2,45,32,58,175,35,2,73,32,58,175,33,230,68,7,175,43,130,171,-100,158,175,37,106,22,74,233,0,95,74,252,0,95,75,13,0,95,75,31,-0,95,75,48,0,95,75,66,106,16,149,40,74,15,96,9,0,58,172,37,-131,180,98,189,131,193,96,37,0,55,131,118,69,88,172,8,224,29,1,224,-49,1,224,39,5,230,251,0,195,75,172,34,74,110,171,200,2,62,32,58,-171,197,74,106,171,196,2,60,32,58,171,193,138,103,171,194,106,60,75,144,-0,95,75,161,0,58,171,202,74,57,171,177,65,98,171,176,2,80,32,58,-171,175,196,14,164,73,194,34,224,20,11,224,17,8,224,14,5,224,11,2,-192,8,229,137,0,172,17,179,110,163,208,172,24,4,110,101,103,32,58,172,-20,2,42,32,58,172,16,2,45,32,58,172,8,2,43,32,58,171,252,224,-148,68,0,58,172,64,199,83,64,17,225,225,0,73,127,68,90,66,26,75,-223,64,12,66,28,69,237,1,64,58,172,23,91,238,0,58,172,22,2,73,-32,58,172,20,64,54,66,76,76,10,0,58,172,27,64,29,128,224,64,9,-168,102,7,109,97,108,108,111,99,32,58,172,20,13,73,79,46,112,101,114,-102,111,114,109,73,79,32,58,172,30,224,179,2,0,58,172,35,2,85,32,-58,172,20,224,219,14,0,58,172,39,64,19,0,95,75,226,1,64,95,109,-21,236,50,2,103,237,0,58,172,53,6,114,97,105,115,101,32,58,172,12,-7,65,46,114,101,97,100,32,58,172,4,13,73,79,46,103,101,116,65,114,-103,82,101,102,32,58,171,138,0,95,127,133,69,1,91,218,99,67,64,95,-224,199,0,3,62,62,32,58,171,136,0,95,105,126,128,33,1,95,49,231,-86,0,1,49,55,128,65,88,81,192,9,0,50,71,41,64,9,0,58,171,-181,186,213,73,119,64,52,119,110,64,69,108,188,171,200,214,107,0,51,121,-6,224,32,1,0,95,150,117,161,168,0,55,88,69,224,47,12,107,103,96,-155,143,64,129,18,78,207,129,14,70,14,130,28,171,156,183,85,231,7,0,-0,50,211,192,128,253,233,57,0,69,139,224,11,2,96,197,101,26,0,58,-253,242,1,0,50,172,148,164,150,0,51,97,196,108,34,130,110,73,193,129,-62,74,61,96,36,64,180,101,204,128,226,0,58,128,224,2,75,32,58,225,-220,1,1,64,58,194,136,0,58,162,125,9,79,46,114,101,116,117,114,110,-32,58,225,212,0,0,62,68,100,128,196,2,80,32,58,128,187,227,74,47,-0,58,227,157,3,226,142,9,237,130,1,130,118,64,200,2,95,50,51,112,-247,224,0,255,224,0,255,224,0,255,224,0,255,224,0,255,224,0,255,224,-0,255,224,0,255,224,0,229,1,32,125,-};-unsigned char *combexpr = data;-int combexprlen = 127791;-#include "mhsffi.h"-static struct ffi_entry table[] = {-{ 0,0 }-};-struct ffi_entry *xffi_table = table;+#include "mhsffi.h"+static const unsigned char data[] = {+122,76,90,49,29,99,2,0,26,118,56,46,51,10,50,55,49,57,10,65,+32,95,48,32,95,50,51,32,64,95,51,52,57,32,64,66,224,15,2,6,+54,49,32,64,64,66,32,224,18,3,12,53,51,32,64,64,64,67,32,83,+39,32,67,39,64,45,64,5,0,67,128,12,6,83,32,64,83,39,32,66,+64,21,0,83,192,20,1,83,39,160,66,1,83,32,64,54,18,95,49,50,+55,32,64,102,114,111,109,85,84,70,56,32,34,45,104,34,64,79,10,64,+67,39,66,32,85,32,95,52,48,50,64,4,96,99,1,75,50,96,25,224,+81,40,0,63,224,81,72,4,45,104,101,108,112,224,85,11,0,55,224,85,+52,6,118,101,114,115,105,111,110,224,88,9,3,49,49,55,32,224,40,1,+8,77,105,99,114,111,72,115,44,32,160,47,0,32,64,48,96,35,4,95,+52,49,53,32,128,10,224,46,1,16,44,32,99,111,109,98,105,110,97,116,+111,114,32,102,105,108,101,224,55,5,2,52,49,54,96,111,224,183,0,128,+169,64,126,64,173,1,67,32,224,170,12,6,110,117,109,101,114,105,99,224,+178,5,2,66,32,80,193,9,64,135,224,81,0,96,0,64,248,64,250,130,+39,5,83,39,32,95,56,49,130,67,65,41,1,95,52,64,190,0,50,66,+94,0,67,64,12,3,57,32,64,35,130,107,96,80,64,7,224,213,5,6,+102,108,97,103,115,32,61,96,195,9,64,95,49,52,54,32,95,52,50,52,+192,110,161,112,225,111,0,2,95,52,50,96,144,96,13,0,39,226,189,0,+128,121,1,50,54,160,13,4,95,52,56,52,32,64,5,96,43,128,68,97,+194,0,66,130,210,0,83,224,82,5,0,56,97,56,224,23,10,98,5,64,+58,0,66,66,2,10,95,52,56,57,32,64,85,32,75,32,65,128,158,1,+67,32,99,45,0,64,97,11,2,95,52,54,65,178,2,52,57,48,65,104,+4,67,32,95,55,55,67,86,1,49,53,64,203,0,75,96,220,2,50,53,+55,97,71,128,212,0,80,65,34,18,39,66,32,95,50,54,54,55,32,64,+95,56,51,49,32,95,53,52,51,225,27,2,11,99,111,109,109,97,110,100,+45,108,105,110,101,65,31,2,35,48,32,96,3,129,145,2,95,52,55,66,+41,131,1,128,143,3,95,50,54,55,129,59,64,99,5,32,64,95,50,54,+56,128,47,3,95,56,54,56,64,30,1,56,49,64,148,1,51,57,128,51,+3,95,50,54,57,65,157,1,85,32,129,225,64,220,96,171,224,65,0,128,+171,2,95,50,55,98,93,195,10,192,77,1,57,57,224,77,0,64,34,65,+47,129,174,224,60,1,100,57,162,40,1,49,51,96,140,226,140,4,224,104,+0,64,30,65,175,5,79,32,35,52,54,32,129,50,64,92,4,50,32,95,+50,48,97,161,161,76,3,67,39,32,79,96,132,3,50,53,57,51,224,8,+2,160,6,161,109,192,45,224,68,7,11,64,64,58,50,55,49,56,32,64,+10,65,32,65,167,224,1,29,0,83,64,100,2,55,48,32,65,125,2,95,+49,50,64,240,162,201,1,79,32,224,176,2,96,121,96,233,65,11,96,58,+192,246,160,239,224,139,4,224,234,3,2,95,55,55,64,253,160,181,0,79,+65,216,0,52,64,4,4,54,32,73,32,64,227,178,2,5,108,105,98,47,+103,109,132,180,96,56,129,14,64,94,64,115,224,40,1,3,47,108,105,98,+224,37,1,224,66,3,3,111,117,116,46,68,74,163,114,96,205,224,6,28,+96,154,224,6,7,224,34,5,0,52,65,225,224,6,0,224,34,5,96,13,+224,134,1,6,100,101,102,97,117,108,116,160,133,224,77,9,65,167,0,55,+97,167,2,66,32,89,230,128,2,195,58,65,91,4,67,32,64,64,80,227,+102,0,192,20,224,26,0,97,140,197,7,96,5,129,11,164,195,229,216,2,+67,177,229,28,8,133,13,224,70,55,0,118,224,70,61,0,113,224,70,61,+0,114,224,70,61,0,108,224,70,61,0,115,224,70,61,0,99,224,70,61,+1,67,82,224,71,62,0,87,224,71,62,224,70,61,0,84,224,70,61,3,+88,67,80,80,224,73,61,0,122,224,70,61,2,98,54,52,224,72,61,0,+81,224,70,4,196,101,160,2,96,26,64,69,104,8,96,94,104,220,224,71,+10,0,111,224,71,0,64,41,0,82,137,119,231,61,1,231,53,0,0,50,+231,131,3,224,114,54,1,112,116,226,252,1,224,117,12,128,94,224,123,0,+104,148,96,123,128,92,134,54,136,183,1,64,67,70,74,200,0,224,153,57,+228,36,1,224,153,27,73,178,224,153,10,0,55,73,87,224,153,24,74,228,+128,102,128,12,96,169,224,26,1,224,24,1,226,19,0,224,10,1,130,49,+130,31,96,198,135,159,1,35,52,138,62,224,38,0,224,254,2,96,77,106,+84,160,249,160,50,1,49,48,192,51,198,135,192,125,75,83,96,60,160,253,+0,67,233,68,1,107,234,137,68,200,179,235,112,1,224,195,83,192,160,224,+195,15,128,49,225,181,21,224,188,1,225,181,4,0,56,137,170,225,181,5,+224,206,109,0,49,74,225,224,206,16,227,148,14,224,170,110,205,194,224,170,+21,0,54,224,170,13,227,9,7,224,168,0,224,13,0,224,171,24,224,41,+1,160,57,224,16,0,2,66,32,90,224,16,5,235,182,1,224,71,1,1,+54,56,224,71,1,226,50,17,66,31,227,232,12,226,50,12,128,213,128,185,+224,219,115,77,206,192,71,224,219,69,226,90,91,174,6,128,36,226,89,8,+110,135,192,194,0,56,228,142,2,0,52,195,59,224,171,77,229,68,13,65,+68,96,0,229,67,34,238,136,2,229,67,8,225,101,97,224,185,0,128,48,+225,101,6,226,42,6,224,178,1,231,137,5,111,193,226,42,114,0,55,228,+132,20,226,42,2,1,55,48,111,13,226,42,93,229,49,15,193,228,224,172,+12,225,113,5,240,251,2,225,113,5,114,39,225,113,8,160,183,224,119,12,+224,170,6,0,83,130,152,224,50,20,0,49,65,45,224,51,91,113,134,224,+103,39,198,76,224,103,35,225,122,3,224,51,29,225,225,7,165,102,83,45,+80,237,241,27,3,0,89,99,237,65,143,193,171,1,48,56,112,4,0,80,+66,57,4,95,52,57,53,32,116,88,212,50,98,125,81,42,114,214,1,55,+52,98,159,65,240,2,50,55,51,96,11,64,173,64,7,224,12,0,160,0,+96,136,226,56,20,0,55,83,98,162,56,64,43,128,138,3,64,95,49,48,+128,170,224,0,20,236,151,27,193,4,65,41,235,66,3,4,45,115,116,100,+105,181,147,224,53,7,0,83,67,29,64,14,70,186,225,74,1,225,109,10,+65,45,1,55,55,97,53,245,122,5,7,85,110,107,110,111,119,110,32,85,+130,1,58,32,96,102,64,64,99,19,146,218,2,35,49,48,131,19,244,102,+3,128,83,128,206,67,161,160,147,67,210,82,250,0,50,86,50,84,138,0,+53,75,209,224,109,1,0,46,140,167,224,34,20,141,64,224,25,11,0,97,+225,5,0,130,14,132,135,179,102,227,184,2,229,112,19,236,250,35,230,99,+9,66,161,228,237,1,0,49,180,91,224,43,15,235,211,3,192,43,224,39,+11,233,202,1,224,39,21,232,87,1,224,39,21,231,188,3,224,39,19,231,+47,3,224,39,9,87,212,128,40,66,0,193,52,224,20,1,229,72,1,160,+61,224,108,20,224,46,9,224,39,14,230,78,3,224,39,19,0,50,224,39,+30,225,240,1,224,39,19,1,53,55,224,159,31,226,0,11,224,39,11,225,+252,2,4,54,52,32,95,55,97,148,89,37,128,9,1,53,57,132,186,128,+0,224,64,0,0,83,224,64,11,97,138,0,51,128,57,89,227,0,56,185,+79,128,57,132,185,101,119,246,228,5,85,59,0,54,117,59,6,95,56,54,+57,32,75,32,87,217,132,62,224,1,31,164,169,224,0,9,224,58,25,224,+1,1,224,68,15,224,57,25,192,1,224,65,14,224,56,25,128,1,224,62,+13,224,55,25,64,1,224,59,12,224,54,25,224,56,13,224,53,44,224,50,+41,224,47,38,224,44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,+29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,+192,8,96,5,102,193,0,55,201,187,224,0,13,67,162,0,53,227,162,5,+0,90,224,152,4,224,1,25,226,49,10,128,0,224,58,25,224,1,1,224,+68,15,224,57,25,192,1,224,65,14,224,56,25,128,1,224,62,13,224,55,+25,64,1,224,59,12,224,54,25,224,56,13,224,53,44,224,50,41,224,47,+38,224,44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,+26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,96,+5,227,160,24,67,159,0,52,227,159,5,224,106,1,242,47,6,224,1,29,+226,61,10,128,0,224,58,25,224,1,1,224,68,15,224,57,25,192,1,224,+65,14,224,56,25,128,1,224,62,13,224,55,25,64,1,224,59,12,224,54,+25,224,56,13,224,53,44,224,50,41,224,47,38,224,44,35,224,41,32,224,+38,29,224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,+227,119,19,67,114,0,51,227,114,15,224,1,27,163,150,224,0,9,224,117,+1,64,99,0,50,224,99,19,224,67,0,224,98,13,224,1,15,227,85,14,+224,70,37,224,68,15,224,57,25,192,1,224,65,14,224,56,25,128,1,224,+62,13,224,55,25,64,1,224,59,12,224,54,25,224,56,13,224,53,44,224,+50,41,224,47,38,224,44,35,224,41,32,224,38,29,224,35,26,224,32,23,+224,29,20,224,26,17,227,177,17,67,75,0,49,227,75,17,195,73,224,90,+7,224,1,21,227,72,255,224,58,42,227,72,255,224,38,20,224,35,26,224,+32,23,224,29,20,224,26,17,224,23,14,231,17,18,67,96,0,48,231,16,+21,230,242,1,224,25,7,224,1,21,227,33,15,224,70,36,224,68,15,224,+57,25,192,1,224,65,14,224,56,25,128,1,224,62,13,224,55,25,64,1,+224,59,12,224,54,25,224,56,13,224,53,44,224,50,41,224,47,38,224,44,+35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,227,53,16,0,+58,150,221,234,68,21,234,40,2,224,28,9,224,1,19,227,54,255,224,58,+42,227,54,255,224,38,20,224,35,26,224,32,23,227,25,15,67,24,0,56,+237,93,31,237,73,6,224,40,17,224,1,11,227,36,255,224,58,42,227,36,+205,226,146,11,66,142,0,55,239,236,33,239,218,7,224,43,19,224,1,9,+226,145,255,224,58,42,226,145,161,226,101,10,66,100,0,54,242,81,41,242,+71,11,224,53,25,224,1,3,226,112,255,224,0,6,225,162,6,65,158,251,+3,6,224,88,25,224,1,1,243,238,15,224,57,25,224,1,3,225,170,16,+224,172,2,64,168,248,12,16,224,1,23,224,166,14,224,56,25,224,1,3,+226,80,84,225,150,3,64,234,181,132,6,50,55,49,32,95,49,48,72,53,+64,6,1,53,32,96,28,181,61,7,49,54,50,32,95,50,57,52,64,38,+2,48,49,32,64,68,1,57,54,224,12,0,14,67,32,83,32,95,49,50,+55,32,95,53,52,32,64,35,64,92,224,18,6,224,37,10,0,50,224,18,+9,0,51,224,18,9,0,52,224,18,9,0,53,224,18,9,0,54,224,18,+9,0,55,96,18,0,67,224,18,3,0,56,64,183,31,51,52,55,32,102,+114,111,109,85,84,70,56,32,34,92,34,115,114,99,47,77,105,99,114,111,+72,115,47,70,108,97,103,17,115,46,104,115,92,34,44,55,50,58,50,51,+58,32,34,32,64,64,224,45,1,19,116,111,69,110,117,109,58,32,111,117,+116,32,111,102,32,114,97,110,103,101,64,33,0,64,193,49,129,92,64,179,+96,8,0,57,192,8,64,159,4,64,95,49,52,51,97,119,3,95,49,55,+51,128,17,1,50,52,76,189,96,62,86,167,128,71,64,166,5,85,32,83,+32,83,39,64,2,3,64,67,32,60,161,7,224,18,6,160,244,224,18,3,+160,244,224,18,3,128,77,96,6,64,7,64,33,96,8,96,128,224,44,7,+64,194,1,85,32,96,6,64,7,96,200,224,119,8,129,184,224,55,4,65,+184,1,85,32,96,6,64,7,96,202,224,35,7,66,2,1,85,32,96,6,+64,7,194,129,95,61,0,55,226,87,2,161,72,64,113,0,32,160,5,0,+66,64,72,6,95,50,49,54,32,95,54,64,98,3,95,50,57,51,224,48,+0,224,13,6,1,67,39,66,247,3,95,50,55,53,224,82,4,96,254,224,+27,14,129,183,0,51,66,38,192,21,2,51,50,56,224,12,0,67,5,244,+247,18,224,1,11,228,3,9,224,49,23,224,1,5,230,79,255,224,58,42,+224,56,11,224,53,44,232,95,8,66,7,243,158,22,224,1,9,230,13,10,+224,52,25,224,1,3,226,10,255,224,58,42,224,56,11,225,213,7,3,58,+50,54,57,242,63,24,224,1,3,225,208,8,224,46,21,224,1,7,225,206,+255,224,58,42,227,217,64,224,50,41,236,107,9,66,55,241,94,26,226,45,+3,224,31,11,224,1,17,226,40,255,224,58,42,226,40,114,224,47,38,224,+44,35,224,41,32,224,38,29,224,35,26,244,90,14,66,250,241,202,34,224,+1,3,237,27,13,224,55,25,224,1,3,227,24,149,225,51,4,65,41,0,+54,225,41,9,65,5,224,94,23,224,1,5,228,12,255,224,58,42,228,12,+255,224,38,20,224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,+20,11,224,17,8,224,14,5,224,11,2,252,45,16,128,0,67,150,242,135,+30,228,176,5,224,37,15,224,1,13,226,121,11,96,0,224,58,25,224,1,+1,224,68,15,224,57,25,192,1,224,65,14,224,56,25,128,1,224,62,13,+224,55,25,64,1,224,59,12,224,54,25,224,56,13,224,53,44,224,50,41,+224,47,38,224,44,35,224,41,32,226,191,12,66,181,244,148,28,226,179,4,+224,34,13,224,1,15,226,178,255,224,58,42,226,178,246,224,38,29,229,152,+13,66,217,182,131,226,217,5,98,201,224,89,15,224,1,13,226,193,255,224,+58,42,226,193,255,224,38,20,224,35,26,224,32,23,224,29,20,224,26,17,+224,23,14,224,20,11,224,17,8,224,14,5,233,30,21,67,141,153,244,0,+83,119,46,0,66,249,86,0,1,49,51,90,3,93,97,1,64,75,64,62,+64,31,6,39,32,95,48,32,95,50,119,248,3,95,52,56,52,215,172,192,+20,2,95,55,56,88,113,0,66,64,76,2,95,56,49,160,21,3,66,32,+95,52,90,89,4,66,32,95,49,49,249,142,3,3,110,97,109,101,153,116,+64,27,2,56,54,53,87,174,1,52,55,119,161,224,69,33,6,118,101,114,+115,105,111,110,224,72,1,2,52,49,49,64,72,1,54,55,96,167,224,72,+33,13,99,111,109,112,105,108,101,114,58,32,109,104,115,45,96,77,2,95,+57,53,121,177,224,67,32,6,100,101,112,101,110,100,115,224,140,1,2,55,+52,51,128,38,6,57,51,32,85,32,67,39,65,152,96,51,0,64,128,240,+192,66,5,79,32,35,52,53,32,129,106,128,193,64,0,65,14,153,186,224,+130,33,9,108,105,110,107,101,114,32,111,112,116,224,134,7,2,95,55,54,+160,76,97,182,65,115,160,77,96,74,224,66,1,15,101,120,112,111,115,101,+100,45,109,111,100,117,108,101,115,58,154,245,121,159,224,130,3,64,70,2,+32,95,51,124,44,130,19,0,57,72,180,98,128,224,90,15,4,111,116,104,+101,114,224,88,7,224,71,10,226,4,38,0,32,224,233,0,130,70,0,56,+193,54,224,179,8,161,130,1,52,49,90,0,156,168,3,95,52,49,57,188,+200,66,55,0,56,90,62,224,38,17,186,134,1,54,56,130,25,224,0,0,+4,95,50,54,57,48,93,70,1,54,57,154,64,4,66,32,95,51,53,193,+5,224,221,0,226,4,0,224,212,8,92,189,66,24,4,79,32,35,53,56,+162,10,90,157,192,57,192,39,224,250,13,160,132,99,62,64,131,152,188,225,+136,17,22,32,32,116,111,112,32,108,101,118,101,108,32,100,101,102,105,110,+105,116,105,111,110,115,128,75,225,103,2,226,192,3,1,95,54,193,95,126,+71,124,228,0,50,123,108,64,114,65,16,224,114,22,3,118,97,108,117,225,+246,0,225,217,7,224,232,0,64,102,128,233,0,54,225,231,9,160,238,65,+128,156,120,64,9,160,65,224,234,17,1,121,112,224,118,0,224,105,4,2,+50,54,56,66,40,64,7,157,43,64,199,149,234,5,85,32,75,50,32,75,+64,89,64,19,147,3,226,140,31,224,164,2,125,85,225,79,4,0,48,225,+79,1,224,55,9,193,205,64,58,131,3,64,125,0,54,224,145,1,128,56,+192,253,64,28,142,221,73,70,0,90,64,89,1,85,32,130,188,99,224,228,+105,3,131,151,224,114,6,0,61,160,111,228,153,4,1,50,52,125,38,224,+45,9,0,58,164,81,3,95,50,49,48,190,46,128,131,140,171,0,85,65,+47,0,75,64,152,64,19,137,229,64,151,224,146,103,64,125,134,213,244,180,+38,244,178,12,224,54,25,224,1,3,233,145,12,64,0,224,58,25,224,1,+1,224,68,15,224,57,25,192,1,224,65,14,224,56,25,128,1,224,62,13,+232,75,5,65,101,132,233,133,100,0,66,229,250,7,229,69,11,95,218,95,+110,159,218,2,52,49,56,197,120,228,221,14,15,66,117,105,108,100,105,110,+103,32,112,97,99,107,97,103,101,162,27,159,222,2,39,66,32,68,69,0,+66,104,183,232,156,3,223,251,0,54,69,13,2,95,56,51,100,163,0,67,+96,165,128,26,224,63,1,64,160,128,22,0,66,224,64,0,1,95,52,73,+20,96,0,96,26,128,38,0,39,224,5,8,224,234,3,192,135,224,236,30,+192,238,227,1,11,3,87,114,105,116,224,242,9,103,36,99,12,227,5,10,+1,116,111,163,5,1,55,55,192,185,224,189,0,128,2,65,157,225,254,0,+224,183,2,224,185,0,0,39,163,159,1,50,53,69,219,224,72,0,224,50,+0,1,50,54,167,83,225,71,7,98,47,128,13,128,6,128,114,1,83,39,+96,169,2,67,32,67,97,155,3,50,54,55,55,97,31,2,56,51,50,71,+5,102,222,2,85,32,65,96,181,1,52,49,100,13,1,95,55,100,21,224,+28,5,4,64,95,49,55,51,136,86,100,251,3,83,39,32,80,234,40,0,+233,230,0,64,15,160,207,129,82,225,202,6,228,127,1,225,159,27,225,160,+22,6,67,111,109,112,114,101,115,74,118,3,32,116,105,109,193,161,128,247,+225,163,0,64,54,5,52,54,32,95,51,51,102,90,65,189,4,56,48,32,+95,55,135,48,225,188,2,0,109,167,117,128,0,196,246,2,51,51,54,97,+74,0,95,64,6,7,32,95,51,55,48,32,95,56,96,145,232,222,0,64,+253,96,77,64,8,104,142,134,29,97,98,131,160,136,6,0,83,200,116,2,+54,51,56,129,141,65,112,3,95,51,51,57,136,118,75,240,139,235,1,35,+52,129,228,1,95,52,97,20,130,27,0,80,227,102,1,98,72,224,50,4,+106,183,160,183,129,1,108,69,96,186,0,52,90,59,1,95,52,133,235,128,+130,65,187,128,91,2,95,52,49,97,177,64,150,200,95,0,54,64,206,64,+14,2,54,52,52,68,11,1,57,51,66,62,98,249,224,163,7,0,73,64,+9,128,232,224,174,0,129,186,1,95,52,162,106,225,181,5,195,78,76,118,+15,32,110,111,116,32,111,102,32,116,104,101,32,102,111,114,109,96,20,0,+45,204,74,131,74,97,188,6,50,48,51,32,95,51,52,171,143,0,58,129,+103,104,229,0,89,96,204,66,169,205,58,98,232,129,249,217,245,128,7,64,+190,0,48,129,246,1,64,64,134,99,67,8,65,187,2,95,56,53,66,113,+64,88,136,118,195,111,128,1,237,249,51,224,11,2,192,8,0,80,160,57,+64,110,187,213,3,50,53,48,53,64,5,1,49,52,106,55,66,88,160,133,+1,95,56,96,246,228,216,0,68,51,0,56,97,236,66,65,105,67,128,14,+1,95,57,95,29,1,95,52,136,176,201,95,128,27,64,250,1,55,51,67,+136,1,49,51,64,6,160,124,136,179,65,68,163,53,64,157,128,165,0,83,+64,36,229,118,2,163,240,227,194,0,75,136,0,55,66,28,65,229,225,221,+2,14,107,103,80,97,116,104,32,105,115,32,101,109,112,116,121,163,82,64,+64,65,113,130,124,96,6,0,79,66,192,0,79,235,96,0,228,194,3,160,+105,134,207,236,55,5,228,65,13,172,20,2,95,54,52,131,216,140,29,163,+253,228,63,16,6,73,110,115,116,97,108,108,229,227,9,64,99,168,240,229,+224,6,1,105,110,160,34,96,92,225,147,0,198,241,175,121,193,76,0,39,+129,69,229,136,0,224,8,0,224,208,1,68,50,0,49,64,108,233,199,0,+131,220,96,226,175,236,224,253,9,64,53,64,212,97,132,198,105,231,74,3,+64,54,237,201,2,225,91,0,161,123,237,207,6,232,32,10,205,102,96,92,+232,20,14,4,99,114,101,97,116,232,10,1,238,36,9,224,219,3,2,95,+50,53,84,112,96,90,1,57,53,174,87,97,104,96,193,100,166,74,171,66,+225,0,53,106,154,101,92,2,95,49,48,133,108,238,214,0,224,244,0,0,+95,166,106,64,117,97,172,96,58,0,54,240,189,1,161,196,239,211,3,224,+102,3,240,160,4,1,95,52,100,243,128,0,107,59,109,197,0,55,64,249,+96,101,67,46,235,94,0,5,32,90,32,90,32,75,129,178,64,24,139,99,+161,69,194,12,3,67,32,95,55,100,91,0,52,200,248,224,30,13,1,57,+53,128,214,224,30,5,1,95,53,100,170,226,2,8,1,95,51,71,73,1,+95,52,64,232,160,125,139,99,167,225,96,226,224,99,2,1,49,57,134,92,+0,50,101,212,2,35,53,48,102,160,0,75,65,26,128,36,69,192,228,47,+2,103,173,161,184,0,50,134,204,69,127,2,54,55,48,96,223,227,22,2,+3,95,52,48,52,64,4,1,54,32,64,66,65,101,0,55,227,205,1,69,+150,132,49,227,228,1,131,204,196,98,128,13,0,64,230,194,4,141,252,129,+9,227,133,2,228,39,3,130,197,165,200,3,85,32,95,49,129,61,66,41,+160,9,65,18,207,250,0,80,192,32,64,255,0,57,133,90,207,146,0,89,+228,215,0,0,66,64,134,134,25,64,17,224,54,2,224,140,0,128,87,64,+66,9,10,65,32,94,109,107,100,105,114,32,64,16,230,45,1,232,234,7,+235,141,6,193,146,229,200,1,225,233,0,0,56,75,191,234,36,1,224,42,+1,107,233,0,53,64,44,0,85,64,4,0,90,227,188,13,70,53,64,187,+96,102,193,213,65,251,198,102,224,214,0,0,85,224,225,1,160,12,224,13,+0,224,193,11,64,0,234,186,15,161,200,228,235,3,228,244,5,224,25,12,+224,28,2,224,29,14,224,86,0,235,17,8,225,76,1,235,251,4,160,22,+160,152,230,41,31,234,95,28,241,153,4,2,110,115,58,240,24,3,133,98,+196,118,4,55,53,57,32,35,67,144,234,108,5,0,95,112,213,128,21,230,+71,5,8,40,117,110,112,114,117,110,101,100,128,78,224,75,3,224,63,8,+67,89,0,49,231,39,2,192,0,225,64,10,160,34,225,56,4,225,62,1,+74,19,198,29,224,8,6,231,100,13,105,48,0,48,65,59,98,167,1,50,+53,138,239,225,104,4,241,228,6,116,246,0,100,244,81,1,0,85,68,77,+0,53,171,108,192,0,225,216,5,98,89,237,216,12,161,226,231,3,13,224,+156,9,100,173,224,156,19,2,116,111,112,97,207,192,158,131,2,160,0,225,+75,5,131,242,225,72,7,97,48,97,45,130,0,64,118,75,219,128,0,195,+27,226,150,1,226,144,3,103,146,70,41,97,213,229,126,7,224,64,8,96,+199,227,144,10,225,61,27,225,206,14,227,9,49,9,102,105,110,97,108,32,+112,97,115,115,131,3,227,9,3,129,49,237,110,3,227,13,0,160,74,237,+125,17,237,126,2,237,125,5,229,38,1,132,20,227,226,1,194,177,224,8,+1,226,31,7,224,238,0,224,241,6,65,171,138,23,169,98,229,105,1,64,+165,0,56,66,79,212,236,1,51,53,160,163,245,112,2,79,141,141,42,96,+48,1,52,50,71,23,65,157,135,83,64,248,6,50,57,32,95,57,50,52,+166,207,231,32,5,224,234,1,1,46,104,192,235,64,119,160,95,3,50,53,+56,50,104,12,182,255,0,53,117,77,160,37,225,157,2,226,167,1,161,114,+192,30,225,102,3,227,54,0,3,50,53,56,52,64,219,70,203,65,241,0,+51,160,214,3,35,49,48,48,129,248,225,145,17,6,32,108,105,110,101,115,+47,225,151,4,198,14,198,214,129,159,96,32,234,223,3,229,231,1,230,63,+2,96,2,224,21,2,226,183,3,224,33,1,192,189,64,1,226,198,6,192,+214,194,204,1,51,54,65,55,97,218,174,219,199,174,96,92,231,43,11,161,+247,227,6,15,234,232,14,12,103,101,110,101,114,97,116,101,32,115,116,117,+98,180,232,130,70,202,203,209,36,166,23,138,159,170,241,229,220,3,0,52,+109,162,149,117,224,95,1,0,95,64,87,1,46,104,225,104,2,237,120,3,+193,76,161,19,64,116,1,50,53,75,10,226,81,2,3,99,111,109,98,192,+62,225,133,0,224,53,2,74,28,224,53,10,224,201,1,97,22,196,110,2,+57,51,54,224,253,2,3,109,104,115,99,224,42,7,232,73,0,225,100,12,+0,32,138,164,224,46,1,227,161,4,234,187,0,224,168,0,228,171,7,1,+95,55,101,39,1,50,53,122,127,1,95,57,207,247,236,60,5,192,88,195,+196,235,80,7,228,66,3,233,83,1,0,67,160,115,96,94,229,136,3,106,+35,131,20,194,68,224,54,13,1,54,48,76,55,224,54,1,224,192,4,96,+251,0,49,78,129,0,50,65,1,64,45,202,71,225,37,15,225,15,0,64,+130,147,239,161,143,235,101,9,225,149,1,9,35,105,110,99,108,117,100,101,+32,92,65,160,8,102,102,105,46,104,92,34,94,42,226,4,4,162,64,164,+40,3,95,50,54,50,64,139,179,215,224,231,1,96,212,0,53,65,99,64,+26,224,30,1,96,0,196,71,0,50,153,47,3,50,54,53,50,145,217,224,+138,1,31,84,104,101,32,45,114,32,102,108,97,103,32,99,117,114,114,101,+110,116,108,121,32,111,110,108,121,32,119,111,114,107,115,4,32,119,105,116,+104,93,205,6,32,97,110,100,32,103,104,162,75,128,77,0,52,172,157,193,+213,64,10,132,195,251,173,4,96,199,133,1,163,195,140,136,253,189,4,228,+187,2,184,189,140,248,233,61,5,185,10,173,228,96,133,0,54,181,11,0,+83,65,100,160,24,140,51,230,198,0,0,67,176,253,196,166,1,95,55,75,+251,101,119,0,48,108,162,7,95,49,55,53,53,32,95,57,108,196,115,251,+227,66,2,2,97,105,110,193,153,64,48,0,48,69,116,71,37,247,198,1,+140,95,146,13,92,156,65,150,139,13,233,187,0,115,207,199,17,64,141,1,+67,39,204,196,147,1,160,168,135,44,168,174,100,125,236,219,1,182,30,160,+64,128,17,132,96,226,225,0,0,85,98,105,97,5,128,4,131,131,224,206,+2,31,92,34,115,114,99,47,77,105,99,114,111,72,115,47,69,120,112,80,+114,105,110,116,46,104,115,92,34,44,55,52,58,50,0,51,229,35,0,155,+189,129,80,232,233,2,206,27,129,124,0,53,84,218,1,75,51,101,66,130,+127,165,76,83,41,0,75,155,252,160,54,128,1,0,89,96,16,230,87,3,+134,109,224,17,4,236,160,2,131,205,229,78,2,128,36,192,30,224,18,2,+224,21,3,174,174,224,43,8,224,71,4,141,99,192,152,133,67,1,49,56,+92,92,64,6,196,183,224,31,1,170,114,224,169,3,224,97,4,224,42,0,+196,188,203,183,2,95,56,52,222,233,224,34,2,224,62,0,100,88,128,120,+224,34,3,64,18,194,231,64,1,180,134,64,196,64,185,3,83,32,95,57,+66,251,162,196,192,0,128,41,128,88,234,238,0,196,189,192,100,101,168,99,+161,160,17,2,95,49,55,160,240,160,123,225,10,10,225,4,2,192,162,224,+166,5,192,157,160,221,232,103,2,128,51,193,22,112,88,1,95,56,232,207,+1,96,61,96,147,96,209,128,85,128,213,96,11,151,140,128,22,146,20,70,+92,132,22,105,59,100,112,169,62,224,195,1,227,58,0,148,148,192,72,233,+109,5,224,0,0,2,66,32,82,68,147,101,102,241,101,1,129,4,226,254,+0,162,112,131,136,224,9,0,64,109,0,80,100,133,227,48,0,232,4,1,+2,95,49,51,81,198,128,67,227,148,0,96,53,0,67,96,51,0,51,197,+180,227,72,6,228,246,1,226,41,1,2,49,56,51,182,33,104,192,225,194,+3,192,136,165,92,161,208,138,163,0,55,147,7,112,87,1,95,49,66,9,+103,108,0,49,228,198,0,1,95,55,134,206,209,57,96,127,128,51,0,85,+211,44,114,23,132,172,196,169,241,39,5,146,29,104,172,87,26,226,50,9,+183,202,160,202,97,157,240,231,2,231,243,0,3,95,55,53,50,101,64,2,+95,57,52,229,149,1,2,57,52,56,72,64,64,212,230,50,8,1,78,111,+79,230,3,105,110,105,116,90,79,4,102,111,117,110,100,88,147,222,215,191,+41,227,135,0,69,173,0,54,185,213,0,83,100,198,173,204,96,162,0,83,+98,160,131,101,128,16,192,151,224,142,14,226,153,1,224,145,1,5,68,117,+112,108,105,99,74,119,0,105,86,169,1,110,99,246,159,3,193,164,133,66,+87,136,255,203,0,231,11,7,1,97,116,128,55,65,21,65,208,224,119,4,+192,0,64,207,152,14,218,6,249,241,10,64,103,249,241,3,5,95,52,57,+53,32,35,64,118,64,62,149,30,64,62,0,55,77,8,0,54,97,198,251,+216,1,226,51,6,128,125,177,34,96,115,1,55,53,88,218,85,149,96,15,+96,68,2,50,52,51,132,91,226,130,3,64,108,0,51,167,41,225,9,0,+2,95,52,49,96,74,225,105,0,193,30,241,144,9,228,5,3,77,243,131,+37,133,132,111,166,1,54,55,122,87,130,160,100,116,166,78,64,57,65,237,+162,156,164,36,110,50,225,114,3,0,65,161,168,128,33,64,82,118,150,104,+137,162,190,64,17,224,164,3,128,141,1,53,56,246,168,2,232,225,2,225,+205,2,0,64,233,228,2,128,87,160,59,65,127,232,230,2,227,55,6,131,+57,164,6,64,6,227,54,2,192,153,224,101,2,0,125,192,99,65,107,246,+96,1,0,80,224,186,7,162,117,99,137,162,20,162,157,224,241,2,225,0,+5,224,175,11,1,75,50,67,20,232,98,30,5,49,50,52,58,49,56,232,+99,0,66,165,0,66,99,97,105,30,182,87,5,67,32,60,32,64,35,97,+165,129,216,224,25,6,165,214,93,146,224,21,2,111,223,66,84,97,211,96,+211,139,172,224,245,6,1,50,54,65,169,224,246,4,64,0,97,93,125,153,+3,67,32,61,61,192,101,105,206,224,62,27,0,85,100,75,107,111,227,54,+1,66,178,99,44,131,233,120,179,251,227,1,128,17,198,33,202,91,2,52,+48,49,241,189,3,160,9,161,47,99,18,76,232,64,62,0,50,99,144,2,+50,54,54,234,137,2,225,73,12,96,112,224,223,8,96,21,69,232,225,189,+35,3,49,58,50,49,239,69,1,224,84,9,97,15,224,84,39,3,48,58,+50,53,224,84,2,225,178,9,1,49,51,108,61,225,115,4,66,220,152,42,+3,95,55,54,51,108,134,152,36,65,14,165,218,67,100,0,48,80,45,97,+141,4,53,48,54,32,35,69,18,162,61,96,31,0,52,68,237,64,30,3,+35,50,48,52,65,216,224,23,8,3,54,53,53,51,68,122,64,22,224,24,+4,5,49,49,49,52,49,49,96,152,237,84,5,13,117,116,102,56,67,104,+97,114,58,32,98,97,100,32,64,9,205,53,194,178,1,83,39,89,22,1,+66,32,96,147,96,238,233,14,0,141,195,1,35,50,234,14,3,0,67,224,+46,19,72,49,2,35,49,50,178,3,224,44,35,224,41,32,229,100,0,2,+95,49,56,136,113,224,168,1,102,87,224,27,21,224,26,4,160,20,97,13,+225,8,28,169,145,224,216,81,224,187,47,224,184,22,0,49,145,71,224,139,+38,224,111,12,1,95,51,188,134,219,76,0,58,130,237,122,190,163,21,64,+41,96,201,99,49,67,18,71,4,0,83,64,168,3,95,50,49,53,107,115,+66,187,131,12,105,246,199,227,160,18,0,50,143,199,227,0,2,160,24,99,+113,64,22,224,75,3,232,91,3,96,124,224,28,15,125,249,224,28,15,0,+49,97,221,224,49,7,165,85,224,137,9,131,189,232,221,10,128,24,224,48,+10,101,28,227,186,2,224,235,4,228,160,2,1,92,95,169,103,72,87,128,+148,225,184,8,245,108,1,129,144,227,30,5,128,59,96,237,225,243,18,224,+71,18,161,237,160,77,224,155,3,0,63,170,59,253,75,1,128,107,65,39,+253,96,5,224,129,26,160,115,133,70,160,56,2,95,51,52,228,192,3,229,+174,20,4,52,55,58,51,52,133,174,224,49,1,10,113,117,111,116,101,83,+116,114,105,110,103,196,235,225,55,2,0,55,246,200,0,160,124,0,50,211,+54,0,79,130,185,96,134,66,212,0,56,226,212,0,78,84,69,212,0,54,+101,212,82,87,170,51,71,66,102,248,1,52,56,75,205,64,28,0,54,134,+7,3,50,54,53,51,93,217,65,219,224,15,4,170,221,224,228,7,10,109,+104,115,47,77,104,115,69,118,97,108,128,219,3,50,49,58,55,224,217,7,+115,11,9,115,117,112,112,111,114,116,101,100,32,115,15,2,71,72,67,64,+36,64,90,138,203,127,111,64,14,137,110,0,75,103,21,142,31,232,193,2,+73,185,227,8,0,118,81,182,89,73,135,237,93,1,210,58,168,221,239,71,+1,234,5,2,209,34,166,29,170,26,64,58,2,80,32,64,77,185,142,178,+109,142,175,7,161,235,206,203,224,127,57,208,248,224,145,20,147,175,139,251,+224,141,4,114,168,224,145,4,175,53,64,2,106,223,171,161,0,55,135,9,+192,143,132,224,172,7,0,57,68,229,235,192,6,245,93,2,98,138,64,115,+64,50,226,106,3,96,181,128,66,64,26,100,29,8,51,54,57,32,85,32,+90,32,90,171,45,1,75,51,129,214,72,119,224,6,3,112,25,166,7,239,+50,0,0,79,245,236,16,9,101,109,115,99,114,105,112,116,101,110,184,37,+195,192,1,95,55,78,78,1,49,51,85,39,100,196,225,130,32,226,13,16,+225,137,9,212,41,143,122,224,7,1,83,134,201,188,128,37,64,10,225,156,+0,225,159,4,225,160,2,146,74,169,148,77,214,1,50,54,146,29,225,75,+0,0,79,225,137,2,31,115,116,97,116,105,99,32,99,111,110,115,116,32,+115,116,114,117,99,116,32,102,102,105,95,101,110,116,114,121,32,105,109,12,+112,95,116,97,98,108,101,91,93,32,61,32,123,65,27,193,26,230,199,1,+192,100,98,64,224,98,10,4,123,32,48,44,48,140,241,224,22,3,1,125,+59,224,17,7,224,132,14,1,42,120,64,11,96,134,1,32,61,224,146,1,+96,62,229,84,0,224,216,15,224,77,0,0,101,160,77,1,101,120,224,210,+13,225,52,9,66,51,224,88,10,1,32,32,224,208,32,224,124,8,64,202,+0,101,224,202,0,224,138,0,160,56,239,46,2,195,1,0,95,79,9,64,+140,69,77,95,231,2,95,49,54,254,85,1,225,242,1,131,129,70,91,227,+100,10,3,60,115,116,100,102,27,0,62,231,63,0,224,37,3,0,102,145,+152,9,101,100,40,95,95,99,112,108,117,115,64,3,0,41,224,42,10,11,+101,120,116,101,114,110,32,92,34,67,92,34,129,57,224,75,7,4,101,110,+100,105,102,224,24,10,3,118,111,105,100,88,161,0,95,81,255,0,40,64,+13,0,41,96,243,231,3,1,2,52,49,48,240,46,4,97,133,73,165,165,+165,226,110,0,250,42,4,81,231,185,80,188,34,79,228,0,57,224,67,0,+0,56,103,104,64,0,224,242,31,129,133,0,50,180,187,224,220,13,193,156,+160,0,236,89,6,9,85,110,105,109,112,108,101,109,101,110,70,139,10,70,+70,73,32,102,101,97,116,117,114,101,96,240,0,64,241,188,2,2,49,52,+55,84,190,228,93,2,64,210,100,198,1,50,54,158,168,129,218,0,52,241,+44,2,0,90,65,46,243,167,0,224,20,9,105,114,160,152,224,90,3,244,+26,10,211,57,241,124,2,231,15,0,248,177,3,137,178,153,188,2,32,64,+64,116,254,72,153,194,168,248,203,1,128,68,252,191,4,238,124,6,114,126,+160,28,64,37,230,136,2,249,71,7,241,64,1,228,220,1,71,191,142,81,+213,126,64,17,142,77,225,172,3,5,71,69,84,82,65,87,227,143,7,11,+71,69,84,84,73,77,69,77,73,76,76,73,224,27,7,2,97,99,111,127,+138,224,19,4,6,100,100,95,70,73,76,69,224,23,11,1,102,100,224,21,+7,2,111,112,101,122,133,224,41,7,78,106,224,23,11,1,98,117,98,77,+224,22,7,2,99,114,108,224,23,9,0,115,154,224,224,19,4,1,116,97,+224,19,12,0,50,224,20,7,4,99,97,108,108,111,124,20,224,21,4,3,+108,111,115,101,126,212,224,21,4,225,4,9,2,101,120,112,224,18,7,4,+102,108,117,115,104,224,59,8,0,102,225,0,11,2,102,114,101,98,248,224,+19,3,2,103,101,116,224,60,8,5,103,101,116,101,110,118,224,21,7,6,+105,115,108,105,110,117,120,224,22,9,0,109,225,174,11,7,105,115,119,105,+110,100,111,119,224,24,8,1,108,111,106,241,224,18,3,0,109,225,20,12,+7,109,100,53,65,114,114,97,121,224,23,10,0,66,226,8,11,2,109,100,+53,235,80,1,224,24,4,3,101,109,99,112,224,70,9,4,101,109,109,111,+118,225,15,8,1,114,101,224,140,12,3,115,116,114,108,225,80,9,2,115,+116,114,224,89,10,1,112,117,225,82,9,226,51,10,3,115,113,114,116,224,+19,8,4,121,115,116,101,109,224,21,7,226,92,10,5,116,109,112,110,97,+109,224,189,8,1,117,110,225,207,11,5,117,110,108,105,110,107,224,21,7,+65,181,226,220,12,224,20,9,1,116,97,224,20,13,0,50,224,21,8,224,+83,11,2,101,120,112,224,19,8,2,108,111,103,224,19,8,224,122,11,65,+36,224,20,8,224,142,11,4,115,99,97,108,98,225,99,9,96,21,224,44,+8,6,106,115,95,100,101,98,117,226,41,8,9,106,115,95,101,118,97,108,+95,114,117,224,73,8,192,26,67,192,224,27,10,17,115,101,116,95,104,97,+115,107,101,108,108,67,97,108,108,98,97,99,225,111,8,3,114,101,97,100,+225,154,8,3,119,114,105,116,227,249,9,5,112,101,101,107,80,116,115,5,+224,22,4,2,111,107,101,224,22,14,2,87,111,114,229,3,8,64,69,224,+23,11,68,216,13,108,122,55,55,95,99,111,109,112,114,101,115,115,111,224,+82,8,224,34,0,1,100,101,224,36,21,2,114,108,101,224,70,22,64,33,+224,69,23,12,98,97,115,101,54,52,95,101,110,99,111,100,101,224,33,19,+64,72,224,33,15,1,119,116,224,137,22,64,33,224,137,19,65,47,4,95,+117,105,110,116,230,33,8,65,97,224,25,14,192,51,1,49,54,224,52,16,+224,26,10,192,53,0,51,230,32,8,224,53,0,224,26,10,192,53,1,54,+52,224,53,16,224,26,10,64,53,224,212,16,224,211,16,224,210,17,224,209,+17,224,208,17,224,207,17,224,206,17,224,205,17,0,99,182,33,224,50,8,+224,24,12,64,49,0,115,224,50,16,224,25,13,97,105,224,51,16,224,25,+13,96,51,2,115,104,111,229,213,9,128,52,224,26,13,96,157,224,52,16,+224,51,17,65,236,224,103,13,224,24,11,161,105,225,103,15,224,97,13,1,+108,111,231,75,9,128,98,224,25,12,64,51,224,50,16,224,49,16,1,117,+108,224,102,18,224,103,17,224,104,17,224,51,16,4,115,105,122,101,95,225,+102,14,224,26,13,64,53,1,102,108,226,211,15,224,25,13,160,51,226,211,+14,224,25,12,64,125,1,111,102,226,188,12,160,26,226,6,12,160,27,225,+190,10,160,25,225,9,11,192,26,224,27,18,225,12,13,74,79,1,100,105,+224,160,8,106,185,224,23,10,70,236,224,46,11,2,95,100,95,232,183,11,+1,99,104,224,44,10,1,109,107,224,20,10,4,103,101,116,99,119,230,210,+8,64,21,1,112,117,224,21,10,1,95,109,233,78,9,64,202,3,98,95,+114,100,224,27,17,1,119,114,224,27,11,6,110,101,119,95,109,112,122,224,+166,8,4,112,122,95,97,98,234,231,8,96,22,0,100,224,169,8,96,22,+0,110,224,22,12,1,99,109,235,220,8,64,22,64,197,224,47,12,64,24,+232,218,8,192,24,1,115,105,224,25,11,79,242,104,171,224,30,22,0,117,+224,30,13,231,51,9,64,22,1,109,117,233,17,8,160,22,1,95,50,236,+176,10,64,27,1,110,101,235,165,9,8,112,122,95,112,111,112,99,111,117,+226,208,9,64,27,1,115,117,233,38,8,64,22,5,102,100,105,118,95,113,+224,104,16,0,116,96,30,224,182,12,4,116,115,116,98,105,224,106,12,0,+120,224,231,13,129,86,227,191,9,225,88,6,224,32,22,0,117,224,32,14,+2,108,111,103,228,77,8,5,119,97,110,116,95,103,226,22,9,9,103,101,+116,116,105,109,101,111,102,100,237,30,9,4,69,50,66,73,71,224,20,8,+4,65,71,65,73,78,224,21,8,3,73,78,84,82,224,20,10,2,86,65,+76,224,21,8,9,87,79,85,76,68,66,76,79,67,75,224,26,7,4,101,+114,114,110,111,224,20,7,8,115,116,114,101,114,114,111,114,95,225,73,8,+5,101,110,118,105,114,111,107,95,241,187,6,224,0,145,0,58,146,10,121,+105,3,85,32,64,90,241,39,1,247,111,1,246,30,2,145,50,224,35,0,+0,83,64,30,224,13,0,192,16,224,47,5,158,229,224,71,21,120,31,177,+212,224,11,3,247,228,1,241,194,1,157,110,224,60,2,192,33,96,83,179,+173,247,117,2,180,66,254,53,3,248,37,5,10,32,32,103,99,95,99,104,+101,99,107,40,96,41,224,82,0,122,123,4,54,32,95,51,51,116,16,251,+57,3,84,74,160,11,3,95,49,56,49,192,9,3,53,57,32,35,146,160,+1,95,56,124,140,116,23,224,106,1,180,142,244,144,2,224,138,7,85,184,+4,112,117,115,104,40,245,194,1,0,91,224,149,5,224,147,3,224,57,1,+1,93,46,64,47,4,118,97,108,117,101,192,100,194,131,161,84,160,61,85,+233,129,92,224,123,8,85,57,64,15,156,255,224,56,7,1,50,54,84,81,+0,57,97,93,128,27,224,64,6,0,40,64,129,112,98,7,40,41,44,32,+48,44,32,95,113,81,193,169,161,166,96,190,225,18,4,96,243,5,97,112,+112,108,121,40,225,31,0,160,223,246,139,3,179,209,0,67,98,78,149,151,+89,196,128,92,66,17,224,211,12,128,79,0,83,66,206,193,110,98,35,65,+157,224,48,11,5,95,114,101,115,32,61,97,10,1,116,111,161,8,250,31,+3,225,6,5,247,183,0,0,35,67,41,97,112,218,99,224,83,1,3,44,+32,45,49,224,216,0,246,35,6,161,240,1,111,112,160,250,224,27,5,5,+114,101,116,117,114,110,96,147,247,187,2,214,53,193,223,226,75,16,151,1,+130,61,160,149,246,183,3,224,136,22,224,106,11,86,255,128,11,251,245,1,+131,151,159,206,1,57,56,97,165,95,96,1,48,52,225,3,3,120,155,3,+120,101,99,40,128,142,224,33,15,2,118,97,108,192,33,97,223,67,75,183,+113,247,102,0,251,88,0,132,188,222,38,226,170,2,94,24,97,225,192,66,+225,234,2,91,250,0,50,193,0,225,216,4,0,56,126,136,225,209,11,224,+87,2,88,63,225,217,3,96,171,163,83,227,42,3,162,95,226,93,8,131,+17,227,194,3,226,228,11,64,125,0,49,252,159,1,64,230,158,244,87,32,+0,66,119,76,222,72,67,9,2,67,32,60,192,58,97,150,247,8,4,64,+21,101,218,183,190,0,85,128,62,224,36,4,189,85,0,85,222,162,125,4,+87,224,2,95,56,48,65,63,66,244,119,221,224,202,1,66,90,0,42,226,+211,1,224,62,7,3,39,32,95,55,93,4,248,117,4,97,97,65,28,0,+53,64,14,183,109,69,226,0,57,92,254,131,82,2,95,57,52,65,12,0,+53,96,35,225,64,8,17,78,111,116,32,97,32,118,97,108,105,100,32,67,+32,116,121,112,101,159,163,3,64,95,50,49,66,78,129,43,0,54,183,167,+0,80,224,57,2,14,80,114,105,109,105,116,105,118,101,115,46,70,108,111,+97,105,28,226,124,2,192,18,0,64,224,53,16,4,68,111,117,98,108,107,+221,224,30,1,0,100,224,19,0,224,55,17,0,73,137,243,224,27,1,5,+105,110,116,112,116,114,140,134,224,54,20,137,76,224,56,4,1,54,52,224,+55,23,211,21,224,28,1,79,53,224,112,26,64,56,224,113,7,145,118,224,+57,12,131,166,226,15,5,224,38,10,0,83,117,245,7,46,73,79,46,72,+97,110,100,225,63,7,226,68,1,228,96,1,65,192,0,53,185,122,95,129,+228,215,10,0,123,255,207,0,227,113,0,98,90,224,35,1,7,92,34,44,+32,48,32,125,44,96,37,160,84,0,52,96,84,66,218,66,250,200,74,104,+152,164,204,223,58,160,12,64,36,250,244,5,198,70,0,67,99,67,0,80,+229,116,10,64,154,0,38,96,117,0,83,228,52,1,224,34,5,96,155,0,+44,102,97,3,97,100,100,114,134,99,230,53,9,224,188,1,224,100,12,224,+99,32,224,94,24,231,7,12,224,98,0,160,243,192,103,224,105,12,128,40,+229,128,5,228,225,2,67,241,101,133,224,60,8,224,161,32,96,0,68,48,+225,142,0,224,175,152,2,95,57,52,224,118,4,25,115,114,99,47,77,105,+99,114,111,72,115,47,70,70,73,46,104,115,92,34,44,57,56,58,49,51,+164,194,66,163,0,51,98,163,2,95,54,32,106,62,64,7,2,55,48,51,+106,98,102,250,64,34,0,50,226,198,49,189,131,224,45,1,253,145,3,102,+73,201,171,139,156,203,113,129,42,1,64,66,108,19,1,50,54,72,20,225,+24,6,226,200,1,162,78,161,58,103,228,231,176,0,224,47,1,168,216,224,+49,3,70,218,71,175,0,48,198,9,134,149,235,246,0,129,110,166,97,231,+0,0,96,50,0,49,96,149,102,99,96,200,224,20,2,203,184,230,97,15,+224,146,1,24,102,111,114,101,105,103,110,32,38,32,109,117,115,116,32,98,+101,32,80,116,114,47,70,117,110,184,150,96,92,0,80,104,230,232,185,6,+2,40,72,115,128,38,200,185,224,40,5,132,218,96,5,96,195,72,129,0,+56,231,220,1,232,164,0,232,215,2,104,151,0,39,193,107,226,198,1,225,+78,29,64,239,225,72,3,160,96,161,79,168,244,71,166,135,172,194,66,194,+7,226,3,7,205,194,224,13,2,66,10,192,156,235,144,1,104,143,203,150,+226,5,3,224,168,15,224,165,4,129,187,161,229,224,56,8,0,59,203,11,+67,128,64,22,6,95,85,110,105,116,40,115,163,204,237,28,12,233,69,6,+128,191,227,240,1,233,229,39,1,67,32,105,231,64,180,64,247,233,181,3,+129,89,224,111,6,142,1,203,48,99,57,65,134,202,206,227,212,0,64,0,+65,206,225,151,41,161,119,225,151,186,163,227,239,238,0,227,100,9,5,69,+77,95,65,83,77,227,96,1,224,243,0,228,23,0,196,13,0,52,129,222,+4,48,56,32,35,57,97,168,1,50,54,139,104,227,144,5,230,28,11,1,+40,123,161,2,226,41,8,224,35,1,1,32,125,224,217,5,66,46,1,48,+56,96,178,140,6,227,171,22,198,126,102,102,98,56,226,73,24,228,26,3,+226,85,33,230,128,28,5,49,54,57,58,49,49,230,129,2,0,49,237,78,+0,224,247,6,65,224,239,17,15,1,51,57,226,27,11,226,5,35,64,122,+0,48,236,226,134,229,248,1,96,0,236,224,34,69,223,236,224,57,18,74,+97,118,97,115,99,114,105,112,116,32,97,114,103,117,109,101,110,116,236,242,+15,65,128,236,242,19,236,132,8,160,16,236,238,37,224,19,1,224,55,17,+237,92,10,224,54,2,97,237,64,175,143,181,225,235,130,150,45,225,235,43,+96,14,225,235,66,165,80,225,233,15,144,8,225,233,34,1,78,84,225,233,+42,4,79,85,66,76,69,225,233,41,224,54,1,225,233,0,0,54,228,80,+43,243,98,9,224,55,1,228,86,38,71,172,110,76,64,98,226,34,4,2,+95,49,50,68,183,0,85,226,29,9,1,51,51,96,62,64,61,142,53,69,+85,0,54,224,131,3,105,234,64,31,139,177,234,116,2,2,49,56,57,64,+135,66,16,1,73,32,96,34,139,177,162,180,224,133,4,66,205,1,95,49,+134,5,192,31,67,16,135,241,224,175,9,183,142,64,29,0,85,232,49,9,+224,196,4,160,43,1,95,49,65,13,128,0,64,139,229,222,1,225,145,14,+64,13,235,201,0,103,149,151,175,104,71,193,161,161,162,231,68,14,193,159,+225,212,5,242,242,3,224,51,8,233,98,1,96,44,230,255,7,64,185,134,+29,140,39,228,51,90,172,144,228,53,11,228,84,17,96,220,224,213,1,236,+60,3,227,66,2,230,86,48,0,50,230,86,3,128,45,105,217,68,113,228,+107,5,228,108,21,243,57,16,65,211,243,57,38,224,18,0,230,74,73,230,+180,41,243,52,10,224,18,0,243,50,35,192,17,243,45,37,224,19,1,243,+43,22,75,34,224,38,10,243,43,21,194,54,235,54,1,65,176,135,71,228,+158,7,225,178,3,226,131,0,64,46,134,60,224,46,18,224,43,2,0,54,+229,184,15,64,9,1,95,116,241,10,1,235,45,19,7,40,105,110,116,32,+115,41,32,171,88,241,53,9,0,59,171,79,128,115,133,171,226,217,1,3,+50,54,48,49,128,6,172,125,128,9,64,102,75,223,1,49,50,195,121,101,+176,64,65,165,175,2,50,54,50,144,0,0,50,101,131,64,31,23,10,65,+32,94,97,100,100,95,108,122,55,55,95,99,111,109,112,114,101,115,115,111,+114,32,64,30,197,162,3,66,32,95,51,107,62,96,10,2,48,32,95,64,+56,64,116,99,121,64,231,71,225,160,23,196,224,64,18,92,2,192,19,3,+32,95,51,54,67,189,64,14,64,13,67,188,1,51,53,64,52,1,54,48,+69,52,1,95,51,138,31,132,189,224,58,1,3,95,50,54,49,68,134,96,+123,2,50,54,49,64,67,1,54,49,67,218,1,51,53,165,54,224,26,5,+64,88,252,124,6,175,227,238,32,4,224,156,2,96,99,129,74,165,156,192,+203,2,95,57,56,192,110,96,105,224,30,14,100,144,128,184,64,218,225,9,+0,192,152,64,223,0,80,128,16,160,65,224,222,1,134,137,224,22,8,2,+50,54,50,134,221,224,165,1,224,0,1,65,156,134,179,6,94,99,108,111,+115,101,98,97,174,134,11,71,210,96,133,122,21,3,50,54,49,56,98,25,+97,48,79,167,0,56,129,101,0,58,128,150,16,10,65,32,112,97,99,107,+67,83,116,114,105,110,103,76,101,110,64,73,64,50,64,91,6,103,101,116,+95,109,101,109,96,18,163,35,6,56,57,32,75,32,95,57,64,179,192,7,+2,95,57,53,225,4,0,1,95,57,112,10,128,11,1,49,48,225,144,0,+64,12,0,52,224,12,0,160,157,98,175,96,151,190,59,64,11,0,54,166,+76,131,97,69,234,128,30,0,95,112,94,64,137,0,54,224,137,24,110,223,+160,137,96,11,192,137,160,12,128,137,64,12,224,137,1,2,50,54,49,66,+212,224,138,3,130,143,160,138,3,50,54,49,52,224,139,1,64,5,64,139,+131,153,6,94,112,111,107,101,80,116,99,52,64,37,96,18,2,101,101,107,+192,18,131,102,183,38,112,139,0,49,64,174,227,37,9,151,68,1,95,49,+84,221,128,96,195,130,0,95,84,225,4,67,32,95,55,57,102,211,228,75,+2,6,92,34,108,105,98,47,70,147,167,9,47,77,97,114,115,104,97,108,+47,65,94,112,142,204,3,52,57,58,51,206,203,96,83,162,57,4,102,108,+117,115,104,98,57,67,95,96,179,1,117,116,96,15,67,143,64,15,7,111,+112,101,110,98,95,119,114,194,4,67,239,128,141,0,55,73,71,164,214,253,+47,3,31,115,116,97,116,105,99,32,99,111,110,115,116,32,117,110,115,105,+103,110,101,100,32,99,104,97,114,32,100,97,116,97,91,4,93,32,61,32,+123,64,137,101,175,240,216,0,64,73,1,57,51,65,24,66,15,100,90,2,+54,32,35,99,0,1,64,66,224,96,4,0,125,158,49,224,20,5,224,110,+11,10,42,99,111,109,98,101,120,112,114,32,61,96,122,128,55,254,20,14,+128,64,69,148,192,53,4,108,101,110,32,61,129,51,240,211,3,247,15,3,+112,114,254,57,4,198,132,65,42,131,47,2,66,32,89,138,33,2,83,32,+85,104,134,161,229,153,56,224,7,1,229,50,1,69,193,208,199,105,210,240,+195,1,99,151,192,95,163,5,2,55,54,51,241,238,1,224,160,6,133,80,+74,53,209,222,64,56,130,178,2,95,50,53,131,32,73,165,64,6,0,51,+102,17,72,243,230,17,18,64,37,224,30,4,1,100,101,224,32,6,130,175,+6,85,32,75,50,32,75,52,160,2,90,175,192,1,0,75,211,219,224,200,+0,130,141,192,143,1,53,57,69,180,3,50,53,57,57,128,143,162,153,64,+112,12,98,97,115,101,54,52,95,101,110,99,111,100,101,64,109,96,36,224,+29,6,64,144,192,29,194,173,230,158,5,1,95,52,138,11,243,94,0,152,+22,224,13,0,0,39,152,7,224,17,12,160,75,69,202,2,95,55,56,96,+77,128,6,172,215,3,64,95,51,52,226,87,3,131,155,136,193,14,47,73,+79,47,84,114,97,110,115,100,117,99,101,114,115,131,155,4,50,57,58,49,+53,131,155,224,53,1,2,97,100,100,224,40,1,14,82,87,58,32,98,97,+100,32,82,47,87,32,109,111,100,138,28,0,64,64,222,130,97,3,85,32,+75,51,225,106,11,225,104,4,64,46,162,48,2,57,57,54,97,28,200,83,+2,95,57,50,69,14,107,83,64,23,168,41,0,54,65,139,121,109,2,50,+53,57,104,45,1,53,57,129,252,249,126,1,1,50,53,69,117,64,25,196,+165,134,255,119,229,6,83,32,95,52,54,53,32,97,21,224,218,1,1,46,+47,128,191,130,212,162,230,64,72,0,48,128,72,226,12,0,1,56,57,96,+5,0,53,128,22,204,229,64,18,66,31,3,54,32,95,52,110,79,0,58,+96,41,64,28,135,212,97,153,1,53,54,69,169,3,50,53,56,55,96,61,+64,49,128,61,64,54,0,54,232,127,3,130,109,128,19,64,41,166,228,64,+64,224,125,1,65,5,106,30,76,213,97,40,1,95,52,84,149,64,26,207,+69,129,131,128,68,129,65,67,249,88,240,64,225,206,191,250,105,0,168,11,+228,5,7,228,13,0,164,6,96,0,64,18,140,186,1,56,55,157,211,69,+22,64,104,129,143,99,107,96,15,227,123,5,227,117,3,224,1,7,227,133,+5,128,0,64,65,129,126,65,150,224,61,19,224,1,1,224,71,11,64,0,+64,75,129,179,3,80,32,35,54,98,4,2,58,50,53,70,187,136,160,161,+6,0,64,229,30,0,78,54,106,218,96,227,169,40,99,121,163,159,251,150,+3,128,11,248,3,1,119,236,3,32,95,56,52,111,123,131,166,195,185,64,+56,229,193,1,2,95,49,55,175,248,131,247,2,95,57,54,124,210,225,123,+0,96,107,170,129,2,55,53,50,101,82,227,210,7,0,115,246,49,2,7,+69,120,112,80,114,105,110,116,131,205,4,51,53,58,53,54,167,105,230,99,+8,18,114,101,109,111,118,101,85,110,117,115,101,100,58,32,117,110,100,101,+102,128,41,133,179,0,56,136,248,161,254,128,203,1,95,56,75,184,192,21,+224,196,7,226,95,15,241,41,0,166,89,64,91,101,228,87,136,224,97,0,+226,96,1,64,130,0,55,67,194,97,163,131,44,65,143,64,91,177,48,239,+136,2,65,83,66,32,241,160,1,65,111,224,45,4,1,75,50,224,29,0,+224,10,2,96,147,81,159,129,179,241,197,2,96,234,224,37,12,96,168,67,+118,239,248,2,225,81,1,0,70,147,83,224,58,0,224,136,30,242,114,12,+242,29,3,160,32,103,77,65,104,99,173,224,0,0,224,84,3,224,220,1,+224,21,11,65,78,132,81,2,80,32,35,133,10,64,18,0,54,196,175,129,+77,236,45,1,97,162,0,51,64,122,0,83,120,214,228,32,11,129,26,0,+90,66,211,162,251,237,100,4,161,218,0,48,68,169,140,70,1,53,55,141,+184,1,95,52,71,155,232,249,10,11,109,98,105,110,97,116,111,114,115,58,+94,42,193,79,107,107,96,10,236,125,5,64,190,132,242,3,80,32,35,55,+224,209,0,132,241,224,209,11,97,69,0,56,97,13,170,254,128,175,0,56,+103,131,67,101,110,20,128,14,1,95,57,133,142,69,85,223,182,64,75,128,+29,111,37,0,55,84,89,2,95,49,51,116,138,224,81,10,3,95,50,52,+55,65,202,237,78,2,224,24,1,105,20,64,209,160,80,128,160,244,95,2,+164,57,64,2,225,89,10,125,1,65,88,66,19,91,53,77,63,211,33,225,+94,14,17,116,111,116,97,108,32,105,109,112,111,114,116,32,116,105,109,101,+32,64,0,234,86,8,0,55,78,164,141,38,244,15,2,224,70,1,1,109,+115,176,13,193,83,96,104,225,101,0,225,121,0,100,190,64,29,66,178,96,+195,0,80,101,83,64,90,64,102,1,54,51,66,155,115,48,2,95,50,52,+71,86,243,57,2,65,201,134,82,238,136,2,96,215,224,212,6,9,87,101,+108,99,111,109,101,32,116,111,75,50,3,101,114,97,99,81,37,0,32,165,+19,7,44,32,118,101,114,115,105,111,157,55,1,95,52,64,167,0,52,77,+21,128,187,224,89,2,193,76,1,95,55,66,84,96,105,224,100,1,8,85,+115,105,110,103,32,71,77,80,160,249,240,120,2,1,51,54,254,135,3,2,+72,79,77,132,7,164,165,230,57,2,233,243,1,0,56,70,218,233,211,5,+226,165,2,161,82,162,170,2,95,50,53,71,222,192,23,164,251,224,5,8,+66,81,104,164,107,212,64,7,142,93,118,1,68,134,0,95,72,69,69,79,+150,208,230,70,19,0,73,225,70,1,134,73,3,53,54,58,55,166,73,226,+76,2,4,99,115,116,97,116,170,1,165,178,99,23,3,83,32,95,51,70,+172,66,148,98,254,64,0,68,134,161,106,161,225,70,87,0,54,80,176,1,+53,55,65,117,0,49,124,159,1,95,49,129,155,253,152,15,4,46,109,104,+115,105,194,125,66,34,136,101,2,95,56,54,79,127,0,85,247,52,0,136,+166,192,13,224,1,29,135,109,224,0,10,224,58,25,224,1,1,224,68,15,+224,57,25,192,1,224,65,14,224,56,25,128,1,224,62,13,224,55,25,64,+1,224,59,12,224,54,25,224,56,13,224,53,44,224,50,41,224,47,38,224,+44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,26,17,+224,23,14,224,20,11,224,17,8,67,159,133,153,224,0,10,67,129,250,173,+5,224,1,31,226,166,13,64,0,224,59,25,224,1,3,224,71,16,224,58,+25,224,1,1,224,68,15,224,57,25,192,1,224,65,14,224,56,25,128,1,+224,62,13,224,55,25,64,1,224,59,12,224,54,25,224,56,13,224,53,44,+224,50,41,224,47,38,224,44,35,224,41,32,224,38,29,224,35,26,224,32,+23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,224,+11,2,192,8,236,68,5,224,0,2,67,209,143,43,234,174,1,73,156,75,+10,202,252,3,95,56,52,54,142,198,234,209,1,72,173,71,244,72,231,1,+50,53,84,26,1,95,57,120,251,0,57,120,202,0,64,224,77,3,2,53,+49,57,232,123,2,11,84,121,112,101,32,39,58,113,117,105,116,39,73,196,+64,8,13,44,32,39,58,104,101,108,112,39,32,102,111,114,32,64,9,140,+11,224,68,1,1,51,54,78,165,84,74,2,95,50,53,85,154,0,95,75,+81,224,85,2,1,104,101,234,14,4,0,115,114,245,25,32,99,117,114,114,+101,110,116,108,121,32,111,110,108,121,32,119,111,114,107,115,32,119,105,116,+104,91,41,168,202,2,50,53,54,244,217,0,105,123,65,12,224,251,1,1,+54,49,178,143,90,144,192,222,138,15,224,33,2,1,50,53,137,205,65,112,+224,60,12,64,185,97,33,64,0,129,161,224,66,9,172,24,234,40,7,236,+49,0,193,231,129,123,224,41,1,238,177,1,80,141,224,63,1,234,101,2,+224,41,5,3,95,50,53,51,251,82,0,0,54,235,206,4,64,26,97,15,+225,92,1,1,62,32,240,84,1,160,39,4,67,32,95,53,51,64,217,0,+48,149,237,78,171,214,128,235,100,1,1,57,50,235,84,3,160,70,235,131,+2,1,53,53,73,244,106,160,203,94,5,57,48,57,32,95,57,121,13,1,+50,53,109,186,143,82,192,51,239,37,0,224,139,1,175,40,128,0,113,203,+142,197,0,85,107,76,96,203,171,150,109,176,207,213,111,208,1,35,53,185,+102,237,174,5,1,53,53,128,128,162,25,141,144,225,137,0,64,24,64,245,+75,103,226,63,3,226,235,8,1,66,121,171,47,64,0,66,93,240,223,0,+143,43,0,54,98,208,238,20,0,203,13,206,90,117,251,0,85,227,153,4,+224,95,5,11,85,110,114,101,99,111,103,110,105,122,101,100,88,60,2,109,+97,110,159,35,224,83,9,228,23,2,78,108,192,13,107,56,216,1,140,191,+130,68,110,154,2,95,55,52,236,163,0,0,90,64,28,111,250,97,12,225,+45,1,194,80,124,103,96,11,237,176,5,8,65,109,98,105,103,117,111,117,+115,192,161,218,13,96,43,128,97,121,128,97,65,224,184,11,226,190,0,1,+95,55,140,223,181,64,141,2,113,151,97,134,131,93,1,95,54,97,90,64,+80,111,31,66,223,129,104,118,56,129,136,145,25,255,235,5,68,137,111,33,+1,32,32,100,149,206,83,110,73,0,56,130,112,160,154,96,134,88,221,224,+63,3,4,99,108,101,97,114,160,63,128,11,13,97,108,108,32,100,101,102,+105,110,105,116,105,111,110,224,72,0,225,207,3,2,52,52,32,64,18,173,+200,228,242,3,2,56,54,55,129,105,109,53,0,52,78,67,173,53,237,74,+0,1,52,56,68,147,173,74,206,3,0,56,131,190,225,73,12,224,176,5,+5,114,101,108,111,97,100,128,176,160,11,5,109,111,100,117,108,101,224,169,+0,228,161,5,132,191,228,184,8,165,19,228,175,8,228,169,2,1,95,56,+85,145,230,67,10,65,136,224,206,2,224,227,1,230,66,5,134,144,226,27,+14,224,212,5,6,100,101,108,101,116,101,32,96,214,192,11,225,130,0,3,+40,115,41,32,99,33,224,137,8,97,137,64,8,88,96,100,99,162,101,66,+163,65,238,183,193,119,248,226,121,4,2,64,95,55,68,174,225,114,13,224,+155,5,0,116,70,251,145,133,5,32,115,104,111,119,32,96,16,2,111,102,+32,100,38,228,132,9,66,228,224,83,23,4,107,105,110,100,32,162,183,96,+83,96,16,3,111,102,32,116,224,83,13,93,194,224,83,23,8,109,97,105,+110,32,97,114,103,115,66,24,2,117,110,32,96,15,103,54,7,97,114,103,+117,109,101,110,116,98,33,224,92,8,0,54,71,152,224,92,23,2,100,101,+102,64,87,224,176,1,167,164,227,41,23,0,54,98,28,226,2,9,224,93,+5,11,115,97,118,101,32,91,70,73,76,69,93,32,96,11,224,93,14,224,+187,9,99,74,224,187,22,72,154,192,187,7,116,104,105,115,32,116,101,120,+97,103,224,172,7,1,49,57,133,6,64,88,70,74,66,82,158,101,71,109,+2,48,56,32,134,120,164,146,228,188,1,224,225,27,14,101,116,32,91,70,+76,65,71,93,32,32,40,117,110,41,64,15,3,102,108,97,103,224,213,13,+128,72,224,82,7,199,170,96,0,69,15,0,54,134,152,104,33,87,200,99,+149,71,38,96,42,224,23,11,224,144,1,0,43,137,73,128,36,160,5,224,+36,8,0,45,128,36,230,193,9,4,107,110,111,119,110,96,192,3,46,32,+32,75,224,12,0,6,115,58,32,43,115,44,32,160,54,165,13,196,40,155,+99,210,66,165,140,224,35,20,193,74,233,115,8,104,58,245,172,3,224,161,+7,0,67,162,63,160,148,5,40,117,115,101,32,43,74,184,65,119,4,97,+110,100,32,45,64,12,5,117,110,115,101,116,41,128,171,231,13,0,231,10,+8,245,124,7,1,80,32,95,31,0,53,129,100,64,10,0,51,191,42,4,+79,32,35,49,49,160,23,128,183,248,131,2,65,175,191,71,243,7,5,167,+204,192,1,236,28,12,148,56,225,248,1,151,61,224,238,2,135,163,27,115,+32,40,109,97,121,32,98,101,32,97,98,98,114,101,118,105,97,116,101,100,+41,58,94,42,101,120,112,198,227,10,32,32,101,118,97,108,117,97,116,101,+32,64,21,1,101,115,85,119,5,94,42,100,101,102,110,224,33,0,11,97,+100,100,32,116,111,112,32,108,101,118,101,231,11,3,119,237,64,127,149,243,+116,69,249,107,7,154,92,225,177,6,0,56,70,242,247,159,0,232,133,7,+166,109,0,57,103,9,192,15,215,31,225,140,6,4,119,114,111,116,101,168,+138,129,25,68,3,195,181,1,53,49,226,189,3,0,46,204,45,64,178,180,+131,224,151,11,161,248,64,37,209,39,170,76,226,11,8,0,95,69,79,0,+65,69,99,226,19,5,121,248,139,89,160,4,0,51,170,222,136,197,224,149,+2,101,151,224,151,1,254,167,0,225,49,12,231,158,13,1,50,52,95,139,+171,21,103,199,160,168,66,129,0,48,162,128,64,194,138,226,0,80,225,100,+0,64,57,64,46,91,141,106,50,4,95,50,48,52,48,76,3,1,95,56,+97,194,1,53,53,142,8,3,49,57,51,50,64,71,246,130,37,5,51,51,+51,58,49,52,246,131,7,70,46,1,75,105,170,227,128,123,227,108,0,3,+95,50,49,48,232,20,2,0,58,134,234,129,16,249,22,6,71,116,96,66,+160,26,192,172,227,175,9,0,61,161,156,161,28,225,20,3,128,98,139,208,+224,49,1,78,221,1,95,105,70,18,64,29,138,101,225,145,77,0,52,157,+78,225,145,35,79,198,129,145,0,49,225,145,42,1,50,49,225,145,14,64,+243,225,145,30,0,54,97,16,0,80,124,37,104,43,96,6,64,25,164,208,+225,127,5,138,141,96,114,227,151,13,7,32,119,104,101,114,101,94,42,186,+227,0,83,111,245,3,46,73,79,46,127,23,3,79,114,82,117,132,144,9,+97,117,108,116,32,78,117,109,32,40,64,215,11,103,101,114,44,32,68,111,+117,98,108,101,41,224,30,1,4,73,115,83,116,114,89,246,0,40,128,7,+224,26,2,0,83,72,166,3,40,40,41,41,188,164,64,176,133,56,225,219,+15,97,202,230,107,12,223,40,103,40,0,83,96,22,68,117,0,51,91,23,+65,194,72,15,186,61,130,22,162,17,91,86,225,234,7,1,64,90,129,109,+108,221,255,81,2,198,12,0,67,160,104,142,75,98,53,64,107,1,48,57,+74,88,1,50,53,130,117,130,134,226,137,5,166,52,194,140,174,33,226,143,+0,226,145,10,67,35,2,50,53,52,166,90,226,149,11,0,90,97,190,218,+32,73,7,224,32,0,136,251,226,242,2,227,112,13,97,119,252,36,0,236,+132,7,160,168,4,85,32,64,90,32,65,23,239,180,6,230,13,2,240,99,+1,0,64,90,188,92,119,105,35,251,144,1,128,42,0,80,97,0,76,161,+251,205,3,224,61,2,224,32,0,250,238,9,128,71,101,204,64,242,96,219,+2,50,53,53,108,88,112,54,1,49,52,95,39,99,153,226,218,2,193,87,+67,170,64,245,65,83,225,216,2,161,3,134,129,227,6,1,227,172,2,164,+121,198,125,126,95,97,200,0,56,64,70,64,11,0,89,160,142,96,213,0,+51,77,128,222,134,65,226,0,57,70,222,65,148,96,47,224,113,0,134,91,+137,220,208,46,129,162,228,138,0,224,18,0,224,179,0,224,17,0,229,81,+9,196,252,193,238,98,169,124,66,68,50,231,37,2,0,112,227,200,0,160,+55,224,34,19,2,83,116,97,140,153,164,47,2,79,32,35,134,124,228,63,+1,65,88,226,85,6,124,126,156,121,0,58,130,194,225,92,4,4,95,105,+116,73,79,129,86,64,214,230,81,1,197,81,230,54,37,64,70,134,23,224,+98,4,160,96,0,54,165,6,1,52,53,76,47,0,53,126,254,0,54,113,+89,2,95,49,55,75,81,64,36,133,43,207,62,82,234,202,243,74,64,207,+64,113,232,196,143,64,54,132,177,234,51,0,69,169,192,1,246,71,31,130,+55,66,78,234,68,0,192,211,169,200,164,76,82,99,224,63,2,130,56,2,+95,49,52,64,250,97,7,0,75,128,202,130,201,5,85,32,75,52,32,75,+64,168,64,19,130,187,84,135,3,57,32,95,52,64,34,64,21,226,129,0,+0,89,66,185,2,66,32,66,83,36,227,149,1,0,55,112,96,64,104,68,+242,160,125,0,83,243,236,5,0,64,97,134,96,37,64,29,97,159,0,48,+211,225,228,1,1,1,95,52,74,149,224,163,0,65,77,97,110,147,57,194,+253,192,223,235,116,4,115,174,0,49,113,202,100,126,0,80,99,101,0,79,+128,106,162,10,194,145,128,4,68,171,0,83,64,42,2,83,32,64,164,186,+0,67,64,48,162,156,65,5,0,53,192,190,192,0,192,109,112,152,3,95,+49,52,55,64,185,116,205,0,51,192,38,161,123,67,97,0,56,66,54,75,+3,87,66,128,72,96,13,66,42,2,53,57,56,65,47,1,95,50,69,61,+3,95,55,51,51,237,186,0,193,49,136,51,128,0,230,41,1,131,182,160,+101,142,215,0,56,71,220,230,42,0,228,29,2,128,147,224,53,0,224,17,+0,96,9,136,196,130,66,82,183,115,148,227,219,5,1,109,105,164,215,0,+64,224,25,3,2,99,97,115,224,19,9,2,108,97,115,99,254,224,20,3,+3,100,97,116,97,224,19,8,135,215,224,22,9,4,114,105,118,105,110,111,+73,224,23,4,0,111,224,17,7,1,101,108,224,125,9,5,102,111,114,97,+108,108,224,21,10,2,101,105,103,100,188,224,22,3,1,105,102,224,17,8,+104,194,224,21,8,224,57,9,3,110,102,105,120,224,20,12,224,123,8,96,+21,0,114,224,21,9,4,115,116,97,110,99,224,191,8,1,108,101,224,125,+8,137,127,224,21,7,3,110,101,119,116,169,242,224,22,3,0,111,224,210,+8,5,112,97,116,116,101,114,224,193,8,2,116,104,101,224,19,9,224,80,+10,105,219,64,20,229,168,1,224,0,8,66,54,133,77,68,208,104,98,0,+50,105,101,64,24,0,54,163,184,0,89,135,4,74,118,149,101,131,27,70,+246,192,17,164,18,132,62,119,32,162,236,195,201,2,95,52,50,81,185,0,+54,103,30,224,78,0,152,140,228,244,3,224,54,1,145,1,160,35,248,163,+0,224,130,1,164,196,196,130,164,85,228,145,0,128,194,197,234,216,18,228,+240,0,71,7,64,249,1,95,52,149,238,227,241,2,192,34,64,160,249,54,+0,96,117,232,199,4,0,53,64,104,96,89,169,2,0,56,212,110,137,7,+244,214,0,225,48,2,177,40,169,8,91,17,225,58,3,224,91,0,165,239,+108,133,170,120,68,245,64,6,64,30,65,207,97,211,104,120,193,58,224,93,+5,96,85,143,200,181,143,233,163,5,129,30,134,210,172,237,0,53,82,8,+164,216,128,239,129,124,64,40,202,53,164,177,192,102,250,130,3,225,68,1,+225,102,1,64,84,164,162,64,188,64,38,64,77,134,181,64,40,73,76,166,+115,224,2,0,128,47,235,229,0,235,238,2,128,100,224,25,10,101,254,128,+0,224,71,0,224,29,3,224,61,2,224,33,2,224,42,3,224,69,6,224,+37,11,224,2,4,224,40,1,224,113,17,224,23,0,224,44,2,177,121,224,+2,21,224,48,4,225,31,8,128,34,224,5,2,64,2,224,49,31,224,17,+6,224,53,3,225,189,0,224,1,9,224,94,5,225,27,23,224,2,3,224,+56,5,224,57,4,225,9,24,225,6,5,225,249,16,224,61,15,224,125,9,+224,65,42,224,68,11,225,40,2,224,55,12,224,2,7,224,64,9,224,134,+6,156,81,224,86,2,224,145,22,224,86,15,225,184,9,224,1,7,212,38,+136,238,240,93,2,224,0,1,224,195,13,224,2,17,225,103,12,224,138,40,+206,215,224,0,4,224,108,13,224,2,21,224,138,57,234,42,3,224,0,0,+225,177,3,192,108,161,182,224,96,6,224,177,19,224,89,8,224,143,13,224,+1,1,224,153,5,255,166,1,224,0,1,226,209,12,224,2,19,224,131,54,+144,223,224,0,5,224,116,25,192,2,227,82,15,224,131,37,239,209,5,224,+65,25,224,114,11,224,47,19,225,119,8,198,196,224,0,3,224,223,19,224,+2,9,224,126,52,231,179,0,224,63,15,224,115,28,224,106,13,128,1,224,+112,6,141,230,224,0,3,224,97,13,192,2,226,228,19,224,118,34,228,143,+9,224,115,31,224,118,52,227,240,9,227,75,14,195,240,224,92,8,224,41,+7,224,80,5,224,130,11,128,1,229,3,6,227,223,8,227,220,11,228,117,+28,224,129,5,224,124,13,225,7,8,224,126,7,230,156,1,96,44,225,19,+7,225,13,16,227,228,9,224,122,9,224,124,7,241,14,3,232,38,8,231,+31,7,136,183,224,14,15,224,154,1,224,110,3,192,142,224,19,3,225,126,+6,227,228,1,224,73,3,64,38,150,9,3,95,49,51,48,145,190,0,49,+80,10,99,150,112,142,108,77,0,57,224,18,0,228,46,4,224,127,1,64,+65,235,159,1,64,0,193,70,128,106,148,174,192,79,236,199,1,224,69,3,+235,90,12,234,83,8,224,253,7,84,31,1,95,49,241,8,1,1,35,57,+225,234,0,224,88,21,160,152,224,83,0,192,43,231,48,6,198,19,192,46,+64,14,224,40,12,163,105,224,37,0,224,34,10,128,122,211,40,224,25,3,+229,245,5,246,39,0,173,218,64,5,233,77,2,96,126,65,82,224,220,5,+97,116,64,16,1,64,80,225,59,1,226,228,8,130,62,160,236,98,93,224,+248,1,224,25,2,77,125,172,217,168,190,225,208,3,224,74,10,226,203,11,+65,10,192,139,224,18,2,226,44,5,1,95,51,93,90,226,56,0,226,55,+17,242,37,0,211,131,224,106,4,115,107,224,16,20,77,143,224,16,4,175,+246,0,48,240,87,2,5,92,34,109,104,115,47,154,43,21,47,67,111,110,+115,111,108,101,47,83,105,109,112,108,101,82,101,97,100,108,105,110,186,242,+4,49,55,57,58,53,80,128,224,136,6,163,85,225,117,1,224,233,17,224,+138,5,238,121,18,224,41,9,226,206,10,225,227,0,228,89,0,64,5,225,+144,8,227,45,8,192,62,130,181,192,65,128,8,186,27,227,220,8,226,150,+1,224,2,0,239,252,11,224,120,3,224,67,4,79,189,64,35,68,110,80,+89,132,104,224,135,1,161,255,96,128,160,5,64,136,224,132,3,245,114,2,+89,41,2,32,95,55,99,66,112,168,160,71,64,53,128,31,216,73,245,59,+1,224,42,3,64,41,64,230,226,96,12,224,0,1,224,199,0,145,108,224,+238,10,161,98,97,64,224,171,2,97,177,128,36,99,86,224,163,3,196,44,+209,5,210,114,160,54,64,219,224,243,1,128,43,128,5,224,48,5,224,55,+1,100,58,164,63,224,6,3,225,133,10,241,164,2,192,87,129,251,193,111,+227,123,18,224,168,2,128,44,225,162,9,224,235,5,224,181,11,224,174,5,+224,127,0,166,226,160,175,162,143,224,147,1,128,107,134,175,1,95,52,101,+159,160,6,225,130,1,231,38,0,128,15,247,135,5,225,3,12,226,170,2,+227,135,1,3,50,53,50,56,151,148,224,234,1,228,193,10,98,137,96,252,+194,135,96,246,236,210,0,229,68,2,92,236,212,26,225,58,1,224,241,2,+161,75,227,81,5,1,85,32,237,30,1,227,31,8,226,63,3,231,93,6,+224,95,12,225,12,2,226,204,9,224,105,2,224,32,2,227,223,15,225,51,+31,97,195,243,198,9,211,226,225,55,15,224,220,8,224,22,2,225,196,4,+96,115,228,151,1,224,171,9,226,139,5,228,126,8,161,47,164,50,130,116,+64,179,225,148,2,101,14,192,35,134,213,129,246,157,188,116,94,244,88,3,+128,43,160,72,128,2,167,9,225,223,0,97,18,103,102,160,120,227,135,3,+160,83,225,207,1,224,93,7,245,64,0,131,22,192,5,125,42,202,52,227,+213,14,97,134,224,95,7,64,90,160,8,200,126,224,169,0,224,180,7,130,+123,136,33,224,228,6,166,113,160,118,224,117,1,224,169,7,211,159,227,245,+2,227,180,4,161,18,196,56,195,117,128,219,128,81,165,220,224,200,0,229,+221,0,215,80,96,199,155,78,100,196,224,135,7,225,43,1,192,80,162,114,+192,83,227,77,4,193,21,160,155,230,142,7,228,88,14,225,211,3,96,107,+197,2,133,72,166,142,230,87,19,130,128,224,13,3,65,120,129,31,227,57,+6,230,90,2,91,198,64,185,194,227,127,25,254,203,0,232,240,1,4,94,+40,32,94,40,200,199,158,22,161,61,251,166,0,165,242,128,135,0,82,224,+10,1,224,178,10,195,136,228,166,7,235,251,12,192,20,128,200,228,63,5,+175,165,224,26,5,233,22,4,97,178,253,154,3,172,41,67,101,139,120,135,+244,249,202,3,64,23,249,215,1,101,10,96,4,161,164,162,194,96,249,70,+93,65,67,0,57,129,1,102,94,136,75,75,181,1,49,51,73,200,105,65,+3,64,64,95,54,144,196,226,129,1,231,198,3,98,54,64,234,164,20,88,+35,158,197,0,85,133,140,225,103,7,64,32,158,208,130,140,89,172,64,20,+66,145,94,251,2,51,57,49,161,5,64,20,157,23,234,16,3,0,54,233,+176,6,122,160,0,49,76,106,65,56,173,205,96,106,0,35,122,125,2,51,+52,55,235,0,43,5,53,52,58,53,58,32,66,57,224,60,1,12,103,101,+116,82,97,119,32,102,97,105,108,101,100,130,84,255,60,4,0,53,129,49,+64,183,155,152,7,94,71,69,84,82,65,87,32,64,17,0,54,251,170,0,+3,75,52,32,65,192,39,154,228,3,85,32,75,51,64,22,224,2,4,193,+97,64,38,153,236,128,38,64,106,64,19,0,51,129,26,78,206,123,248,2,+95,56,53,153,241,67,73,160,25,0,49,94,158,1,55,48,96,157,2,56,+55,55,128,30,129,158,3,95,49,49,52,96,152,129,140,64,45,1,56,53,+99,185,1,48,50,96,39,0,49,129,144,227,6,0,225,100,1,3,95,50,+52,57,100,147,163,164,225,138,17,64,67,129,134,64,85,98,8,225,78,1,+1,83,97,94,113,5,32,99,97,99,104,101,97,105,2,95,49,52,127,167,+3,51,32,95,51,99,164,2,95,55,56,203,192,2,95,50,53,64,89,160,+16,64,158,130,26,64,131,2,95,50,53,64,226,64,34,0,54,128,186,129,+126,64,23,76,10,0,53,95,226,64,22,129,131,6,95,49,51,52,48,32,+85,155,59,230,98,9,229,60,0,156,27,99,212,1,51,51,192,135,198,41,+134,44,224,35,12,230,76,0,188,92,96,25,3,95,49,51,56,67,84,124,+122,224,37,0,224,34,7,1,52,49,96,5,0,56,109,185,192,13,164,122,+243,98,0,160,45,1,50,53,244,92,0,224,43,1,141,46,64,235,130,89,+224,235,0,230,135,4,192,2,194,98,225,9,20,224,5,14,224,224,10,160,+125,192,84,225,41,1,224,2,6,224,55,5,2,50,53,48,242,65,3,224,+54,8,162,129,133,44,225,146,11,224,51,7,233,140,2,160,46,113,255,64,+47,129,40,224,53,9,225,238,15,225,202,0,225,234,13,225,195,10,193,149,+225,210,15,69,9,224,241,6,225,191,2,70,239,224,50,12,2,49,51,56,+229,114,0,226,25,5,129,237,132,32,225,237,1,224,217,1,226,132,10,1,+49,51,142,77,226,171,22,1,49,51,204,118,226,171,12,130,206,166,201,224,+21,7,234,207,0,64,156,164,169,227,118,14,224,164,49,225,39,5,64,46,+64,122,236,74,3,161,170,102,241,65,248,128,8,3,56,32,64,83,71,72,+242,135,0,224,75,0,0,53,225,81,1,165,68,96,180,0,67,160,121,64,+48,64,27,197,65,228,71,25,224,181,16,69,106,224,167,0,226,189,4,224,+46,12,225,11,0,226,181,4,224,42,6,192,36,225,47,29,162,87,224,89,+3,225,47,31,225,49,13,166,72,226,131,3,224,129,14,130,202,224,21,7,+226,211,3,96,81,67,37,224,81,0,0,80,238,57,2,226,45,6,227,52,+27,229,111,20,132,183,160,21,2,50,53,48,224,15,4,224,96,30,64,175,+168,173,96,175,224,99,4,0,50,232,26,1,64,92,224,36,3,0,52,134,+21,64,30,64,29,0,54,166,213,76,105,64,23,0,52,97,118,64,25,133,+208,228,214,2,161,172,64,27,131,254,160,226,213,47,3,67,32,95,55,99,+20,0,57,202,16,233,56,5,137,107,86,243,171,122,66,0,192,60,1,95,+55,64,245,2,50,53,48,99,223,240,19,10,64,27,64,55,2,95,52,53,+138,39,64,135,131,233,64,135,0,95,98,88,128,38,67,145,64,29,131,82,+11,73,79,46,115,101,114,105,97,108,105,122,101,72,128,64,30,73,43,18,+97,100,100,95,108,122,55,55,95,99,111,109,112,114,101,115,115,111,114,96,+30,130,86,0,85,169,22,0,90,224,1,14,0,75,225,233,1,225,144,0,+104,165,170,62,2,56,52,53,111,34,4,49,32,95,56,56,107,171,128,236,+96,23,104,209,0,53,86,88,72,206,105,5,0,50,107,26,1,64,75,137,+223,96,37,162,254,64,87,129,232,72,121,1,52,57,76,125,5,57,49,50,+32,95,57,101,249,64,30,129,226,108,163,64,75,232,246,5,12,42,42,42,+32,69,120,99,101,112,116,105,111,110,138,98,96,52,129,249,77,10,69,205,+64,89,0,52,65,220,96,152,96,24,65,129,224,177,4,99,160,129,240,224,+222,2,0,57,71,250,237,74,2,171,133,145,25,64,7,224,49,10,240,57,+0,224,31,14,199,216,232,64,6,224,142,1,224,61,3,193,67,224,81,4,+0,56,175,215,128,14,66,23,0,52,164,121,163,214,153,164,76,26,1,85,+32,110,207,107,42,128,69,100,153,67,93,64,245,197,56,3,85,32,90,32,+64,3,226,245,1,128,138,192,126,100,187,0,51,64,52,1,49,52,76,92,+205,111,225,207,0,96,87,0,80,128,31,229,4,0,224,0,0,4,95,49,+52,52,56,64,66,64,27,64,119,0,51,140,253,65,145,199,109,1,52,53,+67,194,0,55,75,197,64,6,107,95,96,40,97,175,2,80,32,35,97,56,+0,85,128,22,130,253,169,138,177,14,144,80,225,79,0,104,233,225,206,14,+225,96,4,144,155,224,16,2,248,30,15,192,108,97,116,225,182,0,67,199,+225,183,1,225,212,4,225,164,2,146,34,142,17,205,240,192,94,226,65,15,+226,4,3,226,68,15,224,112,0,201,213,192,154,226,78,60,160,32,2,49,+51,51,96,111,162,83,160,61,0,85,103,152,170,78,163,22,128,79,250,188,+0,243,204,3,97,43,1,54,56,64,93,0,56,85,142,0,49,233,247,0,+224,26,4,77,124,160,26,86,209,160,21,0,50,224,48,2,198,126,161,97,+143,196,64,36,135,108,1,55,54,70,97,130,133,66,106,255,195,6,228,130,+7,226,196,4,0,85,142,76,96,39,113,30,67,55,160,248,0,54,167,135,+83,197,4,61,61,32,64,35,64,228,1,95,49,99,13,64,38,110,3,160,+60,66,162,168,215,206,56,0,56,111,70,110,25,102,71,110,96,96,40,207,+192,0,89,164,129,0,56,78,161,65,22,160,16,0,80,128,131,129,155,149,+156,171,69,227,202,0,64,29,64,155,65,11,65,9,227,129,1,0,58,129,+23,197,96,113,222,2,50,52,56,131,93,64,39,229,13,0,0,55,66,23,+64,8,2,57,52,53,64,4,96,222,0,57,67,182,1,57,53,70,116,176,+123,229,123,1,20,116,114,97,110,115,108,97,116,101,58,32,110,111,116,32,+102,111,117,110,100,32,101,129,1,95,56,170,236,65,193,0,52,65,32,64,+108,197,200,0,89,227,174,6,181,61,227,54,0,147,238,160,206,226,65,1,+65,211,1,32,64,179,168,210,11,67,187,250,190,1,64,17,177,151,5,67,+32,60,32,64,35,129,144,244,109,1,224,32,8,197,53,194,76,224,32,8,+226,163,0,224,65,15,171,34,161,143,181,229,98,31,224,25,0,3,85,32,+64,90,132,69,97,191,99,80,0,57,72,206,1,52,48,68,242,81,159,225,+85,1,5,100,121,110,115,121,109,179,101,96,245,71,180,1,95,49,180,101,+128,0,224,107,8,96,27,0,85,225,199,1,72,51,241,171,6,12,115,114,+99,47,77,105,99,114,111,72,115,47,84,193,186,145,159,4,54,50,58,51,+51,167,61,225,230,13,65,226,6,32,112,114,105,109,111,112,161,226,240,94,+7,129,237,0,55,84,57,242,241,3,66,108,202,133,0,64,82,197,129,198,+148,98,1,50,52,233,242,0,131,210,0,83,171,235,225,94,1,100,73,151,+252,116,112,2,50,52,56,237,71,0,225,3,6,96,74,121,50,198,213,130,+22,225,176,6,201,159,224,103,5,64,163,224,59,2,224,113,2,1,49,56,+195,78,224,50,6,64,245,224,50,1,224,120,4,225,127,39,3,53,58,49,+48,225,127,22,9,105,109,112,111,115,115,105,98,108,101,160,40,129,129,2,+49,52,51,161,94,67,98,0,54,228,115,1,0,55,68,87,132,122,96,38,+98,69,64,9,1,56,53,79,187,103,204,160,53,176,221,0,52,81,223,4,+49,50,56,32,73,65,103,82,202,96,29,135,159,8,79,32,80,32,79,32,+35,54,54,135,184,68,134,160,18,1,55,57,128,18,0,79,224,18,2,0,+53,128,18,128,22,0,80,224,204,2,1,67,39,64,187,77,205,192,43,70,+43,64,39,67,125,192,18,160,62,69,139,224,62,5,0,83,96,62,100,32,+160,43,70,74,64,43,68,249,192,125,168,92,68,41,192,37,160,18,67,193,+192,18,160,100,68,65,192,18,160,201,95,252,224,119,5,0,66,96,119,86,+157,192,43,65,93,64,43,72,26,192,62,0,50,128,18,86,246,224,62,5,+1,75,50,64,62,100,180,224,24,6,0,51,96,24,65,193,224,24,6,0,+52,96,24,66,210,225,64,7,0,66,129,65,225,129,2,77,230,64,120,0,+43,224,18,2,160,221,0,45,224,18,2,160,158,0,42,224,83,8,3,113,+117,111,116,64,84,64,7,224,28,8,1,114,101,100,140,2,114,101,109,224,+26,8,0,117,192,56,96,8,224,30,9,160,58,64,7,224,28,8,2,110,+101,103,64,27,2,110,101,103,224,26,8,1,97,110,118,15,2,97,110,100,+224,26,8,1,111,114,64,25,1,111,114,224,24,8,0,120,128,25,0,120,+224,26,10,2,105,110,118,64,26,2,105,110,118,224,26,8,2,115,104,108,+64,26,2,115,104,108,224,26,10,96,80,1,115,104,224,80,9,0,97,160,+27,64,7,224,55,9,5,117,98,116,114,97,99,97,22,192,11,224,36,8,+6,112,111,112,99,111,117,110,96,36,192,11,224,36,8,2,99,108,122,64,+31,2,99,108,122,224,26,9,0,116,128,26,0,116,224,26,9,1,61,61,+64,25,69,15,224,24,6,0,47,96,24,0,47,192,24,67,102,162,194,0,+60,224,43,8,0,60,96,43,0,60,224,43,3,162,60,0,62,224,43,8,+0,62,96,43,0,62,224,112,9,1,117,60,64,24,0,117,224,93,9,0,+117,128,94,0,117,224,95,0,224,26,2,0,62,96,25,224,101,9,0,117,+128,102,0,117,224,103,10,1,111,114,98,46,1,111,114,226,46,9,0,99,+129,168,0,99,225,167,10,1,102,43,64,25,0,102,195,50,224,24,2,0,+45,96,24,195,56,224,24,2,0,42,96,24,227,62,9,1,102,47,96,24,+0,47,224,24,9,129,140,0,102,225,141,10,0,102,129,142,0,102,225,143,+0,224,26,2,97,55,0,102,225,55,9,0,102,129,55,0,102,225,55,10,+0,102,97,55,0,102,225,55,9,0,102,129,55,0,102,225,55,10,0,102,+163,130,64,7,224,28,8,3,105,116,111,102,64,28,64,7,224,28,8,0,+73,160,28,64,7,224,28,8,0,100,97,88,0,100,225,88,9,0,100,97,+88,0,100,225,88,9,0,100,97,88,0,100,225,88,9,0,100,97,88,0,+100,225,88,9,0,100,129,88,0,100,225,88,10,0,100,129,88,0,100,225,+88,10,0,100,97,88,0,100,225,88,9,0,100,129,88,0,100,225,88,10,+0,100,97,88,0,100,225,88,9,0,100,129,88,0,100,225,88,10,0,100,+161,88,64,7,225,88,11,98,174,64,7,225,88,11,96,28,64,7,224,28,+8,2,115,101,113,64,27,2,115,101,113,224,84,9,2,99,109,112,96,84,+2,99,109,112,224,28,8,0,117,160,28,64,7,224,28,8,1,114,110,97,+201,1,114,110,225,229,10,2,79,46,62,128,228,128,9,224,32,13,224,31,+0,224,30,11,5,114,101,116,117,114,110,160,34,128,12,224,38,11,2,112,+114,105,133,11,192,11,224,36,11,242,230,0,160,40,242,246,1,224,44,10,+1,100,101,224,46,7,224,17,2,224,93,12,2,116,100,105,192,168,96,11,+224,36,14,1,111,117,192,168,128,12,224,38,14,1,101,114,100,120,224,12,+0,224,38,11,7,103,101,116,65,114,103,82,101,131,74,224,15,2,225,34,+12,7,101,114,102,111,114,109,73,79,193,38,192,15,224,89,12,0,99,192,+82,0,99,224,159,13,2,97,116,115,224,158,0,2,97,116,115,226,21,9,+2,97,105,115,97,56,96,8,224,30,8,4,99,97,116,99,104,64,30,96,+8,224,30,8,236,193,1,128,9,224,32,8,12,110,101,119,67,65,83,116,+114,105,110,103,76,101,97,117,224,17,5,224,48,8,4,112,97,99,107,67,+128,30,64,45,224,14,2,224,42,19,160,91,224,17,5,224,48,8,2,116,+111,73,130,124,96,8,224,30,10,1,80,116,97,203,96,8,224,30,10,1,+68,98,104,67,96,8,224,30,10,1,70,108,160,92,1,70,108,224,92,9,+64,9,160,63,160,10,224,34,12,160,67,160,10,224,100,11,1,117,110,224,+165,0,128,11,224,36,8,5,65,46,97,108,108,111,98,24,160,10,224,34,+10,3,99,111,112,121,128,33,64,9,224,32,10,0,115,163,80,128,9,224,+32,10,2,114,101,97,100,193,128,9,224,32,10,3,119,114,105,116,160,66,+96,10,224,34,10,3,116,114,117,110,160,168,96,10,224,34,10,133,255,64,+7,224,28,8,2,98,115,43,102,129,64,7,224,28,12,0,46,192,29,0,+46,224,30,10,128,88,64,7,224,28,10,134,90,64,7,224,28,10,102,92,+1,98,115,230,93,9,1,98,115,134,94,64,7,224,28,10,101,65,1,98,+115,229,63,9,1,98,115,133,125,64,7,224,28,10,165,213,96,8,224,30,+10,66,245,128,31,64,9,224,32,10,1,117,110,224,34,1,128,11,224,36,+10,6,114,101,112,108,105,99,97,129,177,224,14,2,224,42,10,4,108,101,+110,103,116,100,21,192,11,224,36,10,3,115,117,98,115,130,168,192,11,224,+36,10,4,105,110,100,101,120,128,35,96,10,224,34,10,226,69,0,160,10,+224,34,8,192,9,64,35,224,21,0,224,36,7,1,116,111,192,34,128,9,+224,32,8,3,104,101,97,100,192,34,192,11,224,69,9,2,97,105,108,224,+71,0,160,11,224,143,9,0,112,138,111,0,112,234,112,10,1,112,50,97,+201,64,7,224,28,10,2,110,101,119,128,29,2,110,101,119,224,30,10,0,+102,134,182,96,8,224,90,11,0,98,101,233,96,8,225,71,10,1,50,102,+162,68,1,50,102,224,123,9,5,73,79,46,102,111,114,98,34,160,10,224,+34,11,2,116,104,105,136,179,128,10,225,30,9,2,104,110,117,102,12,96,+8,224,65,13,4,114,111,119,116,111,224,68,0,96,13,224,40,11,3,121,+105,101,108,192,107,96,11,224,36,11,5,110,101,119,109,118,97,199,126,160,+13,224,118,12,2,97,107,101,224,41,2,192,14,224,42,11,2,112,117,116,+224,41,2,160,13,224,40,11,68,244,224,41,2,192,14,224,126,12,1,114,+121,224,129,7,224,17,1,224,48,14,224,135,5,224,16,1,224,46,14,224,+141,6,224,17,2,225,134,14,6,101,97,100,100,101,108,97,102,3,224,17,+5,224,48,17,4,115,116,97,116,117,200,78,224,18,3,224,50,8,1,105,+115,169,230,96,8,224,30,8,1,83,80,162,234,96,8,224,30,10,2,100,+101,114,137,44,160,10,224,34,10,2,102,114,101,100,22,128,9,224,180,9,+99,132,0,73,227,131,9,0,73,108,155,0,73,236,155,9,0,73,108,155,+0,73,236,155,9,0,73,208,251,96,8,224,30,9,176,251,64,7,224,28,+9,241,56,0,128,9,224,32,10,192,62,241,59,12,0,73,172,96,64,7,+224,28,9,177,62,64,7,224,28,9,145,38,0,73,241,38,10,0,73,177,+66,64,7,224,28,9,177,41,64,7,224,28,11,128,57,241,15,11,0,73,+209,45,96,8,224,30,9,177,157,64,7,224,88,10,241,76,2,224,12,0,+224,38,9,241,78,3,224,12,0,224,38,9,177,80,64,7,224,28,10,145,+82,64,7,224,28,9,136,21,0,73,232,20,10,0,73,136,19,0,73,232,+18,10,0,73,104,17,0,73,232,16,9,0,73,136,15,0,73,232,14,10,+0,73,141,79,237,76,10,173,137,237,134,11,205,253,96,8,224,30,9,145,+135,0,73,241,136,10,0,73,177,137,64,7,224,28,10,128,139,241,140,10,+0,73,177,141,64,7,224,28,10,192,142,238,112,12,3,105,116,111,73,64,+29,64,7,224,59,9,2,116,111,105,96,58,2,116,111,105,224,28,8,3,+117,116,111,85,64,28,64,7,224,28,8,3,85,116,111,117,64,28,64,7,+224,28,8,1,87,107,164,89,96,8,224,30,13,167,71,192,11,224,36,10,+228,126,0,160,10,224,34,10,3,102,105,110,97,99,39,160,10,224,224,9,+109,230,8,109,97,115,107,105,110,103,115,116,169,88,224,21,9,224,56,11,+0,115,224,56,12,224,21,6,183,116,224,0,187,88,123,159,253,6,95,56,+54,57,32,75,32,90,61,159,139,222,105,89,197,96,43,224,14,5,224,11,+2,94,202,251,55,0,64,81,0,50,224,81,7,254,184,2,224,78,25,192,+8,224,86,4,96,87,189,237,224,169,3,64,1,64,173,224,175,10,224,63,+2,64,60,222,1,224,39,8,224,154,42,89,8,128,86,64,97,1,10,65,+90,176,94,39,0,48,222,227,91,166,2,50,52,55,159,130,122,60,255,202,+6,64,1,96,183,224,10,13,0,83,94,124,126,130,64,8,1,95,56,255,+60,0,64,85,155,0,123,204,224,32,13,123,207,160,78,255,120,2,253,131,+3,160,193,224,198,0,222,164,223,31,192,201,3,95,56,54,49,96,202,155,+0,252,15,0,253,204,5,2,32,95,52,158,140,124,88,224,141,2,123,163,+1,54,50,224,156,3,156,140,224,150,1,126,107,0,83,255,136,11,0,83,+191,136,161,141,129,230,156,29,193,68,190,214,191,172,129,96,3,95,49,52,+55,64,92,0,48,97,39,155,157,1,50,52,91,46,96,0,64,191,223,208,+64,31,1,55,54,128,31,125,73,129,12,159,68,7,85,32,75,50,32,75,+52,32,91,33,96,22,0,54,160,22,0,90,96,1,122,55,128,24,155,219,+97,225,157,5,226,11,5,193,137,0,56,94,52,225,184,1,64,16,0,51,+93,165,129,18,96,34,65,220,0,95,161,108,157,173,124,168,3,64,95,56,+53,64,159,160,14,250,123,2,65,15,0,95,99,195,1,95,52,95,11,2,+95,52,54,192,217,129,140,0,80,65,20,0,95,96,211,252,245,8,11,67,+97,110,110,111,116,32,102,105,110,100,32,78,156,3,97,103,101,32,68,242,+65,245,192,185,98,181,225,214,7,192,204,1,95,52,96,150,4,64,64,95,+57,57,160,118,65,15,156,205,125,8,65,124,0,55,92,126,64,34,1,54,+32,96,30,132,112,226,107,18,223,211,66,13,226,40,6,96,21,66,9,163,+33,127,141,226,111,2,161,52,2,52,49,55,64,18,65,88,0,67,64,13,+3,57,32,64,35,93,107,224,185,0,64,35,66,32,225,19,8,5,99,111,+109,112,105,108,82,245,14,117,115,101,100,32,98,111,111,116,32,109,111,100,+117,108,225,26,7,192,107,227,247,8,1,49,55,67,240,195,247,230,42,0,+64,249,165,24,4,49,55,51,48,32,64,15,132,208,130,235,96,222,192,221,+192,7,163,103,124,136,0,67,162,89,129,215,128,250,161,0,224,127,1,130,+50,0,56,64,15,64,132,1,57,49,97,150,64,237,1,50,54,225,189,2,+2,55,57,52,64,162,96,169,194,44,192,1,71,248,224,16,4,131,120,224,+16,2,96,100,225,181,1,0,53,66,179,0,57,255,150,0,224,41,7,225,+225,8,2,49,55,51,131,59,128,0,228,235,5,96,235,64,52,224,247,0,+225,4,0,64,2,94,92,224,96,1,194,4,226,154,6,66,111,65,6,7,+55,51,53,32,64,85,32,75,67,200,224,111,14,64,11,226,66,10,65,198,+1,48,48,98,67,100,183,2,49,55,51,163,127,226,61,21,13,116,121,112,+101,32,99,104,101,99,107,101,100,58,94,108,215,99,161,131,196,2,49,52,+51,64,254,1,51,50,67,15,224,52,1,0,45,64,0,160,44,192,0,225,+106,30,225,103,6,229,235,3,64,0,225,57,4,192,8,229,250,0,193,97,+225,109,0,192,2,160,32,224,31,8,229,142,4,199,28,224,51,2,227,16,+0,64,98,1,95,49,130,124,133,70,224,115,0,66,157,2,48,32,95,70,+112,64,0,4,95,49,49,51,53,192,14,96,42,101,110,96,0,1,85,32,+127,180,96,0,224,163,2,96,18,224,155,2,99,5,128,143,96,5,3,95,+50,52,54,135,247,3,95,49,56,50,229,13,0,2,64,64,89,230,94,0,+231,135,3,232,235,1,231,143,9,128,113,166,45,231,50,3,224,74,9,197,+248,128,86,3,67,32,67,32,76,201,0,35,231,138,1,67,86,162,88,224,+147,2,132,23,232,155,5,131,128,193,142,232,47,1,225,157,4,225,173,0,+167,13,225,152,7,193,139,161,191,128,158,224,37,0,65,156,97,35,8,95,+50,52,52,49,32,95,57,52,128,168,161,103,64,68,0,83,64,56,105,184,+0,85,167,239,71,247,192,215,66,207,65,161,133,148,96,112,69,186,0,53,+160,70,193,10,192,122,64,21,226,131,0,192,16,224,195,4,224,220,4,224,+25,36,193,151,225,34,7,97,1,132,82,96,17,128,6,224,60,0,128,32,+64,179,0,56,99,200,2,55,52,52,66,155,5,53,53,32,95,49,50,67,+249,104,63,2,95,55,48,98,131,99,241,0,56,67,195,70,209,0,54,64,+55,101,96,134,219,128,126,128,33,68,111,224,15,5,194,209,97,120,1,56,+50,102,148,96,130,2,95,55,50,65,132,128,146,0,95,132,96,98,34,1,+51,55,67,242,136,192,64,30,233,27,5,160,252,192,46,128,205,97,247,133,+32,65,164,64,18,64,44,100,249,163,125,193,12,162,129,96,142,0,50,104,+53,130,152,2,50,52,49,96,242,2,49,57,51,196,97,161,222,161,5,64,+190,72,72,2,95,50,50,230,56,0,2,83,32,83,128,202,0,57,65,14,+2,50,48,54,160,6,64,205,2,95,50,48,71,243,2,64,95,50,162,243,+0,83,97,173,160,96,64,6,103,233,64,100,194,150,0,55,132,220,161,18,+65,108,130,76,105,89,137,224,0,39,64,169,0,54,133,125,2,56,50,51,+165,92,227,221,12,192,70,96,125,65,238,0,80,65,29,0,79,169,58,160,+0,192,239,192,143,3,95,50,52,51,193,212,228,209,0,224,70,1,194,87,+100,227,1,50,52,74,61,195,61,228,96,13,128,9,96,10,231,218,3,128,+241,236,189,1,226,216,0,224,103,1,64,13,96,102,0,55,138,57,224,0,+3,202,215,137,238,0,58,132,243,76,137,67,146,203,59,224,115,11,232,94,+5,224,202,0,64,18,164,162,96,243,192,127,227,128,1,224,2,0,224,138,+0,224,33,16,224,36,3,224,37,30,231,204,0,231,148,1,196,217,97,39,+67,176,129,48,228,202,0,225,66,0,164,77,160,84,233,31,0,64,5,64,+3,164,142,229,75,4,99,109,192,11,2,50,52,54,235,130,0,69,160,1,+54,54,227,255,0,161,153,199,192,1,57,51,76,22,96,23,108,56,102,177,+224,22,4,192,205,224,86,1,224,83,9,192,48,225,212,0,1,95,49,172,+125,64,0,196,183,224,2,17,230,137,3,225,4,0,128,1,225,87,10,224,+28,17,225,147,3,230,70,0,129,5,161,45,64,11,97,108,160,20,224,8,+2,3,95,49,51,56,235,9,1,161,149,231,2,0,224,198,4,64,15,226,+2,3,0,89,160,32,225,148,6,225,226,1,96,224,96,103,64,42,192,19,+197,87,96,130,160,173,226,77,4,224,92,2,160,62,192,196,136,35,224,5,+2,193,66,224,57,3,166,157,224,25,10,160,2,224,25,17,226,146,0,225,+113,4,192,164,64,19,226,221,1,225,39,5,133,148,66,91,230,116,1,224,+70,3,231,180,2,229,188,3,224,224,10,70,202,103,211,128,39,134,91,64,+53,131,214,227,241,2,64,126,2,95,50,49,65,189,230,108,10,224,28,16,+64,96,228,135,4,102,96,83,34,224,20,1,224,246,2,226,20,3,232,161,+4,128,210,160,247,224,128,7,224,215,0,224,236,3,224,218,0,198,146,224,+249,2,199,219,226,93,11,226,193,1,228,72,1,226,92,255,194,80,225,37,+0,64,219,224,15,1,64,195,64,10,234,174,4,224,246,10,7,32,83,32,+85,32,95,49,53,141,209,64,16,238,191,11,71,115,64,21,161,200,69,26,+71,50,229,50,0,226,176,1,64,0,226,87,14,225,152,3,96,121,226,93,+28,242,13,4,96,39,96,27,192,152,224,223,0,224,219,1,194,109,74,20,+64,147,224,223,2,96,0,239,169,0,227,88,13,1,49,51,80,105,224,121,+8,224,138,11,240,198,1,163,119,136,202,227,193,20,160,215,224,192,2,77,+64,1,49,48,169,145,99,77,80,166,224,101,1,231,24,0,160,3,243,105,+9,232,162,20,98,243,225,249,3,163,64,243,160,44,227,238,9,226,100,8,+96,0,225,113,4,128,179,64,40,0,80,138,7,131,72,161,2,226,102,3,+204,227,237,222,7,237,118,3,226,93,6,233,180,1,224,89,8,163,175,64,+251,64,66,65,62,135,179,224,80,4,224,75,16,225,215,1,225,180,0,96,+12,235,147,2,224,72,4,226,238,2,64,0,73,211,149,150,0,85,96,128,+1,95,56,78,204,67,58,2,54,32,35,139,161,64,34,148,172,65,67,1,+54,56,81,212,0,50,117,138,64,25,0,54,192,25,0,56,66,145,234,247,+0,64,26,148,177,2,82,32,90,98,117,2,57,52,53,202,196,7,95,57,+52,56,32,95,57,53,140,20,240,221,6,84,44,9,101,120,112,111,114,116,+101,100,58,32,243,14,5,64,85,147,247,225,57,1,225,147,0,98,2,229,+160,0,237,255,0,161,112,224,37,4,224,21,2,226,92,2,160,59,224,32,+3,224,2,4,161,57,224,112,1,224,25,7,228,40,1,98,239,101,30,224,+42,3,224,105,0,224,11,1,0,83,67,90,136,226,230,45,28,160,167,229,+125,0,98,50,175,45,116,123,227,42,2,143,226,192,13,163,99,192,155,229,+97,5,166,76,192,157,227,113,4,228,188,2,96,56,96,43,3,95,49,55,+53,242,2,1,96,0,224,230,0,96,103,161,130,231,20,9,224,38,50,161,+89,166,19,134,60,228,104,19,225,40,14,164,20,128,108,97,36,128,10,100,+90,224,21,14,165,206,237,229,0,65,243,0,83,198,105,228,72,5,128,0,+128,60,225,182,27,150,136,225,111,1,225,182,3,224,146,2,196,250,224,13,+13,225,235,5,224,27,0,210,182,230,130,1,108,200,224,185,1,224,0,3,+230,114,0,224,183,29,224,182,18,224,171,88,224,170,37,227,24,21,224,170,+91,132,52,234,75,20,228,145,0,243,107,8,131,156,163,180,199,41,192,26,+168,221,192,16,233,176,0,128,14,225,16,14,231,7,0,192,54,192,233,225,+20,20,228,239,1,192,82,224,64,3,165,4,96,12,237,100,1,128,45,236,+79,3,128,1,97,42,0,51,161,42,132,114,0,66,165,72,81,216,195,77,+1,95,49,113,235,224,0,0,224,108,1,224,230,27,228,160,0,224,165,1,+224,230,6,229,115,0,224,20,1,229,26,14,224,122,1,224,249,8,224,221,+48,96,0,98,31,178,211,64,8,146,245,2,95,49,55,150,174,194,37,164,+251,129,91,96,80,64,79,71,136,242,78,4,229,151,0,225,169,1,224,69,+3,128,13,160,62,129,154,3,50,48,52,48,208,109,160,60,210,172,0,90,+83,43,128,134,163,112,160,201,96,123,224,80,1,128,79,116,20,224,78,3,+98,55,97,253,0,57,69,30,1,95,56,120,146,195,17,224,170,1,3,95,+49,57,50,128,243,115,27,71,228,0,51,231,228,2,224,184,2,231,123,5,+160,17,128,145,64,148,83,120,96,23,136,26,0,67,88,167,65,132,232,126,+35,8,117,110,100,101,102,105,110,101,100,187,144,232,130,7,96,207,116,64,+243,136,11,118,202,96,4,64,1,229,189,2,160,10,161,115,130,48,241,97,+3,129,66,84,183,117,207,192,6,96,0,192,54,64,246,64,19,235,206,2,+128,232,227,154,7,194,179,224,21,6,109,30,225,197,0,194,229,205,45,227,+105,0,132,215,82,120,228,166,0,162,123,0,83,106,72,246,183,2,2,49,+52,56,133,91,226,1,1,224,147,0,64,16,67,109,224,123,1,176,18,99,+24,192,110,246,17,1,138,172,138,250,236,152,0,96,66,97,61,131,226,176,+51,224,132,4,2,50,52,54,197,224,162,90,64,73,199,146,96,126,141,111,+92,22,162,1,182,145,224,127,4,96,177,94,11,224,56,2,224,183,32,1,+64,75,224,58,0,192,64,66,199,157,139,1,75,50,132,39,85,97,224,94,+0,194,156,96,39,157,163,129,69,1,95,51,96,38,173,151,128,234,2,49,+51,50,67,90,115,192,191,166,119,251,83,239,96,22,3,95,50,51,50,97,+25,128,28,64,83,249,239,1,65,191,0,80,99,88,65,233,222,12,130,69,+163,58,1,95,51,95,49,130,210,151,42,226,210,4,130,192,64,20,128,40,+224,0,3,130,224,240,29,2,224,75,22,224,67,10,128,66,192,68,224,30,+1,235,27,0,64,186,140,166,226,96,1,162,215,226,165,4,224,9,4,224,+29,1,224,9,4,160,59,172,32,224,49,3,161,43,109,132,77,67,66,237,+0,57,65,86,104,236,99,42,0,52,216,18,65,232,67,35,249,166,12,66,+191,0,51,65,155,95,2,64,30,228,123,0,132,140,3,49,57,52,48,160,+63,0,85,129,28,0,90,129,98,224,4,1,160,21,224,23,10,142,35,248,+6,13,164,104,240,180,5,131,208,1,52,57,121,84,1,52,52,162,60,129,+12,234,208,0,133,61,248,182,7,234,217,11,224,183,6,224,163,0,96,15,+226,47,6,224,7,9,236,224,27,224,201,2,128,16,224,207,25,96,39,233,+150,1,232,115,3,196,255,225,35,1,240,91,0,134,130,193,154,0,67,131,+161,96,51,225,8,8,224,0,3,69,50,132,62,1,95,57,103,204,1,95,+57,102,29,160,120,225,249,15,164,72,225,252,37,225,65,5,241,101,4,97,+76,230,56,0,230,142,23,243,121,9,192,39,225,93,19,129,15,226,45,31,+128,228,224,85,25,114,188,224,85,31,226,130,11,69,76,69,135,166,31,224,+239,9,228,181,6,193,251,193,75,226,95,1,224,13,5,200,77,96,153,160,+43,238,131,2,132,23,160,208,226,73,2,160,34,224,61,0,0,80,129,156,+227,161,13,238,91,0,227,26,7,160,132,224,10,2,225,175,1,133,196,225,+49,6,71,113,175,5,166,170,233,109,8,193,72,66,233,249,254,2,253,101,+1,0,57,125,68,160,118,163,132,224,156,13,243,162,17,192,54,193,56,227,+124,1,225,51,0,193,40,133,93,64,52,224,93,2,0,83,160,53,102,210,+226,120,3,146,147,237,199,4,2,95,57,52,233,173,2,31,92,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,92,34,44,50,57,55,2,58,52,53,169,192,1,64,85,102,139,193,+11,227,150,3,227,238,14,224,217,26,160,197,64,220,228,74,7,224,80,6,+228,91,2,224,0,2,64,231,223,249,126,101,2,57,55,48,228,18,1,200,+250,224,16,8,3,95,49,57,56,207,126,128,71,188,38,155,239,133,147,228,+15,16,226,66,6,74,115,233,14,0,224,0,5,2,95,49,56,114,84,3,+95,49,57,55,108,101,130,44,131,27,224,5,0,64,64,1,57,56,105,27,+99,168,224,6,5,224,14,0,101,21,103,44,75,245,160,9,72,185,167,54,+0,95,159,149,71,233,148,109,3,85,32,75,52,96,191,64,18,0,54,199,+252,0,95,64,50,229,97,1,2,56,50,50,167,191,170,32,98,63,65,79,+0,51,94,171,65,157,160,18,105,177,1,53,52,67,31,193,60,172,38,129,+15,160,37,101,191,224,57,24,160,212,98,81,204,206,99,79,64,171,148,247,+192,130,64,17,148,179,98,230,235,35,6,128,11,97,143,151,149,240,6,0,+184,204,130,95,8,95,49,56,57,54,32,79,32,35,73,5,194,87,224,59,+0,224,42,2,131,253,77,182,170,223,196,146,3,95,49,53,50,64,24,1,+53,50,65,101,226,159,2,128,53,224,28,2,235,0,1,128,78,0,49,112,+216,128,8,195,66,96,58,224,124,1,224,164,3,227,156,1,1,91,93,131,+121,224,40,6,224,162,1,99,15,132,13,224,158,15,224,153,12,172,42,160,+224,159,26,196,70,81,134,193,23,133,29,225,40,2,237,4,0,225,22,0,+135,144,96,86,128,134,0,55,231,201,0,142,70,109,238,226,246,0,165,101,+96,87,64,127,65,15,230,159,1,160,85,224,203,5,225,96,17,128,167,130,+204,129,94,130,107,1,48,55,75,250,161,106,64,101,3,95,56,51,54,97,+93,207,46,5,51,32,95,50,51,52,200,222,64,96,245,5,7,164,155,240,+154,1,2,95,50,55,64,128,66,145,67,214,1,32,95,79,215,4,95,49,+53,57,32,243,201,0,96,44,69,100,224,43,2,85,44,66,253,173,97,72,+188,0,56,67,117,76,119,0,50,76,222,96,90,128,139,0,85,128,74,64,+211,2,56,50,54,96,126,0,56,80,71,175,99,2,79,32,35,67,78,161,+214,4,52,54,32,95,51,144,179,80,253,0,56,64,9,67,42,0,51,195,+60,0,57,65,48,236,219,10,64,36,141,86,99,247,139,198,161,222,232,118,+0,193,185,131,83,163,27,131,84,226,169,11,1,45,62,130,169,129,223,64,+31,101,199,73,191,231,68,3,160,68,163,156,226,244,13,0,61,160,74,226,+46,2,0,80,106,8,65,33,160,72,96,26,166,59,227,233,16,0,49,65,+66,227,234,17,64,84,1,49,48,97,186,137,91,227,64,14,82,138,0,51,+69,197,66,89,96,8,3,95,50,51,48,178,154,128,94,225,25,4,161,213,+225,9,0,128,15,64,192,64,51,224,48,10,227,244,14,224,64,38,6,79,+32,35,56,53,57,52,192,241,225,136,20,228,119,13,64,65,0,54,229,30,+2,225,127,16,193,83,225,85,2,132,65,224,16,2,98,85,241,69,22,131,+100,113,145,128,10,229,100,18,206,216,111,175,97,133,97,143,0,56,169,123,+64,36,227,228,7,227,139,24,197,73,243,88,0,226,7,20,78,189,64,120,+193,253,226,23,0,197,210,80,144,66,114,65,114,64,58,128,85,99,193,66,+141,0,48,195,186,67,127,144,174,3,35,49,53,32,64,13,144,104,192,94,+99,202,160,6,0,58,129,245,64,29,97,163,2,95,50,49,68,2,64,22,+143,205,224,52,6,224,65,9,96,43,232,15,0,128,224,100,124,113,11,94,+236,79,158,252,168,0,78,12,81,112,235,104,0,0,83,163,176,130,114,224,+5,4,66,20,133,184,193,203,2,95,57,57,99,24,104,85,66,19,101,152,+245,199,1,234,252,1,224,41,21,96,137,200,5,255,173,0,101,141,81,233,+2,95,52,56,115,226,126,163,96,200,0,35,142,196,228,224,0,64,151,160,+241,0,75,64,162,64,18,133,24,73,55,2,57,54,50,133,89,227,117,1,+10,80,114,105,109,105,116,105,118,101,115,46,164,203,67,22,1,54,51,66,+29,1,54,52,197,236,229,246,14,224,79,21,164,208,224,79,25,134,12,128,+172,229,160,0,100,229,169,154,64,46,1,49,56,78,252,227,50,0,0,85,+70,254,0,53,64,22,65,59,130,138,139,240,115,255,64,237,0,52,108,16,+2,49,57,50,96,55,224,46,11,145,21,99,156,96,40,65,98,102,166,2,+49,53,52,96,228,254,92,5,15,97,108,108,111,119,101,100,32,105,110,32,+45,98,111,111,116,165,175,129,224,129,175,224,169,2,1,95,51,65,29,128,+12,64,92,161,226,242,238,2,66,147,0,48,224,217,1,70,173,174,222,224,+78,23,1,50,51,82,70,192,122,168,14,224,74,4,182,5,196,95,225,69,+7,132,128,3,95,49,48,48,66,127,160,97,1,50,52,99,224,114,174,67,+224,246,226,8,10,101,120,112,97,110,100,101,100,58,94,42,150,219,1,49,+51,183,153,224,136,0,224,178,4,1,50,52,117,116,246,119,3,224,165,6,+66,23,168,136,224,162,7,107,6,224,242,0,99,116,128,186,135,187,2,64,+95,49,224,44,5,224,14,2,130,2,193,249,224,0,0,66,95,132,128,101,+114,224,137,0,64,41,99,140,120,76,133,183,160,174,142,91,211,218,160,13,+96,5,240,167,2,165,201,160,196,147,255,0,60,252,232,1,192,21,214,219,+224,35,5,128,36,228,32,1,253,222,7,100,141,241,231,0,240,144,5,166,+70,237,176,9,200,203,128,44,250,214,6,196,225,192,69,64,7,241,227,9,+129,148,240,159,0,224,26,7,234,31,0,0,83,70,40,134,221,66,150,232,+122,2,224,0,6,160,78,224,228,6,193,34,224,146,1,240,204,2,240,85,+2,240,215,0,167,56,224,83,1,241,23,2,224,38,0,160,13,160,63,224,+27,10,162,114,154,101,0,52,210,92,187,246,231,159,1,64,36,1,95,55,+83,138,152,50,143,47,224,126,0,226,131,3,167,13,192,106,226,93,10,90,+162,96,0,200,17,241,217,0,252,245,1,64,133,97,87,251,142,3,128,116,+238,2,1,137,146,251,46,0,0,75,100,175,160,43,168,103,184,116,225,138,+0,175,222,145,79,1,90,32,231,221,1,225,203,1,140,29,1,55,48,224,+223,1,67,47,135,162,0,80,71,174,64,80,195,59,0,49,75,100,128,180,+5,83,32,95,56,54,56,96,185,104,4,166,203,230,240,1,169,197,139,178,+64,71,135,193,3,85,32,75,51,70,164,80,114,102,171,160,29,135,179,3,+95,56,54,57,112,150,193,80,225,191,1,225,100,1,224,1,7,226,25,2,+224,37,16,224,35,4,224,32,23,224,29,20,224,26,17,224,23,14,184,19,+224,0,0,64,237,0,54,231,156,1,236,182,1,7,52,48,52,32,95,52,+48,54,114,120,229,126,1,1,37,84,134,113,231,237,0,66,176,232,42,0,+230,43,16,0,52,198,85,229,126,5,65,197,70,234,0,56,65,113,188,53,+2,95,52,50,106,74,128,56,0,50,106,15,224,12,0,99,36,1,50,50,+174,22,128,116,224,78,4,224,60,2,2,80,32,83,64,188,196,132,228,131,+2,0,49,97,234,98,233,65,12,240,79,4,100,233,64,1,64,28,244,116,+0,160,41,96,52,98,158,76,25,133,217,235,62,0,224,214,35,0,52,199,+138,228,226,0,230,148,3,224,199,5,132,1,225,90,1,64,61,99,198,66,+208,220,245,102,169,232,92,0,128,130,78,63,160,125,225,235,0,177,204,103,+12,122,33,80,199,221,24,1,49,57,122,187,211,49,163,238,229,208,5,230,+65,12,128,204,230,98,19,202,171,229,125,9,192,25,225,120,1,223,182,224,+49,14,128,108,96,48,232,200,2,232,128,9,228,206,0,1,50,51,65,24,+160,104,97,112,93,17,0,48,92,78,73,253,132,227,192,46,165,202,224,13,+0,197,191,241,117,0,224,2,0,225,181,9,64,108,0,49,110,41,67,68,+227,102,0,192,74,225,165,9,128,87,229,137,10,192,165,1,49,55,103,130,+96,57,0,49,106,15,101,139,80,67,144,133,2,49,48,57,194,164,96,234,+123,203,1,50,49,75,169,224,0,2,234,203,0,168,59,225,152,1,169,161,+117,156,224,163,0,232,149,16,225,6,5,195,87,226,251,4,225,6,16,225,+3,18,231,218,1,64,252,2,95,49,55,109,31,116,185,230,176,0,226,11,+13,194,254,130,11,184,222,224,145,7,134,169,1,54,32,228,198,2,13,116,+121,112,101,32,115,105,103,110,97,116,117,114,101,132,210,128,156,248,224,4,+234,52,2,226,92,9,167,3,0,50,78,66,226,94,7,227,176,4,99,168,+103,186,225,93,21,161,29,234,83,3,165,49,1,49,51,98,6,225,17,8,+128,0,224,49,4,67,228,242,134,0,224,106,9,0,56,161,163,77,17,232,+55,5,169,221,162,9,224,238,5,68,17,97,172,225,128,0,149,94,236,173,+1,180,1,235,174,8,2,67,97,110,76,182,17,115,97,116,105,115,102,121,+32,99,111,110,115,116,114,97,105,110,116,184,217,242,232,0,226,206,4,224,+70,8,2,94,42,32,64,0,14,102,117,108,108,121,32,113,117,97,108,105,+102,105,101,100,160,67,76,52,230,211,2,65,1,141,194,196,191,80,46,155,+182,248,232,5,0,73,134,193,203,143,3,95,52,55,57,198,254,64,126,64,+87,67,78,1,49,57,159,199,230,243,1,136,145,102,94,226,187,1,230,94,+9,226,231,3,230,100,2,154,24,243,66,1,148,236,225,109,2,98,173,128,+164,226,178,21,194,51,228,180,5,234,187,0,238,194,2,226,187,3,70,64,+244,90,3,224,63,1,228,140,0,164,143,224,32,0,160,14,224,31,3,164,+71,226,101,6,146,138,224,154,4,160,137,66,81,237,91,5,98,66,0,54,+153,200,81,217,0,55,193,152,251,57,11,102,20,193,184,0,85,102,40,80,+97,192,108,224,115,10,229,108,11,228,67,2,255,114,0,224,5,3,213,117,+96,10,1,50,52,104,104,101,113,2,32,95,56,96,122,195,138,128,0,225,+46,15,147,102,64,9,131,40,160,51,225,52,0,96,31,228,42,1,1,49,+53,83,55,232,134,4,99,245,0,53,67,201,113,71,96,21,139,29,0,54,+150,193,1,64,95,167,164,96,86,116,142,128,71,0,79,81,14,212,139,64,+60,0,65,96,37,161,42,251,219,4,107,145,128,21,4,95,50,50,48,50,+252,86,4,96,0,0,58,136,169,107,126,139,225,224,64,0,64,26,139,69,+97,44,228,213,18,238,183,2,140,61,241,82,11,64,34,165,106,146,223,1,+51,48,195,3,164,248,0,49,140,148,148,47,161,171,224,64,1,148,239,253,+29,6,64,213,64,133,64,171,211,135,226,90,4,99,170,226,91,7,227,157,+2,224,218,8,194,223,225,188,0,183,172,230,26,5,0,89,133,33,102,35,+64,4,64,209,98,71,2,50,50,49,88,195,1,50,48,153,93,224,239,0,+230,182,12,104,165,0,49,225,149,0,210,22,184,119,160,159,99,184,160,108,+130,214,64,93,225,58,0,226,37,1,224,51,7,192,222,140,208,226,201,7,+128,81,224,153,1,195,30,241,192,7,243,3,10,96,39,0,49,89,12,171,+1,97,135,1,53,48,160,146,1,95,49,202,251,224,131,1,225,98,2,1,+50,52,161,26,235,88,0,225,30,14,163,35,235,103,0,96,100,149,87,166,+172,225,23,1,108,255,228,181,3,228,9,1,128,13,160,38,225,198,6,133,+57,1,50,52,78,103,100,172,79,164,227,65,3,96,147,160,118,75,68,1,+54,54,70,195,254,223,2,193,80,160,106,96,105,224,118,0,224,109,8,146,+245,97,49,128,12,1,48,56,76,253,0,51,66,51,192,204,132,160,164,250,+229,1,1,242,222,3,225,163,4,96,82,172,18,227,50,6,128,136,152,138,+85,31,0,49,224,220,3,160,88,0,85,132,62,2,95,50,51,126,224,98,+148,1,49,54,75,159,160,25,134,78,163,21,175,191,159,19,160,0,67,123,+0,54,199,97,236,197,9,237,193,8,237,57,20,67,184,0,66,137,235,166,+216,236,99,7,225,113,0,231,141,5,198,49,82,197,227,208,9,97,26,230,+44,4,225,27,1,0,80,242,77,6,224,96,8,96,251,224,89,57,228,133,+5,96,39,244,142,9,72,201,97,99,160,38,66,124,239,32,0,229,103,2,+161,27,225,35,47,97,229,73,221,228,122,4,137,227,233,219,8,31,105,110,+102,101,114,32,114,101,99,117,114,115,105,118,101,32,112,97,116,116,101,114,+110,32,115,121,110,111,110,121,109,32,72,184,0,115,246,167,0,64,0,231,+132,1,235,200,11,82,26,0,66,96,6,96,205,226,206,8,228,74,9,243,+2,9,96,0,225,81,7,228,103,11,64,96,239,107,5,235,0,21,196,148,+224,30,5,228,38,20,96,146,230,242,10,232,242,4,227,156,8,227,146,10,+64,0,162,21,196,115,72,154,65,3,96,62,0,52,64,119,160,10,109,118,+196,49,0,54,89,171,115,158,228,197,11,228,217,12,160,182,128,0,67,194,+145,230,0,83,246,248,13,108,57,96,4,234,17,9,136,12,90,233,130,193,+202,239,225,10,2,247,102,5,2,95,55,57,66,210,0,57,144,4,228,102,+0,96,204,224,93,5,225,150,9,237,117,4,1,49,57,143,27,225,91,12,+156,104,133,90,234,72,3,228,205,1,64,245,241,46,3,96,187,0,80,96,+211,0,51,88,184,0,56,124,112,105,107,64,55,2,53,55,55,96,132,64,+33,188,211,193,128,1,50,56,124,232,204,217,0,54,93,72,117,204,65,154,+134,178,1,55,56,232,237,1,96,121,0,51,147,148,226,176,2,1,49,53,+124,197,225,92,8,102,114,229,118,0,237,227,0,226,192,6,242,126,3,161,+53,229,143,6,0,49,101,121,149,197,225,48,5,2,95,55,52,97,145,230,+215,1,64,161,141,99,149,134,65,14,85,128,2,49,57,55,99,151,100,234,+91,99,64,62,64,44,237,99,0,226,26,9,129,110,67,236,228,194,4,216,+226,65,65,228,203,12,217,214,224,25,9,98,56,228,255,13,235,135,1,248,+231,9,85,232,129,177,128,117,128,146,130,92,96,9,2,95,50,51,112,214,+96,0,224,68,8,162,174,1,75,50,236,204,5,224,44,13,96,188,1,85,+32,253,225,0,96,170,64,1,248,120,1,215,101,2,49,53,54,243,61,2,+225,211,3,168,44,64,21,250,166,6,135,241,162,5,224,27,3,69,64,224,+156,7,64,0,128,134,224,241,1,193,117,250,72,9,229,188,10,224,27,2,+249,65,21,195,72,224,98,0,249,43,5,224,13,7,247,109,0,227,251,0,+160,163,230,24,9,128,194,128,24,73,102,160,67,236,77,12,224,139,3,196,+8,0,53,235,144,0,128,1,224,23,4,195,21,224,85,2,1,95,49,103,+13,86,14,67,118,69,114,95,23,3,95,49,54,57,67,6,112,66,233,11,+7,193,55,96,95,1,50,48,99,131,236,176,5,128,51,2,50,51,52,244,+255,2,128,141,0,55,147,71,224,66,6,94,170,224,66,8,96,129,227,202,+0,249,82,9,248,125,8,225,179,28,101,121,229,179,5,3,49,57,54,57,+251,249,11,230,15,3,128,83,224,7,1,125,240,224,221,0,192,0,131,117,+226,131,0,225,217,6,129,196,161,244,226,204,3,225,175,2,245,180,5,224,+203,0,235,25,5,224,2,0,98,33,224,46,3,226,39,14,225,1,7,111,+148,226,47,4,226,18,1,181,176,224,30,17,199,180,161,197,129,200,193,224,+0,51,70,19,101,201,66,86,226,54,1,226,51,40,226,129,20,224,241,0,+226,80,0,224,139,4,249,42,1,128,33,134,176,0,89,128,16,129,227,226,+29,7,193,221,192,11,0,64,130,41,227,164,1,193,237,129,226,224,94,0,+79,174,239,172,6,131,87,0,56,64,178,107,246,162,200,103,100,97,55,68,+111,136,217,100,113,114,23,224,0,1,227,6,39,104,223,226,81,10,192,77,+234,82,5,170,23,226,216,1,162,221,65,21,234,126,9,161,210,224,87,2,+64,17,227,103,1,246,100,4,198,116,69,237,129,51,137,189,164,103,105,188,+157,250,136,60,0,56,233,169,4,128,216,175,229,224,137,9,130,216,239,55,+5,132,58,244,97,9,12,97,100,100,86,97,108,117,101,84,121,112,101,63,+187,230,1,50,51,111,91,160,254,0,67,227,34,11,224,0,0,71,231,149,+25,96,99,231,233,15,160,147,66,66,64,239,187,161,99,127,64,156,102,113,+224,101,6,129,53,226,180,0,251,210,3,64,202,141,104,98,37,219,159,64,+45,1,56,57,114,175,82,4,4,48,32,64,75,51,202,73,64,44,169,202,+137,168,242,94,2,141,83,98,38,68,170,226,160,4,0,58,135,87,118,88,+196,50,77,144,0,51,140,133,234,219,2,3,50,49,57,57,179,185,162,112,+193,228,163,224,97,217,96,159,126,130,96,152,128,157,160,38,131,234,64,138,+65,216,243,249,15,64,61,102,153,160,227,64,161,147,147,67,43,129,87,71,+110,225,113,1,227,132,0,163,200,167,193,127,73,162,27,238,173,5,96,35,+211,252,65,38,138,175,131,84,160,14,192,58,66,214,229,196,0,137,127,228,+97,2,160,2,229,123,2,128,235,229,225,2,130,19,128,26,96,40,224,53,+5,224,26,0,192,207,250,73,19,96,39,129,151,98,184,160,75,128,85,180,+148,204,93,241,78,7,204,116,97,166,0,51,95,32,64,9,98,94,3,67,+32,95,51,227,145,1,227,146,13,193,159,192,79,101,47,192,83,99,152,64,+4,224,244,5,224,231,42,224,225,0,225,94,4,114,220,224,18,0,96,92,+128,7,224,228,5,224,6,0,160,233,224,162,3,119,142,81,239,224,179,4,+185,173,124,124,0,80,99,49,211,109,176,84,137,163,231,38,13,224,29,1,+67,28,99,106,160,18,224,42,6,224,30,0,98,204,149,180,0,95,66,246,+3,95,56,51,54,78,197,0,52,184,17,64,30,0,54,236,85,17,155,112,+129,6,228,254,8,2,49,54,53,114,101,128,18,1,67,39,230,227,6,161,+153,227,46,0,97,84,234,181,2,193,182,235,0,1,198,86,128,31,232,142,+5,193,135,160,19,231,30,1,199,27,228,27,0,237,174,14,125,68,234,188,+5,238,208,6,160,188,160,221,1,50,52,252,45,1,0,49,200,135,128,0,+230,159,0,225,49,8,1,50,50,88,108,224,65,1,65,211,66,235,72,151,+111,144,1,57,54,224,74,0,65,122,144,15,100,208,68,60,206,0,1,50,+52,65,11,174,0,96,40,143,66,6,95,56,54,57,32,75,32,77,98,224,+1,13,201,174,128,0,64,85,136,159,64,66,0,51,239,133,2,135,19,66,+34,0,66,65,19,225,24,0,252,134,4,104,254,123,71,0,48,252,68,2,+5,101,120,112,111,114,116,102,216,64,85,142,191,82,238,250,111,11,2,51,+52,55,224,58,2,13,92,34,115,114,99,47,77,105,99,114,111,72,115,47,+71,32,16,67,104,101,99,107,46,104,115,92,34,44,50,50,50,58,49,52,+156,140,251,175,3,4,81,73,100,101,110,128,111,1,64,85,92,43,192,207,+239,12,11,0,56,127,221,65,9,0,83,68,97,97,68,0,56,107,223,165,+149,70,44,198,29,75,31,103,76,1,95,52,100,134,98,12,213,132,64,97,+135,134,3,80,32,35,50,104,9,3,58,50,52,48,134,185,136,84,226,104,+1,139,198,68,191,245,135,36,70,244,98,142,224,40,26,162,162,64,43,243,+2,6,241,245,4,1,50,51,95,72,227,178,11,166,203,224,107,26,129,13,+233,7,4,224,162,27,1,52,48,163,90,65,39,135,63,125,219,232,103,3,+195,233,229,245,0,224,97,1,243,75,4,105,39,237,51,3,225,84,15,1,+50,48,78,48,227,221,8,228,66,6,229,218,3,165,224,160,39,230,36,3,+224,2,1,224,28,0,224,51,5,192,5,227,248,11,159,114,224,0,0,227,+148,3,135,204,241,15,2,225,150,3,192,100,135,244,161,38,2,64,95,56,+113,34,141,233,246,66,2,129,51,227,83,3,86,59,6,97,32,99,108,97,+115,115,99,58,75,230,131,243,228,219,5,224,150,9,225,32,3,224,28,12,+228,76,1,224,54,9,228,104,2,237,218,5,224,2,7,224,250,3,250,247,+6,203,171,131,54,0,55,149,129,73,159,0,52,181,130,0,85,248,163,14,+96,223,133,239,242,10,4,214,201,236,102,3,2,95,54,53,213,217,0,56,+101,123,0,67,74,219,0,52,232,122,0,192,195,224,76,4,100,20,224,76,+10,224,68,21,236,57,9,248,3,15,1,49,53,100,167,225,197,1,26,115,+117,112,101,114,102,108,111,117,115,32,105,110,115,116,97,110,99,101,32,98,+105,110,100,105,110,103,247,243,4,64,0,129,128,129,16,161,92,128,19,219,+130,225,115,0,225,184,0,187,170,128,1,110,31,226,26,5,192,26,107,116,+116,109,226,253,9,159,141,224,69,1,224,95,0,162,189,176,28,137,134,245,+190,3,249,248,4,224,105,1,224,1,3,226,170,11,233,11,6,224,2,9,+160,144,224,86,0,192,169,240,15,0,225,15,30,128,71,128,11,135,23,248,+48,7,201,99,172,163,240,130,1,160,29,225,39,4,225,45,4,225,117,3,+169,167,0,51,149,38,225,11,6,3,95,49,53,57,69,75,211,34,129,78,+234,11,3,1,50,50,109,161,96,25,227,112,4,64,53,72,117,66,156,108,+216,1,49,55,224,158,0,160,252,165,127,164,60,64,22,109,11,96,50,224,+56,1,72,125,64,250,2,95,50,50,99,128,224,165,3,128,47,192,13,175,+121,133,13,178,109,106,209,233,246,1,161,134,224,169,0,64,224,246,54,1,+225,37,4,128,83,0,83,96,34,128,67,225,21,0,1,50,49,67,189,224,+133,2,96,233,224,14,0,162,98,129,42,72,168,199,253,65,170,216,40,238,+125,2,3,95,50,51,54,240,187,1,170,165,64,47,241,157,7,225,48,2,+102,233,224,109,2,96,106,97,39,161,78,2,79,32,35,76,219,96,57,1,+95,49,80,17,143,237,225,63,0,2,95,50,55,75,154,83,230,87,204,145,+153,64,236,0,32,177,124,142,199,0,48,209,178,1,50,50,65,6,214,15,+96,123,228,111,7,129,115,0,89,226,224,0,160,184,160,13,178,89,193,253,+225,142,2,252,41,6,225,105,1,235,106,0,104,33,195,76,242,119,0,160,+73,0,66,76,179,231,53,2,206,35,105,109,65,255,3,95,49,53,53,218,+163,224,179,6,244,225,9,224,154,14,192,63,241,234,1,160,234,130,58,128,+115,96,166,96,139,225,172,9,79,105,128,221,192,0,226,124,0,128,0,252,+222,3,254,150,6,75,123,0,48,131,61,229,170,0,96,144,3,95,50,49,+55,254,49,1,64,0,72,230,141,89,226,18,8,64,68,177,78,96,14,2,+49,57,56,146,139,186,245,3,83,32,95,54,67,205,64,136,0,35,152,151,+64,50,235,171,0,64,129,75,238,68,17,0,48,77,171,64,29,0,52,138,+129,140,50,1,95,49,120,127,0,49,76,24,64,21,140,31,230,80,1,70,+69,0,34,128,26,171,247,1,32,83,65,116,166,54,161,88,248,155,5,129,+33,128,21,64,202,224,29,5,247,57,4,233,201,1,185,130,254,103,0,238,+36,8,107,23,106,152,64,95,106,17,231,109,6,96,67,1,95,53,74,75,+1,50,50,64,223,224,198,1,71,3,167,0,98,14,98,120,228,246,0,234,+6,0,0,64,226,168,0,79,114,227,124,2,160,206,224,179,6,192,232,194,+97,247,99,12,226,126,1,212,94,65,21,112,240,65,124,173,67,0,51,80,+81,0,51,106,0,98,53,1,95,56,69,123,3,79,32,35,49,68,127,132,+19,1,50,51,175,139,97,16,234,57,7,243,208,0,64,29,231,10,7,160,+239,69,39,229,49,1,115,216,92,33,226,187,5,64,0,132,23,207,115,225,+192,5,160,100,225,194,9,160,24,225,94,18,64,234,119,10,65,101,171,252,+244,65,4,89,185,236,11,1,165,36,3,50,51,57,57,162,162,255,41,6,+1,50,52,83,144,195,96,0,51,238,114,1,128,0,224,139,69,192,135,201,+206,224,125,23,131,181,224,63,0,224,185,1,67,76,142,238,129,99,102,179,+2,50,51,50,100,115,142,82,96,148,64,7,1,54,56,120,62,103,52,129,+182,68,174,101,239,231,110,9,0,51,126,190,193,206,100,35,143,76,128,71,+0,64,107,27,235,24,0,82,115,239,107,11,128,224,0,85,108,50,113,233,+142,212,1,50,52,84,211,224,0,4,136,102,64,206,143,67,85,68,67,124,+96,135,64,22,246,127,1,231,235,0,192,1,238,5,9,129,50,160,29,225,+121,4,129,123,64,16,160,15,0,58,97,138,128,114,2,49,52,32,64,14,+142,40,162,173,228,61,2,0,83,163,112,97,4,0,53,253,106,0,118,170,+65,19,0,75,243,101,0,140,37,97,250,0,83,146,31,64,77,227,204,3,+129,156,67,189,105,222,224,77,1,1,95,54,146,115,192,231,224,56,3,227,+138,7,64,17,138,221,102,120,1,95,54,173,102,192,0,235,233,16,64,38,+228,209,1,9,109,97,108,102,111,114,109,101,100,32,75,230,11,100,97,108,+111,110,101,32,100,101,114,105,118,235,235,2,128,127,225,121,6,238,117,12,+122,93,224,52,1,239,50,2,169,150,238,106,3,128,20,217,32,70,4,142,+103,163,111,162,211,228,52,8,228,49,13,82,132,205,20,225,40,3,129,108,+127,116,65,38,131,254,235,78,4,224,60,18,224,56,3,131,175,160,0,195,+95,225,96,15,199,106,239,24,5,12,100,97,116,97,47,110,101,119,116,121,+112,101,32,239,29,5,64,0,225,91,3,207,7,160,190,232,102,3,236,90,+1,208,25,224,15,1,192,18,160,243,128,209,98,244,160,11,0,49,106,147,+232,144,1,164,214,123,185,188,137,96,0,67,11,136,77,224,147,8,161,174,+224,115,2,208,189,238,4,0,240,154,0,167,220,192,29,224,55,3,224,26,+2,224,55,12,87,201,224,56,6,130,46,225,41,2,128,22,64,32,224,40,+8,224,94,1,236,185,3,160,48,231,49,2,1,52,55,65,239,231,50,2,+69,15,71,52,233,97,5,0,79,225,202,2,4,68,97,116,97,46,64,4,+1,95,67,80,231,96,10,65,205,224,35,8,84,82,3,97,98,108,101,224,+8,0,224,37,7,11,71,72,67,46,71,101,110,101,114,105,99,115,192,8,+224,35,7,29,76,97,110,103,117,97,103,101,46,72,97,115,107,101,108,108,+46,84,72,46,83,121,110,116,97,120,46,76,105,102,116,137,224,46,3,17,+84,101,120,116,46,82,101,97,100,46,73,110,116,101,114,110,97,108,96,13,+224,38,12,3,83,104,111,119,96,4,64,29,231,188,5,226,64,1,156,30,+0,57,131,178,225,169,3,69,32,73,69,239,41,3,226,137,4,96,31,176,+144,224,79,13,227,169,6,224,59,2,96,53,96,11,235,212,0,224,60,2,+101,37,2,67,32,95,102,208,140,181,229,212,0,224,186,15,238,192,6,227,+58,16,224,116,16,164,56,224,116,12,224,36,0,242,11,2,224,106,1,108,+82,225,29,8,128,20,224,110,38,136,24,74,190,66,172,67,165,0,54,99,+165,202,240,229,99,7,128,214,64,47,0,53,109,14,64,85,232,80,6,104,+14,69,76,2,95,49,55,74,251,255,92,0,96,6,130,22,64,104,216,28,+128,1,198,227,226,2,4,225,242,0,230,125,30,3,66,97,100,32,197,15,+230,116,4,241,129,9,161,246,64,136,140,92,224,132,2,241,78,6,244,15,+1,225,109,7,192,30,225,236,0,224,33,0,241,165,0,226,11,4,226,207,+7,228,128,0,224,25,8,224,50,1,254,50,2,131,36,224,121,2,128,16,+224,170,2,96,12,224,65,5,128,7,192,135,64,14,224,33,0,229,208,0,+0,49,97,71,65,18,66,15,65,187,64,38,162,30,0,75,75,197,232,241,+0,128,19,225,79,2,224,27,1,224,196,12,227,221,3,226,72,3,192,49,+192,151,96,160,224,5,28,229,200,1,235,21,3,134,202,224,5,21,224,129,+4,66,195,241,44,1,225,98,2,193,186,225,196,2,243,106,0,224,8,4,+225,69,1,225,79,48,225,71,14,193,206,224,1,2,253,221,8,224,38,14,+195,210,96,0,100,54,129,97,224,203,22,224,8,5,244,11,0,161,8,179,+88,222,170,65,58,246,24,1,231,132,6,64,45,244,65,2,224,156,4,0,+55,235,232,3,96,8,72,174,112,7,191,31,172,247,244,40,2,128,68,192,+201,232,183,4,175,22,1,95,49,68,13,160,40,231,236,0,253,56,2,103,+124,129,236,165,72,0,85,244,139,0,226,166,0,115,172,224,44,4,198,193,+224,95,2,176,12,225,142,6,225,116,1,128,231,0,80,229,16,3,230,72,+3,224,108,0,249,98,21,234,230,21,226,108,3,132,64,185,78,64,219,229,+37,4,234,52,12,249,77,28,193,177,243,55,0,197,3,224,10,19,197,38,+226,10,3,231,3,10,193,3,228,14,6,192,67,237,131,21,64,55,237,132,+6,224,80,0,97,87,234,84,4,224,2,4,160,71,224,25,9,229,133,2,+228,193,13,224,29,22,229,132,0,64,0,192,196,231,177,2,64,33,150,35,+240,4,4,64,1,229,209,1,224,13,1,0,83,248,140,2,224,69,3,247,+185,10,226,11,2,228,192,2,101,32,163,182,81,192,135,126,0,56,126,237,+96,5,224,88,2,156,195,209,88,164,37,237,9,0,95,180,96,46,173,64,+109,38,98,101,0,53,64,26,175,202,0,90,71,235,0,56,82,16,2,95,+56,51,227,183,4,163,165,0,54,117,248,67,220,0,56,112,77,66,111,1,+52,55,226,152,3,14,109,107,77,101,116,104,111,100,58,32,97,114,105,116,+121,250,20,2,225,114,15,248,132,3,225,117,1,248,57,4,248,142,5,224,+74,39,224,1,1,85,94,67,236,228,147,4,96,55,226,210,0,229,93,4,+225,91,0,230,191,9,2,95,50,48,84,176,111,230,87,234,225,1,1,4,+99,111,101,114,99,107,208,224,134,7,2,95,49,53,117,94,160,20,133,9,+224,33,2,76,104,248,87,3,193,111,128,45,225,116,1,229,200,2,0,95,+143,221,238,181,6,193,175,1,50,49,106,118,96,11,152,20,64,84,248,103,+14,96,62,128,67,0,85,144,179,166,37,0,83,151,6,199,162,226,83,6,+98,82,69,72,131,177,194,189,224,42,5,211,186,240,189,1,183,250,225,97,+2,224,47,9,224,48,2,111,131,96,4,111,114,0,57,77,127,0,55,243,+11,3,96,0,5,95,49,56,53,50,32,79,150,128,223,1,95,49,133,138,+239,124,0,145,151,97,21,81,158,109,192,229,44,6,239,230,6,231,136,0,+226,94,1,64,9,64,91,235,19,3,161,123,103,50,1,48,57,83,169,161,+95,97,209,146,1,160,163,247,159,7,240,30,5,161,122,97,10,162,148,242,+33,3,132,225,197,123,64,111,224,19,2,96,18,64,14,3,80,32,64,83,+64,4,193,102,229,193,1,129,122,137,120,3,66,32,82,32,72,195,248,104,+0,224,51,4,240,247,0,225,128,2,224,47,0,128,0,128,11,192,17,2,+95,51,52,228,8,3,14,92,34,115,114,99,47,77,105,99,114,111,72,115,+47,68,171,195,13,46,104,115,92,34,44,55,48,54,58,49,54,58,32,67,+36,230,211,2,139,239,2,68,101,114,195,60,73,119,96,93,75,220,0,51,+184,30,0,73,228,193,1,228,224,8,71,175,131,220,66,187,144,204,64,59,+149,13,191,180,98,241,65,169,111,203,0,56,68,254,128,19,64,41,148,104,+64,247,243,171,2,181,64,0,56,157,84,141,97,227,183,2,134,85,224,11,+2,192,8,224,128,1,148,168,64,116,122,106,240,86,25,64,110,0,56,108,+213,64,117,5,10,65,32,79,32,80,240,69,7,6,66,111,117,110,100,101,+100,192,7,65,53,64,157,64,63,224,45,10,3,69,110,117,109,176,151,64,+10,160,45,100,112,224,45,10,240,197,10,64,45,68,127,224,91,11,3,113,+46,69,113,192,35,65,37,224,35,10,3,70,111,108,100,112,243,192,8,160,+47,99,198,224,47,11,5,117,110,99,116,111,114,192,7,192,45,224,175,14,+4,73,120,46,73,120,192,35,65,204,224,35,10,2,79,114,100,64,3,192,+37,66,39,224,37,10,6,84,114,97,118,101,114,115,145,158,224,11,1,192,+53,67,165,224,53,11,241,209,11,64,47,225,49,9,241,219,15,65,242,224,+221,9,241,229,26,64,56,224,242,9,0,84,241,239,17,64,48,224,199,9,+96,48,241,249,4,64,39,66,77,242,1,5,98,209,66,156,99,40,137,52,+68,49,134,207,73,65,151,215,67,136,176,158,195,51,243,135,3,234,53,5,+176,136,198,15,235,88,5,96,136,135,179,128,100,164,205,231,245,0,115,208,+224,13,1,234,173,4,192,17,233,253,0,224,21,0,224,45,6,224,25,11,+234,81,18,236,159,0,224,32,0,232,151,13,160,243,225,66,1,224,28,6,+144,161,228,76,0,104,120,224,14,2,224,75,4,230,158,6,224,81,11,224,+2,9,233,18,2,166,187,230,63,0,232,217,11,224,5,13,166,238,224,113,+26,233,129,6,225,209,2,224,2,0,201,206,218,89,226,131,1,7,115,104,+111,119,115,80,114,101,99,16,224,109,21,104,5,224,104,2,224,1,1,139,+9,224,25,11,177,253,224,22,16,224,104,11,161,159,168,211,224,199,5,225,+43,9,66,216,106,101,130,170,83,64,97,18,137,75,227,72,5,224,214,12,+128,2,192,34,160,208,235,12,0,194,48,224,21,1,128,11,71,164,103,183,+69,128,200,89,224,231,8,224,235,4,224,28,22,227,205,0,226,231,0,224,+5,0,248,36,1,224,61,14,224,55,2,227,67,4,224,42,1,0,67,64,+21,224,67,3,161,91,3,85,32,35,49,238,71,3,224,22,0,4,79,32,+35,51,50,234,227,1,162,193,169,33,176,33,225,0,6,111,67,0,51,65,+122,223,73,224,57,2,96,2,193,61,96,19,64,144,129,197,248,30,0,225,+242,3,224,130,8,239,220,6,205,236,64,49,137,97,98,221,1,32,95,102,+1,186,160,245,180,4,224,197,6,96,126,98,49,224,200,0,141,227,226,40,+2,224,97,33,96,13,224,170,0,81,177,226,22,0,226,106,5,130,222,225,+153,0,129,149,97,158,226,208,0,226,226,4,162,156,243,102,16,130,55,128,+194,236,166,1,129,148,227,231,1,1,32,123,227,224,0,225,255,1,0,85,+230,140,2,1,44,32,192,32,128,31,195,237,128,13,112,27,128,105,224,196,+0,224,120,30,0,61,224,88,0,0,85,158,230,192,12,5,79,32,35,49,+50,53,225,223,0,96,66,0,56,77,112,140,110,0,55,77,238,224,44,0,+203,164,64,95,0,54,224,95,3,1,120,36,228,185,2,96,74,236,33,4,+227,203,4,2,95,50,51,68,253,224,246,3,68,255,4,80,97,114,101,110,+192,69,226,32,5,108,95,160,52,2,79,32,35,73,188,192,174,98,50,2,+49,56,53,180,85,194,184,138,229,1,55,52,107,70,94,247,0,48,128,32,+224,31,1,3,49,51,48,52,224,132,9,2,83,116,114,253,231,1,160,92,+1,53,50,224,59,7,224,192,13,229,192,3,224,151,6,224,51,2,4,79,+32,35,52,54,224,191,0,64,93,142,171,75,163,142,172,175,90,96,20,96,+17,198,47,65,170,0,49,227,138,2,237,66,5,136,159,220,163,0,83,65,+113,1,95,57,64,62,1,95,52,72,181,70,27,103,71,0,55,64,130,78,+31,96,70,79,95,66,49,224,19,3,81,102,72,184,64,79,0,54,232,239,+185,232,177,8,224,47,7,224,28,4,224,29,7,224,35,1,192,32,224,33,+17,224,36,3,224,37,6,228,111,6,224,49,2,96,2,232,225,14,228,180,+6,224,2,10,232,229,3,96,45,164,176,231,162,9,224,5,25,232,236,6,+160,124,224,222,4,224,121,14,128,211,242,188,6,128,2,242,194,5,224,208,+22,224,83,9,224,1,5,242,201,12,229,182,19,224,240,22,119,190,224,112,+3,224,194,12,163,244,0,49,67,92,242,249,10,0,112,68,184,0,115,233,+185,4,224,75,23,100,152,243,77,19,2,43,43,43,224,80,5,225,56,19,+234,18,3,225,55,11,234,24,3,224,31,11,233,27,33,224,130,15,202,44,+224,64,11,160,35,226,167,7,224,2,21,224,45,37,136,197,224,0,2,224,+133,9,160,139,224,37,4,224,79,21,224,14,1,225,136,23,234,45,3,224,+23,4,224,56,5,230,64,1,228,55,3,224,105,14,224,187,10,128,229,226,+227,3,224,245,30,225,194,2,199,139,128,2,245,134,1,251,75,19,224,225,+0,236,18,1,128,22,96,37,64,135,192,20,229,214,1,234,208,7,128,1,+3,95,49,54,49,253,140,3,224,26,0,198,133,128,19,97,12,234,227,0,+96,23,201,9,64,40,1,53,54,164,79,129,52,68,51,100,25,113,35,236,+106,7,161,113,192,79,97,58,202,115,130,183,224,246,11,212,11,234,62,2,+64,0,224,201,1,224,207,14,193,94,227,247,1,193,55,224,117,1,160,209,+224,188,1,99,193,96,212,235,40,5,224,202,1,128,172,225,23,0,225,160,+10,225,62,0,224,154,1,73,189,161,20,226,123,4,162,66,232,27,3,158,+197,64,139,160,115,233,173,2,109,196,232,29,5,171,135,171,149,224,33,9,+225,131,3,225,205,5,224,238,14,225,207,32,192,239,232,61,0,226,108,0,+250,153,8,224,1,1,225,165,13,224,1,1,64,78,226,126,1,192,27,225,+197,5,128,31,128,157,224,156,0,171,60,0,51,193,24,224,171,1,224,243,+3,231,254,1,224,112,1,226,238,4,224,208,1,170,167,224,96,5,1,52,+52,248,227,3,96,46,161,249,2,95,53,55,131,27,194,176,160,97,252,210,+0,128,217,163,47,192,147,128,216,231,49,0,230,131,17,7,114,101,97,100,+70,105,101,108,115,59,130,65,170,174,235,19,0,96,184,231,26,18,3,114,+101,115,101,115,171,74,82,106,220,239,169,7,98,32,64,68,225,88,10,236,+149,1,226,26,23,193,89,226,245,9,225,135,2,161,42,226,251,7,227,177,+1,226,201,0,66,41,160,93,64,62,227,167,1,224,32,0,0,49,226,234,+6,227,64,7,139,64,250,75,0,237,57,31,96,222,203,243,232,103,8,3,+102,97,105,108,192,44,96,86,143,124,113,123,242,88,14,65,195,2,76,105,+115,129,131,226,190,2,233,69,1,224,112,18,192,60,5,68,101,102,97,117,+108,161,199,128,121,128,74,224,121,27,237,20,0,224,125,47,64,64,224,129,+10,193,104,238,102,2,162,240,130,141,239,170,0,226,157,17,3,73,100,101,+110,160,83,226,220,11,224,80,41,2,80,117,110,174,0,224,79,61,4,83,+121,109,98,111,161,242,224,81,13,224,67,1,227,197,15,0,112,193,127,224,+65,5,206,153,227,193,23,3,115,116,101,112,227,192,5,227,239,21,2,116,+117,114,207,196,224,31,10,6,101,120,112,101,99,116,80,160,143,226,51,12,+239,68,2,238,223,11,0,53,250,81,0,238,54,4,1,54,52,97,5,224,+19,0,3,95,49,57,50,69,243,99,232,165,45,1,51,54,66,118,1,56,+51,96,248,164,47,1,55,53,90,145,0,49,189,83,133,154,1,56,52,122,+240,254,48,3,192,125,0,52,96,125,2,75,32,75,90,204,237,175,0,204,+143,64,33,0,51,128,33,0,52,128,73,237,210,1,78,218,0,49,64,42,+224,53,12,251,168,0,2,50,51,56,224,215,1,166,118,225,31,1,22,87,+97,114,110,105,110,103,58,32,99,97,110,110,111,116,32,100,101,114,105,118,+101,32,97,46,99,139,113,251,2,49,52,54,84,26,126,2,224,66,8,3,+32,121,101,116,178,100,108,135,64,147,225,102,6,96,145,220,16,100,177,0,+55,65,16,105,163,144,71,64,32,155,218,65,68,10,73,79,46,112,101,114,+102,111,114,109,73,133,38,97,89,64,251,71,26,1,64,95,92,195,1,95,+52,70,198,131,239,160,24,1,95,52,65,95,160,23,97,23,96,46,96,93,+64,112,160,93,158,6,101,95,234,248,1,240,121,16,115,35,96,52,160,134,+226,37,8,130,11,239,108,3,233,137,2,96,236,65,240,230,91,0,64,140,+153,243,139,208,235,168,1,235,69,0,239,54,0,64,89,103,219,114,90,241,+189,7,64,90,253,65,2,128,28,226,102,7,201,229,137,92,198,174,229,99,+15,4,116,121,112,101,82,195,159,194,210,2,49,53,57,65,255,175,34,129,+6,233,244,0,228,38,16,6,95,109,107,84,121,67,111,163,187,139,145,242,+154,0,132,111,198,211,224,30,24,129,61,160,130,130,93,1,57,53,67,97,+65,76,146,160,224,120,1,0,68,252,70,15,64,44,0,54,193,121,208,214,+239,223,3,173,13,226,13,4,202,6,233,191,3,193,73,194,77,224,13,1,+129,210,117,85,224,34,15,128,13,129,147,237,5,3,192,31,242,222,8,0,+55,64,10,129,117,162,40,225,211,0,242,190,23,238,13,0,226,160,6,96,+0,224,37,3,226,37,5,224,29,2,202,13,96,13,225,40,0,240,240,2,+241,225,2,224,77,17,64,66,225,62,1,128,142,226,129,15,158,41,125,246,+224,86,12,240,155,1,193,49,240,143,3,224,19,1,174,163,224,16,18,238,+199,1,224,98,5,225,143,1,97,117,64,174,224,246,3,250,153,6,105,228,+0,95,131,123,201,208,66,174,227,240,0,162,59,161,232,192,86,160,136,77,+115,224,101,0,1,95,53,95,21,231,123,19,2,60,42,62,193,24,135,124,+100,24,160,125,224,201,19,128,1,107,223,160,52,224,46,7,226,213,4,225,+100,0,224,32,0,3,83,39,32,89,224,77,6,0,66,160,17,96,37,236,+148,0,224,214,0,128,34,160,64,225,123,7,4,83,32,95,50,50,101,61,+192,23,227,94,2,0,67,96,251,3,49,54,53,55,231,46,3,224,61,2,+163,96,227,20,1,224,121,1,96,171,224,168,4,128,44,96,26,165,249,164,+110,67,227,1,56,48,215,208,0,57,71,178,2,95,54,49,242,248,1,64,+50,134,44,128,7,225,167,1,232,174,16,226,189,6,151,180,224,83,3,192,+181,64,70,130,72,64,64,96,98,0,95,194,67,98,0,64,22,231,107,8,+64,94,2,84,117,112,100,205,96,180,103,153,1,51,51,101,247,218,228,160,+77,129,193,161,41,99,30,70,211,97,113,204,60,134,158,236,61,19,229,119,+3,64,11,160,163,236,83,19,1,117,114,224,253,1,248,101,1,65,102,203,+96,232,29,7,96,20,135,111,69,162,137,144,197,156,65,216,129,231,248,32,+20,226,164,0,248,32,20,98,89,192,41,229,19,8,227,59,3,132,185,130,+185,228,254,6,228,242,0,224,44,5,237,244,1,228,219,16,2,99,111,109,+85,218,225,30,0,246,100,4,182,58,128,81,2,95,55,54,65,189,160,171,+229,242,13,174,133,195,93,224,189,1,224,13,5,134,226,227,15,2,131,139,+244,37,0,244,52,0,229,172,3,164,250,96,138,164,235,64,56,136,210,0,+79,240,62,2,224,127,0,97,161,0,32,214,255,227,204,2,246,154,25,0,+60,228,211,4,163,160,144,138,224,54,19,225,77,5,226,212,1,236,195,1,+239,224,0,224,198,1,96,189,0,79,65,153,241,4,0,226,204,18,1,76,+84,224,153,1,224,77,11,69,251,128,74,225,22,3,224,80,18,0,71,192,+80,161,64,239,205,33,160,41,224,33,10,0,121,227,177,0,128,161,128,155,+192,152,224,235,5,224,5,2,227,213,2,224,176,18,1,69,81,192,92,227,+182,6,67,169,140,188,130,0,195,175,233,76,20,245,165,3,129,164,194,172,+246,65,5,194,171,98,184,194,183,227,214,12,227,249,2,226,253,2,226,255,+5,160,33,225,36,1,224,25,7,247,39,2,224,29,13,247,72,3,128,74,+228,19,6,224,244,6,224,5,12,3,95,54,53,57,65,189,0,53,114,35,+224,111,3,227,201,0,231,63,9,224,8,17,0,67,227,108,0,229,4,0,+64,0,248,52,7,225,14,13,225,36,16,215,255,193,116,128,105,224,90,13,+224,74,3,224,76,11,224,29,25,224,112,2,224,114,5,224,118,3,224,120,+15,224,96,5,224,98,17,224,37,33,224,142,4,224,144,9,96,148,230,55,+10,192,0,224,90,21,128,2,235,95,0,224,49,0,226,75,16,224,5,31,+253,100,7,232,96,1,226,89,0,195,87,128,195,227,107,0,229,244,2,236,+223,4,192,2,253,105,3,224,205,21,225,30,1,161,36,235,33,1,192,39,+64,24,3,95,49,48,54,144,135,230,75,8,230,81,2,192,1,2,95,49,+48,195,43,232,1,0,163,33,96,252,110,40,160,79,2,95,50,48,79,226,+3,85,32,75,50,64,2,224,75,0,129,97,96,112,96,37,2,49,51,48,+128,58,174,113,0,54,128,223,161,50,211,72,224,171,3,64,26,0,79,166,+56,224,164,0,96,0,224,13,0,202,251,225,92,7,225,98,6,225,99,12,+254,208,7,225,103,12,226,56,4,225,99,0,224,2,4,160,30,225,132,3,+228,86,9,225,150,0,226,115,0,225,153,26,224,250,7,229,173,3,128,118,+194,112,202,212,108,198,160,113,106,128,225,32,1,229,20,3,130,194,231,224,+7,87,12,249,0,0,227,252,0,224,46,20,234,91,1,226,250,0,235,162,+1,233,131,6,13,117,110,115,97,102,101,82,97,110,103,101,83,105,122,200,+61,225,240,28,225,116,0,129,39,2,39,32,80,247,242,0,215,249,248,1,+1,128,39,131,11,1,50,49,64,169,2,95,51,52,96,42,128,6,224,7,+0,226,124,2,96,217,224,139,24,128,7,226,39,25,226,109,61,163,43,226,+82,7,226,73,62,226,55,0,234,41,29,1,38,38,236,156,1,227,219,14,+225,76,38,64,0,96,11,160,16,247,253,3,233,156,5,237,43,19,224,41,+24,233,163,0,224,41,24,0,122,233,205,3,232,216,16,231,17,4,224,47,+14,224,28,4,224,29,14,231,26,3,224,33,16,231,63,10,231,145,16,224,+40,1,231,105,25,224,44,3,224,87,23,192,2,231,124,16,224,111,23,224,+2,3,231,132,5,162,74,224,122,14,138,143,128,95,226,173,3,224,2,3,+228,207,4,231,146,12,236,145,1,230,38,7,160,95,131,102,163,91,224,22,+1,224,24,3,64,1,231,112,2,224,142,7,231,172,21,192,56,224,123,1,+231,73,8,231,175,45,224,157,3,231,176,2,228,125,4,224,246,1,199,176,+66,248,135,106,224,174,10,160,171,224,226,3,231,169,5,128,38,230,71,0,+228,47,17,9,101,110,117,109,70,114,111,109,84,111,227,126,0,177,18,160,+190,228,6,0,231,194,2,161,17,236,142,10,225,175,12,224,173,12,193,138,+224,214,9,225,126,6,239,94,3,96,34,225,116,0,238,169,10,229,75,5,+160,177,133,154,225,9,13,71,28,254,243,1,224,252,7,227,50,17,229,254,+3,226,246,10,230,66,25,226,167,2,226,233,5,97,51,236,212,9,230,78,+59,224,170,4,225,98,5,1,54,48,64,91,179,11,227,29,22,226,184,2,+0,80,128,22,225,235,1,128,167,245,60,1,226,138,8,224,5,3,230,198,+28,96,65,64,103,96,156,128,194,224,14,0,239,175,4,192,231,169,120,233,+212,2,96,189,64,8,74,209,161,153,102,89,253,145,0,224,230,3,224,40,+11,97,97,224,108,2,241,173,20,0,61,160,188,195,193,233,99,9,64,9,+0,73,255,8,0,224,30,8,1,116,111,224,28,0,250,210,7,84,42,1,+49,57,225,212,0,224,30,11,1,50,48,224,30,21,0,49,224,30,21,234,+43,1,224,153,10,1,105,110,106,24,224,184,15,0,114,224,28,19,138,88,+4,73,110,100,101,120,128,34,244,231,8,244,227,2,0,51,250,134,255,228,+63,23,160,17,162,235,128,13,231,106,4,128,5,250,134,72,2,102,109,97,+221,5,224,82,9,250,130,172,128,1,224,78,0,184,121,160,53,224,130,20,+128,1,250,59,255,133,61,250,59,74,226,114,2,250,55,71,64,90,250,55,+150,1,105,100,224,251,0,250,53,44,0,50,229,81,228,172,172,161,49,227,+136,1,224,27,1,229,106,11,229,107,13,233,239,4,160,18,229,111,23,229,+117,9,224,91,13,234,7,2,229,122,6,229,125,21,3,111,108,100,114,226,+79,2,224,88,9,229,130,1,227,218,2,229,133,3,224,22,4,197,100,224,+19,51,224,131,8,236,9,2,236,61,9,65,30,192,26,234,219,4,64,19,+229,173,1,229,190,35,195,255,193,60,1,51,54,229,143,1,192,78,224,168,+9,229,198,255,193,68,229,198,89,226,188,3,229,200,72,2,111,108,100,229,+200,100,229,201,42,7,102,108,105,112,67,111,110,115,171,226,229,208,14,235,+148,14,229,230,23,0,49,133,230,162,83,164,135,99,108,162,60,131,126,225,+171,3,97,174,229,123,1,64,76,1,51,32,197,254,194,33,3,95,51,54,+53,64,34,0,51,141,50,226,142,3,65,34,1,50,57,65,198,0,54,128,+148,229,99,0,65,191,1,50,50,187,123,227,160,1,161,122,1,95,49,64,+203,224,100,1,3,95,55,52,52,64,26,0,56,240,26,3,67,62,128,30,+0,80,148,25,194,194,230,60,6,230,106,11,224,13,5,227,246,21,163,166,+96,90,160,31,196,172,238,229,0,224,59,3,160,133,227,241,3,224,55,1,+128,49,131,122,70,233,131,83,135,114,130,123,1,52,57,174,25,224,238,0,+161,53,224,43,16,128,10,97,97,96,31,2,95,49,54,68,223,131,156,111,+195,1,54,56,177,20,129,39,97,100,131,178,160,95,64,37,0,48,253,92,+0,96,243,231,60,1,96,171,228,113,1,96,208,100,2,228,98,2,162,230,+128,29,67,56,129,5,2,83,32,85,98,146,225,66,1,161,115,224,10,2,+225,84,2,160,227,194,63,195,253,193,95,229,37,0,193,99,4,32,67,32,+61,61,255,28,1,96,19,65,40,224,116,1,96,99,96,4,224,224,1,228,+89,6,192,177,165,15,96,249,228,229,27,192,98,241,74,5,128,69,236,34,+5,0,95,194,254,96,0,2,95,55,54,196,211,228,85,0,192,26,226,247,+0,64,0,2,85,32,90,232,137,6,67,198,0,48,99,198,194,8,65,13,+226,77,0,233,163,3,96,48,254,222,0,225,63,0,67,119,233,76,7,1,+53,53,211,10,160,252,160,89,233,5,6,227,37,3,136,156,225,40,0,96,+19,232,217,7,224,44,5,228,19,2,232,186,15,0,61,209,30,0,67,164,+36,170,126,162,219,228,59,0,101,216,224,96,0,165,172,128,139,224,189,0,+194,166,224,134,2,102,215,161,41,226,112,0,244,67,7,184,100,232,75,11,+128,231,227,15,1,128,149,197,60,97,48,249,133,34,225,112,0,168,87,224,+54,20,225,25,0,230,126,1,224,10,1,230,136,18,224,26,10,249,78,0,+245,51,1,65,1,213,45,245,53,5,230,170,18,3,70,97,108,115,220,2,+166,150,96,80,224,78,19,224,5,2,231,22,2,224,100,18,2,84,114,117,+192,99,0,64,230,222,6,4,58,50,51,54,57,99,10,0,90,230,111,2,+220,243,236,68,10,66,19,192,11,227,3,13,161,148,245,176,3,230,253,6,+233,114,0,161,189,227,17,0,193,0,224,2,3,137,71,224,21,8,233,206,+0,224,25,6,230,118,7,224,86,0,224,66,8,224,94,4,224,96,12,128,+2,192,32,161,19,224,33,10,224,36,3,224,71,17,224,40,7,224,143,13,+224,44,15,224,87,23,224,48,9,224,95,22,224,224,10,224,53,11,224,103,+13,192,2,237,227,12,224,73,14,224,2,24,238,3,1,192,0,194,143,96,+31,235,93,5,226,153,2,225,238,3,194,195,224,23,9,64,54,224,24,4,+226,165,9,229,43,1,229,131,6,160,0,230,33,0,231,65,7,226,195,3,+229,88,1,128,51,161,65,160,82,224,5,21,197,12,64,0,251,35,11,227,+143,23,217,224,192,218,198,36,0,85,235,192,2,0,103,75,193,0,108,229,+63,1,128,177,101,252,96,98,142,191,64,10,236,118,3,128,95,232,115,15,+193,18,232,118,1,238,113,6,121,55,190,252,230,19,9,193,57,128,236,129,+101,4,95,53,55,53,32,68,44,70,220,128,60,174,51,0,95,174,105,229,+184,26,224,0,2,224,162,0,224,108,3,226,34,6,240,46,5,228,197,10,+225,77,10,1,117,110,65,79,240,41,20,249,219,8,168,64,225,34,17,233,+10,4,224,137,4,129,173,154,77,238,3,0,224,144,3,5,99,111,110,115,+116,114,248,4,2,224,147,2,231,198,3,135,45,224,255,1,238,160,1,225,+230,9,192,35,203,230,162,92,97,67,226,156,1,75,147,138,19,1,49,56,+185,247,224,58,1,250,181,1,129,222,192,59,240,68,5,225,230,11,64,178,+1,95,50,78,89,5,95,49,54,57,56,32,110,100,238,105,2,70,120,1,+53,55,70,211,70,200,243,84,0,231,76,0,225,131,2,226,91,0,225,199,+9,1,116,111,110,48,207,53,97,29,232,214,0,231,227,0,0,55,200,88,+226,111,14,161,179,160,6,235,177,0,197,70,228,193,1,233,123,1,193,75,+96,33,100,126,171,46,244,34,1,204,39,224,21,0,75,71,192,92,5,85,+32,79,32,35,53,250,145,1,96,15,0,52,250,192,1,161,41,225,8,5,+129,6,98,131,155,132,161,183,239,233,4,5,100,97,116,97,67,97,239,68,+1,224,62,0,193,207,78,174,204,30,240,59,1,224,73,10,1,103,99,224,+70,1,128,151,225,157,3,194,248,225,151,12,64,132,5,84,121,112,101,79,+102,169,138,233,110,12,96,78,160,128,224,95,2,96,0,99,50,129,129,229,+177,2,230,63,4,194,164,170,211,237,196,6,128,1,161,169,254,120,3,227,+230,6,227,233,8,128,1,225,41,5,224,29,2,229,185,0,160,252,138,182,+224,252,3,2,109,107,68,160,254,193,60,64,40,109,100,5,32,95,49,55,+53,53,242,153,4,192,243,224,150,7,224,227,5,233,99,12,3,95,50,49,+51,237,252,2,224,43,0,131,141,255,105,33,224,1,3,224,247,9,224,32,+4,223,10,224,17,1,180,230,224,16,8,236,25,1,224,2,9,206,33,194,+126,225,61,5,131,210,2,84,97,103,230,13,5,128,93,229,84,2,160,75,+245,20,2,224,40,1,236,151,2,228,239,4,230,40,10,229,16,7,98,216,+229,16,7,194,143,164,254,228,154,2,98,141,129,114,71,141,81,141,161,61,+144,104,100,124,128,0,225,120,1,64,67,160,180,0,83,127,198,225,1,3,+4,80,114,101,102,105,134,6,224,22,3,1,73,110,192,21,227,40,4,204,+82,229,76,10,236,96,4,230,109,4,199,104,128,162,161,61,224,41,11,0,+107,224,41,0,0,54,67,95,1,53,56,112,74,129,22,224,47,11,0,122,+192,47,97,35,0,89,198,98,96,162,230,62,3,131,170,97,60,165,86,231,+11,4,128,69,0,95,244,164,2,128,0,67,111,0,55,83,12,64,231,6,+95,49,56,49,32,95,55,96,146,1,53,57,211,153,198,99,230,38,4,205,+247,2,67,32,95,70,134,64,203,1,53,50,64,66,0,50,70,199,161,10,+1,53,50,71,158,173,134,0,64,143,159,244,88,10,77,123,0,56,176,134,+0,83,101,141,0,57,65,5,3,95,52,56,56,224,204,0,69,204,197,220,+67,244,70,54,64,19,0,49,229,224,0,73,174,1,95,56,180,157,64,131,+116,157,3,66,32,64,90,109,210,113,183,130,196,133,4,71,166,5,95,50,+48,55,57,32,149,146,244,201,2,64,196,73,116,96,168,1,57,53,128,181,+231,116,13,64,107,0,54,186,240,162,199,234,68,2,65,23,162,11,164,220,+96,62,97,7,64,41,103,204,64,202,225,152,7,225,148,24,64,119,0,53,+96,119,3,95,51,53,50,64,115,0,50,128,5,97,105,64,75,0,54,245,+69,1,64,15,1,50,51,82,38,1,95,55,129,157,64,62,0,52,96,62,+0,85,96,184,99,110,1,56,50,129,111,0,56,69,3,117,81,64,90,96,+168,0,56,67,119,66,96,64,30,96,181,2,48,54,50,229,117,0,96,147,+153,238,1,95,56,110,250,64,95,0,51,252,7,39,205,58,228,110,1,241,+99,0,229,8,4,228,142,2,131,0,3,95,54,53,57,96,173,211,145,97,+200,251,249,28,96,173,225,186,0,241,224,9,224,13,1,198,65,238,8,9,+98,162,237,252,6,224,34,6,128,2,229,43,0,160,17,162,37,128,13,225,+26,0,237,6,2,237,119,2,192,240,224,213,2,96,210,249,220,1,165,63,+148,104,166,172,105,163,229,115,0,128,231,237,77,7,229,165,2,233,11,3,+243,80,9,5,116,111,69,110,117,109,227,247,0,2,50,51,54,224,239,0,+230,31,4,0,83,128,233,192,177,224,79,16,6,101,110,117,109,70,114,111,+192,81,225,34,0,129,97,236,25,1,236,6,2,210,226,242,218,16,192,83,+1,84,111,229,54,0,0,95,210,14,248,229,1,234,38,1,232,44,14,161,+169,224,214,3,129,231,224,202,22,3,84,104,101,110,231,100,0,224,83,13,+203,4,96,2,192,249,241,67,10,226,246,1,237,38,5,65,2,135,81,237,+28,3,233,222,3,162,251,224,110,0,231,142,6,192,78,0,54,169,220,192,+52,199,118,128,233,225,97,16,0,62,212,60,97,14,236,161,3,224,16,8,+192,149,160,181,102,28,167,74,192,174,224,27,9,4,85,32,75,50,32,69,+179,86,189,232,45,0,225,199,8,224,144,1,1,120,49,225,234,14,224,34,+2,0,50,231,230,3,193,52,244,52,2,70,198,87,134,224,122,10,226,100,+19,2,104,101,110,194,104,255,58,10,2,114,111,109,227,48,1,230,246,9,+251,77,3,1,54,50,166,255,100,164,206,5,161,132,64,31,155,109,203,150,+109,52,129,61,245,239,1,137,56,248,161,1,64,74,240,186,3,226,9,2,+226,76,0,226,153,1,137,112,103,177,201,166,137,6,234,9,3,233,19,3,+99,251,236,134,18,102,64,253,154,15,3,101,114,114,111,142,99,68,172,160,+117,72,64,228,109,7,12,58,32,111,117,116,32,111,102,32,114,97,110,103,+235,254,0,64,96,65,21,152,188,225,8,39,101,35,228,93,1,96,194,128,+230,130,25,225,10,10,224,255,14,0,58,133,92,103,70,0,75,135,176,0,+56,183,201,210,194,64,34,136,220,192,166,231,9,44,100,20,196,16,208,127,+195,233,230,229,31,228,96,3,230,243,1,224,16,0,224,13,13,128,173,224,+93,2,230,241,13,224,48,3,128,2,198,237,224,85,1,224,113,1,230,230,+15,193,29,132,141,128,111,230,215,0,80,17,198,215,224,100,4,0,82,229,+8,0,224,23,5,224,52,20,2,66,32,82,251,124,0,228,22,2,228,20,+2,227,211,10,6,109,97,120,66,111,117,110,178,231,224,31,10,1,105,110,+224,31,2,227,243,6,109,236,234,141,2,97,170,238,29,5,64,255,101,124,+74,150,129,13,241,243,15,0,95,237,162,4,96,109,228,78,0,0,53,234,+254,2,96,108,231,139,1,2,57,50,49,253,100,0,224,157,6,236,55,8,+13,67,97,110,110,111,116,32,100,101,114,105,118,101,32,128,211,96,38,1,+50,49,100,160,131,40,229,242,6,96,127,0,54,160,127,225,237,4,64,3,+224,137,0,228,150,2,238,127,0,249,30,6,2,53,51,32,253,138,3,96,+121,234,214,3,160,23,129,49,0,51,76,125,97,227,166,223,1,50,50,156,+171,128,32,96,250,75,0,221,18,96,18,1,55,52,67,180,191,24,237,94,+10,196,75,160,127,244,15,13,246,1,1,128,2,224,48,2,223,237,162,246,+231,134,2,159,184,194,238,255,139,81,193,16,224,96,15,224,253,2,64,78,+241,239,0,254,74,42,68,100,3,10,65,32,80,129,105,172,105,128,11,0,+54,160,14,236,126,2,64,93,102,241,0,85,227,10,0,225,252,0,236,205,+5,225,254,3,228,117,5,193,218,99,37,131,50,242,16,9,128,55,64,133,+1,50,51,128,194,172,215,192,182,0,51,160,136,64,165,0,52,127,75,205,+154,0,52,70,31,160,19,64,41,199,164,254,245,5,4,95,50,48,56,54,+160,112,70,54,0,50,104,204,0,48,175,209,129,115,229,145,3,64,179,128,+21,224,243,10,2,50,48,57,174,92,229,10,0,193,186,64,14,110,227,104,+154,64,214,82,59,194,129,224,7,17,128,55,128,43,231,18,1,200,241,0,+64,68,142,225,89,6,98,158,105,135,193,240,192,0,227,74,0,228,69,17,+228,67,6,68,64,7,97,32,99,108,97,115,115,32,100,65,1,95,56,135,+24,64,42,113,202,100,239,68,220,128,79,89,17,222,148,65,90,227,173,0,+115,239,193,239,225,83,6,1,64,83,161,33,164,106,106,82,128,248,160,5,+64,4,78,162,192,3,128,83,64,174,64,189,0,56,79,121,3,95,49,54,+56,132,87,196,147,68,233,99,79,128,233,64,11,0,85,163,186,96,155,239,+2,1,64,29,226,155,3,160,92,228,174,5,64,162,161,123,1,49,55,98,+219,175,78,193,10,2,95,49,56,184,29,96,0,66,115,137,248,175,165,4,+32,67,32,61,61,82,143,67,178,224,112,2,96,208,0,85,211,204,161,253,+128,109,162,1,64,9,67,0,200,204,64,90,137,61,128,169,96,173,227,128,+17,196,71,228,230,0,254,141,9,228,246,4,192,123,239,46,9,224,55,3,+224,27,0,133,178,128,104,224,143,1,213,164,224,46,14,192,28,232,202,5,+224,107,9,192,82,240,50,4,160,16,112,219,228,83,6,195,49,110,226,0,+48,195,217,224,71,1,2,95,49,55,130,193,224,101,1,238,177,2,0,55,+82,14,225,24,2,104,107,224,161,0,114,116,228,160,4,135,205,69,188,224,+23,6,246,48,3,160,121,128,70,239,191,1,224,187,5,98,110,65,181,128,+15,165,89,129,40,224,201,5,128,58,103,176,247,62,9,64,0,192,189,233,+132,1,128,17,234,88,5,162,19,226,111,3,112,61,226,241,2,128,73,161,+111,224,29,8,224,28,3,224,25,4,160,43,227,153,0,98,186,98,243,1,+52,50,84,106,130,164,1,50,48,67,93,227,128,1,224,15,5,224,42,3,+131,62,227,236,4,0,64,179,255,224,66,4,161,26,229,11,5,64,123,108,+10,231,89,5,64,22,227,250,0,0,55,104,107,240,44,0,70,6,72,89,+102,12,160,84,155,223,180,77,100,3,166,178,230,156,5,224,132,1,244,69,+0,197,230,64,195,100,124,224,103,20,2,50,49,57,147,168,224,97,7,212,+139,232,29,3,162,155,212,132,231,183,1,3,64,64,64,89,233,9,0,201,+6,222,59,129,241,228,141,0,197,206,224,169,3,136,248,225,224,2,232,245,+1,227,129,2,246,181,0,165,83,192,146,231,196,7,0,58,132,185,84,237,+224,197,5,64,24,214,58,134,151,67,52,64,11,5,83,32,95,56,54,56,+97,87,107,62,226,114,6,1,95,57,79,114,231,110,0,64,71,139,51,6,+95,56,54,57,32,75,32,69,76,224,1,7,180,126,64,0,224,28,9,128,+1,228,114,0,224,37,18,224,35,4,224,32,23,64,210,240,48,0,64,165,+0,54,235,89,6,141,140,66,43,97,126,193,159,64,71,126,136,66,36,64,+29,5,67,32,95,51,55,48,202,58,129,9,224,25,14,228,190,3,1,95,+55,66,251,131,4,0,50,85,144,0,80,166,109,162,109,2,55,50,57,137,+56,74,77,137,65,67,43,226,68,0,163,201,96,103,0,39,210,123,130,191,+0,80,96,122,234,208,3,97,250,0,66,104,122,64,13,160,11,136,12,3,+95,49,55,57,162,228,224,116,6,175,104,128,163,97,7,0,89,96,188,215,+232,65,78,160,9,238,220,4,70,194,96,156,66,78,100,128,0,50,224,233,+14,96,7,101,221,225,103,0,197,134,161,99,197,253,158,205,160,244,224,217,+3,129,44,1,52,53,224,16,0,97,91,74,89,225,182,4,161,116,128,210,+225,29,7,166,18,225,52,9,160,161,160,5,96,200,224,28,0,168,180,166,+212,64,174,64,234,224,63,2,224,149,4,224,13,6,128,0,224,80,6,75,+204,224,36,1,152,91,77,71,0,56,136,149,0,52,140,67,66,171,140,16,+101,118,82,192,0,95,64,213,64,23,203,250,99,254,160,213,132,109,160,12,+231,172,1,132,33,236,224,2,65,38,65,34,121,226,192,39,164,71,97,100,+128,10,204,202,231,70,2,64,121,0,51,160,121,0,89,130,142,82,51,0,+49,64,70,210,50,128,20,167,208,230,182,0,231,6,1,78,237,129,206,130,+54,162,169,224,16,3,202,187,65,54,65,16,64,118,243,221,3,195,223,224,+11,2,192,8,101,5,64,47,179,237,1,32,83,64,140,232,237,1,64,39,+169,42,2,67,32,60,252,151,0,168,201,114,37,202,32,224,98,0,133,146,+96,215,65,42,131,21,163,57,1,50,51,89,241,193,85,164,74,231,33,1,+138,168,148,107,246,108,2,102,48,1,50,51,69,80,246,131,8,224,111,75,+160,107,160,97,231,156,3,224,37,1,65,52,234,206,1,235,211,3,162,142,+163,160,232,19,2,128,88,154,241,144,7,90,186,147,132,195,25,158,105,231,+8,9,64,100,237,108,11,243,140,1,64,17,65,206,192,29,176,9,231,16,+14,192,87,160,42,129,69,192,13,208,95,249,249,7,139,131,129,101,228,51,+0,196,122,229,208,1,131,238,240,37,21,233,188,1,97,45,231,141,5,128,+0,0,58,129,133,252,232,0,227,44,2,192,180,236,65,25,229,41,0,131,+2,229,149,1,192,2,96,40,224,79,1,167,9,224,39,9,199,34,224,19,+4,192,37,172,155,162,101,224,23,1,224,61,8,229,185,1,224,71,6,148,+226,242,107,6,128,0,230,193,0,245,117,8,224,16,0,224,192,2,224,42,+0,198,26,160,31,224,153,0,228,92,3,224,81,8,149,65,161,10,97,214,+68,81,227,27,3,234,9,1,179,0,199,111,106,102,64,55,66,228,131,43,+225,213,3,224,236,6,250,238,0,128,105,100,231,149,51,224,41,1,170,144,+160,36,98,160,64,8,227,6,7,243,26,0,197,193,191,106,192,68,248,119,+11,64,111,0,53,88,32,0,95,204,148,66,158,84,238,88,77,0,64,213,+154,224,181,3,227,6,2,199,123,224,89,34,148,171,229,186,0,130,104,96,+5,233,10,6,171,18,132,7,160,0,224,140,8,224,138,1,130,73,129,132,+224,5,18,133,14,239,211,6,106,185,2,95,49,49,64,6,2,85,32,75,+77,13,148,210,224,0,2,225,85,4,226,134,6,227,54,3,129,30,224,18,+3,194,76,225,250,6,96,19,224,17,3,160,193,224,60,5,247,160,2,226,+112,0,128,2,245,119,0,228,66,0,161,13,162,224,160,170,66,132,137,92,+251,160,4,64,22,129,89,133,250,121,114,186,8,160,130,130,51,225,193,8,+236,203,12,225,250,9,253,173,4,64,109,98,78,250,180,18,160,100,96,11,+128,16,232,63,1,225,56,4,224,2,5,193,91,224,37,13,160,28,227,245,+4,64,2,225,107,12,225,125,101,205,186,225,125,58,228,85,20,96,144,135,+239,225,147,8,180,239,228,105,78,64,39,193,226,228,119,47,228,120,8,224,+12,3,128,138,197,229,96,116,224,113,2,233,33,5,192,52,193,18,129,122,+228,116,6,117,15,65,176,233,116,7,228,204,20,228,170,17,250,209,3,226,+207,0,192,54,65,128,105,112,141,48,112,50,64,65,245,192,1,6,114,101,+99,83,101,108,69,253,176,0,0,64,149,240,176,200,239,171,9,1,95,56,+153,119,104,49,239,155,3,224,37,1,3,95,56,51,50,246,34,2,3,103,+101,116,36,219,48,224,75,3,64,64,143,148,224,43,1,6,115,101,116,70,+105,101,108,91,96,64,30,0,54,224,30,6,13,68,97,116,97,46,82,101,+99,111,114,100,115,46,83,224,43,5,140,141,224,118,4,224,30,3,140,148,+224,74,14,2,72,97,115,224,43,3,0,51,235,207,2,255,173,2,0,51,+66,210,64,31,235,239,1,192,29,160,7,64,28,245,209,3,225,210,13,227,+95,8,64,54,138,222,86,117,241,241,0,0,58,131,255,185,116,64,10,106,+70,162,157,227,10,0,224,9,9,102,138,64,16,96,14,0,80,78,198,134,+121,0,75,73,179,131,255,224,10,2,94,154,146,71,224,6,3,0,75,224,+31,1,64,136,129,234,2,83,32,73,240,132,3,246,177,5,235,190,16,221,+26,248,155,0,234,86,3,234,84,19,192,35,224,88,5,98,151,164,113,133,+40,218,216,233,234,3,0,95,111,126,224,68,2,235,116,3,131,159,242,226,+4,2,95,49,55,95,253,244,44,6,224,56,11,224,90,1,224,112,3,235,+224,4,138,163,224,139,0,166,13,128,51,230,34,1,228,95,7,233,167,4,+165,158,234,19,8,229,17,1,100,144,244,32,3,160,57,212,35,235,32,1,+251,62,16,229,240,19,224,189,3,202,170,160,239,226,113,0,165,147,132,241,+234,86,1,162,126,229,139,7,81,225,96,141,126,231,1,50,50,64,15,96,+121,1,95,56,168,40,3,95,50,49,53,130,124,100,123,102,221,100,177,228,+149,3,164,130,250,132,3,5,77,101,116,104,111,100,228,197,2,111,158,224,+139,0,2,95,55,48,80,193,133,129,244,248,32,226,62,1,206,245,129,146,+237,68,8,133,135,2,50,51,50,254,145,2,1,95,55,124,132,224,125,49,+0,49,133,102,224,126,26,96,0,224,87,3,112,87,200,77,224,92,12,168,+112,130,47,231,130,12,96,195,254,48,1,224,0,3,68,14,133,184,114,171,+0,56,84,17,1,50,51,72,94,64,25,0,54,132,200,77,16,94,125,1,+53,32,225,168,2,3,100,102,108,116,65,159,64,39,242,61,0,227,255,15,+241,29,35,235,51,1,160,28,97,107,227,229,6,111,244,251,85,6,211,238,+242,33,1,224,108,0,2,95,50,49,119,179,249,67,11,225,149,1,232,184,+9,224,23,3,161,179,1,50,51,96,210,249,141,12,224,74,66,65,86,211,+124,254,124,12,154,188,161,246,64,74,97,38,151,44,96,61,198,249,183,106,+73,199,151,101,0,50,73,205,183,101,64,40,135,2,247,77,8,105,178,160,+95,224,1,9,239,152,0,96,0,224,35,26,224,32,23,224,29,20,224,26,+17,224,23,14,224,20,11,224,17,8,247,177,4,96,0,65,14,135,244,64,+38,2,95,49,57,81,141,162,184,251,81,3,91,164,118,16,133,68,251,220,+4,64,15,251,221,3,64,43,99,122,160,43,224,70,2,78,95,242,230,2,+2,95,50,51,100,41,96,123,227,74,9,116,163,64,29,130,216,96,7,224,+151,6,130,85,147,83,96,17,98,119,197,180,251,164,2,1,49,57,237,44,+0,97,16,224,195,5,64,108,203,132,224,161,4,68,143,67,107,164,193,232,+56,11,241,139,6,163,147,172,87,128,83,231,238,2,128,122,225,18,17,224,+191,15,0,56,133,159,224,193,1,128,1,242,8,8,160,220,97,240,131,117,+128,187,67,116,0,49,67,41,229,124,6,224,104,6,65,76,0,57,128,243,+192,240,228,130,1,98,58,86,86,73,233,227,187,1,224,210,7,2,95,49,+57,155,218,124,193,192,37,66,105,213,6,118,226,72,103,230,70,5,72,120,+64,143,229,41,5,128,66,224,33,18,112,157,225,162,3,240,183,5,225,83,+0,128,28,136,118,224,184,1,224,49,5,160,109,161,196,3,95,49,53,53,+192,193,224,44,11,224,43,1,234,86,1,203,85,217,159,64,248,0,49,139,+9,64,185,69,21,231,52,5,98,28,243,46,3,65,67,184,59,66,25,96,+34,160,54,194,129,65,207,106,166,130,90,70,24,225,217,2,224,95,33,1,+50,51,125,92,96,102,234,17,2,224,56,40,226,226,1,128,138,3,64,95,+57,57,162,145,64,254,237,106,1,86,105,128,158,192,99,66,169,199,237,187,+118,69,174,1,55,57,96,71,224,243,23,1,95,55,111,73,240,127,1,224,+249,10,224,8,10,160,204,224,243,0,142,247,99,43,160,5,224,68,8,224,+50,19,224,44,18,225,25,1,225,31,4,98,79,96,237,0,55,157,229,96,+0,65,43,168,156,142,243,195,36,195,200,193,60,163,10,128,113,227,13,5,+168,244,243,140,3,227,86,12,139,116,161,241,224,33,12,242,254,0,226,247,+8,192,25,228,170,0,165,152,249,48,4,68,112,127,185,90,50,228,38,0,+248,229,4,128,215,229,16,6,193,50,111,240,1,56,50,98,108,0,48,98,+76,227,92,0,0,95,176,33,244,166,6,98,16,0,53,64,96,2,50,50,+48,233,187,4,2,98,105,110,79,31,196,190,237,143,6,66,175,74,241,80,+219,3,51,32,95,53,92,4,224,59,1,2,78,117,109,171,150,228,74,4,+225,243,3,64,151,229,133,2,192,28,224,25,8,128,16,229,108,1,211,61,+64,193,64,236,76,89,173,15,224,244,0,233,245,3,224,13,8,226,140,5,+225,233,0,129,142,193,199,193,126,228,69,0,131,206,162,181,130,178,67,208,+225,166,1,226,178,3,225,213,4,0,85,71,109,160,151,228,47,11,97,203,+225,11,4,224,159,4,224,29,8,225,41,35,137,238,1,50,51,160,8,225,+7,4,231,68,11,98,24,195,56,98,157,224,95,17,101,58,0,67,226,157,+6,224,17,12,232,129,9,65,185,1,52,54,226,49,3,5,102,117,110,100,+101,112,98,52,0,90,226,108,11,224,173,6,231,10,33,203,1,227,145,9,+192,25,128,247,232,254,10,0,55,131,180,233,146,9,226,123,4,102,169,71,+184,103,222,231,192,3,224,116,10,231,42,4,224,115,11,111,254,224,115,50,+226,236,9,224,136,13,132,242,224,136,0,227,156,9,224,148,1,97,10,0,+48,97,45,224,132,18,128,0,197,66,129,159,225,142,9,229,65,0,225,175,+15,246,193,0,225,57,47,224,162,22,224,89,10,128,147,232,146,4,163,218,+227,127,0,229,163,5,0,56,86,207,2,95,49,54,167,174,64,44,245,165,+1,168,72,228,85,12,160,104,228,84,4,228,81,12,228,80,4,224,127,4,+68,77,224,205,1,228,11,3,227,174,7,224,189,11,64,180,96,59,64,105,+235,188,12,64,24,226,75,0,224,170,116,0,56,139,59,236,254,10,138,138,+224,185,20,227,8,7,3,95,51,53,48,114,185,72,46,0,54,176,203,117,+91,64,122,166,157,227,116,9,227,14,0,228,210,5,128,20,241,70,8,96,+41,237,146,3,152,247,192,28,130,25,237,137,8,66,170,183,71,166,199,66,+192,1,51,49,64,66,230,56,2,192,96,162,250,224,69,1,229,244,6,1,+56,57,150,159,140,79,224,58,4,160,178,224,16,3,143,191,232,84,1,228,+6,0,197,182,64,16,192,231,206,201,134,27,166,33,238,213,3,129,196,0,+52,114,9,129,218,70,13,2,57,32,95,117,62,0,35,224,243,0,3,49,+57,50,49,208,203,147,232,2,49,53,52,65,187,230,15,1,11,66,97,100,+32,100,101,114,105,118,105,110,103,232,74,1,232,70,10,160,17,224,199,2,+234,152,12,224,171,8,225,197,4,162,194,213,54,97,97,245,41,13,65,155,+0,56,207,21,224,56,0,128,248,239,224,6,183,150,166,171,160,5,64,4,+76,230,192,3,242,160,9,160,125,224,75,3,255,235,0,128,236,239,10,5,+122,95,226,67,7,226,57,0,1,95,49,65,95,151,221,224,104,7,130,58,+3,48,32,95,55,114,246,69,50,224,6,0,224,223,3,224,112,3,0,83,+161,109,224,212,20,226,146,5,67,57,2,54,56,57,76,160,154,205,133,48,+246,147,2,232,150,5,224,253,8,64,62,212,151,67,191,212,73,133,176,169,+153,192,2,64,46,2,57,55,50,64,149,1,95,49,86,106,1,49,57,123,+1,81,167,172,70,236,141,10,224,5,0,74,207,128,38,201,168,195,16,195,+50,233,174,9,226,149,13,224,36,6,226,154,2,224,29,9,224,20,0,228,+255,3,157,205,233,189,1,240,182,5,224,14,6,151,152,129,60,225,122,1,+0,53,249,167,0,233,234,11,231,68,8,201,210,2,50,48,56,125,204,0,+48,148,69,231,223,1,224,95,9,162,132,224,95,11,131,91,163,161,234,176,+0,232,87,2,160,128,0,54,138,75,130,227,224,125,19,96,0,66,0,148,+243,0,83,64,29,1,53,56,96,42,64,49,64,25,0,51,212,207,234,44,+4,96,70,227,21,2,64,41,219,211,234,65,0,96,161,239,100,2,243,202,+5,0,48,99,69,226,4,0,133,72,128,11,101,67,236,34,7,226,71,0,+196,124,192,86,230,2,6,198,129,128,253,224,94,5,194,86,226,129,11,230,+164,4,226,128,9,124,10,160,61,64,139,80,78,253,232,4,64,19,169,210,+3,95,51,54,55,100,233,134,116,2,85,32,65,193,112,235,137,12,97,61,+148,255,84,33,1,49,32,64,15,188,205,185,219,254,13,3,19,80,114,105,+109,105,116,105,118,101,115,46,67,111,110,115,116,114,97,105,110,120,19,64,+71,65,141,161,133,236,120,2,163,122,234,64,45,237,146,2,129,16,235,240,+1,192,25,252,155,1,166,254,234,21,22,160,37,137,214,193,207,233,211,3,+162,240,224,80,0,224,15,7,229,229,10,224,34,1,237,30,9,64,211,1,+95,51,79,92,136,66,225,132,5,87,163,0,52,133,219,3,50,51,48,55,+248,19,2,65,80,242,54,1,253,105,20,170,165,98,48,64,70,179,50,0,+66,166,238,97,17,110,66,179,203,64,90,145,101,194,132,224,92,18,226,168,+0,246,161,19,236,44,4,231,178,10,227,126,6,204,224,224,90,1,135,162,+199,138,162,17,131,103,227,3,2,228,123,2,65,180,96,236,64,51,130,108,+92,173,182,230,157,109,229,165,6,127,82,227,219,1,64,60,64,135,225,28,+6,224,75,14,161,54,0,54,97,54,0,75,96,177,217,223,192,102,211,242,+185,145,96,47,134,221,224,47,7,1,66,32,224,43,11,133,8,132,66,232,+224,6,97,30,0,54,71,117,104,200,167,122,232,65,12,230,28,38,0,51,+92,216,165,158,2,49,57,52,131,40,128,112,224,126,1,1,95,56,182,49,+252,255,32,252,254,30,64,246,133,229,194,62,70,64,231,245,25,96,206,64,+230,153,174,98,8,64,25,64,79,134,11,225,230,0,224,76,19,128,237,64,+60,0,48,102,113,64,67,68,249,3,50,50,57,57,69,9,64,22,180,139,+132,160,224,9,1,161,164,212,149,161,7,230,23,2,160,39,226,228,1,228,+216,5,197,131,226,234,0,224,47,22,205,12,224,47,0,165,50,224,47,15,+200,205,160,89,224,47,23,216,17,225,207,0,224,47,23,202,87,128,27,229,+112,9,224,31,5,173,93,129,62,107,222,70,178,160,163,224,64,13,248,162,+0,128,61,231,146,16,227,228,5,240,244,2,231,84,3,161,226,224,27,0,+205,80,249,11,2,224,136,15,224,165,3,130,203,133,230,100,52,76,250,236,+231,6,15,116,121,112,101,32,97,112,112,108,105,99,97,116,105,111,110,236,+239,1,225,183,0,231,255,2,246,196,15,86,56,224,51,1,193,52,128,40,+230,178,5,171,75,128,26,172,255,160,194,128,56,183,248,143,230,97,5,132,+94,2,50,48,51,99,21,0,79,164,226,5,67,32,95,53,55,53,64,47,+214,100,1,50,48,138,181,201,201,0,51,243,228,4,1,36,120,192,218,225,+26,1,194,249,231,0,8,234,102,2,0,52,157,27,167,41,247,14,5,106,+4,65,214,237,61,2,228,25,0,224,83,1,73,193,235,41,0,224,2,0,+170,115,192,245,97,90,224,31,3,226,206,3,231,254,2,132,21,125,28,141,+46,237,52,0,226,90,2,225,61,2,137,97,1,50,48,189,78,193,184,234,+18,17,97,130,70,245,109,209,229,191,3,227,253,3,234,20,4,224,202,2,+224,127,23,224,36,5,224,42,5,174,178,64,45,133,39,64,0,229,195,1,+228,117,1,225,52,5,130,110,231,51,0,66,108,225,219,1,0,66,74,84,+231,92,12,202,245,128,13,165,235,238,238,0,0,75,133,108,64,119,239,46,+0,224,189,13,98,48,1,51,53,241,240,3,192,207,224,208,2,1,55,48,+96,5,227,189,1,128,30,224,142,0,252,212,10,227,37,4,238,108,4,225,+181,7,130,179,134,92,226,209,9,245,189,30,227,187,0,195,242,225,222,0,+144,224,192,13,128,30,64,65,227,203,4,192,1,202,117,225,164,1,161,170,+241,40,0,224,48,4,107,122,224,49,12,224,131,5,194,100,160,223,224,83,+0,236,140,6,229,180,12,2,95,50,49,114,4,161,212,161,218,194,35,227,+173,7,146,36,97,45,242,30,3,3,79,32,35,49,65,152,201,95,226,10,+11,225,248,0,224,158,1,1,49,53,103,190,235,186,0,73,169,96,97,118,+50,228,206,1,160,50,64,30,65,20,65,168,68,88,3,95,49,53,57,68,+113,131,61,96,41,0,95,171,37,192,0,228,48,5,129,43,229,156,5,160,+239,229,156,11,224,40,5,227,230,4,196,33,246,78,13,196,77,230,238,0,+160,128,128,49,228,29,0,227,131,4,193,201,160,31,225,38,2,225,180,2,+225,242,3,226,28,2,224,42,4,224,123,0,224,36,5,225,146,2,224,181,+1,160,29,225,154,0,226,3,3,194,9,192,56,160,36,67,76,1,54,48,+80,225,79,226,64,5,0,57,225,130,0,64,43,0,79,79,50,0,95,238,+111,0,2,79,32,35,94,212,162,24,194,31,192,160,227,189,6,226,52,6,+227,168,7,129,99,162,176,83,93,0,49,67,159,226,136,4,228,140,0,99,+10,228,248,2,97,109,160,5,101,4,224,119,0,228,180,14,236,229,5,0,+53,232,57,2,224,186,2,224,68,21,224,74,21,224,75,2,224,77,0,226,+93,5,160,63,228,117,11,227,220,9,67,207,129,1,224,67,11,194,70,228,+55,7,228,33,8,129,48,160,170,197,107,226,59,4,224,70,0,160,67,97,+76,224,79,0,245,201,5,2,95,50,48,183,39,160,30,253,254,6,0,54,+136,63,160,0,195,15,224,182,4,233,251,6,1,49,55,228,67,1,224,145,+0,234,41,16,160,45,224,124,26,64,32,238,4,4,225,182,6,1,49,56,+213,33,166,189,228,8,28,236,225,1,224,91,21,99,61,224,91,2,128,176,+230,219,10,0,80,110,222,118,22,225,232,16,228,234,2,192,65,232,26,16,+224,13,1,128,196,132,17,163,250,192,144,67,181,64,3,242,183,1,0,49,+107,44,227,121,0,96,46,234,77,1,19,98,97,100,32,102,105,110,97,108,+32,100,111,32,115,116,97,116,101,109,101,178,90,224,220,1,64,1,167,14,+224,16,8,231,106,0,228,210,3,229,162,1,224,30,1,160,82,224,25,9,+199,77,224,25,4,96,19,192,106,161,168,164,11,224,131,2,230,247,12,65,+164,247,126,1,128,147,161,60,201,81,203,156,224,8,36,231,23,3,224,135,+2,228,85,13,203,204,101,131,96,9,210,22,0,85,243,215,2,2,62,62,+61,249,151,2,224,217,8,236,43,8,224,36,8,119,215,113,78,160,26,227,+108,16,0,49,140,218,226,72,0,71,160,128,37,136,144,96,36,1,50,49,+100,241,2,95,49,54,135,107,160,116,128,49,64,38,224,59,1,64,47,70,+60,146,60,224,61,3,129,113,128,126,224,253,20,3,102,97,105,108,192,254,+64,44,78,21,70,36,2,49,53,50,100,136,226,165,2,2,105,110,100,160,+41,64,146,230,195,0,102,107,237,33,9,0,98,224,85,1,229,236,15,234,+218,3,227,233,0,225,178,29,225,177,0,225,38,0,224,103,12,238,251,4,+65,167,169,64,224,53,21,224,157,7,228,82,3,224,57,0,224,176,1,173,+211,194,220,3,95,50,49,57,118,125,224,175,1,3,95,109,102,105,174,49,+224,22,3,4,114,101,116,117,114,239,36,2,128,164,64,7,131,134,117,58,+102,20,0,51,64,181,97,203,103,245,243,179,2,1,95,56,244,134,1,192,+0,229,105,5,228,225,5,128,27,165,111,162,179,227,244,1,224,39,14,239,+144,4,196,25,224,39,10,166,31,228,136,5,128,39,229,231,4,232,28,4,+233,205,2,197,126,160,2,224,101,14,238,63,8,224,39,14,162,158,224,39,+11,224,141,4,245,144,4,237,223,7,226,20,16,193,141,64,87,65,242,241,+12,4,9,70,114,111,109,84,104,101,110,84,111,161,221,160,45,139,176,0,+66,64,7,228,80,12,224,125,16,236,12,2,96,16,224,115,18,128,113,224,+101,84,160,213,224,99,13,225,151,24,162,175,225,151,24,237,89,2,224,179,+12,192,173,64,18,224,169,14,96,167,224,159,4,224,77,2,198,52,162,171,+234,33,7,229,165,0,0,89,224,44,3,192,127,64,53,150,72,224,147,1,+234,185,12,96,23,233,73,3,136,148,0,52,142,68,231,188,0,128,2,231,+137,1,231,179,1,227,153,1,224,21,6,96,18,128,207,65,0,231,153,11,+248,183,6,89,131,160,0,226,226,17,96,77,96,97,225,15,7,160,25,108,+81,65,156,112,39,92,78,80,140,234,27,0,160,143,160,95,65,152,0,50,+95,200,224,66,5,103,207,229,64,4,101,157,254,216,1,227,95,2,96,49,+236,218,16,0,50,64,177,236,218,20,98,31,128,115,128,107,70,6,224,145,+3,192,101,64,80,0,50,160,130,224,52,12,160,157,149,6,161,178,233,220,+23,13,114,101,99,32,110,111,116,32,97,108,108,111,119,101,199,65,231,62,+0,129,45,238,209,4,140,219,194,19,232,62,0,201,10,129,14,236,55,5,+226,61,0,172,104,128,202,119,104,225,164,11,98,24,226,147,5,64,16,126,+131,161,136,233,97,1,227,52,8,104,88,130,137,174,32,65,54,176,152,128,+1,226,117,12,194,232,233,16,1,249,233,6,224,200,40,227,55,0,226,169,+4,129,32,245,92,4,209,180,224,246,5,224,243,0,143,149,160,236,224,84,+76,128,66,129,67,232,246,5,230,245,4,129,26,162,221,119,33,65,90,98,+205,193,114,145,23,245,192,24,224,197,16,99,46,1,49,54,112,133,128,22,+242,209,0,224,200,5,2,95,49,48,194,5,233,0,1,228,22,7,67,122,+1,50,49,225,20,1,239,175,1,194,10,226,205,5,161,254,224,29,0,226,+202,9,226,2,8,226,250,0,226,11,2,130,176,1,50,48,120,201,64,82,+1,95,56,74,126,246,189,0,224,201,16,160,205,165,62,160,129,230,114,1,+251,186,5,229,243,4,196,26,227,151,8,239,67,7,129,220,96,24,227,98,+3,234,123,0,224,96,2,197,15,230,62,18,224,43,5,164,169,237,104,4,+0,50,185,6,229,92,0,225,244,7,160,18,248,109,8,1,50,54,224,238,+1,224,170,6,236,206,2,225,49,1,160,2,224,51,0,64,1,231,216,4,+165,83,193,96,128,2,224,46,17,231,0,2,230,215,0,238,115,12,233,206,+4,226,88,6,128,11,111,7,192,24,228,126,6,191,172,226,0,0,231,111,+3,224,160,0,226,160,3,160,2,239,44,11,249,105,0,224,47,5,96,18,+224,39,4,224,245,7,133,43,224,79,2,224,2,7,192,157,224,196,1,160,+57,225,0,1,225,146,2,224,58,3,224,153,0,224,67,27,245,236,2,224,+35,3,96,199,248,53,3,224,39,14,129,115,64,19,241,102,5,226,194,12,+192,44,128,128,236,142,2,225,120,4,224,132,2,224,193,0,224,114,11,224,+239,2,228,65,4,226,52,0,224,53,2,224,242,4,232,82,0,224,49,3,+224,236,4,224,33,8,224,117,0,224,16,1,246,102,0,224,70,3,228,29,+1,224,75,0,228,103,1,224,59,1,225,55,3,224,79,77,225,81,1,232,+150,0,143,64,105,128,102,35,1,56,48,142,75,0,50,159,249,224,22,9,+243,220,1,3,95,50,50,55,241,188,1,224,103,3,225,24,8,128,117,122,+20,224,78,5,0,55,226,65,0,195,38,64,239,160,89,64,6,224,110,1,+230,93,17,101,217,133,8,208,6,144,106,0,51,235,232,3,64,9,5,83,+116,114,105,110,103,243,50,8,128,173,224,96,5,194,136,229,38,7,85,191,+132,193,224,237,16,147,110,225,110,0,194,121,229,198,2,218,37,121,116,112,+200,224,0,3,224,88,1,227,112,8,227,220,1,224,125,10,224,192,2,227,+105,19,227,104,12,224,209,4,227,98,0,224,100,10,128,1,227,28,8,226,+128,0,224,50,8,228,132,6,227,133,9,226,21,7,88,223,65,250,198,39,+226,70,24,192,48,236,21,3,226,76,8,104,130,72,8,3,95,49,50,48,+69,235,1,49,52,193,119,224,45,15,0,56,102,25,128,45,0,50,255,231,+0,64,0,226,139,59,6,82,97,116,105,111,110,97,243,86,0,226,141,143,+224,89,2,226,144,10,225,164,1,224,39,4,230,1,114,224,17,1,226,164,+17,224,56,12,231,42,6,224,121,1,224,45,4,226,174,8,2,50,50,56,+226,120,1,224,67,49,225,72,1,231,169,0,224,67,40,225,186,1,224,67,+49,229,209,1,224,203,49,232,22,1,231,142,15,225,214,11,224,73,11,240,+46,6,230,73,18,0,56,237,68,0,163,194,228,6,24,108,80,181,150,228,+5,24,96,44,0,50,234,30,0,137,248,192,50,167,26,131,243,1,50,50,+85,215,192,49,64,11,167,71,1,57,53,64,23,2,50,50,56,251,254,1,+224,67,15,1,49,56,68,64,128,67,206,196,224,65,3,171,19,224,178,15,+224,128,10,224,44,15,224,105,10,128,0,228,226,59,6,73,110,116,101,103,+101,114,228,225,152,194,49,6,80,32,75,32,95,51,54,95,133,1,56,51,+97,22,128,132,97,39,96,20,0,55,96,20,67,239,2,95,49,57,110,86,+96,199,224,118,2,128,146,0,83,169,183,230,252,3,64,2,224,184,5,234,+130,6,227,54,0,192,29,193,175,235,111,9,225,9,5,225,6,2,227,90,+0,226,93,0,128,158,129,72,96,211,121,185,226,79,2,1,49,57,231,9,+0,224,122,18,228,159,0,224,122,70,231,86,2,253,130,0,83,145,253,143,+1,192,100,96,112,192,109,66,229,243,103,0,128,27,235,25,1,226,68,10,+1,49,56,132,39,252,20,0,228,150,3,160,242,192,95,96,66,236,25,8,+224,132,2,228,213,1,224,50,4,237,189,1,128,18,236,67,11,228,208,8,+226,205,8,129,61,224,20,6,253,212,10,224,227,5,65,15,239,41,5,227,+80,2,188,17,164,3,135,129,247,25,6,2,95,49,53,67,102,79,2,64,+60,0,80,148,210,122,53,148,178,1,57,53,65,7,4,79,32,35,52,54,+183,38,0,95,99,250,96,0,226,255,1,64,135,149,6,227,101,2,224,30,+19,225,3,2,230,109,1,225,86,1,0,83,64,225,1,55,53,100,213,250,+95,1,162,91,224,38,5,1,48,54,128,32,235,6,4,241,45,7,84,25,+226,80,8,225,78,9,2,83,32,73,126,196,161,45,227,5,1,155,77,245,+20,5,0,85,65,44,64,67,1,95,55,196,36,2,64,95,55,155,148,1,+49,57,237,35,3,228,163,0,160,141,100,148,193,33,97,125,86,35,252,17,+2,3,32,99,97,110,86,22,20,98,101,32,117,115,101,100,32,97,115,32,+97,32,118,97,114,105,97,98,108,101,165,87,224,189,9,115,241,0,57,71,+202,225,187,3,225,66,1,128,132,245,86,8,226,29,1,4,85,32,64,90,+32,227,129,0,85,156,64,33,243,46,6,225,254,1,160,134,3,95,51,52,+55,252,183,2,31,92,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,92,34,44,50,48,55,5,51,58,+49,48,58,32,96,196,96,89,224,59,3,6,116,99,69,120,112,114,58,192,+254,5,104,97,110,100,108,101,160,44,64,183,127,34,64,53,5,52,54,32,+95,55,48,65,70,247,213,5,160,81,2,79,32,35,95,150,130,175,96,44,+2,49,48,57,225,144,0,224,50,4,8,58,50,50,57,57,32,64,10,65,+98,14,89,205,226,143,12,132,25,229,221,6,232,219,2,224,49,2,226,92,+1,229,232,6,229,75,0,226,202,0,230,30,27,228,58,0,227,197,2,224,+56,4,224,107,13,192,237,128,27,192,59,226,209,1,224,31,5,227,19,0,+226,165,1,0,50,225,48,0,224,64,12,248,44,2,64,60,233,214,4,224,+109,9,224,108,9,99,58,163,172,229,183,15,192,85,128,56,197,232,164,2,+160,104,229,176,7,224,144,0,121,162,96,132,223,132,224,130,2,224,134,0,+231,199,2,160,8,224,200,3,96,118,228,138,9,224,52,1,230,70,2,192,+58,224,55,3,196,155,228,156,2,228,159,19,224,59,0,231,100,3,160,92,+228,165,89,225,81,2,226,219,3,178,139,96,210,225,215,7,167,84,224,180,+2,192,38,235,172,10,79,175,227,234,1,8,68,97,116,97,46,70,117,110,+99,79,14,1,46,36,234,44,0,0,82,192,8,160,141,226,141,8,64,25,+74,191,0,50,139,68,64,104,93,50,163,224,251,223,1,224,38,31,225,157,+1,227,94,1,225,157,6,247,107,1,227,41,21,68,75,0,56,100,75,100,+133,69,140,106,57,0,57,75,251,64,28,0,55,96,28,226,110,9,225,229,+0,224,14,4,64,11,128,43,128,2,126,106,226,21,2,132,174,160,192,224,+84,0,232,138,8,128,16,224,55,2,228,111,8,254,30,1,224,111,3,96,+55,224,127,3,224,159,0,226,124,2,224,97,1,160,74,96,131,227,205,4,+64,26,224,61,2,224,75,0,234,32,2,1,57,57,164,33,130,170,224,126,+0,96,83,252,218,1,224,86,4,96,16,248,182,5,96,60,65,229,2,50,+49,55,102,171,1,49,57,202,45,192,131,132,65,96,177,225,49,0,160,234,+193,11,227,77,4,224,122,0,227,85,3,128,76,2,95,50,49,70,100,160,+71,0,79,108,72,134,114,64,32,167,75,250,189,5,2,64,95,53,68,73,+236,140,1,2,95,54,52,141,128,132,189,255,248,1,225,209,0,226,41,1,+225,125,0,128,147,230,166,0,230,74,3,224,30,1,192,1,192,51,161,87,+224,75,6,160,241,128,59,96,83,66,207,96,175,128,26,228,6,1,193,190,+224,136,4,160,106,249,97,0,160,142,229,158,5,231,71,2,246,218,2,198,+0,224,2,0,193,57,131,135,242,58,4,235,72,1,253,51,1,224,226,1,+165,200,160,53,224,222,3,68,129,2,53,50,52,96,5,231,125,0,128,60,+128,38,227,232,4,2,49,57,57,241,74,3,96,35,137,84,127,226,1,50,+50,224,30,1,226,75,1,66,158,192,179,160,148,226,176,14,238,210,1,224,+187,0,128,185,224,184,1,194,76,166,177,64,114,196,165,225,19,5,230,122,+4,224,101,4,224,254,1,64,26,145,92,1,57,56,75,207,73,184,1,95,+56,79,174,64,0,226,8,0,224,61,6,157,179,0,51,111,60,97,51,2,+95,50,48,158,99,255,172,2,224,255,7,189,130,64,184,0,54,106,60,128,+90,227,19,5,96,66,172,0,233,130,8,0,54,233,130,0,66,75,0,80,+133,46,0,53,96,20,0,90,65,38,64,14,0,52,160,35,224,177,1,251,+192,1,99,62,128,248,128,5,71,84,1,48,32,64,122,0,75,227,134,3,+86,0,96,129,0,85,130,137,129,184,230,208,4,2,95,57,52,234,206,32,+5,49,52,55,58,49,54,170,161,65,3,0,85,166,64,231,132,5,132,45,+0,53,138,187,2,51,48,54,81,55,75,166,7,52,48,52,32,95,52,48,+54,71,208,235,255,2,4,103,101,116,36,46,128,82,2,95,56,53,102,92,+97,91,255,205,1,1,50,50,69,49,244,217,2,97,32,0,51,97,32,104,+30,225,160,1,228,208,1,96,248,85,69,71,248,5,52,32,64,95,54,32,+127,19,64,7,1,55,48,65,242,1,49,56,162,226,0,85,81,18,128,100,+160,14,119,107,160,15,64,107,0,50,161,140,194,151,226,71,3,254,118,1,+224,31,3,241,75,1,66,7,165,152,100,160,126,111,144,25,0,50,131,224,+64,97,0,49,160,97,1,80,32,101,28,162,4,0,48,167,95,1,56,57,+65,69,0,50,95,53,0,58,148,6,224,22,4,0,49,128,22,199,141,192,+22,0,50,128,22,135,135,224,22,0,167,158,65,11,1,10,65,225,251,2,+17,80,114,105,109,105,116,105,118,101,115,46,87,111,114,100,54,52,34,128,+39,130,151,224,62,1,160,131,130,159,224,62,16,160,60,129,164,224,146,1,+0,52,128,22,129,79,224,22,1,160,146,225,4,2,67,123,129,4,84,155,+192,21,65,175,128,21,82,151,192,21,65,125,160,21,225,2,7,0,48,128,+22,129,2,236,73,3,132,47,101,134,236,154,1,236,100,20,0,49,231,224,+1,64,1,194,115,229,173,1,224,31,5,233,58,0,67,226,228,186,7,228,+93,1,181,15,224,88,19,224,30,5,224,87,42,163,148,160,222,192,25,128,+105,131,52,65,7,133,35,225,27,0,224,250,3,131,38,225,60,6,224,32,+3,240,148,0,229,141,3,224,32,3,227,32,1,224,220,6,192,24,104,65,+245,255,3,104,211,224,27,2,111,17,69,72,68,236,65,231,224,44,3,204,+121,96,131,168,245,224,244,0,160,130,100,89,224,104,10,224,59,0,224,157,+10,128,248,224,157,11,249,14,5,168,78,224,108,1,100,58,140,26,224,134,+6,97,158,224,81,11,231,45,0,224,26,9,242,244,2,224,80,9,96,137,+224,53,11,167,191,224,26,11,244,144,11,67,39,0,54,227,212,17,2,73,+110,116,131,211,64,60,224,36,18,196,55,64,126,224,38,4,0,68,77,3,+183,45,0,95,70,90,192,12,160,47,132,42,224,86,12,2,68,111,117,146,+10,64,39,132,59,224,39,12,3,70,108,111,97,192,165,132,75,224,126,6,+3,66,121,116,101,159,31,96,124,3,114,110,97,108,224,19,2,160,57,132,+111,232,90,1,130,82,139,190,2,95,57,52,165,210,107,49,0,58,131,75,+228,114,3,66,78,64,22,132,137,224,166,12,2,67,104,97,160,244,64,44,+168,9,67,215,226,129,1,2,95,50,50,104,143,232,122,2,237,167,6,2,+50,52,55,192,141,231,132,9,149,9,64,96,129,209,119,244,0,49,198,174,+0,54,133,133,72,232,3,10,65,32,89,224,126,0,171,49,227,191,11,240,+110,1,232,65,4,115,114,128,87,128,29,240,140,1,131,160,240,139,0,168,+44,143,39,1,55,54,100,171,128,55,175,64,162,218,231,247,3,123,167,192,+182,152,145,130,177,64,30,64,192,130,98,224,220,2,0,85,224,158,16,233,+1,18,160,135,224,161,2,239,203,6,2,50,50,54,96,7,160,40,224,138,+2,129,99,230,228,5,0,48,67,69,64,22,200,52,196,146,65,211,2,51,+32,64,65,111,64,178,97,238,197,121,237,152,0,224,189,3,225,86,5,133,+235,111,4,226,21,2,107,144,97,238,128,218,162,11,97,119,112,4,224,0,+3,168,160,226,73,3,249,246,5,0,52,139,137,238,104,2,64,180,76,82,+224,12,0,64,38,2,50,50,50,193,215,242,167,2,226,159,3,238,173,6,+193,91,225,123,3,67,63,234,171,4,171,45,96,43,128,167,235,176,6,128,+218,0,57,67,90,166,107,224,29,3,97,182,1,50,48,105,227,1,49,51,+109,59,64,14,99,174,203,213,227,41,9,131,230,235,187,8,224,215,3,204,+123,246,72,4,192,139,128,102,0,50,169,201,227,174,3,67,71,192,198,70,+83,108,108,0,49,71,158,226,1,4,144,233,224,56,1,65,178,194,24,161,+3,225,243,54,225,154,5,225,153,5,74,138,137,62,128,251,226,33,13,224,+48,6,138,160,0,65,128,103,128,47,128,130,130,62,244,131,6,67,62,130,+201,99,21,201,227,153,128,98,126,1,51,49,65,91,64,85,97,83,0,51,+81,162,64,83,232,112,18,172,215,231,178,10,224,25,0,226,113,0,238,59,+1,111,185,96,18,206,88,129,247,174,10,3,49,55,55,54,229,225,0,1,+51,53,77,107,66,147,64,242,229,249,0,192,0,224,121,10,135,165,162,190,+226,7,5,64,99,224,70,9,237,123,34,6,49,52,55,57,58,50,52,237,+123,0,193,175,161,134,0,83,99,12,2,49,51,51,126,240,0,85,129,58,+162,190,233,198,6,137,227,225,78,12,229,220,7,101,132,172,164,161,79,0,+90,224,4,0,104,84,160,200,224,54,4,224,53,2,141,73,104,96,224,247,+3,224,103,6,65,55,224,102,4,192,87,130,214,0,51,96,25,64,47,2,+95,56,52,128,10,1,95,56,77,222,229,72,32,227,250,1,197,71,203,59,+227,122,9,162,254,98,192,99,75,78,172,224,0,5,66,197,232,35,1,130,+195,0,55,73,21,64,6,168,29,134,160,85,74,102,160,101,252,1,53,55,+64,82,0,79,217,169,128,16,64,37,136,42,227,166,5,227,115,3,238,227,+15,98,112,149,246,64,170,129,98,3,95,50,50,51,134,214,0,53,166,166,+2,85,32,90,236,36,12,128,232,232,53,8,64,0,228,2,5,64,6,170,+101,230,203,0,229,11,2,68,213,0,50,225,224,1,247,253,1,224,207,15,+196,67,197,125,172,118,163,164,65,7,0,52,86,60,1,95,54,67,47,1,+50,50,119,190,224,125,3,224,90,6,100,52,157,113,4,57,51,32,95,55,+235,208,0,160,90,194,17,224,109,2,211,50,128,113,120,190,0,52,166,33,+196,107,224,104,20,1,50,49,102,132,224,194,4,160,100,160,82,116,157,224,+112,33,128,1,225,163,4,145,235,78,253,128,0,224,38,1,230,248,5,225,+89,4,64,9,0,57,79,27,225,6,2,224,135,6,192,138,224,80,2,5,+83,32,95,51,54,57,164,67,0,53,169,126,65,228,100,78,128,74,3,95,+50,48,57,227,198,2,170,17,224,93,4,128,96,244,218,0,229,104,3,247,+38,7,128,45,246,209,7,64,19,131,164,224,178,7,224,60,4,225,116,16,+3,32,95,51,53,246,131,4,131,205,160,108,210,90,114,159,1,50,53,104,+127,110,80,131,140,96,30,161,61,227,27,14,190,100,224,129,0,229,225,2,+160,103,69,82,193,217,231,75,0,227,43,3,2,49,56,52,98,206,129,197,+227,69,16,227,46,13,224,54,25,247,130,5,96,125,1,55,52,73,191,117,+21,97,212,0,55,69,79,96,25,99,101,160,10,96,178,64,175,84,212,0,+48,226,2,1,1,49,57,64,36,228,182,1,160,0,247,235,7,224,15,5,+3,95,49,54,54,203,197,224,28,7,224,129,1,73,174,3,49,54,32,95,+152,5,64,162,206,231,224,93,7,69,36,141,41,0,83,134,188,230,134,1,+64,255,131,145,115,107,128,43,0,54,237,85,0,64,32,0,48,97,234,112,+19,161,161,132,100,233,206,3,65,99,234,230,0,129,6,0,57,79,22,0,+95,86,71,64,86,161,202,227,118,2,226,41,15,96,114,0,56,64,76,170,+132,136,209,1,95,56,94,133,96,79,246,151,1,224,89,0,100,105,106,28,+96,124,73,18,97,125,3,48,56,32,35,97,165,159,216,0,51,160,228,98,+127,225,169,25,65,11,141,228,192,100,130,250,129,112,0,53,70,172,64,34,+141,70,0,67,68,4,0,50,68,122,140,191,64,37,2,10,65,32,237,82,+6,231,172,2,72,131,0,80,77,41,0,57,71,178,70,101,192,13,103,245,+169,136,224,137,1,141,15,230,204,22,225,72,2,0,85,230,109,1,225,118,+2,126,62,238,248,3,135,211,98,12,163,220,228,43,2,213,108,167,27,213,+113,225,180,8,65,172,237,212,4,67,113,77,212,4,50,50,52,57,32,64,+15,212,133,136,52,64,7,201,99,226,84,0,224,22,0,96,219,224,217,0,+150,138,128,28,164,221,164,45,64,2,96,27,232,184,5,65,21,64,81,64,+190,192,43,98,85,103,216,96,20,160,0,192,52,128,51,224,150,1,68,133,+150,246,192,118,229,128,5,98,61,0,57,109,42,184,155,69,246,1,50,50,+152,89,234,147,1,3,102,99,110,83,222,172,229,115,16,229,154,4,229,246,+0,64,77,163,119,252,186,7,65,84,243,247,2,225,73,1,0,85,120,178,+224,78,2,64,59,201,171,244,239,2,224,35,4,224,151,0,77,196,224,33,+0,0,53,69,21,206,82,231,206,3,1,49,53,131,101,64,46,73,242,160,+36,0,95,131,232,205,5,133,103,94,215,103,236,97,22,224,101,1,162,45,+163,102,229,23,3,225,228,3,128,47,167,114,231,2,7,71,78,196,222,193,+73,230,48,0,225,168,2,193,167,225,147,4,0,68,193,147,228,62,3,226,+8,0,254,163,1,122,25,96,196,128,41,225,189,1,96,110,251,186,14,98,+95,225,105,25,245,105,5,253,6,1,128,124,232,108,5,160,221,64,15,224,+179,0,139,58,160,19,193,178,161,152,0,95,97,141,193,95,103,48,128,5,+229,46,4,224,48,14,228,53,0,225,234,26,225,211,23,227,30,11,64,0,+0,58,100,23,196,17,65,238,193,231,64,253,66,224,128,154,225,112,5,225,+103,5,161,159,83,200,195,38,228,146,5,96,223,160,108,140,35,224,108,2,+194,208,128,67,226,161,3,224,112,18,227,137,11,183,23,224,125,6,126,76,+221,1,64,128,244,169,7,196,148,0,50,124,213,224,122,23,67,68,64,204,+224,103,8,244,169,0,64,135,102,133,132,251,0,85,227,189,0,224,104,1,+134,232,224,118,3,130,72,0,64,240,111,0,64,71,198,240,65,25,66,133,+133,137,133,161,131,214,224,152,1,104,63,77,127,72,37,239,156,3,224,231,+4,227,78,0,227,106,0,116,220,181,162,226,147,3,192,48,2,95,49,53,+129,145,128,170,126,96,164,69,128,0,224,136,7,68,28,97,34,160,130,96,+152,73,147,254,59,4,142,140,96,143,2,95,49,53,184,49,137,72,66,1,+192,190,224,32,0,237,100,0,76,78,224,31,0,226,211,3,1,49,53,138,+142,228,94,1,13,114,101,99,32,110,111,116,32,97,108,108,111,119,101,91,+199,129,86,136,36,233,127,6,64,100,98,35,64,33,136,47,103,31,177,185,+128,2,96,132,198,225,224,17,8,226,76,0,161,162,102,187,1,50,50,226,+178,2,225,131,2,161,56,199,118,68,58,96,8,224,5,4,128,94,224,58,+0,224,62,4,224,22,3,164,133,231,171,4,197,146,224,63,6,101,207,224,+142,3,96,58,97,180,135,148,228,71,1,201,233,230,22,1,224,109,5,244,+70,7,64,68,1,51,54,99,147,0,51,138,46,0,48,109,185,128,47,2,+95,50,49,127,59,132,178,160,6,96,0,197,90,160,13,193,14,129,233,225,+227,7,142,105,225,228,1,23,66,97,100,32,114,101,113,117,105,114,101,100,+32,116,121,112,101,32,97,114,103,117,109,101,121,227,160,180,195,209,192,2,+128,24,224,21,7,193,205,224,230,4,238,98,6,131,177,168,189,163,33,200,+198,98,209,250,131,0,161,85,164,219,101,229,227,172,5,103,52,224,220,12,+160,157,202,230,161,216,96,80,132,54,231,11,4,224,199,7,238,95,6,193,+231,228,31,0,224,50,0,201,108,100,232,96,198,120,237,166,112,68,134,225,+164,1,106,192,232,216,12,236,193,3,229,120,9,1,50,50,248,96,2,225,+21,1,167,47,106,25,114,154,232,223,0,238,231,0,232,1,8,96,94,231,+220,4,162,38,3,50,48,49,50,228,93,7,224,248,2,130,240,192,84,227,+37,0,228,243,7,129,61,225,10,8,245,255,4,68,26,217,10,105,237,197,+89,161,172,230,231,0,162,40,166,118,97,22,233,126,3,128,73,139,150,236,+68,15,139,106,120,9,138,254,71,180,67,140,0,85,103,190,129,151,0,85,+98,19,129,72,228,105,0,64,150,234,105,3,238,43,5,136,230,104,228,148,+15,96,234,132,112,101,226,0,51,214,248,0,53,121,45,0,53,89,232,96,+0,64,27,255,135,0,64,192,236,71,1,234,208,1,116,240,224,10,6,65,+80,231,28,0,64,66,224,53,6,224,7,3,96,39,64,38,200,37,226,93,+3,224,32,4,135,197,1,75,50,86,54,64,15,0,54,231,116,4,194,236,+0,67,227,118,6,224,12,0,64,32,134,158,242,172,19,162,24,224,67,5,+243,162,12,224,41,13,250,143,22,0,51,237,79,4,234,162,7,98,83,119,+111,227,236,1,128,251,136,24,224,184,5,148,216,230,171,0,224,136,2,64,+104,98,150,229,1,5,229,23,2,244,179,2,241,100,5,129,30,0,55,112,+215,202,140,252,226,2,246,200,0,64,98,143,79,200,233,96,56,3,50,56,+52,32,253,112,2,145,46,128,120,117,18,160,11,64,25,0,48,98,102,195,+72,0,51,78,232,1,49,57,112,117,160,182,250,179,9,2,50,49,49,97,+226,96,30,70,176,64,21,0,80,240,147,0,65,80,1,51,48,67,57,164,+198,102,198,226,1,8,0,75,225,254,16,225,145,5,244,229,1,224,0,1,+228,57,0,151,111,224,166,8,209,122,162,107,171,249,224,85,2,225,47,3,+3,95,55,52,53,221,168,160,89,0,89,130,247,152,26,106,2,232,102,10,+227,112,9,64,1,228,246,1,239,199,10,243,131,1,224,44,9,232,161,4,+160,61,129,247,232,94,13,192,53,232,90,0,224,70,14,193,43,240,79,4,+225,81,0,224,67,5,169,92,229,251,4,130,179,204,39,255,91,1,96,32,+251,168,6,160,0,132,224,227,205,1,67,58,137,252,3,85,32,75,52,160,+2,155,252,64,26,201,245,226,15,8,2,50,48,57,236,90,15,98,189,145,+70,128,174,226,9,1,215,41,192,250,176,205,68,146,0,51,82,237,161,233,+128,86,128,60,192,196,225,43,3,99,157,250,49,3,2,51,52,55,251,107,+31,6,51,52,55,53,58,50,50,187,107,166,135,224,59,1,14,103,101,116,+83,117,112,101,114,67,108,97,115,115,101,115,160,38,0,95,115,159,1,56,+54,96,242,160,158,242,153,2,229,183,13,128,177,64,173,166,235,68,51,90,+214,126,201,247,110,2,128,214,0,83,90,104,90,122,243,228,2,96,72,164,+107,224,0,5,169,89,161,238,65,170,135,133,3,95,57,52,57,83,213,175,+122,232,2,0,96,65,0,90,64,30,232,18,4,64,56,179,11,0,49,85,+173,0,51,67,170,186,99,100,44,68,38,250,214,2,2,49,50,51,224,31,+0,64,59,198,239,128,163,4,95,50,49,56,56,102,122,68,212,231,201,18,+96,181,226,54,4,148,136,96,114,102,31,161,216,230,45,2,1,49,54,103,+225,86,18,224,62,9,96,141,0,50,187,106,224,116,19,226,173,5,225,106,+2,72,55,97,51,0,83,108,224,160,60,233,95,5,197,227,132,124,230,218,+5,243,116,9,97,99,73,83,64,7,224,119,7,233,224,4,227,68,8,136,+26,194,101,230,163,1,102,23,224,247,5,162,102,164,24,160,10,227,52,0,+101,133,64,22,237,158,0,199,56,134,113,71,176,64,11,0,82,234,217,2,+242,211,0,67,195,228,133,0,165,112,192,16,97,31,224,29,1,228,106,0,+96,27,199,60,193,210,1,54,48,78,235,160,95,230,155,1,64,30,0,80,+65,79,74,21,230,148,7,64,0,65,250,252,123,2,96,48,177,201,64,50,+72,54,193,66,223,43,97,112,131,166,66,17,216,87,234,80,14,161,108,192,+70,183,13,97,39,222,46,128,217,191,145,160,100,224,99,5,0,54,96,99,+228,66,1,2,112,98,34,131,3,200,146,170,74,0,32,71,104,128,50,239,+110,12,226,109,5,231,119,0,248,162,4,248,217,7,129,95,0,57,107,25,+129,122,2,95,56,54,66,125,0,57,120,143,0,49,170,157,119,253,8,55,+32,95,55,57,52,32,95,57,113,171,225,80,1,226,195,3,96,79,224,96,+2,224,93,0,224,88,14,249,204,8,128,223,134,54,205,31,165,229,242,60,+1,231,124,8,192,61,194,78,231,124,3,165,237,0,39,222,55,2,49,53,+54,237,23,3,142,12,122,41,0,51,241,35,1,226,99,1,97,200,195,226,+192,101,160,232,234,15,3,164,85,230,167,0,225,105,6,3,95,49,57,54,+248,93,1,128,114,224,62,2,234,195,2,99,86,228,182,0,67,202,223,146,+224,61,2,224,175,6,193,122,238,171,6,66,103,129,133,0,85,89,132,97,+173,1,50,50,241,235,1,128,0,227,37,6,65,127,205,145,224,229,5,231,+186,1,168,236,227,18,1,86,45,225,251,7,103,88,82,180,225,35,1,0,+49,134,54,226,54,24,64,42,67,32,229,163,10,217,121,1,48,55,117,116,+74,206,64,22,198,72,0,89,213,88,68,66,225,137,0,100,79,224,23,1,+226,67,0,195,88,137,85,242,148,1,169,37,226,79,0,242,150,0,224,17,+0,226,149,0,2,67,32,60,73,253,233,117,0,178,184,224,121,4,224,54,+16,64,205,224,54,9,160,165,224,54,18,231,207,0,193,246,239,218,1,236,+119,2,224,51,5,168,123,128,47,227,63,6,224,28,3,232,151,2,0,90,+175,213,1,48,55,244,29,0,229,48,1,224,75,16,160,156,192,75,135,20,+225,106,4,227,36,0,2,95,49,54,128,46,128,176,69,148,0,49,74,131,+128,99,96,48,70,68,227,168,0,0,80,247,176,1,64,43,2,53,32,79,+76,154,0,52,200,93,1,50,50,102,69,200,251,225,22,0,166,93,99,89,+64,53,254,177,7,137,12,2,50,50,48,207,139,195,225,197,121,225,70,2,+176,140,0,85,64,137,227,112,8,240,195,0,128,117,226,188,4,225,42,1,+160,89,135,165,65,2,225,82,6,231,179,3,228,244,1,224,103,3,80,108,+130,191,129,88,234,56,1,228,87,6,246,184,5,225,222,1,236,128,1,228,+48,6,81,248,224,47,4,165,76,224,187,4,224,149,3,227,240,3,130,45,+1,49,48,247,42,6,232,154,10,224,27,1,228,93,3,132,229,226,29,1,+224,241,4,96,21,81,239,228,246,1,2,95,49,57,93,137,224,100,9,200,+183,225,170,3,224,236,8,96,78,100,64,2,95,50,48,225,215,2,128,216,+225,191,35,235,94,4,227,253,9,192,80,228,49,5,197,128,195,243,230,222,+2,128,138,160,178,226,123,2,224,137,0,64,1,97,150,224,88,0,96,150,+225,249,5,255,9,2,224,132,2,238,83,8,110,226,194,241,135,13,224,76,+7,224,46,3,238,77,0,226,14,11,252,51,0,252,60,2,226,32,22,224,+89,1,225,111,31,0,53,238,149,6,224,40,1,239,140,1,194,191,0,85,+248,109,0,160,144,226,254,0,224,222,2,118,58,0,53,74,98,227,46,15,+227,95,2,240,66,1,65,168,143,14,96,11,227,176,6,240,24,6,235,145,+1,225,185,4,176,95,143,215,142,221,1,95,56,92,150,64,156,170,166,209,+238,96,0,0,95,112,252,64,27,160,9,64,31,225,163,5,224,94,2,100,+162,229,152,0,133,192,87,76,226,23,8,163,227,250,168,0,160,10,87,70,+66,220,195,124,76,158,168,160,0,48,128,128,115,37,114,174,101,135,224,0,+2,225,53,3,128,7,226,166,10,65,245,237,162,1,1,55,53,72,45,224,+160,4,66,199,170,131,160,157,114,202,226,41,3,98,28,111,19,112,2,166,+17,224,0,4,129,11,226,36,7,167,179,192,255,129,9,235,67,12,147,235,+225,45,0,129,235,235,72,9,232,237,2,228,217,11,224,92,8,132,239,68,+125,233,197,4,2,95,49,54,75,108,144,204,128,14,0,56,230,179,4,67,+67,224,145,5,228,218,5,230,4,7,0,50,79,20,97,81,132,233,3,95,+50,48,56,133,64,3,50,48,54,53,226,13,3,227,114,3,236,43,7,96,+28,117,99,0,49,76,5,160,51,151,246,194,129,128,0,233,66,1,160,71,+233,11,27,225,179,0,229,64,0,238,33,2,229,75,21,196,15,129,62,167,+58,224,60,5,224,43,0,167,226,160,23,226,17,5,224,27,2,227,70,4,+224,10,0,226,67,8,229,145,2,226,66,1,225,227,10,225,88,24,160,238,+229,31,7,109,63,95,222,66,221,128,230,163,139,230,200,6,255,184,3,193,+144,3,67,32,95,57,85,206,160,149,229,94,4,229,91,7,129,58,76,108,+215,85,133,101,105,60,127,3,0,49,69,27,129,103,224,0,0,230,12,8,+168,141,197,109,230,190,4,229,84,9,247,83,8,82,66,161,57,1,50,50,+229,196,0,225,130,0,161,217,231,42,2,97,229,192,22,160,25,160,26,230,+122,7,225,101,2,128,168,230,139,8,96,51,2,50,48,55,64,230,64,74,+1,95,56,89,1,0,95,100,244,161,10,224,80,1,133,172,143,232,1,66,+32,129,46,0,85,89,59,128,41,192,15,240,245,1,93,186,0,48,128,19,+144,105,64,0,129,160,160,0,226,95,10,203,8,1,85,32,182,232,64,0,+232,97,3,226,236,2,224,249,2,161,92,232,109,2,224,100,4,197,72,128,+112,227,166,4,200,106,160,119,224,144,8,192,24,105,84,226,136,7,83,191,+241,111,3,224,147,4,130,43,192,13,200,117,64,1,227,170,0,151,245,230,+182,6,98,26,0,49,120,229,201,159,71,29,86,172,215,216,65,181,70,167,+241,67,1,5,110,101,103,97,116,101,222,174,163,87,236,198,14,224,158,2,+225,83,1,192,146,149,87,159,116,161,121,195,197,226,227,1,240,89,6,224,+108,15,193,120,226,244,7,163,104,131,130,233,195,17,192,165,227,186,4,228,+74,7,97,77,3,95,50,48,48,224,56,4,226,184,3,75,27,128,146,237,+204,5,198,124,224,155,9,0,90,228,61,6,224,65,16,96,106,247,75,34,+6,50,56,48,53,58,49,48,247,75,15,17,116,99,80,97,116,58,32,110,+111,116,32,104,97,110,100,108,101,100,128,40,244,133,0,64,49,87,88,0,+55,109,184,246,155,5,160,77,2,79,32,35,71,188,182,125,64,44,0,49,+184,121,224,242,1,164,25,203,201,104,223,122,229,68,2,150,192,226,96,8,+1,61,61,162,92,238,54,1,224,127,5,0,58,140,90,1,10,65,65,44,+2,50,48,53,226,14,2,225,73,1,64,36,150,116,64,34,193,178,240,214,+1,64,228,147,8,65,239,131,111,133,209,0,95,72,189,64,40,118,36,1,+49,55,159,36,102,6,96,56,0,54,96,56,3,85,32,75,51,128,15,148,+75,231,138,0,106,142,195,123,66,46,132,243,229,71,0,227,214,4,224,41,+1,131,25,78,37,64,125,1,57,52,225,232,32,5,54,54,54,58,53,55,+161,232,79,161,225,5,2,139,67,64,164,180,214,202,38,0,54,139,7,2,+57,55,50,128,8,67,242,2,49,57,55,65,163,64,7,253,4,2,65,214,+0,57,73,36,96,204,75,56,96,79,0,51,178,20,190,87,125,15,65,51,+0,49,129,19,146,229,133,180,64,15,146,90,164,3,235,198,0,69,20,225,+43,9,224,16,4,64,120,64,64,248,205,0,226,53,15,2,84,114,117,132,+148,0,58,130,53,224,45,21,3,70,97,108,115,224,46,1,223,189,155,27,+229,250,1,233,25,7,252,35,2,233,121,1,233,62,34,224,46,2,224,43,+10,242,70,36,67,27,224,47,19,160,120,198,27,224,37,0,225,130,1,224,+130,11,166,203,224,81,12,224,27,2,133,42,96,35,98,61,238,53,2,193,+5,230,146,3,129,71,64,40,246,31,13,230,230,4,69,151,224,231,13,101,+254,168,246,76,62,77,195,228,151,11,225,229,1,11,66,97,100,32,112,97,+116,116,101,114,110,32,252,44,2,228,166,1,65,252,132,7,208,42,232,246,+3,193,40,227,188,3,64,242,244,207,6,130,197,161,52,161,82,180,246,193,+13,235,14,8,204,149,224,34,1,225,169,0,192,14,128,139,132,80,68,106,+232,164,0,224,49,1,225,221,5,192,126,198,193,96,133,233,168,6,225,122,+2,192,2,165,18,224,69,3,97,149,165,178,87,13,214,90,128,23,238,183,+1,151,81,2,50,50,48,232,153,0,64,12,64,29,233,156,0,160,0,64,+87,129,42,234,36,1,64,19,237,232,6,65,31,0,66,251,228,1,225,46,+1,98,54,96,238,1,90,32,71,51,201,35,224,36,9,101,151,229,2,8,+192,0,5,95,49,56,53,50,32,103,101,134,15,162,11,253,119,2,225,77,+5,232,83,9,70,189,224,37,2,225,133,2,224,16,1,99,28,224,151,4,+1,95,53,76,69,1,50,50,91,110,226,160,1,3,98,105,110,100,233,73,+1,224,81,17,233,210,3,128,95,65,74,227,56,6,69,100,224,70,6,227,+254,11,241,69,0,235,235,3,230,149,7,244,196,2,229,174,1,70,25,161,+136,236,243,6,101,175,251,172,1,160,34,64,123,225,70,15,1,48,57,201,+84,128,1,237,66,5,192,174,164,167,128,184,155,246,64,12,250,61,6,64,+97,168,86,0,95,221,41,192,0,225,9,8,192,240,160,148,225,16,2,226,+139,4,98,135,0,89,106,139,66,65,64,31,0,83,160,135,197,174,64,104,+0,85,96,49,227,62,0,194,147,225,253,2,97,148,226,118,26,96,160,184,+23,136,139,210,6,236,98,3,160,0,193,18,228,150,3,225,192,5,234,203,+4,131,108,163,114,168,108,179,105,229,81,0,132,180,225,136,6,181,234,225,+51,2,96,16,228,103,10,224,5,10,226,159,8,236,191,6,225,154,1,226,+166,3,228,158,5,224,100,0,224,76,4,241,24,7,224,73,11,224,254,16,+226,246,1,181,73,133,190,224,49,4,225,200,0,224,91,1,142,7,224,249,+5,130,146,171,49,128,151,192,10,93,135,228,41,0,160,0,192,70,244,176,+1,131,33,224,182,0,193,203,224,161,7,227,161,11,249,251,2,193,190,224,+193,7,236,190,14,245,134,2,227,117,5,227,114,0,138,133,225,172,2,128,+131,224,45,7,224,205,3,224,0,6,231,61,1,196,73,0,83,80,255,3,+57,32,95,54,113,180,161,71,133,197,107,109,0,56,160,26,229,186,8,100,+119,253,88,1,236,195,2,16,111,111,32,109,97,110,121,32,97,114,103,117,+109,101,110,116,115,165,74,224,49,20,2,102,101,119,224,48,8,232,70,5,+112,149,72,25,0,54,140,62,0,53,107,28,96,145,237,129,20,4,83,116,+97,116,101,139,148,2,51,52,58,237,123,0,64,73,172,34,68,74,228,34,+10,134,184,225,93,4,80,202,82,225,130,65,64,66,139,192,64,218,4,54,+56,53,32,64,77,124,0,55,141,124,64,29,139,142,0,75,132,163,189,124,+253,174,6,232,208,5,228,60,0,138,188,228,75,6,130,236,196,208,224,23,+8,228,124,9,160,24,244,38,5,224,28,9,224,19,1,235,60,6,224,29,+0,224,23,0,224,41,3,192,64,224,122,0,244,193,5,224,54,3,171,160,+228,19,5,131,168,224,101,2,133,3,224,170,1,162,205,224,8,17,2,95,+56,50,66,27,147,198,1,49,48,130,196,128,79,224,240,4,70,153,227,199,+5,224,112,5,160,110,2,95,56,51,125,42,0,83,91,117,70,9,246,129,+1,199,67,192,101,177,159,3,66,32,95,53,71,224,109,111,71,105,96,21,+160,108,0,79,198,52,64,86,240,62,4,160,69,160,46,96,66,192,96,182,+239,199,178,193,74,167,23,105,216,137,249,96,255,2,49,55,54,64,11,128,+202,66,133,1,55,54,198,192,225,156,0,224,62,1,106,38,1,50,52,96,+5,170,182,224,26,17,128,54,64,109,96,163,0,51,87,160,188,125,160,86,+193,55,224,145,37,96,85,224,107,4,224,13,4,224,40,1,225,191,7,160,+170,66,51,129,8,0,56,78,226,117,186,153,165,67,134,129,183,103,154,214,+170,193,137,98,35,250,70,11,171,19,135,222,67,219,106,172,116,178,96,26,+96,14,192,36,227,233,2,0,55,163,233,224,21,6,0,56,224,21,0,97,+63,117,93,143,143,0,54,174,249,0,95,207,202,64,90,203,30,0,50,181,+74,138,205,137,142,1,50,48,175,216,83,246,228,103,6,1,56,52,228,103,+1,175,199,235,166,27,234,66,0,129,157,234,58,2,230,245,6,241,130,0,+130,8,224,78,7,224,43,4,64,8,75,12,226,77,1,224,96,7,224,46,+8,98,62,96,25,224,11,2,192,8,230,188,9,233,170,24,65,6,144,141,+234,16,0,134,224,225,13,7,231,38,1,64,139,194,167,209,109,149,96,119,+7,3,95,53,52,52,248,240,1,97,151,2,49,57,56,70,131,99,18,209,+103,120,171,96,6,67,30,104,12,67,13,64,44,103,167,64,46,144,201,230,+161,1,13,80,114,105,109,105,116,105,118,101,115,46,61,62,34,128,82,142,+240,0,85,96,173,224,172,4,164,37,0,85,224,163,25,64,70,0,54,241,+52,0,1,80,32,176,158,0,80,128,96,198,237,0,83,162,36,165,229,64,+42,240,109,5,138,250,224,33,18,79,227,230,26,1,224,33,12,133,137,133,+134,0,83,98,111,224,30,4,97,25,162,145,236,99,6,128,86,226,112,4,+96,76,0,85,97,110,253,58,1,1,49,54,101,251,250,7,3,65,115,228,+247,0,233,137,0,160,114,65,51,129,93,224,71,4,96,72,101,147,224,60,+0,224,37,15,207,119,192,98,128,212,162,100,225,63,2,160,220,236,152,7,+64,223,224,90,13,159,223,224,90,2,225,2,8,128,83,0,85,227,189,0,+224,63,3,68,183,89,181,1,49,53,83,96,218,198,128,123,251,37,4,147,+113,101,193,239,126,1,131,0,225,159,6,85,76,225,159,15,224,194,1,79,+208,1,56,51,167,6,225,153,3,1,53,53,97,153,192,207,2,95,51,54,+70,255,128,42,128,0,226,92,18,198,247,128,31,243,184,11,192,178,224,25,+4,96,91,227,236,8,249,67,3,240,156,11,169,213,224,191,5,114,139,252,+1,4,226,100,16,110,106,224,16,1,130,237,225,74,4,65,161,226,186,8,+123,23,224,85,17,166,249,224,168,3,193,21,177,106,227,51,7,224,52,0,+226,141,9,225,49,16,154,73,227,108,8,129,17,225,227,25,127,143,225,227,+1,224,203,2,226,228,11,69,209,225,57,5,224,99,26,141,170,224,99,1,+227,123,4,228,59,12,96,66,249,143,35,2,51,56,57,236,19,1,64,126,+244,169,4,8,100,115,69,70,105,101,108,100,115,128,31,244,167,6,69,84,+139,255,64,199,255,5,6,1,50,50,119,132,167,231,193,102,239,133,2,238,+5,3,64,217,161,142,239,82,4,161,33,224,42,2,64,83,97,20,224,248,+5,64,138,0,51,198,147,1,51,54,64,123,128,27,3,66,32,95,55,64,+164,2,95,50,48,101,46,64,40,136,75,129,123,148,53,128,101,101,149,96,+129,151,151,225,12,6,3,101,110,117,109,173,153,64,69,136,115,233,162,0,+99,174,86,74,246,144,0,96,188,180,203,1,49,56,142,179,129,40,68,152,+1,50,48,90,165,137,155,133,130,1,95,49,89,14,233,141,1,234,152,1,+0,54,98,107,202,145,143,203,234,24,1,160,200,89,51,125,143,64,29,212,+230,64,25,99,108,64,8,73,130,128,228,3,95,55,54,51,96,149,132,145,+64,206,136,59,67,6,0,80,99,95,1,56,51,241,23,1,77,244,171,254,+192,56,252,108,2,224,76,4,0,58,128,7,97,95,132,112,228,196,9,96,+73,128,204,227,223,4,192,100,164,175,0,90,106,175,65,37,193,15,224,45,+0,140,129,96,45,3,85,32,90,32,236,166,1,128,204,0,56,217,57,243,+126,4,64,24,183,85,136,3,229,99,14,135,255,224,26,12,135,248,228,77,+13,228,78,14,196,79,146,210,97,160,137,183,226,191,0,161,247,64,0,111,+95,160,33,134,4,231,67,12,224,36,4,231,43,9,96,191,65,23,224,37,+2,230,82,17,97,196,224,210,12,230,108,0,224,94,4,96,21,101,245,160,+91,230,62,8,70,58,229,220,7,224,135,1,248,207,1,230,250,8,131,58,+229,253,10,192,24,197,253,2,50,49,56,206,81,192,219,133,14,224,24,8,+225,104,5,106,72,66,7,0,54,162,32,0,89,208,141,192,143,187,75,239,+233,1,64,13,227,181,0,224,170,7,232,55,0,234,72,19,224,207,11,192,+25,96,181,224,73,1,224,245,16,96,154,243,107,4,225,83,0,128,24,96,+248,141,136,250,246,4,167,244,161,219,1,95,52,75,102,218,240,224,82,9,+90,229,195,215,227,133,1,132,96,229,111,2,160,26,227,146,4,132,87,175,+255,224,119,2,151,33,160,71,96,4,240,38,0,0,90,64,127,78,149,98,+49,0,75,69,180,240,62,0,129,231,130,74,0,64,90,104,224,27,3,64,+0,227,64,13,225,237,9,97,238,203,250,65,93,97,161,97,104,161,240,192,+192,161,109,224,235,6,111,21,247,196,5,96,221,226,198,1,226,40,1,160,+9,130,3,226,54,2,255,90,7,165,219,65,180,246,124,2,229,222,14,91,+103,224,56,1,170,172,184,29,233,239,8,194,50,96,162,227,187,0,128,231,+96,64,64,43,3,95,57,56,54,245,70,2,232,67,8,244,168,16,92,184,+13,115,101,99,116,105,111,110,32,102,105,120,105,116,121,244,218,1,3,50,+48,51,54,250,67,3,1,36,120,128,27,148,196,241,55,0,65,141,200,51,+152,195,195,106,225,144,14,128,30,225,148,6,195,107,199,69,229,255,1,130,+211,169,57,230,0,6,161,205,128,169,224,151,3,224,181,9,225,227,57,128,+202,225,226,6,162,94,99,161,215,110,193,211,98,157,192,216,225,213,11,160,+84,240,65,2,100,58,224,21,6,224,60,30,64,58,251,77,8,86,242,226,+27,4,128,174,227,249,4,225,114,9,224,0,1,226,56,87,201,225,96,150,+234,108,9,219,99,224,215,3,225,152,6,130,30,238,20,4,193,22,248,17,+0,251,122,2,224,58,2,133,28,225,72,0,161,74,224,13,0,253,10,7,+227,84,7,128,21,132,239,160,14,100,5,100,255,228,88,1,100,1,1,50,+49,201,203,0,55,245,208,0,64,0,226,132,1,193,179,66,94,65,31,96,+141,129,123,227,208,8,65,56,179,61,96,51,226,202,10,102,228,224,13,5,+160,173,128,2,160,14,227,7,11,224,70,3,103,78,225,5,4,242,138,2,+64,5,247,242,5,193,11,105,24,152,28,103,59,154,50,100,8,73,48,1,+53,49,64,199,148,27,96,5,212,38,224,179,4,224,2,3,192,30,193,203,+75,70,64,10,224,2,0,183,141,192,20,231,251,0,128,171,227,216,1,64,+133,0,85,66,205,237,78,16,0,70,98,204,141,75,4,54,57,58,51,57,+173,73,233,56,2,193,58,225,15,0,225,33,0,227,190,2,224,10,7,64,+251,99,196,227,101,4,236,26,0,224,236,0,248,110,5,64,92,128,96,225,+25,5,161,149,130,112,64,92,235,107,1,225,76,0,225,178,0,225,39,8,+160,94,185,18,224,108,2,96,220,1,85,32,71,157,224,66,2,162,76,96,+35,232,143,7,226,27,3,193,157,249,105,0,224,26,3,192,135,99,137,221,+9,225,239,15,129,5,224,66,9,226,193,0,224,127,14,224,106,0,96,170,+224,35,21,128,1,169,171,192,0,234,37,0,225,52,3,226,221,0,226,92,+1,224,0,1,224,88,15,0,67,98,121,224,0,3,224,219,3,160,35,224,+252,22,228,249,2,228,195,1,254,255,10,250,165,5,225,230,0,130,29,128,+180,71,54,64,20,128,28,103,81,85,120,130,50,115,59,224,226,0,1,95,+50,237,47,0,192,42,89,237,1,50,49,150,247,64,44,154,4,96,65,192,+22,2,95,49,54,90,106,224,237,2,160,225,193,67,226,122,3,224,166,4,+225,67,5,193,93,193,9,224,235,7,225,140,0,225,29,6,224,184,12,254,+7,1,96,226,225,16,0,168,81,225,16,21,224,228,14,251,145,2,160,161,+227,21,8,160,201,227,167,13,192,32,155,102,133,248,70,50,254,26,4,3,+67,32,95,52,72,230,228,165,1,28,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,196,+161,225,117,1,226,81,13,96,30,216,205,228,16,1,225,3,1,1,54,48,+225,48,4,224,228,17,224,193,42,9,98,97,100,32,112,114,101,102,105,120,+224,185,11,229,12,1,117,247,229,159,29,3,56,58,49,54,223,90,2,52,+48,54,106,125,197,8,238,51,1,225,246,0,171,137,171,72,112,229,236,249,+0,163,94,129,49,160,231,65,247,130,249,239,115,1,1,64,80,90,213,79,+177,145,70,230,74,31,3,54,58,49,55,230,74,1,0,89,100,164,64,174,+229,121,3,233,225,1,96,111,178,74,1,50,49,251,150,1,202,196,128,160,+106,251,192,162,64,176,136,106,87,51,225,139,4,72,84,236,11,0,97,210,+106,77,131,70,135,204,64,1,101,11,231,64,6,64,12,97,205,162,43,162,+65,156,178,98,4,162,18,96,199,244,224,0,160,7,96,110,231,52,1,193,+86,224,29,2,64,214,225,67,32,3,49,58,49,56,225,67,0,161,135,188,+212,224,67,32,3,52,58,49,54,224,67,0,73,73,147,245,78,194,99,219,+1,35,54,146,87,147,61,212,68,138,213,0,51,226,206,3,5,110,101,103,+97,116,101,96,72,0,58,129,116,4,10,65,32,65,32,64,11,146,172,0,+90,65,171,64,14,146,162,0,75,96,26,0,54,234,240,2,232,34,0,65,+109,65,81,64,32,142,216,2,95,53,49,99,160,139,245,144,128,64,162,79,+22,223,99,175,13,128,24,64,11,175,53,224,24,11,160,49,143,85,3,95,+49,51,49,228,211,0,64,115,205,190,0,89,166,78,131,71,228,63,1,192,+167,197,104,241,49,5,196,84,251,21,21,2,95,49,55,245,72,3,226,242,+9,128,41,246,234,21,5,67,77,111,110,97,100,182,232,4,55,48,58,49,+53,246,231,15,8,103,101,116,65,112,112,67,111,110,160,32,0,95,246,232,+5,160,148,167,253,0,85,128,240,97,11,236,145,1,3,95,55,53,50,97,+38,96,154,4,67,32,95,56,52,178,108,75,204,226,51,4,0,57,129,232,+190,180,230,148,1,236,110,6,0,49,214,153,172,107,233,17,2,230,223,3,+236,223,7,100,3,133,149,225,148,19,2,95,52,54,210,132,192,1,237,82,+2,2,50,49,54,209,109,128,102,161,180,224,111,6,96,53,1,50,48,162,+72,230,210,0,225,176,1,128,58,224,17,7,247,252,5,130,69,0,39,87,+183,109,150,121,9,192,158,192,56,64,4,2,95,50,48,94,226,228,173,5,+225,203,8,21,110,111,116,32,112,111,108,121,109,111,114,112,104,105,99,32,+101,110,111,117,103,104,225,249,1,1,55,52,119,218,119,12,161,2,237,51,+8,101,239,67,5,5,67,32,95,51,55,48,222,114,224,42,11,97,202,131,+254,174,136,2,50,49,54,159,37,65,66,64,22,64,213,64,110,2,50,49,+54,117,250,0,54,96,10,115,136,153,32,64,43,132,5,85,181,87,125,64,+46,0,55,64,34,128,96,64,9,96,29,0,65,128,88,0,54,141,207,191,+113,152,168,64,83,231,65,4,3,66,111,111,108,196,112,64,232,255,129,4,+4,68,97,116,97,46,64,33,0,95,90,17,0,46,159,131,64,63,130,146,+246,38,3,2,95,49,57,99,251,97,128,68,113,2,95,50,51,65,135,226,+156,23,217,232,226,213,5,226,117,0,194,83,194,86,226,18,3,167,87,226,+16,3,64,134,69,125,229,186,19,250,220,6,5,49,55,54,55,58,50,195,+244,96,0,202,72,96,117,224,153,2,96,219,89,3,226,92,5,227,66,4,+138,53,227,109,3,240,106,3,237,233,4,131,132,158,180,227,147,1,185,196,+241,82,16,135,192,102,65,241,89,2,65,151,132,102,224,135,0,227,242,6,+131,133,0,49,149,43,195,252,127,43,178,88,163,76,224,122,8,103,131,0,+53,68,196,64,53,133,111,240,60,8,64,182,2,10,65,32,72,131,0,80,+104,199,232,254,14,99,161,1,49,51,73,228,64,77,193,33,64,65,251,42,+0,0,79,64,143,3,95,49,53,57,81,175,137,119,1,50,49,126,98,0,+75,130,128,186,133,96,151,91,208,128,51,69,58,96,45,103,255,96,10,0,+58,128,55,135,116,228,183,1,210,10,136,192,96,240,226,87,1,65,146,129,+220,96,155,96,176,226,2,3,229,1,6,0,53,166,142,224,24,6,224,98,+5,230,208,2,226,196,7,161,150,0,49,97,28,202,77,226,1,11,145,6,+129,43,65,196,68,51,224,111,14,79,133,129,205,224,217,8,65,69,224,168,+10,1,50,49,132,186,226,57,9,64,14,243,9,3,170,219,229,228,7,67,+254,99,128,161,9,245,135,6,64,254,190,220,122,157,129,18,224,64,3,122,+250,98,160,85,118,235,110,4,160,6,191,10,99,147,253,235,3,161,60,110,+108,226,201,6,225,108,6,253,243,3,90,155,1,48,48,252,160,2,130,231,+255,139,1,225,140,0,225,228,0,247,3,9,224,19,5,194,51,65,160,220,+66,168,186,100,81,107,22,225,32,14,132,19,161,38,229,217,5,192,50,149,+250,197,68,240,61,3,209,28,228,183,3,165,51,73,237,70,166,65,222,64,+8,97,92,133,34,1,55,48,244,55,1,228,191,3,164,197,225,165,1,224,+28,10,229,24,5,226,68,0,109,187,224,0,0,224,168,10,224,67,0,224,+39,1,128,220,160,226,229,118,1,97,202,170,60,132,81,161,37,97,4,224,+81,0,240,163,2,136,189,160,59,160,228,130,124,196,124,224,0,4,224,117,+8,160,154,229,54,4,98,113,108,218,166,237,99,14,94,57,1,67,39,224,+157,26,136,214,64,148,140,220,224,137,4,66,87,141,74,246,195,3,106,53,+172,130,128,0,225,70,6,175,119,224,190,0,144,181,224,205,1,164,39,96,+142,233,210,0,160,9,128,163,163,100,130,226,240,97,7,128,1,150,182,161,+253,233,145,1,224,2,2,239,254,4,224,36,0,241,86,5,245,200,0,192,+113,228,224,3,226,90,2,237,239,3,128,192,160,196,224,47,5,224,160,3,+211,99,224,103,1,224,162,1,224,252,0,224,8,2,224,245,2,224,120,20,+195,129,215,108,64,0,175,152,71,251,228,47,2,224,141,3,193,46,224,159,+8,224,36,21,224,198,101,64,0,68,154,0,54,100,154,0,79,76,106,3,+54,32,95,56,71,185,2,95,49,55,103,138,69,158,66,133,64,28,65,123,+82,167,138,212,2,95,56,51,67,225,0,48,143,100,64,39,64,8,224,39,+16,1,49,50,208,36,0,52,224,79,20,1,49,52,102,118,64,8,68,140,+224,39,18,192,119,1,53,52,225,130,0,96,194,69,176,140,89,1,50,49,+99,180,201,20,64,234,189,209,226,181,0,129,36,129,108,246,168,3,131,86,+184,104,226,224,2,160,43,96,17,194,146,238,153,0,99,141,233,100,13,109,+212,102,144,240,166,1,94,156,170,164,128,16,230,106,0,96,89,64,218,96,+69,224,8,0,226,41,1,130,57,228,7,0,160,207,224,35,5,128,17,64,+60,165,131,64,10,65,65,224,253,1,197,212,224,50,0,197,228,192,16,228,+192,0,229,247,6,177,188,224,41,5,96,25,64,38,128,47,64,19,229,225,+9,128,83,226,215,11,181,43,108,157,165,169,224,11,3,224,191,1,216,124,+128,60,225,111,3,0,66,232,153,10,235,184,13,64,87,163,33,128,1,231,+201,6,192,252,129,227,64,121,199,26,224,42,5,64,13,66,208,128,223,74,+112,0,48,84,221,167,247,244,29,1,96,0,160,183,2,95,49,55,81,188,+66,142,209,19,67,71,74,182,2,32,95,56,77,217,194,222,64,34,139,195,+225,234,3,236,75,5,194,154,133,101,194,243,64,18,0,79,250,8,4,225,+190,4,225,138,0,64,1,130,76,224,71,13,65,3,0,79,97,149,250,81,+1,0,90,77,97,0,53,226,188,1,96,166,252,42,3,64,166,231,112,0,+0,83,160,181,0,64,89,179,224,197,0,225,122,1,160,29,177,202,173,62,+226,27,0,254,145,3,224,28,3,64,179,101,44,129,187,100,83,128,219,64,+173,0,80,237,9,2,224,74,12,225,229,2,224,73,33,160,215,201,119,224,+204,182,99,216,134,31,243,30,4,0,95,129,248,131,60,131,165,160,118,224,+40,14,224,120,0,195,210,228,224,4,0,54,141,209,128,16,0,56,82,222,+112,192,135,195,228,156,1,228,166,2,128,0,96,188,163,63,66,95,142,11,+96,70,234,101,8,0,48,178,182,129,131,236,105,8,66,205,0,48,80,163,+128,73,245,115,0,224,71,15,224,100,15,135,100,161,130,236,69,3,84,80,+236,71,3,173,17,225,49,10,224,51,0,148,10,237,58,0,71,245,197,107,+161,191,224,12,4,224,4,4,194,0,244,2,3,238,64,3,186,122,0,52,+81,220,195,163,64,48,242,146,3,4,95,49,55,56,54,231,55,0,119,235,+2,57,50,49,192,16,234,127,3,97,80,0,55,241,59,2,2,67,97,110,+83,43,23,104,97,110,100,108,101,32,114,101,99,117,114,115,105,118,101,32,+110,101,119,116,121,112,101,245,10,4,0,56,161,52,135,140,151,150,0,54,+73,51,0,54,172,205,139,58,114,219,128,15,224,24,6,224,0,7,1,95,+56,86,232,192,208,229,8,1,130,123,238,5,6,128,203,228,171,5,98,3,+71,141,98,3,132,175,64,42,208,232,226,95,19,160,32,135,208,224,134,1,+4,66,39,32,95,57,113,165,4,95,49,53,50,52,66,181,0,50,133,233,+96,107,143,153,65,70,0,57,73,34,69,227,1,54,56,96,66,109,122,128,+151,64,40,142,33,6,95,56,54,57,32,75,32,66,69,194,25,224,119,0,+224,1,7,237,52,2,224,37,16,224,35,4,224,32,23,224,29,20,224,26,+17,224,23,14,224,20,11,224,17,8,224,14,5,65,36,245,92,0,128,0,+65,26,0,54,161,67,0,89,166,189,97,185,111,64,233,147,1,168,168,192,+79,139,72,131,133,103,253,96,13,238,79,3,229,68,4,196,124,192,62,135,+20,224,173,1,171,171,239,80,6,229,137,13,224,55,10,197,27,64,62,96,+233,133,149,64,10,238,108,2,169,2,234,238,3,130,232,3,49,52,55,49,+192,17,64,14,0,54,85,247,231,147,3,224,0,3,139,232,0,52,162,180,+128,8,65,68,245,203,12,5,67,111,101,114,99,101,128,6,2,105,98,108,+90,106,64,43,245,209,1,134,223,129,97,230,233,3,225,110,2,225,84,16,+232,252,0,225,71,10,128,1,193,165,224,30,10,224,85,16,237,254,10,224,+85,12,197,39,64,17,203,174,76,136,68,146,169,138,160,0,168,237,64,248,+137,110,225,36,6,86,32,13,76,105,116,115,46,75,110,111,119,110,83,121,+109,98,119,34,64,47,136,247,225,40,141,224,227,0,224,85,22,225,40,44,+231,144,1,244,61,13,165,189,192,105,224,34,2,224,44,2,0,56,64,70,+0,83,163,23,245,5,9,1,49,56,110,13,99,2,101,52,3,49,57,56,+50,229,52,0,107,45,1,32,95,126,147,1,35,49,152,90,243,145,5,64,+47,242,210,0,241,214,3,122,25,101,250,0,56,70,11,243,178,4,128,58,+224,185,1,237,107,4,161,225,234,210,0,224,5,7,243,120,1,224,1,5,+237,70,1,224,28,8,224,149,5,228,74,8,224,77,11,225,199,0,64,0,+164,73,224,2,4,192,108,224,52,5,229,152,12,64,22,237,179,0,224,77,+13,224,56,9,243,150,5,252,181,0,224,36,1,224,58,7,224,17,8,224,+14,5,192,157,97,233,3,50,49,51,56,103,148,231,178,0,237,116,20,109,+164,246,24,5,96,0,226,185,0,224,143,74,166,150,184,118,255,52,0,0,+75,74,4,91,255,80,116,0,75,72,9,128,12,0,58,128,59,249,139,3,+243,186,13,207,127,224,38,3,128,2,67,143,201,16,193,182,224,168,2,64,+157,105,106,226,202,11,192,47,128,109,225,187,5,193,8,128,8,64,120,128,+126,166,167,161,236,66,218,253,90,1,251,128,1,239,81,11,224,205,0,239,+82,12,236,150,0,225,151,1,224,84,0,64,102,210,171,71,10,0,52,242,+175,1,128,164,76,196,64,181,184,56,119,149,231,0,1,224,115,8,224,109,+2,162,167,226,41,1,224,51,2,139,124,128,7,160,220,235,13,4,192,88,+235,4,3,31,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,0,114,220,61,+96,59,1,50,49,115,37,93,7,226,66,1,66,20,138,27,0,83,134,49,+192,217,130,184,69,16,128,47,68,252,4,51,54,32,95,53,112,19,1,95,+56,65,231,76,63,64,64,138,51,132,60,193,148,87,225,193,213,142,141,160,+92,174,181,228,109,10,169,115,64,172,238,66,2,251,63,1,230,4,1,140,+184,226,83,0,118,243,226,193,4,182,252,224,19,4,228,253,1,227,119,3,+160,2,160,26,224,17,0,130,110,227,25,15,96,12,249,53,1,163,4,162,+70,160,244,66,26,0,53,77,136,247,51,0,192,68,201,213,224,129,3,246,+241,0,96,101,161,30,117,42,237,240,1,160,104,161,101,183,186,98,38,157,+4,93,135,214,21,192,0,165,162,65,165,0,54,161,165,230,68,5,143,51,+96,71,67,70,0,54,157,232,138,226,227,125,1,193,200,128,232,160,15,131,+192,224,202,1,231,188,0,142,51,64,1,224,83,3,103,205,130,121,192,203,+165,7,173,29,175,165,161,238,110,207,224,22,1,227,54,7,128,95,236,152,+2,236,163,4,77,46,0,48,64,5,99,157,224,24,0,129,42,131,182,160,+72,65,25,138,147,128,34,97,48,193,36,192,200,210,239,192,201,192,77,1,+54,53,72,14,224,21,1,134,134,0,50,75,64,0,80,101,44,0,57,226,+188,2,240,76,3,192,0,192,175,224,98,7,64,67,236,12,5,132,155,225,+100,0,224,142,3,128,240,128,48,64,11,254,237,9,128,205,193,152,131,92,+250,126,6,2,95,49,56,229,218,0,224,151,3,225,134,6,224,29,4,64,+80,246,127,6,137,255,99,143,128,35,195,137,160,49,163,82,64,11,224,148,+5,227,80,0,234,28,1,217,175,227,32,9,227,9,9,194,254,224,0,0,+225,140,2,233,124,0,129,237,140,85,129,165,192,74,64,66,64,27,139,120,+123,225,129,254,100,180,229,157,7,195,233,96,197,128,209,228,50,0,163,90,+225,36,1,166,184,147,141,193,251,228,100,3,224,46,18,120,205,128,47,225,+9,1,231,114,0,224,44,7,243,233,37,64,31,1,95,55,118,203,0,67,+93,137,0,52,69,219,225,41,0,96,37,192,69,144,81,160,23,224,90,8,+128,25,96,48,197,162,224,174,1,227,64,1,224,168,1,199,120,224,73,8,+192,24,151,48,162,235,167,131,229,243,2,64,104,128,12,150,196,255,43,1,+97,195,141,12,67,4,135,201,231,124,1,228,164,2,228,236,5,224,42,8,+226,169,0,227,120,1,98,132,228,4,3,128,222,229,39,1,197,181,86,117,+225,78,2,129,169,200,111,128,11,98,202,185,215,228,39,5,129,62,224,8,+4,128,25,64,217,204,237,189,225,162,254,0,85,224,59,2,224,22,2,224,+25,6,224,26,6,224,29,7,199,140,192,37,192,183,128,11,224,196,0,254,+175,4,64,146,138,124,65,65,96,150,192,53,227,230,0,227,20,5,128,29,+227,17,11,254,71,0,246,199,27,128,150,226,219,5,237,50,7,100,70,129,+187,225,159,9,226,240,6,160,221,228,231,5,228,118,4,217,131,225,155,0,+224,132,8,64,73,246,140,8,168,194,213,69,224,50,35,194,92,78,30,113,+137,1,57,56,224,230,3,229,148,9,160,158,241,226,7,225,74,10,166,88,+225,73,10,247,81,4,225,72,3,192,41,226,12,2,224,58,20,224,35,0,+232,235,4,226,95,8,227,79,4,160,101,232,22,1,224,19,0,198,176,225,+69,12,139,246,225,69,8,225,64,9,214,115,225,64,19,0,58,136,162,107,+14,227,31,0,2,90,32,90,142,158,236,169,0,192,88,226,221,0,224,187,+1,64,7,1,83,32,204,166,162,133,128,242,0,85,234,13,1,201,165,5,+95,49,51,51,54,32,64,13,1,85,32,64,102,0,85,224,219,11,126,71,+85,138,3,95,52,55,57,104,218,112,44,0,55,64,10,0,56,112,56,130,+27,2,64,95,56,223,131,160,0,130,7,231,140,23,130,233,128,200,163,239,+64,33,199,126,235,175,3,133,144,77,13,192,193,130,21,68,195,96,20,96,+222,105,102,1,95,55,92,76,96,0,64,56,228,59,2,101,201,0,80,131,+125,0,95,214,213,65,121,214,164,4,80,32,95,51,52,236,232,3,26,92,+34,108,105,98,47,68,97,116,97,47,76,105,115,116,46,104,115,92,34,44,+49,52,57,58,49,52,140,226,224,42,1,18,109,105,110,105,109,117,109,58,+32,101,109,112,116,121,32,108,105,115,116,205,3,1,95,51,119,211,0,50,+116,222,64,111,204,183,96,193,249,176,6,128,19,133,180,129,32,129,242,224,+13,2,100,18,195,23,166,166,77,38,64,87,2,95,49,55,161,139,224,26,+0,65,3,0,53,68,171,66,130,6,49,32,79,32,35,55,53,245,58,1,+240,59,6,64,158,0,54,96,158,244,5,20,1,78,97,64,221,64,44,138,+195,0,90,226,166,1,171,225,129,186,206,208,163,136,128,186,229,152,1,66,+178,130,2,64,174,1,50,49,64,164,1,50,49,120,63,192,7,193,18,239,+107,0,243,100,1,163,190,192,91,99,193,224,9,0,98,52,134,228,139,122,+240,26,10,128,45,239,198,2,64,133,255,67,78,1,48,48,215,217,224,42,+5,193,237,128,182,255,67,20,226,48,25,224,116,1,224,70,4,224,69,1,+226,67,0,80,76,227,102,0,111,119,192,102,255,167,4,200,226,65,233,138,+191,225,107,4,0,83,169,48,228,138,1,190,247,97,190,97,38,160,7,192,+222,253,121,74,225,128,1,177,90,194,112,160,65,189,252,192,252,254,11,8,+128,237,253,112,4,66,50,1,10,65,229,21,7,167,239,110,75,68,134,165,+33,128,49,137,253,131,7,226,83,20,163,182,226,73,9,225,220,8,231,252,+0,226,49,19,138,64,105,35,70,82,133,2,92,124,100,13,197,11,68,250,+226,5,1,64,175,137,211,5,95,49,54,55,56,32,64,15,137,80,227,102,+9,1,48,57,66,15,252,93,4,64,20,123,232,130,162,253,253,2,4,95,+50,49,49,53,235,23,1,3,58,50,49,49,220,108,252,0,6,1,49,57,+134,65,252,0,0,0,49,197,132,161,204,224,136,10,206,152,194,196,237,192,+6,96,54,247,69,3,242,207,0,96,149,234,248,0,253,59,26,0,49,69,+66,227,208,6,64,163,197,184,252,205,7,0,48,113,9,224,204,2,0,54,+160,40,190,225,226,17,5,2,95,49,57,147,9,229,8,3,143,137,103,190,+96,95,1,57,55,64,95,250,227,1,64,100,98,127,0,50,162,117,64,102,+133,124,232,13,0,226,117,3,128,231,0,50,120,25,130,12,196,29,224,39,+4,143,179,229,28,4,129,214,128,152,96,46,133,158,128,63,238,144,3,224,+7,3,241,7,4,233,186,0,199,216,237,105,6,224,38,7,232,18,1,160,+52,243,164,10,193,252,128,47,233,224,1,224,63,5,224,64,3,144,18,252,+161,29,96,67,172,164,134,56,71,53,233,189,2,2,50,49,48,192,129,230,+112,0,226,108,4,102,106,73,33,224,0,9,162,98,0,49,66,246,0,56,+114,24,236,208,5,160,194,224,80,5,65,231,128,175,64,9,99,197,65,241,+133,132,0,75,227,35,14,1,49,49,128,164,128,81,64,15,231,66,0,237,+252,4,64,73,208,114,227,105,16,226,189,0,242,227,7,130,252,225,125,4,+227,7,11,232,192,8,128,42,192,131,160,134,133,55,65,61,96,118,1,75,+50,105,202,64,25,132,161,227,58,6,229,73,2,74,153,234,60,3,196,19,+224,102,3,64,85,239,168,2,226,25,2,134,183,134,195,224,169,1,162,205,+128,13,129,232,64,52,224,33,16,128,27,128,113,236,163,0,232,250,1,226,+159,64,224,219,4,225,78,2,102,157,128,159,192,49,232,135,10,64,58,202,+52,177,93,2,32,95,57,95,69,162,182,130,147,232,106,1,246,242,2,128,+10,160,16,224,149,5,224,165,1,224,117,8,224,249,2,243,171,1,192,16,+128,123,1,95,55,102,89,226,37,4,168,151,243,213,2,234,235,0,161,42,+207,88,138,88,214,131,102,197,128,73,224,17,6,135,37,3,95,53,55,55,+131,223,113,109,1,57,55,136,72,0,57,160,129,1,95,53,72,234,1,49,+54,162,182,232,26,3,253,222,18,96,246,2,50,49,48,189,141,75,228,1,+95,55,71,24,0,56,64,37,218,15,162,230,135,94,227,109,23,0,90,225,+79,2,227,100,32,192,30,193,236,227,97,6,64,159,227,97,4,0,51,107,+184,64,195,71,240,2,55,57,53,71,255,66,2,167,126,235,106,17,160,154,+1,50,49,136,85,64,8,70,146,64,62,0,54,195,172,162,157,128,9,208,+12,160,10,160,13,227,122,0,202,56,224,228,3,64,13,226,16,3,192,52,+128,35,241,174,9,196,1,131,151,112,107,160,253,224,25,0,128,8,227,128,+2,128,1,249,83,3,194,153,198,234,224,24,5,230,200,10,226,231,0,224,+39,5,227,176,0,231,220,0,225,7,0,174,224,224,111,80,230,192,1,228,+222,1,96,226,225,110,0,64,35,78,19,244,212,2,192,103,224,115,0,161,+21,224,133,0,84,84,1,52,57,70,153,166,254,229,66,6,235,218,0,3,+95,50,50,56,224,38,2,225,185,1,0,82,224,16,14,224,177,3,192,120,+225,254,4,224,42,3,226,51,3,229,103,0,169,249,225,16,0,246,208,5,+229,114,4,224,223,0,232,14,31,224,153,33,224,107,2,232,187,22,224,98,+2,96,52,140,228,224,109,6,232,243,17,160,56,128,54,96,40,195,128,225,+130,0,160,14,224,0,2,128,43,196,29,128,59,148,136,173,168,229,108,1,+71,38,235,188,0,2,95,57,52,69,18,1,53,52,253,27,1,254,4,6,+1,105,110,93,253,20,105,115,116,101,110,116,32,116,121,112,101,32,101,113,+117,97,108,105,116,121,32,208,248,101,142,75,52,64,153,68,205,224,68,8,+1,32,126,128,44,192,32,128,0,227,176,1,128,119,232,185,0,128,14,123,+75,128,10,1,54,55,202,216,197,241,129,162,237,228,8,65,60,142,44,1,+83,32,66,252,194,220,196,64,212,162,225,78,0,225,136,5,179,84,160,79,+226,75,16,193,166,226,39,1,170,77,149,246,138,75,227,125,1,0,64,77,+168,0,52,75,233,3,95,49,53,54,174,123,65,194,69,152,72,231,0,48,+94,244,67,178,0,57,133,179,137,253,233,179,27,235,151,1,230,75,47,224,+195,1,230,77,4,0,51,233,175,8,65,20,64,25,137,201,4,95,49,56,+57,54,64,29,64,172,64,22,169,198,160,50,109,244,240,148,2,64,33,199,+27,0,89,200,155,224,2,0,165,162,224,21,6,224,24,1,230,74,4,224,+28,8,224,55,10,224,32,6,225,233,0,96,245,224,30,0,224,42,0,224,+39,17,228,132,3,224,91,2,224,121,13,236,219,1,224,47,4,224,44,2,+230,41,0,224,23,1,224,46,1,162,161,96,8,160,5,2,95,49,55,246,+64,2,224,42,1,192,1,226,32,11,236,155,4,248,148,0,192,241,224,2,+0,198,142,224,85,6,224,173,0,192,16,234,197,3,78,98,0,52,194,67,+241,127,7,128,255,96,52,239,168,15,160,79,1,95,52,86,92,1,49,56,+98,142,195,18,228,159,2,1,49,56,92,54,129,34,159,151,2,52,55,56,+146,236,64,221,2,95,56,54,128,227,3,95,49,53,51,228,189,3,226,193,+1,192,188,234,174,6,225,174,3,202,129,225,213,7,225,182,4,193,17,96,+88,162,208,228,108,0,192,100,192,1,231,162,0,225,168,10,109,89,224,28,+26,128,123,193,158,128,30,226,55,7,200,97,226,17,22,224,0,0,224,36,+10,238,163,1,1,95,52,251,115,4,225,15,4,224,107,2,224,61,2,137,+201,224,17,21,243,10,5,224,29,8,193,41,231,17,0,224,106,2,193,127,+221,151,226,72,0,112,219,118,248,221,141,224,27,0,1,49,56,72,148,235,+221,1,231,137,3,230,71,6,166,59,128,50,179,70,140,39,224,83,5,192,+89,236,238,14,230,174,0,224,19,2,226,63,23,224,0,1,192,49,129,248,+224,83,3,225,151,11,225,144,3,99,61,225,90,6,224,63,1,238,69,0,+96,119,193,83,193,161,225,87,5,102,29,1,50,48,70,149,67,81,128,57,+225,73,9,226,72,1,218,91,146,113,103,239,71,41,195,14,224,21,4,134,+255,167,72,143,156,128,14,128,66,90,88,64,17,0,58,134,41,242,219,0,+1,95,55,67,248,104,62,228,2,8,131,251,99,132,154,140,1,49,54,66,+8,64,66,140,226,160,44,225,38,0,1,50,48,95,170,225,62,2,247,11,+0,97,188,133,87,225,42,0,250,196,13,228,211,2,225,240,0,160,13,162,+143,135,248,160,167,146,74,181,47,1,56,51,218,159,96,209,1,50,55,85,+75,65,83,1,95,49,69,20,66,137,4,95,49,53,57,32,161,98,64,61,+1,56,48,128,23,226,192,0,64,137,160,105,3,95,56,51,50,233,81,2,+1,36,120,105,80,64,254,141,210,97,117,1,75,52,96,2,128,120,64,27,+0,54,96,27,242,71,15,149,244,224,210,0,117,239,227,54,0,242,71,4,+116,148,232,147,28,126,94,193,49,238,220,51,237,224,0,160,128,137,20,3,+95,56,54,57,124,206,192,82,224,1,3,229,72,2,227,21,2,224,1,5,+231,236,1,224,37,17,224,35,4,64,197,203,110,64,135,233,25,7,130,237,+64,25,137,25,0,85,65,127,161,136,129,94,64,27,201,30,75,143,70,195,+157,90,64,25,137,22,225,217,1,3,97,100,105,99,155,117,96,34,126,43,+0,73,162,216,140,116,248,168,0,135,55,94,15,2,49,57,55,118,168,71,+36,66,127,241,229,0,65,40,96,171,248,123,0,225,102,0,64,78,115,60,+244,165,2,67,163,224,48,16,192,46,67,228,225,15,0,64,38,97,151,117,+69,226,163,4,9,80,114,105,109,105,116,105,118,101,115,124,86,194,176,0,+56,130,176,232,62,6,2,95,51,53,229,107,2,64,127,97,60,64,8,0,+53,129,12,0,54,162,129,139,217,201,192,195,160,225,21,6,128,83,226,171,+2,229,89,1,2,50,48,56,98,124,98,189,2,49,57,51,237,182,4,229,+241,5,115,117,137,142,79,88,64,58,133,59,166,87,66,207,93,71,2,95,+56,51,192,117,95,243,246,79,0,128,14,0,56,65,153,247,226,1,204,23,+178,10,64,1,230,103,8,64,239,195,113,0,83,106,200,64,115,247,141,3,+93,236,96,115,64,42,131,27,159,227,255,29,5,64,29,130,177,99,224,94,+18,64,197,0,49,129,82,130,177,233,226,0,98,158,0,55,69,120,164,202,+2,49,57,55,64,70,3,95,49,57,54,206,68,129,114,94,229,154,34,0,+56,64,179,64,75,130,225,64,172,0,66,117,48,141,120,96,175,237,123,4,+130,107,224,32,18,141,133,203,46,224,33,11,161,226,224,33,19,223,28,192,+176,226,30,1,192,25,0,85,108,213,224,212,3,226,66,6,92,22,160,237,+129,107,192,237,224,51,12,206,59,65,242,1,53,53,161,102,224,45,4,99,+70,224,169,8,133,1,238,106,10,192,24,135,214,224,7,1,238,147,22,66,+47,149,53,99,21,213,66,162,178,1,52,56,66,203,66,8,70,126,239,252,+5,224,176,0,246,22,2,1,64,85,100,10,160,199,242,58,1,225,112,9,+225,145,23,129,178,236,143,0,163,82,224,31,1,167,77,126,21,64,22,64,+163,117,114,128,186,1,56,51,67,102,224,176,4,136,181,130,238,225,107,2,+225,33,10,228,17,1,129,33,166,163,64,12,226,135,18,132,229,226,66,10,+192,24,0,85,195,210,226,102,11,224,35,7,128,0,224,39,13,158,128,98,+57,89,40,192,205,155,180,64,62,68,222,132,232,130,73,165,178,64,53,73,+27,224,253,2,128,0,101,14,227,83,4,105,127,192,101,106,1,192,53,224,+61,2,224,174,4,137,131,102,82,114,43,233,129,8,67,244,246,239,0,1,+49,53,72,238,66,97,134,214,65,187,208,222,96,19,65,207,137,175,66,122,+135,11,0,56,69,123,64,24,0,54,128,24,134,24,102,96,6,95,49,55,+54,55,32,64,230,76,1,1,91,93,70,63,64,37,0,54,160,62,100,134,+0,48,95,145,64,21,133,45,0,67,194,58,64,140,98,45,1,57,53,120,+4,1,56,53,64,187,224,78,1,10,114,101,99,67,111,110,69,114,114,111,+114,192,87,133,68,243,218,1,235,42,0,65,54,68,2,157,179,1,50,48,+76,46,242,224,6,26,67,111,110,116,114,111,108,46,69,120,99,101,112,116,+105,111,110,46,73,110,116,101,114,110,97,108,46,147,37,194,250,64,62,0,+50,135,197,167,72,171,54,224,75,1,4,44,32,97,116,32,147,46,2,49,+52,54,69,202,169,37,64,164,133,203,131,136,164,104,224,159,3,64,6,64,+45,105,192,0,53,131,236,3,49,48,53,57,99,85,0,79,96,14,106,78,+103,225,65,177,224,194,2,1,104,97,97,10,206,225,64,109,134,31,66,100,+0,35,124,165,0,85,129,107,251,178,0,194,206,235,100,1,113,115,228,123,+0,196,241,128,27,144,69,240,18,3,130,165,5,32,64,95,55,50,57,66,+43,64,150,76,128,0,54,134,117,235,39,5,134,129,66,81,105,65,198,225,+163,206,202,124,106,54,0,90,129,30,2,57,50,49,244,232,5,130,12,224,+243,1,24,78,101,115,116,101,100,32,102,105,101,108,100,115,32,110,111,116,+32,97,108,108,111,119,101,100,193,180,97,132,224,175,0,243,208,0,228,43,+1,240,224,4,96,22,1,32,85,231,206,3,96,50,160,162,224,147,19,226,+6,9,4,101,120,116,114,97,128,154,2,40,115,41,130,16,4,66,32,95,+55,52,131,103,1,51,32,162,211,192,145,232,120,4,232,4,5,128,153,131,+251,252,53,6,97,170,98,74,140,174,166,39,64,11,64,26,237,148,1,244,+220,7,128,0,3,95,50,48,53,100,68,96,111,1,49,56,64,5,0,52,+187,18,197,153,123,111,66,54,132,44,68,250,164,155,0,85,102,156,66,110,+65,38,2,95,49,55,78,119,129,27,0,58,128,55,130,102,184,129,230,60,+2,162,108,210,104,130,103,97,95,225,4,15,229,76,11,97,149,224,4,4,+129,212,64,149,166,35,78,23,194,229,138,255,224,62,1,201,144,67,202,241,+69,4,160,0,130,143,67,156,247,113,2,225,231,8,6,85,110,107,110,111,+119,110,129,233,129,230,131,247,210,230,225,167,5,0,54,248,10,1,221,5,+230,217,7,160,186,128,156,193,52,99,21,168,28,67,79,138,199,0,95,196,+13,101,138,5,79,32,35,49,50,48,230,177,3,163,201,97,117,129,111,96,+8,129,7,197,244,175,10,226,100,2,128,94,224,183,2,224,44,11,96,85,+125,178,224,192,2,225,83,0,65,54,226,121,19,192,155,0,89,128,61,175,+181,128,56,162,197,97,147,96,10,128,116,96,83,96,232,225,132,8,1,120,+36,225,120,2,0,51,76,38,192,0,239,186,20,164,146,209,62,160,0,232,+166,4,66,200,240,160,1,130,200,229,57,5,161,97,130,207,98,210,163,121,+129,202,250,15,2,65,241,0,52,131,104,79,57,2,95,53,51,119,130,192,+174,145,254,168,255,224,41,19,128,115,237,113,4,0,67,69,126,1,64,95,+103,116,128,244,0,48,170,196,1,53,57,194,186,228,30,0,237,75,3,1,+54,48,224,88,4,242,158,5,96,46,240,48,7,237,114,0,225,16,1,198,+33,70,61,64,83,64,31,202,200,129,30,245,15,0,66,30,228,18,1,128,+28,124,244,128,11,115,218,66,125,64,70,98,47,226,83,2,195,216,64,0,+234,228,0,229,18,2,1,95,49,237,129,1,164,79,245,78,1,64,80,227,+197,0,96,77,67,247,82,132,197,206,224,72,10,166,151,225,7,12,1,50,+48,195,224,194,15,239,153,3,96,126,97,15,0,56,151,114,128,69,97,227,+130,39,224,47,1,64,1,234,186,4,238,210,2,194,104,236,168,1,224,27,+1,235,13,4,250,74,1,230,36,5,225,153,1,128,112,128,15,98,34,76,+243,85,235,122,218,1,52,54,172,70,128,251,64,70,1,52,49,64,119,238,+249,2,224,120,52,232,70,1,224,122,16,0,51,102,107,160,129,128,127,192,+0,225,230,15,143,52,69,26,68,66,1,95,49,105,62,195,33,224,102,12,+96,101,2,95,54,32,139,79,238,52,5,160,63,114,3,2,95,49,49,133,+5,104,179,99,89,195,95,160,0,68,27,243,189,0,82,48,128,138,0,90,+64,10,224,34,2,0,54,169,133,226,67,13,135,226,236,199,1,226,76,0,+232,157,7,193,101,70,210,251,81,5,96,29,128,28,227,107,0,226,87,5,+237,210,18,164,183,224,32,11,241,138,0,193,192,224,29,5,253,132,13,128,+22,65,16,233,121,13,0,85,239,183,17,175,182,0,75,68,100,224,58,9,+224,210,0,224,245,1,224,177,8,130,48,227,53,16,96,125,206,94,250,221,+6,224,103,1,128,101,165,183,195,199,163,60,0,32,163,206,224,160,9,64,+42,132,220,128,50,123,254,74,45,166,79,234,39,0,230,188,8,16,98,97,+100,32,115,121,110,111,110,121,109,32,117,115,101,58,32,255,152,9,232,80,+3,224,63,8,2,32,105,110,128,50,128,38,173,231,224,0,1,137,152,227,+67,5,96,94,133,101,210,133,67,29,230,230,0,201,55,233,170,9,96,11,+0,80,70,215,244,164,0,253,223,7,108,68,193,71,97,163,194,147,225,177,+2,224,2,1,224,45,8,225,209,4,213,187,163,211,253,9,1,161,36,224,+51,10,162,183,64,29,224,46,0,229,106,15,214,27,160,219,226,203,11,128,+28,228,243,0,70,54,171,109,224,129,1,231,229,0,232,192,0,100,232,64,+5,228,222,0,192,28,243,250,0,224,119,16,192,244,224,119,4,224,48,5,+225,62,0,163,10,225,65,18,224,169,5,227,239,18,195,238,241,128,146,224,+197,2,227,224,11,192,30,233,116,5,97,122,235,227,5,225,43,1,137,117,+231,181,0,161,84,64,20,96,16,191,56,227,248,0,153,233,225,255,0,224,+69,5,192,49,96,52,130,7,230,95,5,227,139,1,224,169,6,233,24,0,+192,216,192,231,128,136,227,91,7,129,196,247,59,0,226,5,2,96,193,223,+241,147,166,239,148,3,234,236,1,224,66,4,65,179,161,43,0,67,71,46,+130,127,164,129,189,117,68,58,93,116,128,61,225,4,1,160,81,253,139,11,+64,66,252,11,26,69,244,124,89,188,113,0,75,112,166,68,152,135,90,231,+88,1,231,90,7,0,51,145,78,249,96,31,69,170,102,153,0,50,170,92,+198,110,224,15,0,64,84,209,53,119,222,97,152,193,251,64,29,145,60,103,+134,237,155,2,69,122,142,30,131,226,75,176,160,48,143,54,0,83,107,146,+76,121,151,122,0,58,107,153,200,24,232,26,6,120,165,161,127,168,9,234,+200,1,177,118,107,219,96,100,224,249,1,224,70,3,143,220,128,147,233,154,+6,252,21,0,64,143,188,95,235,230,10,83,147,198,5,131,19,2,95,49,+55,93,173,224,78,5,2,95,49,57,156,135,233,254,5,64,94,137,28,205,+6,64,17,0,54,160,17,249,218,4,105,231,64,194,224,189,2,131,141,231,+161,3,64,7,144,22,224,102,7,230,184,1,226,103,0,193,55,65,44,238,+80,0,212,14,192,10,0,83,97,89,0,51,65,184,0,66,148,234,223,91,+160,9,239,96,0,158,143,244,148,0,2,49,53,51,76,74,135,209,231,136,+1,8,99,111,109,112,111,115,101,83,101,91,255,96,0,141,136,5,50,32,+64,95,54,49,177,159,209,86,0,53,115,35,0,54,166,27,241,70,17,71,+99,148,50,224,148,22,243,28,7,3,104,97,115,70,80,147,128,139,64,42,+0,52,129,131,163,52,224,80,40,2,115,101,116,224,80,13,195,48,131,122,+99,141,139,146,225,170,3,236,72,4,224,26,6,116,219,67,165,1,53,49,+143,221,96,143,193,51,224,52,1,227,8,5,2,95,50,48,99,150,96,23,+0,80,128,191,0,49,243,159,8,164,100,246,58,4,11,111,114,100,32,119,+105,108,100,99,97,114,100,244,54,9,163,144,236,204,9,162,72,73,27,128,+35,176,181,232,154,1,135,7,233,47,1,69,38,2,52,55,49,240,252,0,+2,95,55,54,92,117,2,80,32,90,253,234,0,153,226,225,29,0,106,252,+201,87,224,35,27,224,9,1,230,240,1,230,238,0,97,228,97,84,224,60,+0,129,91,161,132,1,50,48,67,123,250,72,6,164,58,172,116,65,224,222,+253,64,239,69,168,64,3,109,33,96,122,64,33,132,228,237,82,6,131,181,+237,183,8,123,152,225,199,6,226,241,0,77,207,237,153,7,239,157,14,155,+172,228,32,3,238,48,3,64,150,66,30,237,122,15,2,49,57,51,225,218,+2,101,78,0,52,159,217,195,121,91,108,180,240,0,80,235,110,2,3,118,+97,108,117,127,12,224,18,1,0,116,223,30,224,18,1,2,107,105,110,130,+78,227,63,2,1,111,114,100,24,64,90,197,25,224,154,15,160,200,228,199,+0,240,89,0,192,12,64,167,197,39,236,103,11,240,186,4,226,202,4,130,+184,193,254,82,36,224,55,4,161,57,0,54,229,83,2,203,192,235,123,5,+128,91,235,76,12,99,15,232,128,1,224,34,4,177,126,160,156,2,95,49,+55,101,1,64,138,226,198,3,234,13,7,200,144,0,85,228,67,0,234,120,+18,231,61,4,234,199,11,103,217,185,114,224,42,14,193,43,192,167,131,53,+163,48,128,0,2,95,51,52,237,134,3,29,92,34,115,114,99,47,77,105,+99,114,111,72,115,47,69,120,112,114,46,104,115,92,34,44,56,49,48,58,+49,57,141,213,229,76,4,3,83,76,111,99,64,38,98,38,65,115,134,199,+129,224,132,210,131,209,65,36,105,48,160,125,96,144,1,50,48,135,13,192,+145,192,20,102,86,160,20,64,84,134,62,64,29,209,168,192,7,66,70,104,+10,64,38,134,20,241,212,4,64,27,64,26,233,15,4,0,95,138,3,64,+23,201,9,138,196,130,170,143,149,238,15,0,160,104,64,8,246,4,5,236,+187,5,224,49,0,236,80,0,68,33,244,244,5,204,148,96,231,224,26,4,+207,146,128,6,65,171,188,176,0,51,138,173,128,49,69,4,162,114,239,61,+4,7,117,110,100,101,102,105,110,101,183,187,163,80,79,117,224,42,8,175,+153,1,95,56,231,180,0,98,122,102,243,130,67,74,9,0,53,123,106,212,+159,64,33,224,126,0,192,13,224,86,5,8,97,109,98,105,103,117,111,117,+115,160,129,195,62,252,96,0,224,136,15,201,36,144,35,128,149,160,14,4,+79,32,35,51,50,163,43,98,23,2,51,57,32,160,33,249,73,11,245,98,+0,198,56,68,131,249,18,10,160,220,65,253,222,58,229,26,3,157,228,224,+229,3,4,79,32,35,57,49,227,179,3,161,195,224,219,0,247,255,0,1,+95,52,66,31,2,52,48,54,72,62,88,202,89,26,160,55,128,80,160,53,+224,40,8,66,226,200,35,203,128,224,97,0,128,0,0,58,97,0,99,93,+66,93,2,95,52,54,98,63,69,239,91,133,3,95,49,51,51,97,210,155,+147,64,87,0,83,65,203,239,8,1,3,95,49,50,55,160,49,0,35,69,+27,97,85,158,255,0,57,167,41,64,99,134,49,0,95,68,88,90,202,230,+172,0,66,35,135,125,106,57,162,185,3,95,53,51,56,224,12,0,64,62,+198,21,125,36,132,112,96,99,64,27,0,54,196,28,233,181,38,0,103,233,+181,14,64,240,97,15,197,210,222,142,164,27,203,12,168,197,133,43,65,86,+126,161,252,188,0,254,145,18,4,80,114,111,120,121,162,210,224,155,3,64,+124,228,149,1,3,95,49,55,53,75,76,71,18,225,135,2,192,246,132,151,+89,174,3,55,32,95,53,65,234,64,21,132,146,238,233,0,64,160,0,57,+94,237,64,133,0,49,97,218,91,7,66,197,120,139,226,146,0,232,4,16,+166,2,245,127,3,117,103,130,78,134,203,155,55,99,50,1,95,52,181,183,+226,154,0,245,118,0,231,36,1,224,2,0,128,24,239,154,4,96,2,167,+24,65,3,64,134,194,101,2,49,57,55,101,196,192,188,64,205,198,116,229,+5,2,242,96,0,224,5,0,99,190,238,40,3,64,19,66,122,0,66,226,+202,3,230,224,3,101,186,128,248,64,24,128,127,189,125,0,56,175,222,1,+49,57,124,164,224,237,2,64,153,100,28,101,43,142,207,100,100,0,50,97,+130,64,214,192,85,0,82,64,44,173,182,0,57,78,15,140,227,1,57,52,+231,56,16,8,84,121,112,101,67,104,101,99,107,135,61,6,49,48,53,48,+58,54,55,196,241,192,0,193,149,161,152,65,98,64,127,130,147,133,22,112,+204,177,252,241,255,1,1,95,56,160,36,224,67,4,145,176,225,60,4,224,+232,3,224,11,3,66,98,96,241,128,239,192,214,224,151,0,130,61,241,193,+0,199,3,140,188,1,50,48,129,232,237,10,1,64,42,177,118,242,160,0,+224,163,2,235,221,0,66,245,231,112,1,226,200,11,134,112,226,174,0,239,+58,3,129,156,1,57,32,229,251,10,226,165,0,187,161,65,5,0,52,121,+46,0,49,120,220,195,25,225,64,0,144,60,128,0,97,255,239,179,21,0,+57,113,8,0,95,234,129,4,96,204,134,63,2,95,51,54,64,189,128,202,+2,55,57,52,96,168,168,96,64,176,233,15,0,64,23,102,229,64,5,64,+28,133,106,162,144,225,14,16,230,58,2,128,137,231,93,1,2,50,48,50,+82,176,156,15,100,65,225,106,1,64,100,224,93,0,235,161,20,225,241,19,+249,190,5,64,112,177,81,225,53,26,64,138,225,53,9,66,23,139,150,236,+6,1,82,229,225,22,1,133,213,224,184,27,192,35,129,27,171,124,192,202,+128,199,129,35,225,29,9,133,189,82,54,137,251,160,70,1,57,57,252,233,+0,226,44,4,64,50,133,199,77,219,96,14,165,192,243,184,14,96,240,132,+144,0,56,82,91,251,150,0,161,43,123,215,197,22,229,30,2,0,85,228,+195,9,0,50,228,104,2,0,75,205,147,160,147,131,79,1,95,53,65,36,+101,115,132,73,129,209,251,139,1,96,9,67,31,142,9,1,95,53,103,215,+0,53,101,156,224,6,5,100,220,64,3,101,118,192,76,0,83,121,44,0,+53,116,97,192,32,224,106,19,110,251,224,108,1,72,99,96,114,224,108,31,+0,82,224,108,26,65,70,96,100,0,83,186,192,224,110,6,160,103,224,117,+2,224,106,9,224,63,3,224,113,2,166,1,102,146,147,138,64,46,192,40,+224,108,18,224,115,2,128,67,224,61,13,160,106,3,95,49,53,48,230,68,+17,5,67,77,111,110,97,100,134,66,5,50,52,52,58,50,51,230,63,4,+3,95,49,52,56,232,38,3,1,52,56,105,221,224,13,0,105,150,224,13,+0,0,57,224,13,1,1,54,49,224,11,2,118,56,96,11,66,77,181,231,+231,248,2,130,253,214,37,228,37,5,231,168,5,71,100,233,123,0,184,20,+228,88,8,101,132,254,17,5,3,95,50,48,48,252,142,6,160,22,1,49,+56,99,104,0,49,241,1,1,242,182,1,251,144,2,232,167,4,132,85,96,+112,64,0,192,44,130,43,247,83,4,192,59,196,43,199,131,230,234,1,65,+255,183,117,224,102,6,254,174,5,74,119,99,227,224,38,4,251,173,9,224,+37,1,228,162,2,129,32,225,20,11,103,234,240,246,8,64,1,153,169,128,+85,249,64,1,229,189,11,225,160,4,2,50,48,49,128,126,192,71,250,57,+0,64,26,200,1,224,100,80,192,14,131,21,224,17,1,224,15,0,224,133,+3,224,47,2,156,55,163,239,226,128,31,207,206,192,78,224,141,1,224,143,+0,224,19,2,188,154,226,13,6,168,78,96,13,224,10,1,129,175,131,12,+0,64,162,103,224,73,1,234,163,8,226,108,2,224,37,1,224,131,18,224,+70,0,195,112,192,136,224,119,0,134,29,102,202,154,183,251,15,0,226,87,+10,226,93,12,231,35,7,231,41,0,137,189,131,165,187,51,64,74,239,110,+13,172,46,224,189,2,224,21,15,160,132,135,79,64,119,80,99,245,195,0,+160,0,251,154,2,228,10,6,96,0,225,255,54,100,223,68,80,228,223,0,+226,211,10,196,56,128,12,224,94,6,160,221,192,86,66,172,135,193,0,49,+193,125,192,54,129,201,164,192,96,119,137,138,96,242,231,207,6,12,99,97,+110,110,111,116,45,104,97,112,112,101,110,211,69,64,81,238,27,3,64,2,+64,13,224,143,3,64,94,140,211,192,118,226,84,0,197,4,226,58,0,192,+34,67,179,224,46,0,237,104,7,224,177,1,161,22,226,33,6,236,89,9,+2,50,48,49,66,132,64,38,0,79,236,17,5,229,250,30,224,103,0,75,+67,80,194,0,56,80,225,160,93,0,52,113,233,64,27,0,55,73,57,5,+67,32,95,51,55,48,243,125,1,160,98,130,182,0,48,239,179,3,12,83,+117,98,115,117,109,112,116,105,111,110,32,99,77,133,4,32,102,97,105,108,+217,25,226,92,8,65,111,251,125,0,224,227,2,2,95,52,50,96,146,64,+12,70,5,179,152,247,172,4,0,54,109,78,64,65,202,78,0,89,97,119,+65,48,246,111,0,97,68,166,92,64,217,166,13,182,75,245,232,16,224,25,+0,189,195,161,40,226,2,6,72,112,175,1,225,210,8,96,23,129,123,230,+71,9,71,216,242,95,4,192,24,224,136,8,170,152,64,27,66,96,134,218,+192,143,165,7,230,218,0,243,30,2,226,46,6,245,96,0,226,84,2,226,+128,4,192,36,128,177,224,179,7,228,0,0,164,222,224,191,3,241,231,0,+160,168,225,14,40,164,147,111,224,204,91,160,75,224,42,3,218,203,64,0,+65,244,0,51,232,152,10,108,15,229,138,11,228,89,2,230,28,8,163,44,+194,32,64,112,129,78,160,174,224,197,0,240,201,1,225,37,0,224,27,10,+227,124,0,162,107,229,254,7,227,155,8,118,220,232,114,0,129,3,225,39,+8,207,53,225,151,6,226,160,31,228,26,0,65,57,242,252,4,227,117,16,+106,222,85,173,2,95,57,55,129,150,225,190,13,65,50,96,157,129,243,166,+185,130,48,166,86,158,178,160,70,128,12,230,128,1,64,145,208,152,225,79,+4,0,56,65,159,224,113,8,224,182,0,181,60,250,122,2,192,115,150,205,+116,95,160,14,86,205,0,53,161,5,6,95,49,52,54,32,95,51,184,21,+128,127,214,139,225,213,10,142,244,0,55,247,176,3,129,218,184,107,132,96,+64,42,1,55,57,199,178,111,17,0,57,102,153,2,95,49,56,209,149,96,+58,225,235,2,64,121,75,124,70,156,4,50,48,48,55,32,64,15,240,149,+1,66,213,230,76,1,129,96,97,109,132,193,134,91,226,107,0,226,110,0,+199,116,192,204,224,50,2,132,244,227,98,1,227,37,6,171,60,224,172,1,+224,60,10,218,240,224,32,1,228,177,8,224,34,9,135,25,160,77,167,20,+232,6,5,192,231,231,48,4,227,169,2,225,125,4,161,66,234,232,14,232,+95,7,225,61,0,225,62,2,85,127,2,57,32,95,245,130,5,129,59,132,+9,3,95,50,50,56,160,31,226,124,2,132,91,224,133,11,224,18,11,224,+23,0,234,149,8,229,211,2,160,182,133,4,104,105,224,13,5,224,56,12,+224,57,3,235,53,3,228,83,1,228,115,6,192,184,160,58,134,12,64,9,+226,192,0,224,103,5,230,18,5,229,31,1,161,28,241,32,2,225,30,11,+225,235,2,128,18,162,88,228,247,2,225,183,1,225,227,13,96,195,227,133,+9,215,107,167,210,226,239,1,227,6,4,96,35,224,17,9,225,52,2,65,+165,67,157,240,79,1,225,69,1,171,139,64,105,96,133,251,56,5,138,49,+6,32,117,110,105,102,121,32,251,67,10,1,49,48,107,5,224,55,8,2,+32,97,110,188,31,192,34,224,236,3,162,3,226,66,9,68,17,138,190,234,+142,1,229,176,4,2,49,57,56,234,52,0,64,62,68,119,129,36,64,70,+64,103,64,66,0,54,197,94,3,50,48,48,51,105,205,133,60,1,50,48,+103,185,64,34,137,132,249,123,3,10,105,109,105,116,105,118,101,115,46,126,+34,112,9,64,42,249,114,0,135,242,224,9,0,0,95,133,206,64,37,231,+150,1,230,96,11,2,49,57,55,139,176,228,217,1,208,230,64,141,0,49,+162,200,229,37,7,222,65,96,86,226,85,7,228,57,32,235,198,7,133,166,+0,56,235,61,6,160,39,229,225,6,66,247,107,2,136,130,64,200,133,214,+226,58,33,4,121,99,108,105,99,226,52,10,64,7,98,19,64,141,168,120,+226,62,7,0,61,226,60,17,229,95,5,224,227,7,225,113,1,192,216,131,+19,97,115,224,220,2,165,22,228,247,1,162,77,96,229,224,152,0,224,247,+10,161,167,224,34,1,129,177,248,106,1,227,201,20,225,61,6,1,49,57,+117,137,168,73,131,81,150,20,225,16,7,4,101,114,114,111,114,249,212,0,+64,113,135,195,148,25,224,40,1,3,116,121,112,101,64,36,224,17,1,0,+107,213,196,224,18,1,3,115,111,114,116,224,18,6,4,114,101,97,108,109,+64,19,0,58,128,128,236,161,44,0,57,89,7,96,65,189,215,2,51,54,+55,140,164,235,196,5,226,204,3,129,255,226,132,1,167,120,234,171,1,224,+39,21,202,212,225,234,0,231,97,4,231,197,5,231,188,17,98,83,131,1,+128,107,206,0,130,253,250,107,1,231,18,3,140,62,0,90,64,208,0,90,+64,49,192,25,224,100,8,237,91,2,0,75,162,51,169,82,165,206,224,215,+10,231,51,2,224,79,8,237,35,9,64,29,128,34,160,25,64,106,128,11,+3,95,49,55,55,74,50,153,182,187,31,65,162,255,59,0,1,49,57,65,+68,69,36,1,54,56,99,2,158,88,111,28,64,40,0,54,96,40,78,109,+96,165,132,142,228,207,0,164,138,128,194,236,107,8,200,102,140,103,148,221,+99,34,235,235,9,225,82,1,231,227,3,237,83,5,66,98,235,5,0,2,+49,53,52,164,27,64,45,142,24,237,154,1,225,161,6,130,123,236,47,4,+2,49,57,57,237,199,1,64,232,175,152,193,136,144,20,236,54,23,97,50,+237,38,4,237,239,9,242,223,2,236,33,11,64,0,224,52,3,64,139,134,+124,1,95,49,64,94,0,56,75,187,164,112,172,39,64,34,198,121,1,80,+32,130,198,90,41,128,36,96,22,227,190,6,227,178,0,228,159,12,0,56,+128,172,129,37,131,67,193,184,1,95,55,70,142,97,76,0,90,133,35,0,+56,192,181,165,213,231,159,9,130,222,233,149,4,231,171,1,228,53,6,237,+25,0,1,85,32,77,216,224,27,13,96,217,253,206,2,130,179,131,233,226,+184,0,1,56,57,226,184,1,235,236,4,251,92,2,224,235,0,64,80,189,+82,6,56,54,57,32,75,32,85,165,189,224,1,7,181,42,128,0,224,34,+13,135,193,224,0,1,64,158,162,154,0,58,128,150,98,87,64,123,0,54,+129,194,92,124,129,43,232,133,4,2,100,105,99,69,152,64,26,253,80,1,+238,36,9,226,104,12,97,140,65,116,124,176,64,13,231,110,1,1,49,55,+96,124,64,147,238,14,8,128,148,1,10,65,110,52,0,54,100,55,64,19,+131,12,224,123,3,5,56,52,49,32,64,83,67,227,131,31,130,98,225,227,+3,128,148,1,56,52,68,228,97,152,0,51,92,36,86,50,129,159,98,191,+161,159,239,217,5,105,162,1,32,95,99,36,132,223,64,47,64,60,64,139,+131,12,4,85,32,75,32,90,224,1,6,0,75,227,193,1,128,42,131,20,+225,210,0,66,81,225,177,27,224,35,26,224,32,23,224,29,20,224,26,17,+224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,137,199,226,+141,1,224,0,2,65,44,132,42,0,95,66,0,134,32,64,20,131,101,0,+85,65,90,160,2,96,59,64,26,200,114,110,212,231,151,1,64,109,230,188,+5,128,110,167,188,231,145,12,129,183,228,111,3,231,179,44,233,254,15,132,+153,87,249,226,101,3,229,20,15,228,174,10,169,248,227,98,5,96,0,95,+84,228,90,3,0,51,64,32,130,212,165,15,229,180,1,71,110,96,234,230,+50,3,255,149,0,224,39,3,1,56,50,121,92,160,144,64,0,224,11,2,+232,1,9,97,2,68,177,102,92,224,71,2,0,51,127,156,1,53,53,96,+32,224,78,3,233,30,18,133,206,225,173,18,200,192,239,217,8,192,24,231,+106,4,232,149,0,224,78,15,132,122,225,217,10,192,24,102,106,225,122,7,+226,9,11,224,47,19,96,0,225,57,9,129,56,230,185,11,162,10,224,24,+14,129,177,226,33,4,246,7,8,224,132,10,233,126,4,0,58,128,75,186,+21,101,65,177,185,225,89,8,226,228,0,129,77,227,40,3,67,210,1,54,+48,209,206,2,95,51,52,236,40,3,255,214,6,3,121,112,101,67,88,149,+159,216,5,54,49,54,58,51,54,140,69,236,13,2,5,101,116,85,86,97,+114,172,90,192,233,231,96,11,234,25,3,237,16,1,147,241,64,30,128,179,+64,229,171,255,231,89,13,231,81,0,224,22,5,224,1,1,229,155,127,229,+57,6,64,216,235,53,3,0,50,115,62,0,95,103,210,117,12,193,3,64,+40,0,54,229,70,4,230,169,0,64,26,135,90,130,132,226,152,4,1,95,+49,98,56,0,85,130,22,146,165,224,32,11,196,251,253,30,2,224,41,3,+130,182,162,131,64,29,131,156,128,33,68,232,0,50,124,76,3,49,56,55,+53,226,57,2,1,61,62,175,114,224,22,5,241,24,2,160,33,224,91,5,+1,95,49,72,22,0,64,78,133,225,40,0,160,231,170,195,1,53,49,104,+49,97,44,109,90,96,132,96,7,88,227,90,205,1,95,49,91,117,224,6,+6,224,33,0,64,13,128,39,224,33,21,160,26,224,40,3,224,33,13,224,+40,3,66,208,67,179,0,57,104,170,64,182,136,66,0,75,98,11,239,202,+17,98,39,0,83,131,197,1,66,32,227,133,21,5,67,77,111,110,97,100,+131,131,5,50,53,56,58,50,53,207,201,129,65,239,234,4,5,97,115,115,+101,114,116,64,51,12,100,101,58,32,101,120,112,101,99,116,101,100,61,241,+71,13,73,203,1,50,48,70,130,1,57,55,96,151,0,67,188,193,0,79,+96,18,0,49,160,8,0,54,224,8,0,0,50,249,27,2,224,122,8,4,+44,32,103,111,116,128,105,128,90,192,85,225,211,1,136,50,2,75,51,32,+64,12,136,42,5,95,49,49,54,32,75,176,137,3,95,49,49,56,224,81,+2,4,84,67,69,120,112,132,90,224,25,8,68,156,194,80,224,26,6,0,+75,208,179,224,26,9,0,83,208,187,97,200,129,185,130,240,0,50,225,6,+1,64,156,136,172,66,238,0,52,106,254,135,163,93,70,0,53,71,234,145,+119,64,30,0,49,81,132,165,161,249,95,3,225,30,8,15,77,117,108,116,+105,112,108,121,32,100,101,102,105,110,101,100,161,196,1,95,56,126,60,2,+64,95,52,108,251,3,58,49,57,54,133,228,226,62,18,226,91,15,135,138,+132,135,224,31,11,247,126,2,235,126,8,64,31,233,86,0,244,108,0,224,+33,3,100,182,75,227,139,195,215,253,0,82,64,22,104,49,64,7,64,195,+79,226,2,95,57,52,230,87,31,5,51,55,55,58,56,49,242,157,0,224,+160,18,0,54,130,78,98,198,253,48,7,225,19,21,165,14,0,66,118,17,+224,245,12,225,18,14,116,13,163,55,224,140,10,232,54,9,80,88,0,57,+99,44,237,35,2,95,123,98,235,1,54,50,226,233,0,99,86,163,84,96,+7,108,236,228,9,34,3,48,58,49,55,231,141,8,3,117,99,99,32,226,+230,3,2,95,50,57,99,137,96,141,225,148,20,224,92,5,3,49,58,49,+50,194,161,224,53,33,3,50,58,49,52,192,53,3,49,57,54,52,224,121,+1,2,49,57,54,224,135,2,0,51,89,19,224,12,1,104,30,96,12,65,+43,247,194,8,0,89,133,37,0,80,140,75,129,201,164,251,158,6,0,50,+245,76,0,241,252,4,1,49,57,67,172,0,49,67,79,96,36,97,96,128,+6,64,103,0,54,199,99,103,101,96,65,64,22,135,95,209,184,224,123,33,+96,20,0,53,73,174,224,113,5,64,83,134,203,3,75,50,32,65,109,37,+65,234,128,15,0,75,128,15,165,23,96,133,64,15,253,225,0,243,93,7,+0,53,240,164,2,64,40,240,131,22,240,125,1,224,25,7,192,1,233,44,+101,233,18,5,0,58,128,207,165,103,1,49,57,163,184,109,18,96,5,0,+48,138,164,0,73,70,126,67,50,0,56,130,203,126,171,0,79,129,30,84,+143,67,154,81,234,128,32,132,135,145,41,0,53,66,83,97,185,64,4,64,+111,202,90,123,148,1,51,50,232,170,13,227,62,0,64,49,130,142,224,39,+12,166,104,64,37,0,54,161,177,224,201,24,66,162,0,79,64,179,224,208,+2,105,3,69,78,2,79,32,64,100,26,64,16,64,6,66,90,96,190,224,+52,11,96,81,224,52,3,0,51,224,52,26,100,236,224,52,3,105,63,224,+52,22,97,178,224,52,3,153,126,224,52,1,128,27,128,52,135,10,224,45,+3,161,139,64,175,225,139,0,130,42,225,192,14,97,81,131,135,0,80,72,+42,64,35,101,62,1,57,53,101,212,64,120,224,12,7,96,140,64,43,177,+195,0,49,71,134,64,15,212,209,64,35,139,101,117,254,0,57,110,234,0,+56,186,73,64,163,128,62,227,122,0,128,250,103,245,115,20,64,28,195,110,+1,50,55,64,90,64,28,96,106,77,202,64,15,197,229,193,55,0,54,96,+53,65,15,226,65,15,0,45,75,20,64,35,0,54,224,35,17,1,78,97,+179,213,65,118,224,36,15,5,83,121,109,98,111,108,160,39,129,46,224,39,+12,8,67,111,110,115,116,114,97,105,110,192,83,210,242,227,16,20,233,81,+0,64,49,129,80,224,39,12,169,148,64,37,129,71,167,57,90,20,152,59,+80,171,105,105,0,51,102,1,174,13,224,20,11,64,68,161,111,76,3,133,+142,121,42,224,9,0,170,206,255,96,1,64,60,187,130,96,7,132,115,139,+161,96,85,0,58,128,7,141,64,240,87,5,67,131,0,83,168,246,210,69,+66,201,5,85,32,95,49,55,54,233,227,0,136,13,237,87,5,231,180,19,+5,83,121,109,84,97,98,135,32,71,31,0,48,231,178,7,5,103,101,116,+73,100,101,97,143,182,198,224,189,3,0,85,153,48,64,183,130,93,65,77,+74,157,96,246,96,23,249,138,16,0,51,98,219,225,77,0,72,203,230,44,+7,70,32,229,177,9,229,183,8,230,26,90,224,26,17,224,23,14,224,20,+11,224,17,8,224,14,5,224,11,2,244,214,11,65,35,131,98,225,76,11,+101,93,225,76,1,164,146,231,121,9,167,115,224,16,1,224,1,5,225,85,+170,225,43,8,64,255,132,55,0,85,77,204,247,82,14,64,37,132,43,0,+85,104,234,80,199,224,34,4,64,32,246,47,0,246,49,1,192,26,131,252,+240,232,7,235,117,6,99,29,129,126,235,253,10,0,50,103,35,181,185,1,+51,54,64,19,171,171,147,18,64,34,132,47,2,55,53,53,227,225,1,128,+128,79,8,250,49,20,85,116,242,208,9,105,205,64,29,96,75,64,71,131,+184,97,4,248,127,17,64,40,131,201,226,83,2,181,17,224,1,11,226,71,+170,224,17,8,224,14,5,224,11,2,192,8,227,165,11,97,41,0,54,225,+154,0,224,1,13,225,29,5,225,68,245,243,90,8,65,82,164,228,0,56,+70,85,73,183,198,101,66,230,98,172,226,169,5,226,173,7,96,42,132,2,+224,70,0,103,79,64,108,64,75,64,31,218,32,1,52,53,73,29,0,50,+195,234,0,83,231,119,6,71,184,224,19,7,65,244,227,247,5,144,96,115,+116,100,116,211,162,224,39,7,136,6,192,39,200,128,0,49,68,77,159,146,+192,6,96,0,224,119,6,64,53,224,78,4,148,12,192,77,68,63,224,117,+12,110,89,224,38,12,97,8,168,198,2,49,56,51,97,9,0,49,196,88,+0,83,64,152,93,63,97,171,172,48,0,55,74,70,192,17,0,55,107,53,+96,11,0,52,110,111,241,121,1,0,39,78,109,139,106,96,59,83,212,1,+95,56,122,191,238,134,2,221,14,0,52,100,231,128,143,0,49,200,73,64,+1,85,221,216,66,249,112,13,128,56,129,72,127,211,224,29,4,96,231,128,+58,250,24,7,96,122,246,135,7,150,136,106,10,214,136,232,134,1,150,146,+162,196,103,72,239,208,3,66,204,242,156,1,160,119,224,2,1,96,166,207,+183,128,7,224,204,2,175,175,229,168,1,114,13,96,32,66,179,129,68,230,+5,2,64,12,108,20,160,82,2,95,49,55,131,43,65,180,0,55,123,46,+187,63,0,55,64,47,86,213,176,232,65,196,128,12,128,0,224,164,3,64,+187,128,24,128,227,186,150,193,202,128,16,128,145,224,196,0,224,110,3,98,+9,2,49,51,57,112,6,160,100,160,186,64,157,224,120,5,160,99,149,239,+225,193,0,0,39,80,211,160,26,176,214,224,119,0,224,50,1,129,44,96,+50,96,227,231,30,2,64,13,0,55,231,44,4,4,66,32,95,50,55,81,+236,66,113,1,95,49,83,39,156,254,2,53,57,32,188,31,0,95,98,230,+175,2,77,81,236,105,3,1,36,102,138,252,64,122,0,89,224,150,0,192,+237,64,138,78,33,72,76,160,205,224,58,2,0,120,178,109,86,112,0,51,+97,39,224,252,2,224,150,24,243,218,0,0,51,128,27,160,167,224,173,0,+242,1,10,226,165,2,130,89,193,56,226,227,0,164,93,129,74,163,95,64,+1,98,208,128,10,65,130,130,63,162,139,161,241,226,235,0,210,94,232,152,+8,224,0,3,227,89,4,150,159,99,88,228,248,0,1,39,32,76,189,131,+108,226,131,0,0,79,64,13,195,39,0,67,133,178,97,2,80,116,143,28,+0,53,143,242,225,130,0,0,55,146,119,1,56,57,137,125,1,56,57,97,+61,207,199,96,185,0,85,196,149,224,103,5,192,240,128,111,134,138,128,17,+131,73,0,56,90,249,224,20,3,64,110,1,52,48,181,79,3,95,49,57,+48,133,72,192,107,227,67,1,160,85,237,192,5,192,178,228,141,9,106,9,+228,140,6,133,182,228,139,2,224,187,5,224,181,3,128,119,129,232,69,108,+145,160,102,109,103,0,0,56,225,60,0,151,254,240,230,4,224,116,4,229,+0,8,0,90,201,232,96,11,224,13,0,110,224,192,139,128,9,64,136,228,+164,6,65,42,64,5,4,49,32,79,32,35,90,124,160,117,225,155,2,128,+131,224,104,1,230,66,10,129,120,226,170,0,238,21,3,140,206,162,77,64,+2,226,163,1,224,142,8,128,41,229,94,5,0,67,97,46,227,84,2,194,+83,68,148,65,20,135,142,90,95,71,51,96,183,225,30,1,133,78,1,55,+48,129,169,1,54,57,102,214,97,122,64,22,247,98,0,64,0,230,244,3,+98,62,100,105,64,0,70,242,246,84,0,226,25,5,255,10,1,2,95,49,+56,120,188,97,214,135,246,0,57,72,116,64,60,0,54,96,60,165,193,255,+79,1,165,203,162,204,230,37,3,160,21,226,52,1,68,213,64,248,64,61,+128,124,198,9,128,61,156,212,130,44,192,51,225,138,0,192,104,224,29,9,+230,18,1,0,52,109,18,226,13,1,248,18,2,1,101,113,250,241,0,230,+29,0,224,82,1,192,13,193,212,103,42,160,196,128,92,141,39,136,135,0,+67,217,245,65,214,81,119,129,168,1,95,56,78,15,129,177,229,114,1,97,+134,64,40,1,56,48,165,93,197,117,231,57,28,230,36,16,230,34,1,197,+139,193,41,160,87,230,49,46,66,3,88,139,226,72,7,98,3,139,51,0,+90,161,211,136,4,169,168,130,21,225,226,148,128,65,1,57,49,65,165,128,+79,117,175,165,106,66,251,201,199,160,23,96,42,225,146,5,164,82,225,127,+106,97,128,140,152,97,107,201,17,226,68,10,226,51,6,247,198,0,64,206,+240,104,4,236,223,9,236,227,8,224,122,0,140,200,161,220,168,17,229,69,+3,139,54,195,24,129,232,65,30,154,84,64,55,192,177,129,68,64,15,105,+195,225,129,0,129,114,65,138,0,56,170,117,128,121,214,141,2,80,32,35,+97,187,0,85,132,144,140,80,196,199,194,46,197,164,96,152,64,4,133,1,+195,221,181,56,71,115,71,205,230,172,4,129,219,228,215,0,235,92,9,194,+186,194,203,192,13,64,89,160,31,64,245,152,254,130,83,1,57,48,66,175,+68,32,64,11,65,10,165,145,224,167,0,164,116,193,56,139,216,96,45,0,+48,230,166,2,96,205,129,84,65,162,192,17,88,91,70,49,195,30,109,225,+145,117,3,95,54,53,57,100,200,0,50,67,182,0,95,113,129,196,176,1,+50,48,65,95,0,35,87,247,128,0,160,148,64,6,64,3,162,229,226,158,+6,133,3,66,215,231,228,6,233,13,0,66,239,154,117,185,235,0,58,136,+187,97,167,159,49,167,15,225,155,2,64,83,200,152,161,74,193,14,192,7,+237,152,5,96,58,64,10,236,231,0,226,131,0,65,161,64,34,102,160,128,+236,246,101,2,6,100,121,110,97,109,105,99,132,38,64,101,74,24,1,57,+48,66,238,130,165,224,84,43,6,119,114,97,112,112,101,114,224,84,7,65,+90,192,84,194,62,203,34,224,69,0,3,95,52,48,52,78,212,0,54,112,+122,228,203,2,2,116,97,116,192,167,96,0,129,40,0,54,122,185,3,95,+49,51,50,193,194,101,100,129,81,227,127,0,163,9,2,67,32,95,80,200,+128,40,224,104,15,1,46,104,192,100,227,24,0,66,177,1,64,67,69,2,+201,62,128,208,194,199,128,44,225,151,3,198,13,64,25,227,28,1,128,15,+224,34,4,128,52,128,38,227,178,1,238,131,1,168,145,129,36,129,33,64,+198,64,187,3,64,79,32,35,70,106,233,210,0,161,166,99,233,224,71,0,+226,34,1,128,73,162,39,160,91,164,0,227,2,2,96,82,128,209,225,162,+4,162,172,228,55,7,129,8,137,192,225,32,1,193,229,161,126,163,207,224,+11,1,192,80,224,214,12,225,138,1,3,118,97,108,117,90,55,224,143,2,+224,119,5,99,133,134,156,1,95,55,90,178,193,11,224,155,7,224,17,4,+128,156,226,51,4,226,7,0,224,178,0,226,65,1,163,123,74,213,160,215,+165,42,131,203,145,52,0,75,191,178,64,146,159,194,64,12,0,54,192,12,+160,28,136,44,255,207,0,64,237,104,60,64,1,107,101,64,20,134,145,2,+75,32,65,128,35,220,167,64,1,238,41,2,224,10,11,243,213,1,64,56,+198,35,64,1,70,39,132,153,224,39,3,64,37,134,50,67,25,0,52,235,+175,0,225,129,1,14,98,97,100,32,102,111,114,101,105,103,110,32,105,109,+112,190,255,0,58,128,255,166,251,65,13,0,52,98,248,133,181,128,4,130,+53,226,98,1,236,229,2,128,132,64,239,192,189,224,15,1,224,48,8,135,+233,192,32,129,153,108,30,251,222,4,1,56,57,232,47,3,225,179,0,69,+235,1,51,54,92,60,167,102,64,71,135,99,233,49,13,11,73,79,46,112,+101,114,102,111,114,109,73,79,228,6,0,135,167,136,78,234,139,4,66,48,+100,31,0,51,144,43,168,214,2,48,56,32,134,71,230,44,6,241,14,35,+65,98,254,54,3,224,162,1,253,86,2,128,163,64,42,216,33,124,210,126,+188,64,21,130,126,3,95,53,52,51,224,63,2,6,98,117,105,108,116,105,+110,64,57,65,92,64,3,64,43,130,154,66,241,64,64,0,50,159,163,132,+220,153,106,129,232,105,253,176,130,97,246,128,127,130,200,179,183,130,90,96,+43,249,168,10,174,158,104,180,165,97,224,32,15,212,8,234,76,1,224,41,+4,144,116,128,41,226,82,4,168,22,167,230,3,49,56,55,53,224,255,2,+127,90,96,190,224,22,4,255,124,7,171,52,224,91,0,75,103,100,164,247,+54,7,97,44,4,10,65,32,73,32,64,11,190,222,150,204,69,47,237,62,+1,240,123,9,230,174,4,224,25,4,100,93,224,25,12,105,238,103,139,165,+208,254,146,4,128,247,2,49,55,54,105,105,254,158,2,138,81,98,194,254,+180,4,96,93,227,35,4,98,236,186,171,226,236,2,130,235,243,133,28,3,+79,32,35,49,86,219,101,140,235,207,9,227,4,24,128,0,229,238,1,194,+24,96,249,66,78,160,24,210,132,0,54,106,74,242,132,1,224,7,3,64,+0,228,83,8,97,93,162,91,177,221,225,103,9,64,35,224,131,9,128,130,+195,13,110,200,96,61,3,95,49,55,56,97,93,1,48,53,76,164,1,48,+53,68,97,200,27,160,51,2,95,49,55,64,49,161,87,224,159,1,192,237,+224,131,8,198,222,224,131,5,96,21,160,79,0,51,69,3,239,14,14,3,+95,53,55,53,246,20,5,224,42,14,224,145,10,131,180,82,191,99,240,224,+171,3,97,118,172,77,224,175,6,97,160,224,201,12,244,105,0,131,238,224,+25,2,107,111,161,139,64,111,0,52,242,195,0,244,114,5,129,248,169,216,+105,204,233,98,0,195,95,227,87,5,224,32,19,126,45,64,23,225,224,9,+192,25,184,129,238,64,2,162,156,224,50,8,96,109,129,143,237,179,0,111,+55,1,95,51,233,75,0,227,176,9,64,213,72,142,1,56,56,254,39,5,+224,86,0,104,106,128,33,192,69,160,96,129,13,180,92,160,93,226,195,41,+224,143,0,139,218,231,168,25,129,118,128,43,229,182,0,231,168,7,96,41,+244,50,2,224,52,22,187,13,224,52,6,224,10,0,224,52,13,160,245,224,+41,4,192,229,139,57,64,42,232,32,4,226,248,5,16,68,97,116,97,46,+76,105,115,116,95,84,121,112,101,46,43,43,234,99,0,128,83,226,240,0,+227,219,4,224,0,6,196,126,163,95,228,118,9,130,68,229,196,0,224,146,+21,22,67,111,110,116,114,111,108,46,69,114,114,111,114,46,117,110,100,101,+102,105,110,101,100,160,152,64,62,224,64,36,0,101,64,5,230,197,1,232,+251,2,164,180,65,87,78,188,247,221,2,142,187,224,81,15,0,95,96,82,+1,76,111,237,130,1,224,79,54,224,227,0,224,83,3,128,176,3,56,53,+50,32,111,200,100,9,2,95,49,48,72,201,117,253,132,11,66,186,161,124,+75,66,1,95,56,102,253,72,185,0,53,94,195,64,24,0,53,144,2,182,+79,134,132,0,55,120,51,224,144,1,1,58,32,192,119,239,188,4,71,198,+139,21,103,75,97,223,193,232,229,71,12,98,78,4,82,97,116,105,111,130,+79,2,95,109,107,96,13,2,110,97,108,225,191,0,163,198,94,12,167,192,+224,17,2,65,206,0,58,132,9,64,117,136,60,176,185,86,136,0,53,102,+54,1,54,52,64,9,134,235,0,49,224,10,1,1,56,54,71,112,0,48,+110,14,128,5,0,50,238,19,2,214,203,96,66,167,101,7,50,49,52,55,+52,56,51,54,232,2,0,224,219,23,11,73,110,116,101,103,101,114,46,95,+105,110,116,67,54,1,84,111,160,17,224,222,2,102,218,64,8,70,74,0,+54,244,65,8,64,168,235,6,1,224,111,29,161,77,1,105,110,224,112,12,+229,107,6,232,73,0,64,0,65,76,139,61,169,137,133,19,2,95,52,57,+225,9,5,99,170,196,223,104,203,97,101,64,70,229,0,0,0,85,225,122,+3,64,0,0,89,229,108,1,214,236,0,56,225,149,7,224,92,0,196,39,+254,105,0,96,177,192,170,0,85,77,228,97,164,110,156,179,109,64,33,3,+50,32,95,54,73,67,97,56,130,245,200,79,64,220,184,182,155,198,192,107,+128,150,101,9,106,122,231,106,3,247,149,2,224,226,7,224,255,0,224,229,+2,101,85,106,22,96,67,125,7,128,26,65,69,224,12,0,224,156,0,2,+95,50,54,72,107,65,7,225,91,4,96,172,0,54,172,199,64,21,4,51,+50,55,54,56,108,113,64,56,131,99,128,174,244,91,0,242,219,0,210,100,+96,203,75,175,67,39,97,78,106,227,157,145,1,49,54,114,87,64,57,80,+5,131,187,245,77,0,76,131,233,227,0,166,31,64,97,161,37,187,193,187,+76,64,98,0,52,128,60,122,77,128,17,134,162,64,176,140,228,67,158,155,+134,96,4,151,204,108,115,199,78,190,25,189,205,160,176,0,66,128,109,96,+25,224,51,1,224,227,0,129,132,230,111,0,200,244,225,0,0,232,201,2,+243,235,0,128,12,103,95,224,223,8,160,54,65,58,145,181,224,16,1,64,+94,66,124,96,142,131,27,160,93,128,156,192,200,3,95,51,55,48,239,97,+1,0,55,108,254,224,164,11,224,17,3,214,163,242,1,1,231,196,2,130,+252,0,55,65,147,110,92,0,48,227,247,2,7,92,34,92,34,44,48,58,+48,99,224,164,189,96,219,224,41,21,131,62,96,0,4,95,49,55,55,52,+234,221,3,0,109,228,44,0,99,115,79,26,0,56,145,4,128,17,3,57,+51,32,83,81,243,225,58,7,188,190,160,239,160,44,1,55,53,154,232,0,+66,82,164,65,61,221,36,67,2,161,33,224,126,5,0,112,230,212,2,2,+95,55,54,107,96,0,56,164,19,66,77,0,51,239,50,1,130,253,235,50,+11,136,250,232,249,0,131,115,254,35,2,64,215,155,97,224,39,4,156,184,+191,243,226,224,1,129,137,0,80,164,132,74,61,247,237,11,96,157,142,211,+200,188,160,105,64,79,65,2,241,178,5,250,169,0,246,30,0,164,124,182,+30,227,224,0,241,140,7,197,27,130,62,73,180,128,58,97,8,163,240,206,+168,135,199,241,128,7,96,14,208,158,132,251,0,80,64,57,140,206,78,102,+224,62,0,227,207,6,150,62,168,70,0,50,101,191,164,79,225,198,6,219,+65,129,50,102,210,0,51,91,112,70,182,231,101,1,65,50,207,250,64,66,+102,145,65,127,64,24,136,76,76,33,66,52,120,11,97,254,96,142,66,75,+0,58,128,150,166,174,236,225,0,194,16,193,69,96,25,129,34,100,55,194,+184,96,45,201,137,131,120,128,5,225,92,1,161,129,228,24,1,121,42,66,+229,134,212,64,21,96,225,138,189,193,76,64,160,64,175,137,96,193,5,0,+55,144,70,104,182,198,175,231,121,2,64,10,69,239,3,54,32,95,52,136,+225,225,82,6,0,118,97,82,64,41,134,198,229,49,0,164,217,226,49,0,+162,24,130,92,96,2,160,196,246,235,0,165,74,192,61,228,233,0,128,15,+230,28,0,131,72,160,2,67,9,160,48,101,2,128,21,70,158,157,5,192,+35,128,30,134,13,175,201,221,7,1,80,32,97,18,222,222,64,59,64,32,+194,15,225,184,0,229,86,2,229,170,1,128,13,244,232,14,224,190,1,103,+130,192,58,129,196,97,104,0,53,233,45,7,12,66,111,111,108,46,111,116,+104,101,114,119,105,115,247,46,2,160,8,225,74,5,225,26,3,129,178,248,+126,0,192,24,1,53,55,164,81,64,5,0,75,98,206,68,35,170,45,97,+183,0,54,228,187,1,0,90,98,55,140,150,68,69,1,95,56,74,182,128,+38,135,225,253,24,1,169,52,65,6,225,32,11,228,254,4,131,176,224,40,+26,0,50,165,167,232,72,0,224,231,2,224,40,5,162,175,133,83,176,191,+166,235,243,68,2,132,238,161,202,162,54,239,151,4,128,70,165,184,64,252,+1,54,50,170,25,224,20,5,129,69,241,47,6,224,111,5,163,108,224,52,+0,0,53,161,147,224,120,12,161,17,224,158,3,225,29,25,160,153,224,39,+24,161,220,227,86,2,241,56,12,133,60,226,189,10,192,24,230,20,1,232,+209,1,226,230,10,128,243,100,183,102,18,76,48,141,203,96,6,66,115,97,+214,64,8,200,73,192,96,224,82,8,228,155,0,128,116,129,221,164,51,211,+4,124,209,239,179,0,0,56,66,226,242,96,5,133,254,186,2,224,104,14,+161,76,224,229,3,163,167,232,229,2,224,154,15,224,41,0,226,125,0,102,+240,108,147,126,25,96,129,145,246,224,196,0,128,174,84,83,128,68,148,89,+64,11,138,219,230,80,0,110,248,64,6,242,113,0,160,0,128,72,163,22,+96,120,227,101,4,161,141,226,108,9,225,166,1,193,235,64,115,129,71,193,+37,226,138,4,97,171,198,205,216,15,97,21,3,95,49,55,54,65,99,164,+197,129,151,2,49,55,54,65,112,229,110,11,64,94,197,114,3,95,56,51,+54,103,69,65,177,122,112,233,172,2,96,59,72,152,195,25,137,192,164,6,+0,39,203,127,224,52,0,226,248,1,151,196,224,40,0,129,38,66,23,73,+19,168,233,1,95,52,159,176,128,106,129,125,0,56,71,47,0,95,71,255,+1,49,56,184,28,137,121,173,100,195,191,230,49,0,230,252,8,0,120,230,+252,0,137,98,224,158,3,3,95,49,56,54,250,101,1,1,56,55,64,96,+64,41,136,89,104,64,192,176,230,249,0,136,242,185,74,0,75,164,115,226,+142,1,168,106,74,182,64,205,0,85,124,104,124,172,160,0,160,189,169,153,+0,56,77,156,98,94,224,46,4,235,102,2,96,164,0,57,120,8,140,224,+224,107,1,230,107,13,249,7,0,224,5,3,128,74,228,149,1,224,55,0,+228,164,1,96,0,128,66,224,1,1,229,208,5,165,249,96,0,226,24,9,+224,140,5,224,77,9,224,75,5,228,101,2,227,14,1,255,135,0,224,5,+3,233,70,4,230,59,6,96,23,67,231,104,100,224,116,4,192,83,230,72,+7,224,34,2,135,242,232,236,0,161,225,224,66,2,96,111,128,17,229,209,+12,232,97,4,229,165,10,200,99,225,9,2,128,115,224,165,3,139,198,1,+95,52,92,84,2,95,49,48,66,145,224,34,2,175,53,225,112,4,161,23,+64,172,201,81,131,10,235,169,1,96,0,99,69,98,44,224,47,5,231,188,+7,225,188,3,227,172,0,193,114,225,208,0,192,77,64,80,0,80,99,126,+80,165,100,130,214,34,128,46,163,150,131,226,0,54,76,123,0,95,234,208,+0,160,9,250,193,11,0,54,250,193,16,96,140,167,180,196,78,177,189,160,+100,71,252,209,220,128,136,128,189,226,160,2,64,27,129,82,229,145,10,227,+85,2,232,54,24,224,129,12,104,73,224,129,3,225,62,1,229,230,9,96,+27,102,209,64,115,226,127,0,224,83,5,229,254,0,160,85,224,92,0,100,+147,242,189,0,224,109,2,227,7,2,234,68,7,101,237,251,253,12,165,57,+229,64,0,68,255,141,64,236,38,0,128,154,102,47,235,153,2,162,90,224,+189,18,225,18,2,224,188,17,0,58,100,222,128,111,247,220,0,64,6,148,+113,64,5,0,49,229,207,2,1,115,101,206,32,64,56,140,249,224,168,3,+225,194,1,111,67,230,56,4,227,116,0,79,63,224,13,11,131,221,227,247,+0,128,197,224,66,2,101,180,64,187,72,3,160,0,192,69,160,123,0,39,+148,34,241,64,5,29,115,114,99,47,77,105,99,114,111,72,115,47,68,101,+115,117,103,97,114,46,104,115,92,34,44,52,49,51,58,49,145,89,224,77,+5,224,153,3,227,174,4,224,2,3,224,29,2,224,2,9,132,88,224,86,+12,128,32,68,21,164,140,224,67,17,198,57,224,65,6,193,42,224,95,13,+224,99,1,230,56,11,224,44,8,227,36,8,224,46,21,224,179,1,224,25,+7,225,46,0,228,208,4,130,160,224,202,1,224,51,4,165,222,224,48,3,+96,39,199,70,164,7,192,53,104,186,160,11,224,23,3,105,96,104,171,194,+226,128,71,228,16,2,128,62,192,5,64,14,165,197,192,56,128,11,226,109,+2,72,223,99,15,224,65,0,192,87,96,69,165,97,128,164,128,45,201,13,+195,128,149,141,65,87,0,66,234,86,3,64,121,235,79,1,244,209,1,229,+222,1,225,143,14,128,48,171,86,210,150,226,140,2,128,10,117,228,224,141,+2,128,0,202,173,227,251,2,161,81,1,95,54,93,182,96,87,224,85,3,+64,16,1,95,49,90,86,224,109,3,165,55,160,163,224,162,5,192,45,224,+38,4,147,43,182,195,79,54,1,49,56,140,128,241,197,4,224,0,2,102,+192,65,57,64,41,165,62,193,120,160,18,79,131,118,143,147,167,224,65,5,+129,36,224,1,1,226,222,8,224,45,20,226,221,15,226,219,0,226,169,9,+224,102,5,128,58,194,189,235,132,0,196,207,226,171,27,226,168,7,130,107,+128,47,226,129,2,129,37,169,62,101,17,128,133,130,115,128,121,226,116,9,+224,176,1,162,119,192,110,226,122,12,233,64,8,129,31,224,240,0,233,176,+2,64,56,183,241,173,165,145,192,247,35,1,64,0,194,134,225,220,0,226,+142,1,226,138,0,1,95,54,180,227,224,134,4,162,93,101,254,1,49,49,+208,129,160,0,225,149,9,229,178,3,224,191,0,228,63,50,128,73,235,184,+6,0,95,71,32,230,223,1,166,40,235,149,3,226,35,7,2,95,52,50,+79,251,224,51,1,226,41,8,160,90,224,93,5,132,166,104,57,1,56,52,+228,146,0,224,245,2,226,124,0,192,107,128,212,224,159,6,225,181,0,96,+44,97,98,96,15,163,117,158,58,246,113,4,250,85,16,101,61,99,127,164,+87,226,17,4,128,10,66,14,170,97,64,184,0,53,227,121,2,128,162,232,+32,5,64,17,152,140,0,56,183,160,228,57,1,0,56,120,143,132,51,0,+52,85,101,224,30,3,97,29,73,24,128,8,81,0,132,105,0,53,98,123,+164,218,250,193,2,105,73,96,183,96,17,192,94,160,0,96,85,228,132,6,+226,166,0,224,184,13,122,14,0,56,111,225,226,201,8,253,144,2,231,140,+0,226,221,4,165,60,98,211,3,85,32,75,50,229,118,0,224,39,6,131,+5,192,38,224,37,2,160,152,224,229,4,216,26,96,229,0,90,110,191,121,+253,230,198,2,224,128,1,192,198,0,85,255,73,3,224,0,0,73,233,189,+128,130,154,128,69,226,180,2,164,75,162,191,230,208,0,227,46,2,160,96,+233,165,0,226,121,1,128,117,239,200,0,128,1,234,33,13,224,61,0,205,+117,227,142,3,173,53,129,188,248,59,3,160,101,182,80,216,1,152,50,251,+182,0,192,128,65,197,0,53,113,128,65,204,250,18,2,193,195,65,218,0,+48,210,193,2,49,56,53,162,218,98,145,64,60,160,23,0,54,153,11,64,+75,176,244,160,68,64,141,207,80,224,233,9,229,94,1,224,27,29,224,253,+0,64,89,224,17,4,228,79,1,165,148,224,52,0,224,10,2,195,63,157,+36,182,13,230,89,0,192,116,192,114,227,120,0,224,117,0,253,240,1,228,+246,1,104,126,96,29,114,229,96,90,67,11,0,67,90,119,121,92,152,68,+130,104,224,186,1,128,68,97,100,229,52,5,198,167,224,235,4,128,2,128,+24,224,243,10,224,28,0,224,69,1,133,251,225,92,15,231,225,0,229,125,+0,224,132,1,231,187,1,142,196,98,189,65,246,152,5,194,66,194,112,207,+126,192,248,192,0,130,112,130,103,245,119,0,224,24,7,64,0,1,95,57,+243,65,3,236,190,5,6,69,110,99,111,100,101,68,89,7,108,193,6,54,+53,58,49,48,58,32,211,100,66,118,243,100,1,96,133,128,11,128,157,192,+5,64,164,0,51,170,218,128,217,0,83,252,166,2,96,15,97,0,224,19,+0,225,81,0,161,123,228,71,0,134,19,160,88,66,247,124,49,134,61,192,+7,136,69,163,44,133,163,1,54,49,129,215,228,175,2,224,14,5,2,95,+54,53,163,100,160,0,68,192,0,80,101,132,194,18,129,144,161,166,226,28,+0,202,247,225,2,1,98,146,64,115,242,242,2,128,0,113,3,244,171,2,+0,110,142,9,224,22,7,1,116,116,225,94,0,0,51,188,181,97,86,66,+170,84,164,96,179,81,81,181,224,2,95,53,57,66,239,137,4,108,69,0,+53,226,39,0,2,95,55,48,192,212,225,246,1,225,240,35,0,49,65,241,+0,49,225,241,2,254,185,0,64,109,239,138,1,143,7,132,235,194,188,133,+34,194,236,224,7,1,193,79,160,59,80,169,223,115,98,9,112,125,0,79,+198,27,230,64,1,160,88,193,114,224,64,0,149,40,226,71,2,243,179,2,+229,219,15,229,221,0,69,110,229,6,19,228,248,4,228,55,1,226,221,1,+143,23,128,44,233,143,0,131,252,228,170,6,227,229,4,131,220,192,33,197,+170,224,28,5,160,104,96,97,131,194,64,47,237,106,2,192,94,226,133,0,+128,23,240,145,8,3,108,105,98,47,65,211,4,47,76,105,115,116,129,216,+4,53,51,54,58,53,240,138,2,224,0,5,225,156,21,101,107,225,162,0,+229,89,3,208,39,128,215,240,89,0,224,215,26,225,38,1,160,204,64,44,+152,184,226,10,0,224,39,12,64,15,224,142,3,160,0,66,171,151,216,64,+43,66,32,227,179,0,224,2,1,225,70,2,128,1,105,60,166,0,224,23,+3,192,189,224,26,0,235,123,5,229,194,2,224,52,0,228,186,1,224,74,+7,226,62,4,198,39,230,156,1,160,52,224,41,1,168,81,96,82,224,23,+0,224,17,6,96,8,128,43,134,40,129,180,109,18,0,48,181,182,244,143,+0,224,93,2,96,36,202,214,224,107,3,224,8,0,2,95,49,55,69,230,+162,122,0,52,106,137,243,170,11,1,61,61,162,77,96,38,0,48,101,152,+0,56,123,77,96,0,131,99,174,239,225,11,1,167,6,224,16,16,64,117,+100,108,0,49,164,227,1,49,49,140,100,251,209,4,251,49,1,224,1,1,+132,146,245,23,6,225,212,8,160,110,224,22,7,239,151,0,224,45,28,224,+22,0,193,193,228,172,1,224,14,0,224,51,3,179,74,193,119,175,10,110,+21,225,107,19,2,79,32,35,70,239,236,25,0,225,102,11,64,94,226,65,+1,226,125,3,226,87,4,99,87,160,50,192,0,160,142,199,170,232,78,0,+67,73,214,34,1,80,32,103,93,0,85,106,109,64,117,5,10,65,32,35,+53,32,64,12,149,156,70,171,106,192,209,48,224,9,6,137,125,64,72,3,+90,32,90,32,134,195,232,146,53,5,49,54,57,58,49,53,230,161,1,71,+245,5,10,65,32,95,53,49,64,242,158,7,99,30,177,198,129,7,167,83,+192,20,233,92,6,237,20,2,0,75,78,158,236,249,0,128,65,195,40,1,+85,32,224,29,2,224,71,10,224,59,4,161,8,96,129,104,91,224,28,0,+224,109,2,224,36,1,233,238,7,65,144,0,51,110,5,110,101,64,232,0,+54,201,124,226,115,2,67,10,64,27,140,8,229,198,10,229,153,0,134,204,+2,95,49,51,157,222,96,210,229,89,5,230,104,1,64,81,222,115,96,81,+129,89,197,17,237,167,3,197,12,249,76,4,128,23,160,170,251,209,3,0,+85,110,35,130,171,160,128,238,38,19,224,37,10,255,73,2,195,134,105,242,+1,53,50,225,234,1,105,144,1,48,57,64,231,65,6,116,15,96,211,137,+95,96,242,2,51,52,55,226,114,17,1,120,112,183,193,5,49,49,52,52,+58,50,203,1,161,44,0,49,224,57,3,9,105,109,112,111,115,115,105,98,+108,101,192,36,177,93,112,150,160,49,90,241,1,55,48,161,241,1,95,57,+81,105,254,7,2,224,85,0,2,79,32,35,91,53,201,7,96,55,96,40,+230,231,0,64,196,137,145,0,80,99,132,134,241,246,2,1,238,75,4,97,+118,167,203,225,140,13,79,229,169,196,226,16,0,225,105,0,96,23,176,48,+192,36,224,37,9,97,143,147,79,160,197,241,139,0,231,162,5,229,155,4,+64,187,132,99,65,173,163,5,5,66,32,95,55,53,50,225,154,31,4,51,+49,50,58,52,161,153,224,45,1,7,99,111,110,65,114,105,116,121,166,155,+0,67,65,119,0,52,227,233,5,128,178,129,84,0,58,146,239,154,158,242,+205,0,64,6,64,36,161,201,91,86,209,140,128,229,1,56,52,64,78,2,+95,52,57,66,90,160,248,224,35,1,1,95,50,102,174,96,92,250,194,7,+130,255,195,146,163,128,213,59,96,23,128,1,232,122,1,96,13,245,65,16,+163,52,224,60,5,231,117,0,230,113,6,224,79,2,192,2,224,19,3,160,+25,247,224,7,96,20,75,253,245,112,11,64,227,133,128,101,116,136,231,130,+103,228,209,3,207,149,80,7,64,8,132,181,64,74,229,186,5,229,192,4,+163,206,229,191,4,229,38,4,229,182,3,224,10,2,229,132,1,224,228,1,+238,168,6,242,224,4,192,249,229,13,0,0,51,147,10,248,78,3,224,14,+7,224,111,14,224,101,5,78,80,229,243,9,224,111,20,194,168,224,110,7,+224,61,5,67,52,224,90,11,224,10,2,128,64,1,57,56,192,189,134,75,+96,78,65,121,210,56,226,246,3,228,64,1,111,173,64,70,96,159,227,23,+4,97,198,128,193,246,1,6,149,61,213,218,130,137,244,200,5,243,32,4,+105,196,64,138,134,104,227,125,8,227,121,6,227,118,0,1,95,51,67,84,+149,248,224,29,0,210,59,64,79,197,228,2,95,49,56,154,121,1,95,56,+65,138,99,120,64,31,133,63,128,29,0,83,66,237,192,136,133,76,0,95,+96,85,64,253,128,192,96,68,193,179,96,157,0,51,131,245,192,9,228,20,+0,224,40,13,0,90,224,40,2,2,95,51,54,86,61,96,93,96,114,133,+3,0,95,65,182,0,56,81,10,224,71,0,150,168,96,23,128,224,0,49,+98,14,96,56,1,95,49,95,62,160,11,0,50,97,55,192,80,64,7,3,+10,65,32,73,70,28,64,70,64,92,0,51,96,143,225,169,3,0,95,88,+35,225,152,3,0,95,128,80,165,153,64,7,129,65,102,182,180,114,64,194,+64,28,0,54,224,97,2,130,69,102,237,106,68,102,179,65,255,6,67,32,+95,56,51,49,32,229,152,2,29,67,111,110,116,114,111,108,46,69,120,99,+101,112,116,105,111,110,46,73,110,116,101,114,110,97,108,46,112,97,116,64,+9,8,77,97,116,99,104,70,97,105,108,199,107,170,239,64,8,0,53,66,+212,231,71,4,96,139,130,58,207,217,243,28,2,154,44,251,188,0,134,251,+78,20,130,150,145,233,228,247,1,226,174,1,208,106,67,4,244,217,2,224,+73,2,133,81,5,32,95,49,54,48,53,84,110,103,74,164,105,148,146,96,+123,96,181,1,57,52,224,33,1,231,8,0,97,76,0,50,236,165,0,64,+199,194,178,0,89,132,238,164,178,96,9,201,101,228,88,0,224,206,0,239,+126,2,229,251,0,231,250,4,0,49,130,116,64,29,240,252,0,233,182,15,+137,86,133,193,224,33,13,139,173,129,25,232,75,23,233,222,12,192,64,89,+213,0,55,211,123,204,31,224,81,5,101,3,234,8,1,248,57,5,203,0,+192,170,224,253,15,206,3,231,106,4,225,79,3,224,112,2,131,6,64,23,+71,59,216,123,192,19,224,203,8,192,91,192,48,232,192,2,96,216,128,50,+97,204,0,80,96,185,130,27,3,95,54,49,51,192,200,250,216,0,160,72,+243,242,0,160,189,71,101,225,84,5,234,243,4,225,208,23,128,51,226,34,+1,224,32,8,128,123,240,127,1,224,32,8,131,101,225,60,1,224,252,0,+192,24,247,189,1,128,7,225,37,8,193,84,225,240,4,176,19,166,65,225,+250,8,166,59,224,50,3,224,87,8,234,152,12,226,23,3,128,67,226,17,+9,128,42,226,60,0,224,39,15,170,42,225,249,12,224,27,2,64,199,228,+122,1,96,6,171,244,226,10,5,226,83,9,160,225,226,150,1,160,55,237,+27,0,3,85,32,64,82,224,220,4,236,176,32,2,52,52,57,247,177,1,+160,88,224,53,1,6,112,97,116,86,97,114,115,128,29,77,34,132,33,105,+110,64,255,69,201,0,50,68,54,2,95,49,53,80,152,2,95,49,48,91,+154,206,25,199,66,76,164,205,71,6,49,57,51,32,80,32,85,143,222,1,+49,55,68,241,160,121,0,55,64,93,247,87,13,246,31,7,244,226,2,224,+239,0,1,49,56,73,22,91,13,128,115,211,220,246,122,3,239,62,1,161,+196,195,69,250,98,2,171,114,228,3,3,219,206,228,238,3,128,8,104,251,+2,51,55,48,211,79,64,197,98,239,128,208,160,116,224,221,0,137,240,69,+245,164,157,224,144,5,224,37,0,164,228,172,4,171,219,230,74,0,226,4,+0,161,4,1,95,51,97,116,64,125,226,1,1,3,95,49,56,50,107,121,+158,42,0,85,174,60,64,22,231,15,1,136,78,131,242,165,32,160,234,130,+230,64,45,99,5,224,28,0,247,73,0,64,1,199,22,224,16,0,236,133,+0,192,16,64,1,211,43,224,17,1,243,212,20,250,222,2,96,116,236,88,+3,128,21,103,47,224,163,4,167,82,192,52,231,12,0,220,19,224,105,1,+96,14,224,30,2,224,2,1,224,165,6,247,254,2,3,95,50,50,56,249,+253,3,224,54,2,96,238,192,50,230,95,0,224,138,2,192,2,160,24,131,+55,128,55,224,52,1,224,55,2,226,116,0,103,187,128,5,128,154,140,207,+105,40,181,175,196,160,224,100,1,192,198,224,71,8,129,19,97,37,64,214,+245,246,4,160,70,84,79,161,86,162,197,225,255,0,227,148,13,161,217,64,+8,195,159,161,201,225,186,6,191,10,192,0,187,203,224,198,0,192,43,245,+184,1,246,150,6,1,95,49,75,215,64,11,73,34,0,32,197,83,96,178,+102,51,134,57,155,241,192,53,149,252,246,208,1,64,0,175,75,160,222,226,+220,0,64,183,64,12,3,56,32,95,53,80,114,1,49,54,128,29,224,116,+4,134,156,128,62,0,54,66,11,225,10,1,163,189,196,156,224,20,2,245,+248,0,99,110,67,120,110,190,1,55,55,66,193,64,17,239,238,6,243,134,+3,193,205,166,238,228,247,6,64,60,139,118,77,124,2,56,49,50,97,174,+0,52,128,152,64,204,141,24,0,50,101,176,64,44,0,54,235,122,1,0,+56,73,47,64,52,96,220,2,56,50,52,128,139,244,18,1,225,237,9,225,+207,4,115,48,128,0,64,62,0,51,128,62,235,91,0,224,203,0,169,139,+231,103,0,255,158,9,164,106,229,104,0,226,48,5,229,76,0,160,171,64,+101,0,51,204,106,68,243,146,70,65,244,76,236,103,18,242,67,3,226,191,+0,101,221,96,181,229,33,0,64,75,173,216,64,73,0,95,69,171,64,72,+98,58,3,49,56,49,48,128,110,179,47,97,53,0,49,102,224,1,56,49,+98,28,64,70,64,32,165,65,193,131,224,169,1,64,38,142,54,1,49,55,+76,251,64,22,64,15,77,74,0,57,66,250,205,39,73,185,64,31,209,21,+132,223,128,97,129,118,70,47,138,22,232,140,3,228,123,5,64,72,135,156,+192,33,236,165,3,160,27,230,211,3,192,20,129,143,134,255,0,80,130,240,+255,32,0,106,84,224,33,12,99,55,224,33,0,224,34,12,99,165,224,34,+21,101,81,224,34,1,64,32,202,34,162,27,128,204,100,44,171,250,0,95,+79,175,100,31,97,216,67,154,230,243,0,65,70,0,54,227,81,1,253,236,+0,64,78,232,66,3,253,218,6,224,30,7,241,149,6,203,14,64,47,134,+222,128,13,192,46,96,16,225,90,2,64,56,252,210,2,224,56,3,224,19,+3,224,62,2,161,29,243,176,0,192,2,160,108,192,28,128,254,0,57,230,+138,1,130,253,233,10,0,128,41,227,164,0,226,18,1,128,0,253,245,8,+234,17,3,5,73,110,116,77,97,112,138,19,3,55,51,58,49,253,249,3,+65,86,132,28,131,43,0,54,115,221,64,94,130,194,162,192,132,0,0,85,+128,193,192,33,65,155,160,145,64,35,195,190,106,238,99,175,228,47,0,255,+165,8,98,2,227,181,5,160,40,235,136,0,172,175,124,219,99,190,204,66,+225,225,2,193,80,246,232,0,0,80,147,206,64,40,231,39,2,240,10,3,+64,73,0,49,64,37,137,51,192,7,167,130,192,60,97,112,192,92,140,13,+64,56,137,93,228,187,0,128,12,1,56,49,67,49,65,1,242,77,0,0,+48,113,172,164,104,64,30,160,22,123,45,64,22,235,49,0,147,227,128,93,+0,56,242,126,0,64,104,160,50,84,7,96,70,64,30,96,54,165,109,194,+103,136,245,224,237,3,236,249,2,225,24,0,196,49,213,208,0,56,100,162,+225,105,0,160,47,131,200,193,118,254,76,4,96,25,64,237,0,48,181,243,+194,145,192,73,230,215,0,226,226,5,233,47,10,160,24,225,224,0,169,56,+192,86,192,1,160,134,224,133,1,100,23,231,182,10,224,75,59,232,76,2,+224,75,23,167,180,224,75,17,232,195,0,129,36,128,2,229,178,0,129,89,+1,56,48,169,12,224,36,1,236,144,1,224,32,7,224,124,0,228,53,4,+96,41,224,40,6,224,41,8,224,11,0,160,48,224,47,7,98,204,155,28,+1,55,57,140,105,66,107,168,126,161,174,238,19,0,225,139,23,224,40,26,+129,104,240,225,0,225,69,23,128,175,131,59,96,12,224,6,1,194,200,224,+30,7,224,31,1,111,170,224,34,4,224,35,14,192,37,224,30,8,224,38,+1,136,113,66,235,225,49,6,65,46,0,54,97,46,1,75,50,67,222,64,+47,163,222,235,50,0,224,10,6,225,144,1,0,32,201,16,64,56,221,101,+234,115,2,64,28,64,26,133,91,117,104,68,48,219,243,68,201,136,195,249,+28,0,64,149,97,67,152,15,73,59,65,239,64,44,187,100,224,44,2,119,+132,64,46,87,73,240,82,17,230,64,3,4,56,52,58,49,54,251,105,7,+0,68,95,145,160,37,0,33,134,94,121,213,101,39,162,72,133,244,171,214,+194,240,192,179,228,104,0,160,31,204,176,228,79,9,228,74,11,231,87,7,+129,101,228,63,33,224,63,0,163,163,228,45,32,128,56,166,135,228,20,28,+225,113,1,224,11,5,224,12,17,227,160,7,65,85,134,10,96,37,98,218,+65,57,73,42,64,27,202,107,237,116,3,192,27,0,54,96,27,0,90,73,+137,64,14,194,169,0,90,105,43,64,17,130,130,164,94,240,55,0,137,86,+193,179,101,209,128,25,187,223,64,134,64,162,105,226,67,39,2,55,54,50,+231,98,1,233,135,0,200,97,136,86,134,47,192,99,109,56,227,31,1,64,+81,131,119,225,98,2,97,20,65,122,109,255,130,43,100,178,237,218,2,129,+212,147,60,199,204,64,54,0,50,128,223,131,71,136,40,235,171,5,96,11,+104,182,64,39,131,99,225,7,0,198,235,0,51,103,247,129,235,128,205,1,+49,55,121,41,128,223,160,143,3,67,32,95,54,114,114,160,135,237,118,3,+128,82,136,143,90,141,83,62,64,15,159,241,0,49,76,115,96,180,0,95,+120,223,0,51,128,92,96,0,1,95,50,97,235,238,191,11,162,142,64,184,+168,107,128,155,0,52,121,216,0,55,123,14,64,7,0,57,129,4,186,104,+121,81,64,5,0,49,64,122,1,55,53,160,121,0,58,128,40,224,33,10,+0,57,224,33,2,238,220,2,233,143,5,98,16,96,210,0,51,133,80,64,+6,86,224,240,208,7,227,192,3,232,58,1,160,5,224,21,10,161,74,194,+33,96,102,96,17,246,254,3,128,2,224,42,6,242,183,6,203,206,246,196,+6,224,33,2,242,215,0,224,16,16,224,67,8,228,75,2,224,50,15,207,+89,224,254,2,242,98,7,160,33,224,17,0,218,89,160,54,229,13,0,78,+53,227,44,1,243,49,5,122,104,167,223,128,42,101,119,80,82,255,121,1,+128,36,170,235,0,75,232,176,2,64,71,130,163,229,122,1,96,29,225,180,+9,225,201,6,225,144,1,224,190,1,96,16,224,39,6,225,222,1,225,9,+19,163,99,2,49,53,55,243,154,11,224,2,1,129,9,224,118,5,131,170,+107,149,128,25,96,208,141,129,66,43,89,125,5,49,53,57,53,32,79,98,+152,0,50,250,79,2,224,100,1,130,74,160,94,160,148,235,71,2,128,64,+192,47,64,38,226,242,15,160,91,192,229,73,255,65,215,96,42,224,112,0,+64,64,194,199,160,90,186,38,160,76,224,82,2,0,95,225,202,3,128,94,+224,80,2,193,211,224,22,6,96,52,96,201,159,30,64,75,0,52,231,240,+2,1,36,104,174,21,68,148,64,42,224,40,16,1,118,115,238,63,1,194,+115,2,55,56,54,252,195,0,224,20,0,1,48,53,102,192,170,118,0,53,+119,188,160,25,96,11,65,14,0,79,65,12,241,213,1,96,0,226,232,1,+128,62,130,74,67,9,199,54,243,237,0,192,26,194,37,96,49,72,243,91,+79,224,144,0,100,176,167,22,201,35,0,56,152,216,135,23,70,78,243,170,+3,185,205,164,74,64,17,168,17,186,59,225,185,0,224,33,15,189,66,224,+33,19,224,67,25,241,91,3,253,23,10,161,206,103,113,198,81,64,217,0,+54,162,247,96,26,144,132,64,63,224,60,5,66,186,156,81,237,205,0,96,+45,166,158,0,54,230,148,0,135,25,239,22,1,96,0,201,206,224,175,5,+100,69,192,26,224,110,5,97,157,155,201,1,49,55,70,105,160,13,128,85,+251,0,7,64,146,186,254,97,134,224,106,8,155,88,224,26,13,101,204,129,+230,224,133,7,101,163,96,108,224,230,1,241,98,1,225,14,6,253,131,7,+64,37,225,49,9,224,181,6,99,11,64,223,128,128,253,242,0,193,159,157,+244,65,166,160,68,224,171,2,224,198,5,97,35,225,76,12,128,58,137,83,+225,225,0,91,6,1,55,56,197,199,128,76,224,84,8,225,53,18,97,26,+224,26,13,225,214,17,128,203,225,7,6,152,148,97,13,225,211,14,225,129,+16,225,182,13,133,199,162,232,242,125,0,225,181,1,224,73,2,1,51,53,+81,119,224,31,2,129,141,65,26,231,159,0,226,187,12,96,44,224,227,12,+187,240,96,124,156,61,166,158,96,214,231,254,5,64,103,226,233,10,161,173,+224,21,9,227,252,18,209,156,64,34,224,173,8,226,27,17,97,117,225,95,+8,161,3,73,191,96,0,160,32,225,155,4,225,41,1,132,152,227,3,11,+64,25,191,106,228,53,5,226,246,0,64,6,234,177,0,226,216,13,224,187,+16,98,103,227,84,20,226,56,17,224,56,13,162,111,67,27,224,41,1,0,+58,133,251,116,205,225,36,5,230,194,1,195,75,64,43,212,249,0,83,225,+160,9,240,237,0,225,30,1,225,49,6,133,102,96,102,71,220,160,105,1,+56,53,230,155,1,224,130,4,224,24,2,224,38,6,226,232,6,224,42,64,+224,194,6,65,157,230,42,7,96,194,224,56,6,224,97,20,227,113,6,96,+60,160,19,224,123,4,65,93,0,51,225,137,12,128,44,98,42,226,189,6,+64,51,141,155,224,51,13,227,135,0,224,105,1,64,50,177,38,107,43,225,+244,19,225,41,15,224,133,6,224,111,5,64,96,177,90,140,108,229,71,12,+195,180,229,124,37,99,103,195,170,228,109,0,198,2,0,90,226,217,2,224,+36,9,96,86,227,175,5,224,37,9,96,150,128,73,135,85,134,62,227,248,+11,225,56,29,224,100,11,100,205,224,64,5,200,173,161,86,0,55,224,63,+3,161,97,233,193,0,0,58,129,119,83,97,0,32,242,167,20,3,69,120,+112,114,146,165,6,49,49,52,48,58,49,52,242,167,7,9,105,109,112,111,+115,115,105,98,108,101,106,195,64,88,206,200,229,18,4,228,121,7,128,240,+228,25,5,68,232,111,36,64,253,64,15,0,54,234,68,5,82,235,165,143,+160,85,96,83,128,59,209,121,64,88,1,51,32,146,53,152,10,64,133,253,+101,9,192,149,129,55,96,10,112,58,184,210,137,168,240,49,6,241,21,3,+99,75,64,120,212,99,1,95,53,133,81,2,95,51,53,126,77,0,55,115,+118,64,33,131,146,3,95,49,55,54,97,154,0,54,92,212,1,55,55,128,+36,0,54,144,114,148,80,109,57,224,42,17,253,74,0,96,42,131,129,0,+79,97,21,96,70,103,50,192,15,64,162,64,205,64,239,64,45,176,161,64,+226,96,220,64,35,5,55,32,64,79,32,35,76,83,97,21,0,58,128,54,+224,38,11,225,239,1,1,91,93,193,231,64,114,1,10,65,226,57,2,0,+68,84,178,10,76,105,115,116,95,84,121,112,101,46,34,108,8,64,61,97,+30,64,1,245,187,11,245,176,0,64,44,193,240,1,80,32,139,141,147,67,+0,54,187,78,3,49,55,54,51,66,23,0,54,193,114,108,120,81,146,96,+37,161,102,97,50,0,51,109,207,0,50,237,101,3,0,102,96,184,65,195,+65,90,114,119,146,94,224,40,14,96,83,129,143,0,75,100,230,0,75,98,+60,96,3,162,176,76,24,160,136,94,211,66,114,0,49,65,57,0,50,121,+209,224,82,1,1,40,41,96,82,213,171,66,97,77,99,64,47,96,42,1,+35,52,245,168,2,66,125,85,170,73,152,0,56,83,66,99,215,77,80,249,+6,0,96,32,169,33,1,56,53,124,80,0,55,78,0,179,96,129,19,242,+107,3,224,138,1,1,70,69,160,221,96,38,86,192,2,95,49,55,110,86,+3,58,49,55,53,129,254,97,127,106,165,129,127,64,30,129,5,96,92,0,+54,71,237,163,35,225,54,2,4,115,117,112,101,114,96,92,227,55,5,64,+64,245,65,1,96,60,224,53,2,0,67,64,49,64,34,129,250,65,105,0,+66,109,54,143,185,96,113,1,56,50,164,218,220,215,64,47,130,19,4,98,+115,43,43,46,66,19,64,26,134,47,0,39,101,241,64,45,2,50,32,95,+156,73,93,63,1,50,57,96,127,1,51,53,196,22,241,186,1,244,180,1,+104,224,98,156,114,91,64,75,0,80,64,141,0,90,96,82,1,57,52,229,+148,0,2,95,57,52,69,76,0,53,160,93,225,10,5,19,100,117,112,108,+105,99,97,116,101,32,100,101,102,105,110,105,116,105,111,110,101,54,65,198,+202,170,64,13,229,121,19,5,68,101,115,117,103,97,165,124,5,53,54,50,+58,49,48,229,123,7,7,99,104,101,99,107,68,117,112,96,90,65,3,131,+1,101,22,96,240,1,95,54,64,243,2,50,50,56,191,4,244,229,13,181,+251,97,96,131,74,0,53,130,246,64,243,174,183,0,55,164,211,197,195,0,+54,64,79,0,95,112,116,64,47,195,7,68,245,99,87,67,189,64,24,221,+152,229,193,2,129,196,202,170,145,253,128,11,254,83,4,64,10,254,120,0,+64,38,246,252,0,64,223,0,51,135,163,0,58,128,111,64,171,76,73,240,+228,1,245,65,2,150,154,1,75,32,179,148,196,124,192,7,128,122,64,51,+146,55,64,15,64,39,230,186,3,160,84,224,33,1,224,13,6,135,217,228,+219,0,211,167,160,90,224,83,1,224,50,4,224,53,1,224,54,0,96,175,+224,39,10,224,63,0,224,25,9,192,47,243,142,4,128,117,165,95,160,8,+104,122,226,13,4,253,237,6,64,235,224,66,0,192,2,181,62,224,162,3,+96,94,126,184,0,55,161,133,160,150,131,175,96,212,128,118,224,5,15,216,+220,224,88,4,192,194,101,189,97,251,161,238,198,39,224,239,2,225,4,6,+159,175,224,73,0,128,253,174,7,225,165,5,96,40,138,15,226,43,1,192,+57,124,182,0,39,243,57,0,202,56,224,72,17,224,17,1,224,31,8,226,+14,3,110,170,101,243,97,131,234,96,0,98,143,128,4,192,33,200,152,64,+62,240,0,2,249,39,0,75,249,131,63,224,9,1,224,58,10,165,55,185,+73,224,42,3,210,116,193,43,208,215,96,249,64,159,106,162,224,18,1,64,+14,64,63,153,134,224,177,6,246,229,1,224,251,6,193,50,226,201,12,226,+204,2,224,29,41,224,190,8,103,123,163,70,193,8,193,57,160,38,225,233,+3,227,161,8,227,55,0,64,35,85,219,154,109,234,62,3,196,173,231,224,+2,192,25,1,95,50,239,220,0,128,98,175,225,3,64,64,95,52,118,204,+225,230,8,143,65,225,144,1,241,193,0,155,161,102,91,0,49,70,144,219,+137,229,4,2,1,95,54,115,51,96,44,161,28,66,250,226,241,25,225,3,+0,161,6,129,0,226,237,3,224,65,23,225,129,5,224,31,4,226,234,41,+226,217,3,239,46,0,253,231,1,100,151,208,208,201,87,224,24,0,4,64,+95,50,51,48,164,193,129,61,96,4,227,25,16,192,180,195,35,96,154,64,+155,2,51,55,48,225,200,1,224,52,1,128,100,97,21,162,60,227,30,24,+0,75,169,139,227,30,13,225,58,15,224,13,4,101,103,229,2,0,161,222,+129,66,226,137,2,165,177,64,151,135,180,96,9,1,53,57,108,148,96,65,+157,245,226,190,7,64,138,224,162,0,192,224,197,254,225,45,1,165,114,194,+112,0,89,96,225,194,105,147,84,192,150,131,116,64,39,128,229,227,120,0,+0,80,231,181,0,132,130,135,198,197,202,64,24,75,74,224,116,2,253,226,+2,138,28,2,79,32,35,75,224,128,131,160,51,71,231,138,132,235,190,3,+64,21,138,89,230,145,0,94,226,97,20,96,33,253,110,6,93,132,192,86,+197,28,64,67,0,54,128,89,3,49,55,52,52,74,74,64,67,128,83,240,+62,3,64,48,126,170,163,75,128,25,225,161,6,202,83,229,3,1,225,225,+0,227,88,5,224,13,3,199,168,163,74,193,100,131,230,225,202,6,227,72,+8,200,229,226,142,0,170,235,228,196,8,64,222,73,239,249,231,0,72,252,+230,225,0,98,127,64,34,0,51,129,63,233,33,3,197,26,102,129,255,158,+0,128,0,96,77,160,55,65,58,205,153,105,241,224,238,6,224,108,0,224,+252,1,228,4,0,163,108,118,14,225,1,6,229,141,9,228,64,2,192,150,+250,189,4,232,207,4,193,174,225,73,6,231,221,0,228,26,0,161,231,133,+138,228,28,3,193,57,162,209,192,255,228,78,1,96,70,224,24,1,227,198,+0,193,0,193,32,229,211,1,160,170,156,15,225,39,2,104,201,128,27,0,+66,208,172,228,51,3,102,213,224,32,0,200,188,224,191,3,97,91,196,68,+134,85,2,52,55,49,224,203,4,193,70,96,190,224,53,39,224,50,13,237,+89,5,128,91,246,35,4,209,93,173,43,4,79,32,35,57,55,163,140,241,+101,7,241,100,3,234,161,2,196,6,0,51,205,231,84,120,220,232,129,1,+209,181,128,172,224,180,0,228,136,1,224,18,0,90,116,209,72,64,17,224,+81,25,66,0,226,8,7,0,52,68,91,226,84,2,224,31,0,224,94,4,+205,27,131,18,193,218,229,0,0,226,66,0,230,16,1,131,211,162,142,224,+190,2,162,230,64,84,245,29,1,66,37,1,95,49,125,64,116,151,67,251,+224,10,4,148,37,249,87,4,160,26,155,124,189,123,64,86,68,224,143,167,+1,51,54,113,251,197,34,75,144,96,196,0,90,64,154,96,4,132,27,209,+185,64,40,1,10,65,80,55,1,51,32,64,165,64,18,0,54,192,76,1,+56,54,79,43,81,44,67,174,160,81,177,211,2,57,57,50,69,115,0,51,+228,56,1,2,66,32,95,67,123,69,133,1,95,56,172,39,232,158,0,232,+190,0,128,11,1,95,56,70,42,232,45,1,165,67,129,59,0,95,78,236,+96,71,225,206,0,0,52,82,210,0,56,113,109,0,67,64,13,243,200,0,+224,116,4,4,54,49,32,95,57,220,219,113,134,224,72,0,0,66,64,25,+0,49,226,199,0,243,23,2,64,10,1,32,34,161,195,130,55,195,224,224,+16,0,137,217,144,3,0,79,67,4,64,83,66,109,131,232,67,21,0,51,+230,162,1,96,107,101,143,224,107,6,85,115,4,114,116,105,110,103,128,111,+240,84,2,160,248,192,202,129,42,1,95,56,79,207,64,240,0,57,81,201,+224,71,1,1,104,115,96,63,160,53,65,202,129,103,224,63,2,2,95,49,+48,81,24,245,204,9,225,91,2,224,99,2,198,144,129,104,127,179,225,103,+5,130,237,96,61,158,194,225,152,3,224,47,5,99,82,64,26,67,92,225,+3,8,1,32,40,225,107,5,132,69,2,50,48,51,86,207,96,106,65,94,+0,49,231,240,2,64,71,231,253,1,224,190,1,128,192,74,185,231,78,0,+133,188,224,231,186,231,7,6,227,17,7,101,163,117,1,96,19,64,12,151,+12,128,230,192,148,224,146,6,14,112,114,101,112,114,111,99,101,115,115,101,+100,58,94,42,130,67,129,71,224,110,2,227,52,5,0,56,86,7,2,95,+49,48,153,66,137,237,0,55,68,132,2,95,49,51,137,50,160,0,68,116,+165,181,226,109,13,227,201,26,227,161,13,227,53,1,5,99,97,99,104,101,+100,227,60,7,96,48,192,102,64,125,70,214,106,170,1,48,48,133,253,243,+60,5,230,155,0,68,190,134,149,228,119,36,164,95,224,173,24,3,98,111,+111,116,224,171,6,227,230,37,3,46,104,115,45,64,68,129,168,203,165,64,+149,89,112,224,121,8,96,111,15,109,111,100,117,108,101,32,110,111,116,32,+102,111,117,110,100,148,122,224,129,1,227,50,6,226,95,127,1,55,51,98,+3,226,95,5,251,170,0,97,169,135,237,110,88,102,151,1,49,52,70,168,+166,152,232,43,5,112,12,64,51,135,194,71,46,0,75,66,171,64,18,212,+216,192,1,230,62,2,86,119,1,52,57,201,101,167,241,224,185,3,225,183,+0,193,8,67,24,160,184,225,82,7,164,136,107,216,160,5,226,96,31,103,+25,225,107,23,5,97,114,115,105,110,103,161,222,192,0,234,112,0,160,128,+192,196,235,152,0,224,35,3,224,44,1,160,66,225,20,1,224,246,0,224,+243,10,107,100,75,20,225,42,2,224,253,4,244,206,4,225,6,4,226,103,+26,120,189,224,251,7,226,234,8,64,253,226,99,1,133,90,1,49,51,120,+109,224,0,2,225,190,5,242,45,0,228,155,10,163,151,225,140,2,230,41,+1,114,90,96,7,98,150,0,57,98,92,66,119,235,54,1,129,201,67,148,+128,10,224,172,5,195,146,7,97,109,101,32,100,111,101,115,99,156,12,97,+103,114,101,101,32,119,105,116,104,32,102,105,160,29,193,204,162,26,134,54,+131,184,160,14,2,79,32,35,67,7,139,126,248,146,4,64,0,128,197,226,+120,10,161,125,96,250,161,229,228,131,2,229,177,0,2,95,50,52,156,177,+253,57,2,226,19,3,178,38,224,22,9,124,19,224,45,32,224,1,1,227,+123,17,224,56,12,226,98,11,226,159,9,97,170,74,247,2,95,49,52,139,+72,224,81,17,224,1,5,224,142,24,227,60,4,237,209,5,128,14,224,94,+2,227,102,9,163,127,224,72,8,224,2,9,128,75,96,0,224,167,11,128,+38,224,76,2,224,36,11,206,101,160,0,224,139,13,227,29,10,128,90,160,+102,128,8,175,93,224,17,2,224,26,9,192,8,227,232,31,0,52,99,70,+227,232,24,0,100,155,76,227,235,4,0,51,125,34,76,135,224,0,8,195,+180,227,6,31,192,189,240,16,2,224,185,3,64,0,99,140,226,114,5,232,+20,16,64,0,225,127,1,136,32,224,19,6,232,44,15,4,100,111,110,101,+32,229,203,0,224,116,5,228,10,5,224,79,2,224,77,6,0,44,224,64,+0,224,211,0,234,123,3,227,213,0,224,60,12,1,109,115,192,61,224,30,+12,170,206,64,29,228,158,4,224,89,4,224,55,11,0,43,160,86,224,53,+16,224,50,16,224,190,12,235,52,6,224,0,7,128,101,227,68,0,96,202,+225,228,0,224,8,27,225,255,5,231,73,1,96,26,230,31,17,1,95,56,+104,134,161,115,64,17,241,89,5,113,68,224,226,1,10,73,110,116,101,114,+97,99,116,105,118,101,225,86,0,1,95,52,81,89,226,80,8,128,147,106,+33,128,131,96,79,225,105,10,3,108,111,97,100,203,28,230,66,18,225,210,+8,64,168,64,38,225,89,16,193,77,129,89,249,158,4,228,244,5,227,58,+5,247,122,0,132,46,228,50,0,201,244,224,13,0,1,49,52,156,142,229,+51,0,129,72,110,215,191,227,128,47,1,64,95,94,224,2,95,57,52,224,+196,2,255,123,5,6,67,111,109,112,105,108,101,159,123,5,50,48,51,58,+50,54,233,33,3,236,39,1,185,189,224,186,1,238,87,4,194,69,192,244,+99,232,157,81,81,21,64,145,232,106,2,128,210,224,20,0,224,33,8,65,+96,1,56,48,224,17,2,224,16,8,192,0,1,85,32,184,122,3,95,49,+52,52,74,226,104,210,75,16,160,41,0,58,139,27,118,244,7,52,53,48,+32,95,53,51,54,64,4,119,49,98,35,64,44,70,193,2,49,55,50,75,+61,64,7,159,209,64,66,64,55,64,52,96,85,0,54,66,157,160,53,242,+106,6,109,236,2,95,53,50,96,91,122,210,96,37,225,117,1,2,101,111,+102,129,85,114,137,2,51,54,53,64,84,146,64,224,167,0,146,88,224,111,+1,3,49,53,48,52,107,220,67,62,0,66,224,53,3,104,113,71,123,227,+35,4,3,77,97,105,110,96,100,0,79,64,128,0,56,67,74,224,31,4,+0,109,192,31,162,178,64,115,0,54,128,115,66,135,160,116,1,52,53,226,+45,3,137,138,96,53,224,152,2,2,52,53,54,122,32,224,18,0,64,158,+225,89,10,97,113,2,49,52,53,83,97,4,52,53,56,32,35,83,205,100,+157,128,23,0,50,96,76,0,57,160,83,64,31,147,161,192,13,134,13,224,+250,5,1,67,39,84,184,64,67,227,123,0,227,74,0,224,194,12,3,119,+104,101,114,228,52,1,136,180,225,96,10,227,93,0,224,107,2,193,104,225,+163,1,185,48,77,83,64,239,89,35,224,9,28,224,49,1,224,59,11,224,+29,21,224,9,13,91,0,141,207,0,54,101,73,2,95,49,51,160,182,5,+95,49,56,32,95,53,93,64,6,95,55,57,52,32,95,56,64,181,97,22,+129,135,225,28,3,3,100,97,116,97,129,221,2,49,54,56,100,51,86,143,+142,70,224,81,3,224,91,10,1,49,54,69,126,224,86,13,5,110,101,119,+116,121,112,129,117,2,95,49,54,86,202,224,129,3,2,56,32,35,65,189,+224,97,23,0,56,99,112,86,61,182,67,3,95,49,54,53,98,65,225,163,+1,213,251,66,16,66,122,0,54,96,46,0,54,105,63,221,77,240,208,8,+130,87,64,193,0,56,69,91,101,241,161,228,224,255,14,224,245,3,111,107,+224,245,11,224,242,29,0,53,252,15,1,224,85,1,0,51,79,121,224,85,+13,136,242,160,87,1,55,48,229,113,0,68,237,227,20,2,224,13,2,103,+99,224,186,10,1,55,48,98,47,192,100,224,106,9,5,102,111,114,101,105,+103,132,36,224,134,18,64,74,178,222,68,4,96,74,101,163,0,53,85,65,+226,164,13,224,76,5,4,117,110,115,97,102,129,43,224,27,8,224,25,1,+224,131,9,72,5,5,114,117,112,116,105,98,196,148,228,112,3,134,40,96,+132,3,95,49,53,56,196,75,0,53,97,51,192,241,0,53,88,5,225,133,+2,225,72,44,80,195,225,72,47,1,101,120,225,72,11,224,185,9,227,8,+3,70,27,97,73,229,96,7,66,170,90,193,141,182,224,227,15,227,103,13,+224,217,13,133,147,224,211,10,3,99,108,97,115,151,70,66,222,98,134,194,+231,224,154,12,226,248,1,0,49,101,96,1,95,53,122,69,96,31,98,54,+225,102,4,192,130,72,52,98,53,100,91,129,186,96,32,192,217,67,155,224,+32,8,226,6,5,160,118,198,76,228,44,3,161,17,3,95,49,54,48,77,+20,0,55,218,18,225,233,5,225,25,13,104,37,227,161,12,5,110,115,116,+97,110,99,195,251,161,118,224,99,1,132,78,229,178,4,224,25,3,224,160,+11,226,137,11,224,139,3,145,57,224,142,13,5,100,101,102,97,117,108,162,+97,226,87,1,0,48,64,75,132,194,69,68,205,185,231,191,0,1,49,52,+84,36,225,72,4,128,131,69,132,1,51,50,87,138,128,174,0,56,71,253,+224,110,1,1,40,41,194,203,224,77,0,162,116,5,52,54,54,32,95,54,+72,168,199,235,97,26,225,158,5,226,158,6,224,228,3,167,204,229,104,22,+225,242,0,226,249,3,76,17,128,90,192,80,0,85,97,112,135,41,224,83,+11,5,112,97,116,116,101,114,195,178,1,55,50,176,202,230,4,14,197,174,+232,223,3,224,77,16,226,248,2,161,124,225,2,5,160,182,226,59,2,227,+167,25,128,16,225,254,13,5,114,105,118,105,110,103,197,31,227,153,8,224,+198,2,0,56,230,203,16,1,118,105,200,23,226,206,1,0,57,227,80,8,+141,116,224,65,13,227,21,13,162,106,225,73,2,0,50,126,35,0,54,88,+88,189,178,128,41,130,222,129,57,224,5,3,226,8,14,224,24,5,1,114,+111,166,32,226,34,1,102,149,102,168,230,159,25,6,110,111,109,105,110,97,+108,192,65,225,219,6,5,104,97,110,116,111,109,128,28,224,121,9,11,101,+112,114,101,115,101,110,116,97,116,105,111,224,67,0,129,138,225,133,1,74,+75,254,8,3,2,80,32,35,68,95,170,133,77,63,69,8,64,37,153,111,+227,189,3,69,114,2,83,32,73,99,194,109,112,67,166,225,231,8,235,22,+11,200,132,235,8,9,0,54,99,47,64,21,228,23,27,66,127,134,182,235,+51,11,142,12,190,194,64,198,96,34,0,49,107,205,142,176,0,79,160,89,+1,53,57,101,83,78,177,0,54,74,167,69,210,1,57,55,128,161,239,86,+2,224,200,8,1,56,49,225,112,2,1,60,45,161,98,224,211,15,175,218,+192,25,128,121,92,86,224,211,4,229,77,15,236,62,2,128,56,99,197,0,+55,210,169,225,1,14,239,11,5,111,152,113,9,64,225,207,156,96,0,65,+226,217,168,3,95,49,54,50,138,195,100,34,1,53,54,64,152,118,44,138,+203,183,60,64,50,217,167,0,83,65,103,84,74,5,67,32,60,32,64,35,+64,88,0,67,224,18,5,64,241,224,18,6,65,23,238,190,4,133,21,107,+72,1,85,32,238,218,6,131,146,160,27,2,95,54,53,64,160,193,253,64,+0,101,87,160,15,224,32,9,224,121,6,65,52,224,178,6,67,235,224,112,+4,104,43,192,112,1,75,50,80,105,164,57,239,114,5,224,38,3,209,189,+114,89,160,125,224,166,3,111,117,224,71,0,65,64,250,213,3,67,124,128,+26,225,176,3,0,58,134,46,160,37,2,80,32,35,102,253,0,80,112,27,+68,187,224,24,1,0,49,97,245,160,25,175,197,229,119,19,109,149,1,49,+51,123,8,68,249,128,173,230,103,23,230,69,4,1,53,48,173,123,230,69,+0,230,68,8,64,140,0,54,224,229,6,228,24,1,224,229,3,142,212,224,+178,11,0,54,133,28,231,158,13,166,129,231,2,15,232,134,3,160,176,224,+164,13,229,7,1,64,162,225,101,3,132,251,128,190,128,29,246,31,4,119,+147,224,204,3,96,52,195,77,224,52,0,168,10,224,51,19,131,78,230,25,+14,237,63,2,161,116,235,22,4,2,99,97,108,197,228,224,44,5,165,116,+224,44,4,2,97,112,105,160,43,224,44,6,167,136,224,44,3,8,106,97,+118,97,115,99,114,105,112,204,44,230,64,6,76,57,5,10,65,32,75,32,+65,97,45,64,66,96,14,0,75,128,14,130,162,2,75,50,32,64,12,130,+149,225,20,2,169,166,225,20,18,73,237,129,20,101,179,234,140,2,245,181,+0,192,16,235,61,5,194,35,122,207,78,218,98,75,226,93,10,224,255,1,+126,185,65,6,0,48,224,255,2,5,83,79,85,82,67,69,160,251,235,35,+3,0,51,72,43,64,0,132,93,103,2,161,174,235,54,6,236,87,5,64,+121,98,94,64,234,224,177,11,0,67,181,66,160,38,101,199,110,217,128,91,+240,118,10,238,129,8,237,200,3,227,21,11,0,97,205,66,1,52,54,132,+114,0,83,239,55,0,237,19,22,226,145,11,138,237,224,97,5,2,104,105,+100,201,253,224,178,13,171,152,243,133,5,1,55,48,235,153,13,224,107,21,+8,113,117,97,108,105,102,105,101,100,226,161,13,77,156,227,87,6,242,202,+21,225,146,9,225,224,1,95,116,152,94,1,67,39,150,91,150,255,160,65,+231,33,2,72,33,133,249,64,215,68,50,150,37,64,13,160,31,111,48,225,+8,0,240,42,0,228,232,12,135,241,160,50,237,171,11,224,45,5,129,250,+242,67,0,224,26,9,236,124,24,207,206,224,144,22,237,24,21,160,129,224,+176,10,225,165,8,133,128,2,90,32,90,126,128,64,17,229,120,1,94,169,+192,7,166,47,64,126,96,47,96,21,192,50,133,66,137,69,64,181,64,171,+107,115,119,151,128,108,100,17,137,144,232,123,11,128,31,0,90,161,203,238,+115,3,96,0,64,101,231,182,1,2,80,32,35,97,212,102,42,115,148,4,+10,65,32,80,32,64,11,231,156,1,134,52,96,65,228,222,3,64,36,199,+167,0,50,66,225,230,244,5,74,149,64,34,0,54,224,210,2,237,103,22,+111,78,228,226,8,228,141,16,1,95,51,103,54,1,54,56,101,134,237,146,+47,232,52,15,64,85,237,174,2,224,26,2,1,57,51,109,108,245,13,5,+169,36,229,161,12,239,193,27,229,63,3,1,95,49,134,246,96,160,64,45,+128,92,65,77,228,11,19,228,219,11,1,54,57,175,40,225,3,3,4,115,+116,111,99,107,196,219,224,44,4,169,40,237,197,4,246,133,2,224,47,8,+163,67,229,155,4,1,110,121,242,228,1,227,59,7,1,54,57,178,233,227,+59,3,97,99,71,101,0,52,98,120,131,54,1,75,51,135,130,96,99,135,+130,68,127,64,16,131,36,0,75,64,34,96,15,130,206,67,121,195,125,96,+85,66,3,194,205,65,204,238,0,10,135,150,127,186,198,158,192,16,231,11,+5,193,155,66,248,226,87,1,246,142,0,240,155,6,178,227,243,180,0,129,+55,0,54,151,30,249,136,6,69,132,243,81,1,226,247,4,64,183,131,96,+0,85,163,135,249,159,28,249,156,10,0,54,231,177,2,237,99,3,142,251,+0,80,158,80,65,120,64,165,205,147,108,41,96,157,1,57,51,96,129,1,+95,56,90,233,66,158,2,54,56,53,125,185,65,32,238,98,1,64,175,0,+54,162,159,175,82,96,52,142,46,128,55,98,209,0,56,154,13,64,47,130,+207,128,219,100,190,64,36,129,215,64,43,124,114,1,54,56,73,126,96,22,+6,10,65,32,98,115,43,43,96,14,130,23,96,106,140,185,102,230,102,216,+224,2,0,70,238,129,19,224,1,1,135,12,65,20,0,55,93,213,238,70,+1,224,36,3,64,1,130,73,64,0,224,82,3,224,2,7,224,36,0,167,+87,190,169,126,129,224,5,10,192,152,222,197,229,82,0,221,253,64,2,233,+92,0,174,55,238,182,1,255,98,0,249,150,1,98,86,249,123,2,97,214,+224,2,3,224,104,2,161,1,128,16,96,74,0,39,192,2,160,149,128,39,+64,33,65,33,111,72,79,65,161,209,0,90,224,9,0,238,222,10,124,151,+198,158,0,83,64,79,1,95,52,154,221,0,53,73,166,224,32,1,240,200,+0,64,66,106,44,112,181,224,0,5,224,174,1,129,199,224,78,0,111,226,+66,196,0,56,173,251,127,171,71,109,192,0,225,254,1,226,4,3,225,184,+13,224,18,9,225,136,3,113,199,0,51,146,83,225,46,1,4,83,32,95,+52,54,255,206,0,64,196,65,98,193,153,1,54,54,225,174,0,128,14,198,+52,240,179,0,224,178,7,100,98,163,126,191,157,167,204,96,81,0,53,96,+231,224,36,0,96,84,0,55,97,87,192,45,224,200,7,227,5,1,192,30,+224,252,7,224,29,5,192,238,224,25,8,209,247,96,21,162,217,128,14,225,+22,26,131,65,193,20,228,5,1,70,220,225,17,6,224,133,1,1,95,49,+119,150,3,95,53,55,55,196,70,66,116,66,160,67,15,0,52,216,246,64,+9,100,52,84,140,96,142,70,187,0,57,105,39,0,53,121,88,0,79,69,+126,228,160,0,96,148,128,46,160,0,161,98,161,94,160,145,0,67,164,229,+96,41,1,95,56,205,35,163,21,0,39,68,48,0,53,196,53,224,109,4,+193,26,96,191,229,151,1,15,66,97,100,32,71,65,68,84,32,114,101,115,+117,108,116,32,71,74,0,32,167,26,192,48,0,52,75,62,2,54,55,57,+99,12,2,95,49,48,122,142,1,56,54,99,214,0,50,83,98,1,49,54,+171,137,225,170,0,198,57,160,0,69,14,135,21,6,95,49,49,54,32,95,+51,70,39,160,53,134,59,96,150,2,79,32,35,67,130,129,16,194,174,65,+110,128,131,128,114,98,95,224,195,4,1,58,58,96,176,225,156,0,160,177,+96,167,65,101,67,202,230,5,0,2,95,49,50,224,177,1,64,151,202,108,+0,89,104,162,132,99,96,98,0,54,74,165,164,45,161,10,1,52,50,242,+169,3,98,197,148,0,165,59,0,95,64,113,100,253,0,48,75,51,140,144,+225,72,0,64,148,1,49,56,96,229,0,52,224,145,1,224,69,2,224,63,+8,72,98,192,64,224,62,13,224,44,3,0,65,225,111,0,64,0,1,95,+49,116,189,96,239,96,233,76,111,4,10,65,32,83,32,83,204,64,104,72,+141,128,247,131,148,229,91,0,101,144,229,164,4,226,64,2,134,160,244,121,+4,64,0,228,205,1,224,46,20,182,255,228,197,2,192,47,224,44,10,200,+156,227,254,0,192,161,224,36,4,194,221,196,3,229,245,0,224,25,0,0,+85,225,46,2,0,85,224,238,0,164,69,228,91,2,96,135,228,102,3,128,+200,225,6,0,224,53,2,224,175,2,97,187,67,122,100,92,136,127,1,55,+48,231,17,1,224,83,0,198,234,128,57,132,175,224,12,2,229,46,1,224,+43,1,129,37,64,236,1,95,49,76,196,228,120,3,0,90,164,10,224,253,+0,192,64,228,155,6,230,196,13,128,119,230,13,3,64,62,128,78,192,143,+188,128,64,209,252,139,0,101,40,0,67,87,220,233,88,1,193,121,131,8,+192,169,129,8,128,209,224,57,0,229,86,6,1,67,39,66,127,64,137,0,+80,130,235,96,238,225,38,3,142,148,225,19,3,161,17,129,188,104,24,137,+244,2,52,55,49,225,116,3,128,194,101,203,128,0,128,122,216,121,226,50,+13,249,158,0,99,245,76,218,194,175,166,178,226,129,11,143,199,128,148,224,+77,4,192,24,230,104,1,128,7,224,40,8,133,61,224,32,2,97,176,227,+34,0,64,12,129,173,1,48,53,134,166,128,11,64,95,100,179,89,106,161,+142,196,115,224,198,5,70,124,160,18,226,202,1,225,100,1,227,80,5,128,+42,227,205,5,224,39,10,163,156,96,165,65,134,145,193,224,33,3,97,228,+229,65,0,3,95,49,48,54,137,136,109,100,128,141,225,129,8,128,85,131,+179,229,62,0,227,218,9,224,37,1,229,63,1,86,119,200,213,200,173,235,+61,3,161,79,224,166,8,97,27,224,75,8,103,193,168,43,225,155,3,98,+87,0,55,109,1,0,67,73,36,0,52,227,233,4,96,125,1,51,52,230,+158,3,31,92,34,115,114,99,47,77,105,99,114,111,72,115,47,69,120,112,+114,46,104,115,92,34,44,54,55,57,58,49,52,58,32,102,188,163,110,239,+3,2,17,117,98,115,116,32,117,110,105,109,112,108,101,109,101,110,116,101,+100,128,41,230,221,4,128,0,69,220,209,14,100,223,109,23,96,22,141,159,+0,89,99,96,128,5,66,39,129,9,131,29,72,164,85,188,160,15,0,35,+74,194,160,100,0,51,93,73,128,0,2,95,53,55,72,75,91,109,177,106,+224,67,11,228,23,4,2,95,50,55,109,219,1,55,53,67,10,0,55,64,+56,127,111,64,150,0,54,205,58,81,253,121,40,96,38,3,64,95,50,57,+136,108,96,12,0,51,73,194,1,95,51,153,30,2,54,55,50,158,67,64,+27,64,6,98,68,64,8,0,52,224,23,11,0,51,114,93,192,72,0,50,+96,188,96,12,64,126,141,213,193,237,163,17,143,92,160,2,129,147,130,241,+3,32,64,95,50,72,181,0,54,130,182,164,9,195,30,162,107,0,50,80,+7,129,255,226,175,3,3,95,50,55,53,161,55,224,28,0,64,242,96,74,+101,21,68,143,0,66,64,39,0,51,71,197,199,195,71,207,224,108,83,104,+50,224,108,7,64,25,64,44,224,15,14,65,57,174,243,0,50,69,107,65,+158,141,90,96,9,4,49,49,49,52,49,106,171,64,40,0,51,225,98,1,+224,184,9,196,73,194,34,96,176,224,170,3,224,184,36,64,110,143,108,2,+95,56,32,64,12,244,165,1,0,54,64,90,110,140,96,37,201,235,134,73,+73,7,144,216,64,112,245,3,3,97,249,105,39,176,248,224,32,9,71,111,+0,55,107,160,64,9,0,51,193,115,129,38,64,13,64,142,4,51,54,55,+32,89,130,92,129,9,133,214,193,207,192,122,200,130,0,64,143,9,232,83,+2,226,141,2,160,41,230,123,12,226,185,2,231,58,2,229,224,16,166,211,+226,85,0,169,7,224,40,9,232,93,0,199,113,229,57,6,136,80,233,96,+5,64,1,112,153,128,10,103,189,144,65,128,31,224,43,1,224,223,1,224,+226,20,234,50,0,224,227,22,224,153,5,234,58,0,224,143,4,193,195,167,+202,164,196,236,58,3,232,35,6,224,92,2,230,129,5,224,149,0,224,97,+6,224,241,8,225,88,1,224,64,5,193,185,128,30,160,65,224,13,12,232,+46,14,224,44,14,173,118,194,101,239,20,4,128,26,160,155,232,41,3,225,+141,7,193,144,224,98,0,231,251,13,226,204,3,209,199,224,47,0,224,13,+5,224,61,3,198,85,129,125,128,26,226,131,2,225,200,4,252,194,4,161,+101,235,129,4,224,19,5,232,82,30,224,179,0,165,95,224,236,20,226,12,+0,233,18,1,224,53,26,225,93,0,192,29,224,151,8,224,33,8,129,199,+225,21,0,129,186,129,194,137,231,115,122,240,153,8,224,60,2,227,31,1,+192,56,225,25,3,128,36,227,243,1,160,105,64,146,1,95,51,236,178,3,+128,31,130,5,224,27,6,196,7,124,209,124,221,241,50,0,137,44,224,4,+1,128,116,233,13,30,6,49,50,48,55,58,49,54,233,14,15,9,102,114,+101,101,84,121,86,97,114,115,160,33,233,6,7,97,97,137,252,69,117,96,+19,134,40,166,189,0,75,108,153,109,66,96,6,69,166,201,52,70,40,120,+152,166,40,64,64,128,24,0,53,72,43,64,83,88,227,1,95,57,101,230,+64,32,0,54,224,57,2,84,59,74,217,64,23,232,89,0,1,95,54,64,+55,236,220,0,250,252,1,129,114,70,91,128,17,225,254,1,236,232,0,224,+2,1,96,17,161,202,192,225,96,20,240,133,1,72,243,72,153,64,125,135,+157,224,125,7,230,201,8,206,17,128,13,230,215,6,162,61,224,185,2,231,+35,1,0,83,100,66,233,229,2,226,213,1,160,88,194,10,224,64,0,96,+8,224,61,0,73,109,225,6,1,192,242,224,13,9,231,2,0,156,122,224,+48,21,225,43,1,64,19,163,38,96,8,128,108,160,46,197,70,78,163,227,+102,0,225,89,0,239,156,6,64,10,64,27,163,44,96,50,64,15,238,81,+2,192,62,192,18,163,103,88,211,226,239,16,3,76,105,115,116,130,239,3,+51,51,58,53,218,130,224,0,8,225,126,21,109,239,225,132,0,129,136,228,+151,0,176,195,196,140,68,143,161,33,210,99,128,174,64,227,78,54,235,178,+4,224,39,10,64,15,224,110,3,160,0,66,109,137,226,0,95,115,202,66,+255,66,101,119,66,64,15,128,21,68,50,153,209,128,34,96,55,185,24,160,+107,0,95,67,88,0,56,130,191,180,35,3,50,32,95,56,84,193,151,133,+64,37,224,90,0,224,12,4,64,164,119,167,64,114,107,238,206,96,224,11,+1,1,50,48,224,123,4,138,1,97,251,118,19,88,68,97,189,113,52,64,+34,79,85,121,183,1,95,52,117,104,83,42,64,22,132,43,0,75,109,69,+130,212,130,42,231,249,0,137,209,230,5,11,129,150,224,25,6,163,38,98,+100,198,17,150,120,152,134,198,215,224,31,3,97,78,160,31,96,121,194,35,+248,185,1,131,191,227,19,13,226,198,1,64,252,160,27,206,233,158,197,64,+10,0,95,242,40,0,0,75,84,238,128,91,192,0,230,61,1,192,243,231,+39,6,193,19,163,61,230,30,2,224,179,2,161,183,246,35,3,162,232,65,+106,191,181,253,12,2,69,125,252,94,5,0,53,100,255,252,75,4,0,54,+126,170,96,94,224,20,3,105,168,129,171,224,23,1,82,162,255,6,7,159,+173,0,53,66,185,1,53,53,70,92,0,53,73,228,64,12,97,197,4,95,+49,52,56,49,227,217,2,1,45,62,227,191,1,128,94,252,217,5,165,112,+224,27,0,252,219,6,224,25,2,197,230,224,11,0,192,8,225,29,1,129,+24,0,54,129,24,255,195,10,0,51,254,194,0,224,9,21,255,196,0,227,+233,2,96,8,226,49,2,0,95,121,58,198,97,96,184,217,226,228,11,8,+193,117,193,104,64,7,144,64,1,54,52,120,189,224,15,0,224,161,39,192,+133,224,95,8,66,11,255,181,5,135,72,64,26,194,65,167,134,255,37,0,+224,86,2,1,53,49,68,112,255,35,3,151,33,194,0,224,40,0,1,55,+54,94,86,244,161,10,229,34,8,226,197,3,1,54,51,64,68,191,106,224,+213,9,191,159,66,38,255,147,3,1,53,48,132,238,64,142,96,239,226,225,+0,96,214,194,160,224,29,0,192,13,0,49,205,203,101,11,224,227,2,131,+93,98,230,96,65,145,20,226,51,3,65,38,254,193,0,162,244,136,196,64,+44,224,22,4,137,45,64,53,96,22,224,213,14,1,54,52,73,138,64,40,+165,198,226,166,10,0,54,67,246,73,186,113,229,0,52,65,61,64,48,133,+149,224,48,13,99,76,129,154,225,179,2,105,246,64,30,133,240,224,19,1,+64,79,66,121,96,169,1,52,54,96,75,95,153,86,31,133,224,64,81,228,+94,6,64,185,73,53,192,18,0,64,103,119,64,199,161,21,129,238,227,190,+3,97,242,64,77,164,172,224,187,10,68,97,97,142,99,73,160,164,155,177,+226,190,9,64,74,227,222,17,226,154,5,197,82,234,207,1,228,174,12,0,+53,156,169,224,106,3,195,32,67,75,224,106,20,0,53,90,60,132,241,2,+79,32,35,64,153,131,240,224,77,13,130,71,0,67,76,20,99,110,102,85,+226,37,15,96,157,226,155,1,0,53,90,190,96,175,228,13,19,131,117,215,+21,228,132,5,192,67,161,233,224,15,1,226,238,6,0,52,162,215,226,151,+23,128,69,64,48,162,241,224,48,12,132,69,171,121,64,62,64,41,1,54,+50,72,234,96,36,230,40,1,5,85,73,100,101,110,116,70,44,68,78,231,+206,2,160,180,64,6,100,104,145,96,138,109,74,251,71,146,0,54,98,188,+1,52,56,131,6,231,230,0,167,64,158,86,231,169,8,64,145,227,83,18,+133,17,229,114,10,1,49,54,85,241,64,6,136,137,224,24,2,0,48,115,+72,1,54,48,96,103,66,200,73,172,160,107,0,51,227,111,5,0,53,147,+116,0,53,77,12,64,29,205,101,65,191,143,140,0,80,128,24,131,58,226,+54,1,65,24,229,175,8,0,55,118,30,0,51,100,209,64,153,96,227,224,+189,15,129,197,229,94,37,199,168,224,83,15,229,201,17,224,185,13,227,246,+1,0,54,67,236,64,118,0,52,232,54,2,5,105,110,102,105,120,108,168,+58,224,45,5,164,37,224,45,8,0,114,200,104,224,46,5,99,237,224,46,+10,128,45,225,244,4,96,14,226,8,7,226,172,12,3,100,105,103,105,98,+171,140,246,137,203,200,37,226,185,0,167,48,130,111,64,29,128,37,0,90,+249,66,1,136,78,76,141,232,88,1,236,146,0,74,104,130,201,1,67,32,+111,58,100,210,0,56,133,111,0,57,150,84,135,105,64,55,224,33,11,175,+58,236,112,0,131,13,96,32,96,0,239,250,3,2,80,32,95,89,30,215,+191,228,194,4,74,81,96,28,224,85,3,65,45,226,62,4,129,113,231,127,+4,228,91,6,65,250,108,30,0,65,130,218,133,95,127,192,64,14,133,32,+2,75,50,32,64,12,132,134,163,15,72,141,227,16,0,132,111,160,25,103,+217,160,24,164,94,2,49,54,50,99,96,162,206,131,109,101,245,3,54,32,+95,52,89,99,209,148,132,16,98,226,64,63,132,12,242,185,0,230,232,1,+99,83,64,9,225,196,1,64,1,1,83,32,145,193,96,11,193,181,234,154,+1,161,227,103,3,161,232,243,193,5,132,195,192,14,237,34,0,194,28,224,+16,0,175,194,224,67,1,212,163,234,159,3,252,254,0,231,127,3,166,14,+234,139,3,115,220,244,213,0,243,234,8,239,222,3,225,2,5,160,21,74,+231,236,22,7,224,29,4,232,128,3,125,124,224,169,6,126,252,97,77,240,+93,7,162,240,66,195,90,151,252,48,0,99,0,96,18,132,132,1,95,56,+251,213,0,160,115,236,50,4,96,85,216,69,202,127,244,15,8,97,242,72,+84,239,101,2,96,75,224,242,1,64,166,64,47,237,144,0,237,51,5,229,+229,9,64,230,244,92,1,192,50,237,143,0,224,18,1,2,49,52,54,69,+33,225,66,5,66,15,79,234,160,221,224,218,22,67,139,193,123,64,201,134,+63,100,127,98,101,160,138,162,21,197,130,97,76,212,177,160,17,129,133,229,+189,1,229,190,5,235,33,4,216,235,224,50,8,235,88,3,111,92,232,138,+2,184,53,64,0,136,60,224,83,12,225,13,5,143,103,224,144,1,232,235,+40,128,102,192,8,65,32,231,71,9,224,9,69,237,71,2,226,36,1,100,+132,69,203,64,24,224,226,10,192,205,96,42,165,63,227,61,0,100,163,225,+33,0,226,11,5,0,95,240,126,0,234,70,13,147,5,128,37,64,33,0,+53,104,154,160,52,75,230,220,77,2,49,53,48,96,56,0,54,126,118,129,+51,200,62,231,224,1,0,53,135,224,236,97,8,134,88,237,206,4,168,216,+237,135,10,178,133,224,89,4,118,158,82,54,64,6,143,11,236,198,9,102,+182,230,108,5,224,100,16,157,14,96,15,232,169,12,128,16,224,194,8,2,+49,54,49,175,31,224,126,3,0,53,82,215,160,109,224,197,19,1,49,54,+69,18,134,73,224,92,4,0,49,97,187,227,57,2,224,52,9,108,216,224,+52,4,108,253,224,51,16,168,208,225,136,12,225,35,16,165,136,224,194,19,+0,53,68,119,224,89,10,0,55,96,193,225,226,30,0,56,196,146,64,79,+0,56,202,230,232,8,8,64,217,103,195,2,80,32,35,98,206,0,85,103,+193,64,219,231,218,1,130,144,135,219,68,43,224,25,2,96,191,160,25,207,+135,224,184,8,176,177,224,185,2,227,182,2,230,219,3,227,65,13,130,154,+130,153,105,20,2,95,49,52,143,60,237,150,2,136,152,227,224,30,75,157,+224,161,4,102,55,226,122,0,227,224,6,1,49,54,173,243,64,51,225,255,+2,238,114,0,234,142,1,1,46,46,234,205,11,225,160,12,145,11,65,55,+137,70,201,139,64,86,3,10,65,32,90,136,108,72,122,64,20,173,30,3,+49,54,49,56,73,148,64,167,96,15,239,74,4,0,54,69,221,64,29,176,+50,225,9,8,224,243,0,175,39,0,53,165,167,226,125,4,0,53,141,83,+67,112,129,19,150,81,64,91,229,182,36,236,98,1,0,54,126,125,71,168,+172,195,1,54,48,192,92,69,149,128,101,164,233,1,54,49,65,251,226,165,+6,64,130,241,3,5,2,53,57,48,101,78,224,17,0,245,33,10,0,54,+244,17,2,231,188,3,123,37,214,71,128,95,130,238,224,219,43,96,136,224,+219,52,176,141,227,7,3,224,106,13,231,214,0,134,81,108,68,228,181,0,+0,54,110,113,226,161,2,215,103,228,215,2,237,122,3,1,100,111,237,165,+9,224,50,1,229,63,0,224,50,3,0,109,224,51,0,0,85,233,130,7,+1,53,48,69,64,124,125,235,59,1,233,111,2,233,105,13,0,66,204,5,+0,52,79,123,64,0,221,174,0,67,119,167,225,186,10,2,49,54,49,195,+210,137,90,237,181,4,137,100,112,137,75,209,0,95,97,112,139,89,237,224,+8,170,29,233,214,5,233,216,0,128,2,224,110,0,128,52,251,123,1,90,+138,234,66,0,1,53,55,97,250,192,57,169,101,0,95,125,93,192,110,154,+187,69,133,65,166,172,1,224,26,1,192,72,64,108,101,4,66,77,74,177,+72,38,1,67,32,145,55,225,137,1,8,66,64,46,114,101,116,117,114,110,+193,195,128,80,224,48,17,0,36,225,187,1,2,95,57,52,102,14,152,104,+251,147,0,2,95,53,50,100,44,0,51,225,158,0,225,248,11,99,61,226,+191,6,238,31,16,65,58,242,101,16,4,81,117,97,108,68,96,86,242,101,+19,220,232,251,67,0,97,41,254,2,5,128,59,140,150,5,49,51,50,32,+95,50,99,129,226,234,8,240,0,4,217,209,76,150,97,43,3,95,52,49,+48,244,59,5,192,0,64,201,133,147,234,98,2,235,21,4,230,182,14,1,+49,54,234,72,5,240,249,4,0,102,160,147,166,114,134,163,64,41,224,9,+3,234,20,1,232,59,2,224,74,7,2,116,104,101,162,7,224,77,0,224,+76,49,3,101,108,115,101,224,76,6,224,210,6,104,112,224,237,11,0,53,+73,240,224,237,22,164,39,0,57,98,65,250,158,15,245,180,9,226,117,10,+135,16,130,115,64,34,136,183,64,157,162,140,128,26,131,214,130,36,151,5,+64,37,167,31,224,198,13,0,55,224,198,16,1,108,101,114,106,224,199,0,+0,54,84,73,161,68,224,244,10,129,149,193,71,64,119,183,124,226,44,14,+170,79,224,73,9,1,99,97,161,148,225,147,0,224,39,13,0,111,225,102,+5,0,54,65,237,128,120,0,54,227,163,3,241,169,2,64,115,231,88,5,+0,52,94,239,115,73,224,99,1,75,204,133,6,197,159,195,7,164,194,227,+11,2,238,145,0,233,111,3,69,228,142,231,136,91,139,79,192,96,171,219,+227,9,4,224,61,4,227,69,16,225,24,2,224,242,4,233,128,7,64,233,+218,60,245,26,12,236,89,1,144,76,96,146,96,54,132,221,231,157,4,64,+36,232,125,6,2,49,54,48,90,123,162,16,230,182,10,99,28,128,81,133,+21,64,81,65,66,231,17,8,224,232,12,3,119,104,101,114,227,151,0,64,+234,248,218,14,0,48,228,168,0,225,168,7,113,186,97,127,96,141,202,231,+232,84,3,0,79,136,1,96,75,101,2,68,50,100,59,228,11,2,227,135,+6,65,8,98,89,225,88,16,226,68,2,0,49,75,171,237,27,7,72,51,+160,31,171,32,224,120,10,0,58,128,178,177,87,64,192,3,49,32,64,89,+252,229,0,64,220,81,232,179,235,172,46,96,223,113,155,243,118,3,97,133,+98,83,160,77,103,231,96,80,97,25,106,237,98,177,210,143,103,161,64,26,+139,46,64,29,0,54,224,139,4,128,200,0,57,124,119,96,37,161,223,129,+245,225,89,10,128,10,64,44,130,149,1,80,32,64,11,130,106,128,11,245,+90,4,98,58,99,176,96,166,235,9,6,1,56,57,235,9,25,141,193,98,+151,224,39,19,173,69,242,241,12,199,104,147,86,169,179,232,171,0,64,135,+96,39,149,136,171,98,112,235,225,114,0,130,42,241,197,33,235,140,31,235,+160,21,229,97,0,105,26,238,58,0,224,24,10,145,137,64,202,241,118,52,+98,177,226,209,5,192,13,239,237,11,177,115,241,107,14,1,49,53,87,238,+192,64,241,82,22,0,53,64,193,224,158,10,142,17,128,69,64,101,1,53,+56,156,13,224,147,6,224,82,12,152,195,224,82,9,1,53,56,98,82,192,+82,96,97,224,82,7,228,95,3,194,32,168,144,133,63,224,87,8,230,36,+2,162,139,225,58,18,110,249,74,91,0,53,97,102,73,223,129,51,229,65,+11,9,95,112,114,105,109,105,116,105,118,101,198,48,0,56,164,109,224,163,+5,231,132,4,243,250,1,159,86,224,45,8,241,168,32,226,20,17,129,71,+160,146,75,153,132,241,229,104,6,99,229,133,104,237,85,0,224,109,3,230,+141,5,226,218,1,64,160,227,232,10,96,56,133,142,167,178,241,132,3,224,+75,51,196,59,224,165,7,192,230,217,83,64,36,238,35,27,6,67,32,95,+50,50,56,32,155,13,187,105,228,159,14,142,16,65,70,205,3,155,44,1,+64,35,226,60,0,224,18,0,96,0,65,86,198,7,174,16,240,22,0,192,+198,149,167,100,252,64,173,108,42,237,65,5,136,238,1,49,55,226,108,2,+6,66,64,46,85,83,117,109,135,176,201,16,110,20,5,49,52,54,32,95,+51,103,134,96,240,1,49,55,76,116,166,89,97,77,224,31,1,64,0,0,+73,101,245,64,208,145,238,1,52,54,70,30,65,138,234,253,0,66,45,106,+253,98,188,237,112,16,5,115,116,114,105,110,103,237,112,10,163,51,141,112,+0,75,64,56,161,46,64,81,211,237,64,104,65,55,160,104,243,234,0,155,+211,68,79,71,179,1,51,53,218,44,3,95,56,51,50,242,98,4,96,54,+230,213,4,143,89,134,214,68,101,242,177,14,178,219,228,156,10,129,140,138,+177,64,7,160,23,64,117,0,52,128,117,227,112,5,64,103,200,174,128,129,+96,232,128,129,69,58,231,88,5,99,135,233,73,10,224,16,33,249,217,0,+228,234,7,162,97,224,108,7,107,77,110,92,188,159,99,36,192,68,224,23,+40,240,179,3,225,54,1,226,218,0,183,230,208,183,169,51,160,6,229,137,+3,224,185,7,234,13,1,235,254,0,224,92,1,69,42,163,245,96,53,245,+30,11,224,64,10,193,188,128,64,133,43,245,89,12,163,111,227,250,3,224,+205,3,64,204,250,130,5,236,11,7,236,97,11,95,177,224,231,4,234,169,+32,224,75,9,69,142,224,253,34,224,250,2,64,60,129,112,224,249,16,224,+247,3,224,244,0,224,236,3,236,247,7,104,62,247,224,0,227,192,0,64,+103,234,95,12,64,189,233,164,14,251,86,2,232,42,13,82,218,64,122,104,+98,152,152,1,53,55,167,196,160,242,236,39,13,187,34,3,49,53,55,49,+194,173,147,10,175,141,131,200,231,211,9,239,143,15,240,235,5,224,55,9,+239,153,6,97,55,233,70,4,106,208,224,57,11,2,114,101,99,224,113,4,+212,241,224,64,7,231,243,1,231,200,8,64,49,119,223,64,1,87,222,96,+20,249,85,4,99,189,161,143,133,105,184,13,248,18,0,96,26,133,77,64,+70,224,23,5,229,75,17,226,88,5,1,60,45,160,203,184,14,0,56,108,+118,98,72,64,70,216,114,1,53,54,88,114,97,208,128,15,152,114,69,117,+64,6,120,114,64,35,224,116,16,227,10,0,248,114,22,0,53,103,227,96,+8,141,132,64,91,229,147,6,80,57,236,236,24,229,21,2,255,243,3,130,+89,255,240,10,135,219,0,50,102,104,150,138,64,131,97,217,228,108,8,248,+60,6,96,166,0,54,96,166,0,85,237,28,1,2,67,32,60,167,88,0,+83,224,18,5,122,72,231,125,4,96,17,183,112,135,126,160,121,224,39,6,+135,165,160,38,0,90,224,38,3,117,28,0,53,106,167,96,141,130,95,4,+83,32,73,32,64,66,25,168,215,128,221,1,49,48,118,127,137,122,96,18,+213,57,149,52,0,35,69,187,225,16,4,224,31,6,132,248,224,61,8,0,+56,139,121,2,56,51,48,226,95,2,1,91,93,132,184,224,45,29,1,40,+41,169,46,224,36,19,244,37,2,98,90,138,251,64,245,209,222,168,145,77,+193,232,231,6,134,186,121,12,65,104,1,85,32,225,155,6,65,78,224,48,+4,130,8,224,48,0,161,125,225,152,7,130,116,224,37,10,96,0,64,154,+169,44,227,26,11,69,157,197,50,230,126,2,110,162,64,11,192,7,192,19,+96,79,233,69,1,247,8,7,64,7,84,227,96,38,132,6,164,82,232,233,+2,70,236,224,24,1,96,172,128,24,70,75,245,60,3,234,222,1,245,59,+1,103,220,234,17,0,64,146,134,80,67,193,235,71,0,236,75,1,67,72,+85,131,232,235,4,69,153,228,35,12,0,53,65,58,68,14,129,65,227,123,+8,3,83,32,95,51,167,139,0,53,128,156,64,121,0,54,224,231,4,244,+220,1,96,35,164,177,0,51,68,193,64,86,228,193,3,196,124,0,50,128,+45,225,166,16,224,185,2,93,156,228,126,4,225,211,10,228,214,1,81,117,+228,249,1,248,88,0,224,35,5,134,165,247,11,14,233,95,9,102,218,136,+157,225,40,0,64,9,0,49,128,196,185,114,224,178,2,175,106,229,49,19,+174,220,228,235,23,64,95,130,84,241,155,176,97,49,192,30,193,60,128,13,+238,35,0,224,89,1,66,37,145,158,128,9,105,107,139,32,248,152,1,241,+185,17,96,33,192,19,241,185,1,224,184,2,66,19,224,64,10,240,63,10,+224,184,17,240,63,2,224,89,3,96,6,224,89,14,234,214,5,224,89,2,+207,197,224,90,7,233,182,13,64,102,174,211,96,40,241,238,4,99,97,0,+52,66,101,151,88,78,178,202,240,241,253,10,133,200,66,25,64,130,224,142,+21,233,81,7,64,78,103,127,137,83,0,75,226,173,0,0,52,132,208,111,+214,92,217,155,182,128,180,175,195,78,177,207,201,128,163,143,113,65,63,164,+85,0,95,144,3,113,36,110,114,239,238,20,239,193,5,64,73,133,25,224,+132,7,0,51,64,230,224,132,23,0,54,131,205,2,57,52,57,230,174,9,+102,102,232,94,7,232,114,11,224,39,11,64,99,0,67,168,26,192,19,64,+177,0,85,64,108,128,147,97,144,136,107,240,239,5,224,57,9,64,23,102,+251,147,136,128,12,76,46,127,132,224,61,4,65,160,224,246,5,240,235,1,+128,90,224,168,5,65,226,224,110,7,67,74,224,168,2,225,60,2,160,134,+224,175,7,224,196,12,225,19,7,81,158,224,19,8,110,82,224,126,6,145,+40,192,81,0,57,69,18,128,100,224,98,7,224,56,6,101,191,224,183,5,+224,60,2,224,161,11,234,79,7,104,161,224,84,6,135,130,224,59,6,224,+78,12,224,37,2,196,140,224,239,7,225,2,11,64,238,224,19,7,225,149,+10,125,105,131,130,225,127,18,224,240,0,224,62,8,64,23,224,182,11,75,+85,226,72,5,161,240,132,12,224,86,7,225,51,7,65,115,224,106,6,137,+169,224,103,0,194,177,224,120,9,224,112,6,226,56,15,64,248,234,74,11,+224,117,5,129,167,226,252,7,230,117,0,227,103,27,64,169,66,223,162,230,+224,238,11,64,78,226,175,7,225,88,16,226,35,18,225,80,2,100,136,169,+73,228,136,12,119,213,224,18,5,64,169,224,134,6,64,97,226,30,24,224,+20,23,224,237,31,224,56,6,227,14,22,225,223,7,64,240,170,42,128,240,+228,178,8,226,135,9,160,54,170,67,64,54,66,182,0,80,156,96,96,39,+82,98,224,131,4,224,13,27,226,37,4,224,20,6,128,120,64,117,169,244,+192,117,0,66,148,66,116,146,225,46,4,105,57,224,26,13,96,117,148,126,+224,26,7,199,184,64,202,65,110,174,143,96,22,227,217,11,3,85,32,75,+50,225,110,9,224,118,13,96,195,224,91,9,96,22,226,45,14,224,46,10,+96,215,229,249,3,229,91,4,224,125,16,99,249,224,243,12,225,13,0,224,+103,4,96,21,226,13,7,224,102,2,226,178,13,224,69,7,101,123,225,55,+11,95,210,0,52,232,86,3,31,92,34,115,114,99,47,77,105,99,114,111,+72,115,47,69,120,112,114,46,104,115,92,34,44,53,54,56,58,49,53,58,+32,72,111,224,45,1,25,72,97,115,76,111,99,32,69,68,101,102,58,32,+117,110,105,109,112,108,101,109,101,110,116,101,100,140,76,66,40,203,189,64,+187,1,57,32,200,101,201,62,98,171,65,14,143,128,2,49,51,50,207,246,+151,75,110,227,174,252,128,34,74,58,121,147,160,28,107,219,224,25,12,239,+22,0,0,58,128,122,105,91,98,177,1,64,66,83,5,110,187,97,17,160,+35,178,79,227,128,5,193,44,64,32,178,27,130,244,2,80,32,75,224,36,+8,224,15,9,225,115,8,64,71,0,54,224,140,6,0,80,200,198,224,146,+8,133,4,234,18,33,2,80,114,111,129,123,234,19,8,73,252,110,107,237,+95,1,64,21,132,61,73,56,98,172,0,67,213,22,64,97,1,64,75,99,+20,81,193,0,48,128,45,208,6,1,80,32,102,229,143,135,64,42,64,89,+250,2,12,6,108,105,116,101,114,97,108,64,147,229,197,32,241,65,9,186,+41,179,77,101,131,65,7,125,138,110,209,138,57,224,35,21,201,244,0,83,+229,190,11,224,54,17,152,154,243,25,11,224,149,24,213,233,129,128,209,3,+1,80,32,104,244,129,60,64,35,192,21,240,218,1,64,116,192,21,128,159,+96,21,215,65,177,40,160,21,194,77,96,23,98,241,144,139,64,133,241,91,+3,172,217,241,92,6,64,21,5,10,65,32,75,32,65,128,52,130,16,0,+75,71,236,64,14,165,231,141,55,240,122,11,246,171,4,4,102,111,114,97,+108,97,236,64,26,181,226,0,55,66,107,176,134,67,67,240,9,7,106,221,+64,107,246,68,17,205,226,93,97,64,239,99,12,1,95,56,66,189,96,66,+0,48,65,80,66,242,78,2,251,182,11,96,52,224,39,1,241,250,4,183,+144,64,129,246,127,0,1,53,52,81,189,64,25,248,153,6,240,72,1,124,+36,64,76,224,100,0,1,51,50,241,80,9,64,39,130,156,224,41,16,0,+61,224,41,1,96,158,238,106,6,64,49,225,22,14,241,194,5,224,71,0,+193,120,0,54,80,71,215,91,64,91,224,70,28,224,184,0,247,162,1,193,+191,64,70,130,109,224,70,12,88,56,64,14,244,89,14,0,56,194,49,244,+89,3,65,68,224,150,28,1,58,58,226,86,7,81,27,224,150,0,216,204,+159,79,210,78,249,239,4,0,83,127,171,189,37,67,255,189,52,254,155,7,+128,174,247,29,2,195,199,0,73,64,6,101,19,65,171,64,7,178,192,242,+223,8,240,190,5,224,134,2,117,41,96,176,131,103,195,154,64,22,131,181,+64,87,160,24,245,98,7,64,29,163,35,242,115,4,128,176,2,53,48,53,+128,64,254,111,5,100,245,128,90,0,48,245,108,1,64,115,104,194,160,25,+226,99,17,96,86,195,90,0,53,103,154,64,48,162,77,182,251,0,52,95,+157,81,127,1,52,57,179,59,64,118,64,39,162,46,230,27,12,4,76,73,+100,101,110,123,78,225,130,6,135,196,165,94,225,179,1,77,145,73,54,129,+190,70,196,103,5,0,54,95,97,2,95,52,56,69,168,0,66,224,130,1,+115,18,192,70,217,136,101,184,103,62,129,202,192,30,129,148,64,234,135,152,+3,49,53,48,50,99,238,102,41,130,212,165,222,243,35,2,254,176,4,2,+56,32,35,158,220,252,10,5,224,22,1,226,33,5,64,110,130,180,103,21,+110,109,132,99,149,124,98,65,65,122,103,185,64,74,96,180,64,29,85,47,+160,23,160,191,64,76,167,201,0,39,225,197,10,64,75,250,148,0,160,148,+0,49,149,111,0,67,247,57,2,224,37,12,140,27,245,162,3,224,40,12,+72,33,224,77,8,192,11,1,95,54,108,63,224,140,0,64,196,251,36,1,+236,63,1,234,251,10,105,169,0,90,162,4,250,24,4,0,35,148,1,192,+127,131,118,128,16,0,57,64,250,0,53,121,204,224,187,8,97,43,131,99,+71,186,1,95,55,91,241,122,206,0,48,96,194,64,30,131,100,199,18,64,+23,130,21,100,102,98,20,0,95,69,8,100,15,0,95,102,183,1,64,58,+96,117,64,39,246,158,62,1,49,52,222,219,254,18,9,5,109,111,100,117,+108,101,233,231,0,135,215,245,46,13,124,91,214,204,195,198,1,52,56,128,+50,224,51,28,225,62,1,76,99,192,55,224,45,2,0,56,128,45,133,210,+224,26,12,224,194,10,5,112,97,116,116,101,114,223,20,215,107,224,144,22,+224,71,10,2,116,121,112,225,8,0,183,201,224,176,24,164,32,224,77,10,+5,100,101,102,97,117,108,223,225,160,149,231,144,6,1,52,57,133,44,255,+77,4,96,83,230,199,15,94,226,225,122,0,0,57,66,214,64,48,0,54,+224,48,18,132,59,71,119,64,41,167,34,229,67,12,135,173,172,207,229,68,+15,128,31,132,203,135,8,102,251,3,66,32,64,66,64,5,71,24,131,89,+224,88,8,170,248,224,38,0,227,134,3,0,64,232,28,5,229,74,0,138,+112,196,176,64,177,142,152,224,23,15,65,244,237,246,0,96,240,253,88,5,+136,87,230,92,9,97,38,230,92,17,0,81,230,93,28,64,146,230,80,44,+224,206,17,96,154,132,97,141,87,2,67,32,95,66,146,3,49,52,57,48,+94,149,100,136,224,168,1,0,105,131,4,224,42,27,7,100,101,114,105,118,+105,110,103,224,48,32,4,99,108,97,115,115,96,45,205,103,159,21,225,200,+6,224,49,2,8,95,112,114,105,109,105,116,105,118,131,85,224,39,16,2,+99,97,115,128,33,225,189,5,201,56,224,110,31,3,100,97,116,97,224,104,+21,227,146,3,224,107,6,192,108,225,9,27,236,153,2,224,155,32,0,111,+224,153,21,1,101,108,225,2,60,5,102,111,114,101,105,103,162,4,224,49,+28,1,105,102,224,152,21,4,105,109,112,111,114,161,49,225,50,7,225,51,+35,3,110,101,119,116,197,94,226,201,29,3,102,105,120,114,225,99,36,96,+50,224,205,22,224,85,1,225,104,53,6,105,110,115,116,97,110,99,160,207,+224,50,28,1,108,101,129,70,224,45,29,0,109,226,49,23,231,183,2,226,+204,52,2,116,104,101,130,47,224,250,31,0,111,226,49,22,231,141,3,225,+100,53,226,48,0,224,33,16,3,119,104,101,114,227,55,12,101,55,137,122,+2,66,32,89,134,175,224,5,18,160,144,69,161,221,220,159,148,157,215,144,+230,141,232,6,80,32,95,53,54,48,32,107,240,1,53,54,138,22,160,33,+134,220,0,85,64,23,170,65,160,20,138,140,128,69,128,205,96,2,103,59,+133,250,65,167,0,73,116,209,96,203,72,163,224,12,5,96,225,0,52,125,+92,64,7,65,6,64,7,70,86,64,7,105,93,96,141,0,95,96,123,64,+254,202,106,0,67,70,241,115,116,96,39,74,86,128,129,224,139,1,96,55,+70,168,129,160,142,166,64,47,136,158,224,47,11,224,57,3,105,81,160,57,+224,64,6,136,202,224,54,11,224,152,1,224,53,9,0,54,233,21,0,110,+177,201,24,74,2,128,77,237,57,6,235,7,21,241,43,0,1,49,52,103,+141,240,13,6,1,46,46,228,222,0,144,87,64,8,0,54,178,14,202,228,+192,14,111,36,96,172,233,201,6,75,6,232,64,16,5,83,121,109,79,112,+101,100,120,244,185,8,131,2,232,83,2,64,16,232,83,0,144,86,72,87,+98,252,172,174,146,172,128,51,224,23,3,0,49,116,188,233,169,1,136,81,+82,233,78,166,0,79,77,131,0,54,211,63,224,31,12,64,88,192,30,224,+150,6,232,234,4,129,195,239,72,18,104,232,96,96,0,55,233,0,1,99,+194,2,52,55,49,247,156,4,64,84,0,55,193,118,160,183,239,95,23,97,+112,233,177,19,233,176,36,111,148,224,166,1,233,149,29,66,41,175,223,1,+52,53,76,104,66,97,0,64,66,126,121,65,130,23,235,75,17,146,7,238,+145,4,225,77,0,193,211,228,209,5,97,1,246,6,4,66,198,97,2,244,+3,5,130,207,64,30,180,130,236,22,11,77,232,226,221,0,0,55,64,186,+0,58,140,163,235,44,8,139,35,64,29,177,216,0,54,226,116,5,1,64,+35,84,26,107,84,1,49,52,69,47,87,227,66,159,64,50,131,254,146,250,+1,52,55,65,62,64,21,0,54,131,198,98,212,8,52,55,52,32,64,104,+101,97,100,96,188,250,68,10,12,108,105,98,47,68,97,116,97,47,84,101,+120,116,154,65,5,49,48,48,58,49,55,250,65,7,64,36,0,46,128,36,+9,101,97,100,58,32,101,109,112,116,121,99,218,64,115,228,58,1,96,186,+109,204,1,95,50,65,180,65,145,64,33,227,192,19,0,81,227,193,200,236,+172,11,227,180,51,227,45,18,97,93,131,173,0,79,245,133,8,224,17,3,+1,60,45,224,17,7,130,203,224,17,3,142,75,224,17,3,0,61,160,17,+245,200,4,128,14,238,81,0,128,14,246,196,0,225,32,1,64,154,245,37,+1,193,3,66,134,65,2,64,29,188,116,200,174,173,209,0,54,68,126,64,+30,131,99,115,205,0,48,242,133,0,136,222,242,150,1,129,84,0,54,80,+55,245,217,4,242,79,4,0,58,99,118,160,108,123,57,0,52,82,79,243,+165,6,72,21,64,41,131,140,67,89,0,75,163,108,64,44,194,226,116,99,+64,6,245,217,1,97,165,192,12,178,102,1,54,54,160,250,0,90,136,158,+246,37,7,96,35,247,85,18,0,53,135,95,67,238,64,41,163,65,193,7,+64,25,84,249,67,0,233,98,0,135,148,147,183,241,72,0,66,99,96,74,+3,57,51,32,95,199,97,137,248,160,203,133,103,224,205,6,245,50,6,160,+53,224,227,3,224,67,0,192,104,0,85,226,56,2,1,91,93,100,29,224,+88,4,111,152,192,11,211,230,131,92,245,115,7,96,246,224,239,4,244,154,+3,0,66,129,181,161,220,80,9,81,235,2,67,32,79,195,158,64,64,194,+121,97,126,192,4,200,237,73,206,133,38,149,210,97,51,106,162,104,214,64,+141,160,189,243,91,13,64,66,202,3,177,161,248,72,13,1,95,49,87,179,+204,2,224,106,17,132,50,226,214,3,97,226,130,88,243,41,9,0,58,128,+153,231,36,10,0,39,231,37,7,1,95,54,92,28,2,95,54,50,64,35,+1,52,51,92,48,68,173,100,177,231,69,13,133,98,231,69,4,230,147,3,+96,0,64,128,166,179,224,179,0,64,19,179,94,229,232,12,0,85,232,57,+39,100,8,232,56,35,67,51,164,49,0,66,68,36,104,224,132,122,1,49,+48,68,166,89,131,130,34,100,85,95,152,226,55,6,64,78,232,123,78,232,+121,10,232,120,10,65,224,98,154,0,95,67,125,0,56,118,189,64,22,163,+16,4,53,52,49,32,85,77,8,1,49,52,129,2,2,85,32,80,96,151,+0,49,64,113,251,35,7,99,113,0,57,245,58,3,16,92,34,115,114,99,+47,77,105,99,114,111,72,115,47,76,101,120,135,246,5,52,55,49,58,50,+51,135,246,64,83,173,32,128,122,131,74,190,107,96,105,136,201,2,52,57,+32,64,15,250,200,1,151,121,236,201,4,64,22,76,140,157,134,224,25,8,+132,184,192,30,99,163,192,25,0,66,96,53,103,178,126,223,202,189,0,53,+189,126,160,19,160,15,0,58,96,142,129,253,192,2,64,31,224,13,5,64,+180,65,86,148,155,0,73,96,207,0,52,130,199,0,75,224,39,2,97,176,+227,172,1,0,95,156,69,64,60,128,165,0,95,123,224,64,15,135,176,123,+204,96,75,233,148,1,228,22,1,64,159,88,193,65,175,132,170,160,201,64,+25,231,179,2,1,94,42,129,125,224,27,10,10,32,32,102,111,117,110,100,+58,32,32,32,161,162,129,37,224,92,0,99,36,101,142,64,16,133,236,99,+248,231,206,4,2,69,79,70,64,61,167,162,160,62,72,248,79,116,128,150,+224,120,8,7,101,120,112,101,99,116,101,100,162,27,96,200,67,150,1,55,+52,67,226,242,180,5,194,49,65,22,194,18,1,49,52,100,225,129,80,65,+50,133,179,96,25,102,85,64,81,64,34,142,86,64,30,0,35,66,182,96,+4,65,116,197,112,65,123,219,134,0,83,131,86,79,229,199,83,64,7,69,+222,135,11,192,25,234,76,8,64,22,250,194,13,224,65,0,162,133,66,9,+234,64,7,198,181,224,69,12,228,160,1,224,69,3,138,163,96,22,164,7,+224,91,6,225,67,2,225,119,1,242,130,5,126,204,224,120,0,134,83,102,+246,70,65,162,81,1,64,83,240,231,1,64,106,0,66,227,100,2,224,165,+3,128,44,96,163,162,7,65,91,223,151,0,89,159,130,224,182,0,224,13,+1,104,179,165,89,1,85,32,236,74,8,228,85,13,3,54,52,58,54,164,+85,224,44,1,7,108,97,121,111,117,116,76,83,160,221,129,35,225,176,6,+64,189,192,25,224,2,0,128,47,64,37,128,1,225,220,4,106,90,224,79,+1,224,5,0,96,197,224,53,16,129,13,224,231,0,97,42,160,43,224,113,+0,224,56,12,99,241,224,29,1,98,222,225,102,3,224,31,6,104,120,160,+144,160,99,129,162,64,7,65,90,227,41,0,124,227,169,163,168,184,129,198,+0,80,98,50,71,199,221,83,224,52,1,192,0,224,140,14,192,229,224,139,+2,147,35,225,111,2,66,154,96,239,197,49,225,9,1,229,64,2,194,83,+192,202,225,97,8,196,246,250,172,1,142,15,224,34,0,192,91,96,11,164,+24,96,43,1,52,57,82,122,224,42,1,224,245,1,72,10,104,253,98,234,+224,252,13,96,121,224,44,10,159,212,64,73,228,137,0,228,133,0,64,0,+64,11,138,240,227,148,0,128,28,231,96,0,192,184,228,92,5,104,161,129,+57,64,5,102,197,163,110,161,77,97,1,5,67,32,95,50,50,56,160,216,+164,33,193,34,224,218,11,96,33,224,173,4,104,167,96,146,232,168,2,224,+184,3,129,119,133,4,161,189,193,94,161,155,225,195,1,64,185,224,232,0,+224,152,1,225,64,0,224,151,21,160,106,225,118,0,129,163,193,48,65,58,+170,236,224,158,3,224,88,43,128,172,192,88,231,73,1,64,94,226,13,13,+96,46,64,30,1,95,55,76,181,224,0,0,228,63,9,193,46,227,205,4,+202,67,224,26,0,227,63,5,224,30,5,163,65,229,40,2,99,43,224,29,+0,131,15,224,103,0,230,66,6,224,75,5,226,117,1,230,102,11,129,96,+132,30,225,30,1,64,97,226,165,1,2,48,56,32,162,87,64,0,227,188,+3,98,142,128,246,192,106,128,213,227,150,1,1,95,49,75,189,82,125,3,+95,49,53,57,224,72,2,160,59,224,122,7,227,57,2,0,67,131,110,2,+32,95,54,65,195,229,221,7,7,32,101,114,114,111,114,32,125,206,5,141,+222,1,52,51,164,220,228,226,1,64,0,225,117,14,229,65,5,193,117,128,+11,98,236,224,10,8,134,180,231,88,20,185,251,192,73,136,67,193,140,101,+145,128,13,194,116,224,146,5,194,90,224,146,5,228,243,0,96,7,95,172,+224,33,1,195,151,225,153,0,226,45,17,164,62,227,165,7,1,49,54,229,+23,10,167,143,128,66,227,144,6,227,146,0,114,127,227,51,12,65,90,139,+226,227,181,15,224,0,3,226,134,13,229,71,5,160,149,96,38,64,23,99,+149,229,162,3,231,141,1,225,90,6,224,200,0,194,0,97,84,224,16,3,+96,89,128,22,225,54,0,129,85,224,13,9,226,229,1,64,159,80,52,98,+105,194,76,224,166,3,75,199,64,167,233,65,0,231,78,8,162,227,65,61,+121,194,96,40,226,75,1,5,115,121,110,116,97,120,130,234,226,232,25,73,+102,141,196,64,125,141,155,0,85,140,129,173,96,0,50,77,78,70,116,172,+66,0,65,170,248,141,96,0,85,64,29,64,157,110,29,0,66,97,222,65,+28,162,116,226,111,0,226,113,0,224,19,20,161,8,1,85,32,238,30,19,+11,67,111,109,112,105,108,101,67,97,99,104,101,137,209,4,57,50,58,49,+56,206,38,224,100,8,3,66,32,95,56,83,137,3,49,48,48,57,64,251,+225,75,2,226,254,16,101,65,160,54,0,52,154,84,224,54,1,193,174,192,+2,128,39,0,56,117,66,224,38,1,160,73,224,86,1,3,67,32,95,57,+168,37,64,84,163,181,65,199,0,55,79,108,194,25,1,56,48,235,87,2,+65,105,0,51,142,10,128,68,228,87,0,64,88,66,164,64,32,176,223,6,+56,54,57,32,75,32,85,123,68,224,123,4,139,234,78,240,0,55,92,36,+224,89,1,0,54,128,56,0,54,77,62,96,189,77,161,1,49,52,84,118,+96,31,140,220,143,191,66,135,109,198,0,56,124,159,160,14,237,148,2,0,+61,129,128,82,33,96,68,131,132,64,70,180,38,0,49,68,52,0,51,69,+219,160,29,120,66,0,48,75,230,64,17,64,246,0,95,70,102,192,30,64,+58,130,155,67,55,80,80,0,48,81,8,128,138,1,48,53,65,64,192,152,+0,48,130,214,192,68,128,7,128,252,224,42,12,135,153,81,153,128,18,96,+136,1,53,49,78,118,1,57,50,200,207,160,111,96,7,96,26,241,168,1,+224,99,4,128,31,65,251,97,186,64,182,246,97,1,225,37,6,0,84,141,+67,162,171,100,77,239,46,0,97,88,1,95,56,254,130,1,239,9,8,232,+131,0,112,93,99,111,2,95,49,52,115,154,224,38,4,96,131,131,178,2,+80,32,35,150,68,64,18,244,29,2,1,95,51,153,236,0,51,100,27,1,+51,56,65,118,1,51,52,119,244,1,52,56,97,108,77,76,64,32,92,232,+96,0,69,155,72,56,0,51,93,174,77,149,68,50,64,112,236,54,2,160,+159,101,188,165,159,64,161,232,253,0,192,174,64,142,66,245,132,84,0,52,+196,85,64,27,162,145,2,49,52,48,129,211,88,255,64,26,130,229,88,194,+191,60,64,122,193,213,1,51,57,99,219,96,44,224,7,0,96,8,65,193,+146,35,64,19,206,79,128,168,166,211,174,86,128,75,133,91,70,230,96,31,+135,181,131,148,101,138,71,186,64,6,152,53,1,49,52,134,167,230,21,1,+64,115,65,49,102,201,128,82,224,135,0,116,180,96,65,128,237,186,163,134,+83,132,61,0,49,76,240,235,197,1,129,129,169,96,230,69,0,160,40,111,+94,128,42,160,37,247,117,1,1,49,51,66,200,103,14,114,254,192,143,230,+191,0,164,25,224,74,0,224,42,2,129,82,128,167,161,90,225,188,0,99,+213,160,246,64,194,131,219,138,200,138,87,128,174,64,76,181,251,229,95,0,+224,113,6,192,34,64,86,163,56,64,94,129,228,225,1,12,233,141,1,192,+19,160,95,161,193,165,105,225,3,2,132,132,232,198,2,97,232,162,167,97,+173,67,20,64,41,64,249,161,53,99,105,97,14,100,171,207,53,162,22,96,+18,225,18,3,0,49,129,9,131,243,224,53,0,0,50,154,78,64,29,128,+22,1,48,48,96,5,0,49,67,209,89,186,99,170,64,33,189,181,2,49,+52,49,118,159,224,39,0,228,53,1,1,67,39,132,47,0,58,128,121,225,+33,37,224,252,1,226,59,0,129,21,224,207,3,211,44,224,244,1,180,191,+65,161,224,191,9,87,3,192,191,64,41,224,191,22,0,83,224,191,2,0,+54,229,26,0,227,183,0,192,118,96,31,211,80,224,223,11,199,172,193,236,+206,213,225,203,7,96,223,96,25,224,19,1,185,231,72,3,162,193,224,207,+2,95,8,206,196,64,139,154,223,67,13,226,220,2,196,16,128,139,173,101,+162,214,227,134,5,224,169,7,224,162,0,226,116,11,228,195,1,226,137,11,+226,127,0,226,191,2,224,79,15,1,52,48,96,248,224,79,7,141,146,163,+116,160,82,0,50,128,224,199,94,228,53,5,226,4,0,226,178,4,254,134,+2,134,78,64,68,230,229,0,129,200,160,7,64,28,226,247,12,93,74,226,+55,0,194,247,1,51,57,121,6,192,27,0,58,129,164,224,60,9,70,176,+192,60,68,126,251,73,17,69,156,160,90,106,249,1,48,53,96,147,68,208,+224,86,10,0,53,224,86,2,229,145,0,195,63,180,185,65,120,129,125,226,+153,2,226,92,7,129,178,224,38,18,225,137,3,224,38,18,226,0,3,224,+77,26,64,7,224,77,26,64,7,224,38,18,136,233,224,77,24,198,19,224,+194,22,192,38,137,121,224,38,24,166,41,230,67,9,103,119,140,83,226,244,+0,192,62,130,238,192,140,192,44,128,9,228,131,9,1,75,52,204,31,224,+31,14,0,51,224,31,22,0,50,224,31,21,2,67,39,66,224,32,11,66,+216,234,81,0,224,59,15,0,66,165,31,224,58,9,194,155,224,26,9,75,+201,224,26,14,74,71,224,26,3,130,1,128,7,66,228,203,143,195,120,164,+252,64,26,231,127,11,132,247,105,118,0,39,128,41,119,250,151,255,67,253,+152,89,241,42,8,133,105,224,32,5,241,8,12,227,132,3,98,46,224,116,+12,192,95,128,70,149,88,1,75,32,224,139,2,192,105,241,37,13,224,141,+5,128,35,0,80,238,175,0,231,29,1,242,242,1,64,147,233,51,1,197,+232,104,193,253,51,7,128,186,224,41,27,2,79,32,35,92,155,224,235,0,+101,214,208,25,224,44,11,0,49,224,44,0,65,176,132,206,226,221,19,224,+38,21,226,228,0,224,38,21,226,235,0,160,0,129,100,224,58,5,98,47,+198,2,1,80,32,97,96,144,58,0,48,133,251,0,90,96,1,229,147,0,+204,124,101,172,142,201,192,7,113,109,0,58,128,85,226,153,0,224,181,7,+64,31,200,140,224,31,6,96,174,64,31,229,247,1,98,217,195,35,64,26,+0,54,224,58,12,137,89,64,31,133,249,224,58,0,201,161,64,26,227,47,+6,199,9,64,26,131,47,224,26,0,198,162,64,26,202,15,192,26,162,225,+64,26,129,31,65,248,78,215,0,75,223,110,255,120,2,255,131,3,255,216,+11,133,30,128,32,96,31,255,199,10,128,107,129,118,224,105,1,1,51,56,+69,147,64,7,69,116,96,103,128,18,0,64,224,29,1,0,58,133,128,4,+10,65,32,79,32,64,11,222,140,64,11,129,98,109,240,137,196,193,196,232,+245,4,168,168,96,103,99,70,64,58,129,130,224,53,1,128,34,224,70,0,+128,14,224,11,2,192,8,98,30,96,65,225,164,0,1,52,48,240,20,0,+174,193,78,173,200,250,238,219,6,105,101,224,14,6,224,42,13,96,68,224,+42,8,224,15,0,127,160,96,136,220,154,128,138,225,162,3,0,66,242,25,+2,224,95,14,160,245,224,45,5,224,42,8,239,139,11,224,14,0,146,201,+126,170,224,0,1,224,82,4,224,79,13,0,56,250,61,2,192,44,224,41,+14,246,233,1,225,85,13,98,57,128,43,87,171,96,0,128,29,160,97,65,+39,131,31,111,114,96,67,129,46,229,117,1,64,4,0,80,79,204,224,102,+15,161,49,224,88,1,235,245,7,224,5,9,240,221,0,140,237,224,144,1,+225,114,24,225,78,0,225,73,21,193,196,96,131,246,10,0,224,188,1,224,+173,1,224,128,6,129,19,228,24,0,1,52,48,211,91,224,101,17,225,20,+12,76,174,226,150,2,225,176,6,64,99,203,125,224,99,2,226,235,22,128,+83,96,60,235,152,0,224,60,17,129,241,224,14,6,64,60,64,70,224,60,+2,240,160,0,190,160,65,97,224,19,6,79,33,224,19,8,224,39,11,68,+213,107,133,224,19,2,64,195,94,156,160,135,71,90,0,64,64,17,224,180,+34,224,84,9,68,176,224,84,2,162,22,225,170,17,71,163,228,81,16,97,+155,0,53,202,153,224,122,7,64,124,224,229,5,107,244,224,144,6,66,83,+224,144,3,227,116,4,224,236,14,0,53,110,11,224,113,9,225,27,38,225,+133,7,112,23,224,19,7,66,58,224,179,7,65,137,226,121,30,224,200,0,+224,18,8,224,84,6,114,46,225,8,8,195,143,224,217,29,161,144,229,57,+1,225,128,6,80,128,224,119,8,66,122,224,158,9,225,74,38,224,64,2,+72,93,128,0,225,74,6,225,93,11,101,48,224,19,6,226,37,10,79,204,+226,164,18,160,134,224,177,38,225,191,35,224,144,8,154,76,225,148,28,225,+194,21,119,159,230,10,5,225,201,0,73,141,160,0,225,201,6,64,98,224,+146,6,138,163,225,134,1,193,199,224,203,8,227,109,16,225,138,8,65,117,+224,18,6,226,65,10,130,64,228,33,18,121,84,227,20,12,226,212,33,200,+29,64,28,226,100,4,224,142,8,66,253,224,142,15,96,136,224,104,1,225,+153,21,224,45,6,163,92,224,120,1,227,92,7,228,40,10,226,36,33,233,+17,11,225,151,1,227,142,50,233,150,2,70,194,236,101,0,230,194,11,227,+161,57,224,208,7,101,168,226,151,5,168,49,227,80,18,227,225,11,230,134,+24,160,106,224,103,8,224,148,17,227,84,42,224,213,16,224,89,6,224,115,+18,227,98,50,224,83,1,128,77,227,219,3,106,177,65,22,160,216,227,18,+10,224,44,1,199,244,224,17,1,131,161,226,211,33,224,57,1,224,138,9,+164,180,224,175,3,230,145,0,66,130,238,200,0,0,52,79,157,1,51,52,+128,186,64,53,64,29,0,54,224,29,12,64,159,64,29,237,36,3,224,29,+1,145,252,96,7,237,66,1,203,41,208,124,0,53,108,241,5,95,49,53,+57,32,35,105,74,75,153,64,53,0,51,236,239,5,162,99,96,187,147,145,+1,52,56,83,226,0,80,149,48,107,224,123,250,0,49,65,134,64,6,105,+0,64,73,234,253,3,141,194,97,60,235,192,14,119,193,64,100,130,37,97,+126,226,254,15,137,251,235,114,3,226,90,6,64,154,64,3,226,119,13,64,+156,235,54,3,0,67,160,96,193,2,235,21,3,224,116,1,67,15,0,58,+131,73,228,51,17,96,202,224,18,5,65,103,226,53,6,138,118,231,191,90,+224,46,62,227,7,41,128,57,229,237,35,231,221,1,231,145,18,65,127,229,+179,5,229,3,19,198,63,224,95,1,224,76,3,224,127,7,163,244,64,98,+227,147,3,162,185,225,46,32,224,229,22,231,252,6,224,251,4,64,122,0,+54,226,93,19,66,235,230,125,7,229,50,10,170,216,224,19,5,237,83,10,+107,225,0,85,226,254,4,225,179,16,234,9,15,226,198,17,0,53,213,84,+224,77,11,241,168,5,225,224,1,224,161,7,232,190,2,239,57,11,241,51,+6,97,76,173,129,227,65,30,170,112,128,57,232,28,1,234,158,42,224,196,+1,225,143,8,227,48,10,104,53,65,123,229,17,5,228,14,17,160,205,240,+242,12,229,9,12,194,208,224,100,9,224,106,16,224,200,7,193,119,225,122,+41,214,239,229,223,10,134,68,0,49,230,77,13,227,150,16,224,100,1,241,+148,1,225,81,6,238,135,19,243,77,13,224,107,6,224,89,0,226,113,1,+226,215,11,225,143,3,224,31,11,226,81,2,232,232,0,229,110,36,64,0,+226,66,6,241,37,10,131,208,224,18,4,64,191,225,21,6,64,83,224,206,+94,228,34,15,234,239,4,180,149,228,101,38,231,63,17,226,194,13,227,161,+7,192,72,230,247,38,225,114,7,235,233,10,65,17,224,204,29,228,99,6,+226,169,23,227,87,12,225,25,24,236,55,21,229,47,43,0,54,97,243,224,+197,6,0,54,234,194,0,224,108,69,160,93,130,102,224,115,16,64,0,71,+43,234,254,3,229,176,15,238,181,11,224,153,0,0,52,96,41,225,238,1,+64,84,235,53,3,229,58,15,229,64,22,229,6,7,247,249,22,229,111,29,+162,55,227,166,16,129,51,229,102,6,2,54,50,32,235,160,0,64,109,229,+124,10,225,163,0,224,0,1,225,34,2,64,86,224,162,2,65,32,236,32,+6,128,94,236,34,0,1,85,32,124,60,224,15,2,0,65,96,58,64,57,+247,14,13,228,150,14,206,176,225,19,18,160,243,225,19,16,160,213,226,24,+13,231,201,12,160,21,224,252,5,162,126,215,116,225,8,0,236,66,5,0,+80,228,4,34,232,64,8,224,36,6,96,14,64,98,236,137,3,236,165,6,+65,32,224,27,16,235,35,32,161,216,224,21,0,178,73,64,67,139,4,250,+248,2,153,189,161,215,96,34,0,54,235,39,5,159,245,0,39,255,212,3,+0,83,128,147,237,143,8,128,119,192,174,251,236,5,225,73,15,229,217,18,+224,36,13,192,94,227,210,3,64,5,111,38,98,60,64,29,130,207,225,43,+21,230,150,12,64,60,238,227,5,225,132,5,226,31,12,228,5,16,229,46,+7,228,237,0,226,86,40,224,49,47,227,65,38,235,195,6,244,146,6,229,+84,4,89,172,225,38,15,73,146,253,96,8,0,83,251,111,1,160,45,228,+97,8,228,98,9,96,77,226,249,27,230,19,6,237,124,0,64,237,224,166,+16,0,54,228,188,12,225,203,14,228,152,3,225,55,23,161,232,64,99,241,+207,12,96,32,64,29,226,198,12,96,106,64,29,130,198,0,75,224,183,8,+130,161,253,151,8,64,11,131,208,160,165,225,111,7,161,92,224,8,2,96,+78,130,212,1,85,32,64,11,129,213,0,85,64,69,0,58,128,36,1,10,+65,108,160,3,56,49,32,95,122,202,192,140,1,95,49,160,17,96,112,224,+13,0,96,54,129,177,65,82,164,62,167,113,96,140,0,83,140,58,128,2,+64,12,96,13,224,38,8,224,8,8,0,39,129,112,178,40,160,224,64,2,+1,95,49,110,245,100,160,128,81,192,74,0,66,158,154,94,174,160,49,0,+79,198,215,0,49,68,202,141,100,97,116,0,51,96,210,0,50,65,21,1,+95,49,97,78,160,6,64,241,2,79,32,64,194,160,128,76,255,2,0,64,+98,64,71,1,61,61,171,171,128,179,0,85,160,187,192,7,2,66,32,90,+64,27,99,3,64,235,192,216,232,122,1,96,229,224,88,6,128,244,64,67,+224,57,7,129,20,160,45,103,171,128,107,224,38,16,0,67,103,210,101,241,+1,95,49,123,63,0,75,72,209,96,4,205,167,128,226,205,180,142,130,0,+48,131,243,195,143,129,57,225,52,6,79,209,64,12,96,6,131,45,0,51,+67,143,225,64,0,195,222,168,201,0,54,164,17,128,229,225,61,4,161,129,+192,31,5,85,32,64,90,32,90,129,61,96,4,212,234,1,56,48,233,143,+1,96,0,22,95,56,51,50,32,102,114,111,109,85,84,70,56,32,34,80,+114,101,108,117,100,101,34,96,36,66,145,132,6,110,187,71,15,193,47,230,+217,1,139,113,148,191,97,231,0,39,65,43,64,145,129,2,64,49,224,15,+3,105,100,65,72,161,78,64,100,0,54,131,205,224,138,5,1,66,64,64,+133,64,30,164,10,224,30,5,10,77,104,115,46,66,117,105,108,116,105,110,+192,39,132,20,0,75,67,143,65,96,99,234,128,1,65,216,194,80,96,11,+192,8,64,153,96,59,196,26,1,80,32,97,79,0,85,131,198,131,225,224,+44,2,64,20,131,234,64,198,65,192,0,75,65,89,168,4,64,7,100,150,+4,49,54,32,95,51,67,249,2,49,51,50,64,245,0,85,160,135,99,113,+224,195,1,6,109,111,100,117,108,101,32,129,109,230,120,2,99,151,1,95,+56,143,239,224,55,0,2,79,32,35,66,23,194,18,224,23,0,7,64,95,+55,54,51,32,95,54,99,149,64,15,224,96,1,0,44,128,91,2,95,49,+52,73,204,0,48,115,32,166,46,224,136,4,8,41,32,119,104,101,114,101,+94,42,160,46,1,51,50,167,12,98,89,0,51,224,199,0,64,227,166,85,+96,80,172,53,1,50,54,97,25,64,52,166,190,0,48,70,230,3,95,49,+57,51,83,182,67,107,130,39,68,99,64,183,239,169,8,130,57,228,22,14,+98,205,64,102,176,255,224,42,10,128,25,226,248,0,224,44,2,163,61,0,+48,88,32,160,22,64,158,0,49,163,90,96,183,0,54,165,118,244,98,92,+66,48,64,127,225,125,1,13,83,101,116,84,67,83,116,97,116,101,32,46,+46,46,162,13,239,20,1,1,49,48,67,40,128,197,64,9,192,18,224,70,+7,6,100,101,102,97,117,108,116,128,63,64,28,132,75,224,36,5,1,58,+58,160,95,3,95,49,51,48,172,87,3,85,32,75,50,224,104,0,224,85,+9,13,114,105,118,105,110,103,32,105,110,115,116,97,110,99,164,27,224,62,+2,244,168,14,197,145,229,199,3,193,183,133,160,224,221,2,226,207,0,224,+235,30,5,112,97,116,116,101,114,99,249,96,139,114,240,128,36,2,79,32,+35,76,142,161,222,64,167,132,119,100,195,0,53,69,126,0,48,73,103,64,+90,98,195,1,55,56,160,93,2,79,32,35,76,72,160,56,96,30,197,201,+164,171,96,105,177,181,64,0,225,162,6,225,152,29,224,131,2,193,164,131,+145,1,48,53,101,96,2,95,49,48,86,249,96,8,0,55,68,66,224,76,+5,163,210,131,92,225,133,3,64,0,245,108,33,160,182,106,154,224,9,0,+224,192,15,225,250,17,228,216,1,128,74,225,225,3,193,22,225,219,5,224,+99,15,4,99,108,97,115,115,225,207,1,102,166,193,216,96,8,164,187,244,+234,15,199,254,102,171,224,120,17,175,238,228,253,4,4,105,110,102,105,120,+96,122,71,240,207,198,10,67,32,95,52,48,52,32,64,79,32,35,98,3,+98,23,224,20,3,133,253,128,146,128,21,64,13,3,95,52,48,54,138,75,+225,214,0,0,49,103,223,70,18,71,78,224,23,0,225,229,34,194,38,129,+114,233,165,5,225,105,3,234,11,1,224,17,5,225,144,43,12,102,111,114,+101,105,103,110,32,101,120,112,111,114,162,188,225,67,3,3,52,57,53,32,+115,99,166,93,0,51,99,247,96,180,226,226,3,99,99,225,2,1,4,50,+48,51,32,95,107,58,160,43,163,159,224,125,7,228,167,11,246,9,73,225,+71,99,1,105,109,225,71,85,229,239,32,0,85,172,96,224,253,2,160,254,+128,150,142,3,225,28,13,96,27,225,10,48,225,2,3,71,186,202,149,1,+49,51,103,67,64,7,156,153,133,161,224,62,7,13,123,45,35,32,83,79,+85,82,67,69,32,35,45,125,199,39,73,136,229,77,0,224,46,3,8,113,+117,97,108,105,102,105,101,100,192,41,193,35,227,150,2,65,97,0,75,161,+93,228,19,4,2,32,97,115,131,130,1,95,56,161,16,224,105,2,229,247,+3,195,196,64,78,0,80,64,75,224,67,2,5,104,105,100,105,110,103,160,+126,128,37,229,226,17,73,222,228,81,0,197,221,0,49,240,58,0,128,0,+232,20,40,2,116,121,112,229,182,0,226,33,24,0,48,94,80,64,0,248,+99,19,224,121,12,224,206,29,196,198,224,130,18,226,164,1,224,110,14,64,+99,225,236,0,231,235,15,248,173,35,103,68,109,143,96,158,224,88,11,225,+118,53,232,156,21,164,219,248,187,14,227,104,22,224,136,25,2,110,101,119,+224,139,32,0,50,199,116,0,50,132,129,105,195,0,83,64,91,101,81,227,+228,30,3,100,97,116,97,224,110,5,224,82,1,64,62,74,8,192,7,224,+224,58,224,110,9,224,221,11,226,164,14,227,171,2,1,92,124,192,69,131,+121,129,12,225,15,4,128,0,76,48,174,145,101,147,0,57,204,233,64,40,+177,200,64,48,140,81,230,68,4,225,63,29,171,112,229,38,3,228,227,16,+4,115,116,111,99,107,227,223,1,225,249,18,224,28,5,2,97,110,121,233,+112,2,108,146,101,114,228,167,45,102,182,107,39,0,55,183,52,224,185,12,+197,212,224,7,4,225,6,15,1,118,105,225,214,1,163,36,65,88,0,51,+161,88,226,65,4,231,195,18,226,92,19,64,213,0,48,101,101,96,95,234,+118,2,164,168,0,80,128,43,65,3,225,225,0,98,208,64,22,1,51,50,+170,75,224,31,1,199,87,64,64,104,136,228,194,16,228,105,1,229,5,13,+96,102,225,111,10,160,0,65,9,144,177,224,109,1,128,6,224,51,0,79,+182,225,164,0,224,19,0,0,53,160,19,64,64,212,190,65,166,67,222,193,+104,128,177,224,74,2,81,76,192,73,161,139,64,63,145,7,1,75,50,81,+111,65,65,64,141,1,32,80,228,51,0,0,85,224,232,0,146,130,146,135,+231,55,3,224,30,1,64,9,162,113,0,51,112,209,234,246,9,224,232,5,+225,62,10,3,40,46,46,41,230,201,1,64,33,64,151,240,173,3,129,167,+226,201,14,64,44,144,191,0,65,96,208,0,54,128,56,1,53,49,225,31,+0,0,80,177,241,211,107,64,15,64,9,128,21,130,63,232,203,0,64,66,+214,194,1,49,54,118,139,96,63,0,56,224,177,2,5,67,99,99,97,108,+108,96,179,224,25,8,2,97,112,105,194,254,224,25,5,8,106,97,118,97,+115,99,114,105,112,169,71,64,142,128,118,64,132,209,173,96,12,64,131,132,+136,2,83,32,85,64,243,99,112,148,24,65,1,195,116,98,25,225,8,0,+227,246,32,232,17,25,225,198,5,224,71,1,194,133,224,108,2,225,241,10,+161,148,131,241,224,193,7,224,109,5,98,149,64,73,227,54,1,225,50,1,+1,61,62,161,41,96,78,211,232,115,234,110,83,147,214,79,43,228,89,0,+160,148,226,174,1,112,3,201,63,128,169,0,54,228,148,0,70,117,152,141,+1,48,56,66,59,64,140,160,15,74,220,66,35,64,21,130,138,1,67,39,+88,126,71,236,213,63,84,90,128,104,68,61,228,211,0,246,146,1,110,151,+128,2,182,142,196,235,64,1,0,83,238,109,0,224,68,1,224,61,0,139,+221,224,46,3,243,50,0,236,58,0,255,215,2,66,230,128,5,103,239,160,+81,243,184,2,151,197,96,10,218,151,224,80,0,150,179,160,106,119,124,229,+156,3,192,11,152,185,128,205,197,180,160,96,160,58,128,35,2,95,54,55,+139,119,150,82,244,57,2,151,185,229,223,5,128,90,225,26,5,65,176,219,+179,224,135,1,224,27,1,166,36,96,60,192,15,130,59,164,233,138,75,151,+234,224,179,47,224,164,6,96,161,224,158,6,224,130,15,224,121,0,225,250,+0,226,15,0,193,7,129,133,193,155,138,202,112,185,109,86,1,50,48,64,+141,99,182,160,147,160,24,167,10,87,82,1,32,95,113,183,2,95,56,54,+194,18,96,10,193,71,128,94,237,169,3,0,50,192,87,236,232,2,1,91,+93,195,97,224,49,0,224,106,4,224,93,2,177,167,64,228,163,83,168,118,+128,25,195,195,64,135,1,52,56,178,156,109,129,64,25,210,2,0,64,97,+5,247,212,1,152,145,96,224,249,124,3,193,105,195,33,160,208,129,55,161,+60,235,114,2,97,38,198,189,236,61,5,96,186,224,26,13,200,106,224,26,+10,97,37,186,77,224,22,2,150,6,64,207,193,152,121,179,226,19,4,253,+244,4,200,77,194,37,175,35,232,60,6,200,61,228,13,0,224,118,6,141,+196,128,78,168,185,238,241,4,0,95,137,111,242,169,6,243,225,3,194,174,+233,86,9,137,73,131,53,193,207,179,76,225,20,7,98,211,192,26,224,161,+5,97,222,225,13,0,192,112,160,11,101,143,160,11,230,148,3,245,178,2,+101,153,128,123,255,57,0,96,101,96,100,232,215,19,224,28,10,0,49,65,+190,233,116,2,225,165,27,99,86,227,203,9,225,99,1,0,45,198,138,252,+44,0,226,84,12,157,150,224,26,13,97,94,225,63,13,170,154,0,85,233,+102,6,233,57,14,77,32,234,87,4,160,225,225,7,6,224,35,7,238,168,+7,218,222,161,20,129,159,0,50,167,208,224,77,8,0,52,225,84,0,160,+139,224,123,3,230,34,0,193,62,226,107,12,227,6,10,234,238,5,232,193,+33,64,29,162,49,224,72,2,232,157,1,160,129,225,132,9,96,184,225,132,+12,114,192,225,74,3,233,100,2,232,247,2,226,79,13,224,238,20,226,79,+11,245,37,12,193,141,243,127,10,0,102,238,13,0,0,56,224,29,9,226,+156,0,192,0,64,134,229,47,17,226,163,18,98,136,224,26,13,227,254,17,+151,224,225,22,2,225,24,2,224,17,3,79,111,227,123,5,186,74,0,79,+238,77,18,192,249,227,180,6,224,50,19,2,116,104,101,186,95,200,64,224,+45,19,2,101,108,115,175,106,227,81,9,225,227,6,225,221,2,64,6,227,+4,0,194,106,225,21,5,102,122,226,44,21,226,29,3,160,77,235,155,2,+0,56,80,159,182,73,240,104,5,0,111,96,176,237,88,24,0,46,160,40,+195,89,2,55,54,32,115,79,128,120,240,253,1,1,48,56,251,26,2,229,+252,12,103,150,228,66,8,66,183,103,15,165,189,227,60,2,166,132,230,19,+39,239,47,2,230,19,2,160,74,226,211,19,96,42,231,204,12,227,241,17,+227,240,3,225,116,4,192,8,225,79,7,1,108,101,248,5,3,225,77,16,+0,55,199,129,226,212,17,226,159,0,160,128,228,63,6,64,132,162,186,194,+34,224,74,15,1,99,97,226,190,0,224,26,7,0,111,195,58,224,174,21,+0,57,136,204,64,0,225,223,6,64,24,94,246,128,50,120,193,1,51,48,+170,218,224,23,1,198,59,230,45,3,1,57,50,240,120,3,96,102,243,4,+11,228,184,8,252,8,0,203,48,131,58,228,137,5,192,212,129,179,231,78,+10,225,215,0,128,33,4,64,95,53,55,53,138,108,129,95,0,51,91,242,+131,62,96,10,1,95,56,105,218,224,131,1,96,43,240,252,2,66,228,134,+215,160,32,64,91,192,116,96,130,225,57,1,128,3,194,135,1,95,54,76,+88,235,17,0,225,73,0,162,145,64,128,122,19,96,36,1,48,52,92,142,+156,132,226,44,3,2,115,116,36,129,39,203,13,161,118,192,75,193,250,128,+27,235,116,5,249,5,2,225,78,0,160,62,224,14,2,99,143,129,46,65,+21,99,121,235,141,2,65,236,0,65,96,11,64,9,129,216,0,85,82,64,+101,52,64,15,79,38,145,132,226,202,4,0,51,111,107,1,95,52,87,248,+96,236,145,220,64,238,176,26,0,79,161,90,96,84,80,29,131,0,129,26,+99,187,64,47,145,144,64,82,0,80,155,114,175,251,65,189,160,24,187,103,+169,74,64,69,96,197,225,204,1,224,236,0,166,135,162,62,230,81,3,160,+125,64,143,225,22,0,227,213,0,236,238,0,230,82,0,135,141,230,54,0,+64,143,0,51,176,139,248,197,6,65,109,255,226,7,64,133,224,19,7,248,+237,10,103,93,101,101,0,56,138,248,97,123,188,114,1,48,57,161,220,224,+52,7,152,134,162,193,161,82,0,35,131,233,130,157,149,226,0,75,81,144,+146,223,243,31,1,211,38,224,15,6,86,107,128,24,160,139,250,225,0,0,+85,208,200,253,191,6,64,32,230,50,12,96,46,192,196,253,16,6,224,22,+14,225,42,7,65,8,224,18,6,66,45,224,110,6,65,29,192,80,192,75,+169,101,64,193,65,150,128,28,5,53,52,57,32,95,54,142,46,128,201,229,+9,10,224,55,0,174,222,224,12,1,161,142,0,50,251,245,0,224,44,6,+192,31,230,26,1,225,42,6,64,120,237,247,7,224,115,5,224,171,1,224,+166,0,224,29,2,245,141,0,192,12,160,113,1,51,48,224,210,0,224,45,+6,238,46,7,98,190,147,99,116,248,3,95,53,53,53,96,64,142,30,148,+170,96,77,212,170,96,12,64,53,147,128,3,95,49,49,49,98,74,0,50,+67,120,64,6,128,178,1,50,57,99,205,1,50,57,102,0,0,55,72,206,+192,84,0,55,128,71,160,12,224,110,3,80,223,224,123,1,70,78,64,104,+147,174,5,73,114,101,109,32,58,128,80,64,14,3,113,117,111,116,96,15,+182,50,2,49,54,50,78,57,240,250,0,0,57,67,164,2,64,95,50,120,+50,0,50,163,4,145,66,1,49,50,100,12,0,35,177,64,1,51,52,239,+87,3,13,92,34,108,105,98,47,68,97,116,97,47,73,110,116,64,3,14,+54,52,46,104,115,92,34,44,54,57,58,51,52,58,32,69,148,224,46,1,+128,31,13,115,117,99,99,58,32,111,118,101,114,102,108,111,119,133,182,224,+140,12,128,125,192,140,0,49,104,110,224,141,45,1,55,48,224,141,16,8,+112,114,101,100,58,32,117,110,100,224,142,3,64,103,106,45,0,50,68,61,+2,95,53,57,98,154,96,122,2,95,53,57,148,248,160,12,0,57,161,208,+104,46,1,50,56,98,43,3,95,54,48,48,224,22,10,65,128,134,1,3,+73,116,111,105,97,143,0,54,96,14,3,105,116,111,73,96,14,183,85,0,+50,105,240,2,50,56,56,64,5,0,53,128,5,96,17,3,53,55,32,35,+116,139,0,35,98,251,193,6,224,42,0,224,36,11,96,118,134,4,3,95,+49,49,50,224,151,9,66,243,82,152,162,69,96,47,133,164,161,149,4,57,+56,50,32,64,128,82,0,83,193,167,114,245,96,18,64,62,0,49,73,117,+1,53,48,225,139,16,8,101,103,101,114,95,84,121,112,101,129,142,4,49,+48,51,58,49,234,39,1,0,53,65,232,103,156,147,90,1,53,51,134,92,+1,50,57,105,80,2,50,55,57,160,208,0,64,135,97,128,28,64,37,160,+35,97,3,128,69,111,157,104,136,64,198,131,172,129,91,163,130,0,52,64,+170,0,50,84,24,128,89,97,6,161,13,1,49,32,192,224,68,235,161,30,+128,122,69,143,1,95,54,96,59,135,28,156,2,3,67,32,95,54,67,148,+224,42,3,224,38,2,161,160,193,142,164,26,0,56,119,52,96,32,103,153,+129,191,64,25,0,54,99,197,96,32,192,183,64,25,121,172,0,48,163,25,+64,45,96,229,1,50,56,129,1,192,20,130,176,65,152,1,95,54,130,63,+100,93,0,54,68,78,128,11,64,78,162,128,1,62,61,96,92,130,127,1,+73,62,96,12,130,125,1,73,60,128,26,130,50,1,73,60,96,12,130,15,+4,73,105,99,109,112,96,15,161,88,2,110,101,103,96,14,129,91,1,73,+42,96,12,164,130,0,45,64,12,65,96,64,12,0,43,96,12,196,125,133,+59,99,206,73,251,74,4,0,50,80,119,225,120,0,106,108,2,38,48,46,+97,78,0,49,68,9,133,96,99,121,0,55,185,113,101,111,134,47,165,111,+128,12,64,105,128,229,226,239,1,86,58,192,87,66,213,3,95,49,49,48,+96,105,96,76,65,244,90,139,224,17,1,160,35,0,57,128,163,128,17,84,+83,224,33,2,214,61,104,235,138,202,205,119,64,199,96,178,5,55,50,56,+32,95,53,67,214,132,228,224,44,0,1,95,55,82,209,160,67,119,58,1,+95,55,64,156,1,95,49,132,252,138,153,100,245,99,3,1,53,57,140,154,+98,234,0,55,116,239,0,80,70,230,64,214,0,53,169,173,91,78,131,13,+162,153,225,75,11,0,49,99,226,98,162,64,70,224,68,7,192,32,160,10,+64,133,65,78,130,38,70,190,0,48,169,12,0,50,71,33,192,93,2,95,+49,50,81,255,104,255,224,169,0,2,75,32,35,67,162,1,64,75,96,100,+64,111,0,56,105,211,103,154,64,7,101,216,66,244,162,251,156,110,133,229,+97,98,64,13,98,188,160,13,0,50,73,219,64,14,129,204,0,55,164,29,+131,12,66,35,64,127,220,42,1,55,52,99,74,64,58,170,254,10,73,79,+46,112,101,114,102,111,114,109,73,74,154,4,94,97,116,97,110,131,111,64,+43,222,111,120,9,1,50,52,136,146,0,50,95,242,19,35,35,45,57,50,+50,51,51,55,50,48,51,54,56,53,52,55,55,53,56,75,126,64,56,131,+23,140,199,152,159,224,67,6,64,15,1,50,51,101,157,155,117,64,14,98,+171,96,14,1,35,35,224,90,9,100,73,68,200,164,55,141,133,100,101,128,+82,224,66,7,13,52,53,48,51,53,57,57,54,50,55,51,55,48,52,98,+109,165,47,160,193,64,169,220,27,224,169,79,2,50,48,52,99,92,224,85,+7,224,172,44,132,79,224,172,93,225,89,56,197,198,103,23,108,126,99,181,+164,117,64,34,66,218,128,207,64,209,207,142,0,67,100,249,128,16,145,187,+250,138,1,128,143,160,107,173,79,224,38,18,160,207,160,41,173,174,91,143,+250,146,0,103,46,64,223,0,52,96,55,224,223,13,64,20,128,68,137,109,+123,62,224,13,5,78,69,109,242,0,50,126,174,67,199,64,241,129,88,233,+145,19,4,68,111,117,98,108,199,255,3,54,56,58,57,233,142,7,24,100,+101,99,111,100,101,70,108,111,97,116,54,52,58,32,105,110,102,32,111,114,+32,78,97,78,177,0,129,1,225,37,17,129,36,0,66,94,129,243,4,2,+140,47,69,155,176,79,0,83,229,177,7,69,38,143,170,174,165,0,67,69,+26,96,206,229,176,3,0,50,76,6,111,219,128,233,229,155,5,136,132,161,+5,2,85,32,75,101,190,125,16,117,146,193,190,225,248,0,160,18,153,186,+96,20,64,192,128,8,102,123,70,63,229,254,13,96,210,160,28,100,30,224,+136,10,224,131,1,96,216,169,54,142,208,1,95,53,74,13,69,40,102,17,+133,248,129,220,162,47,162,45,166,37,133,181,69,34,96,210,128,102,104,207,+166,118,227,139,52,227,115,28,134,208,227,172,23,229,165,13,201,148,120,188,+96,209,96,255,227,194,4,70,129,1,10,65,98,183,2,68,98,108,72,170,+64,24,107,137,0,51,105,203,64,112,65,21,137,105,150,72,0,50,146,68,+75,110,3,64,95,50,51,103,107,96,137,2,95,50,52,102,181,160,150,70,+172,2,50,52,51,135,53,163,59,178,120,67,67,224,53,1,139,189,192,12,+224,217,1,0,95,64,112,224,61,9,227,15,4,111,155,99,136,227,11,0,+224,27,0,0,50,73,110,128,28,157,149,73,22,108,208,96,94,228,209,0,+96,208,96,95,0,49,200,154,224,93,44,0,54,119,143,224,92,16,65,67,+172,212,192,222,225,5,2,2,49,50,54,122,73,3,95,49,52,49,155,160,+104,73,96,8,241,94,0,65,160,0,54,97,160,7,73,112,111,112,99,111,+117,110,110,221,64,57,64,19,2,115,104,114,96,14,172,244,139,241,159,146,+64,107,96,100,129,149,98,77,96,188,0,73,145,239,228,90,12,139,184,194,+71,203,164,64,54,114,200,228,37,1,65,23,0,83,192,102,229,188,1,70,+26,0,89,101,144,172,154,147,87,211,196,0,50,165,59,237,79,0,0,83,+101,186,132,182,0,83,106,28,165,133,96,196,224,24,1,192,27,246,18,0,+192,33,229,0,0,224,54,3,132,105,64,1,0,90,224,52,4,224,34,4,+160,56,96,5,224,86,31,192,0,97,59,66,59,0,95,139,161,65,35,172,+39,1,115,104,131,85,236,39,3,65,130,236,39,0,65,150,236,39,0,64,+87,108,109,1,110,118,96,14,172,178,1,120,111,97,214,66,72,64,14,160,+13,161,243,2,97,110,100,96,14,233,201,0,238,88,1,132,102,0,39,70,+24,229,137,1,231,72,2,93,183,193,172,213,1,238,208,38,3,57,53,58,+57,215,167,230,124,0,65,35,100,129,128,82,135,48,96,113,149,130,108,40,+65,103,128,19,197,185,215,71,130,24,1,95,49,118,135,64,218,130,111,3,+117,116,111,85,96,233,161,90,0,117,209,219,64,64,96,16,177,251,64,100,+66,159,2,116,111,117,64,14,64,125,110,71,100,101,64,243,64,6,132,255,+66,235,64,58,0,47,109,249,64,20,64,13,0,61,128,13,129,110,65,18,+99,45,75,247,15,38,51,46,49,52,49,53,57,50,54,53,51,53,56,57,+55,178,205,0,51,128,84,71,40,64,6,98,220,65,126,64,104,171,207,132,+214,160,13,69,52,96,133,139,207,84,124,64,6,139,207,71,0,64,6,134,+171,0,54,108,21,192,69,142,222,224,13,0,133,162,192,13,100,217,224,13,+0,131,203,192,13,100,117,224,13,0,100,118,192,13,146,250,224,13,0,224,+181,4,146,137,96,13,65,17,204,82,236,80,5,108,79,129,78,215,114,224,+32,7,2,99,111,115,128,32,204,54,224,32,7,1,115,105,160,65,203,173,+224,32,6,224,97,0,203,32,224,31,6,224,96,0,202,147,224,31,6,192,+95,65,120,224,31,12,2,113,114,116,128,32,130,17,224,32,8,2,108,111,+103,128,31,130,35,224,31,8,2,101,120,112,128,31,162,53,0,55,143,164,+175,126,0,51,97,225,1,49,49,97,78,117,98,137,141,235,16,4,136,222,+100,229,233,190,4,131,69,107,82,74,132,0,48,71,200,136,186,1,50,50,+231,212,1,166,173,207,19,128,63,132,204,67,110,128,76,203,167,96,117,234,+220,2,73,222,185,193,197,32,64,174,98,11,246,63,0,235,218,2,0,85,+169,89,224,22,14,197,19,0,51,195,207,128,8,197,253,224,88,3,224,63,+4,224,13,6,98,130,66,17,4,64,95,55,49,56,233,195,4,240,44,2,+128,51,160,23,234,47,0,203,159,96,66,64,8,65,155,130,191,102,182,107,+46,197,22,129,107,161,55,122,231,64,2,161,134,225,86,2,225,113,5,224,+62,1,166,51,97,110,187,188,82,56,234,198,6,219,108,105,191,67,144,138,+136,224,24,0,70,210,129,142,69,147,64,175,165,211,97,17,135,123,65,189,+239,213,14,4,115,99,97,108,98,162,229,131,69,1,100,47,68,199,66,123,+232,13,1,0,49,132,121,112,250,1,49,50,80,146,64,6,0,50,243,255,+6,241,58,3,244,0,2,129,150,244,0,6,241,102,4,224,39,1,1,38,+49,96,17,192,25,160,14,64,47,148,4,64,35,136,69,104,38,136,61,108,+125,136,49,160,55,66,139,166,70,64,186,96,8,0,50,69,96,137,101,160,+16,98,52,82,114,101,4,156,192,128,0,0,58,128,112,150,107,103,41,64,+61,244,87,1,65,0,0,56,126,133,241,209,0,66,55,64,6,138,243,82,+114,64,6,244,93,1,128,39,148,93,96,11,64,84,132,22,0,100,148,93,+64,44,96,13,96,12,130,117,0,100,148,93,64,85,96,13,96,12,129,205,+0,100,180,77,64,253,64,14,104,37,65,154,64,12,104,37,65,174,64,12,+104,37,65,7,244,77,6,0,49,66,146,244,77,8,0,49,125,36,0,38,+243,2,1,84,245,64,204,116,78,0,49,126,119,96,14,97,93,64,13,65,+187,224,12,0,64,106,197,13,99,182,140,124,98,142,64,102,64,6,128,80,+98,199,64,46,129,5,126,16,64,14,129,6,232,123,1,64,49,252,75,0,+64,32,163,144,195,133,160,38,163,88,143,205,110,132,100,145,99,160,224,37,+1,232,110,2,238,78,5,148,226,238,129,0,165,83,224,43,16,86,115,234,+91,0,224,43,5,229,126,0,207,70,225,98,0,163,230,175,68,94,70,190,+251,65,139,64,31,138,41,66,94,84,243,130,186,191,22,224,34,0,238,81,+1,128,20,128,9,162,241,234,254,1,64,168,65,57,107,185,99,115,100,253,+234,215,2,171,82,0,35,103,168,224,67,9,128,209,224,73,18,70,86,158,+215,224,169,14,128,0,129,120,128,5,224,255,71,250,157,3,5,102,105,110,+105,116,121,106,86,224,22,1,0,45,224,23,4,224,25,3,241,41,1,129,+11,69,216,225,26,2,95,225,229,171,2,160,2,178,125,224,25,3,199,44,+130,108,224,34,4,226,63,3,226,62,1,182,248,0,39,97,13,128,73,97,+116,160,26,145,63,67,48,162,118,173,97,1,51,50,94,193,67,57,2,79,+32,35,74,129,97,56,64,59,0,85,94,137,242,70,9,13,78,117,109,101,+114,105,99,47,70,111,114,109,97,116,114,40,139,125,4,53,57,58,50,50,+242,78,7,70,17,5,97,116,82,101,97,108,96,41,20,47,100,111,70,109,+116,47,70,70,69,120,112,111,110,101,110,116,58,32,91,93,129,47,226,243,+1,193,39,147,203,107,187,73,253,224,137,2,2,46,48,101,225,100,2,77,+72,224,7,1,64,186,235,241,4,98,139,101,159,128,80,68,23,128,80,3,+79,32,35,49,94,19,178,113,128,0,8,95,52,48,52,32,95,52,48,54,+127,252,224,115,1,4,48,46,48,101,48,224,117,0,254,148,3,178,3,135,+45,136,0,154,216,242,9,3,224,224,0,161,199,129,219,102,229,73,68,239,+215,2,226,3,7,227,48,0,97,219,228,56,0,64,19,68,252,2,55,32,+95,76,169,238,230,2,70,176,96,162,96,249,129,8,225,6,2,137,78,0,+55,148,135,124,64,96,35,224,233,1,224,230,0,0,64,179,100,162,98,98,+62,226,77,0,243,188,0,237,97,0,111,88,237,172,5,4,92,34,44,48,+58,128,78,129,100,128,246,225,148,3,194,191,128,147,224,67,21,201,231,192,+65,97,189,192,16,225,144,1,64,239,95,52,149,56,225,157,3,225,142,2,+128,52,1,57,51,70,181,105,155,129,153,102,82,135,189,225,146,1,1,95,+54,80,212,234,147,1,234,90,0,228,198,2,81,173,224,118,2,192,105,96,+77,241,184,0,128,20,225,211,0,66,238,225,204,17,65,199,226,127,2,161,+150,225,147,4,225,145,1,64,12,139,43,238,241,1,229,34,1,64,18,224,+234,36,225,133,19,129,202,225,133,50,227,35,17,225,96,9,103,223,0,49,+84,252,224,36,0,229,60,6,165,22,235,43,1,225,17,1,197,12,119,240,+224,19,1,227,115,9,97,61,225,46,0,0,89,160,40,147,94,229,90,3,+225,162,1,224,195,7,163,186,227,229,14,229,108,8,164,114,128,31,226,244,+10,229,105,20,3,57,49,58,49,240,232,0,196,41,136,157,107,246,225,108,+28,229,91,0,231,75,4,130,207,224,70,33,228,100,2,192,211,128,76,134,+101,232,223,0,98,148,101,121,179,137,2,64,95,52,149,64,228,17,10,97,+58,0,80,229,132,1,225,56,3,64,0,228,74,1,230,23,6,1,48,46,+129,21,160,24,100,234,191,138,183,67,164,236,128,0,226,72,5,69,109,225,+191,2,174,176,225,195,0,164,248,245,106,4,229,175,0,237,166,0,64,251,+194,127,130,137,130,75,224,227,0,229,37,28,225,143,0,160,61,175,113,1,+95,52,131,155,1,52,57,134,194,225,50,1,96,54,229,59,33,228,10,2,+229,210,3,228,12,2,131,135,96,224,128,103,96,234,65,140,239,88,3,192,+248,97,207,131,167,230,95,3,225,125,10,195,38,224,57,0,196,254,166,185,+133,10,193,57,163,134,219,74,162,65,64,15,0,85,67,52,226,31,13,164,+66,225,69,47,192,221,165,73,0,54,140,104,72,84,228,204,0,240,153,0,+225,73,3,240,110,3,130,248,132,108,193,23,230,28,3,96,36,230,24,4,+129,23,165,151,96,177,145,32,122,237,64,88,111,251,1,48,52,154,252,160,+170,64,251,224,23,6,233,196,3,193,103,105,242,101,237,237,148,7,240,178,+2,228,201,7,230,26,4,224,34,7,174,210,64,218,139,67,1,50,49,98,+76,107,224,226,94,4,96,15,228,57,6,96,96,77,112,142,125,1,75,50,+110,71,0,51,173,173,0,75,141,140,142,125,228,69,0,69,68,120,28,234,+189,4,229,136,17,128,247,224,37,17,132,190,234,224,37,5,49,49,55,58,+49,54,234,225,7,16,114,111,117,110,100,84,111,58,32,98,97,100,32,86,+97,108,117,170,154,69,214,96,102,167,36,193,145,231,186,0,228,127,0,194,+231,76,42,228,108,0,221,57,107,10,134,34,225,166,15,99,98,230,142,14,+192,110,128,1,152,114,224,16,11,131,125,195,40,233,219,0,128,131,234,101,+8,96,65,0,82,242,178,3,101,178,129,155,67,183,195,204,96,73,163,187,+113,175,225,147,3,96,191,107,173,99,150,2,54,53,57,225,178,4,224,211,+17,128,87,127,88,230,184,0,229,154,6,224,60,14,226,6,14,183,235,225,+100,14,192,30,225,58,1,231,176,39,4,49,50,49,58,53,231,176,1,228,+250,1,152,119,225,113,6,164,2,129,84,225,152,0,225,57,6,192,134,225,+34,12,231,219,2,224,37,11,192,245,0,48,83,247,226,55,15,68,88,228,+241,7,234,248,6,104,35,232,40,7,128,93,1,95,55,113,214,208,27,96,+0,121,207,160,157,0,49,82,40,96,29,117,33,67,241,146,98,226,78,1,+227,4,2,229,11,0,66,44,1,55,54,131,21,239,227,54,226,173,2,160,+9,226,197,5,224,29,0,96,89,228,136,0,194,235,226,251,2,224,27,1,+160,236,192,25,239,195,4,224,34,5,195,113,224,24,1,224,87,6,231,23,+0,227,173,0,175,29,224,121,3,224,55,10,224,2,3,66,78,160,109,224,+1,1,224,164,2,247,147,3,192,48,224,101,1,224,80,10,225,17,0,224,+29,16,224,225,1,224,33,18,224,36,3,224,37,12,137,120,224,183,5,225,+43,0,224,58,1,194,33,200,32,147,157,224,5,3,192,209,225,36,21,157,+190,224,111,8,134,200,94,227,3,80,32,95,54,118,164,98,225,192,0,224,+45,6,170,207,64,0,234,68,3,225,83,5,224,49,3,255,184,7,227,123,+1,226,23,6,161,15,224,16,7,224,71,1,224,29,3,226,116,1,244,162,+2,168,139,0,85,222,250,2,64,95,52,71,163,184,59,224,12,17,133,158,+1,49,57,233,196,4,224,198,4,161,87,226,207,5,68,40,229,53,0,128,+26,224,86,3,160,81,128,0,138,83,225,205,1,203,71,138,87,192,242,115,+70,225,87,8,224,140,7,225,81,6,231,20,18,225,95,5,227,88,10,225,+97,10,224,142,2,250,248,2,161,37,192,174,224,231,3,225,61,15,101,87,+249,184,0,197,66,240,58,7,97,24,224,167,33,160,32,231,111,0,224,161,+2,224,111,5,224,166,8,225,142,0,224,137,20,224,233,6,101,148,169,140,+192,127,192,91,103,207,230,175,0,155,29,97,128,144,186,224,25,11,138,20,+225,113,1,64,147,126,52,0,48,126,198,246,99,1,225,130,1,187,185,0,+49,93,231,226,129,2,96,189,0,49,134,254,96,71,127,106,1,49,55,64,+37,64,15,66,18,160,30,160,234,129,6,231,26,3,225,37,4,160,44,196,+8,96,139,192,20,224,98,9,224,96,4,224,32,28,128,244,125,130,135,230,+228,18,6,225,144,9,128,253,231,65,0,75,204,224,32,0,2,56,54,53,+64,35,3,35,50,56,55,94,61,128,128,243,12,24,103,40,135,218,96,10,+199,237,0,75,100,210,103,107,178,118,231,29,0,227,127,0,227,124,14,227,+109,0,226,152,0,224,49,0,224,17,9,161,188,195,67,234,43,0,236,130,+1,192,105,226,60,5,96,57,195,99,224,221,13,227,43,1,161,58,224,13,+2,194,51,0,80,141,17,226,11,6,160,241,162,110,227,215,24,224,52,3,+129,228,254,6,2,201,114,224,22,12,224,149,6,232,79,5,200,8,160,167,+224,142,11,227,205,6,227,105,2,224,186,19,233,224,4,239,162,2,137,191,+224,69,2,143,98,224,185,13,64,69,232,170,0,161,212,224,164,0,129,225,+225,184,46,232,77,1,224,9,4,235,248,2,228,197,6,225,190,12,224,183,+8,224,210,1,229,95,2,233,250,9,224,13,1,160,112,225,163,1,231,32,+6,224,135,18,224,136,4,224,22,0,224,146,14,225,198,6,128,158,231,41,+2,171,122,203,137,99,40,139,26,229,133,3,65,124,129,109,245,219,10,143,+159,231,168,0,200,249,163,122,132,82,104,231,224,120,2,240,180,4,225,165,+2,128,14,0,50,132,197,224,155,5,122,244,193,60,232,142,2,128,17,160,+236,193,77,224,2,0,201,33,226,253,1,231,131,5,160,20,160,37,230,8,+1,235,100,8,224,96,5,224,30,14,160,144,224,2,0,137,97,239,121,1,+161,245,113,37,199,231,128,64,129,85,231,89,12,195,0,193,146,226,75,2,+192,115,224,1,1,145,149,160,0,195,69,224,2,1,234,150,13,224,189,2,+224,14,1,192,220,64,12,64,240,66,12,238,1,2,96,93,128,13,230,240,+18,233,125,1,192,122,224,66,2,225,186,1,193,70,96,187,98,249,225,32,+0,229,65,20,224,127,23,224,175,4,243,194,2,227,19,5,224,15,7,206,+142,65,1,3,95,49,56,50,226,190,0,224,55,7,224,34,0,226,190,0,+128,207,66,193,0,57,211,46,71,161,101,11,2,49,49,55,127,134,0,80,+92,33,0,48,128,30,99,65,78,166,0,48,110,166,103,26,0,90,224,1,+4,0,75,224,107,0,96,40,64,87,128,40,224,39,6,224,43,7,128,45,+0,56,96,45,67,118,2,56,32,67,104,103,2,49,48,53,104,104,161,44,+136,231,152,76,64,159,3,95,49,49,56,224,201,0,237,0,1,131,221,161,+194,168,239,175,46,128,15,0,55,111,70,128,15,0,95,128,240,64,0,134,+24,65,31,200,239,232,167,6,133,217,167,230,244,60,0,132,88,96,60,225,+252,2,1,55,49,160,196,196,240,96,21,171,147,226,24,4,102,141,228,118,+0,111,185,224,58,27,235,78,4,132,136,64,185,106,45,96,13,0,52,224,+13,4,0,53,224,13,4,0,54,224,13,0,65,120,0,55,212,104,209,142,+130,223,96,9,227,89,2,226,246,0,100,41,105,173,141,87,65,11,240,106,+3,0,50,155,13,162,154,98,250,225,130,17,176,193,160,51,160,225,228,109,+0,177,245,0,56,163,93,96,71,227,181,5,225,216,25,163,74,66,71,0,+57,117,89,87,37,224,240,53,69,0,224,241,84,0,56,65,237,224,240,65,+0,53,210,88,165,140,229,105,1,96,217,229,119,3,96,66,225,26,1,193,+14,192,25,224,40,1,225,51,0,224,65,7,224,24,3,224,47,6,198,99,+229,189,0,230,206,5,224,108,0,230,178,4,239,220,5,128,48,230,186,5,+224,83,0,104,4,165,161,88,230,68,195,225,69,5,235,146,5,224,78,1,+224,167,3,224,78,0,192,90,160,78,97,245,224,79,17,161,91,115,247,136,+187,224,4,1,224,32,3,224,231,0,96,94,128,20,227,68,16,226,75,49,+160,89,98,74,226,73,12,160,31,99,92,226,106,13,194,73,129,222,69,118,+134,21,193,17,133,138,195,156,1,55,50,235,114,0,64,145,0,50,192,163,+99,19,192,163,64,7,78,81,192,102,229,12,4,224,227,28,230,243,1,162,+224,225,53,10,224,72,29,227,73,24,67,58,153,161,3,95,49,49,51,89,+163,1,48,51,198,210,142,44,64,18,153,167,0,85,198,211,64,18,245,200,+7,160,169,153,216,0,48,231,63,0,192,48,96,28,1,10,65,233,26,4,+160,161,224,14,3,224,11,2,192,8,137,32,64,65,135,61,0,85,64,82,+64,195,64,18,133,215,230,79,19,64,37,0,54,224,190,0,231,164,25,118,+68,129,14,0,50,167,161,114,90,103,168,90,154,96,18,231,153,1,0,83,+128,17,0,56,224,17,1,160,35,0,57,103,101,160,17,231,205,5,129,50,+248,18,8,153,152,103,99,67,99,138,129,118,210,64,66,224,44,0,1,95,+55,71,70,160,67,104,2,1,95,55,87,54,224,246,4,226,238,6,162,125,+64,41,64,80,0,80,212,234,242,221,0,64,176,131,141,140,85,71,251,160,+243,3,38,38,48,46,64,37,64,34,98,130,103,150,1,50,53,245,48,1,+203,39,160,32,160,10,193,125,226,94,2,227,188,1,224,9,1,64,34,130,+114,224,34,2,227,55,1,192,34,130,130,224,69,7,64,138,237,100,2,96,+193,64,45,130,157,130,42,128,2,128,152,64,27,226,155,0,0,50,224,30,+1,160,27,0,56,130,164,82,117,0,48,201,160,73,145,193,10,209,222,0,+75,160,131,96,84,3,75,32,35,50,128,20,65,16,168,178,1,35,49,97,+104,1,35,49,101,80,96,56,123,192,99,133,66,7,226,29,1,64,7,114,+227,192,13,93,187,64,14,0,51,128,6,128,127,0,56,160,20,0,54,67,+99,185,100,64,15,0,55,67,112,96,58,163,93,21,73,79,46,112,101,114,+102,111,114,109,73,79,32,64,64,94,97,116,97,110,50,102,128,37,131,46,+132,189,83,120,0,51,160,69,12,55,53,32,64,35,50,49,52,55,52,56,+51,54,94,90,64,44,131,53,98,156,179,236,224,55,5,109,38,1,51,56,+87,60,65,119,78,138,0,51,119,74,64,13,224,77,1,73,130,1,35,50,+234,70,0,96,68,0,51,73,171,128,68,224,53,5,4,56,51,56,56,54,+105,181,133,226,160,155,64,142,131,150,224,142,67,1,50,53,99,210,224,70,+6,224,144,32,130,215,224,144,78,225,33,43,131,69,0,83,200,49,66,29,+0,49,196,40,172,238,102,31,66,37,242,210,4,134,12,64,66,197,232,101,+183,229,36,12,64,37,131,93,140,43,230,1,1,104,78,226,92,1,146,2,+198,110,231,180,2,168,26,252,119,3,230,236,0,128,145,164,33,96,177,64,+111,227,177,0,224,147,3,224,149,7,64,44,195,215,229,226,5,229,228,6,+64,43,195,46,101,153,67,111,237,9,5,64,34,131,43,64,210,200,191,128,+231,175,248,224,240,1,225,244,4,234,229,1,225,21,5,224,36,5,129,232,+160,38,243,246,3,144,151,3,95,50,54,55,150,36,1,52,55,225,248,6,+170,255,137,51,206,231,224,13,5,2,95,54,54,100,127,226,88,1,5,64,+64,95,51,52,55,254,201,8,4,68,97,116,97,47,254,192,3,5,54,51,+58,57,58,32,94,194,224,42,1,5,100,101,99,111,100,101,96,37,13,51,+50,58,32,105,110,102,32,111,114,32,78,97,78,190,233,233,38,1,225,8,+11,129,7,210,43,96,220,130,51,202,213,129,74,236,120,2,135,10,106,42,+246,164,2,233,124,2,231,9,3,2,50,51,55,96,38,197,222,233,227,11,+161,2,214,230,104,78,236,28,5,193,217,160,18,248,235,4,241,106,1,0,+83,135,152,231,87,13,96,210,237,200,24,247,106,2,215,136,103,111,232,184,+1,1,49,52,98,250,135,80,206,251,98,21,130,19,239,19,1,1,35,49,+107,250,103,203,227,93,0,195,98,228,122,40,228,101,17,136,16,228,146,20,+230,56,3,195,187,84,86,231,157,1,228,167,4,71,8,1,10,65,98,141,+3,70,108,116,32,64,17,233,114,0,0,52,64,99,103,114,8,38,38,51,+46,49,52,49,53,57,136,218,1,49,52,135,62,64,179,64,6,137,147,0,+53,103,55,185,113,1,49,53,121,199,224,13,0,129,80,67,105,64,6,128,+62,0,53,128,62,0,53,160,62,0,57,96,6,91,68,224,55,1,0,54,+249,197,3,0,49,64,194,224,13,2,80,85,224,13,1,66,236,224,13,1,+0,56,224,13,4,105,63,192,13,0,55,224,97,4,0,55,224,181,4,0,+55,224,181,1,65,10,134,85,131,44,64,23,0,49,227,57,1,65,79,105,+255,0,49,128,183,0,53,198,0,98,9,64,60,166,1,224,60,3,160,30,+64,29,229,220,0,0,51,233,23,2,0,52,162,147,165,24,229,218,0,227,+15,0,246,108,1,162,219,224,113,0,226,228,11,224,158,7,64,83,133,190,+227,227,1,66,76,91,44,64,65,0,83,144,8,227,47,13,224,76,10,0,+54,133,229,164,54,227,195,0,160,170,227,208,0,133,117,156,61,131,16,154,+120,224,122,1,229,199,6,134,8,132,96,240,161,25,227,237,28,228,42,12,+192,202,224,218,11,134,148,134,111,225,39,5,144,11,224,148,1,247,205,2,+0,54,168,50,179,182,160,145,161,192,172,75,153,4,224,164,13,224,136,11,+179,45,224,136,53,96,31,224,135,53,0,54,231,247,13,231,221,20,128,0,+64,61,132,84,233,14,0,116,132,65,225,192,97,64,179,143,82,0,49,77,+50,64,50,131,124,236,26,5,224,101,11,64,43,239,38,0,224,42,9,232,+112,9,64,104,227,87,1,225,88,0,224,152,13,162,154,227,120,2,129,107,+227,119,0,225,115,0,195,134,64,184,64,0,226,113,11,225,88,11,227,229,+4,224,141,40,228,6,7,224,142,56,132,32,236,186,7,108,185,140,184,69,+168,224,33,12,2,99,111,115,160,33,201,209,224,33,7,0,115,72,177,96,+33,201,208,224,33,6,224,100,1,130,110,224,32,8,224,99,1,204,130,224,+32,6,224,98,1,229,188,3,225,85,0,226,118,9,99,74,160,7,64,54,+229,182,3,225,73,2,229,247,0,67,60,229,247,11,96,71,64,64,229,217,+2,226,131,1,224,1,11,227,42,10,96,64,207,47,224,61,21,128,1,224,+67,11,128,69,239,89,2,224,68,44,0,58,128,248,225,99,12,2,113,114,+116,129,100,71,250,224,33,11,2,108,111,103,160,32,225,232,14,2,101,120,+112,160,32,193,232,224,1,33,178,172,224,0,8,224,57,25,192,1,224,65,+14,224,56,25,128,1,224,62,13,224,55,25,64,1,224,59,12,224,54,25,+224,56,13,224,53,44,224,50,41,224,47,38,224,44,35,224,41,32,224,38,+29,224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,+17,8,224,14,5,224,11,2,192,8,254,151,0,224,0,5,67,62,171,173,+1,55,50,239,48,0,68,226,138,107,115,158,156,197,137,240,68,185,128,7,+133,16,70,71,240,57,0,206,5,64,116,145,67,106,230,0,48,222,109,109,+243,236,66,0,180,150,255,169,2,249,193,3,160,76,207,207,144,99,239,21,+1,183,231,160,6,160,29,69,152,192,174,125,25,240,2,1,254,117,1,224,+22,12,166,221,1,49,52,104,192,224,8,0,152,248,224,88,5,224,63,4,+253,113,8,64,37,104,133,253,19,20,64,51,244,231,2,103,74,175,226,96,+65,64,37,65,154,232,192,0,132,232,200,163,0,65,128,14,134,38,109,206,+111,146,238,241,1,167,224,235,40,3,207,169,225,115,2,225,142,5,224,62,+1,129,131,110,166,169,241,235,212,10,232,20,2,110,154,174,235,192,23,66,+111,129,169,78,65,64,173,134,147,2,95,50,51,78,69,181,5,80,2,64,+6,149,26,85,98,129,226,129,27,0,53,118,126,128,203,254,195,13,202,189,+64,132,87,95,224,26,2,64,79,109,222,96,150,129,9,1,95,54,142,97,+143,149,243,50,1,96,44,109,253,207,175,64,230,80,141,160,18,1,95,53,+118,254,1,95,50,151,71,128,37,1,50,53,97,249,192,12,131,41,168,18,+180,63,241,74,1,224,184,6,224,157,6,1,95,50,72,173,96,56,0,50,+224,56,22,224,194,3,224,55,3,65,48,1,50,53,225,136,1,2,95,50,+53,224,171,2,1,49,49,81,90,86,105,224,15,0,224,29,1,246,128,0,+65,166,201,188,72,160,64,106,242,105,16,8,66,105,116,115,47,66,97,115,+101,146,109,4,54,53,58,51,54,242,109,7,19,98,105,116,83,105,122,101,+32,105,115,32,117,110,100,101,102,105,110,101,100,178,104,64,130,150,153,0,+51,243,233,0,238,197,3,247,227,0,96,150,64,42,96,35,113,192,65,244,+225,190,2,99,161,80,206,147,47,1,49,57,97,138,1,51,54,208,209,160,+66,136,71,239,47,20,1,51,54,96,35,68,119,0,55,105,228,226,247,9,+97,119,64,42,190,161,67,37,163,56,244,30,0,1,95,52,109,61,99,68,+175,37,131,148,243,47,0,197,57,235,172,1,235,178,1,99,185,189,223,180,+76,128,90,114,6,69,13,164,181,5,66,32,95,51,54,57,107,194,241,204,+1,132,92,0,50,145,95,224,176,0,229,41,0,195,9,106,165,68,216,66,+63,64,53,64,15,224,36,0,197,79,1,51,51,224,108,0,197,41,64,24,+2,54,49,56,147,167,128,79,65,31,66,148,132,226,81,253,64,81,99,68,+97,41,235,70,0,253,128,0,118,80,1,52,32,162,211,97,52,122,249,128,+100,224,215,45,98,178,64,153,142,132,128,229,1,49,51,97,184,198,54,192,+156,64,180,91,104,1,49,50,177,106,64,232,225,205,34,107,213,97,49,184,+47,95,64,97,158,89,102,128,146,213,49,224,134,0,230,107,1,225,49,24,+238,94,3,225,49,11,96,136,0,89,130,27,129,57,67,19,64,86,250,7,+3,225,48,12,2,67,32,79,184,55,0,95,108,224,161,237,134,38,166,59,+0,95,168,5,77,133,160,108,64,13,161,59,162,136,246,203,1,135,58,68,+207,227,111,0,212,186,0,73,131,225,190,93,205,71,98,239,200,42,96,94,+133,197,129,92,64,75,226,95,1,161,163,64,39,64,24,0,57,224,100,0,+225,78,0,225,77,13,96,88,168,68,227,118,1,224,93,0,164,241,233,56,+0,1,95,52,94,124,199,49,160,138,224,112,5,227,183,2,130,107,0,53,+130,163,225,114,24,135,36,96,157,128,172,0,48,160,36,0,64,177,47,224,+202,0,194,204,224,210,13,65,73,249,59,2,240,164,7,240,166,9,65,57,+191,213,230,79,15,2,67,32,89,96,255,86,118,134,83,228,119,1,164,155,+192,227,98,45,192,53,67,39,233,143,3,160,201,0,95,169,56,128,10,135,+249,65,110,250,133,11,224,1,7,224,189,4,128,0,64,61,229,182,0,0,+50,224,244,9,224,50,3,64,43,0,54,226,103,16,226,123,13,137,219,65,+191,79,115,102,148,125,251,224,26,5,228,79,3,64,30,64,6,225,217,1,+224,87,22,96,60,224,58,10,224,124,9,234,108,0,224,40,3,224,107,3,+64,225,211,5,128,106,2,83,32,85,64,62,64,178,135,45,2,66,32,90,+64,136,0,90,154,215,67,68,224,18,2,227,97,0,198,131,144,159,226,242,+0,166,108,131,253,72,64,0,50,226,251,1,225,25,0,66,217,0,48,232,+17,13,6,73,110,116,101,103,101,114,96,7,3,114,110,97,108,136,24,4,+51,48,56,58,49,167,244,192,197,134,17,225,167,53,161,88,225,167,14,177,+91,225,167,40,100,101,64,60,225,170,15,224,100,0,128,19,132,74,225,170,+12,230,82,2,224,228,47,64,94,226,42,13,224,227,44,162,34,224,58,8,+224,224,18,65,102,224,224,15,166,165,226,139,92,230,109,2,225,253,1,226,+139,42,0,50,226,139,8,198,155,1,95,53,87,177,1,79,32,68,201,69,+133,64,27,248,234,0,224,225,23,69,92,224,28,0,224,230,48,125,2,251,+136,0,3,95,50,53,48,231,82,2,194,151,224,245,41,2,50,57,54,224,+245,7,64,73,102,25,0,66,224,182,1,96,147,0,39,224,198,2,225,139,+15,224,162,1,226,164,2,64,84,133,232,167,119,3,64,95,53,54,73,189,+226,117,0,160,14,96,218,170,120,64,52,133,223,65,127,86,22,225,127,4,+64,35,128,27,0,49,103,174,64,18,213,180,244,15,7,6,64,94,115,99,+97,108,98,181,186,64,45,97,185,64,57,141,82,171,196,181,117,248,172,0,+64,44,247,251,2,64,172,64,18,130,219,1,102,47,92,207,81,11,244,96,+22,242,148,255,224,17,4,224,14,5,224,11,2,192,8,242,148,6,65,106,+232,223,0,231,233,0,199,227,3,58,49,49,48,130,181,1,95,52,93,197,+0,48,73,176,64,6,101,130,1,48,57,132,209,1,48,48,67,107,232,233,+0,2,49,49,48,73,59,3,38,38,48,46,68,185,90,177,110,56,209,176,+127,13,64,44,98,155,224,44,5,224,40,2,2,38,38,49,96,18,224,27,+0,192,16,64,31,0,55,98,113,64,38,238,161,6,128,141,0,64,73,96,+1,80,32,192,57,171,108,192,192,101,100,0,48,74,48,91,30,131,40,96,+204,128,22,64,21,0,95,120,235,225,36,2,64,113,6,10,65,32,105,116,+111,102,66,158,64,61,65,21,68,45,0,57,108,229,1,56,48,111,1,96,+205,64,7,133,195,1,48,50,128,6,141,248,0,48,72,100,159,28,128,39,+0,54,112,87,96,11,64,84,131,103,2,102,62,61,96,98,131,78,1,102,+62,96,12,131,46,1,102,60,128,26,163,41,0,60,96,12,131,41,3,102,+110,101,103,96,14,129,205,3,102,42,32,58,129,160,64,12,0,45,96,12,+129,45,1,102,43,96,12,128,207,91,184,2,32,95,51,115,79,1,48,57,+144,215,1,48,57,114,19,0,50,64,207,128,19,64,47,160,240,65,26,0,+48,83,35,84,107,112,75,96,46,225,133,0,97,74,81,32,3,95,49,48,+55,135,210,1,48,56,98,58,1,53,49,229,63,2,1,45,62,165,27,64,+63,211,113,252,103,0,5,67,32,60,32,64,35,75,48,236,77,0,128,18,+101,50,108,16,224,18,0,65,59,0,85,162,244,64,175,167,74,229,66,4,+113,176,204,94,192,13,224,27,2,224,23,1,160,213,128,174,2,79,32,35,+64,233,174,235,160,26,160,27,224,202,1,1,46,46,241,93,0,128,32,108,+83,224,142,3,224,121,88,224,113,10,224,99,25,224,193,21,225,121,7,96,+85,225,121,5,69,182,64,118,160,116,224,102,33,224,173,17,0,52,224,70,+0,226,97,1,225,17,0,106,194,240,120,0,2,95,49,48,67,189,96,8,+0,55,98,190,225,55,7,178,148,0,48,70,130,192,0,71,104,1,48,57,+67,117,224,233,0,66,129,131,93,224,147,3,160,11,100,32,160,11,224,101,+13,128,102,160,71,182,29,225,9,2,64,6,224,53,0,64,89,192,155,192,+18,0,51,160,18,64,62,181,174,2,49,48,56,148,40,131,94,212,29,78,+46,0,48,190,31,239,182,0,1,48,56,129,34,83,105,142,40,0,58,96,+62,128,50,0,89,241,89,0,145,92,166,16,238,100,1,1,51,55,100,153,+111,238,198,36,97,141,96,12,130,1,214,216,224,59,0,227,143,5,224,25,+1,224,27,5,98,235,226,49,5,64,163,116,11,244,225,8,31,115,114,99,+47,84,101,120,116,47,80,114,101,116,116,121,80,114,105,110,116,47,72,117,+103,104,101,115,80,74,76,105,116,180,240,5,50,52,53,58,51,53,244,241,+7,9,115,101,112,49,32,65,98,111,118,101,194,96,224,100,54,0,54,224,+100,15,4,66,101,115,105,100,224,101,0,224,250,1,228,147,12,2,95,49,+48,121,70,224,38,1,0,85,64,13,128,41,97,130,161,102,128,1,2,95,+49,48,79,181,231,170,2,97,177,170,16,106,214,64,35,147,92,161,176,96,+53,65,250,66,79,204,38,151,163,224,102,0,152,148,192,101,225,162,4,213,+236,210,131,140,199,224,212,0,224,42,3,181,176,224,199,2,224,79,0,0,+66,96,126,236,214,2,194,108,170,220,64,11,240,181,2,192,114,224,72,16,+128,149,224,72,10,97,6,66,242,103,154,64,20,224,86,2,0,95,84,5,+224,92,0,224,204,1,224,201,8,132,13,192,125,128,124,64,118,235,126,3,+225,109,35,224,201,4,128,148,0,48,96,48,131,199,192,147,2,95,57,52,+226,140,44,4,51,52,58,53,49,130,140,131,219,135,197,99,219,161,230,224,+229,5,150,208,98,90,225,216,3,226,9,21,215,143,128,26,199,62,65,4,+1,61,61,224,30,8,225,181,0,0,90,192,121,194,172,224,66,18,193,47,+224,66,2,129,108,180,251,67,41,64,14,64,11,65,201,226,15,0,87,244,+160,24,100,228,236,234,0,2,49,48,55,66,42,197,165,64,0,161,126,1,+51,48,83,62,148,194,227,32,12,165,55,97,79,210,235,228,190,6,66,14,+228,209,91,4,54,55,58,50,57,228,108,7,7,111,110,101,76,105,110,101,+114,228,213,67,1,54,56,224,104,19,228,217,6,228,208,21,2,85,32,90,+225,167,0,64,0,225,39,6,65,149,224,64,6,152,232,195,29,91,221,224,+62,0,224,22,1,107,43,224,85,0,224,65,6,67,182,76,162,229,85,1,+96,144,83,156,64,0,65,201,0,54,97,201,0,83,248,79,2,189,86,101,+160,226,134,3,197,107,224,66,2,64,64,206,231,113,53,135,243,169,119,90,+147,96,34,249,87,0,125,31,108,115,160,96,99,113,128,178,231,109,5,151,+203,228,92,3,224,19,0,128,17,232,239,0,64,6,136,25,200,37,200,165,+144,251,187,157,192,51,140,218,136,127,64,163,96,29,64,164,0,51,224,199,+1,235,9,7,144,116,192,10,192,19,128,116,226,22,1,2,32,92,124,130,+10,96,32,233,103,40,192,183,64,139,255,48,0,1,32,80,236,32,2,233,+232,6,108,42,224,132,7,1,60,45,234,150,6,192,7,132,36,0,48,224,+181,8,2,108,101,116,224,181,2,1,55,54,159,228,225,43,0,192,167,0,+55,205,217,224,71,15,2,114,101,99,224,71,27,192,239,64,229,242,208,0,+2,49,48,55,96,209,68,125,64,24,137,188,128,185,0,58,128,231,226,63,+0,243,156,5,193,27,88,120,96,72,194,19,224,154,3,3,119,104,101,114,+195,165,224,229,30,64,134,66,198,128,134,1,50,53,96,134,178,0,230,173,+1,165,38,64,27,0,54,224,203,7,170,136,64,152,171,37,1,83,32,79,+213,166,127,227,104,0,226,239,1,229,242,4,133,201,227,148,0,232,249,7,+224,46,7,74,228,133,86,64,13,64,5,64,123,214,189,226,68,16,129,13,+0,50,226,169,11,0,54,226,169,7,187,85,224,33,0,83,87,237,107,6,+224,78,42,225,172,8,172,240,64,190,131,145,79,61,1,55,54,70,141,108,+20,92,226,3,95,51,54,55,129,107,83,179,166,181,203,231,96,58,131,64,+139,254,99,190,103,250,97,133,188,133,220,92,168,127,64,27,104,1,130,223,+101,140,64,95,233,31,0,64,85,243,94,1,228,13,25,5,102,111,114,97,+108,108,228,16,6,192,252,0,54,200,226,193,149,67,21,247,16,0,96,7,+101,37,98,48,82,33,80,215,224,91,1,208,8,192,25,225,96,4,4,64,+95,52,48,54,98,106,64,178,210,166,229,124,1,133,221,194,80,226,72,6,+64,143,137,225,192,133,64,173,99,21,225,179,2,192,181,104,89,239,53,15,+96,45,225,21,7,1,58,58,228,158,0,0,48,86,197,129,88,65,14,163,+240,0,57,67,105,64,25,179,92,219,211,0,56,81,177,4,64,95,56,51,+48,110,0,0,53,224,237,0,64,46,177,150,226,40,25,125,74,226,40,3,+65,148,102,254,0,73,229,245,3,225,20,0,97,253,66,67,1,48,52,167,+195,224,36,1,64,20,142,166,164,74,128,123,128,120,128,224,129,46,64,102,+132,5,67,137,0,75,136,6,129,74,224,10,4,224,12,2,64,50,209,224,+100,111,0,56,71,121,64,7,93,87,130,78,3,50,32,95,57,99,243,1,+95,56,161,151,64,53,131,51,0,75,125,44,87,233,97,37,65,161,138,118,+130,99,129,213,209,244,162,23,255,191,2,95,215,1,95,50,83,174,129,101,+130,11,199,185,234,165,1,128,45,96,40,98,128,97,216,235,178,10,12,77,+105,99,114,111,72,115,47,73,100,101,110,116,137,89,5,49,51,50,58,49,+50,203,162,66,180,1,57,54,97,169,1,51,53,192,122,224,82,0,160,218,+199,20,192,165,128,119,1,56,54,127,252,224,22,8,0,53,83,33,2,64,+95,54,104,132,204,141,230,98,0,64,252,164,32,170,142,96,21,240,53,1,+99,15,128,21,87,237,192,21,64,69,160,21,130,163,240,182,16,94,83,240,+182,6,94,113,208,182,67,59,198,48,0,53,240,78,0,64,24,0,54,226,+251,0,228,26,0,193,225,64,30,194,73,224,55,0,166,104,68,139,230,104,+93,98,239,230,104,4,64,136,248,119,0,1,80,32,131,54,169,225,151,60,+64,36,193,191,71,60,110,33,106,68,64,25,177,194,227,191,5,0,52,81,+163,227,191,0,66,233,229,232,10,71,188,145,253,135,163,64,24,227,207,18,+100,200,227,207,23,99,84,227,207,2,64,136,128,117,228,176,0,64,9,224,+240,3,136,54,224,240,6,64,71,96,36,225,98,0,242,87,1,225,102,1,+161,103,225,105,9,224,24,0,224,175,2,192,20,97,125,192,86,96,72,129,+143,225,145,0,67,58,3,10,65,32,65,97,19,130,50,64,68,103,145,1,+52,51,97,117,74,139,160,22,2,50,32,35,119,2,1,80,32,76,115,105,+26,64,32,129,213,0,80,96,67,227,124,0,98,239,0,51,179,63,137,3,+66,234,66,216,64,39,129,202,2,85,32,65,128,14,249,37,1,64,14,64,+47,97,17,134,52,226,162,1,204,113,71,130,128,20,171,125,140,41,144,193,+101,188,236,15,1,65,243,66,104,206,226,166,180,88,26,80,226,96,44,2,+95,52,51,241,64,0,64,127,129,182,98,29,64,91,129,136,238,149,4,192,+142,64,85,0,50,128,6,170,19,228,246,1,230,28,3,224,49,5,132,6,+192,49,64,113,130,3,227,100,3,240,86,2,129,204,239,65,8,237,18,0,+224,39,18,165,26,240,166,0,242,130,15,160,138,226,54,2,64,8,208,131,+224,7,5,224,193,9,224,56,4,224,147,0,228,30,2,192,13,134,90,163,+108,230,25,0,2,49,48,51,243,2,0,224,92,8,160,170,225,234,0,64,+25,167,158,64,40,129,207,166,171,160,16,224,54,0,224,227,5,67,26,244,+57,4,192,178,161,26,226,94,1,100,40,98,14,224,91,8,224,108,12,225,+131,1,160,236,239,175,5,224,97,0,160,32,224,149,4,128,249,192,138,128,+30,224,231,2,243,253,3,224,121,8,224,53,7,165,50,160,134,229,222,0,+227,62,3,160,224,228,69,7,224,231,10,128,90,64,17,161,46,239,130,1,+224,199,11,243,250,14,0,51,106,242,148,0,224,194,11,132,144,67,2,0,+54,163,244,107,128,232,111,1,165,15,225,95,15,193,62,227,118,8,192,24,+0,85,199,95,224,33,8,96,250,240,232,4,139,77,145,46,2,79,32,35,+67,217,234,62,1,65,6,159,130,80,203,64,16,165,25,1,53,49,97,78,+64,147,1,95,52,91,251,157,150,1,49,51,101,70,98,218,64,45,133,38,+227,226,0,192,199,244,97,6,227,142,3,225,222,5,228,112,4,225,75,4,+130,99,227,230,4,225,235,12,161,115,225,8,0,97,201,64,64,0,49,161,+13,227,117,0,128,56,228,7,20,224,69,5,129,235,135,174,249,46,1,224,+79,0,225,67,0,249,196,0,128,54,193,207,249,49,12,99,7,132,56,224,+216,0,249,44,127,4,49,54,53,58,51,243,241,8,0,97,84,81,3,78,+101,115,116,244,91,66,2,49,54,54,224,105,20,249,54,59,226,55,13,229,+6,2,130,130,97,175,226,117,0,177,161,224,25,17,64,0,225,184,24,162,+187,224,129,1,224,39,1,229,38,10,226,152,7,198,78,229,37,3,131,43,+64,12,226,64,0,224,153,6,249,48,7,224,84,2,133,123,132,125,224,75,+0,79,240,104,207,133,92,130,180,134,208,193,54,225,60,2,225,61,0,233,+169,10,160,153,224,140,3,224,209,4,163,143,192,48,249,135,17,231,100,0,+225,47,15,225,157,2,225,47,4,129,212,197,142,225,186,17,192,54,178,194,+128,0,249,103,46,4,49,52,56,58,53,187,244,100,5,205,85,253,66,1,+228,10,22,192,220,246,17,9,224,23,1,226,16,1,226,53,12,230,32,14,+224,232,0,129,249,80,58,226,26,2,230,51,28,96,126,225,144,0,192,73,+80,165,230,16,0,7,67,32,95,50,50,56,32,95,79,119,160,68,225,138,+3,225,100,0,128,18,0,50,97,1,0,50,65,236,102,131,225,123,52,4,+55,49,58,52,56,250,227,2,64,149,247,101,4,231,96,30,192,48,224,28,+4,97,3,225,36,8,173,51,233,105,4,225,126,14,97,123,193,10,65,2,+225,127,5,225,128,27,103,121,64,146,138,76,78,224,198,124,100,19,178,226,+64,93,174,2,0,55,76,170,68,216,173,155,1,80,32,134,63,0,80,103,+214,0,50,207,114,1,67,39,98,160,195,87,99,37,228,167,0,77,188,227,+82,0,136,196,128,39,202,68,226,149,25,227,195,11,224,39,4,230,212,4,+224,230,0,225,121,1,65,25,225,116,4,230,99,47,5,51,52,49,58,51,+51,230,99,7,0,98,70,94,0,103,215,247,230,60,5,160,148,165,51,192,+199,198,61,161,6,100,82,0,49,97,203,106,138,227,108,1,160,234,229,185,+3,195,127,254,204,7,164,32,225,37,17,228,233,0,165,133,233,79,11,131,+68,224,125,13,96,27,65,229,99,253,235,90,11,229,49,1,226,122,6,128,+141,225,8,0,192,196,226,36,0,98,0,224,37,0,226,3,11,225,60,1,+194,7,224,46,13,192,126,192,28,226,13,84,4,53,48,58,51,55,226,13,+15,0,49,226,14,12,224,152,0,227,10,3,226,21,4,228,58,0,133,185,+96,62,106,27,226,26,2,230,169,0,74,96,160,71,225,255,5,225,29,13,+198,181,230,38,0,231,23,17,165,78,224,109,4,160,79,226,15,3,228,120,+0,80,106,64,8,228,151,1,226,35,1,224,69,9,226,43,3,226,208,14,+230,60,5,0,64,113,2,106,34,64,6,64,4,68,130,0,54,100,130,148,+94,0,73,132,149,241,157,0,1,50,51,100,190,211,199,1,80,32,189,190,+96,37,0,51,224,37,0,0,49,96,37,216,224,96,39,96,217,164,228,179,+75,2,49,48,49,119,74,67,131,224,40,1,98,156,128,40,0,49,133,54,+129,127,161,179,64,149,64,26,244,218,0,231,135,0,225,163,3,64,44,97,+41,128,12,225,5,1,3,95,50,51,48,167,10,97,253,64,74,197,115,232,+0,1,1,52,57,231,46,3,128,127,230,174,2,135,117,96,91,226,10,4,+195,233,131,125,230,174,37,200,232,230,173,10,192,86,230,173,1,96,219,98,+25,233,159,11,236,112,7,129,162,95,97,146,158,96,111,160,10,227,168,49,+4,54,56,58,51,48,227,168,7,3,102,105,116,115,249,61,0,182,45,64,+172,130,80,0,53,194,80,67,187,88,2,0,50,230,233,1,97,50,225,200,+1,234,216,0,225,216,0,193,234,241,40,1,231,6,10,227,132,2,235,244,+22,229,178,7,224,35,4,241,23,1,228,216,4,64,22,225,47,48,1,49,+54,225,47,10,10,100,105,115,112,108,97,121,32,108,97,121,205,69,192,204,+195,194,232,147,5,192,29,65,207,176,30,226,51,0,230,126,13,241,27,9,+3,95,49,49,55,80,98,0,49,247,254,0,64,0,166,69,196,141,0,66,+64,5,96,41,234,15,9,161,47,100,96,133,71,160,172,228,172,15,225,164,+7,235,82,7,225,160,10,225,250,1,225,157,92,3,50,54,58,51,170,169,+225,157,12,0,50,225,158,7,134,37,225,86,3,225,17,36,225,181,70,66,+14,101,203,64,9,97,64,96,5,100,190,67,111,215,71,5,49,54,32,95,+51,56,114,27,0,49,65,47,65,60,0,80,192,92,224,248,1,5,109,111,+100,117,108,101,97,13,64,179,199,225,194,16,160,18,224,147,1,250,72,0,+150,220,0,55,113,147,1,52,49,125,7,87,195,96,27,158,88,128,58,126,+14,255,156,1,224,81,6,225,129,2,5,101,102,97,117,108,116,224,137,4,+68,89,126,161,96,193,64,221,134,120,134,140,164,96,241,235,0,3,95,48,+32,95,70,153,101,214,82,16,1,95,52,87,98,121,97,0,49,128,26,1,+95,49,120,29,88,54,192,44,1,95,56,91,103,160,243,65,47,128,21,0,+52,127,107,96,165,192,18,0,49,64,198,64,0,64,117,134,216,132,203,164,+193,128,88,147,115,90,44,1,55,48,94,40,97,162,130,191,3,95,56,54,+56,64,205,0,48,120,168,88,126,108,62,182,1,65,71,0,55,66,80,225,+125,0,225,28,1,9,114,101,99,117,114,115,105,118,101,32,129,175,205,104,+225,170,17,224,59,1,13,44,32,105,109,112,111,114,116,32,99,104,97,105,+110,160,57,90,80,89,81,225,169,4,129,159,0,57,71,139,64,226,186,204,+4,56,54,57,32,75,188,1,98,188,192,174,239,211,3,1,55,57,240,76,+0,64,59,64,225,232,89,6,64,230,97,49,163,0,227,11,0,128,69,96,+16,131,23,1,95,50,105,240,129,64,2,49,48,48,110,186,224,12,2,64,+6,128,175,73,222,130,8,96,185,1,49,48,93,108,64,107,135,231,99,32,+1,75,52,224,2,5,164,216,128,166,0,54,192,166,0,56,224,166,0,169,+0,117,109,0,66,141,137,231,224,8,103,80,224,25,12,99,244,132,205,224,+25,6,100,42,192,25,228,0,4,161,255,0,85,91,54,228,230,4,100,71,+136,46,231,199,3,224,43,12,64,94,224,43,11,224,44,12,64,165,224,44,+12,224,159,12,97,107,224,70,11,97,165,224,159,30,144,127,224,114,10,225,+71,13,97,165,224,141,12,102,18,224,97,11,131,163,224,141,29,64,94,225,+0,33,99,246,224,70,11,64,24,224,114,31,144,43,225,0,11,247,195,0,+98,233,66,131,255,60,1,68,166,0,56,93,50,3,95,56,53,50,74,173,+130,190,237,151,0,96,169,129,60,224,42,0,131,87,96,48,99,232,0,56,+127,153,1,52,55,160,113,128,57,169,91,96,60,137,95,202,251,196,195,3,+95,57,52,53,64,4,98,89,5,57,52,56,32,95,57,95,26,160,94,228,+102,8,0,77,134,72,8,110,111,116,32,102,111,117,110,100,196,162,164,251,+228,165,0,0,49,94,214,1,56,54,249,254,1,224,71,6,13,94,42,115,+101,97,114,99,104,32,112,97,116,104,61,128,67,128,178,167,111,65,83,96,+69,69,187,81,134,224,69,13,6,112,97,99,107,97,103,101,224,70,3,224,+57,3,225,14,0,108,41,2,48,51,32,128,4,0,51,197,227,160,228,232,+200,3,128,1,166,104,129,105,193,102,1,95,53,133,197,64,0,96,237,118,+14,96,181,64,184,70,86,161,154,224,31,1,4,39,32,95,57,57,96,53,+202,236,225,37,1,229,9,0,126,56,128,116,235,255,7,128,5,100,251,2,+95,52,55,66,28,84,203,224,187,4,226,61,2,96,245,224,157,6,171,125,+221,39,2,95,56,54,225,77,0,230,137,16,193,86,3,100,111,101,115,97,+236,6,99,111,110,116,97,105,110,166,152,161,244,129,105,161,174,200,58,250,+231,0,230,111,4,224,169,8,226,231,3,224,201,1,71,134,225,66,0,162,+82,243,30,0,130,96,102,137,0,80,134,31,129,197,64,132,241,231,6,128,+0,65,79,1,52,56,67,22,1,56,53,98,148,0,48,135,167,67,124,136,+98,224,241,1,2,46,116,120,82,155,64,26,136,106,72,79,1,48,48,85,+117,128,6,64,25,174,231,5,57,57,57,32,95,49,66,148,1,95,55,64,+194,128,5,64,32,238,248,1,65,117,78,244,64,43,200,67,226,35,5,163,+47,2,52,49,55,64,18,65,147,231,21,0,1,95,56,72,54,72,224,71,+165,183,242,194,133,64,51,64,163,225,178,6,7,76,111,97,100,105,110,103,+32,193,186,202,223,228,51,4,226,201,0,1,55,56,65,181,226,184,9,132,+99,224,147,2,98,147,1,51,53,64,4,0,50,67,61,98,96,2,95,57,+53,72,220,0,52,145,178,226,74,21,0,80,160,143,29,99,111,109,112,105,+108,101,32,118,101,114,115,105,111,110,32,109,105,115,109,97,116,99,104,58,+32,102,105,108,101,163,187,65,19,234,111,0,232,224,7,160,217,128,42,234,+152,0,160,139,224,44,7,160,110,0,114,96,45,192,169,96,0,96,163,1,+56,54,132,240,119,80,0,64,65,166,213,193,193,19,73,196,0,57,74,52,+201,195,224,24,3,1,56,55,224,24,2,74,8,192,47,124,180,128,22,161,+223,0,57,73,51,2,95,57,57,102,69,0,57,130,241,131,234,2,51,54,+55,96,81,1,57,54,65,145,2,56,55,54,96,39,99,221,2,95,56,53,+202,193,160,228,0,57,66,109,1,57,57,228,93,0,228,75,3,100,149,67,+36,2,95,57,57,65,159,0,58,96,214,137,26,0,51,110,85,0,58,96,+24,128,17,233,31,1,0,58,96,79,128,21,0,52,64,42,96,18,134,150,+0,90,69,18,0,58,96,142,192,72,76,143,0,58,96,193,233,117,3,160,+72,131,26,135,229,224,5,1,0,39,74,51,107,172,161,12,81,132,1,95,+57,100,129,160,6,224,25,6,104,109,128,6,224,26,7,101,14,128,6,224,+26,1,4,55,32,95,57,56,101,46,1,57,56,119,242,128,6,0,58,97,+118,192,167,128,185,64,24,114,23,173,198,101,32,228,124,1,238,0,1,67,+187,164,108,107,243,162,51,1,57,54,64,103,100,244,65,186,8,95,55,57,+52,32,95,56,50,50,155,190,229,98,0,248,97,9,96,62,141,246,146,114,+224,43,27,133,185,129,74,152,140,140,101,192,249,231,182,14,231,177,9,16,+117,108,116,105,112,108,101,32,105,110,115,116,97,110,99,101,115,236,28,3,+66,175,231,245,4,224,0,4,1,95,56,99,213,64,98,75,152,0,57,100,+52,64,0,0,58,97,115,193,76,97,59,224,9,1,3,95,57,56,54,192,+155,128,43,130,141,2,75,32,89,97,92,161,1,128,218,96,239,234,20,4,+135,177,167,86,224,32,11,252,112,0,235,129,12,149,13,129,91,234,9,1,+234,196,2,137,183,160,174,224,37,22,250,5,1,192,0,225,202,1,0,90,+192,63,226,68,1,224,77,5,98,228,244,7,2,192,58,96,10,66,109,194,+99,227,200,0,125,171,161,224,96,121,101,116,174,93,141,196,1,57,55,97,+167,224,12,4,224,0,2,224,131,6,224,130,3,96,124,0,90,193,177,224,+38,23,128,127,1,57,56,229,55,1,225,148,0,241,195,12,234,51,1,224,+89,4,235,59,2,225,59,3,225,54,18,224,49,4,225,53,3,111,127,161,+42,96,8,225,52,3,247,249,0,225,223,19,235,156,2,225,222,3,161,95,+160,0,0,58,66,189,103,230,238,28,20,205,232,224,25,9,79,81,224,26,+15,236,240,17,112,251,224,186,17,96,30,224,187,10,231,149,3,224,252,21,+96,123,224,65,10,1,57,55,224,253,1,224,153,13,237,24,1,97,182,229,+53,3,224,97,5,225,186,16,224,55,0,193,192,172,144,161,188,192,136,195,+102,130,29,225,236,0,224,37,4,224,240,5,224,194,9,225,0,18,225,254,+14,225,66,8,225,7,1,225,188,4,106,93,225,33,12,228,85,21,102,149,+225,185,51,240,32,2,224,183,21,224,65,16,240,54,2,224,249,25,226,182,+9,98,154,224,25,12,100,29,225,19,12,96,84,224,144,16,103,202,224,144,+9,224,139,2,224,58,16,229,163,14,5,57,55,53,32,95,53,109,72,224,+202,1,224,150,9,96,31,224,91,16,229,7,8,192,91,247,174,2,224,58,+14,227,159,14,1,57,56,229,161,2,226,86,12,96,31,224,171,12,170,42,+230,172,15,224,112,13,225,2,2,224,58,16,227,167,3,224,171,4,225,61,+1,224,59,16,227,68,14,231,34,3,176,233,134,59,0,58,96,6,165,78,+2,95,57,56,74,234,0,57,77,147,0,58,96,110,7,10,65,32,73,47,+61,32,58,96,18,64,12,0,61,96,12,138,99,128,50,0,55,75,222,1,+57,56,77,130,97,77,3,10,65,32,100,128,50,137,225,0,100,96,50,64,+37,224,50,1,107,74,72,187,0,58,97,187,77,233,96,50,64,18,64,12,+128,50,0,54,96,12,0,66,154,174,100,105,73,4,64,236,132,225,128,20,+230,121,15,230,123,1,97,2,224,7,2,161,1,64,252,0,55,244,104,2,+99,64,160,5,156,157,139,199,207,164,224,13,7,202,125,98,22,64,28,224,+33,8,229,86,1,96,34,160,160,231,158,1,192,160,64,210,141,49,64,160,+99,247,161,170,128,226,192,221,229,150,13,176,111,128,68,160,67,160,228,228,+63,2,162,20,160,6,92,156,130,36,184,146,0,75,87,225,160,33,115,21,+224,40,27,224,47,3,224,40,3,98,144,224,42,12,192,6,230,41,10,98,+147,102,99,0,58,96,6,225,150,5,193,144,111,247,64,112,224,82,5,160,+24,64,11,224,191,5,224,24,4,224,175,3,224,113,0,141,86,64,6,160,+113,1,75,50,160,98,224,34,0,65,142,0,58,96,6,173,162,64,13,130,+234,211,169,177,103,98,138,65,165,1,95,53,66,90,3,66,32,95,51,78,+41,2,95,57,54,96,140,1,95,55,111,180,0,58,75,174,128,61,98,221,+162,175,64,168,163,168,226,120,10,98,2,164,154,129,99,216,181,105,90,0,+58,96,98,240,221,7,77,18,195,67,196,190,139,180,0,83,160,13,64,163,+0,54,223,162,1,95,56,136,134,128,6,0,64,226,197,1,132,254,109,87,+108,152,110,238,77,91,97,187,172,134,0,58,77,238,161,34,0,50,174,215,+78,14,206,215,129,70,78,59,206,178,64,14,129,234,128,151,224,148,26,0,+67,174,112,130,240,237,233,2,111,166,224,141,1,0,58,96,37,121,58,0,+50,75,164,96,107,164,183,217,76,129,118,110,88,249,59,0,0,58,112,36,+224,37,7,64,35,128,45,97,19,249,105,1,0,58,112,131,192,243,0,90,+79,114,96,21,80,244,128,214,161,196,129,206,237,48,6,1,95,57,132,0,+128,14,182,16,196,189,0,48,186,242,112,110,65,232,226,20,0,0,83,179,+115,224,55,23,98,36,96,59,212,8,2,79,32,35,82,240,188,6,160,157,+224,80,2,192,98,229,68,2,224,78,11,212,76,98,128,160,76,130,191,251,+226,5,166,167,226,190,0,99,15,219,202,151,63,0,95,144,54,101,143,245,+193,2,64,43,221,137,129,124,128,45,224,62,2,2,64,95,57,99,77,128,+46,224,103,4,224,38,3,246,21,2,161,121,252,162,15,194,235,161,13,128,+12,239,201,33,0,70,83,62,247,121,7,151,105,246,213,6,224,168,23,196,+84,225,125,2,1,95,57,120,72,102,159,193,181,225,154,2,65,202,196,32,+241,30,2,99,244,251,202,0,0,57,88,130,101,0,225,66,2,0,53,244,+23,2,192,22,128,14,96,174,130,22,66,208,196,73,226,20,3,3,95,57,+51,54,254,198,3,6,104,115,105,110,46,104,115,255,187,3,129,198,160,10,+100,130,253,223,8,131,203,194,136,224,30,1,128,53,67,240,0,53,244,200,+1,225,115,5,9,35,108,105,110,101,32,49,32,92,34,244,160,7,224,40,+6,3,92,34,94,42,192,150,128,72,224,194,16,2,111,117,116,224,195,1,+192,192,165,58,227,105,5,224,169,2,1,95,57,190,170,128,226,225,182,0,+161,211,97,143,64,60,224,252,2,0,57,130,15,162,102,224,23,7,225,165,+3,160,0,0,58,97,172,225,132,9,2,51,54,48,242,80,3,6,72,83,+67,80,80,72,83,225,132,5,224,46,4,162,135,162,51,121,5,0,66,225,+126,10,160,153,118,109,0,50,64,51,246,241,0,195,0,118,232,225,148,8,+7,82,117,110,32,99,112,112,104,210,201,227,3,12,1,95,57,149,134,192,+160,160,108,129,187,0,55,120,126,1,48,52,64,4,1,54,32,70,223,224,+93,1,96,89,225,202,0,224,222,1,224,131,5,7,32,45,45,115,116,114,+105,112,128,129,225,129,3,246,153,0,130,6,127,128,226,90,1,2,95,57,+52,171,215,224,39,0,3,67,39,32,79,224,229,0,224,149,15,1,45,73,+162,128,87,106,1,50,32,224,25,2,10,115,114,99,47,114,117,110,116,105,+109,101,128,34,101,47,64,78,114,34,96,126,1,95,55,117,107,224,208,0,+197,95,249,172,0,226,216,17,2,32,45,79,225,12,1,98,35,0,54,98,+35,161,79,194,136,3,67,32,95,53,120,149,0,57,136,97,225,236,9,2,+32,95,51,118,253,163,148,0,58,99,116,116,22,71,184,0,58,96,55,255,+206,5,0,90,224,1,10,134,255,224,0,2,0,58,100,117,98,180,2,95,+49,56,72,179,5,32,64,95,54,32,89,132,169,131,83,68,100,129,197,201,+171,193,129,232,174,0,192,13,104,185,170,65,106,60,1,35,49,195,36,96,+36,96,46,96,10,204,21,171,18,160,45,250,188,1,64,72,250,185,0,224,+42,11,0,51,243,91,3,128,47,224,131,16,0,48,170,107,151,87,224,76,+10,0,49,145,166,96,114,224,33,14,90,157,224,33,21,98,181,224,67,21,+145,5,64,33,149,245,102,14,224,36,7,135,107,193,104,224,0,2,129,142,+212,64,224,237,15,225,67,3,225,112,2,225,69,13,253,112,0,128,28,3,+95,52,57,54,124,150,90,179,139,253,179,145,64,0,180,36,226,11,8,130,+204,226,12,26,193,179,226,11,71,0,49,150,182,160,0,240,14,6,224,133,+9,138,137,169,76,99,83,1,55,57,192,238,204,127,96,0,0,85,120,251,+108,82,100,24,228,230,4,165,60,68,38,0,54,126,102,102,79,0,57,99,+140,170,201,2,57,52,57,71,30,111,124,72,150,236,159,1,64,19,96,13,+0,58,64,35,128,10,0,73,64,24,0,52,135,200,3,95,57,52,54,64,+27,134,81,0,73,64,10,0,54,163,239,65,15,188,48,229,149,5,198,152,+228,127,3,165,227,67,232,65,79,166,157,231,93,17,5,104,115,99,50,104,+115,231,96,9,129,243,230,213,19,3,72,83,67,50,230,214,1,224,48,0,+230,217,11,233,14,4,234,204,1,143,162,166,7,230,235,65,128,210,230,236,+19,226,180,0,231,230,3,220,157,232,47,10,160,141,232,19,23,225,2,2,+134,198,227,137,6,96,25,198,235,134,198,231,90,20,128,200,225,152,0,0,+79,224,231,2,1,45,111,96,22,0,67,64,67,171,240,234,101,0,231,80,+5,231,69,14,0,83,231,69,70,231,149,4,224,65,8,224,64,20,4,47,+117,110,105,120,231,139,2,231,140,16,224,237,5,98,226,135,4,231,161,2,+205,77,237,97,2,224,19,0,0,58,96,80,1,10,65,225,73,5,7,68,+95,95,77,72,83,95,95,64,129,99,170,65,43,103,177,231,174,4,0,49,+77,168,1,95,57,109,71,64,26,226,154,4,101,62,103,201,147,241,1,51,+52,225,4,3,31,92,34,108,105,98,47,83,121,115,116,101,109,47,68,105,+114,101,99,116,111,114,121,46,104,115,92,34,44,52,49,58,53,130,170,224,+47,1,5,114,101,109,111,118,101,108,191,5,102,97,105,108,101,100,129,28,+0,58,98,117,9,10,65,32,94,117,110,108,105,110,107,68,35,132,85,237,+68,3,1,95,57,77,60,237,253,4,101,198,98,12,224,151,18,5,80,114,+111,99,101,115,68,9,7,92,34,44,50,49,58,50,50,196,74,226,70,0,+229,13,2,7,97,108,108,67,111,109,109,97,77,88,128,163,224,44,0,226,+98,0,131,122,0,51,77,209,129,211,224,66,4,5,44,32,99,109,100,61,+172,5,227,165,14,0,58,99,148,225,139,16,96,89,70,86,198,28,225,129,+1,96,110,193,17,0,55,140,175,224,17,0,1,95,55,140,231,0,58,97,+42,65,80,0,115,97,3,1,32,58,96,82,98,80,224,113,3,116,26,64,+114,134,24,197,132,128,17,70,48,113,31,1,32,95,83,69,114,93,1,51,+50,224,232,2,6,111,112,101,110,84,109,112,65,206,163,202,2,95,57,51,+132,29,225,183,4,0,51,80,163,228,105,8,97,13,239,36,6,170,57,0,+51,64,237,161,156,196,135,174,31,64,29,0,53,66,203,1,51,54,226,32,+0,2,54,51,56,231,233,7,70,98,64,99,81,154,132,166,135,61,129,77,+244,17,2,228,32,5,195,165,115,32,230,21,3,226,80,4,6,73,79,47,+66,97,115,101,162,80,3,54,57,58,56,128,254,0,90,129,93,0,80,72,+124,114,57,64,192,2,48,56,32,128,141,160,19,96,0,0,67,64,36,163,+185,64,206,71,13,0,50,65,112,0,58,96,251,65,184,6,116,109,112,110,+97,109,101,65,185,202,214,226,16,3,0,51,97,232,1,95,51,111,85,99,+6,227,2,19,224,177,5,4,55,56,58,51,48,163,3,0,58,65,210,231,+76,0,65,234,228,7,0,0,54,149,13,1,67,39,119,23,232,131,1,0,+67,157,9,235,80,0,230,233,4,64,16,0,82,224,134,2,67,208,21,116,+58,32,109,105,115,115,105,110,103,32,92,92,101,110,100,123,99,111,100,101,+125,162,50,233,113,0,202,12,210,177,225,169,21,224,232,2,224,82,8,166,+154,161,125,97,110,137,103,3,56,51,32,95,121,194,190,165,128,41,160,39,+172,254,128,241,224,45,10,234,198,1,128,52,64,1,245,72,2,201,133,170,+217,181,80,224,44,3,192,216,5,54,53,57,32,95,54,199,70,230,220,2,+224,55,3,224,52,7,225,13,33,4,98,101,103,105,110,225,15,5,205,133,+224,96,18,106,193,224,39,2,208,128,224,39,3,224,212,1,224,213,2,192,+25,235,29,12,224,41,4,234,240,13,181,76,128,124,224,78,0,233,73,4,+64,8,73,185,226,87,3,194,80,13,98,108,97,110,107,32,98,101,102,111,+114,101,32,62,226,0,3,165,175,66,1,131,133,216,236,225,226,19,235,49,+1,192,66,226,69,1,226,70,18,226,53,33,226,106,4,224,78,43,224,161,+0,165,160,171,210,64,11,187,207,152,81,1,55,49,98,96,160,117,228,27,+7,72,164,13,77,105,99,114,111,72,115,47,67,111,109,112,105,108,164,28,+4,53,52,53,58,49,167,183,224,180,2,230,224,4,163,211,227,192,3,233,+153,9,2,79,32,35,83,201,240,84,1,160,23,231,60,5,224,89,6,224,+84,0,132,153,248,249,0,124,118,130,149,180,99,65,219,2,57,50,52,195,+14,73,134,1,48,52,233,134,3,235,248,0,130,158,224,54,32,0,108,192,+55,75,137,0,57,64,175,0,57,161,193,227,109,0,214,116,180,185,1,95,+56,69,139,0,58,119,97,1,10,65,238,77,0,192,243,64,22,1,95,54,+92,214,131,250,224,195,0,3,95,57,50,56,101,74,128,14,227,22,4,166,+193,224,28,15,0,57,96,203,224,19,5,210,229,65,57,64,127,71,28,70,+241,0,50,122,196,0,57,110,87,224,123,3,64,218,0,51,96,52,0,58,+96,136,224,47,7,224,127,4,1,95,54,125,125,128,198,0,58,96,60,72,+188,65,199,0,50,68,60,164,69,254,175,1,193,174,160,18,135,223,224,18,+4,66,165,65,35,254,81,0,98,182,131,46,0,85,66,43,130,232,224,10,+13,230,142,0,255,59,1,224,29,1,224,39,2,0,58,96,199,224,170,17,+64,37,224,18,6,64,127,224,170,6,112,55,224,171,4,96,17,224,172,20,+241,195,0,128,66,67,194,224,29,1,224,247,26,224,151,8,129,85,224,84,+4,65,85,224,246,12,225,30,31,65,31,136,126,229,156,0,68,240,80,68,+200,175,128,6,0,58,67,52,131,140,73,175,0,56,79,129,2,95,56,54,+92,180,0,50,185,127,121,178,64,164,96,10,0,57,123,178,235,49,2,76,+246,229,132,2,64,81,136,215,116,13,1,95,52,82,43,0,58,96,53,224,+101,34,111,42,224,101,22,187,100,4,57,49,57,32,58,96,70,144,186,0,+52,64,110,79,119,99,178,73,144,135,202,167,208,160,6,133,163,168,223,68,+59,0,49,183,101,238,247,1,192,11,197,44,187,185,231,214,0,160,38,73,+24,198,73,230,81,0,224,8,0,0,58,96,88,244,245,2,96,18,252,228,+0,251,239,2,1,49,54,224,20,0,85,28,160,20,209,16,1,95,56,77,+227,129,252,235,88,0,68,202,1,57,48,81,191,134,19,138,163,165,145,192,+35,170,184,0,53,148,62,156,140,224,30,2,96,192,1,95,53,243,65,0,+1,58,57,66,66,65,88,1,50,57,65,59,0,57,140,31,96,61,0,73,+101,228,0,49,76,67,1,95,57,125,75,0,58,96,121,192,222,70,171,0,+58,96,24,64,63,2,49,49,54,135,223,129,198,0,57,64,153,134,219,1,+95,49,187,118,2,95,49,50,66,3,96,92,0,95,85,134,160,11,0,58,+96,6,98,67,0,48,70,227,0,51,230,74,2,25,67,111,110,116,114,111,+108,46,69,120,99,101,112,116,105,111,110,46,73,110,116,101,114,110,97,108,+69,222,224,39,1,3,83,111,109,101,224,35,0,171,18,64,203,100,51,137,+210,2,64,95,57,104,69,205,5,161,5,75,45,237,138,1,129,56,0,58,+65,103,129,138,99,73,0,56,101,48,98,18,227,147,0,2,95,56,56,101,+97,0,48,123,233,101,103,64,55,197,130,236,172,1,77,16,1,50,32,141,+246,98,114,224,22,5,97,168,224,22,9,98,250,224,22,9,193,228,224,22,+6,164,142,224,22,7,105,191,128,22,68,167,128,20,141,83,84,161,2,95,+56,56,67,110,1,56,56,194,198,96,19,1,57,49,64,19,119,219,192,19,+0,54,70,155,1,95,54,96,234,192,19,0,57,67,234,1,95,57,99,186,+224,19,7,139,20,224,19,5,226,3,0,224,19,2,142,246,0,57,64,93,+0,58,97,72,9,10,65,32,105,115,105,110,116,32,58,96,20,77,80,0,+51,64,11,248,90,5,64,75,141,107,0,75,96,14,130,148,205,122,64,145,+226,209,1,1,56,57,79,80,1,56,57,100,13,1,56,57,67,62,118,207,+3,95,57,48,48,224,11,0,1,49,52,82,131,96,11,0,58,96,6,173,+168,73,185,1,56,52,64,68,97,228,254,164,3,131,88,186,12,195,138,137,+197,194,240,224,15,7,96,92,130,147,96,61,71,245,128,89,64,153,3,56,+32,64,58,64,159,64,30,2,80,32,58,96,16,224,198,3,101,68,0,57,+108,52,2,49,50,54,224,147,2,97,179,160,11,224,81,0,0,58,96,6,+227,152,36,224,92,0,69,124,96,11,0,58,96,6,227,152,57,4,65,115,+121,110,99,227,157,6,96,208,192,159,0,75,97,107,114,17,0,56,224,99,+2,13,115,116,97,99,107,32,111,118,101,114,102,108,111,119,96,55,224,33,+6,3,104,101,97,112,224,32,5,224,33,7,9,116,104,114,101,97,100,32,+107,105,108,242,167,0,224,33,6,5,117,115,101,114,32,105,64,188,3,114,+117,112,116,170,185,193,18,134,68,129,18,101,206,96,6,225,18,53,225,14,+13,130,196,0,73,65,249,226,192,5,0,56,71,197,1,56,57,168,170,97,+249,162,180,195,173,225,249,0,98,192,96,6,225,89,1,104,39,225,17,10,+31,98,108,111,99,107,101,100,32,105,110,100,101,102,105,110,105,116,101,108,+121,32,105,110,32,97,110,32,77,86,97,114,32,4,111,112,101,114,97,224,+160,0,225,17,1,160,135,97,17,64,11,0,58,96,6,225,17,53,0,66,+128,139,0,73,224,138,2,1,79,110,64,133,161,28,65,2,161,28,68,171,+225,28,3,99,22,120,237,161,28,68,210,193,28,192,11,65,28,96,11,0,+58,96,6,225,28,52,10,83,84,77,32,116,114,97,110,115,97,99,225,29,+9,192,136,65,29,96,11,0,58,96,6,225,29,74,2,83,84,77,193,28,+131,72,136,114,128,114,130,162,4,99,97,116,99,104,65,50,199,180,253,112,+1,2,58,56,56,182,68,104,98,141,33,2,55,55,54,68,28,249,30,0,+2,55,56,56,78,181,184,118,245,175,2,1,95,56,84,151,249,53,1,244,+14,1,68,99,246,120,1,236,119,1,0,56,76,161,249,34,0,135,119,73,+245,238,56,6,3,76,111,97,100,80,14,10,115,97,118,101,100,32,99,97,+99,104,101,110,74,245,126,8,192,150,101,58,0,56,168,205,224,159,7,2,+58,56,56,131,9,71,177,189,2,188,17,136,17,1,95,56,149,203,144,99,+2,51,54,50,170,172,170,25,115,59,207,59,234,200,1,148,148,96,23,146,+239,135,96,1,95,56,91,80,96,131,96,40,188,155,138,63,177,135,224,73,+4,160,14,139,7,70,105,79,104,225,11,1,250,242,1,179,167,128,64,254,+251,1,81,75,96,10,0,90,224,18,0,170,46,128,94,192,91,2,95,56,+54,161,32,128,36,174,209,65,179,224,40,6,159,201,128,41,161,1,97,204,+0,56,134,39,213,156,0,49,85,180,224,0,3,1,95,55,167,241,64,88,+0,89,224,141,17,91,110,148,158,0,56,114,47,1,95,56,217,57,235,116,+2,224,114,4,193,64,251,128,3,225,162,0,96,198,224,45,2,251,130,8,+96,213,251,138,16,9,105,110,118,97,108,105,100,97,116,101,130,105,184,33,+130,107,1,56,54,224,227,1,192,203,225,49,5,0,54,105,58,0,55,128,+166,170,39,226,66,3,96,157,123,61,180,91,96,220,0,56,93,92,64,55,+243,90,1,96,14,93,165,98,200,104,28,0,89,108,105,67,204,254,58,0,+106,115,161,38,65,240,225,162,1,140,124,139,217,0,56,67,194,96,0,96,+35,96,168,82,119,1,95,56,93,223,1,64,58,96,104,68,141,74,244,77,+101,0,55,64,198,64,55,0,55,64,128,64,42,100,20,64,128,131,44,127,+21,224,105,4,151,194,192,135,196,3,205,33,86,91,64,169,96,32,96,55,+252,88,0,224,61,2,212,128,129,27,0,58,96,126,164,162,141,53,96,200,+101,54,2,54,55,32,173,190,128,12,161,71,0,50,164,60,96,76,251,118,+1,1,95,55,71,61,0,58,97,95,178,116,3,95,56,54,56,65,6,75,+243,0,49,145,94,139,212,0,55,100,42,193,24,207,24,0,89,100,41,128,+211,64,4,0,83,70,36,0,55,103,90,224,244,0,129,15,150,234,67,250,+113,192,0,56,139,10,192,43,224,45,4,245,141,0,64,2,128,29,128,67,+183,49,226,229,4,76,171,194,116,114,109,66,122,224,83,0,1,95,56,101,+91,100,20,196,123,236,148,0,0,64,75,32,0,64,197,229,224,34,4,192,+110,78,21,224,38,11,240,233,0,74,153,1,50,56,89,143,98,25,109,249,+160,6,64,165,194,22,237,6,0,69,224,102,124,180,198,129,137,64,9,116,+217,66,92,197,101,120,251,131,74,128,52,244,252,0,224,61,6,96,53,140,+89,225,109,0,111,157,192,253,97,178,134,215,106,56,1,57,52,227,217,2,+245,24,5,7,73,100,101,110,116,77,97,112,149,25,5,49,53,54,58,49,+56,180,161,225,199,1,67,60,161,184,0,90,225,170,6,192,126,193,168,192,+13,161,77,195,148,101,142,224,80,4,225,141,6,228,224,0,192,217,160,16,+227,35,2,224,56,0,224,232,6,199,171,224,232,36,1,52,56,224,232,71,+226,164,0,163,221,224,230,12,192,36,65,229,193,248,224,231,18,192,14,175,+92,224,246,1,128,249,170,202,2,56,54,57,105,173,99,80,193,72,224,61,+2,1,95,55,106,139,160,52,210,29,0,58,64,54,128,10,0,73,68,20,+0,54,132,222,209,95,64,60,241,27,6,135,180,0,58,101,220,202,37,1,+95,51,101,248,102,16,2,95,56,54,72,3,137,224,96,17,0,58,96,6,+177,202,1,95,56,125,201,0,58,96,37,205,230,0,49,68,125,0,52,102,+45,156,58,132,125,70,8,228,125,0,71,7,109,247,65,74,128,171,130,220,+214,134,0,75,64,139,133,25,71,58,224,197,17,102,40,65,91,96,202,0,+58,103,115,149,56,0,53,71,164,133,248,69,10,0,56,93,206,64,32,129,+45,10,94,109,100,53,66,70,73,76,69,32,58,96,25,105,54,161,238,2,+95,56,53,133,42,161,224,2,32,95,52,74,83,2,95,56,53,139,83,72,+184,128,145,70,83,252,223,3,247,5,3,64,144,1,95,52,65,145,65,71,+119,108,96,64,225,59,7,64,25,1,10,65,226,229,1,0,58,96,24,128,+37,0,51,106,195,224,1,21,130,134,224,0,7,0,58,96,189,160,213,107,+246,170,43,175,212,230,199,1,100,160,171,3,104,83,88,227,1,95,52,138,+242,131,22,244,12,2,105,184,162,63,226,78,6,112,32,66,205,162,234,64,+75,131,250,0,58,96,50,243,234,4,235,119,1,225,209,9,128,63,0,58,+104,206,226,85,10,0,52,180,204,226,85,8,74,144,236,25,0,64,120,0,+58,96,25,230,230,12,66,104,222,51,96,224,132,7,230,218,3,249,47,5,+128,167,230,223,1,196,44,156,111,228,61,2,149,84,64,107,64,79,0,54,+230,205,2,160,73,195,116,64,187,131,4,102,22,0,75,228,236,20,186,238,+3,67,97,99,104,186,243,4,52,50,58,49,52,218,122,0,58,97,21,104,+64,189,224,96,187,225,146,0,2,64,95,57,161,63,64,42,163,237,65,138,+225,122,3,0,83,65,121,163,71,66,194,100,17,170,109,97,132,97,187,246,+34,0,245,170,2,1,95,56,160,110,114,41,160,13,194,20,224,53,28,0,+90,224,53,2,1,95,51,97,53,106,228,1,58,56,74,94,111,1,64,18,+0,51,160,95,228,8,9,98,52,1,95,49,234,144,0,0,95,235,40,1,+1,95,49,96,252,96,10,0,50,107,161,160,89,208,218,130,98,128,167,234,+103,0,224,220,14,224,118,6,172,162,96,182,96,101,64,21,0,58,96,6,+175,193,64,85,216,170,224,85,8,100,9,224,77,2,0,58,109,162,192,57,+247,246,0,67,228,228,5,42,0,58,110,135,64,226,70,47,248,41,3,138,+55,160,11,0,56,67,241,1,58,56,67,241,128,43,75,40,96,31,2,56,+50,52,235,156,2,233,191,1,225,204,0,166,202,128,219,138,241,131,102,0,+80,195,81,135,112,1,95,56,123,201,64,55,71,145,133,55,1,95,56,86,+70,2,95,56,51,128,187,128,69,0,79,201,119,94,69,77,125,248,222,4,+122,111,1,66,32,150,183,96,70,130,237,96,23,1,95,56,91,225,64,0,+105,85,204,136,138,70,64,43,109,138,89,101,151,4,125,238,80,10,160,46,+253,225,2,66,41,4,55,52,32,95,49,69,191,1,95,49,71,17,108,87,+3,49,53,57,32,254,240,0,6,95,56,51,54,32,95,53,244,85,0,1,+48,56,68,167,224,42,4,98,209,224,74,18,101,30,224,95,8,237,44,0,+161,134,171,228,64,154,87,108,173,35,0,83,166,116,64,229,247,109,7,224,+25,2,96,173,133,45,94,154,65,168,0,50,81,164,70,179,1,56,48,255,+167,3,0,35,192,201,255,119,19,3,69,120,112,114,191,116,4,48,52,58,+50,49,132,129,242,81,2,8,117,112,108,101,67,111,110,115,116,146,205,134,+50,64,121,224,35,1,1,40,41,177,203,79,89,165,225,98,80,96,48,224,+11,2,192,8,99,98,0,58,66,15,132,184,101,164,0,51,91,225,98,60,+96,19,1,51,50,97,206,0,53,129,206,0,58,96,30,128,24,0,49,161,+164,0,58,97,251,131,139,80,235,1,95,56,94,65,1,95,56,94,235,0,+58,96,162,166,162,66,77,1,116,111,96,171,64,24,131,134,67,145,190,161,+86,175,190,124,66,126,97,124,0,85,64,42,190,97,96,31,224,218,3,160,+35,224,208,5,0,58,99,19,128,207,124,0,64,17,199,180,237,252,0,1,+95,55,85,129,110,0,237,238,1,68,45,224,92,0,80,129,65,244,202,220,+234,206,1,251,196,3,0,55,159,125,99,184,198,236,2,55,57,54,173,235,+97,255,237,202,5,64,1,143,85,230,220,0,237,214,10,160,121,232,75,2,+160,126,237,223,1,107,77,64,77,237,223,20,228,84,1,64,159,173,50,224,+125,3,237,14,7,189,116,224,144,5,237,213,2,64,5,96,113,224,30,1,+224,9,1,64,105,76,193,161,22,192,235,192,7,225,25,3,99,162,193,18,+176,138,224,10,11,225,127,1,161,3,226,200,0,128,193,113,153,0,57,238,+103,5,64,18,69,108,98,134,124,230,160,24,64,0,1,95,56,75,141,161,+147,1,95,56,70,207,225,160,0,224,133,25,129,14,224,13,4,128,38,237,+184,6,0,67,64,85,0,54,160,231,239,248,3,224,91,9,224,42,0,134,+171,226,37,0,194,39,224,16,9,224,127,1,141,70,224,34,1,201,56,192,+15,107,67,239,135,4,138,127,225,69,1,160,10,134,126,97,80,128,141,1,+95,56,161,65,193,169,224,118,5,225,141,0,224,122,1,225,144,47,129,145,+161,139,160,18,225,5,39,225,142,2,224,25,9,129,18,192,241,0,39,163,+49,226,90,18,165,239,108,162,224,201,35,225,254,1,1,95,56,84,66,193,+247,224,23,3,0,50,77,53,194,112,224,211,1,224,213,0,224,19,12,224,+205,9,192,33,225,240,115,225,38,47,161,29,161,12,224,83,4,192,1,192,+248,224,25,19,224,157,7,196,205,224,53,9,224,23,1,224,24,2,197,94,+0,83,96,195,225,52,3,77,166,224,187,0,193,62,225,133,36,199,115,224,+32,1,195,28,225,155,3,224,101,11,229,160,0,225,123,96,224,104,22,192,+184,227,213,60,0,58,102,104,112,72,224,86,0,224,5,4,182,41,147,200,+192,133,229,48,2,225,231,3,1,95,56,112,202,226,206,1,160,63,230,227,+1,76,60,242,232,31,5,50,48,55,58,49,57,173,248,0,58,97,29,224,+167,17,214,209,224,167,5,194,156,225,78,3,224,11,1,192,146,192,200,210,+223,204,231,224,224,5,96,2,224,221,0,71,207,128,236,224,25,1,128,230,+230,187,2,96,16,228,90,26,224,98,4,193,76,224,49,2,225,87,0,225,+72,1,96,54,225,97,13,225,99,36,0,49,225,99,4,66,136,1,10,65,+75,173,0,58,99,1,237,206,0,192,251,224,175,1,226,23,23,224,181,11,+225,251,35,0,51,224,151,4,138,110,224,139,14,225,251,33,230,83,7,96,+23,128,16,224,8,5,104,59,233,147,6,96,54,249,172,0,249,181,1,224,+87,6,226,23,60,224,119,31,226,44,102,0,50,225,148,4,0,54,234,151,+10,225,162,1,199,252,227,176,12,135,239,225,34,1,224,51,1,96,24,64,+176,234,181,2,246,135,4,246,149,7,224,108,3,192,232,185,108,135,70,99,+216,0,32,231,76,0,64,50,224,12,1,133,31,142,59,229,43,0,82,26,+0,58,97,36,226,116,3,224,97,70,0,58,97,167,227,109,0,140,232,0,+67,173,65,1,75,50,175,125,0,75,85,27,96,141,140,5,1,95,53,81,+215,83,182,123,60,0,90,155,67,1,90,32,172,109,199,189,224,28,6,70,+39,224,28,16,0,54,64,81,224,28,15,103,28,224,29,17,75,184,224,29,+1,1,95,54,83,69,108,242,0,95,125,49,96,10,0,58,96,6,224,187,+1,80,208,0,56,95,242,128,56,3,95,55,57,55,160,161,0,48,150,67,+96,16,96,149,224,16,3,128,137,224,17,4,96,125,160,17,128,122,96,80,+128,122,64,10,0,58,96,6,224,122,1,119,31,0,48,110,102,0,48,127,+243,86,198,2,95,56,48,117,110,81,212,128,70,96,82,128,70,96,10,0,+58,96,6,8,10,65,32,98,115,62,61,32,58,96,41,128,13,64,12,132,+155,2,98,115,60,96,26,0,54,192,13,64,12,130,65,4,98,115,99,109,+112,64,14,238,243,0,162,245,227,55,1,81,183,79,83,1,95,49,125,232,+227,24,8,96,143,64,189,0,53,159,96,0,53,87,254,96,7,111,210,88,+1,96,229,0,49,193,154,193,161,181,230,228,121,0,0,49,80,36,149,246,+0,58,96,6,160,54,129,81,160,45,145,204,128,17,82,154,160,17,0,58,+96,71,224,48,1,65,47,1,55,57,126,225,64,32,96,233,3,47,61,32,+58,96,19,96,13,0,61,96,13,129,45,0,73,64,10,129,43,228,237,5,+224,13,13,229,170,4,64,11,192,8,167,157,0,58,99,121,96,76,186,58,+64,63,112,110,100,52,154,40,112,83,224,113,0,224,71,8,0,58,84,2,+96,209,69,140,0,58,112,116,1,10,65,87,83,0,58,101,157,241,178,33,+122,167,248,221,3,15,34,46,109,104,115,99,97,99,104,101,34,32,64,58,+55,56,129,18,248,130,18,0,66,115,223,248,189,6,138,79,83,53,96,50,+1,95,52,89,68,98,45,83,130,126,249,118,246,2,95,55,56,137,211,2,+58,55,56,231,183,0,224,105,3,0,55,106,19,128,105,224,132,3,2,95,+55,56,120,166,224,47,4,100,221,137,253,249,240,6,0,49,113,157,0,64,+245,201,2,157,245,224,77,1,109,76,132,252,133,174,224,109,6,229,46,2,+224,213,6,246,30,3,96,200,167,244,218,225,2,55,56,53,97,73,129,246,+15,73,79,46,100,101,115,101,114,105,97,108,105,122,101,32,58,96,29,90,+239,20,97,100,100,95,108,122,55,55,95,100,101,99,111,109,112,114,101,115,+115,111,114,64,31,194,9,0,83,124,13,162,54,172,115,82,134,0,55,166,+80,202,6,225,17,4,129,138,219,55,224,207,0,0,51,91,224,224,53,4,+224,216,5,120,136,108,88,213,161,0,58,65,28,98,10,160,215,161,13,225,+34,2,65,249,135,10,224,74,1,102,83,1,55,56,69,59,0,51,97,196,+247,76,4,97,196,64,252,5,117,110,103,101,116,98,64,237,130,189,192,100,+130,71,224,99,0,0,53,68,138,225,229,0,251,214,1,150,124,1,54,52,+174,118,200,159,123,249,86,247,224,35,0,0,67,83,182,0,51,78,153,3,+48,57,53,49,96,77,3,35,53,53,50,67,146,98,157,225,1,0,0,53,+98,55,104,5,93,112,79,130,0,51,125,210,227,40,1,17,104,71,101,116,+67,104,97,114,58,32,115,117,114,114,111,103,97,116,67,50,224,52,6,1,+55,55,69,136,224,52,9,160,41,0,58,97,53,116,145,1,35,52,157,105,+96,49,182,69,248,143,4,2,55,55,55,98,241,87,159,2,53,48,48,65,+33,245,180,4,12,111,112,101,110,66,105,110,97,114,121,70,105,108,128,138,+225,108,2,0,58,99,73,232,247,0,224,87,2,0,52,85,41,65,203,227,+199,10,132,45,225,130,3,0,52,85,109,196,80,227,206,7,162,80,65,158,+162,58,1,95,52,86,66,128,234,64,191,221,54,249,47,20,249,43,10,1,+58,55,70,96,68,241,101,217,153,34,66,249,72,117,2,58,55,55,131,68,+21,73,79,46,112,101,114,102,111,114,109,73,79,32,94,119,97,110,116,95,+103,109,112,96,32,230,195,0,129,87,226,185,1,1,95,52,69,61,64,0,+239,253,2,165,54,224,17,1,224,243,1,169,65,170,21,227,86,4,110,217,+0,52,71,224,64,86,70,226,153,2,3,95,52,57,57,229,97,2,5,105,+110,99,108,117,100,194,44,128,0,165,160,227,142,1,224,88,43,4,99,98,+105,116,115,224,86,4,234,215,4,234,218,0,64,215,132,61,192,105,128,29,+225,238,0,96,8,96,228,224,132,2,2,64,95,55,158,88,224,66,6,139,+202,224,48,0,224,5,6,241,28,0,228,21,6,96,90,0,52,85,51,118,+49,70,84,77,197,151,134,64,26,71,228,99,146,0,55,224,225,2,6,69,+120,101,99,117,116,101,171,203,0,95,122,17,0,50,73,147,0,51,162,127,+161,74,229,188,5,0,53,100,205,160,219,230,152,4,164,96,224,135,4,98,+96,1,55,53,100,172,0,55,101,225,96,143,66,189,224,141,6,13,99,111,+109,109,97,110,100,32,102,97,105,108,101,100,221,234,160,106,226,95,7,229,+133,1,224,245,15,128,54,96,248,128,10,224,109,5,1,67,32,70,23,7,+105,108,97,116,105,111,110,32,192,0,128,115,160,215,64,48,160,59,0,55,+90,168,160,188,126,101,251,59,1,250,88,4,0,64,228,157,3,0,109,226,+61,6,192,148,224,1,3,1,95,55,125,66,128,0,226,72,4,226,8,0,+196,99,128,142,192,66,0,83,124,59,1,95,55,98,190,224,20,8,238,83,+1,194,49,64,23,225,1,5,1,45,73,192,158,64,39,128,243,92,142,128,+225,224,42,12,64,146,3,95,52,55,50,96,99,239,103,0,128,55,192,203,+131,74,224,106,17,0,79,65,148,0,52,64,4,0,54,103,130,224,37,2,+7,68,95,95,77,72,83,95,95,225,133,0,160,86,1,54,51,99,109,193,+3,65,231,70,108,2,79,32,35,93,240,124,206,128,154,224,30,4,224,88,+1,0,39,161,215,224,115,0,66,139,103,179,128,59,192,0,227,200,7,196,+56,96,86,1,95,52,102,177,224,40,26,1,55,54,239,88,0,228,132,7,+224,37,1,160,215,2,95,55,54,167,45,1,55,50,83,198,68,132,64,67,+64,8,64,70,160,31,196,161,0,55,91,37,224,0,0,129,244,227,10,1,+128,126,64,40,66,148,64,12,225,3,1,3,47,42,46,99,226,142,2,111,+143,79,102,144,234,224,5,5,160,131,1,55,54,162,210,224,101,0,65,144,+65,94,66,1,224,90,1,3,101,118,97,108,224,92,1,160,142,130,73,226,+144,0,71,183,226,98,1,227,93,0,2,95,55,55,65,84,193,134,226,176,+3,159,95,224,109,9,3,109,97,105,110,224,109,1,224,154,96,224,0,0,+225,90,10,81,44,5,114,117,110,116,105,109,230,134,0,2,95,55,55,139,+145,64,143,193,188,73,131,71,61,137,250,0,85,231,182,21,231,188,16,96,+66,137,233,0,85,76,164,224,66,23,64,1,224,70,12,96,72,138,33,96,+139,0,65,128,157,137,66,136,87,110,33,97,34,232,106,2,224,2,3,64,+51,160,74,66,45,96,37,0,65,72,34,66,168,224,51,2,96,32,0,54,+192,18,224,63,1,224,166,20,0,58,99,73,224,121,5,224,219,25,0,58,+99,218,107,228,0,89,133,64,73,138,106,176,163,143,199,9,160,45,225,142,+2,127,75,100,218,193,93,145,120,101,81,224,187,1,96,17,182,137,229,156,+3,166,56,0,50,76,157,164,145,230,26,0,0,95,96,20,0,35,95,147,+138,153,0,53,129,85,143,174,0,67,99,122,106,51,0,52,68,210,2,95,+49,50,112,209,96,69,0,85,192,14,235,123,2,207,197,135,90,0,58,96,+6,237,240,9,0,49,79,132,1,95,55,96,49,235,145,3,107,203,235,202,+3,103,51,2,95,55,53,68,185,199,167,0,58,103,234,79,9,1,32,58,+96,18,3,10,65,32,90,83,145,0,58,96,39,76,105,5,115,121,115,116,+101,109,64,30,129,114,235,102,9,0,52,67,196,224,21,6,140,114,204,120,+2,95,55,52,128,164,172,241,232,79,1,65,88,231,222,14,232,211,2,102,+117,67,255,227,145,1,22,87,97,114,110,105,110,103,58,32,99,111,117,108,+100,32,110,111,116,32,102,105,110,100,99,156,131,231,128,110,224,51,3,3,+105,110,32,102,171,233,227,243,0,225,48,0,0,80,230,180,16,6,100,101,+102,97,117,108,116,96,90,194,101,64,158,0,85,192,246,145,191,164,217,233,+46,5,232,197,57,11,70,111,117,110,100,32,116,97,114,103,101,116,201,49,+100,193,1,52,54,97,27,73,205,137,111,3,56,32,64,83,76,236,134,254,+160,164,226,18,3,144,194,233,255,6,0,85,160,193,234,242,0,224,49,4,+96,107,245,246,5,224,13,17,230,112,11,2,95,55,53,96,104,134,200,3,+95,55,53,50,234,15,3,197,183,128,130,77,7,1,95,55,110,100,231,225,+9,224,43,0,224,75,4,200,25,224,62,26,3,102,108,97,103,233,174,1,+224,67,45,2,108,105,98,224,66,12,224,35,1,3,117,110,105,120,224,212,+34,2,111,110,102,224,79,21,1,45,111,224,77,35,0,117,130,165,64,0,+3,95,49,51,50,209,206,233,22,3,67,218,133,14,0,67,162,44,0,58,+64,113,133,77,192,1,141,205,160,145,243,19,23,64,64,229,59,4,224,2,+4,234,251,0,0,58,99,143,229,180,7,210,254,64,79,120,224,226,135,0,+253,234,1,107,42,103,251,100,205,224,216,3,226,227,0,147,29,0,53,67,+20,128,108,68,113,101,45,64,31,236,222,4,0,52,108,222,227,186,1,128,+124,137,17,64,13,224,44,4,0,53,118,24,250,85,1,131,227,66,215,113,+242,200,154,227,242,1,195,203,227,198,6,2,67,97,110,68,163,5,112,97,+114,115,101,32,232,173,1,228,46,6,160,76,228,42,15,164,37,240,117,2,+196,141,166,163,238,48,57,2,82,101,97,196,109,0,115,101,45,9,46,32,+80,111,115,115,105,98,108,101,192,22,164,133,205,36,100,78,228,83,4,0,+89,97,219,67,86,193,213,64,139,85,182,97,104,105,245,224,0,1,244,14,+5,224,219,9,233,242,9,160,135,0,46,227,61,0,0,58,102,131,183,114,+230,140,0,2,53,49,50,95,53,161,213,1,95,55,76,73,114,105,0,53,+70,78,114,244,146,249,0,66,64,43,80,41,0,55,130,62,1,95,53,81,+162,0,58,97,225,162,213,97,76,0,55,98,172,237,110,2,234,73,0,96,+28,64,65,0,54,87,4,224,170,2,2,58,94,42,197,178,64,66,140,237,+225,113,5,2,32,32,102,69,226,225,85,1,0,52,85,217,138,79,0,54,+149,134,97,223,224,59,13,5,101,120,112,101,99,116,239,76,0,237,162,0,+2,55,52,53,227,41,7,198,243,0,58,96,230,99,136,2,95,55,52,82,+24,120,146,0,58,64,50,227,159,8,201,84,203,181,193,189,194,248,128,27,+108,218,96,125,204,222,224,106,0,168,53,104,225,96,76,73,208,3,95,55,+52,50,96,64,204,208,2,48,56,32,137,55,160,53,132,161,224,137,3,1,+51,52,224,248,3,14,92,34,108,105,98,47,68,97,116,97,47,76,105,115,+116,156,183,5,49,49,57,58,49,53,129,9,224,42,1,16,102,111,108,100,+114,49,58,32,101,109,112,116,121,32,108,105,115,197,35,160,212,1,83,32,+158,5,64,14,254,217,4,96,10,106,76,160,148,202,51,105,201,242,211,1,+141,198,231,233,2,160,211,241,107,9,97,42,225,193,5,231,210,0,192,83,+233,179,9,224,26,13,245,189,6,224,90,10,2,108,105,110,196,106,164,13,+224,152,2,176,218,224,52,8,4,44,32,99,111,108,128,53,224,40,4,240,+246,4,6,101,110,100,45,111,102,45,201,76,224,26,3,5,110,111,32,108,+111,99,113,114,196,229,224,28,17,0,58,99,52,117,205,130,28,226,18,1,+64,7,66,20,188,58,134,38,0,58,96,7,194,24,243,41,0,64,4,137,+140,73,246,0,53,65,167,130,235,244,142,14,104,151,248,237,1,226,120,0,+224,46,30,221,6,145,81,163,1,224,39,11,132,211,230,59,3,224,39,12,+140,5,224,205,4,233,72,1,224,82,6,165,39,151,170,192,130,66,162,249,+191,4,0,35,67,201,129,221,0,54,77,254,3,67,32,95,54,76,222,0,+35,195,97,224,109,29,224,69,0,192,108,96,202,224,108,15,232,160,0,224,+77,2,119,125,140,240,0,90,102,142,144,249,124,251,74,122,174,91,96,52,+1,95,54,84,49,130,2,96,173,255,105,2,96,184,64,15,0,54,67,172,+235,188,1,2,54,51,56,236,228,0,186,185,160,141,160,228,64,140,225,121,+6,0,54,121,119,64,28,135,201,192,28,99,202,0,54,89,180,225,30,31,+134,198,193,30,224,109,12,102,33,224,157,1,1,95,54,64,193,2,35,49,+50,130,66,224,50,35,127,98,161,42,169,26,107,112,224,43,10,102,131,96,+30,65,28,0,54,82,212,1,95,49,84,222,97,254,72,39,2,50,49,53,+225,197,6,160,206,224,19,7,130,155,224,76,12,96,100,1,95,54,93,62,+224,32,13,0,49,135,76,0,54,216,46,225,86,1,154,141,161,114,0,51,+71,151,97,142,225,108,20,130,50,64,23,193,47,229,172,2,167,247,0,32,+193,220,224,105,0,242,98,0,0,54,67,57,160,69,232,12,1,163,22,160,+194,162,21,224,134,20,205,178,79,92,228,49,1,199,7,97,2,225,64,3,+0,51,130,141,224,142,15,201,139,224,142,12,224,52,14,131,60,224,52,8,+225,100,3,224,194,20,160,146,228,66,24,128,133,224,132,14,0,56,96,110,+224,132,56,130,242,98,203,136,77,189,173,221,178,235,245,2,70,30,161,25,+129,237,2,95,52,54,103,96,0,54,64,10,239,185,13,231,1,3,74,10,+132,44,88,174,161,158,133,202,97,183,93,118,128,203,67,32,106,34,0,66,+71,186,123,235,1,95,54,71,226,98,222,202,58,96,134,241,252,2,96,36,+161,34,96,36,96,90,128,42,160,48,1,95,54,73,13,225,33,1,96,239,+98,55,139,27,229,96,9,224,244,2,224,31,0,224,29,15,160,27,196,17,+237,254,4,3,50,56,52,32,96,41,87,80,0,51,199,30,165,113,224,143,+0,225,177,21,230,121,29,167,75,226,54,7,97,21,106,106,104,188,224,134,+4,226,69,21,229,31,2,96,9,163,250,163,252,128,247,132,84,133,205,135,+193,96,122,93,121,2,95,54,57,66,106,230,123,8,226,122,2,64,76,170,+214,130,221,96,76,129,9,224,222,6,1,64,35,100,204,2,95,55,48,227,+185,20,225,78,2,230,117,0,96,119,224,21,7,0,55,94,145,225,122,25,+130,53,231,135,23,224,38,0,114,5,225,161,17,205,86,64,77,3,83,32,+95,55,67,4,224,193,0,97,229,1,95,55,102,109,207,159,97,12,224,67,+9,175,188,224,37,37,0,90,229,35,7,224,37,4,111,199,1,95,49,78,+198,67,84,134,71,240,65,0,96,0,1,95,55,72,77,225,100,0,198,74,+97,78,224,229,8,193,40,65,19,224,29,4,102,215,130,42,152,18,99,190,+0,48,130,55,235,16,4,16,85,110,114,101,99,111,103,110,105,122,101,100,+32,105,110,112,117,211,133,171,30,165,39,98,202,225,83,14,96,33,192,171,+129,195,132,238,105,30,96,210,66,163,119,138,128,53,1,48,32,228,197,2,+19,73,108,108,101,103,97,108,32,67,104,97,114,32,108,105,116,101,114,97,+108,171,91,225,85,18,150,76,225,85,17,226,170,1,0,95,135,168,224,189,+20,226,17,6,225,197,42,224,111,9,225,157,2,227,128,9,227,88,14,135,+100,101,202,227,202,0,169,69,131,204,164,30,206,166,97,103,65,121,228,126,+4,238,197,2,192,105,234,119,14,64,119,151,214,224,0,4,96,132,1,55,+51,163,188,234,246,3,64,3,196,253,64,5,101,143,160,218,79,215,160,115,+1,54,56,97,159,96,111,229,46,1,224,48,6,0,55,133,76,224,48,11,+64,0,65,173,3,95,55,51,54,149,241,241,47,0,161,34,0,55,227,1,+2,225,28,0,225,14,1,0,55,71,129,225,14,6,225,13,42,192,48,1,+95,54,222,44,192,69,167,19,192,29,163,196,225,216,15,0,58,96,21,112,+40,101,230,197,224,64,7,79,157,228,204,3,3,67,32,61,61,72,130,160,+237,0,85,198,71,96,236,128,202,96,102,101,238,107,11,65,31,0,58,96,+146,110,59,0,80,138,188,120,230,64,37,152,213,128,2,237,250,2,129,3,+66,105,0,55,166,252,212,52,192,44,102,143,192,46,64,1,166,162,224,41,+2,198,96,198,167,224,46,1,66,40,224,58,0,128,54,192,13,230,195,0,+235,4,13,224,55,4,224,131,8,199,25,231,62,0,128,215,128,2,225,163,+2,96,62,224,21,0,224,13,1,237,4,3,224,28,5,134,200,139,97,230,+93,4,163,137,97,139,227,155,5,160,19,162,140,96,0,192,55,128,190,160,+73,130,199,226,118,27,68,118,180,64,192,197,113,190,192,145,160,168,129,106,+162,239,130,237,130,153,0,52,98,138,224,69,2,160,70,162,248,224,50,0,+131,105,133,167,224,138,0,224,150,15,228,34,8,128,83,129,62,229,40,6,+206,159,226,208,2,129,119,65,94,97,0,113,0,206,230,175,36,238,234,11,+224,74,0,153,242,225,0,2,229,9,14,165,4,129,2,161,15,227,239,7,+192,202,0,58,97,145,184,21,234,91,0,143,211,162,11,242,153,1,96,33,+142,85,171,157,3,67,32,95,51,127,93,251,128,3,1,108,101,115,123,224,+18,3,3,119,104,101,114,114,68,224,20,3,0,100,120,244,224,17,3,0,+111,117,232,224,17,3,0,109,128,36,255,188,1,129,170,101,62,73,248,224,+135,1,65,50,236,21,3,0,105,185,114,70,204,84,182,118,162,128,219,226,+230,0,2,67,32,60,196,98,132,8,228,118,4,221,186,98,122,0,90,112,+226,64,16,93,57,224,43,4,65,14,160,43,65,206,231,51,7,1,49,50,+135,52,189,248,232,215,1,224,207,0,224,73,59,236,9,4,226,247,1,137,+172,166,153,94,67,96,43,98,32,0,58,99,46,179,102,67,164,66,94,196,+192,202,90,129,108,234,93,9,162,147,128,32,0,64,69,108,96,33,116,121,+237,166,4,76,3,0,53,229,187,1,128,126,229,109,1,0,58,100,51,133,+154,130,89,132,122,224,14,3,0,51,224,14,3,112,71,227,33,7,128,215,+0,58,96,82,162,203,2,80,32,35,97,30,0,80,96,232,149,211,156,186,+194,219,145,91,0,80,64,83,246,116,6,14,115,114,99,47,77,105,99,114,+111,72,115,47,76,101,120,182,118,4,56,56,58,49,54,246,118,7,2,105,+109,112,185,55,8,58,32,102,105,114,115,116,32,99,73,191,8,105,115,32,+97,32,100,105,103,105,182,133,196,191,230,83,1,198,86,131,190,229,226,12,+235,255,13,230,29,1,224,42,5,214,224,224,23,4,64,1,198,39,224,22,+2,161,215,131,191,161,61,64,0,128,23,230,74,0,128,145,165,42,104,80,+160,69,134,45,65,58,121,81,224,92,3,128,131,226,56,2,135,3,160,87,+96,65,225,4,0,160,13,96,33,196,108,128,95,224,107,3,107,61,153,172,+64,17,229,165,1,0,67,224,11,2,234,58,4,160,133,167,12,231,21,6,+224,21,7,231,223,0,225,31,4,224,48,2,224,146,1,198,207,128,30,157,+21,192,50,192,160,225,46,0,98,104,1,32,95,80,97,99,145,128,52,104,+179,84,23,128,95,160,220,0,55,68,187,1,95,54,116,47,1,95,53,83,+91,131,195,0,56,69,169,139,87,128,92,224,143,1,224,250,1,225,19,25,+2,95,55,50,67,175,0,80,81,214,79,44,160,97,96,0,225,30,5,224,+166,2,224,5,3,65,153,96,208,100,78,104,55,6,95,55,50,56,32,95,+53,111,118,160,148,224,249,3,96,40,96,251,224,40,7,97,64,225,13,26,+1,49,56,100,236,134,196,225,12,14,97,8,217,33,193,23,67,31,96,9,+2,55,50,57,226,222,0,1,67,32,113,29,192,245,225,17,19,226,161,16,+160,87,226,252,9,194,113,226,84,3,130,60,224,17,4,234,73,8,224,41,+3,227,51,7,160,28,226,100,26,225,106,16,226,115,67,226,110,2,226,78,+23,187,204,65,34,223,248,228,88,1,234,103,7,228,216,2,160,182,128,59,+156,73,160,61,234,226,1,232,241,2,242,37,2,129,174,235,72,10,226,115,+3,229,98,1,193,77,229,26,0,128,67,160,73,64,161,225,55,1,104,100,+247,171,14,113,213,214,217,227,1,1,105,141,112,47,128,151,128,242,0,83,+97,117,162,174,0,53,71,127,71,226,141,77,128,54,227,196,13,239,96,7,+173,127,72,30,167,83,64,10,185,97,141,17,225,141,1,225,55,25,163,223,+225,55,6,209,139,225,55,128,193,42,225,41,19,129,26,225,24,29,224,185,+2,235,154,2,224,183,35,226,156,1,224,190,63,96,93,224,190,29,170,204,+226,38,18,197,250,182,160,2,95,54,56,86,44,227,213,0,160,196,0,58,+112,220,157,153,255,121,16,4,77,97,121,98,101,137,3,4,56,49,58,50,+48,255,121,8,15,114,111,109,74,117,115,116,58,32,78,111,116,104,105,110,+103,104,242,0,73,105,119,253,199,2,64,249,222,0,229,97,0,225,45,0,+129,27,237,173,0,0,58,69,187,64,58,109,23,0,58,68,215,240,54,0,+77,232,0,50,68,164,100,134,65,193,143,125,129,92,238,208,0,229,133,7,+232,138,0,226,177,0,230,216,0,1,95,55,75,88,195,161,141,138,64,140,+87,55,64,15,65,144,96,15,0,56,252,151,3,224,9,1,201,74,195,55,+224,15,6,224,66,4,224,82,20,192,45,99,184,237,131,4,130,80,118,223,+224,163,35,130,202,69,210,224,132,33,130,38,165,183,75,211,96,197,195,227,+197,109,160,23,80,22,129,208,192,8,224,238,46,134,152,163,136,230,47,1,+65,229,112,50,160,198,224,9,3,224,104,35,0,58,102,238,98,139,225,237,+52,0,58,96,142,242,193,0,194,144,89,241,226,137,28,228,106,1,130,122,+224,11,3,226,140,61,161,60,180,100,200,180,0,83,100,43,226,171,10,97,+117,226,189,64,225,3,151,91,200,225,4,88,225,5,20,64,38,228,143,2,+193,11,224,177,2,228,147,143,134,225,99,245,136,198,224,68,57,2,55,50,+50,224,69,46,126,58,143,207,228,139,3,1,49,55,114,230,234,198,5,193,+0,225,194,39,224,92,8,100,118,224,92,55,0,58,102,182,199,21,175,104,+130,164,64,13,216,32,0,83,197,21,3,66,32,95,50,70,254,160,66,229,+208,34,200,60,229,208,3,224,99,0,192,115,253,87,0,224,111,2,70,99,+224,110,62,225,164,31,224,46,0,224,101,31,128,91,230,55,11,67,63,230,+150,44,224,90,2,163,175,96,30,238,9,1,230,149,0,224,206,1,96,198,+141,40,224,9,1,64,83,0,55,90,225,192,83,192,7,0,58,99,212,146,+237,224,184,5,132,159,224,98,2,98,29,128,29,160,125,226,29,15,116,248,+96,197,0,54,128,213,228,42,22,217,193,232,28,37,192,53,226,76,5,132,+225,133,96,3,95,49,55,52,224,42,3,118,173,225,73,2,140,254,224,165,+20,128,109,160,156,164,30,224,10,4,224,168,15,224,56,0,0,58,97,119,+106,56,1,75,52,128,138,0,58,96,59,180,22,98,232,129,110,160,147,64,+31,139,4,224,170,1,229,174,5,224,13,0,193,136,233,152,1,192,34,129,+191,227,203,0,165,208,133,229,80,122,125,11,226,241,12,229,247,0,128,2,+93,150,0,54,225,112,4,230,201,1,96,74,1,55,49,128,232,226,216,1,+229,218,0,192,26,195,204,129,112,1,55,49,131,205,237,29,7,225,244,27,+224,43,0,128,45,230,131,23,224,45,0,0,58,112,110,129,133,0,51,75,+191,64,131,85,128,225,97,3,191,176,228,118,5,224,102,36,234,221,37,224,+54,0,228,113,6,229,135,2,225,241,2,227,105,16,96,74,207,183,160,126,+128,230,229,104,9,160,2,224,82,9,97,151,128,76,0,50,228,119,0,228,+116,3,194,77,129,34,231,199,5,194,87,88,57,154,80,231,218,2,227,117,+1,128,178,68,145,224,101,2,224,178,13,194,107,96,40,161,39,193,17,168,+200,104,198,137,76,65,170,100,220,224,44,0,96,116,224,115,46,224,30,4,+160,80,231,91,4,128,87,224,5,0,169,15,225,237,32,228,115,23,226,89,+13,128,140,227,49,6,239,35,17,7,73,110,116,101,103,114,97,108,143,38,+4,53,55,58,50,51,239,38,7,64,39,0,46,224,39,0,19,92,94,58,+32,110,101,103,97,116,105,118,101,32,101,120,112,111,110,101,110,152,43,0,+58,99,198,230,35,1,226,8,2,176,162,229,239,27,229,73,4,161,198,133,+160,228,133,5,161,133,228,154,11,229,107,26,66,194,131,229,129,184,0,58,+100,188,249,129,1,96,93,121,129,89,187,4,10,65,32,95,54,109,50,1,+73,32,98,50,96,217,248,224,8,0,57,96,53,0,83,65,232,224,24,5,+199,93,80,206,4,32,95,52,49,48,225,139,3,1,92,110,97,61,64,25,+4,49,57,51,32,67,75,237,2,54,53,57,69,37,195,22,250,152,5,129,+212,1,95,54,240,148,0,64,138,144,128,103,222,1,57,51,130,233,84,150,+3,95,55,49,50,163,201,234,125,1,170,130,191,9,131,159,251,60,0,224,+35,1,96,86,2,50,51,48,64,40,64,132,254,67,3,2,35,49,48,96,+0,64,17,131,184,192,191,91,145,147,121,161,43,196,79,196,162,134,204,166,+108,225,62,4,128,94,236,91,0,251,187,9,161,243,128,65,96,241,192,19,+242,86,8,249,86,2,136,153,155,226,67,178,0,50,64,200,64,16,1,56,+48,128,44,125,51,105,222,0,52,64,21,70,156,157,90,192,93,0,85,229,+27,0,178,148,0,55,137,66,98,55,169,23,117,246,114,34,2,90,32,90,+129,93,0,57,255,16,7,130,6,132,10,2,67,32,79,156,92,0,90,96,+160,129,191,224,88,1,96,90,136,16,242,132,0,98,89,231,87,3,65,215,+2,95,51,55,169,206,192,53,232,51,1,0,80,164,138,130,200,136,43,166,+44,225,143,1,197,152,128,13,224,30,3,0,89,129,90,224,17,2,219,87,+224,17,2,192,69,224,21,3,245,180,2,202,234,224,104,4,226,15,0,224,+26,0,224,61,1,226,44,0,152,64,225,192,1,224,33,6,218,251,232,133,+5,224,23,0,224,42,4,224,21,0,192,147,66,254,192,64,192,95,128,40,+247,167,37,131,241,224,38,1,160,84,224,174,0,130,148,163,98,160,0,224,+109,76,167,117,228,146,9,218,57,192,100,249,150,3,224,162,2,224,101,11,+224,30,1,160,198,1,54,49,67,132,128,167,131,125,96,43,224,12,0,159,+227,224,23,0,224,0,1,224,110,50,150,185,224,84,6,132,86,224,49,0,+128,92,135,238,149,41,160,113,213,149,129,114,96,20,1,95,55,96,18,96,+100,1,95,52,155,163,128,75,161,68,1,95,55,151,37,96,126,104,156,250,+149,0,226,185,3,225,70,2,226,76,2,193,187,224,36,11,228,241,11,192,+209,226,167,0,224,53,27,230,76,0,224,53,36,223,43,224,106,37,193,31,+160,231,225,193,12,197,150,225,185,11,161,171,225,219,4,2,95,54,54,64,+49,161,212,225,91,2,224,32,2,137,109,64,32,224,237,0,224,93,12,70,+231,71,226,105,138,69,224,3,95,49,52,54,65,228,64,87,231,100,1,15,+58,32,98,97,100,32,115,116,114,105,110,103,32,103,97,112,103,113,128,119,+228,61,0,101,148,0,39,69,149,96,100,1,48,32,224,63,2,18,117,110,+116,101,114,109,105,110,97,116,101,100,32,67,104,97,114,47,83,128,75,6,+108,105,116,101,114,97,108,96,79,234,126,1,161,96,64,15,225,197,24,224,+46,30,161,39,224,92,31,161,183,227,33,2,112,91,225,65,9,65,202,184,+186,225,169,64,106,122,208,63,202,132,202,150,128,5,135,42,1,58,55,64,+51,73,93,5,49,49,54,32,95,51,122,9,97,186,0,85,133,148,110,87,+225,215,2,2,50,48,51,89,239,225,252,0,160,29,2,79,32,35,86,199,+128,104,131,201,224,53,3,2,51,51,55,129,45,192,44,1,53,56,160,44,+224,31,4,64,0,2,95,49,50,72,65,96,131,0,58,96,6,154,99,137,+103,225,152,12,64,207,64,115,199,193,129,77,2,95,55,48,64,84,0,58,+96,14,200,31,66,170,226,84,1,12,66,97,100,32,92,92,32,101,115,99,+97,112,101,130,145,131,147,225,210,13,177,171,224,33,17,0,57,96,197,224,+32,19,165,12,224,99,17,0,48,97,156,224,133,20,219,4,224,33,17,106,+38,224,33,20,224,135,23,0,51,224,168,24,127,252,224,100,21,185,105,0,+83,231,78,17,179,103,250,175,0,110,40,64,8,157,76,2,95,54,48,81,+0,3,51,32,64,35,112,176,67,57,192,17,255,244,0,194,109,65,230,3,+66,32,95,53,64,89,142,23,170,92,92,177,66,23,64,5,128,71,130,29,+204,228,102,61,101,141,188,219,64,204,64,75,134,84,244,244,6,101,133,134,+109,99,136,229,146,0,192,26,224,23,2,1,95,55,76,53,2,49,51,50,+160,240,224,174,0,100,228,96,10,100,236,170,135,96,149,96,212,108,28,132,+21,224,168,1,224,107,3,145,183,224,100,15,224,88,8,224,87,22,227,58,+7,96,29,0,54,132,79,203,119,128,17,75,171,128,16,160,33,65,198,224,+16,0,96,60,200,140,97,254,224,81,0,232,162,0,224,20,11,97,207,224,+21,9,100,249,224,21,7,224,187,4,192,20,67,119,224,63,9,64,151,192,+21,0,58,100,13,203,203,129,57,161,209,199,90,168,66,225,213,2,160,17,+241,127,2,224,25,0,229,251,1,128,10,99,5,160,26,64,128,130,190,136,+94,104,194,173,195,128,0,137,45,245,189,0,237,52,1,96,43,224,12,0,+109,212,0,54,163,205,226,229,1,130,227,224,218,3,0,54,96,218,2,79,+32,80,228,220,2,2,78,85,76,68,210,97,157,224,25,5,2,83,79,72,+96,25,65,160,224,25,6,1,84,88,96,25,64,182,224,25,5,0,69,160,+25,64,195,224,25,6,1,79,84,96,25,67,88,224,25,6,1,78,81,96,+25,66,122,224,25,5,2,65,67,75,96,25,64,198,224,25,5,1,66,69,+128,181,65,209,224,25,6,0,83,96,24,64,242,224,24,5,0,72,128,127,+66,89,224,24,5,1,76,70,128,230,225,1,9,0,86,128,50,98,162,224,+25,5,0,70,160,51,225,1,9,1,67,82,128,25,225,1,9,1,83,79,+128,25,225,1,9,1,83,73,128,25,225,1,9,2,68,76,69,128,26,225,+2,9,2,68,67,49,128,26,225,3,9,2,68,67,50,128,26,225,5,9,+2,68,67,51,128,26,225,7,9,2,68,67,52,96,26,101,178,224,26,5,+1,78,65,129,136,86,198,224,187,7,1,89,78,128,26,226,12,11,0,66,+128,26,225,11,9,1,67,65,160,53,226,14,10,0,77,128,25,225,12,9,+1,83,85,160,79,225,12,9,2,69,83,67,128,26,225,12,9,0,70,130,+16,90,224,224,25,6,0,71,160,25,225,10,9,0,82,128,25,67,157,224,+25,6,0,85,160,25,225,8,10,0,80,128,25,225,7,9,0,68,162,172,+70,210,234,125,0,224,0,20,0,58,101,136,246,206,4,224,9,1,99,225,+0,55,104,1,165,218,99,230,96,93,2,95,55,48,100,62,2,95,49,52,+64,187,73,213,1,95,49,137,134,0,58,70,0,64,83,115,99,0,58,96,+40,240,180,3,73,60,96,52,196,246,224,95,0,96,78,192,67,144,180,114,+252,231,162,2,96,56,224,20,8,141,152,224,20,5,0,57,224,20,12,64,+180,224,20,7,73,225,224,21,11,66,24,224,106,8,135,247,224,20,5,0,+53,156,4,238,198,6,161,44,102,97,169,37,224,7,53,2,58,55,48,185,+221,243,75,1,69,240,191,149,230,19,1,107,140,3,67,32,61,61,231,46,+1,134,28,0,85,64,12,64,8,0,90,250,25,8,198,116,134,75,242,82,+2,237,220,1,231,211,2,226,115,1,2,99,97,115,170,170,231,185,4,1,+54,57,140,29,249,251,0,1,58,55,84,27,160,188,104,206,64,91,104,167,+137,172,198,222,166,198,137,162,2,67,32,60,179,141,230,165,0,224,224,7,+224,28,0,128,222,180,168,233,49,3,192,240,224,34,1,241,26,1,160,68,+137,186,224,67,7,224,251,2,226,41,3,192,0,106,23,64,237,3,66,32,+95,54,65,238,1,95,54,107,80,176,140,224,104,93,0,58,97,105,140,147,+0,54,75,240,2,90,32,85,65,97,225,63,3,64,116,224,18,6,64,62,+236,189,0,128,18,130,196,224,18,4,102,170,104,26,192,191,136,196,96,104,+1,64,85,118,124,131,252,128,7,128,15,224,68,6,156,47,171,115,128,18,+224,61,2,224,60,1,207,45,224,61,5,100,125,224,18,5,131,173,224,80,+4,67,37,160,65,224,80,7,224,41,6,68,21,224,41,1,194,157,65,70,+141,150,3,95,53,52,51,64,30,92,146,150,11,64,49,67,70,0,58,96,+245,100,201,0,80,137,226,0,85,96,20,0,54,228,168,12,178,44,228,83,+7,228,62,11,142,48,224,63,7,224,41,11,0,51,160,250,224,84,6,228,+105,48,1,58,54,76,180,254,79,0,0,80,249,47,1,140,57,126,83,0,+54,77,22,166,34,141,52,234,64,3,128,49,0,67,183,229,0,80,79,140,+250,88,14,3,76,105,115,116,154,84,5,52,57,51,58,49,56,250,85,7,+17,33,33,58,32,105,110,100,101,120,32,116,111,111,32,108,97,114,103,196,+88,163,71,227,36,1,119,85,192,121,144,194,237,94,1,247,232,0,250,229,+19,224,140,3,2,48,58,53,224,139,11,250,211,0,96,148,96,138,1,58,+54,70,64,154,208,1,95,50,73,70,237,161,0,128,14,238,42,11,99,43,+238,42,5,175,86,238,88,12,134,117,224,45,3,0,55,129,148,0,58,107,+190,160,124,224,54,7,0,52,131,208,224,54,3,0,53,64,73,1,58,54,+71,7,247,229,3,210,42,204,31,181,6,69,40,2,95,54,56,177,23,206,+100,132,118,64,87,0,56,69,213,254,109,5,172,3,2,54,56,57,128,34,+242,68,2,173,212,64,37,0,85,190,145,242,116,0,96,52,173,244,96,86,+130,111,128,71,134,67,96,74,249,188,4,230,70,0,1,54,57,166,70,229,+226,6,192,203,244,137,6,197,111,224,165,12,0,64,149,218,0,58,96,27,+249,33,1,101,122,89,33,96,157,96,23,129,58,175,116,99,128,1,50,50,+91,42,64,42,124,110,96,166,225,31,3,200,227,128,237,104,161,245,98,1,+64,102,253,150,4,191,55,253,161,3,239,82,0,224,5,3,153,130,224,15,+3,68,217,227,175,0,133,38,128,2,151,215,225,246,0,174,95,97,53,160,+95,224,1,1,103,145,128,0,192,45,247,60,0,160,54,103,169,224,53,3,+160,202,224,74,8,128,146,228,223,4,183,46,232,86,2,181,96,241,101,1,+218,173,224,126,3,102,120,64,222,226,9,3,225,109,7,227,236,1,229,233,+0,96,74,224,51,28,96,199,164,231,225,42,11,225,176,0,224,46,1,224,+1,3,207,162,128,125,225,56,11,129,53,160,47,239,165,2,196,209,225,65,+134,129,66,224,62,0,225,68,42,66,195,98,204,167,99,64,4,227,22,2,+227,43,13,160,180,217,144,64,114,0,53,211,139,112,126,160,13,67,199,2,+50,54,53,221,146,208,139,0,58,100,182,170,90,4,95,54,56,50,32,72,+68,69,7,0,52,132,195,0,49,82,144,0,53,255,99,4,230,9,1,87,+188,134,9,3,49,56,51,58,110,234,100,152,97,114,104,162,0,66,86,16,+0,53,147,197,225,14,0,243,210,18,96,57,128,11,149,129,64,161,0,54,+136,93,2,54,53,52,64,162,103,123,64,98,113,38,0,67,68,117,64,54,+142,140,135,251,160,22,66,5,174,244,224,23,4,72,73,105,90,224,21,4,+68,115,97,84,177,50,128,42,224,19,255,224,19,195,0,51,98,90,224,81,+58,72,61,224,241,147,224,159,151,224,19,255,224,19,37,105,16,160,21,73,+144,224,81,47,69,5,96,19,0,52,180,77,224,81,45,0,52,181,96,224,+61,20,110,8,0,52,181,190,224,83,16,226,175,0,0,49,92,84,224,83,+8,0,52,83,28,224,21,10,148,106,224,189,25,224,127,4,224,63,1,109,+213,224,43,8,181,43,224,43,7,224,151,11,225,83,13,224,63,12,181,22,+224,107,7,224,85,22,226,35,40,1,52,51,225,19,32,224,41,3,228,47,+20,224,83,28,129,231,0,51,225,81,11,224,187,33,225,99,31,224,19,2,+218,204,184,186,224,247,26,224,39,70,224,19,142,230,1,171,224,179,0,225,+123,51,0,49,118,174,224,61,7,158,200,224,83,47,224,19,255,224,19,88,+120,20,224,201,178,228,141,0,2,50,49,53,81,115,192,23,226,113,20,0,+51,187,77,224,41,6,1,49,53,109,176,160,23,227,207,20,0,51,114,5,+224,65,7,0,49,229,79,12,1,49,52,224,65,2,227,9,92,65,8,224,+41,28,229,223,11,0,57,224,19,0,187,187,96,21,77,222,96,21,0,55,+231,86,6,64,35,1,35,55,237,220,3,224,247,0,231,107,3,64,42,102,+177,150,7,160,21,65,99,125,203,238,76,5,65,212,115,79,238,52,4,224,+88,1,224,65,2,224,173,1,225,79,82,224,19,130,81,103,129,4,190,178,+225,71,0,224,61,16,191,123,96,20,226,126,11,64,60,97,197,228,12,4,+97,154,111,231,1,49,54,64,49,192,64,116,175,97,201,225,156,3,0,56,+239,209,255,224,19,67,75,67,225,24,255,224,19,255,224,19,9,89,98,192,+20,233,103,131,241,17,255,224,19,255,224,19,255,224,19,159,67,191,0,51,+85,189,1,35,57,233,242,3,0,57,119,233,128,24,2,49,52,53,233,227,+3,92,165,128,70,224,24,6,232,180,1,224,23,5,1,55,50,64,100,0,+55,72,117,3,35,55,55,55,224,26,3,104,80,168,126,224,125,2,1,50,+48,228,226,11,64,145,107,100,2,35,54,48,104,179,160,23,0,52,120,172,+224,23,9,0,51,96,119,225,224,247,224,19,255,224,19,255,224,19,255,224,+19,255,224,19,175,237,54,1,3,49,53,50,50,242,223,182,224,19,255,224,+19,255,224,19,243,99,216,138,120,245,191,3,74,93,138,41,224,21,7,224,+43,13,224,65,31,244,242,0,224,21,3,224,151,0,224,20,45,75,33,224,+127,8,85,103,224,171,36,224,21,13,149,94,224,129,6,128,20,0,52,64,+49,224,151,8,224,20,2,94,88,75,241,64,21,249,183,2,245,114,1,224,+43,7,224,108,18,0,57,247,26,3,64,65,224,43,17,0,50,75,136,224,+152,9,224,20,2,224,108,1,1,50,53,224,65,12,0,53,224,174,2,224,+218,12,1,50,57,248,35,0,3,49,53,48,51,224,91,2,246,80,2,1,+55,54,225,77,3,224,23,1,0,53,224,160,3,226,16,0,0,53,236,146,+2,0,52,97,122,98,61,247,47,3,0,51,76,122,226,192,7,0,56,85,+179,0,35,120,124,1,35,53,226,216,3,1,56,54,64,69,97,165,0,35,+237,109,3,64,11,227,26,18,2,49,52,56,224,182,11,1,55,54,77,163,+224,22,8,3,50,49,52,53,224,205,2,237,2,61,1,49,53,246,52,3,+224,107,3,0,57,224,131,13,0,53,225,105,12,64,23,224,155,2,224,115,+11,224,175,11,65,78,130,6,1,49,54,231,233,255,224,19,255,224,19,255,+224,19,211,251,253,31,229,140,11,3,51,49,48,53,252,255,11,225,107,255,+224,19,168,251,45,255,224,19,7,1,49,51,232,69,21,224,19,101,227,114,+255,224,19,255,224,19,83,0,49,253,15,40,2,55,48,54,234,135,3,253,+79,91,230,155,11,224,39,0,1,56,52,235,95,4,235,179,31,227,100,200,+2,56,52,54,238,239,4,224,23,2,122,138,224,23,10,236,15,3,224,23,+3,0,48,224,23,14,239,187,12,2,56,52,53,224,119,14,236,175,4,224,+23,3,0,50,238,144,2,238,73,1,0,56,238,51,3,226,86,91,224,19,+60,0,57,225,115,14,239,161,4,192,23,3,55,48,55,54,237,243,12,224,+108,30,2,56,52,54,238,206,12,224,43,2,226,215,11,230,220,60,2,56,+53,49,225,183,3,79,162,224,44,9,1,50,51,113,103,143,191,1,54,52,+224,170,2,0,50,79,186,124,255,0,64,124,185,224,24,0,0,55,64,48,+80,11,224,23,6,0,57,64,121,82,207,2,64,35,55,252,245,2,144,237,+64,89,224,22,5,64,69,66,63,224,21,4,80,214,110,252,224,42,4,1,+55,55,64,67,0,53,96,90,0,49,253,81,3,1,50,48,64,48,96,229,+224,188,4,1,50,56,112,101,0,51,224,24,9,1,49,57,105,83,224,25,+9,3,51,49,52,50,65,138,113,76,1,35,54,64,100,2,75,32,64,224,+0,255,224,0,255,224,0,136,14,58,54,56,52,32,64,10,65,32,83,32,+83,32,95,50,67,103,2,95,54,56,66,221,4,95,54,56,50,32,64,31,+0,51,128,31,5,39,32,95,49,51,48,64,30,0,48,64,40,71,118,114,+182,1,67,32,224,17,1,2,64,35,57,67,100,0,58,96,58,6,10,65,+32,67,32,95,51,84,1,0,83,64,62,6,83,39,32,64,67,32,60,67,+112,64,54,8,39,66,32,67,32,67,32,61,61,160,16,1,95,49,102,157,+3,85,32,95,49,99,237,224,34,6,64,87,224,34,9,0,58,96,171,160,+158,0,50,70,150,3,95,54,55,57,64,103,7,95,49,50,55,32,95,50,+48,100,34,101,179,1,58,54,68,110,160,234,224,181,5,1,49,55,69,164,+1,95,54,100,53,3,95,54,52,53,64,248,64,71,224,195,2,224,141,4,+97,32,224,141,7,0,58,96,63,16,10,65,32,66,32,89,32,64,83,39,+32,66,32,64,66,32,83,64,4,0,85,96,146,0,55,69,13,1,95,49,+79,98,4,64,64,64,66,32,64,82,64,84,5,64,67,39,32,67,39,64,+26,224,179,0,133,8,2,64,64,64,128,52,96,92,0,55,160,143,0,83,+224,220,3,132,132,224,20,7,69,75,224,20,8,0,54,64,181,224,20,7,+0,52,65,0,224,20,8,129,216,224,20,5,0,53,65,28,224,83,8,64,+166,224,20,8,224,125,11,86,20,224,20,8,101,45,224,20,8,224,125,11,+77,176,224,20,9,65,182,224,251,8,225,16,11,0,51,224,188,11,0,52,+224,167,12,224,83,11,0,49,69,219,224,21,10,224,148,11,105,4,224,20,+7,1,56,55,106,179,224,22,8,0,54,225,85,12,1,56,53,224,196,12,+1,56,53,225,215,12,2,56,55,48,64,45,227,161,0,2,66,32,95,118,+105,131,206,96,23,195,26,0,51,96,5,65,95,66,191,130,182,224,7,181,+1,58,54,72,79,228,192,6,0,55,64,32,67,226,65,225,31,102,114,111,+109,85,84,70,56,32,34,33,92,34,35,37,38,39,40,41,42,44,45,46,+47,58,59,63,64,91,92,92,93,3,95,123,125,34,64,79,0,58,97,24,+228,181,17,96,117,224,19,7,162,0,224,19,4,98,64,228,45,4,100,93,+228,188,8,228,234,3,67,255,224,66,2,65,161,224,30,1,224,40,2,224,+128,8,130,16,224,61,5,66,128,224,61,12,224,149,5,228,196,12,97,7,+230,18,9,73,65,225,81,10,10,36,43,60,61,62,92,94,96,92,124,126,+193,67,134,46,229,249,15,164,46,224,19,4,100,150,230,14,4,224,153,13,+224,10,2,0,83,224,241,6,224,41,5,224,230,5,101,211,224,230,12,134,+164,64,140,67,52,67,86,133,149,101,152,230,67,5,132,148,102,35,101,152,+65,10,69,121,102,9,1,58,54,92,32,224,74,2,128,7,2,95,54,52,+64,107,96,81,128,17,0,64,69,239,0,83,133,236,0,67,67,174,64,95,+2,49,51,50,160,100,64,167,5,57,51,32,95,54,53,66,48,225,101,1,+5,83,79,85,82,67,69,97,96,64,66,134,89,0,80,96,78,230,101,0,+96,7,1,64,85,64,35,64,100,64,1,0,90,96,48,224,13,7,160,49,+1,39,32,64,64,224,29,11,96,252,2,66,32,66,97,93,224,165,34,2,+76,73,78,192,163,224,243,0,64,147,65,42,1,53,57,66,15,102,200,97,+157,128,31,2,32,95,51,66,46,193,116,199,7,129,89,96,12,100,204,0,+53,70,163,5,66,32,95,51,52,56,65,84,104,117,221,65,128,142,1,48,+56,156,93,96,93,6,32,95,49,56,48,32,95,167,203,75,137,128,38,224,+0,1,96,110,96,53,96,33,224,150,1,225,213,4,224,86,3,0,58,97,+246,103,218,0,66,75,237,96,50,0,80,68,125,64,61,4,10,65,32,95,+54,64,118,0,49,224,118,1,65,50,1,53,57,159,160,64,63,64,135,67,+23,3,39,32,95,53,68,103,194,101,64,80,4,95,56,51,32,95,133,242,+65,45,0,52,224,13,1,64,246,2,50,54,53,64,91,64,15,1,95,54,+93,20,64,154,64,90,137,106,78,95,195,172,97,98,64,9,233,173,11,124,+124,232,247,6,0,48,67,214,67,77,224,49,12,233,223,10,130,253,4,95,+51,52,55,32,225,249,1,28,92,34,108,105,98,47,68,97,116,97,47,67,+104,97,114,46,104,115,92,34,44,49,55,51,58,51,57,58,32,66,18,224,+42,1,9,100,105,103,105,116,84,111,73,110,116,130,42,225,174,6,0,51,+71,167,224,16,1,96,15,128,134,233,16,0,224,49,27,96,234,224,49,21,+96,39,66,80,97,67,0,54,97,67,0,80,66,99,224,216,14,3,76,105,+115,116,128,216,5,53,52,56,58,49,49,224,216,7,14,105,110,105,116,58,+32,101,109,112,116,121,32,108,105,115,128,222,73,253,68,115,137,241,99,101,+96,4,65,249,130,127,0,95,162,206,96,133,134,126,66,17,0,89,135,183,+98,255,164,47,96,8,170,34,249,164,0,96,37,131,206,66,151,64,234,0,+79,100,185,0,54,73,152,224,157,1,16,85,110,99,108,111,115,101,100,32,+123,45,32,99,111,109,109,101,161,127,142,162,133,142,67,171,100,159,160,7,+165,97,96,16,232,245,5,99,179,160,36,96,46,192,47,229,55,10,106,74,+227,245,0,131,94,96,159,80,203,98,125,0,67,130,255,97,156,227,169,1,+224,147,37,192,101,224,146,28,0,49,112,173,224,147,23,226,49,1,224,148,+7,132,152,128,97,133,235,235,187,14,224,46,30,132,127,160,187,224,231,4,+224,84,4,129,117,224,175,8,192,156,192,24,1,95,54,107,126,224,16,4,+161,176,236,77,0,0,58,96,24,3,10,65,32,85,133,250,129,8,229,143,+0,128,177,133,119,128,95,225,163,10,0,58,96,86,96,67,193,102,128,49,+67,110,224,44,0,64,12,68,207,224,12,0,2,49,49,48,196,205,224,84,+4,99,177,96,9,224,99,1,0,58,96,202,104,77,101,41,229,51,3,230,+60,1,128,117,224,78,5,96,59,135,147,64,44,147,18,197,177,197,201,69,+179,139,127,102,208,1,64,58,70,166,101,204,0,51,101,190,101,13,170,100,+64,38,197,101,110,31,233,28,1,67,202,1,49,52,67,229,0,48,229,19,+24,3,56,56,58,49,132,248,1,95,54,116,253,1,64,73,130,26,1,95,+51,70,104,225,58,8,228,182,13,100,222,229,28,3,64,238,71,141,102,136,+1,53,52,64,4,110,194,64,98,2,10,65,32,178,162,64,54,211,169,65,+49,211,51,244,65,0,2,49,52,56,245,145,2,97,253,0,50,66,75,224,+46,4,114,229,111,85,224,21,3,64,90,96,67,0,50,109,84,192,43,224,+89,0,224,19,255,224,19,206,0,52,226,33,4,224,81,50,249,205,0,224,+241,142,224,159,151,224,19,255,224,19,27,225,203,51,249,137,0,1,53,57,+71,80,224,21,7,0,51,117,7,224,103,38,224,39,11,229,155,1,224,19,+1,72,13,224,59,17,108,56,224,61,18,224,163,1,114,189,224,21,7,89,+245,229,193,2,253,93,1,115,233,225,57,58,224,59,11,250,90,0,225,13,+42,225,73,51,224,59,1,113,71,160,21,225,95,11,225,53,1,224,121,21,+224,39,71,224,19,131,253,185,1,111,249,224,181,158,224,19,11,226,31,11,+225,145,31,226,131,31,224,19,255,224,19,87,225,143,171,0,57,224,19,10,+205,107,3,35,50,49,54,76,121,224,23,3,224,43,7,229,47,11,224,163,+71,227,15,0,2,50,49,53,114,117,224,23,11,224,167,2,224,23,4,230,+131,2,224,23,0,0,52,117,165,224,21,9,224,135,6,97,3,1,52,48,+224,43,2,225,1,0,2,52,48,51,224,179,10,1,52,48,76,210,224,87,+7,2,56,52,54,121,243,160,23,226,37,0,224,89,4,224,45,4,224,203,+2,224,91,1,111,117,224,45,10,237,40,3,224,23,2,225,17,13,2,56,+52,54,120,40,224,93,9,229,71,2,225,17,1,118,254,224,67,22,225,109,+2,237,180,4,224,47,4,224,139,2,225,67,1,224,93,3,224,137,0,3,+50,49,52,57,225,45,2,224,139,2,225,91,2,224,67,2,224,183,2,85,+95,192,67,114,231,224,45,8,117,66,224,113,7,64,159,226,37,12,224,45,+3,225,181,0,65,89,224,45,24,224,21,0,0,49,124,23,224,21,2,130,+83,124,108,224,135,7,1,49,52,225,15,2,231,249,0,0,52,224,65,4,+225,224,3,233,28,3,224,23,3,225,156,4,85,147,160,94,85,247,224,206,+0,228,171,31,224,39,11,64,19,111,140,233,137,4,0,52,228,74,0,123,+213,224,152,2,96,43,113,33,224,64,2,96,165,239,184,4,66,130,128,64,+126,30,224,64,2,113,135,224,42,3,228,181,1,225,255,3,225,95,0,147,+86,160,21,228,181,1,116,45,225,48,7,0,49,227,87,3,224,237,0,81,+132,224,42,9,0,48,227,36,11,123,33,225,65,18,224,19,211,225,4,1,+90,118,225,26,10,228,225,11,227,108,12,1,50,51,224,106,12,0,57,224,+21,2,230,126,11,230,146,12,64,20,96,78,226,51,4,92,3,129,172,224,+151,6,227,33,1,225,80,121,224,19,191,69,240,225,24,255,224,19,255,224,+19,0,239,179,51,224,19,71,228,128,1,228,18,2,225,104,191,224,19,255,+224,19,255,224,19,223,0,53,70,125,107,55,1,35,57,233,157,3,0,57,+74,45,0,35,122,22,2,35,54,48,235,39,3,91,71,64,74,224,23,7,+0,55,72,65,78,228,233,231,6,124,54,160,119,1,50,53,234,23,13,1,+50,53,238,14,12,3,49,50,52,56,234,180,13,2,52,56,51,224,215,11,+2,50,52,56,224,71,14,233,116,13,1,50,51,235,63,7,96,23,2,55,+48,53,73,2,225,75,20,93,146,192,45,125,152,225,31,0,224,23,0,1,+54,50,237,157,3,233,59,0,2,55,48,55,236,95,3,0,49,65,45,225,+231,88,224,19,255,224,19,255,224,19,255,224,19,255,224,19,255,224,19,71,+250,150,1,244,54,3,250,172,11,225,65,255,224,19,255,224,19,255,224,19,+139,74,41,107,51,246,64,5,234,255,0,224,21,7,224,43,13,224,65,31,+246,151,2,224,150,11,224,20,44,74,189,224,127,13,64,230,2,35,49,52,+234,161,2,64,64,0,51,96,21,0,55,235,21,2,118,153,64,21,1,50,+48,64,93,224,43,2,128,21,0,53,224,130,6,128,21,0,50,235,41,2,+224,43,2,224,87,6,225,47,35,224,197,19,224,21,2,241,73,1,235,123,+4,224,21,0,0,52,250,99,4,235,146,1,224,45,3,251,237,0,224,110,+25,224,64,1,245,194,3,237,9,1,224,86,2,1,51,52,225,224,0,0,+53,247,140,3,97,96,98,13,245,240,4,244,46,11,0,56,120,164,119,202,+1,35,53,226,167,3,1,56,56,89,233,64,96,237,223,5,248,129,1,224,+45,2,224,157,0,3,50,49,53,56,246,142,11,64,23,0,51,224,138,2,+227,45,30,224,19,11,246,73,11,255,224,12,225,161,1,224,120,61,224,19,+255,224,19,255,224,19,255,224,19,119,228,144,11,224,39,11,241,44,11,101,+152,146,196,2,49,52,53,252,231,3,241,165,1,224,24,6,235,129,1,224,+48,6,2,48,57,57,235,157,255,224,19,188,251,93,255,224,19,7,1,49,+51,226,230,131,233,24,1,225,65,161,224,19,255,224,19,167,234,82,32,253,+124,91,230,206,11,248,15,31,224,199,0,70,177,224,180,99,225,165,92,224,+160,151,225,165,31,225,144,11,228,238,11,229,142,52,237,78,11,0,56,90,+219,160,21,0,56,238,89,3,95,191,1,35,55,77,224,3,35,55,55,55,+232,253,3,3,50,49,52,53,64,74,142,73,91,208,192,25,1,49,50,64,+65,105,79,160,59,192,24,0,55,64,184,0,51,96,48,224,23,4,0,57,+123,174,96,126,0,55,251,196,3,64,191,111,20,224,22,5,64,69,66,198,+224,21,4,78,188,64,209,224,42,5,1,55,57,64,163,92,185,91,194,224,+25,4,64,69,0,50,96,49,224,188,3,1,50,56,105,211,111,70,224,24,+5,1,49,57,104,32,224,25,9,3,51,49,52,50,96,51,64,19,1,35,+54,64,100,2,75,32,64,224,0,255,224,0,255,224,0,152,1,58,54,67,+182,12,10,65,32,67,39,32,83,32,64,67,39,32,67,128,5,18,39,32,+89,32,64,64,83,39,32,66,32,64,66,39,32,66,39,32,80,66,222,1,+66,32,128,1,0,67,64,23,64,0,128,43,1,67,39,64,14,160,26,96,+11,224,41,1,96,82,224,42,3,192,2,128,21,224,98,3,64,2,64,134,+4,95,52,57,32,95,99,109,160,33,224,101,3,224,131,2,128,85,0,66,+64,55,128,33,9,64,66,32,83,39,32,64,95,54,48,192,63,7,67,32,+95,56,51,32,95,55,83,79,96,14,160,64,2,95,53,48,68,77,64,61,+224,32,1,2,95,54,53,192,116,1,64,64,224,55,4,101,38,2,64,95,+51,68,8,3,58,54,53,52,97,51,3,83,39,32,95,84,154,1,95,54,+115,83,0,67,64,8,224,13,0,100,151,4,66,32,95,54,52,160,69,5,+67,32,95,50,51,51,224,30,4,64,74,0,51,96,74,3,85,32,75,52,+224,2,1,2,90,32,90,64,6,160,136,0,58,64,85,64,36,5,95,50,+51,52,32,95,64,124,1,95,51,64,221,3,95,54,52,54,96,5,0,55,+96,5,5,56,32,64,95,50,51,65,57,96,97,2,95,50,52,224,140,1,+0,48,64,27,3,52,51,32,80,160,17,160,216,1,95,50,97,105,160,47,+1,53,49,224,11,2,224,169,0,0,95,69,217,224,55,6,129,190,65,171,+1,67,32,225,172,1,129,36,224,27,4,2,50,49,54,160,28,1,95,55,+96,208,1,95,54,84,90,193,79,150,4,128,19,224,83,50,0,55,101,234,+224,82,4,64,18,3,95,50,53,56,224,197,2,224,233,1,0,54,70,27,+6,75,32,95,49,52,49,32,160,67,0,75,160,8,64,21,102,125,0,58,+96,43,12,10,65,32,112,111,112,99,111,117,110,116,32,58,96,54,7,10,+65,32,115,104,108,32,58,96,179,5,10,65,32,105,110,118,64,12,0,56,+96,12,2,120,111,114,64,12,0,55,96,12,128,11,0,54,226,42,0,1,+49,51,64,147,66,154,0,50,112,144,70,165,98,52,192,17,70,173,86,232,+2,58,54,52,131,148,64,240,3,85,32,95,49,65,242,0,64,66,20,98,+222,7,95,49,48,56,32,64,85,32,70,111,98,96,0,52,64,13,0,65,+98,46,1,95,54,98,0,0,52,194,198,2,95,52,57,65,44,96,15,0,+58,96,41,64,140,1,32,83,64,113,66,71,1,54,52,194,185,25,52,50,+32,64,102,114,111,109,85,84,70,56,32,34,32,94,41,94,42,94,43,94,+44,94,45,34,130,168,64,66,96,146,0,89,65,136,0,66,66,17,0,49,+72,40,64,131,99,152,99,85,0,50,118,144,0,95,71,117,1,95,50,99,+97,128,60,130,192,0,67,64,188,64,26,1,54,52,65,172,3,95,51,51,+50,66,203,1,48,52,67,84,64,137,66,228,1,53,49,132,93,0,83,100,+145,96,241,67,211,2,67,32,60,214,239,224,26,13,97,58,224,26,14,96,+136,224,26,13,98,207,68,98,64,26,69,5,224,26,1,160,221,0,85,65,+94,64,226,5,67,32,67,32,61,61,192,25,160,254,65,159,98,48,64,0,+224,44,12,100,89,224,44,10,224,117,14,66,21,224,72,13,64,25,224,117,+32,99,5,224,117,11,225,7,14,96,31,224,145,13,97,115,224,100,12,161,+236,224,145,29,64,28,225,7,34,98,194,224,72,12,99,250,224,117,31,66,+21,225,7,13,226,97,14,194,16,225,35,10,100,97,224,173,13,101,206,224,+128,12,100,113,224,173,31,99,22,225,35,32,0,49,226,161,16,96,25,224,+117,31,96,242,226,43,16,133,120,224,118,4,195,78,224,145,10,226,189,16,+96,25,224,145,32,226,189,16,224,45,12,226,134,15,225,200,15,96,164,225,+253,13,97,199,224,26,13,98,144,224,245,13,96,112,224,154,12,226,244,15,+224,44,12,226,216,15,224,117,14,100,240,224,72,12,226,244,15,224,44,12,+226,160,15,225,7,14,98,115,224,144,13,99,31,224,99,12,226,215,15,224,+44,11,226,186,15,224,116,13,99,174,224,70,11,226,212,15,224,43,11,226,+155,15,225,3,15,194,10,224,25,9,198,159,224,168,9,99,52,224,124,11,+226,235,15,224,43,11,226,233,16,224,114,12,226,150,16,226,149,35,226,148,+16,228,28,14,225,0,16,226,174,16,226,173,36,228,24,35,229,77,16,73,+25,1,49,51,74,238,104,136,0,58,96,6,104,221,2,95,54,51,75,71,+0,54,74,130,66,21,0,58,73,80,232,248,4,73,146,72,252,107,135,137,+154,204,134,160,239,108,165,128,136,0,64,192,41,192,17,96,32,77,74,64,+13,233,201,3,233,194,0,96,115,138,78,6,95,53,49,51,32,95,53,70,+240,224,10,4,1,52,48,76,6,0,53,64,167,0,51,105,197,96,226,224,+6,0,87,185,1,58,54,90,239,64,67,64,43,72,131,3,95,54,51,53,+160,54,227,158,13,5,53,50,54,32,95,53,76,162,128,36,234,13,1,2,+101,111,102,106,5,96,170,2,95,51,54,64,71,64,137,0,73,224,176,1,+0,54,193,63,0,53,65,101,64,230,64,168,77,46,2,66,32,90,238,88,+0,64,30,98,238,0,53,135,48,64,57,138,234,0,95,224,222,1,1,49,+56,64,38,64,177,0,53,108,223,224,249,2,0,54,128,200,96,231,64,208,+0,51,96,232,138,213,2,95,54,51,225,22,2,74,88,96,39,0,58,96,+37,224,97,14,0,80,96,37,99,253,2,53,52,55,224,101,1,2,52,32,+35,83,28,64,72,64,6,0,58,96,79,96,99,0,50,193,67,225,29,1,+4,118,97,108,117,101,65,31,226,170,12,98,96,97,55,76,109,193,46,138,+235,0,67,66,12,142,182,128,5,1,95,53,65,72,1,95,53,115,70,129,+232,75,38,225,112,0,162,75,0,58,64,234,130,32,0,50,78,17,75,243,+129,179,2,95,53,52,64,219,224,160,5,2,92,92,110,224,158,10,229,31,+4,236,246,0,128,159,64,21,226,127,7,225,31,6,83,190,225,60,0,128,+17,140,100,65,162,129,42,2,54,32,58,96,31,225,56,15,2,107,101,121,+224,151,10,131,180,193,54,0,50,225,55,4,74,213,98,102,143,194,128,177,+240,65,1,226,116,1,240,109,7,144,173,208,158,240,5,0,96,68,104,13,+163,191,140,118,0,39,64,22,99,75,0,53,109,179,0,53,65,254,77,38,+0,79,78,54,96,139,226,208,17,75,20,173,241,225,140,1,109,168,74,139,+2,95,54,50,99,96,0,51,67,244,64,235,142,182,132,190,192,157,229,236,+9,128,31,0,90,173,62,0,50,205,89,64,110,130,253,141,146,134,126,0,+80,66,245,65,169,112,88,0,83,229,159,5,64,57,224,18,6,64,96,98,+138,231,202,6,0,67,231,222,6,64,225,66,42,225,193,1,3,84,82,97,+119,132,25,224,24,6,2,69,79,70,160,23,96,24,68,234,1,49,55,224,+31,2,3,123,45,35,32,96,32,0,67,128,25,238,122,3,2,35,45,125,+192,59,224,151,8,143,50,232,0,8,224,149,6,5,73,110,100,101,110,116,+224,152,12,4,84,66,114,97,99,99,173,128,27,165,115,225,17,6,66,201,+224,121,6,66,106,224,121,6,133,73,0,75,67,198,80,151,225,154,2,1,+35,54,129,63,224,23,9,66,72,224,23,10,86,152,224,23,11,0,56,128,+47,194,119,224,199,1,1,35,41,128,195,224,17,1,1,40,35,224,17,7,+6,125,32,108,97,121,111,117,161,8,225,124,2,224,23,4,228,157,0,69,+253,113,119,162,202,224,25,4,224,20,1,226,41,7,225,23,9,64,179,224,+57,1,0,51,195,190,224,18,1,2,50,48,51,224,23,2,194,34,9,66,+32,95,52,49,48,32,79,32,35,69,246,131,103,135,37,66,32,227,124,3,+64,0,0,58,99,78,101,215,82,15,2,53,53,53,64,164,167,241,71,217,+205,120,82,200,96,11,0,58,96,6,128,49,0,49,71,194,1,53,57,102,+43,0,48,132,201,0,48,83,45,128,64,0,54,64,159,192,76,0,55,224,+23,1,1,49,55,224,23,1,0,54,68,32,1,95,49,84,36,128,17,0,+73,99,117,200,71,1,83,32,71,28,102,251,177,45,0,50,82,139,65,213,+2,95,54,48,100,114,192,29,71,30,100,193,232,92,3,0,51,64,4,68,+47,133,241,224,17,9,128,64,96,61,224,7,0,132,196,164,194,137,131,196,+231,0,83,64,124,148,204,200,170,0,66,96,138,136,50,133,73,128,42,0,+85,64,10,232,207,0,133,59,160,12,150,34,1,95,54,65,144,227,59,0,+192,36,0,66,85,135,160,5,160,88,164,209,72,239,193,199,168,237,96,56,+64,73,181,96,224,0,0,0,58,97,88,133,64,169,42,2,95,50,56,72,+229,0,52,65,174,0,58,96,49,146,75,138,98,64,9,201,154,224,19,0,+66,140,96,8,105,106,226,58,3,224,173,2,224,219,2,166,19,103,142,224,+28,0,64,238,128,69,71,157,100,170,1,55,52,64,179,165,125,96,35,137,+195,132,199,86,117,192,28,96,241,66,29,0,50,66,205,64,31,0,52,224,+12,0,2,95,49,53,130,1,2,64,95,53,116,174,2,64,95,52,148,208,+97,219,0,58,97,95,226,168,2,0,54,78,225,2,95,50,56,130,132,117,+250,0,50,68,25,162,156,175,45,98,156,192,11,67,13,160,11,98,162,128,+11,0,50,90,168,0,58,96,12,128,94,0,50,98,153,105,102,0,50,103,+202,65,166,68,188,128,42,64,43,212,138,136,172,168,171,231,40,0,129,64,+237,10,3,96,7,68,199,1,53,56,104,203,104,40,162,79,105,111,138,109,+128,6,194,33,96,26,71,35,64,21,64,59,0,55,86,108,0,53,104,82,+162,152,160,49,64,28,0,54,98,91,192,85,71,104,64,46,96,26,97,35,+97,229,162,255,137,97,0,83,152,207,128,162,232,45,0,128,33,97,251,65,+201,1,53,56,67,210,1,53,56,196,151,227,1,0,98,8,226,112,0,137,+178,98,97,232,97,0,1,95,54,144,57,192,95,160,163,128,220,160,12,98,+238,128,91,1,95,54,143,188,139,64,224,197,16,64,39,192,18,64,66,225,+16,3,228,17,2,64,139,165,36,88,145,65,118,98,152,1,56,48,216,215,+64,18,157,40,97,66,0,39,67,16,1,95,54,80,111,163,22,224,77,3,+224,13,5,0,58,100,27,1,10,65,66,40,1,51,52,231,195,3,28,92,+34,108,105,98,47,68,97,116,97,47,76,105,115,116,46,104,115,92,34,44,+53,52,51,58,49,49,58,32,70,91,224,42,1,14,108,97,115,116,58,32,+101,109,112,116,121,32,108,105,115,134,121,129,87,104,214,0,90,65,26,128,+218,0,58,96,8,98,157,224,132,0,0,79,126,213,64,170,0,58,97,56,+227,254,0,133,133,0,75,98,211,133,219,100,149,0,58,98,42,169,21,68,+206,130,4,227,238,3,250,205,0,2,95,53,54,139,56,0,55,96,127,160,+14,0,58,100,191,237,246,3,101,195,138,150,128,56,165,101,160,81,64,101,+96,78,138,173,132,120,192,42,64,1,69,159,224,13,7,192,150,132,124,162,+6,226,97,0,165,74,227,109,0,98,125,104,29,101,68,133,125,129,232,0,+49,128,18,97,204,4,95,49,53,57,32,170,85,224,176,0,206,124,161,116,+155,21,132,181,64,60,128,51,194,247,107,118,128,10,96,200,98,68,228,186,+0,77,110,98,71,0,58,102,80,98,25,73,48,102,255,70,217,65,187,1,+50,57,100,183,87,217,2,95,54,48,170,200,72,70,104,214,2,95,49,52,+68,159,192,11,88,16,96,11,0,58,96,6,231,211,0,1,51,56,71,199,+96,61,234,198,8,233,161,35,226,135,1,25,82,97,116,105,111,32,104,97,+115,32,122,101,114,111,32,100,101,110,111,109,105,110,97,116,111,114,137,11,+224,43,3,64,28,3,114,109,97,108,234,70,0,224,26,2,7,105,118,105,+100,101,32,98,121,96,70,160,32,233,23,31,227,21,2,14,111,115,115,32,+111,102,32,112,114,101,99,105,115,105,111,109,165,224,34,5,18,97,114,105,+116,104,109,101,116,105,99,32,117,110,100,101,114,102,108,111,235,112,1,224,+38,12,1,111,118,224,37,4,201,1,97,69,0,58,96,6,65,95,79,42,+2,51,52,51,224,66,2,23,67,111,110,116,114,111,108,46,69,120,99,101,+112,116,105,111,110,46,73,110,116,101,114,110,129,0,224,39,1,0,65,64,+106,224,36,0,96,101,0,58,97,231,163,148,130,204,5,95,49,56,50,32,+64,99,138,0,48,131,206,224,27,7,99,180,0,48,201,194,1,54,50,70,+49,70,169,1,53,57,168,239,194,144,98,163,79,217,224,24,7,96,10,2,+64,95,55,92,253,0,53,90,230,160,33,1,53,57,78,169,192,11,98,136,+96,13,2,95,53,57,99,12,3,95,54,48,48,224,20,8,0,58,106,6,+136,118,227,147,2,227,228,1,233,84,0,101,248,163,200,192,11,131,154,0,+50,78,250,233,22,2,227,206,0,219,29,1,53,57,69,141,224,46,0,71,+134,241,245,1,166,135,64,37,168,28,224,65,24,71,168,224,64,19,137,107,+0,58,64,239,160,218,96,71,102,235,224,72,17,96,102,96,154,100,79,0,+58,65,67,229,10,4,242,211,1,135,186,168,6,0,82,224,22,4,169,23,+96,63,233,177,0,129,92,167,137,161,66,224,41,1,160,19,107,12,239,215,+5,69,234,100,176,128,177,98,16,96,49,68,116,96,238,243,161,5,192,82,+192,76,133,61,96,66,228,242,13,0,58,96,241,233,19,2,226,28,3,137,+17,0,58,108,46,64,34,0,52,81,115,135,143,136,166,64,141,1,95,53,+126,114,104,61,79,193,64,1,1,95,54,80,244,128,67,137,7,2,95,53,+57,68,5,224,13,1,64,212,128,196,178,197,230,245,4,0,49,166,245,96,+39,224,29,2,0,49,224,29,6,195,70,236,36,6,0,58,96,102,64,25,+0,53,67,64,107,69,1,53,56,74,75,169,155,0,56,99,59,0,56,115,+107,104,252,1,54,49,224,176,0,1,54,50,192,10,0,58,96,6,231,116,+0,224,5,3,160,78,144,164,178,66,128,6,0,58,96,80,224,52,27,224,+59,2,0,58,96,139,224,52,20,224,98,2,160,59,0,58,96,198,224,52,+27,224,112,2,0,58,97,1,115,131,141,49,236,56,3,96,19,128,65,235,+253,0,1,95,53,139,161,0,53,111,194,160,35,131,154,0,85,66,14,196,+171,128,38,98,82,64,123,97,124,65,84,68,243,1,95,53,66,129,0,58,+97,136,168,157,182,102,128,31,0,58,96,31,192,148,131,92,237,174,3,96,+48,0,49,82,146,64,197,68,229,0,55,201,176,64,13,1,49,51,83,45,+103,159,128,127,130,22,67,199,233,223,4,0,58,98,164,68,16,128,195,238,+163,1,238,101,10,238,164,1,238,212,11,224,48,20,255,198,0,233,38,1,+80,226,136,181,224,208,0,0,67,141,228,224,238,16,0,53,129,118,137,158,+108,26,67,126,141,54,2,64,64,64,136,170,160,60,229,164,1,64,20,196,+78,96,12,128,115,237,242,5,160,121,224,115,22,224,113,5,224,111,3,224,+49,18,204,161,224,0,0,0,58,100,37,193,245,1,53,55,112,179,175,35,+96,16,65,192,75,195,3,95,49,57,51,68,59,107,199,149,13,2,53,55,+56,71,35,0,57,244,45,0,106,8,68,19,224,155,5,0,58,96,119,129,+242,2,52,32,75,64,139,0,58,64,59,128,118,165,29,162,177,225,174,1,+128,18,1,66,39,224,21,3,162,217,224,29,0,160,165,229,169,0,96,88,+197,118,236,25,29,5,49,52,49,58,49,53,236,25,7,5,102,111,108,100,+108,49,236,27,8,64,216,79,237,65,39,224,189,4,0,83,226,44,4,96,+134,245,111,0,160,177,0,85,66,121,243,73,1,234,176,1,240,8,2,192,+232,238,15,0,166,157,128,225,2,95,49,53,96,231,228,74,0,97,102,64,+22,117,95,194,75,239,222,2,239,223,5,128,151,233,19,1,228,142,0,227,+180,2,133,197,64,6,99,248,66,56,164,43,70,57,68,134,67,94,68,184,+214,2,64,15,64,9,215,169,154,193,128,77,0,58,96,6,96,110,206,111,+134,144,0,58,102,162,99,235,0,73,195,92,141,117,227,168,4,128,113,230,+94,2,96,153,238,18,2,96,98,166,5,131,71,64,59,163,112,143,69,229,+62,0,193,157,241,144,10,238,183,5,80,254,131,40,208,58,128,89,201,111,+64,196,69,78,131,33,1,54,53,224,155,0,101,103,130,138,111,66,162,192,+161,25,224,46,3,160,102,160,44,228,102,3,224,184,11,224,134,15,229,215,+0,224,137,8,192,90,224,134,27,224,181,2,225,11,5,160,73,161,11,97,+122,0,48,227,78,13,75,147,2,103,101,114,96,7,75,155,175,116,2,55,+58,49,139,137,97,249,98,71,0,54,66,105,68,23,0,58,96,115,163,33,+97,148,128,236,236,156,0,142,24,153,60,227,49,1,164,105,225,236,0,64,+41,228,58,4,133,8,128,5,228,1,19,224,178,13,4,57,54,58,50,57,+228,12,7,19,105,109,112,111,115,115,105,98,108,101,58,32,120,115,32,62,+61,32,121,115,96,215,122,6,225,19,37,3,57,51,58,54,205,3,231,223,+1,128,241,226,140,0,227,244,3,170,255,227,243,2,83,1,171,4,229,24,+0,200,87,0,54,105,63,165,119,197,37,224,80,12,171,150,224,80,6,97,+230,96,69,97,181,197,74,99,158,102,150,66,29,76,246,100,81,188,75,100,+126,196,156,196,132,224,37,1,64,106,224,14,3,228,159,1,244,112,0,0,+58,96,114,164,39,150,110,231,195,21,166,217,96,172,0,52,229,83,11,64,+82,133,129,64,140,0,51,64,201,167,105,146,105,227,77,1,129,116,200,191,+0,52,145,118,134,81,246,229,1,106,4,0,54,165,58,229,8,1,0,53,+75,129,66,5,169,104,195,106,105,122,231,145,7,227,189,1,163,219,68,250,+147,106,107,145,148,233,128,17,201,175,0,58,96,7,1,10,65,145,88,0,+58,96,84,64,13,2,50,32,58,96,114,96,25,78,179,96,137,99,97,0,+53,91,220,131,97,67,185,227,97,2,164,78,129,200,230,139,9,162,55,230,+141,8,226,145,15,97,89,64,110,162,60,231,165,1,68,81,65,217,233,15,+1,226,233,45,224,91,1,226,233,9,224,95,4,226,233,31,224,80,2,130,+60,130,127,0,58,96,24,226,233,6,130,215,226,214,0,101,24,231,89,2,+224,11,3,0,58,96,71,1,10,65,82,223,0,58,96,147,221,105,69,67,+68,156,129,31,148,245,0,53,130,77,64,93,98,77,0,83,64,39,0,50,+128,161,110,3,192,48,66,149,72,205,224,64,6,97,12,78,36,133,10,1,+95,53,67,10,0,58,96,85,103,80,229,80,1,73,174,93,112,160,42,108,+52,224,20,2,99,140,229,32,16,3,67,104,97,114,169,34,4,55,56,58,+50,56,229,21,8,7,110,116,84,111,68,105,103,105,219,176,4,66,32,95,+51,51,65,50,65,25,115,155,245,234,0,5,95,51,51,56,32,35,108,82,+192,182,224,47,11,96,37,0,52,166,138,0,95,64,27,0,58,96,220,249,+118,0,249,243,0,246,248,0,167,233,226,79,2,226,108,1,112,63,65,60,+66,6,225,76,16,225,119,41,128,54,201,161,132,73,209,129,224,123,0,1,+52,57,224,123,75,129,59,123,10,178,17,128,115,232,214,0,193,8,216,26,+164,240,96,8,135,78,96,5,224,158,30,120,28,99,119,240,159,5,162,121,+226,59,11,11,78,117,109,101,114,105,99,47,83,104,111,119,130,62,3,52,+57,58,55,226,60,7,160,37,29,46,115,104,111,119,73,110,116,65,116,66,+97,115,101,58,32,110,101,103,97,116,105,118,101,32,97,114,103,117,109,255,+44,1,161,230,224,2,0,0,95,164,86,131,175,209,153,192,13,160,178,209,+148,249,209,0,224,43,26,75,29,160,89,225,143,22,224,255,34,2,51,58,+49,225,0,31,15,117,110,115,117,112,112,111,114,116,101,100,32,98,97,115,+101,227,90,0,64,1,114,160,227,8,6,194,254,3,83,32,95,51,141,229,+231,130,0,161,251,224,49,6,194,168,160,83,192,11,226,180,35,224,97,4,+109,133,160,76,88,23,160,151,129,102,225,129,5,66,67,173,169,224,10,2,+224,46,2,243,90,2,1,95,50,72,17,0,67,101,136,160,119,225,162,7,+0,58,101,53,100,242,3,95,53,53,48,248,140,2,224,198,3,128,196,227,+105,10,160,24,226,208,3,0,58,101,175,156,86,225,52,5,245,105,0,160,+136,225,96,7,230,220,3,195,99,64,5,101,108,95,97,65,154,0,35,226,+181,4,174,183,1,35,52,237,188,0,132,190,226,147,1,224,40,7,239,100,+0,224,62,13,200,101,224,70,6,160,38,212,82,224,255,7,64,244,208,1,+0,89,109,115,192,197,120,237,96,109,141,150,168,219,65,95,0,50,70,174,+224,218,4,181,218,98,140,208,125,136,77,1,95,49,91,12,0,35,97,195,+160,22,3,95,49,49,56,227,56,2,2,32,37,32,162,231,224,45,5,64,+0,2,95,49,50,138,100,70,178,2,64,58,53,65,218,231,168,0,1,95,+53,142,114,253,60,3,72,21,0,51,141,141,226,163,1,193,203,194,110,65,+35,192,143,96,70,162,34,96,28,198,84,1,95,53,64,138,64,78,117,65,+0,51,173,44,255,180,1,129,255,1,95,53,65,38,1,95,53,96,167,96,+162,136,75,0,85,80,233,108,135,2,58,53,52,136,30,3,80,32,58,53,+72,49,105,167,0,52,95,67,74,67,0,52,74,63,0,52,234,104,1,0,+64,80,74,0,95,64,84,1,58,53,65,221,128,45,0,51,65,180,66,167,+64,3,0,58,96,47,161,7,64,201,0,80,96,19,135,42,80,249,135,101,+0,85,96,21,131,36,96,123,194,221,198,49,1,95,49,88,218,97,90,1,+95,49,74,55,0,49,103,182,195,164,225,240,0,1,53,50,117,163,0,51,+110,9,89,17,79,225,88,86,128,240,226,63,11,105,111,0,50,86,104,96,+94,128,14,97,40,2,51,51,32,229,8,2,113,97,97,254,225,209,2,228,+216,0,139,36,114,50,234,25,2,160,98,65,122,0,53,163,120,98,117,129,+138,65,139,97,171,225,219,2,192,18,160,50,96,8,72,95,64,6,64,198,+0,58,96,219,233,62,0,80,116,1,53,51,128,173,64,62,140,67,72,171,+0,53,75,42,161,167,0,58,96,59,225,234,0,128,17,129,233,124,171,161,+252,64,71,192,89,195,89,115,35,107,117,132,151,128,21,224,96,0,225,131,+0,129,121,0,58,96,171,211,64,64,14,193,253,1,95,53,113,186,97,138,+225,63,4,226,215,51,0,58,97,162,242,36,0,131,79,1,90,32,224,34,+1,0,58,96,52,181,195,64,13,194,87,67,219,84,31,64,183,118,205,64,+98,254,254,0,96,19,120,16,162,21,224,177,2,229,78,1,224,173,0,161,+170,224,25,3,227,205,1,97,222,160,33,226,0,39,225,20,0,0,95,88,+126,97,59,0,95,96,4,65,226,162,175,0,58,96,23,163,55,77,152,224,+197,2,129,207,129,99,164,72,161,113,228,84,0,163,147,96,71,225,186,0,+0,51,102,144,0,58,97,210,65,6,67,247,161,250,97,4,228,79,11,225,+34,40,96,25,227,31,4,224,20,1,97,35,128,110,140,195,225,39,26,1,+95,49,98,96,132,34,0,57,224,10,0,0,50,97,58,161,41,130,45,183,+182,229,140,2,230,172,2,111,181,195,196,224,2,0,161,58,229,191,3,131,+125,0,64,71,195,134,90,224,51,4,64,15,251,128,3,160,45,84,230,224,+47,7,134,133,99,201,130,239,118,198,160,0,0,58,96,230,148,217,96,212,+67,10,99,213,207,236,65,126,77,209,1,49,48,192,0,66,8,247,43,1,+229,117,0,64,92,64,72,0,51,230,146,3,224,174,1,128,164,225,170,0,+225,124,3,161,96,64,127,66,6,64,75,130,115,0,90,71,113,0,58,96,+31,226,104,0,97,62,226,90,3,0,58,96,71,5,10,65,32,73,32,58,+96,91,192,10,130,93,151,107,128,39,227,205,3,4,82,32,90,32,90,64,+113,206,61,1,49,49,96,107,129,14,96,103,128,124,128,255,192,138,251,105,+0,67,51,133,209,91,190,4,50,32,64,95,52,101,65,1,95,53,68,177,+2,58,53,48,253,149,2,129,169,1,95,53,95,107,162,130,224,62,0,1,+95,53,95,157,236,198,3,64,33,240,147,1,145,121,1,54,52,142,26,205,+116,193,77,96,41,69,57,224,42,0,0,67,69,161,78,214,4,50,48,57,+53,49,96,91,3,35,53,53,50,93,63,195,1,224,123,3,129,139,104,228,+160,20,101,129,119,102,1,53,48,169,168,118,129,1,95,51,124,130,0,51,+124,115,230,183,1,21,104,71,101,116,67,111,110,116,101,110,116,115,58,32,+115,117,114,114,111,103,97,116,203,176,69,102,71,36,128,110,0,52,80,18,+64,174,224,18,0,66,176,74,107,2,95,53,48,138,132,160,24,165,129,65,+181,64,138,81,222,102,89,0,58,96,39,99,100,145,119,0,50,103,145,70,+22,5,35,49,49,49,52,49,65,174,239,204,28,1,54,50,236,141,10,64,+35,0,46,96,35,19,99,104,114,58,32,105,110,118,97,108,105,100,32,99,+111,100,101,112,111,105,205,134,143,174,0,58,97,30,166,125,64,131,120,40,+65,80,9,10,65,32,94,103,101,116,98,32,58,97,219,99,20,3,55,53,+32,79,88,131,0,53,94,26,1,95,51,74,114,166,66,66,20,217,32,225,+154,1,66,78,147,171,75,249,1,53,48,68,102,1,48,49,232,48,3,6,+111,112,101,110,70,105,108,129,105,225,190,2,0,58,98,141,101,177,66,45,+126,189,64,57,234,45,1,0,51,93,144,162,12,66,69,161,221,90,196,107,+91,64,152,139,25,139,106,130,31,107,57,67,118,164,64,96,6,224,142,1,+129,74,161,178,227,37,1,0,52,88,248,2,95,52,57,67,19,1,52,57,+200,91,113,236,253,20,1,0,50,98,104,96,114,3,54,32,95,52,66,190,+3,95,52,57,53,240,98,0,96,21,1,57,54,103,86,0,52,81,61,1,+95,52,76,193,116,166,101,122,96,95,96,242,249,147,3,0,58,96,43,195,+132,64,197,125,18,99,110,100,63,116,8,134,33,201,235,0,58,64,103,96,+188,192,27,76,64,0,48,203,222,65,15,224,70,2,0,90,65,25,64,169,+144,23,177,229,227,165,0,97,124,96,30,161,124,78,185,229,182,2,116,126,+169,80,245,219,1,139,151,101,59,64,127,1,95,52,92,73,128,116,103,212,+192,170,64,90,228,227,2,103,83,96,43,66,112,6,52,57,49,32,58,52,+57,130,9,12,94,71,69,84,84,73,77,69,77,73,76,76,73,64,22,130,+14,133,26,96,2,69,11,224,1,3,73,94,224,0,2,1,58,52,67,245,+160,196,194,163,0,95,67,122,164,174,229,15,5,71,234,216,160,150,200,137,+112,227,246,0,132,192,98,76,0,52,76,201,128,44,100,200,100,121,1,52,+56,235,121,4,227,21,1,230,209,2,224,78,3,224,71,5,227,12,2,96,+187,68,183,130,28,253,7,26,5,51,56,57,58,49,49,228,24,7,3,104,+101,97,100,253,5,8,68,143,96,169,234,250,0,193,78,97,81,225,67,1,+1,58,52,67,113,225,113,5,225,116,2,225,108,3,1,58,52,74,55,224,+42,8,128,2,224,34,0,194,81,225,119,3,2,95,52,53,171,162,149,183,+229,236,8,0,52,93,138,162,126,65,144,65,69,0,85,105,117,0,52,144,+223,227,209,6,16,80,97,99,107,97,103,101,32,110,111,116,32,102,111,117,+110,100,163,226,3,95,49,52,54,67,179,0,51,65,79,194,233,166,214,118,+47,225,229,3,252,195,0,100,222,192,107,128,47,224,113,20,10,105,115,32,+97,109,98,105,103,111,117,115,228,90,0,160,100,96,128,128,183,3,56,32,+64,83,96,116,64,142,96,35,106,109,224,157,7,0,64,228,1,2,101,118,+96,73,233,153,5,114,85,235,67,2,137,52,99,164,226,199,4,237,150,2,+97,84,0,57,196,191,194,212,165,47,99,165,64,15,133,3,66,162,0,56,+100,216,252,236,1,128,0,229,187,3,1,52,56,166,48,4,52,56,50,32,+58,96,48,252,26,4,229,52,12,96,25,122,41,251,130,5,10,109,104,115,+47,83,121,115,116,101,109,47,70,40,3,80,97,116,104,182,200,4,50,49,+58,49,52,225,84,2,73,84,131,163,200,128,96,174,97,62,96,194,101,242,+96,211,2,95,52,56,169,49,234,71,0,100,229,0,56,170,71,96,160,96,+155,128,41,0,58,96,70,74,65,1,52,54,64,209,239,35,2,129,206,66,+132,223,51,224,18,0,154,59,191,89,225,88,4,133,27,194,62,122,172,157,+23,129,76,0,58,65,144,224,97,0,241,197,8,69,176,98,243,96,62,81,+191,224,122,0,241,178,8,64,51,74,232,146,38,128,115,209,180,2,79,32,+35,80,121,168,166,224,41,1,153,104,96,0,241,177,6,98,171,97,217,0,+55,65,7,67,5,104,24,1,52,55,104,215,64,21,128,182,112,128,74,103,+1,95,52,98,66,96,167,67,112,102,5,227,241,5,151,216,102,245,165,147,+166,70,224,38,6,109,84,234,51,3,187,223,129,68,229,70,1,99,164,0,+79,139,88,128,219,224,89,8,0,89,227,68,0,131,18,1,67,39,99,57,+227,53,1,67,47,130,72,187,103,136,51,198,180,64,41,0,79,99,6,226,+39,1,99,17,233,242,0,133,206,136,55,181,202,1,95,52,116,237,0,58,+100,194,133,28,0,50,229,74,8,229,70,2,0,58,96,47,1,10,65,227,+14,2,0,112,132,91,94,176,0,58,96,86,129,139,71,37,64,106,128,13,+0,48,64,13,130,174,226,246,8,95,186,64,58,130,192,4,35,52,55,32,+58,96,19,224,101,4,3,46,112,107,103,96,97,191,212,236,255,1,128,6,+160,15,109,171,100,26,126,168,136,197,192,6,137,117,201,114,232,226,0,254,+132,0,195,57,136,162,64,47,132,230,227,59,6,245,38,1,227,59,6,224,+147,1,131,55,224,42,1,64,101,130,134,201,72,127,217,99,133,0,58,98,+49,150,101,0,49,73,200,133,138,230,125,2,132,239,231,232,6,128,37,0,+52,79,60,99,14,204,214,0,51,124,177,1,95,51,102,179,64,236,231,154,+11,164,188,8,68,105,114,101,99,116,111,114,121,171,185,2,51,58,53,230,+138,0,230,63,4,2,103,101,116,224,43,0,236,147,1,2,99,97,110,70,+80,75,47,128,53,96,166,0,89,205,150,0,66,102,150,227,44,2,97,77,+197,226,237,144,9,224,185,5,161,87,224,64,4,240,75,0,224,23,4,0,+51,94,133,195,53,97,7,227,18,0,199,170,237,41,3,64,44,227,156,3,+162,7,96,244,170,42,0,58,99,216,2,10,65,32,67,147,103,6,224,93,+10,175,199,96,61,74,10,7,99,95,100,95,110,97,109,101,66,189,170,29,+6,114,101,97,100,100,105,114,64,17,162,251,161,226,225,224,9,255,45,3,+225,8,4,237,213,4,128,190,228,58,2,165,98,224,17,2,165,217,0,58,+100,194,96,151,3,108,111,115,101,128,133,191,174,0,94,65,177,160,17,227,+77,0,234,102,3,109,33,175,118,229,3,4,96,92,224,145,7,67,104,224,+145,8,0,58,105,52,190,126,192,216,0,52,99,15,1,95,52,86,49,1,+64,83,148,176,1,95,50,80,90,224,33,7,77,87,224,20,8,118,194,64,+113,160,120,117,103,224,122,0,0,73,99,75,191,27,75,253,125,241,0,52,+129,164,191,11,6,94,102,108,117,115,104,98,64,248,190,204,225,136,4,87,+12,174,46,227,104,4,163,214,224,5,0,93,145,64,4,64,114,64,3,224,+131,4,224,13,6,239,169,7,87,169,97,98,65,200,0,52,190,139,239,173,+0,0,52,90,113,96,199,130,85,147,210,0,58,96,22,96,214,0,66,135,+106,73,248,64,51,132,95,0,58,96,60,128,246,235,174,0,0,58,96,29,+8,10,65,32,65,46,119,114,105,116,66,151,184,219,130,18,65,5,248,73,+0,113,178,0,52,72,253,2,52,52,54,218,173,1,64,58,96,173,9,10,+65,32,116,111,70,117,110,80,116,66,49,184,94,71,187,0,90,77,98,97,+147,0,58,97,58,103,118,1,57,57,64,67,66,10,0,51,71,121,228,67,+1,5,115,116,100,101,114,114,68,39,0,58,97,201,82,77,1,79,46,128,+21,64,87,166,57,160,64,97,12,79,212,224,64,4,1,105,110,160,63,129,+14,128,63,1,105,110,64,62,129,0,2,95,53,49,175,138,77,193,166,10,+65,106,224,9,1,128,30,1,54,53,165,55,133,171,163,115,131,75,1,51,+49,194,115,0,58,96,6,144,103,2,52,32,58,96,63,129,149,0,58,99,+29,130,65,226,68,3,2,64,95,52,85,215,64,100,227,57,4,166,9,228,+188,7,64,138,0,53,192,36,0,52,99,94,1,95,52,137,123,233,138,0,+200,181,198,142,168,30,97,32,64,228,1,95,52,88,0,129,175,184,29,70,+194,0,80,177,21,129,135,224,6,2,0,55,66,27,184,51,0,75,96,213,+204,245,165,45,227,16,1,154,231,101,166,226,197,5,98,41,87,196,231,7,+0,224,55,3,0,51,80,30,224,192,1,227,74,0,163,65,1,95,51,80,+85,160,176,226,9,0,11,112,101,114,102,111,114,109,73,79,32,94,38,162,+160,64,31,130,22,2,102,112,102,97,230,184,22,4,102,112,110,101,119,64,+14,129,245,8,94,97,100,100,95,70,73,76,69,64,18,164,246,64,18,5,+117,116,102,56,32,58,97,86,244,158,0,232,40,0,225,178,1,239,13,0,+101,155,233,113,2,64,188,192,18,67,243,163,249,136,30,67,107,82,133,2,+79,32,35,135,209,128,74,224,21,3,0,57,224,21,10,65,26,224,20,5,+226,225,1,1,119,43,167,70,1,95,52,139,119,230,21,16,230,192,4,162,+24,226,109,9,3,95,52,48,54,90,222,1,64,58,98,148,101,0,103,173,+0,58,96,95,241,59,19,83,238,231,15,0,235,193,3,136,234,144,59,245,+93,1,224,20,4,225,78,0,139,166,241,85,1,184,216,68,59,239,174,9,+234,101,2,64,42,164,79,76,92,2,75,32,85,161,179,224,2,58,224,100,+1,224,0,6,224,73,40,224,2,17,78,202,224,0,14,224,77,42,224,2,+15,169,68,224,0,15,224,81,42,224,2,24,109,190,224,0,17,131,240,224,+1,41,255,177,9,6,70,108,97,103,115,32,123,212,249,224,0,16,162,106,+224,2,67,96,228,224,147,11,8,118,101,114,98,111,115,101,32,61,170,236,+0,95,67,224,1,95,51,69,114,199,48,224,0,16,225,3,25,224,1,11,+224,131,9,0,44,160,123,224,0,17,225,17,71,225,14,16,4,114,117,110,+73,116,225,12,6,0,52,79,172,225,12,23,224,247,25,224,1,9,225,9,+42,225,8,59,67,99,177,21,112,235,240,192,0,224,145,11,2,109,104,115,+75,84,193,17,153,219,102,4,225,17,22,224,250,21,224,1,11,225,14,41,+225,13,70,225,7,19,4,112,97,116,104,115,225,6,41,224,241,21,224,1,+9,225,3,40,225,2,53,226,10,36,4,111,117,116,112,117,227,28,1,225,+3,31,224,240,21,224,1,7,225,0,39,226,2,60,228,13,15,6,108,111,+97,100,105,110,103,228,15,39,224,229,25,224,1,1,224,239,38,224,238,56,+224,235,16,4,115,112,101,101,100,224,233,38,224,222,25,192,1,224,230,37,+226,212,54,229,220,16,6,101,97,100,67,97,99,104,230,237,7,224,230,22,+224,221,25,128,1,224,227,36,224,226,50,224,223,16,111,17,224,224,41,224,+217,25,64,1,224,221,35,224,220,47,224,217,16,6,117,115,101,84,105,99,+107,229,128,1,224,215,26,224,210,25,224,212,36,224,211,44,224,208,16,4,+100,111,67,80,80,224,205,34,224,202,67,224,201,35,231,29,30,5,99,112,+112,65,114,103,231,31,34,224,203,21,224,205,34,224,204,32,224,201,31,224,+199,36,224,196,61,224,195,29,224,192,30,0,108,224,192,35,224,189,58,225,+128,33,227,11,15,6,99,111,109,112,114,101,115,227,220,31,224,177,55,225,+109,30,224,173,15,5,98,97,115,101,54,52,224,171,29,224,168,52,224,167,+23,114,189,226,7,17,6,98,117,105,108,100,80,107,232,188,1,226,10,19,+224,166,49,224,165,20,239,93,0,224,77,13,3,108,105,115,116,224,161,30,+224,156,43,224,154,14,225,55,22,2,112,107,103,94,250,224,148,25,224,144,+40,224,143,15,226,105,15,6,105,110,115,116,97,108,108,225,33,3,226,109,+15,224,137,37,224,136,8,225,167,22,2,112,114,101,75,9,225,18,23,224,+128,31,224,126,2,224,120,22,4,116,97,114,103,101,236,113,22,224,113,25,+192,111,225,104,16,3,100,117,109,112,145,155,225,103,5,2,50,48,51,65,+108,83,240,192,111,224,107,22,96,106,224,103,16,3,117,115,101,83,119,217,+225,206,17,224,93,19,224,27,11,5,110,111,76,105,110,107,233,238,36,224,+0,21,96,95,85,231,84,171,191,212,0,52,149,145,65,14,160,6,1,95,+51,183,182,88,104,88,88,0,50,119,179,1,49,50,97,48,159,124,64,6,+222,129,122,108,86,95,117,226,97,30,184,74,224,204,3,5,78,111,116,104,+105,110,95,17,64,0,247,129,0,2,52,50,50,117,189,4,50,49,54,32,+95,124,214,0,35,117,132,225,141,15,3,74,117,115,116,226,49,1,162,47,+160,49,160,176,160,171,96,166,151,139,122,250,96,79,85,218,0,35,150,107,+122,153,160,16,128,63,0,58,96,140,245,195,3,123,239,151,58,3,60,32,+64,35,64,251,224,18,6,66,223,119,93,224,18,1,125,3,193,19,128,18,+86,79,95,136,224,202,4,3,68,97,108,108,160,201,224,27,9,8,99,111,+109,98,105,110,97,116,111,122,127,224,35,13,6,116,111,112,108,101,118,101,+192,68,224,116,7,92,108,224,52,9,5,108,105,110,107,101,100,224,119,16,+5,100,101,115,117,103,97,224,116,0,224,238,7,91,235,224,102,6,65,105,+224,155,10,7,121,112,101,99,104,101,99,107,224,105,18,3,114,105,118,101,+224,187,14,65,144,224,50,9,3,112,97,114,115,192,49,224,29,10,5,114,+101,112,114,111,99,224,186,0,226,191,1,226,19,0,160,11,0,58,96,6,+225,232,1,226,172,8,2,70,97,108,160,104,224,24,6,2,84,114,117,192,+128,192,92,66,76,192,92,64,11,0,58,96,6,99,28,3,95,50,50,56,+162,213,3,95,52,49,56,90,29,66,175,252,191,0,224,1,27,248,100,3,+224,0,3,0,58,96,80,96,102,0,85,99,65,92,32,190,82,0,49,153,+42,224,182,1,6,118,56,46,51,94,42,34,96,128,0,54,128,249,0,52,+89,123,0,52,90,6,1,58,52,94,207,128,19,0,51,68,30,0,48,154,+12,0,53,96,6,128,12,0,48,196,47,64,45,131,251,90,12,1,49,50,+217,115,0,58,64,59,64,22,2,80,32,58,96,22,160,228,67,226,1,49,+48,64,85,93,134,96,67,8,95,49,57,51,32,95,49,52,54,182,138,160,+85,129,145,132,20,121,128,3,95,52,48,57,96,88,193,78,65,166,121,223,+132,61,185,167,100,131,196,114,153,254,230,132,1,217,203,224,47,2,128,110,+64,90,125,37,1,54,55,65,252,0,55,224,199,1,64,36,130,26,95,200,+69,22,96,10,225,76,1,9,94,42,79,112,116,105,111,110,115,58,97,82,+64,167,0,52,64,41,154,184,224,39,1,2,45,104,32,224,0,7,14,80,+114,105,110,116,32,117,115,97,103,101,94,42,45,63,224,31,22,4,45,104,+101,108,112,224,31,10,7,116,104,105,115,32,109,101,115,192,38,6,118,101,+114,115,105,111,110,224,38,9,1,101,32,160,26,64,37,6,110,117,109,101,+114,105,99,224,45,1,224,37,8,10,32,110,117,109,98,101,114,94,42,45,+118,224,116,3,96,0,6,73,110,99,114,101,97,115,96,43,31,98,111,115,+105,116,121,32,40,102,108,97,103,32,99,97,110,32,98,101,32,114,101,112,+101,97,116,101,100,41,94,42,45,0,113,224,61,8,1,68,101,224,61,33,+0,108,224,61,8,27,83,104,111,119,32,101,118,101,114,121,32,116,105,109,+101,32,97,32,109,111,100,117,108,101,32,105,115,32,72,187,5,101,100,94,+42,45,115,224,54,13,76,127,2,105,108,97,65,175,0,32,147,5,13,105,+110,32,108,105,110,101,115,47,115,94,42,45,114,224,53,8,15,82,117,110,+32,100,105,114,101,99,116,108,121,94,42,45,99,224,32,8,24,68,111,32,+110,111,116,32,103,101,110,101,114,97,116,101,32,101,120,101,99,117,116,97,+98,108,65,139,1,67,82,224,46,7,3,82,101,97,100,224,133,4,0,99,+81,195,64,42,0,87,224,42,7,0,87,81,226,224,43,13,224,42,7,128,+86,3,97,110,100,32,114,23,224,52,12,0,88,80,133,224,52,5,8,117,+110,32,99,112,112,104,115,32,65,13,9,111,117,114,99,101,32,102,105,108,+101,65,9,3,68,120,120,120,224,45,5,4,80,97,115,115,32,128,23,1,+116,111,128,55,3,94,42,45,73,224,39,14,96,23,224,39,2,0,84,224,+36,5,3,32,32,32,71,193,49,11,100,121,110,97,109,105,99,32,102,117,+110,99,96,177,98,240,9,32,115,116,97,116,105,115,116,105,99,64,62,0,+122,224,62,8,0,67,206,73,66,177,231,30,1,3,32,99,111,100,64,237,+2,98,54,52,224,48,6,0,66,141,204,1,101,110,64,33,224,53,14,4,+105,80,65,84,72,224,53,4,3,65,100,100,32,96,20,1,116,111,194,102,+6,115,101,97,114,99,104,32,88,37,3,94,42,45,111,127,182,224,0,3,+0,79,151,59,2,116,111,32,64,26,1,94,42,224,28,4,128,0,1,73,+102,96,27,4,32,101,110,100,115,66,129,0,46,64,138,6,32,112,114,111,+100,117,99,66,208,224,153,2,65,144,224,67,30,224,64,2,0,67,224,55,+17,7,79,116,104,101,114,119,105,115,194,37,225,11,7,5,115,32,116,111,+103,101,64,36,4,32,119,105,116,104,96,29,2,114,117,110,99,106,5,115,+121,115,116,101,109,64,218,224,106,1,6,114,101,103,117,108,97,114,226,248,+5,0,97,224,118,8,9,67,108,101,97,114,32,112,97,99,107,97,220,225,+67,4,0,97,225,118,20,224,51,13,1,76,91,64,253,5,92,124,80,75,+71,93,160,52,7,76,105,115,116,32,97,108,108,161,168,5,115,32,111,102,+32,97,192,62,6,94,42,45,80,80,75,71,224,101,4,1,32,66,79,56,+224,96,0,6,80,75,71,94,42,45,81,64,7,4,32,91,68,73,82,192,+87,0,73,141,156,224,39,6,0,112,225,248,8,3,80,114,101,45,109,60,+224,114,1,5,116,84,65,82,71,69,226,252,3,6,83,101,108,101,99,116,+32,140,238,225,160,12,10,68,105,115,116,114,105,98,117,116,101,100,160,38,+31,115,58,32,100,101,102,97,117,108,116,44,32,101,109,115,99,114,105,112,+116,101,110,44,32,119,105,110,100,111,119,115,44,15,32,116,99,99,44,32,+101,110,118,105,114,111,110,109,101,110,224,87,13,0,84,128,75,197,100,4,+100,101,102,105,110,133,0,160,101,4,46,99,111,110,102,66,210,9,112,116,+99,32,79,80,84,73,79,78,160,58,166,225,3,32,102,111,114,98,15,0,+67,194,59,70,29,3,111,112,116,108,224,46,13,11,112,97,115,115,101,100,+32,98,121,32,109,104,66,86,224,59,6,224,78,0,106,132,64,74,1,45,+115,109,51,224,0,2,1,85,115,68,9,64,20,96,2,7,116,101,114,97,+99,116,105,118,194,138,3,94,42,45,100,77,210,4,45,80,65,83,83,192,+51,7,68,101,98,117,103,44,32,112,102,208,9,65,83,84,32,97,102,116,+101,114,32,64,34,225,24,12,7,80,111,115,115,105,98,108,101,128,175,2,+115,58,32,170,58,1,44,32,106,97,1,44,32,138,155,1,44,32,234,197,+0,64,18,107,24,1,44,32,203,117,0,44,227,66,2,0,44,128,209,1,+100,44,66,141,136,21,104,100,137,135,0,75,72,29,0,53,104,29,0,58,+72,38,137,27,0,58,64,19,128,10,0,73,104,119,137,86,232,63,1,0,+85,69,21,0,58,97,73,8,91,45,104,92,124,63,93,32,91,136,19,96,+8,167,180,96,11,231,219,6,64,19,0,118,64,4,0,113,64,4,0,108,+64,4,0,115,64,4,0,114,64,4,6,67,91,82,92,124,87,93,64,10,+70,33,64,7,3,68,68,69,70,64,7,0,73,67,129,64,8,0,84,64,+4,0,122,64,4,2,98,54,52,64,6,101,39,64,8,100,253,64,8,1,+97,91,96,18,64,10,227,153,3,64,15,67,118,64,7,227,88,2,64,14,+99,63,64,8,163,35,96,78,226,121,1,160,14,194,89,64,14,225,233,1,+16,93,32,91,77,79,68,85,76,69,78,65,77,69,46,46,92,124,96,75,+106,208,73,161,105,201,74,85,2,52,48,49,96,19,173,199,1,51,57,79,+49,8,48,48,32,64,95,51,55,54,32,233,156,2,5,115,116,100,111,117,+116,65,168,0,58,96,51,5,10,65,32,73,79,46,128,21,65,154,202,115,+106,143,1,51,57,106,86,238,180,0,2,48,32,95,143,53,1,51,57,106,+191,160,38,75,81,96,23,96,42,64,115,0,57,138,112,0,58,64,135,192,+79,5,67,32,64,64,80,32,64,19,138,104,81,37,0,52,96,44,1,53,+32,108,247,3,66,32,95,53,96,15,78,91,0,58,96,98,64,157,1,32,+58,96,17,9,10,65,32,65,46,97,108,108,111,99,64,16,171,184,1,51,+50,64,12,130,64,1,83,39,96,82,0,56,224,140,0,2,95,51,57,143,+99,2,51,57,49,77,90,108,164,65,45,128,145,3,95,51,54,50,224,207,+1,65,62,96,47,96,153,115,79,0,67,75,94,0,83,96,84,4,49,50,+55,32,95,107,99,108,112,0,51,78,17,3,48,57,53,49,66,187,4,64,+35,53,53,50,96,179,139,109,2,51,55,56,97,118,0,57,96,17,76,46,+2,51,56,57,96,215,64,128,225,137,1,17,104,80,117,116,67,104,97,114,+58,32,115,117,114,114,111,103,97,116,173,97,2,95,51,51,77,50,96,147,+108,88,0,35,76,87,67,43,96,66,225,158,2,0,56,97,133,0,67,96,+248,65,94,224,9,5,112,152,1,51,56,64,141,0,49,111,233,76,133,1,+95,49,112,5,160,6,0,58,96,154,224,81,0,193,166,242,247,2,128,14,+224,11,2,225,202,2,97,225,64,95,97,138,3,56,54,32,58,96,145,64,+13,77,255,2,51,56,53,64,179,0,56,129,188,2,95,50,57,76,169,1,+51,56,98,148,0,56,177,90,77,11,64,38,64,144,0,53,224,11,2,0,+55,192,11,0,58,96,6,206,178,109,243,192,154,0,90,96,129,160,243,224,+2,0,128,190,98,12,0,66,96,43,113,160,160,5,128,20,243,94,1,224,+63,0,64,205,141,73,112,216,130,74,64,10,146,124,1,51,56,80,0,239,+19,6,0,58,241,143,0,128,43,96,30,224,36,16,193,70,131,74,213,174,+128,177,130,108,148,8,1,50,55,174,46,224,85,28,128,175,192,198,224,240,+3,224,190,5,131,157,224,109,18,242,115,11,1,32,40,128,101,224,137,9,+78,214,0,49,239,26,0,224,133,1,2,95,49,51,67,83,69,235,128,14,+80,42,225,236,0,83,98,96,11,0,58,96,6,240,135,1,100,67,2,56,+32,64,242,120,8,67,67,224,18,6,79,133,224,19,8,242,141,10,78,218,+241,93,8,146,143,224,225,1,103,103,3,114,117,112,116,210,25,224,28,3,+1,114,101,172,42,5,118,97,110,105,115,104,242,60,2,224,35,1,74,44,+165,79,241,204,10,146,137,224,45,1,7,117,110,115,117,112,112,111,114,72,+240,1,111,112,76,20,2,105,111,110,224,120,9,8,104,97,114,100,119,97,+114,101,32,105,9,194,63,224,243,7,67,209,224,243,7,242,166,10,80,158,+224,243,6,7,97,112,112,114,111,112,114,105,76,147,71,233,224,129,9,11,+105,110,118,97,108,105,100,32,97,114,103,117,73,102,224,249,10,3,102,97,+105,108,225,18,0,224,115,7,68,91,224,44,3,11,112,114,111,116,111,99,+111,108,32,101,114,114,211,217,224,31,3,171,110,224,29,2,224,240,9,244,+132,54,225,133,4,77,112,2,102,105,101,78,160,8,110,115,116,114,97,105,+110,116,115,224,149,9,3,117,115,101,114,224,147,4,224,210,4,4,101,114,+109,105,115,112,62,3,100,101,110,105,225,10,15,226,2,7,6,105,108,108,+101,103,97,108,225,254,19,2,101,110,100,75,208,76,215,225,251,14,244,141,+16,226,188,10,5,101,120,104,97,117,115,226,224,21,3,98,117,115,121,225,+201,14,224,86,6,3,100,111,101,115,112,6,3,101,120,105,115,162,22,224,+31,3,6,97,108,114,101,97,100,121,128,30,161,82,128,0,196,11,103,111,+164,11,118,172,96,6,196,11,1,95,51,71,191,133,110,3,85,32,75,50,+132,26,242,133,3,5,72,97,110,100,108,101,132,153,119,8,0,55,115,168,+228,142,5,128,94,64,68,0,58,96,6,1,10,65,115,146,160,76,102,97,+136,100,0,56,181,15,1,51,48,87,254,0,51,224,103,2,0,83,98,146,+4,46,73,79,46,69,194,1,224,28,1,5,73,79,69,120,99,101,107,252,+96,136,0,58,102,214,9,10,65,32,94,112,117,116,98,32,58,103,253,96,+87,3,55,53,32,79,64,6,0,54,64,165,2,95,51,55,197,111,0,58,+104,38,75,36,0,50,64,2,64,15,203,52,1,75,51,96,14,0,54,167,+152,0,83,255,32,0,70,240,230,250,2,128,10,69,156,233,151,1,0,54,+149,53,250,29,0,233,17,5,166,215,2,51,54,54,88,120,161,65,1,51,+55,64,251,0,55,96,14,2,95,51,52,225,107,3,5,92,34,108,105,98,+47,129,9,4,47,73,79,47,73,69,46,13,110,97,108,46,104,115,92,34,+44,54,56,58,50,53,134,137,224,50,1,3,66,97,100,32,129,162,78,156,+226,192,0,2,95,51,55,181,207,0,58,65,18,64,217,120,135,96,202,96,+4,130,118,224,202,0,184,166,1,51,55,98,235,137,87,148,146,234,107,0,+96,75,166,71,1,56,53,65,116,130,72,3,102,112,50,112,64,13,171,11,+1,53,49,98,210,128,97,224,5,0,89,27,98,229,64,1,119,7,74,139,+1,49,50,70,113,224,6,12,224,42,2,64,15,128,48,224,42,30,160,28,+224,49,10,224,42,15,224,49,10,224,42,22,224,49,3,71,135,67,70,97,+212,0,58,96,6,214,98,1,51,54,160,46,0,55,98,100,247,177,0,67,+122,0,54,118,125,0,49,75,33,0,58,96,39,246,40,0,0,50,70,202,+128,99,0,58,96,38,160,78,0,89,246,148,0,73,64,137,92,0,58,64,+49,128,32,0,82,65,96,247,160,2,66,120,64,25,0,85,66,229,136,8,+64,27,151,84,91,155,87,111,0,58,98,196,1,10,65,115,229,0,58,107,+108,224,109,2,0,83,66,213,0,64,98,219,0,80,96,93,71,7,64,92,+233,2,4,201,231,98,80,2,64,64,64,99,47,0,58,75,240,128,211,0,+53,162,69,3,95,51,53,50,64,14,226,89,5,3,95,51,54,48,227,5,+2,5,77,72,83,68,73,82,163,231,0,54,129,75,227,117,3,64,132,76,+231,1,95,51,172,33,0,83,201,90,2,95,51,53,105,132,1,51,53,68,+116,68,125,0,56,87,141,235,144,0,2,95,51,53,97,217,224,123,0,171,+150,64,103,129,153,237,36,0,1,53,56,107,206,109,32,65,144,75,118,64,+39,64,64,1,10,65,113,136,8,67,83,116,114,105,110,103,32,58,96,44,+64,231,1,57,57,120,193,0,58,96,127,227,11,0,133,7,64,158,1,49,+51,98,95,1,51,53,107,117,160,6,130,58,96,184,0,58,96,6,7,10,+65,32,116,111,73,110,116,64,88,129,173,6,94,103,101,116,101,110,118,64,+16,233,199,0,128,192,248,239,2,0,58,97,86,153,25,65,102,129,197,2,+95,51,53,64,255,128,149,161,75,64,31,128,238,193,83,0,95,93,103,225,+99,6,194,31,157,110,228,241,0,0,52,161,8,0,52,129,8,0,80,69,+199,228,195,9,8,68,97,116,97,47,76,105,115,116,132,186,5,51,57,51,+58,49,49,228,187,7,12,116,97,105,108,58,32,101,109,112,116,121,32,108,+198,222,0,65,64,169,64,100,195,65,108,218,102,62,64,149,67,44,64,32,+204,247,140,228,0,52,97,179,0,52,129,79,0,50,67,91,96,48,172,228,+192,11,66,32,166,135,64,6,235,15,1,165,26,166,176,235,146,3,104,141,+235,253,0,98,233,171,59,167,13,217,233,167,110,192,130,126,221,141,79,64,+6,230,242,13,7,67,111,110,116,114,111,108,46,230,219,0,0,46,197,240,+225,39,5,103,16,0,67,221,197,0,58,96,237,97,29,133,198,111,48,79,+161,65,2,0,50,66,212,99,23,0,58,64,108,97,239,101,129,175,174,0,+49,111,57,129,88,80,143,128,10,123,36,255,147,4,154,200,154,175,1,49,+55,251,87,4,1,64,64,100,0,111,32,64,111,225,71,3,0,83,162,233,+108,146,1,35,51,67,109,132,236,3,50,48,55,32,128,15,236,222,0,0,+51,67,123,224,24,3,99,152,225,125,3,4,39,92,92,39,39,161,123,193,+96,176,185,224,82,0,101,127,0,89,155,150,224,17,2,240,79,0,201,93,+224,151,2,0,64,160,35,163,154,224,139,0,237,150,14,3,92,92,92,34,+233,89,2,0,58,96,131,81,0,192,92,71,71,1,49,51,96,204,70,14,+224,14,1,0,51,64,103,64,122,1,51,53,224,122,0,80,243,129,4,96,+39,141,54,97,155,165,110,133,113,97,151,143,37,161,136,1,79,32,96,59,+129,130,196,85,64,62,193,191,156,228,0,95,112,205,134,189,198,187,0,90,+64,28,97,98,64,61,224,217,3,0,38,192,216,130,253,99,8,129,61,99,+17,207,230,96,21,0,66,104,224,225,75,7,224,60,1,124,247,192,223,227,+42,0,241,50,0,103,252,96,79,96,177,65,32,225,149,6,135,75,224,180,+1,239,50,0,162,78,104,155,231,121,6,224,210,18,2,64,64,79,81,204,+0,48,243,142,3,2,78,85,76,96,30,96,25,0,49,224,25,3,2,83,+79,72,224,25,1,0,50,224,25,4,1,84,88,224,25,1,0,51,224,25,+3,0,69,224,25,3,0,52,224,25,4,1,79,84,224,25,1,0,53,224,+25,4,1,78,81,224,25,1,244,42,4,2,65,67,75,224,25,1,139,101,+83,147,97,240,96,19,0,56,128,19,0,56,224,19,3,0,57,159,67,79,+145,224,20,1,70,242,96,21,223,78,128,21,0,49,160,21,224,64,4,78,+195,64,21,84,202,224,21,2,134,91,97,100,224,108,2,128,43,226,134,0,+128,42,224,248,4,1,83,79,225,95,2,224,248,4,1,83,73,224,25,2,+224,248,4,2,68,76,69,224,26,2,0,55,224,26,4,1,67,49,224,26,+2,0,56,224,26,5,0,50,224,26,2,0,57,224,26,5,0,51,225,203,+2,226,0,4,2,68,67,52,224,26,2,226,1,4,1,78,65,225,127,2,+0,50,226,2,5,1,89,78,224,26,2,226,3,6,0,66,224,26,2,225,+11,4,1,67,65,224,53,3,226,5,5,0,77,224,25,2,225,12,4,1,+83,85,224,79,3,225,12,4,2,69,83,67,224,26,2,225,12,4,1,70,+83,224,25,2,225,11,4,0,71,224,25,2,67,115,224,25,1,0,82,224,+25,3,225,9,4,0,85,224,25,2,106,185,225,63,2,0,69,131,64,198,+9,224,0,21,106,40,100,23,69,54,136,115,229,30,1,0,54,72,109,66,+105,0,35,104,84,1,67,32,224,17,1,1,64,35,105,194,0,58,100,182,+103,61,3,51,49,32,58,100,218,198,110,77,169,229,221,1,3,52,57,32,+95,74,186,232,178,0,1,51,51,69,215,3,54,52,32,95,77,248,64,0,+239,106,0,102,21,104,226,72,91,128,53,100,202,228,197,1,103,187,69,75,+224,23,7,102,38,224,39,7,141,47,96,112,128,21,135,67,230,181,1,133,+153,136,22,96,11,0,58,96,6,183,69,64,139,160,201,224,154,10,224,195,+0,145,230,238,108,2,128,114,101,101,0,48,74,235,69,16,224,36,0,128,+160,224,10,5,96,50,0,53,133,127,1,56,48,128,85,97,89,129,128,96,+41,1,55,52,224,74,7,0,58,96,102,5,10,65,32,99,104,114,65,131,+136,207,0,83,71,235,102,239,2,95,51,51,64,167,225,215,11,0,51,145,+57,225,215,3,73,158,128,84,136,197,76,176,64,38,241,114,7,64,37,224,+19,7,130,37,161,197,160,19,70,12,0,85,166,50,224,9,3,224,40,8,+65,118,224,40,12,224,102,8,140,85,224,61,5,146,87,224,102,11,0,39,+70,232,3,67,32,61,61,64,38,97,176,134,154,224,97,3,0,58,97,34,+105,179,73,35,65,42,109,226,226,184,8,65,249,81,150,129,249,0,50,76,+191,0,50,88,151,129,188,1,50,57,77,61,96,84,96,13,0,51,75,29,+140,216,74,93,192,41,2,64,95,50,122,47,97,218,64,123,137,164,1,111,+114,77,223,64,18,9,10,65,32,98,115,105,110,100,101,120,64,16,172,10,+0,49,121,158,1,57,52,192,97,0,95,89,100,160,11,233,216,1,74,90,+160,169,224,18,4,181,29,224,18,3,129,251,224,18,4,140,90,224,18,4,+205,194,224,18,2,65,107,224,18,6,66,13,224,18,6,148,121,224,18,4,+130,31,224,18,4,224,189,10,98,214,224,19,7,224,191,10,181,221,224,19,+5,224,193,10,97,237,224,19,7,224,195,10,215,53,224,19,4,224,197,10,+108,83,224,19,7,224,199,10,70,216,224,19,8,225,135,11,224,199,10,173,+228,224,19,5,224,199,10,98,247,224,19,7,224,199,10,99,93,224,19,7,+163,174,224,19,4,98,89,238,49,16,91,159,7,47,85,110,105,99,111,100,+101,142,57,4,53,50,58,50,56,238,56,8,6,111,69,110,117,109,58,32,+93,67,6,111,102,32,114,97,110,103,219,203,130,249,64,7,100,209,1,95,+50,80,41,64,114,93,105,96,7,179,120,72,239,96,7,65,9,64,7,106,+78,1,95,51,95,44,96,7,100,166,1,95,51,95,91,96,7,128,79,1,+51,48,160,79,133,28,1,95,51,98,57,64,7,160,79,98,33,64,7,160,+79,98,9,64,7,160,79,139,16,1,95,51,142,57,1,95,51,97,217,2,+64,95,51,97,205,64,7,160,79,97,181,64,7,160,79,97,157,64,7,160,+79,97,133,249,192,8,96,109,228,207,7,64,73,229,94,53,128,7,96,8,+198,83,229,92,11,128,7,96,8,172,26,229,90,33,128,7,96,8,139,216,+224,38,7,65,7,64,29,97,15,64,8,140,104,249,168,9,64,161,224,119,+7,131,42,224,80,5,65,104,64,71,97,112,64,8,199,57,224,38,4,97,+159,0,85,138,97,128,8,232,78,0,224,118,5,131,21,224,59,5,161,22,+129,243,64,8,129,22,64,9,96,237,224,189,9,64,41,224,208,7,64,160,+224,19,7,131,191,224,109,5,134,117,173,70,64,8,97,42,224,38,8,65,+55,64,29,97,63,64,8,166,53,224,98,6,132,113,224,58,5,65,33,64,+49,97,41,0,85,108,125,224,96,9,65,31,0,85,108,173,96,7,96,251,+224,94,9,104,50,224,18,5,132,107,224,75,4,130,228,137,157,0,85,109,+73,224,111,9,160,246,192,245,128,244,225,158,8,226,0,10,161,255,193,6,+193,154,130,6,137,14,0,50,73,14,231,15,0,97,156,0,39,177,77,0,+83,175,32,231,176,4,71,146,128,46,224,12,5,143,0,2,95,50,55,82,+143,165,4,131,35,224,25,10,196,195,0,51,69,54,224,45,0,83,6,96,+11,0,58,96,6,138,59,181,155,64,8,0,89,146,194,1,80,32,107,154,+181,146,234,169,0,96,86,195,49,178,12,143,215,255,186,2,64,239,0,53,+72,9,224,192,1,224,6,7,0,58,64,136,224,124,5,224,121,35,224,108,+6,74,107,224,108,11,0,58,64,250,64,101,143,191,114,106,65,46,128,17,+150,129,0,58,101,10,128,17,0,50,192,17,138,83,143,167,128,17,137,119,+143,159,128,17,137,13,143,151,128,17,137,18,143,143,128,17,137,19,143,135,+96,17,67,254,128,17,0,56,192,17,129,7,143,131,128,17,224,179,0,67,+32,128,18,224,180,1,192,181,67,249,160,18,192,182,67,177,160,18,192,183,+64,8,160,18,192,184,64,46,160,18,192,185,64,84,160,18,192,186,64,122,+160,18,192,187,70,178,160,18,192,188,65,151,160,18,192,189,70,232,128,18,+64,253,128,18,224,189,0,65,34,128,18,225,115,1,192,189,71,57,160,18,+192,189,71,84,160,18,192,189,71,111,160,18,192,189,71,138,160,18,192,189,+71,165,160,18,160,189,103,192,160,18,160,189,103,219,160,18,160,189,99,50,+174,92,77,134,98,113,180,38,1,57,53,163,220,194,92,74,216,64,44,9,+115,117,98,116,114,97,99,116,32,58,64,35,224,62,14,0,52,224,61,9,+128,239,0,85,92,56,153,85,96,25,128,18,2,50,32,90,128,20,64,21,+181,28,2,50,56,57,64,134,87,131,107,162,15,10,65,32,34,94,95,94,+44,94,41,94,66,94,57,94,59,96,5,18,53,94,54,94,57,94,58,94,+57,94,52,94,57,94,57,94,73,94,38,96,7,0,66,96,19,30,57,94,+89,94,32,94,53,94,57,94,54,94,60,94,51,94,60,94,89,94,33,94,+53,94,58,94,54,94,58,124,32,96,75,22,57,94,67,94,59,94,61,94,+57,94,60,94,61,94,50,94,55,94,58,94,45,94,61,96,13,8,58,94,+40,94,40,94,60,94,33,96,75,31,60,94,40,94,50,94,56,94,66,94,+40,94,57,94,86,94,32,94,58,94,70,94,32,94,87,94,33,94,58,94,+71,94,2,33,94,32,224,3,102,224,33,59,224,3,53,224,9,1,0,66,+224,15,6,64,5,0,66,96,5,2,33,94,67,224,19,6,224,43,3,224,+79,13,224,69,9,224,15,1,2,33,94,50,160,67,0,67,96,9,0,34,+96,25,224,5,3,224,3,21,224,33,25,192,37,192,77,224,129,3,224,3,+99,0,70,96,5,128,11,64,5,128,23,193,77,224,3,2,1,124,68,97,+21,28,90,94,33,94,81,94,49,94,67,94,60,94,75,94,49,94,77,94,+60,94,68,94,49,94,70,94,60,94,49,96,3,6,80,94,60,124,111,94,+35,224,57,0,64,21,64,7,4,48,94,48,94,49,97,83,8,57,94,32,+94,67,94,48,94,60,96,25,67,73,2,32,94,48,160,3,64,41,0,80,+96,11,3,72,94,32,124,193,29,225,211,3,224,3,35,64,179,64,9,0,+58,160,15,96,75,5,124,50,94,32,124,47,224,75,40,224,3,13,8,61,+94,68,94,35,94,37,94,37,224,73,56,224,3,37,224,29,19,224,67,31,+224,3,145,1,48,124,65,79,130,49,4,69,94,57,124,40,98,53,0,52,+96,17,18,61,94,61,94,59,94,48,124,44,94,35,94,52,94,35,94,57,+94,35,224,5,4,6,71,94,48,94,90,94,50,98,97,67,189,69,87,6,+74,94,48,94,69,94,45,229,179,0,0,59,96,5,64,73,0,74,96,53,+64,25,14,57,94,95,94,50,94,49,94,73,94,50,94,84,94,35,101,231,+10,67,94,57,94,50,94,50,94,35,124,98,96,73,4,50,94,70,94,35,+101,187,6,69,94,35,94,49,94,49,96,117,4,61,94,67,94,35,96,39,+64,51,2,66,94,50,96,89,8,50,94,77,94,57,94,48,94,45,64,63,+1,94,93,99,59,0,35,64,193,3,124,88,94,50,96,119,64,33,0,48,+64,51,5,124,32,94,50,94,72,160,81,0,61,96,139,0,49,96,235,6,+35,94,59,94,59,94,85,96,205,64,29,128,35,0,66,96,5,66,119,64,+35,0,78,96,101,64,83,64,23,64,17,64,15,16,74,94,50,94,68,94,+48,94,87,94,50,94,60,94,69,94,50,96,137,0,45,96,19,3,72,94,+35,124,70,103,2,49,94,87,96,205,6,95,94,35,94,36,124,53,96,167,+0,36,96,151,8,66,94,36,94,71,94,35,94,67,96,15,2,36,94,36,+160,249,65,27,129,103,199,7,2,49,94,78,160,55,4,36,94,48,94,71,+96,103,0,48,97,11,64,7,64,185,2,48,94,70,96,5,64,85,129,145,+128,217,128,101,64,215,64,15,128,63,128,7,64,27,65,197,64,29,192,75,+65,85,64,121,64,35,64,121,64,21,65,27,2,69,94,40,98,15,65,157,+128,29,64,37,64,75,64,243,224,63,1,224,139,7,224,5,7,64,55,64,+101,64,125,64,247,128,71,64,23,65,85,64,185,2,35,94,70,224,191,0,+65,13,128,135,64,37,128,155,65,17,224,125,1,0,72,224,181,0,224,121,+11,0,68,225,5,6,129,203,192,59,129,3,129,71,0,78,160,51,224,251,+3,66,191,64,127,0,50,98,133,64,55,225,125,27,224,119,7,129,217,225,+127,13,64,93,128,141,225,129,17,66,225,65,125,128,245,64,33,65,113,65,+41,128,245,65,41,64,13,193,101,128,9,192,17,192,39,64,7,0,75,161,+169,128,123,64,5,128,29,64,145,129,145,128,213,0,69,96,35,163,51,105,+35,0,69,97,251,69,131,64,131,128,43,129,5,128,131,0,86,96,5,0,+79,225,109,4,130,213,129,215,64,165,224,237,1,192,53,128,173,225,119,9,+64,39,2,57,94,70,98,113,194,243,0,57,224,111,10,67,37,225,107,9,+0,68,96,117,193,171,128,235,128,123,64,11,64,219,226,143,1,224,117,3,+128,17,2,36,94,75,225,147,0,0,36,226,93,3,99,201,64,23,227,79,+3,225,59,3,68,141,65,93,64,45,0,36,96,189,225,201,7,0,72,96,+209,132,35,192,159,0,81,161,155,68,63,194,205,128,207,66,79,131,15,128,+85,65,173,130,133,66,129,128,201,128,183,128,217,0,57,64,185,1,124,47,+96,115,64,201,68,71,64,57,67,187,68,131,68,103,235,85,0,0,124,64,+123,226,49,1,129,67,128,131,193,89,128,69,69,9,128,143,128,35,69,47,+64,89,224,123,1,66,127,0,95,96,55,2,66,94,61,101,37,75,129,64,+11,64,251,66,57,64,41,0,73,96,251,69,195,128,3,75,237,64,3,64,+185,97,217,0,124,64,103,64,175,0,77,97,27,67,169,134,107,64,119,69,+197,64,33,128,251,64,63,64,87,134,163,0,68,107,247,64,115,96,213,1,+124,42,97,127,129,161,65,37,133,107,129,111,129,191,64,143,2,69,94,57,+97,23,192,21,131,69,193,221,129,63,65,113,134,17,0,76,226,135,0,128,+211,129,239,0,36,163,31,64,13,2,61,94,61,167,75,73,13,137,101,64,+139,71,79,137,141,1,66,124,129,221,197,153,196,47,224,17,0,98,97,224,+13,1,70,171,224,45,18,102,15,2,48,124,56,224,51,4,195,87,64,201,+4,72,94,57,94,83,98,133,131,153,0,73,98,123,2,48,124,85,167,241,+0,69,170,43,4,52,94,68,124,107,98,189,10,57,94,80,94,50,94,41,+94,89,94,50,97,155,3,66,94,48,124,70,223,71,39,2,66,94,39,97,+167,67,71,130,179,65,15,4,72,94,48,94,82,162,229,66,129,0,57,96,+17,64,31,64,17,67,73,65,57,195,181,160,19,1,124,51,224,49,0,66,+73,66,203,129,91,65,229,135,147,142,21,64,37,195,59,130,237,68,137,64,+185,72,163,72,51,64,133,0,45,168,67,64,219,0,34,66,233,1,124,52,+160,167,66,57,3,35,94,35,124,75,79,65,175,3,68,94,48,124,65,243,+69,73,0,94,160,151,199,123,132,213,229,29,1,65,227,128,29,66,101,65,+67,199,139,72,97,195,15,4,74,94,48,124,43,162,183,65,53,195,147,97,+117,0,124,74,181,68,169,226,125,1,64,55,66,167,64,161,128,245,131,75,+130,163,131,11,128,123,0,73,160,45,224,219,0,224,7,0,0,70,97,33,+65,3,64,31,67,45,5,37,94,79,94,35,124,131,139,72,97,0,46,162,+173,67,67,197,17,192,93,64,187,192,201,64,73,66,21,67,227,0,72,169,+15,128,171,64,227,195,65,195,61,131,29,99,61,96,243,128,91,198,13,128,+31,128,99,64,135,0,57,99,207,65,219,64,209,192,69,65,71,67,175,131,+55,130,23,193,83,2,69,94,49,162,65,138,155,65,173,0,42,162,171,76,+149,0,71,102,3,129,179,2,57,94,76,225,61,0,66,251,65,51,196,177,+128,105,129,237,8,43,94,33,124,62,94,49,94,76,77,31,0,124,76,147,+4,36,94,49,124,63,237,53,2,224,3,255,224,3,17,193,143,224,3,181,+64,197,2,71,94,32,228,245,0,0,69,162,89,81,235,64,23,192,7,224,+31,11,207,51,192,3,192,43,0,77,160,43,128,15,0,34,224,7,8,79,+21,0,48,241,53,0,0,34,114,125,2,66,94,60,102,13,224,23,3,64,+19,0,67,160,75,192,21,66,231,0,60,96,73,0,68,111,145,0,60,163,+7,224,81,7,64,23,8,74,94,41,94,68,94,45,94,69,179,57,6,55,+94,56,94,53,94,55,224,7,0,67,57,2,42,94,43,96,35,0,41,102,+23,64,25,69,63,2,51,94,51,99,245,0,58,101,239,0,74,179,127,4,+51,94,73,94,57,160,83,68,119,2,45,94,40,173,39,74,135,77,219,64,+45,77,193,224,13,1,69,233,69,183,70,183,0,59,107,77,67,161,2,67,+94,37,99,245,4,37,94,75,94,35,96,21,71,177,80,149,64,5,64,11,+242,89,1,128,7,192,23,0,58,96,247,71,229,64,15,192,3,64,245,64,+51,145,55,67,249,64,49,64,17,65,227,71,121,80,129,65,75,64,65,128,+25,8,61,94,79,94,40,124,34,94,39,160,51,0,39,104,137,137,171,64,+47,0,68,96,43,0,58,96,147,128,51,192,5,0,70,96,5,0,94,160,+31,192,25,128,17,2,66,94,75,116,41,0,61,232,201,0,0,83,160,39,+64,53,4,53,94,54,124,80,96,15,8,93,94,61,94,88,94,58,124,39,+103,125,1,58,124,64,49,0,85,97,179,10,61,94,84,94,48,124,59,94,+40,124,77,96,19,4,40,94,65,124,54,96,51,69,139,10,58,124,53,94,+61,94,71,94,58,124,110,96,19,2,65,124,119,224,107,2,224,3,11,4,+93,94,40,124,43,105,15,129,145,0,94,160,7,224,3,7,0,79,64,77,+5,92,95,94,61,94,65,225,189,0,224,3,30,1,124,62,224,47,2,0,+95,160,11,6,66,94,65,94,58,124,47,96,207,129,37,64,231,76,183,66,+49,64,103,6,48,124,104,94,61,124,47,242,13,2,193,243,227,163,3,243,+11,1,64,5,67,135,79,165,243,175,111,224,3,73,0,33,162,205,128,13,+70,197,64,7,74,43,67,137,86,135,2,57,124,37,163,223,64,21,100,15,+1,124,55,168,203,71,27,77,145,0,35,104,81,73,101,138,17,224,5,33,+80,125,196,29,64,3,67,247,64,7,128,5,68,21,132,61,64,5,128,23,+196,73,226,7,5,71,191,67,251,64,41,137,133,64,49,2,53,94,76,177,+233,215,203,224,3,3,1,52,124,64,205,0,89,98,11,2,88,94,61,106,+25,6,65,124,85,94,61,94,89,106,157,0,61,184,9,6,61,94,49,94,+50,94,39,226,123,11,96,91,224,87,8,96,5,64,27,2,72,94,39,232,+175,0,0,52,117,41,128,139,0,39,96,81,128,153,74,251,137,187,72,33,+69,59,66,97,3,50,94,52,124,73,187,74,77,64,13,136,119,75,91,137,+233,132,43,79,127,0,61,82,185,1,124,37,96,109,64,23,2,79,94,50,+100,11,138,153,67,233,0,71,100,91,2,78,94,40,98,247,2,73,94,40,+99,7,64,15,2,66,124,63,78,205,2,124,51,124,64,47,0,50,128,13,+5,94,65,124,35,124,125,176,65,4,49,94,72,124,118,141,243,100,7,4,+72,94,48,124,39,233,23,2,68,113,64,37,65,39,64,121,73,55,72,239,+0,83,102,147,226,155,53,224,3,19,73,87,69,193,73,181,66,65,0,49,+224,73,48,179,199,171,131,0,39,173,75,137,213,4,86,94,60,94,72,118,+195,150,197,224,3,13,246,153,41,224,3,69,79,69,224,17,3,224,35,13,+224,195,3,88,213,64,9,224,185,35,70,249,192,5,224,3,19,248,61,3,+64,5,66,217,128,7,128,3,224,47,5,0,84,104,63,129,189,66,71,2,+49,94,33,100,25,211,87,139,71,68,93,235,243,1,71,19,139,181,147,255,+146,5,77,105,77,195,67,251,148,63,1,36,124,67,57,0,79,160,55,64,+19,204,99,76,177,0,81,171,159,66,185,149,221,64,105,64,29,0,91,108,+35,132,151,64,121,78,1,142,9,64,65,0,92,242,191,0,236,213,3,236,+151,5,76,125,68,121,69,33,64,81,71,213,64,77,141,251,85,201,131,41,+112,189,111,97,144,17,192,225,128,7,67,207,129,5,77,33,64,23,65,75,+64,55,141,85,131,113,77,117,144,229,173,189,96,245,144,51,140,123,64,75,+174,117,160,25,0,87,177,103,131,195,79,77,224,121,1,64,17,129,137,64,+19,78,149,146,27,224,7,5,229,235,6,112,83,74,47,64,219,194,109,6,+67,94,48,124,79,94,33,110,255,128,211,224,5,1,0,57,96,9,192,207,+65,143,2,50,124,87,101,143,0,50,101,135,65,119,64,63,64,15,65,61,+2,46,94,70,100,147,2,46,94,46,192,7,1,94,71,160,9,2,47,124,+49,96,9,4,47,94,66,124,109,128,163,1,124,105,101,19,64,157,0,33,+96,79,74,245,70,191,129,227,2,50,94,58,176,3,146,63,128,3,224,5,+0,112,121,4,80,94,60,94,79,65,129,3,124,106,94,50,101,217,4,79,+94,61,124,63,160,95,87,47,71,1,69,125,148,195,94,47,69,125,83,213,+222,55,64,215,64,17,134,149,74,215,230,67,11,224,3,3,65,125,64,7,+144,71,139,7,129,235,134,85,192,3,139,31,0,52,105,43,66,91,152,211,+138,61,64,161,0,65,161,157,87,247,66,69,254,207,58,160,59,192,165,65,+69,2,49,124,44,162,43,80,185,131,145,226,43,9,140,35,128,31,87,181,+0,58,126,251,64,9,65,63,0,67,169,159,66,105,0,66,121,93,137,163,+65,83,144,191,145,205,193,161,114,97,112,99,0,50,66,47,1,124,122,184,+235,64,221,66,49,0,44,178,93,4,72,94,61,124,52,103,127,1,40,94,+74,245,95,105,65,161,76,3,145,59,2,61,124,46,96,47,68,77,4,65,+94,65,94,48,195,219,98,117,76,23,4,35,94,90,94,40,97,85,90,29,+64,73,66,247,0,83,104,13,67,147,0,39,103,151,0,37,96,129,67,99,+0,48,177,135,144,103,64,55,64,37,67,247,2,39,124,41,103,57,6,32,+124,39,94,33,124,77,160,195,210,33,73,117,64,187,0,35,101,63,135,97,+0,71,164,207,132,117,0,74,109,125,0,78,96,5,0,70,253,45,0,75,+177,67,51,0,78,96,5,66,235,141,135,64,195,64,59,66,249,2,66,124,+54,163,175,71,207,65,101,64,147,68,1,71,195,2,48,124,41,109,69,3,+72,94,49,124,64,191,193,175,67,5,81,79,129,117,65,45,128,23,150,227,+69,97,0,40,96,11,65,173,86,85,65,255,69,97,4,72,94,40,124,47,+225,177,4,64,85,2,68,94,40,96,125,141,169,64,63,65,215,64,25,2,+57,124,63,170,79,65,45,65,163,64,51,2,79,94,40,99,101,77,227,132,+199,137,29,138,151,134,21,211,191,65,179,130,97,147,23,69,55,0,40,99,+155,74,61,64,7,64,33,64,89,197,187,73,7,129,5,0,61,101,235,64,+89,131,57,64,55,116,45,99,223,64,169,64,15,201,159,64,243,64,215,64,+133,64,11,84,81,154,21,118,229,65,7,3,124,79,94,48,85,81,3,124,+54,94,48,94,105,1,94,76,96,7,70,211,102,173,162,23,134,141,243,67,+3,64,209,69,183,85,7,146,143,92,223,2,49,94,85,111,181,0,48,109,+195,0,65,64,93,1,94,94,65,27,1,124,41,96,147,64,185,157,23,129,+53,97,19,64,123,96,99,64,237,74,3,129,153,64,197,70,201,66,197,75,+45,77,239,64,193,129,79,75,229,2,48,94,84,96,209,0,40,105,189,203,+209,134,83,84,27,0,78,164,219,65,43,85,195,64,183,230,97,1,128,45,+135,21,68,21,216,143,198,205,68,51,0,45,97,43,134,85,68,151,156,185,+219,77,65,11,2,66,94,35,97,35,148,37,71,133,193,31,70,149,64,75,+131,25,70,83,128,83,128,119,102,189,120,103,64,119,84,59,135,147,136,15,+64,135,134,113,138,159,64,53,133,89,64,199,67,97,65,9,221,71,244,53,+1,64,5,202,15,160,233,107,41,246,247,7,132,147,69,17,101,243,168,21,+64,73,64,193,66,47,192,223,199,101,251,175,33,129,91,128,141,154,187,251,+175,1,153,233,64,47,64,91,85,91,128,53,192,31,84,137,194,77,64,229,+154,155,192,119,132,185,64,9,64,71,156,77,192,95,64,217,64,5,225,5,+1,136,57,65,113,136,203,66,83,64,155,2,92,94,48,98,29,192,237,64,+49,129,63,131,167,213,89,192,57,137,217,0,93,186,21,192,121,192,221,129,+31,128,243,129,167,195,41,0,65,66,161,97,89,194,89,64,169,224,51,5,+0,86,97,235,98,143,102,27,192,97,245,237,1,128,39,137,243,129,17,129,+151,73,173,0,82,173,99,128,37,64,47,192,153,161,215,224,45,0,0,83,+106,37,2,48,94,90,161,75,224,49,1,130,241,65,111,67,37,64,47,134,+119,77,235,65,219,2,65,124,56,165,89,226,167,1,99,29,1,124,99,102,+101,4,32,94,95,94,33,96,55,68,197,68,85,226,39,1,132,131,226,31,+1,91,25,87,149,226,15,1,193,9,66,1,137,211,64,121,67,31,87,31,+64,185,160,77,0,124,67,5,225,71,3,133,3,192,235,64,59,0,90,96,+103,2,73,94,35,173,239,64,89,196,187,65,197,65,151,234,183,1,67,183,+2,45,94,50,183,1,225,99,1,65,253,69,3,74,241,131,231,4,57,94,+65,124,53,186,73,144,61,193,85,122,137,0,124,128,185,152,129,225,127,1,+130,69,128,43,0,82,230,69,0,0,57,248,247,0,0,85,162,189,64,55,+226,17,2,0,124,234,167,1,137,217,66,241,64,85,64,63,198,85,131,39,+139,103,224,141,1,135,9,129,105,71,253,221,193,128,103,194,75,228,189,1,+0,66,64,213,250,119,2,139,73,222,93,64,211,106,113,121,247,64,29,66,+35,64,133,224,75,1,66,131,101,83,0,124,77,21,136,129,2,84,94,40,+115,207,2,67,94,59,104,197,0,76,167,125,10,89,94,50,124,101,94,48,+124,110,94,39,184,189,66,205,1,65,124,66,253,1,84,124,90,207,0,96,+163,173,64,49,0,72,99,9,0,79,122,149,64,215,69,201,65,77,0,95,+98,193,100,53,5,124,70,94,50,124,53,66,157,97,83,85,25,197,9,64,+147,0,77,98,61,0,68,123,217,64,211,154,169,133,153,154,61,197,3,129,+61,250,143,1,157,223,131,139,65,103,221,25,76,43,67,21,193,213,103,63,+166,131,64,145,65,73,0,67,104,75,2,66,94,49,98,131,147,121,129,35,+0,65,96,143,195,47,0,86,105,165,2,57,124,100,188,27,136,7,71,9,+66,17,135,13,0,76,121,99,77,145,64,119,79,243,65,49,65,125,66,131,+4,50,124,47,124,117,97,117,98,3,81,147,0,124,64,141,65,255,64,65,+4,50,124,69,124,102,96,73,158,107,64,5,64,73,73,95,70,139,65,171,+0,50,69,11,168,149,64,13,64,87,65,143,154,123,74,207,0,82,105,221,+76,79,64,225,66,15,138,169,194,69,128,57,158,163,65,37,3,45,94,94,+124,68,103,2,65,124,111,190,177,64,245,4,67,124,51,94,61,97,227,65,+207,64,49,0,86,142,45,4,124,115,94,61,124,75,85,2,65,124,117,129,+89,212,241,0,124,79,33,197,153,75,5,68,55,2,71,94,45,101,25,137,+195,0,35,114,43,3,67,94,35,124,75,157,86,5,0,65,107,39,4,35,+94,61,124,121,167,41,68,143,160,7,1,124,86,178,113,0,88,86,35,96,+191,76,59,76,47,64,7,138,139,0,81,160,13,64,21,234,179,1,190,135,+224,13,0,152,89,88,187,152,111,234,203,1,74,221,224,63,1,64,37,128,+43,128,45,203,9,224,29,7,80,163,64,93,137,191,192,33,224,157,3,224,+7,23,0,91,176,183,10,88,94,32,94,58,94,88,94,33,94,58,117,251,+224,15,55,177,15,1,124,49,67,55,86,237,1,124,54,101,119,1,61,124,+66,143,67,231,1,35,94,87,119,129,147,67,41,66,87,67,67,72,99,2,+35,94,72,106,1,0,73,113,43,0,83,117,187,68,167,2,33,94,65,100,+49,133,51,0,80,162,19,221,195,64,5,172,157,4,124,61,94,49,124,65,+15,2,35,124,111,108,249,202,227,73,215,153,75,195,209,75,27,84,29,131,+201,2,35,94,80,254,83,0,132,15,66,191,2,59,94,67,96,143,68,67,+0,49,224,25,0,85,65,192,53,68,247,228,35,1,2,67,124,95,229,141,+0,137,55,237,209,3,1,65,124,136,239,108,67,64,147,67,127,3,124,33,+94,32,93,33,96,163,64,99,228,115,4,1,94,70,96,151,0,58,114,5,+75,215,0,59,74,221,99,25,78,5,148,227,1,65,124,77,217,128,111,135,+175,128,117,195,165,195,119,192,145,134,213,64,5,129,7,224,3,1,131,217,+224,61,7,224,3,9,224,31,1,128,83,224,241,3,224,101,1,128,117,0,+80,238,189,0,64,13,129,1,0,80,85,145,171,243,0,66,68,69,121,65,+68,57,0,99,182,165,0,78,175,35,128,7,96,5,1,124,36,165,75,0,+76,96,243,4,32,94,61,124,55,108,251,102,51,192,65,121,197,144,183,0,+61,100,159,87,253,0,65,118,239,2,65,124,122,98,115,4,60,94,69,124,+87,160,45,70,113,66,33,175,49,1,124,118,160,135,86,95,65,35,0,75,+160,39,65,105,224,13,0,1,124,55,118,115,64,225,147,149,90,101,64,15,+68,95,64,181,224,53,1,0,61,107,77,1,66,124,90,165,64,215,66,251,+64,33,207,161,64,65,66,183,64,81,64,181,192,247,90,167,136,49,128,23,+2,65,94,82,97,3,0,91,165,37,0,72,161,193,4,66,124,77,124,93,+96,9,66,121,2,50,124,32,97,19,193,223,0,65,101,91,161,201,2,124,+44,92,96,35,166,13,0,58,80,27,229,215,0,2,68,124,107,96,7,0,+83,114,161,0,68,135,33,1,124,97,96,41,0,38,104,99,129,197,64,97,+96,111,5,124,43,124,56,124,80,108,229,74,233,2,95,94,45,96,93,69,+199,4,35,94,67,124,124,109,171,0,47,68,3,1,124,123,96,9,64,131,+224,15,2,31,34,32,58,50,57,48,32,64,10,65,32,95,54,32,95,50,+50,48,32,64,95,54,32,89,32,66,32,66,32,83,32,85,9,32,95,49,+53,52,32,64,64,64,64,64,16,1,90,32,224,7,1,12,83,39,32,83,+32,64,66,32,67,39,32,83,39,64,8,8,83,32,64,95,49,50,55,32,+95,64,48,1,35,49,160,52,0,67,64,23,224,38,0,14,66,32,64,64,+67,32,67,32,95,52,57,32,95,50,51,64,36,8,95,49,56,49,32,95,+50,54,52,64,62,6,53,57,32,35,49,50,56,96,59,128,53,64,110,10,+95,49,48,56,32,64,67,32,95,56,51,160,41,224,53,19,3,85,32,35,+48,224,64,0,2,66,32,80,64,194,31,48,32,102,114,111,109,85,84,70,+56,32,34,92,34,108,105,98,47,68,97,116,97,47,67,104,97,114,47,85,+110,105,99,14,111,100,101,46,104,115,92,34,44,50,48,50,58,56,34,128,+62,64,225,96,228,96,71,128,13,64,133,224,187,28,128,185,2,64,67,39,+64,249,6,95,49,56,48,32,95,55,96,27,160,210,64,202,96,16,64,80,+192,11,192,63,3,95,50,54,54,64,184,4,50,56,51,32,64,160,55,224,+28,0,129,76,64,70,96,151,3,95,49,49,55,96,162,3,95,50,56,54,+225,37,0,160,78,128,140,225,17,2,64,71,64,11,2,95,50,56,64,33,+3,58,50,56,57,129,252,4,50,56,55,32,58,96,20,10,10,65,32,98,+115,117,110,112,97,99,107,64,17,0,55,96,17,64,110,2,95,50,56,64,+232,3,50,56,53,32,64,56,0,54,96,24,2,66,32,89,64,252,65,160,+0,58,96,25,64,44,65,41,0,67,129,44,5,54,48,32,95,54,51,64,+140,64,118,161,142,65,193,129,220,128,57,128,189,0,52,96,48,225,42,1,+192,190,65,91,0,52,96,94,0,52,128,171,2,49,49,49,97,29,1,54,+57,96,142,97,137,5,50,54,51,32,95,49,96,105,128,11,2,50,56,50,+97,161,1,55,50,161,71,64,11,96,23,160,11,0,53,224,11,1,98,87,+128,11,67,4,1,54,55,64,87,0,54,161,32,0,51,96,116,3,117,114,+101,109,65,14,0,50,160,130,1,54,50,98,218,64,176,66,243,1,50,50,+128,133,5,55,48,32,95,50,55,64,121,226,175,23,128,219,3,95,51,52,+55,226,155,13,3,87,111,114,100,96,4,0,56,130,153,6,55,54,58,51,+52,58,32,66,155,224,47,1,128,31,13,115,117,99,99,58,32,111,118,101,+114,102,108,111,119,130,189,224,156,12,64,142,224,156,0,97,104,224,157,64,+0,55,224,157,16,8,112,114,101,100,58,32,117,110,100,224,158,3,129,103,+5,50,32,64,95,51,53,161,118,1,54,54,225,117,0,0,67,64,167,0,+52,65,147,225,85,8,131,145,128,5,64,38,0,49,64,72,99,140,99,107,+64,66,129,217,224,242,8,224,31,13,224,89,1,68,189,2,56,32,73,96,+33,96,123,99,51,224,20,2,96,54,96,20,0,58,96,62,226,7,6,1,+55,49,96,37,96,80,0,54,226,0,3,0,52,64,13,129,82,225,80,26,+129,79,3,57,54,58,52,225,79,12,225,236,19,160,129,96,242,192,129,129,+229,224,130,44,0,55,224,130,15,225,209,13,65,200,97,196,97,189,99,66,+225,12,2,225,183,7,0,50,64,21,225,145,0,0,56,224,184,6,224,25,+1,99,226,224,71,2,64,13,0,55,192,72,165,161,0,39,162,50,96,83,+128,77,160,58,65,169,134,221,132,145,133,204,224,133,2,67,243,1,64,83,+230,196,1,68,181,0,66,69,176,100,150,165,190,0,89,160,170,224,66,0,+64,13,166,205,135,39,128,7,96,81,66,206,1,64,95,68,66,192,28,192,+76,64,32,135,0,0,95,98,229,97,160,3,79,32,64,75,192,11,160,53,+160,252,64,177,224,165,2,224,42,1,165,64,0,58,96,225,224,218,17,96,+136,224,218,68,97,44,224,218,70,64,165,224,218,11,134,136,224,46,0,72,+92,96,44,128,179,224,125,5,160,192,96,202,160,180,163,13,64,91,71,133,+128,150,164,214,232,210,0,230,88,0,66,81,103,4,1,55,49,103,42,2,+95,55,51,135,50,0,58,98,117,11,10,65,32,85,32,75,50,32,75,52,+32,65,64,56,0,58,68,11,224,21,3,96,187,0,58,68,54,160,21,96,+84,134,56,96,84,100,235,167,120,64,9,1,50,53,64,247,0,58,100,121,+5,10,65,32,80,32,58,64,37,128,60,0,65,96,60,169,147,2,49,49,+50,134,234,103,121,136,116,0,54,68,118,137,167,230,171,4,1,64,58,103,+17,5,10,65,32,73,32,58,96,18,66,28,98,30,65,2,129,37,162,8,+161,31,136,23,128,33,65,55,224,22,4,168,93,0,52,233,64,18,10,73,+110,116,101,103,101,114,95,84,121,112,169,64,3,53,52,58,49,169,63,128,+63,0,53,71,151,0,53,134,116,1,39,66,65,233,226,25,3,71,249,224,+34,2,224,26,3,224,23,2,193,177,1,95,49,97,55,2,95,49,53,104,+110,64,251,130,255,105,11,102,197,0,64,97,64,96,87,2,50,54,53,64,+14,161,156,68,153,225,200,9,64,34,65,103,0,52,69,241,72,54,97,73,+160,10,66,178,168,76,0,52,103,38,1,50,52,70,3,103,50,0,73,97,+82,231,98,7,231,71,7,137,118,231,94,14,224,45,14,96,185,64,244,100,+240,0,58,96,31,105,104,192,24,64,19,130,91,64,17,1,51,50,131,73,+0,51,104,107,64,89,226,93,0,64,44,98,129,0,51,65,195,0,51,128,+103,103,101,101,171,1,50,51,64,11,66,166,2,95,50,51,74,211,96,61,+2,95,50,52,73,49,128,73,66,101,2,50,52,51,130,130,102,93,102,73,+64,7,224,48,2,0,53,96,198,160,11,224,134,0,0,95,64,134,224,56,+7,131,167,162,106,64,67,234,27,1,224,27,5,103,216,137,206,67,86,66,+246,69,207,128,41,1,95,50,64,198,128,18,224,81,50,103,247,224,81,5,+64,18,3,95,50,53,56,224,196,2,224,232,2,67,117,6,75,32,95,49,+52,49,32,160,67,0,75,160,8,64,21,0,50,134,112,64,43,10,10,65,+32,112,111,112,99,111,117,110,116,67,138,131,204,99,128,0,66,96,95,67,+180,1,54,52,170,231,0,58,64,99,129,168,0,53,75,132,66,220,226,169,+2,0,90,224,1,14,0,75,164,196,224,0,1,0,58,96,88,64,72,231,+227,16,7,66,105,116,115,47,66,97,115,163,173,5,49,49,52,58,49,56,+231,228,7,9,97,114,105,116,104,109,101,116,105,99,232,103,4,0,58,97,+35,230,112,0,69,111,102,94,228,85,1,192,5,1,95,49,66,96,66,157,+67,183,163,130,164,0,197,158,66,176,134,26,1,50,52,134,50,141,40,227,+194,0,227,19,3,128,66,0,58,98,216,97,26,225,20,15,224,1,3,225,+32,9,64,0,0,58,96,147,192,197,129,142,97,244,64,133,0,58,66,191,+161,124,0,51,224,94,42,0,58,96,75,224,92,4,64,230,132,161,2,95,+50,53,131,79,161,244,197,240,225,227,18,224,103,14,0,58,96,73,224,102,+4,0,52,102,7,128,195,0,52,130,78,96,89,224,92,14,224,84,7,0,+58,96,58,194,117,224,49,11,224,61,19,192,66,162,125,69,76,69,71,101,+65,133,59,165,58,100,4,229,58,6,100,152,131,134,101,24,135,38,68,252,+0,58,96,47,102,196,106,199,66,44,98,32,226,26,2,0,58,64,88,64,+35,2,42,32,58,96,105,129,21,3,95,50,51,55,194,121,226,87,12,101,+130,0,58,68,219,160,49,239,234,3,228,74,10,233,91,2,104,183,0,56,+224,29,5,2,95,50,52,228,113,0,161,144,64,167,227,227,0,64,106,130,+25,232,51,0,224,2,2,225,64,0,226,18,0,224,30,4,225,112,3,0,+58,96,104,224,178,61,65,34,224,178,3,0,51,97,179,224,178,2,0,51,+226,72,0,0,51,224,141,3,226,2,6,0,58,96,56,224,183,7,226,45,+14,0,58,96,117,7,10,65,32,120,111,114,32,58,102,130,2,10,65,32,+128,11,129,200,64,206,224,1,31,68,131,224,0,11,224,57,25,192,1,224,+65,14,224,56,25,128,1,224,62,13,224,55,25,64,1,224,59,12,224,54,+25,224,56,13,224,53,44,224,50,41,224,47,38,224,44,35,224,41,32,224,+38,29,224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,+224,17,8,224,14,5,224,11,2,192,8,0,80,225,251,10,131,86,236,124,+1,229,180,13,224,1,3,227,146,4,224,68,3,133,14,76,63,74,87,69,+204,0,53,79,123,74,221,241,9,0,0,54,69,201,0,50,100,59,224,19,+0,106,14,224,19,6,83,250,224,19,7,100,133,224,20,8,113,196,224,41,+8,224,82,10,1,50,51,224,83,1,0,58,109,14,235,210,9,0,51,133,+31,237,155,6,73,156,231,19,0,69,5,0,58,64,138,224,225,0,139,29,+1,50,50,104,9,78,232,2,95,50,50,128,17,107,41,80,89,1,95,54,+74,230,96,123,1,95,54,75,34,96,10,0,58,96,6,7,10,65,32,117,+62,61,32,58,96,40,96,12,64,11,132,207,1,117,60,96,24,129,158,1,+117,60,64,11,180,82,2,99,109,112,64,13,193,104,0,49,71,16,128,231,+231,24,2,224,252,1,73,84,192,20,0,58,97,146,106,51,1,49,57,64,+68,128,244,1,98,115,181,182,0,49,202,81,0,49,74,81,0,49,128,233,+7,98,115,108,101,110,103,116,104,64,17,128,180,197,177,109,158,0,58,65,+135,64,21,0,82,141,246,64,16,213,208,129,204,0,49,102,62,64,156,64,+27,181,141,98,32,0,48,108,86,79,142,2,95,50,48,113,179,0,49,104,+235,0,49,107,251,0,49,65,86,97,62,96,65,129,62,96,10,0,58,96,+6,225,62,0,64,40,193,62,64,58,225,62,0,64,77,193,62,64,95,3,+10,65,32,105,129,62,64,115,111,41,1,48,56,64,13,168,130,108,146,0,+48,97,193,0,48,118,174,64,160,3,10,65,32,47,64,76,64,17,3,10,+65,32,61,96,11,205,93,0,89,175,35,145,44,1,95,49,65,11,0,90,+64,68,97,27,1,95,49,173,224,113,4,2,58,50,48,234,38,0,98,118,+0,58,96,38,141,145,173,144,1,49,57,65,6,79,171,89,95,2,95,50,+48,168,174,0,48,128,214,9,94,109,100,53,83,116,114,105,110,103,64,132,+204,32,67,229,0,95,109,167,0,57,71,130,119,72,64,15,216,53,98,159,+72,37,1,64,95,113,222,0,58,96,101,140,91,160,55,104,246,1,90,32,+224,31,0,129,30,4,110,101,119,67,65,128,111,4,76,101,110,32,58,96,+39,167,108,164,86,2,58,49,57,129,35,0,83,143,78,249,238,5,129,25,+64,42,139,241,0,95,112,139,96,148,1,49,57,65,34,64,71,177,144,2,+95,49,57,79,185,0,57,164,100,0,73,96,6,2,58,49,57,241,52,2,+64,14,225,121,2,64,71,248,25,0,184,26,97,133,145,224,64,45,169,168,+90,146,236,221,11,12,83,121,115,116,101,109,47,73,79,47,77,68,53,140,+220,4,54,48,58,49,55,236,219,7,16,109,100,53,67,111,109,98,105,110,+101,58,32,101,109,112,116,121,144,172,64,189,69,90,69,28,161,195,65,122,+1,56,56,64,131,67,231,91,17,0,80,100,76,108,228,243,55,0,96,167,+64,57,248,205,2,128,80,97,25,65,244,153,175,97,156,65,51,97,170,217,+162,0,95,89,70,1,95,49,89,56,229,133,0,97,79,162,34,4,65,114,+114,97,121,65,174,130,53,2,66,32,95,67,109,68,159,2,49,48,57,160,+155,1,95,49,64,68,194,45,112,83,109,90,64,13,160,45,64,35,192,202,+160,46,162,81,224,46,0,130,86,98,249,224,51,1,78,209,128,146,130,161,+2,73,32,58,96,20,243,154,0,106,98,249,234,12,162,39,130,49,98,102,+244,109,6,230,214,0,251,91,7,143,163,113,28,118,24,238,7,2,234,174,+2,160,55,84,117,160,69,224,236,0,96,61,234,219,4,2,66,32,66,96,+95,148,11,250,98,8,226,185,0,96,58,225,64,0,224,43,11,242,138,1,+160,38,212,178,65,96,226,222,0,199,97,0,58,96,135,147,200,70,101,123,+64,193,252,129,246,0,35,98,6,80,68,0,58,97,152,5,10,65,32,35,+49,54,65,103,178,154,186,237,0,49,113,70,0,49,113,5,0,95,100,82,+0,49,84,36,154,224,96,88,186,224,224,11,0,70,45,160,11,88,135,192,+11,80,108,0,58,96,12,243,59,2,76,37,97,149,76,80,175,223,161,162,+131,249,236,110,1,168,139,224,29,0,188,142,162,11,98,65,70,32,64,7,+77,196,0,66,148,210,128,15,96,23,141,149,1,95,49,188,215,161,103,119,+174,96,137,76,130,224,19,3,196,16,96,95,131,106,64,136,132,112,121,144,+176,97,238,30,5,129,218,130,3,97,246,123,224,96,77,128,47,224,145,17,+180,67,65,56,100,170,188,3,231,45,5,96,27,224,21,1,136,125,96,127,+233,134,0,226,4,0,232,146,0,232,145,1,96,220,96,20,233,146,4,0,+58,96,132,160,44,64,13,199,168,224,37,7,0,54,193,191,128,2,106,23,+98,101,64,199,98,77,246,164,3,224,139,1,182,164,225,224,1,1,95,49,+85,242,86,117,66,62,224,27,11,128,136,238,190,6,160,77,128,238,125,28,+98,143,98,177,251,20,1,149,189,193,208,79,170,250,133,23,9,69,110,117,+109,95,67,108,97,115,115,133,197,4,53,56,58,52,49,229,197,7,3,73,+110,116,46,251,8,18,160,117,152,91,0,95,80,68,224,117,40,0,57,224,+117,14,250,251,12,1,73,32,144,212,1,95,49,124,196,128,239,131,46,249,+144,0,67,118,162,139,1,95,49,113,24,128,160,224,19,1,100,18,96,58,+64,7,0,54,250,228,13,96,70,128,64,160,51,1,64,58,100,20,250,8,+15,116,215,250,7,67,84,158,70,46,96,87,128,27,250,6,10,65,234,129,+145,247,209,1,161,139,224,243,0,250,6,0,96,163,250,5,9,96,222,224,+215,16,96,113,224,215,67,150,217,224,215,68,64,61,224,215,11,131,212,224,+45,0,90,221,64,43,250,220,33,185,80,166,208,227,87,1,230,159,0,192,+9,0,58,98,73,67,149,1,54,54,115,149,1,95,49,88,208,218,224,0,+35,119,2,64,58,0,58,98,142,192,40,224,36,9,0,58,98,154,9,10,+65,32,117,113,117,111,116,32,58,64,33,64,14,135,123,192,1,238,237,78,+0,58,68,82,132,91,155,16,103,63,104,40,69,197,123,13,102,216,64,41,+132,146,67,141,76,91,230,12,1,0,58,96,39,96,26,105,42,168,182,65,+74,96,230,123,42,66,75,163,102,96,20,64,137,251,4,40,1,51,57,251,+4,2,106,215,169,91,121,119,1,52,54,232,206,1,160,30,65,96,96,28,+129,183,250,247,7,236,152,2,162,48,130,17,64,156,251,180,6,130,37,67,+6,86,201,251,114,11,138,168,64,29,251,109,6,251,90,1,1,64,58,97,+76,161,69,122,50,0,54,78,144,88,94,161,74,184,164,89,130,64,17,0,+95,70,108,0,58,96,32,7,10,65,32,97,110,100,32,58,96,55,128,66,+121,85,160,33,130,100,0,75,64,31,130,79,0,80,64,10,130,75,96,21,+129,232,0,65,64,10,234,244,0,80,53,0,49,119,55,1,95,49,86,221,+0,58,65,140,64,27,74,144,182,238,2,95,50,57,97,76,78,179,1,95,+49,79,111,64,6,66,203,192,56,73,16,192,11,64,206,151,136,96,6,128,+102,0,49,67,198,200,176,1,95,49,123,244,0,58,64,43,64,31,103,189,+128,16,128,216,64,40,162,31,86,70,132,130,0,80,232,79,3,96,64,224,+15,8,64,65,231,154,0,0,51,64,204,182,183,105,75,65,219,207,255,69,+228,118,189,85,96,192,68,85,148,224,21,3,128,171,96,21,64,98,130,180,+122,163,64,14,131,186,182,230,2,95,51,55,65,47,129,97,0,90,64,190,+0,58,96,39,161,122,182,89,65,83,245,249,0,0,73,64,35,181,223,79,+85,100,114,110,18,96,4,224,14,6,192,184,133,13,130,87,0,51,80,215,+96,202,0,58,96,6,207,158,240,235,6,74,197,144,219,240,241,8,224,26,+2,0,58,96,91,96,153,104,177,182,51,96,80,67,4,1,95,49,82,194,+0,58,96,46,175,238,96,17,239,226,0,99,59,64,46,196,100,97,112,0,+64,98,56,3,52,32,64,75,64,107,123,200,64,0,96,33,131,79,0,85,+224,23,2,204,207,172,133,96,8,164,189,1,95,49,82,126,96,194,108,128,+224,8,3,111,49,0,58,64,206,129,236,229,215,1,192,9,128,44,128,137,+64,12,98,233,242,229,0,224,16,0,129,166,65,177,178,213,0,75,97,217,+1,64,58,65,55,128,43,105,178,178,153,3,95,49,50,53,64,43,129,56,+67,110,178,153,112,228,0,75,160,183,1,49,56,228,221,2,23,78,111,110,+45,101,120,104,97,117,115,116,105,118,101,32,112,97,116,116,101,114,110,115,+32,132,212,96,44,128,219,97,199,160,173,68,181,96,11,0,58,96,6,163,+82,112,178,0,49,82,159,0,58,113,60,96,22,193,118,64,32,3,48,56,+32,35,111,24,160,10,235,165,0,193,81,224,32,0,142,211,70,242,193,122,+71,222,204,28,0,80,64,103,224,65,2,224,64,5,163,122,128,58,96,0,+0,58,96,154,231,134,0,128,163,129,55,230,65,2,166,7,0,58,96,29,+202,255,1,64,58,96,24,129,66,67,82,179,96,135,191,64,98,0,80,128,+6,199,196,0,58,64,38,128,250,230,216,0,0,58,114,98,99,149,0,48,+80,211,0,51,225,127,2,17,67,111,110,116,114,111,108,46,69,120,99,101,+112,116,105,111,110,46,70,100,3,114,110,97,108,234,145,5,0,80,129,152,+7,77,97,116,99,104,70,97,105,96,29,64,88,129,223,69,67,179,165,129,+55,2,115,101,113,65,55,1,83,32,96,8,103,93,0,58,103,36,162,23,+179,126,193,57,128,1,231,210,80,179,224,141,42,236,218,2,179,235,64,48,+0,95,100,214,64,56,241,50,1,71,158,77,59,235,204,12,15,70,111,114,+101,105,103,110,47,77,97,114,115,104,97,108,47,113,63,135,148,3,50,51,+58,52,254,234,8,5,109,97,108,108,111,99,96,37,167,176,0,58,81,88,+64,127,2,79,32,58,97,189,65,161,1,56,57,67,99,98,132,192,7,1,+95,57,68,155,114,27,1,95,57,68,193,128,10,1,49,48,68,65,192,11,+72,54,192,11,102,150,84,134,0,58,96,18,81,224,6,112,111,107,101,87,+111,114,71,44,180,159,4,94,112,101,101,107,192,18,181,124,199,208,84,115,+64,66,0,49,96,66,247,238,0,246,251,2,96,34,224,50,2,116,68,224,+49,0,225,220,1,0,95,84,53,67,124,70,135,1,95,49,116,154,0,58,+96,38,6,10,65,32,116,111,73,110,73,223,180,148,6,116,111,80,116,114,+32,58,180,103,237,254,5,180,92,234,245,1,137,84,136,151,64,8,0,95,+84,82,163,161,0,95,71,71,0,64,97,186,109,49,0,58,180,130,239,85,+5,212,131,64,73,92,148,83,11,129,255,103,12,161,250,1,57,52,225,249,+16,6,83,116,111,114,97,98,108,169,137,4,50,53,58,55,50,129,244,96,+93,220,98,104,81,0,51,107,181,1,95,57,227,121,3,77,217,4,102,105,+110,101,100,131,74,180,164,2,80,32,58,180,128,248,64,2,179,166,81,140,+113,191,81,201,0,58,179,168,139,35,179,53,227,36,1,227,40,2,227,79,+72,243,151,2,97,57,82,121,0,95,64,146,178,152,101,113,237,42,2,108,+117,113,62,64,75,96,17,97,181,244,65,2,138,111,0,95,114,56,69,239,+82,159,0,58,178,209,85,16,0,83,112,118,136,8,211,227,2,83,32,95,+148,205,102,218,113,117,243,107,4,133,78,178,233,68,135,0,58,178,232,231,+6,1,64,73,133,217,128,83,73,64,243,111,0,150,77,167,53,244,7,1,+165,215,193,46,224,196,3,2,64,95,56,141,45,105,94,224,147,12,160,148,+195,83,228,142,1,0,58,241,250,1,127,2,64,17,241,8,3,96,16,202,+166,66,227,247,10,0,228,175,57,2,57,58,52,162,186,224,53,1,100,174,+0,97,228,175,4,242,92,0,242,33,5,178,94,2,95,52,52,163,230,66,+236,99,69,0,95,74,240,0,83,140,56,245,111,0,108,61,65,91,83,125,+224,184,0,128,1,123,241,224,37,1,224,33,0,129,61,142,34,101,18,82,+172,0,58,178,191,0,66,110,72,1,64,95,82,168,0,58,242,197,0,129,+131,66,121,1,54,55,173,5,0,80,96,7,98,74,226,73,0,78,168,65,+55,80,216,108,56,128,0,0,58,178,245,1,95,55,195,114,68,217,178,231,+0,89,162,62,246,78,3,237,23,1,194,46,207,50,76,146,128,191,239,63,+5,97,2,238,248,0,66,21,179,48,4,105,110,118,32,58,179,32,4,115,+104,114,32,58,179,16,90,69,179,5,0,97,128,23,129,143,4,115,104,108,+32,58,177,152,2,43,32,58,176,202,2,45,32,58,175,252,2,73,32,58,+175,153,231,0,7,175,135,130,114,100,105,175,121,123,106,77,53,0,95,77,+69,112,176,0,95,77,113,112,59,110,178,123,100,151,63,91,99,96,9,0,+58,175,168,138,250,99,149,241,13,0,87,179,96,242,69,143,175,98,224,29,+1,224,49,1,224,39,5,231,183,0,195,18,175,87,91,194,174,55,2,62,+32,58,174,33,91,190,64,164,64,10,1,32,58,174,19,155,187,174,11,107,+188,110,238,78,6,0,58,174,22,75,186,174,22,65,98,174,22,2,80,32,+58,238,21,0,224,1,3,229,84,79,174,102,245,67,5,174,112,4,110,101,+103,32,58,174,60,2,42,32,58,174,38,2,45,32,58,174,31,2,43,32,+58,173,231,224,148,68,0,58,174,45,199,138,64,17,231,246,2,156,7,142,+36,101,206,64,33,160,25,252,62,8,174,10,64,52,81,66,77,231,0,58,+174,16,6,94,102,114,101,101,32,58,174,19,188,95,73,145,81,83,109,224,+0,66,124,100,96,52,1,64,58,174,48,110,97,174,46,2,73,32,58,173,+239,64,54,96,149,80,2,173,192,64,29,129,29,64,9,128,210,0,94,137,+142,1,32,58,173,178,13,73,79,46,112,101,114,102,111,114,109,73,79,32,+58,173,56,225,14,2,0,58,237,27,0,0,58,173,20,225,54,14,0,58,+173,40,129,5,103,245,158,196,237,47,1,104,127,0,58,173,50,6,114,97,+105,115,101,32,58,173,50,7,65,46,114,101,97,100,32,58,173,54,13,73,+79,46,103,101,116,65,114,103,82,101,102,32,58,172,234,0,95,126,221,65,+94,93,236,98,204,64,95,224,199,0,0,62,94,210,168,48,106,33,128,33,+1,95,49,95,10,137,216,0,55,128,65,92,39,192,9,0,50,90,210,64,+9,0,58,172,147,185,175,111,253,175,232,155,34,96,35,129,3,128,35,96,+32,112,38,192,32,72,12,91,202,128,132,76,182,128,253,224,47,7,126,71,+96,155,65,40,0,58,172,185,80,21,129,14,70,105,130,119,172,103,175,139,+226,150,3,100,120,172,89,233,203,0,69,230,224,11,2,96,197,101,117,0,+58,172,120,96,59,127,79,172,27,1,95,51,97,196,98,195,130,110,73,175,+129,62,74,177,96,36,64,180,102,105,168,239,207,19,0,58,225,220,1,1,+64,58,194,136,0,58,162,125,9,79,46,114,101,116,117,114,110,32,58,225,+212,0,0,62,68,191,233,239,0,128,187,195,148,227,165,39,0,58,237,73,+3,226,142,9,236,249,1,130,118,64,200,2,95,50,55,143,86,224,0,255,+224,0,255,224,0,255,224,0,255,224,0,255,224,0,255,224,0,255,224,0,+255,224,0,255,224,0,255,224,0,67,1,32,125,+};+const unsigned char *combexpr = data;+const int combexprlen = 156453;+static const struct ffi_entry imp_table[] = {+{ 0,0 }+};+const struct ffi_entry *xffi_table = imp_table;+static struct ffe_entry exp_table[] = {+  { 0,0 }+};+struct ffe_entry *xffe_table = exp_table;++
+ ghc/Data/Float.hs view
@@ -0,0 +1,1 @@+module Data.Float(Float) where
ghc/MHSPrelude.hs view
@@ -1,17 +1,21 @@ {-# OPTIONS_GHC -Wno-orphans #-} {-# LANGUAGE CPP #-}-module MHSPrelude(module Prelude, module Control.DeepSeq, module Control.Arrow, module MHSPrelude, Type) where+module MHSPrelude(module Prelude, module Control.DeepSeq, module Control.Arrow, module MHSPrelude, Type, Int64, HasCallStack) where import Prelude import Control.Arrow(first, second) import Control.DeepSeq import Control.Exception+import Data.Int import Data.Maybe import Data.List import Data.Text(Text, append, pack)+import GHC.Stack import GHC.Types import System.Environment import System.IO +#include "MachDeps.h"+ ------- Text --------  -- base-4.19.2.0 seems to lack this???@@ -51,11 +55,15 @@  ------- Read -------- -usingMhs :: Bool-usingMhs = False+mhsError :: HasCallStack => String -> a+mhsError = error+           -- errorWithoutStackTrace +_usingMhs :: Bool+_usingMhs = False+ _wordSize :: Int-_wordSize = 64+_wordSize = WORD_SIZE_IN_BITS  _isWindows :: Bool _isWindows = False
+ ghc/MhsEval.hs view
@@ -0,0 +1,115 @@+{-# LANGUAGE ForeignFunctionInterface #-}+module MhsEval (+    MhsContext,+    withMhsContext,+    createMhsContext,+    closeMhsContext,+    eval,+    run,+    MhsError(..),+    compiledWithGhc+) where++import Foreign+import Foreign.C.String+import Foreign.C.Types+import Control.Exception+import Control.Monad (unless)++-- | Opaque context type+newtype MhsContext = MhsContext (Ptr ())++-- | Custom error type for MicroHs evaluation+data MhsError = +    MhsInitError String+  | MhsEvalError String+  deriving (Show)++instance Exception MhsError++-- | This type represents the object code generated by the MicroHs compiler as typically written to out.comb.+type MhsCombCode = String++compiledWithGhc :: Bool+compiledWithGhc = True++-- Foreign imports for functions in mhseval.h+foreign import ccall "mhs_init_context"+  c_mhs_init_context :: IO (Ptr ())++foreign import ccall "mhs_free_context"+  c_mhs_free_context :: Ptr () -> IO ()++foreign import ccall "mhs_eval_string"+  c_mhs_eval_string :: Ptr () -> CString -> CSize -> Ptr CString -> Ptr CSize -> IO CInt++foreign import ccall "mhs_run_string"+  c_mhs_run_string :: Ptr () -> CString -> CSize -> IO CInt++foreign import ccall "mhs_free_result"+  c_mhs_free_result :: CString -> IO ()++foreign import ccall "mhs_get_error"+  c_mhs_get_error :: Ptr () -> IO CString++-- |  Initializes a MicroHs context+-- This function allocates resources needed for evaluation.+-- It should be called once before any evaluation and cleaned up with 'closeMhsContext'.+createMhsContext :: IO MhsContext+createMhsContext = do+  ctx_ptr <- c_mhs_init_context+  if ctx_ptr == nullPtr+      then throwIO $ MhsInitError "Failed to initialize MicroHs context"+      else return (MhsContext ctx_ptr)++-- | Cleans up the MicroHs context+-- This function releases resources allocated by 'createMhsContext'.+-- It should be called after all evaluations are done.+closeMhsContext :: MhsContext -> IO ()+closeMhsContext (MhsContext ctx_ptr) = do+  unless (ctx_ptr == nullPtr) $ do+      c_mhs_free_context ctx_ptr        ++-- | Runs an action with a MicroHs context+-- This function initializes a context, runs the action, and cleans up afterwards.+-- It is useful for one-off evaluations without needing to manage the context manually.+withMhsContext :: (MhsContext -> IO a) -> IO a+withMhsContext action = do+  ctx_ptr <- c_mhs_init_context+  if ctx_ptr == nullPtr+    then throwIO $ MhsInitError "Failed to initialize MicroHs context"+    else action (MhsContext ctx_ptr) `finally` c_mhs_free_context ctx_ptr++-- | Evaluates a MicroHs combinator code program from a string+-- This function takes a string containing MicroHs combinator code, evaluates it, and returns the result as a string.+-- If evaluation fails, it throws an 'MhsEvalError'.+eval :: MhsContext -> MhsCombCode -> IO String+eval (MhsContext ctx) expr = do+  withCStringLen expr $ \(expr_ptr, expr_len) -> do+    alloca $ \result_ptr -> do+      alloca $ \result_len_ptr -> do+        ret <- c_mhs_eval_string ctx expr_ptr (fromIntegral expr_len) result_ptr result_len_ptr+        if ret == 0+          then do+            result_cstr <- peek result_ptr+            result_len <- peek result_len_ptr+            result <- peekCStringLen (result_cstr, fromIntegral result_len)+            c_mhs_free_result result_cstr+            return result+          else do+            err_ptr <- c_mhs_get_error ctx+            err_msg <- peekCString err_ptr+            throwIO $ MhsEvalError err_msg++-- | Runs a MicroHs combinator code program from a string+-- This function takes a string containing MicroHs combinator code, and runs it.+run :: MhsContext -> MhsCombCode -> IO ()+run (MhsContext ctx) expr = do+  withCStringLen expr $ \(expr_ptr, expr_len) -> do+    ret <- c_mhs_run_string ctx expr_ptr (fromIntegral expr_len)+    if ret == 0+      then return ()+      else do+        err_ptr <- c_mhs_get_error ctx+        err_msg <- peekCString err_ptr+        throwIO $ MhsEvalError err_msg
ghc/PrimTable.hs view
@@ -2,8 +2,9 @@ import Control.Exception import Data.Bits import Data.Char+import Data.Int import Data.Maybe-import Data.Word()+import Data.Word import System.IO import System.IO.TimeMilli import Unsafe.Coerce@@ -83,14 +84,43 @@   , comb "icmp" (\ x y -> fromOrdering (compare (x::Int) y))   , comb "ucmp" (\ x y -> fromOrdering (compare (x::Word) y)) -  , comb "scmp" (\ x y -> fromOrdering (compare (toString x) (toString y)))-  , comb "sequal" (\ x y -> fromBool (toString x == toString y))+  , arithI "I+" (+)+  , arithI "I-" (-)+  , arithI "I*" (*)+  , arithI "Iquot" quot+  , arithI "Irem" rem+  , arithI "Isubtract" subtract+  , arithuI "Ineg" negate+  , arithuI "Iinv" complement+  , arithwI "Iuquot" quot+  , arithwI "Iurem" rem+  , arithwI "Iand" (.&.)+  , arithwI "Ior" (.|.)+  , arithwI "Ixor" xor+  , arithwiI "Ishl" shiftL+  , arithwiI "Ishr" shiftR+  , arithwiI "Iashr" shiftR+  , arithuiI "Ipopcount" popCount+  , arithuiI "Iclz" countLeadingZeros+  , arithuiI "Ictz" countTrailingZeros+  , cmpI "I==" (==)+  , cmpI "I/=" (/=)+  , cmpI "I<"  (<)+  , cmpI "I<=" (<=)+  , cmpI "I>"  (>)+  , cmpI "I>=" (>=)+  , cmpwI "Iu<"  (<)+  , cmpwI "Iu<=" (<=)+  , cmpwI "Iu>"  (>)+  , cmpwI "Iu>=" (>=)+  , comb "Iicmp" (\ x y -> fromOrdering (compare (x::Int64) y))+  , comb "Iucmp" (\ x y -> fromOrdering (compare (x::Word64) y)) -  , comb "p==" (\ x y -> fromBool ((x :: Ptr ()) == y))-  , comb "pnull" nullPtr-  , comb "pcast" castPtr-  , comb "p+" plusPtr-  , comb "p-" minusPtr+  , comb "itoI" (\ x -> fromIntegral (x::Int) :: Int64)+  , comb "Itoi" (\ x -> fromIntegral (x::Int64) :: Int)+  , comb "utoU" (\ x -> fromIntegral (x::Word) :: Word64)+  , comb "Utou" (\ x -> fromIntegral (x::Word64) :: Word)+   , comb "fp2p" unsafeForeignPtrToPtr    , comb "A.alloc" newIOArray@@ -110,23 +140,31 @@   , fcmp "f<=" (<=)   , fcmp "f>" (>)   , fcmp "f>=" (>=)-  , comb "fshow" (fromString . (show :: Double -> String))-  , comb "fread" ((read :: String -> Double) . toString)-  , comb "itof" (fromIntegral :: Int -> Double)+  , comb "itof" (fromIntegral :: Int -> Float) +  , darith "d+" (+)+  , darith "d-" (-)+  , darith "d*" (*)+  , darith "d/" (/)+  , darithu "dneg" negate+  , dcmp "d==" (==)+  , dcmp "d/=" (/=)+  , dcmp "d<" (<)+  , dcmp "d<=" (<=)+  , dcmp "d>" (>)+  , dcmp "d>=" (>=)+  , comb "itod" (fromIntegral :: Int -> Double)+   , comb "seq" seq   , comb "rnf" rnf-  , comb "error" err   , comb "ord" ord   , comb "chr" chr    , comb "IO.performIO" unsafePerformIO-  , comb "IO.catch" (\ io hdl -> catch (io :: IO Any) (\ (exn :: SomeException) -> hdl (fromString $ takeWhile (/= '\n') $ show exn) :: IO Any))   , comb "IO.>>=" iobind   , comb "IO.>>" iothen   , comb "IO.return" ioret   , comb "IO.print" ioprint-  , comb "IO.performio" unsafePerformIO   , comb "IO.serialize" ioserialize   , comb "IO.deserialize" iodeserialize   , comb "newCAStringLen" (fmap fromPair . newCAStringLen . toString)@@ -141,6 +179,7 @@     comb0 n f = (n, unsafeCoerce f)     comb n f = (n, unsafeCoerce f) --    comb n f = (n, unsafeCoerce (\ x -> trace (seq x n) (f x)))+     arith :: String -> (Int -> Int -> Int) -> (String, Any)     arith = comb     arithw :: String -> (Word -> Word -> Word) -> (String, Any)@@ -149,19 +188,43 @@     arithwi = comb     arithu :: String -> (Int -> Int) -> (String, Any)     arithu = comb-    farith :: String -> (Double -> Double -> Double) -> (String, Any)++    arithI :: String -> (Int64 -> Int64 -> Int64) -> (String, Any)+    arithI = comb+    arithwI :: String -> (Word64 -> Word64 -> Word64) -> (String, Any)+    arithwI = comb+    arithwiI :: String -> (Word64 -> Int -> Word64) -> (String, Any)+    arithwiI = comb+    arithuI :: String -> (Int64 -> Int64) -> (String, Any)+    arithuI = comb+    arithuiI :: String -> (Int64 -> Int) -> (String, Any)+    arithuiI = comb++    farith :: String -> (Float -> Float -> Float) -> (String, Any)     farith = comb-    farithu :: String -> (Double -> Double) -> (String, Any)+    farithu :: String -> (Float -> Float) -> (String, Any)     farithu = comb++    darith :: String -> (Double -> Double -> Double) -> (String, Any)+    darith = comb+    darithu :: String -> (Double -> Double) -> (String, Any)+    darithu = comb+     cmp :: String -> (Int -> Int -> Bool) -> (String, Any)     cmp n f = comb n (\ x y -> fromBool (f x y))     cmpw :: String -> (Word -> Word -> Bool) -> (String, Any)     cmpw n f = comb n (\ x y -> fromBool (f x y))-    fcmp :: String -> (Double -> Double -> Bool) -> (String, Any)-    fcmp n f = comb n (\ x y -> fromBool (f x y)) -    err s = error $ "error: " ++ toString s+    cmpI :: String -> (Int64 -> Int64 -> Bool) -> (String, Any)+    cmpI n f = comb n (\ x y -> fromBool (f x y))+    cmpwI :: String -> (Word64 -> Word64 -> Bool) -> (String, Any)+    cmpwI n f = comb n (\ x y -> fromBool (f x y)) +    fcmp :: String -> (Float -> Float -> Bool) -> (String, Any)+    fcmp n f = comb n (\ x y -> fromBool (f x y))+    dcmp :: String -> (Double -> Double -> Bool) -> (String, Any)+    dcmp n f = comb n (\ x y -> fromBool (f x y))+     iobind :: IO a -> (a -> IO b) -> IO b     iobind = (>>=)     iothen :: IO a -> IO b -> IO b@@ -242,30 +305,52 @@   , comb "add_FILE" add_FILE   , comb "add_utf8" add_utf8   , comb "free"  free-  , comb "exp"   (fio exp)-  , comb "log"   (fio log)-  , comb "sqrt"   (fio sqrt)-  , comb "sin"   (fio sin)-  , comb "cos"   (fio cos)-  , comb "tan"   (fio tan)-  , comb "asin"   (fio asin)-  , comb "acos"   (fio acos)-  , comb "atan"   (fio atan)-  , comb "sinh"   (fio sinh)-  , comb "cosh"   (fio cosh)-  , comb "tanh"   (fio tanh)-  , comb "asinh"   (fio asinh)-  , comb "acosh"   (fio acosh)-  , comb "atanh"   (fio atanh)-  , comb "atan2"   (fio2 atan2)+  , comb "exp"   (dio exp)+  , comb "log"   (dio log)+  , comb "sqrt"   (dio sqrt)+  , comb "sin"   (dio sin)+  , comb "cos"   (dio cos)+  , comb "tan"   (dio tan)+  , comb "asin"   (dio asin)+  , comb "acos"   (dio acos)+  , comb "atan"   (dio atan)+  , comb "sinh"   (dio sinh)+  , comb "cosh"   (dio cosh)+  , comb "tanh"   (dio tanh)+  , comb "asinh"   (dio asinh)+  , comb "acosh"   (dio acosh)+  , comb "atanh"   (dio atanh)+  , comb "atan2"   (dio2 atan2)+  , comb "expf"   (fio exp)+  , comb "logf"   (fio log)+  , comb "sqrtf"   (fio sqrt)+  , comb "sinf"   (fio sin)+  , comb "cosf"   (fio cos)+  , comb "tanf"   (fio tan)+  , comb "asinf"   (fio asin)+  , comb "acosf"   (fio acos)+  , comb "atanf"   (fio atan)+  , comb "sinhf"   (fio sinh)+  , comb "coshf"   (fio cosh)+  , comb "tanhf"   (fio tanh)+  , comb "asinhf"   (fio asinh)+  , comb "acoshf"   (fio acosh)+  , comb "atanhf"   (fio atanh)+  , comb "atan2f"   (fio2 atan2)   ]   where     comb n f = (n, unsafeCoerce f) -    fio :: (Double -> Double) -> (Double -> IO Double)+    dio :: (Double -> Double) -> (Double -> IO Double)+    dio f = return . f++    dio2 :: (Double -> Double -> Double) -> (Double -> Double -> IO Double)+    dio2 f x y = return (f x y)++    fio :: (Float -> Float) -> (Float -> IO Float)     fio f = return . f -    fio2 :: (Double -> Double -> Double) -> (Double -> Double -> IO Double)+    fio2 :: (Float -> Float -> Float) -> (Float -> Float -> IO Float)     fio2 f x y = return (f x y)      add_FILE :: Handle -> IO Handle
ghc/System/IO/Serialize.hs view
@@ -1,26 +1,14 @@ -- Copyright 2024 Lennart Augustsson -- See LICENSE file for full license. module System.IO.Serialize(-{-   hSerialize, hDeserialize,   writeSerialized,--}-  writeSerialized,   writeSerializedCompressed,   readSerialized,   ) where---import System.IO+import System.IO import GHC.Stack -{--hSerialize   :: forall a . Handle -> a -> IO ()-hSerialize = errghc-hDeserialize :: forall a . Handle -> IO a-hDeserialize = errghc-writeSerialized :: forall a . FilePath -> a -> IO ()-writeSerialized = errghc--}- writeSerializedCompressed :: forall a . HasCallStack => FilePath -> a -> IO () writeSerializedCompressed = errghc @@ -29,6 +17,12 @@  readSerialized :: forall a . HasCallStack => FilePath -> IO a readSerialized = errghc++hSerialize   :: forall a . Handle -> a -> IO ()+hSerialize = errghc++hDeserialize :: forall a . Handle -> IO a+hDeserialize = errghc  errghc :: HasCallStack => a errghc = error "System.IO.System: serialization not available with ghc"
+ ghc/System/IO/StringHandle.hs view
@@ -0,0 +1,8 @@+module System.IO.StringHandle(handleWriteToString, stringToHandle) where+import System.IO++handleWriteToString :: (Handle -> IO ()) -> IO String+handleWriteToString = error "ghc: no handleWriteToString"++stringToHandle :: String -> IO Handle+stringToHandle = error "ghc: stringToHandle"
+ ghc/System/IO/Transducers.hs view
@@ -0,0 +1,8 @@+module System.IO.Transducers(addLZ77, addBase64) where+import System.IO++addLZ77 :: Handle -> IO Handle+addLZ77 _ = error "ghc compiled, cannot compress"++addBase64 :: Handle -> IO Handle+addBase64 _ = error "ghc compiled, cannot base64"
hugs/MHSPrelude.hs view
@@ -152,9 +152,12 @@  ------- Read -------- -usingMhs :: Bool-usingMhs = False+mhsError :: String -> a+mhsError = error +_usingMhs :: Bool+_usingMhs = False+ _wordSize :: Int _wordSize = 32         -- Hugs has 32 bit Int @@ -223,3 +226,6 @@ instance NFData (a -> b) instance NFData Version instance NFData MD5CheckSum++class HasCallStack+instance HasCallStack
+ hugs/MhsEval.hs view
@@ -0,0 +1,21 @@+module MhsEval (+    MhsContext,+    withMhsContext,+    run,+    compiledWithGhc+) where++compiledWithGhc :: Bool+compiledWithGhc = False++data MhsContext+type MhsCombCode = String++withMhsContext :: (MhsContext -> IO a) -> IO a+withMhsContext = err++run :: MhsContext -> MhsCombCode -> IO ()+run = err++err :: a+err = error "only supported with GHC"
hugs/PrimTable.hs view
@@ -77,15 +77,6 @@   , cmpw "u>=" (>=)   , comb "icmp" (\ x y -> fromOrdering (compare (x::Int) y)) -  , comb "scmp" (\ x y -> fromOrdering (compare (toString x) (toString y)))-  , comb "sequal" (\ x y -> fromBool (toString x == toString y))--  , comb "p==" (\ x y -> fromBool ((x :: Ptr ()) == y))-  , comb "pnull" nullPtr-  , comb "pcast" castPtr-  , comb "p+" plusPtr-  , comb "p-" minusPtr-   , farith "f+" (+)   , farith "f-" (-)   , farith "f*" (*)@@ -97,23 +88,18 @@   , fcmp "f<=" (<=)   , fcmp "f>" (>)   , fcmp "f>=" (>=)-  , comb "fshow" (fromString . (show :: Double -> String))-  , comb "fread" ((read :: String -> Double) . toString)   , comb "itof" (fromIntegral :: Int -> Double)    , comb "seq" seq   , comb "rnf" rnf-  , comb "error" err   , comb "ord" ord   , comb "chr" chr    , comb "IO.performIO" unsafePerformIO-  , comb "IO.catch" (\ io hdl -> Control.Exception.catch (io :: IO Any) (\ (exn :: Exception) -> hdl (fromString $ takeWhile (/= '\n') $ show exn) :: IO Any))   , comb "IO.>>=" iobind   , comb "IO.>>" iothen   , comb "IO.return" ioret   , comb "IO.print" ioprint-  , comb "IO.performio" unsafePerformIO   , comb "IO.serialize" ioserialize   , comb "IO.deserialize" iodeserialize   , comb "newCAStringLen" (fmap fromPair . newCAStringLen . toString)@@ -146,8 +132,6 @@     cmpw n f = comb n (\ x y -> fromBool (f x y))     fcmp :: String -> (Double -> Double -> Bool) -> (String, Any)     fcmp n f = comb n (\ x y -> fromBool (f x y))--    err s = error $ "error: " ++ toString s      iobind :: IO a -> (a -> IO b) -> IO b     iobind = (>>=)
+ hugs/System/FilePath.hs view
@@ -0,0 +1,122 @@+-- A few function copied from the filepath package+module System.FilePath(+    FilePath,+--    splitSearchPath,+    pathSeparator,+--    takeExtension,+    dropExtension,+    (<.>),+    splitFileName,+    takeDirectory,+    (</>),+  ) where+import qualified Prelude(); import MHSPrelude+import Data.List++infixr 7 <.>+infixr 5 </>++(</>) :: FilePath -> FilePath -> FilePath+(</>) = combine++{-+hasLeadingPathSeparator :: FilePath -> Bool+hasLeadingPathSeparator ('/':_) = True+hasLeadingPathSeparator _ = False++hasTrailingPathSeparator :: FilePath -> Bool+hasTrailingPathSeparator = hasLeadingPathSeparator . reverse+-}++joinPath :: [FilePath] -> FilePath+joinPath = foldr combine ""++combine :: FilePath -> FilePath -> FilePath+combine a b {-x | hasLeadingPathSeparator b = b+            | otherwise -} = combineAlways a b++combineAlways :: FilePath -> FilePath -> FilePath+combineAlways a b {-x | null a = b+                  | null b = a+                  | hasTrailingPathSeparator a = a ++ b+                  | otherwise -} = a ++ pathSeparator : b++pathSeparator :: Char+pathSeparator = '/'++isPathSeparator :: Char -> Bool+isPathSeparator = (pathSeparator ==)++---------+{-+splitSearchPath :: String -> [FilePath]+splitSearchPath = f+  where+    f xs = case break (':' ==) xs of+             (pre, []    ) -> g pre+             (pre, _:post) -> g pre ++ f post++    g "" = ["."]+    g x = [x]+-}+---------++splitFileName :: FilePath -> (String, String)+splitFileName x = (if null dir then "./" else dir, name)+    where+        (dir, name) = splitFileName_ x++splitFileName_ :: FilePath -> (String, String)+splitFileName_ = breakEnd isPathSeparator++dropFileName :: FilePath -> FilePath+dropFileName = fst . splitFileName++{-+replaceBaseName :: FilePath -> String -> FilePath+replaceBaseName pth nam = combineAlways a (nam <.> ext)+    where+        (a,b) = splitFileName_ pth+        ext = takeExtension b+-}++takeDirectory :: FilePath -> FilePath+takeDirectory = dropTrailingPathSeparator . dropFileName++dropTrailingPathSeparator :: FilePath -> FilePath+dropTrailingPathSeparator = dropWhileEnd isPathSeparator++---------++extSeparator :: Char+extSeparator = '.'++isExtSeparator :: Char -> Bool+isExtSeparator = (extSeparator ==)++{-+splitExtension :: FilePath -> (String, String)+splitExtension x = case nameDot of+                       "" -> (x,"")+                       _  -> (dir ++ init nameDot, extSeparator : ext)+    where+        (dir, file) = splitFileName_ x+        (nameDot, ext) = breakEnd isExtSeparator file++takeExtension :: FilePath -> String+takeExtension = snd . splitExtension+-}++dropExtension :: FilePath -> FilePath+--dropExtension = fst . splitExtension+dropExtension = reverse . drop 1 . dropWhile (not . isExtSeparator) . reverse++(<.>) :: FilePath -> String -> FilePath+(<.>) = addExtension++addExtension :: FilePath -> String -> FilePath+addExtension file "" = file+addExtension file xs@(x:_) = res+    where+        res = if isExtSeparator x then file ++ xs+              else file ++ extSeparator : xs
+ hugs/System/IO/Transducers.hs view
@@ -0,0 +1,9 @@+module System.IO.Transducers(addLZ77, addBase64) where+import System.IO++addLZ77 :: Handle -> IO Handle+addLZ77 _ = error "hugs compiled, cannot compress"+++addBase64 :: Handle -> IO Handle+addBase64 _ = error "hugs compiled, cannot base64"
lib/AllOfLib.hs view
@@ -23,24 +23,31 @@ import Data.Bool import Data.Bool_Type import Data.Bifoldable+import Data.Bifoldable1 import Data.Bifunctor import Data.Bitraversable import Data.Bounded import Data.ByteString+import Data.ByteString.Builder+import Data.ByteString.Builder.Extra import Data.ByteString.Char8+import Data.ByteString.Lazy import Data.ByteString.Lazy.Char8+import Data.ByteString.Lazy.Internal+import Data.ByteString.Short.Internal import Data.Char import Data.Char_Type import Data.Char.Unicode import Data.Coerce import Data.Complex import Data.Constraint+import Data.Double import Data.Dynamic import Data.Either import Data.Enum import Data.Eq import Data.Fixed-import Data.FloatW+import Data.Float import Data.Floating import Data.Foldable import Data.Foldable1@@ -55,11 +62,14 @@ import Data.Functor.Product import Data.Functor.Sum import Data.Hashable-import Data.IOArray+import Data.Hashable.Class+import Data.Hashable.Lifted import Data.IORef import Data.Int-import Data.Int.IntN-import Data.Int.Instances+import Data.Int.Int8+import Data.Int.Int16+import Data.Int.Int32+import Data.Int.Int64 import Data.Integer import Data.Integer_Type import Data.Integral@@ -93,11 +103,18 @@ import Data.Traversable import Data.Tuple import Data.Tuple.Instances+import Data.Type.Coercion+import Data.Type.Equality import Data.Typeable import Data.TypeLits+import Data.Unique import Data.Version import Data.Void import Data.Word+import Data.Word.Word8+import Data.Word.Word16+import Data.Word.Word32+import Data.Word.Word64 import Data.ZipList import Debug.Trace import Foreign@@ -106,18 +123,26 @@ import Foreign.C.String import Foreign.C.Types import Foreign.ForeignPtr+import Foreign.ForeignPtr_Type import Foreign.Marshal import Foreign.Marshal.Alloc import Foreign.Marshal.Array import Foreign.Marshal.Error import Foreign.Marshal.Utils import Foreign.Ptr+import Foreign.StablePtr import Foreign.Storable-import GHC.Stack-import GHC.Types+import GHC.Generics+import Math.NumberTheory.Logarithms import Numeric import Numeric.FormatFloat import Numeric.Natural+import Mhs.Arr+import Mhs.Array+import Mhs.Builtin+import Mhs.MutArr+import Mhs.MutUArr+import Mhs.UArr import Prelude import Primitives import System.Compress@@ -127,6 +152,7 @@ import System.Environment import System.Exit import System.IO+import System.IO.Base import System.IO_Handle import System.IO.Error import System.IO.MD5@@ -135,7 +161,12 @@ import System.IO.StringHandle import System.IO.TimeMilli import System.Info+import System.Mem+import System.Mem.Weak+import System.Posix.Types import System.Process+import System.RTS+import System.Timeout import Text.Printf import Text.Read import Text.Show
lib/Control/Applicative.hs view
@@ -5,15 +5,22 @@   Alternative(..),   guard, asum, optional,   module Data.Functor.Const_Type,+  ZipList(..),+  WrappedMonad(..),+  WrappedArrow(..),   ) where import qualified Prelude()              -- do not import Prelude-import Primitives  -- for fixity+import Primitives+import {-# SOURCE #-} Control.WrappedMonad import Data.Bool_Type import Data.Functor import Data.Function import Data.List_Type import Data.Maybe_Type import Data.Functor.Const_Type+import {-# SOURCE #-} Data.Typeable+import {-# SOURCE #-} Data.ZipList+--import Mhs.Builtin  infixl 4 <*>, *>, <*, <**> 
lib/Control/Category.hs view
@@ -2,6 +2,7 @@ import qualified Prelude() import Primitives import qualified Data.Function as F+import {-# SOURCE #-} Data.Typeable  infixr 9 . infixr 1 >>>, <<<
lib/Control/Concurrent.hs view
@@ -16,8 +16,8 @@   module Control.Concurrent.QSem,   module Control.Concurrent.QSemN, -{-   forkOn, forkOnWithUnmask, getNumCapabilities, setNumCapabilities, threadCapability,+{-   threadWaitRead, threadWaitWrite,   threadWaitReadSTM, threadWaitWriteSTM,   rtsSupportsBoundThreads,@@ -34,7 +34,9 @@ import Control.Concurrent.QSemN import Control.Exception import Control.Exception.Internal(unsafeUnmask)-import Data.Word+import Data.Hashable+import Data.Word.Word+import System.IO.Base  instance Show ThreadId where   show i = "ThreadId#" ++ show (primThreadNum i)@@ -45,9 +47,11 @@ instance Ord ThreadId where   i `compare` i'  =  primThreadNum i `compare` primThreadNum i' +instance Hashable ThreadId where+  hashWithSalt s t = hashWithSalt s (primThreadNum t)+ forkIO :: IO () -> IO ThreadId-forkIO action = --primForkIO (catch action childHandler)-  primForkIO action+forkIO action = primForkIO (catch action childHandler)  childHandler :: SomeException -> IO () childHandler err = catch (realHandler err) childHandler@@ -55,10 +59,16 @@ realHandler :: SomeException -> IO () realHandler se   | Just BlockedIndefinitelyOnMVar <- fromException se  =  return ()---  | Just BlockedIndefinitelyOnSTM  <- fromException se  =  return ()+  | Just BlockedIndefinitelyOnSTM  <- fromException se  =  return ()   | Just ThreadKilled              <- fromException se  =  return ()-  | otherwise                                           =  throw se+  | otherwise                                           =  reportError se +-- The child has an uncaught exception and has to die.+reportError :: SomeException -> IO ()+reportError se = do+  -- Maybe report on stderr?+  putStrLn $ "Uncaught child exception: " ++ show se+ myThreadId :: IO ThreadId myThreadId = primMyThreadId @@ -114,3 +124,22 @@       2 -> ThreadBlocked BlockedOnOther  -- ts_wait_time       3 -> ThreadFinished                -- ts_finished       4 -> ThreadDied                    -- ts_died++-------------------------------------------------------+-- Just for GHC compatibility.++forkOn :: Int -> IO () -> IO ThreadId+forkOn _ = forkIO++forkOnWithUnmask :: Int -> ((forall a. IO a -> IO a) -> IO ()) -> IO ThreadId+forkOnWithUnmask _ = forkIOWithUnmask++getNumCapabilities :: IO Int+getNumCapabilities = return 1++setNumCapabilities :: Int -> IO ()+setNumCapabilities _ = return ()++threadCapability :: ThreadId -> IO (Int, Bool)+threadCapability _ = return (0, False)+
lib/Control/Concurrent/MVar.hs view
@@ -16,16 +16,22 @@   modifyMVarMasked_,   modifyMVarMasked,   tryReadMVar,-  --mkWeakMVar,+  mkWeakMVar,   --addMVarFinalizer,   ) where+import qualified Prelude(); import MiniPrelude import Primitives import Control.Exception import Data.Maybe(isNothing)+import Numeric.Show+import System.Mem.Weak  instance Eq (MVar a) where   mv1 == mv2  =  primMVarToWord mv1 == primMVarToWord mv2 +instance Show (MVar a) where+  show mv = "MVar#" ++ showHex (primMVarToWord mv) ""+ newEmptyMVar :: IO (MVar a) newEmptyMVar = primNewEmptyMVar @@ -108,3 +114,6 @@     (a',b) <- (io a >>= evaluate) `onException` putMVar m a     putMVar m a'     return b++mkWeakMVar :: MVar a -> IO () -> IO (Weak (MVar a))+mkWeakMVar m fin = mkWeakPtr m (Just fin)
+ lib/Control/Concurrent/STM.hs view
@@ -0,0 +1,17 @@+module Control.Concurrent.STM (+        module Control.Monad.STM,+        module Control.Concurrent.STM.TVar,+        module Control.Concurrent.STM.TMVar,+        module Control.Concurrent.STM.TChan,+        module Control.Concurrent.STM.TQueue,+        module Control.Concurrent.STM.TBQueue,+--        module Control.Concurrent.STM.TArray+  ) where++import Control.Monad.STM+import Control.Concurrent.STM.TVar+import Control.Concurrent.STM.TMVar+import Control.Concurrent.STM.TChan+import Control.Concurrent.STM.TQueue+import Control.Concurrent.STM.TBQueue+--import Control.Concurrent.STM.TArray
+ lib/Control/Concurrent/STM/Internal.hs view
@@ -0,0 +1,679 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Control.Concurrent.SHFSTM.Internal+-- Copyright   :  (c) D. Sabel, Goethe-University, Frankfurt a.M., Germany+-- License     :  BSD-style +-- +-- Maintainer  :  sabel <at> ki.cs.uni-frankfurt.de+-- Stability   :  experimental+-- Portability :  non-portable (needs GHC and extensions)+--+--  +-- This module implements transaction execution+-----------------------------------------------------------------------------++module Control.Concurrent.STM.Internal (+  TLOG,+  emptyTLOG,+  RetryException(..),+  globalRetry,+  commit,+  newTVarWithLog,+  readTVarWithLog,+  writeTVarWithLog,+  orElseWithLog,+  orRetryWithLog+  ) where++import Prelude hiding(catch)+import Control.Exception +import Control.Concurrent+import Control.Concurrent.STM.Internal.TVar  +import Control.Concurrent.STM.Internal.TransactionLog+import qualified Control.Concurrent.STM.Internal.Map as Map+import qualified Control.Concurrent.STM.Internal.Set as Set+import Data.List+import Data.IORef+import Data.Maybe+import Data.Typeable     +-- | The 'RetryException' is thrown from the committing transaction+-- to conflicting transactions+++++  +data RetryException = RetryException +     deriving (Typeable,Show)++instance Exception RetryException++-- | 'newTVarWithLog' creates a new TVar+newTVarWithLog :: TLOG      -- ^ the transaction log+               -> a         -- ^ the content of the TVar+               -> IO (TVar a)+newTVarWithLog (TLOG tlog) content =+  uninterruptibleMask_ $+   do+    mid <- myThreadId+    tvar_Id <- nextCounter+    lg <- readIORef tlog                   -- access the Transaction-Log+    let ((la,ln,lw):xs) = tripelStack lg   -- access the La,Ln,Lw lists+    -- Create the TVar  ...+    content_global <- newMVar content       -- set global content+    pointer_local_content <- newIORef [content]+    let mp = Map.insert mid pointer_local_content Map.empty+    content_local   <- seq mp (newMVar mp)+    notify_list     <- newMVar Set.empty+    unset_lock      <- newEmptyMVar+    -- loc <- newIORef (Just mid)+    content_waiting_queue <- newMVar []                  -- empty broadcast list+    content_tvarx <-         newMVar (TV {globalContent = content_global,+                                  localContent  = content_local,+                                  notifyList    = notify_list,+                                  lock          = unset_lock,   +                                  waitingQueue  = content_waiting_queue+                                  -- local = loc+                                  })+                                         +    let tvany = TVarAny (tvar_Id,content_tvarx)+    let tva   = TVarA content_tvarx+    let tvar = TVar (tva,tvany)+    -- ------------- +    writeIORef tlog (lg{tripelStack=(Set.insert tvany la,Set.insert tvany ln,lw):xs}) -- adjust the Transaction Log+    return tvar++    ++-- | 'readTVarWithLog' performs the readTVar-operation+readTVarWithLog :: TLOG   -- ^ the transaction log+                -> TVar a -- ^ the  'TVar'+                -> IO a   -- ^ the content of the 'TVar' (local)+readTVarWithLog (TLOG tlog) ptvar@(TVar (_,tvany)) =+ do+  +  res <- tryReadTVarWithLog (TLOG tlog) ptvar+  case res of+    Right r -> return r+    Left blockvar -> do+                     mid <- myThreadId+                     takeMVar blockvar+                     readTVarWithLog (TLOG tlog) ptvar+    +tryReadTVarWithLog (TLOG tlog) ptvar@(TVar (TVarA tva,tvany@(TVarAny tx))) = uninterruptibleMask_ $+  do+    _tva <-  takeMVar tva  -- access the TVar+    lg <- readIORef tlog  -- access the Log-File+    let ((la,ln,lw):xs) = tripelStack lg+    mid <- myThreadId        -- the ThreadId+    if tvany `Set.member` la then do+      -- x in L_a, local copy exists+      uninterruptibleMask_ (+       do       +        localmap <- readMVar  (localContent _tva)+        lk <- readIORef $ fromJust $ Map.lookup mid localmap+        let (x:xs) = lk+        putMVar tva _tva+        return (Right x)        +        )+      else                  +      -- TVar not in read TVars+       do+        uninterruptibleMask_ ( +         do +          b <- isEmptyMVar (lock _tva)+          if b -- not locked+           then +                do+                 nl <- takeMVar (notifyList _tva) +                 putMVar (notifyList _tva) (Set.insert mid nl) -- add to notifyList+                 globalC <- readMVar  (globalContent _tva) -- read global content+                 content_local <- newIORef [globalC]+                 mp <- takeMVar (localContent _tva)+                 writeIORef tlog (lg{readTVars = Set.insert tvany (readTVars lg),tripelStack = (Set.insert tvany la,ln,lw):xs})+                 putMVar (localContent _tva) (Map.insert mid content_local mp)        -- copy to local tvar stack+                             -- adjust the transaction log+                 putMVar tva _tva+                 return (Right globalC)+      +           else -- locked+                do +                 blockvar <- newEmptyMVar+                 wq <- takeMVar (waitingQueue _tva)+                 putMVar (waitingQueue _tva) (blockvar:wq)+                 putMVar tva _tva+                 return (Left blockvar)+           )++-- | 'writeTVarWithLog' performs the writeTVar operation and +--   adjusts the transaction log accordingly+writeTVarWithLog :: TLOG   -- ^ the transaction log+                  -> TVar a -- ^ the  'TVar'+                  -> a      -- ^ the new content+                  -> IO ()  ++writeTVarWithLog (TLOG tlog) ptvar@(TVar (_,tvany)) con =+ do+  res <- tryWriteTVarWithLog (TLOG tlog) ptvar con+  case res of+    Right r -> return r+    Left blockvar -> do+                      takeMVar blockvar+                      writeTVarWithLog (TLOG tlog) ptvar con+   +tryWriteTVarWithLog (TLOG tlog) ptvar@(TVar (TVarA tva,tvany@(TVarAny (id,m)))) con =+ uninterruptibleMask_ $ do+    _tva <-  takeMVar tva  -- access the TVar+    lg <- readIORef tlog  -- access the Log-File+    let ((la,ln,lw):xs) = tripelStack lg+    mid <- myThreadId        -- the ThreadId+    if tvany `Set.member` la then do+      -- x in L_a, local copy exists+      uninterruptibleMask_ (+       do       +        localmap <- readMVar  (localContent _tva)+        let ioref_with_old_content = fromJust $ Map.lookup mid localmap+        lk <- readIORef ioref_with_old_content +        let (x:ys) = lk+        writeIORef  ioref_with_old_content (con:ys)+        writeIORef tlog (lg{tripelStack = (la,ln,Set.insert tvany lw):xs})+        putMVar tva _tva+        return $ Right ()+        )+     else                  +      -- TVar not in read TVars+       do+        uninterruptibleMask_ ( +         do +          b <- isEmptyMVar (lock _tva)+          if b -- not locked+           then +                do+                 globalC <- readMVar  (globalContent _tva) -- read global content+                 content_local <- newIORef [con]+                 mp <- takeMVar (localContent _tva)+                 putMVar (localContent _tva) (Map.insert mid content_local mp)        -- copy to local tvar stack+                             -- adjust the transaction log+                 writeIORef tlog (lg{readTVars = Set.insert tvany (readTVars lg),tripelStack = (Set.insert tvany la,ln,Set.insert tvany lw):xs})+                 putMVar tva _tva+                 return (Right ())+      +           else -- locked+                do +                 blockvar <- newEmptyMVar+                 wq <- takeMVar (waitingQueue _tva)+                 putMVar (waitingQueue _tva) (wq ++ [blockvar])+                 putMVar tva _tva+                 return (Left blockvar)++           )+++           +writeStartWithLog' (TLOG tlog) =+ uninterruptibleMask_ $+   do+    mid <- myThreadId    +    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let ((la,ln,lw):_)  = tripelStack lg+    let t               = readTVars lg+    let xs = t `Set.union` (la Set.\\ ln)  -- x1,...,xn+    res <- uninterruptibleMask_ (grabLocks mid (Data.List.sort $ Set.elems xs)  [])+    case res of+       Right _ -> do +                   writeIORef tlog (lg{lockingSet = xs}) -- K := xs+                   return (Right ())+       Left lock -> return (Left lock)+    +-- | 'writeStartWithLog' starts the commit phase, by +-- locking the read and written TVars++writeStartWithLog :: TLOG -- ^ the transaction log+                     -> IO () +writeStartWithLog (TLOG tlog) =+  do+    res <- writeStartWithLog' (TLOG tlog)+    case res of +     Left lock -> +      do+       mid <- myThreadId+       takeMVar lock+       yield+       threadDelay 1000+       writeStartWithLog (TLOG tlog) +     Right () -> return ()+     +grabLocks mid [] _  = return (Right ())     +grabLocks mid (ptvar@(TVarAny (i,tvany)):xs) held = +  uninterruptibleMask_ $ do+          _tvany <- takeMVar tvany+          b <- tryPutMVar (lock _tvany) mid+          if b -- not locked+           then  do+             putMVar tvany _tvany+             grabLocks mid xs (ptvar:held)+            +            else  do -- already locked+             waiton <- newEmptyMVar+             l <- takeMVar (waitingQueue _tvany)+             putMVar (waitingQueue _tvany) (l ++ [waiton])+             putMVar tvany _tvany+             mapM_ (\(TVarAny (i,tvany)) -> do+                                                          _tv <- takeMVar tvany+                                                          takeMVar (lock _tv)+                                                          putMVar tvany _tv) (reverse held)+                                                          +             return (Left waiton)+                          +     +    +           +           +           +           +iterateClearWithLog (TLOG tlog) [] = return ()+iterateClearWithLog (TLOG tlog) ((TVarAny (id,tvany)):xs) =+  do+    mid <- myThreadId+    uninterruptibleMask_ $+      do +       lg <- readIORef tlog+       _tvany <- takeMVar tvany+       ns <- takeMVar (notifyList _tvany)+       -- remove thread id from notify list:+       putMVar  (notifyList _tvany) (Set.delete mid ns)+       putMVar tvany _tvany+    iterateClearWithLog (TLOG tlog) xs    +-- iterate clearWrite as long as possible (i.e. until the T-List is empty)+-- Note: the iteration is not atomic (as in the paper)++-- | 'writeClearWithLog' removes the notify entries of the committing transaction    +writeClearWithLog (TLOG tlog) =+  do +    lg <- readIORef tlog  -- access the Log-File+    let xs =  Set.elems (readTVars lg)+    iterateClearWithLog (TLOG tlog) xs+    writeIORef tlog (lg{readTVars=Set.empty})++     +           +getIds []                       ls = return (Set.elems ls)          +getIds ((TVarAny (_,tvany)):xs) ls =+ do+  l <- uninterruptibleMask_+   (do +     _tvany <- takeMVar tvany +     l <- takeMVar (notifyList _tvany)+     putMVar (notifyList _tvany) Set.empty+     putMVar tvany _tvany+     return l+    )+  getIds xs (Set.union l ls)+-- | 'sendRetryWithLog' sends exceptions to the conflicting threads+  +sendRetryWithLog :: TLOG -- ^ the transaction log+                 -> IO ()+                 +sendRetryWithLog (TLOG tlog) =+  uninterruptibleMask_ $ +   do+    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let ((la,ln,lw):xs) = tripelStack lg+    openLW <- getIds (Set.elems lw) Set.empty+    notify openLW++notify [] = return ()+notify (tid:xs) =+ do        +   mid <- myThreadId+   -- ack <- newEmptyMVar +   throwTo tid RetryException -- send retry, +   notify xs++           +-- | 'writeTVWithLog' performs the write-Operations of the committing thread.+writeTVWithLog :: TLOG -- ^ the transaction log+               -> IO ()+               +writeTVWithLog (TLOG tlog) =+  do+    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let ((la,ln,lw):xs) = tripelStack lg+    let tobewritten = lw Set.\\ ln+    writeTVars (Set.elems tobewritten)+    writeIORef tlog lg{tripelStack=(la,ln,Set.empty):xs}++writeTVars [] = return ()+writeTVars ((TVarAny (tid,tvany)):xs) =+  do+   mid <- myThreadId+   _tvany <- takeMVar tvany+   localMap <- takeMVar (localContent _tvany)+   case Map.lookup mid localMap of+    Just conp -> +      do+        con <- readIORef conp+        let (ltv:stackedcontent) = con +        putMVar (localContent _tvany) (Map.delete mid localMap)+        -- copy to global storage+        takeMVar (globalContent _tvany)+        putMVar  (globalContent _tvany) ltv+        putMVar tvany _tvany+        writeTVars xs++   ++-- ------------------------------------------------+-- unlockTVWithLog  implements (unlockTV)+-- ------------------------------------------------++-- | 'unlockTVWithLog' remove the locks of the TVars during commit+unlockTVWithLog :: TLOG -- ^ the transaction log+               -> IO ()++unlockTVWithLog (TLOG tlog) =+  uninterruptibleMask_ $ do+    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let ((la,ln,lw):xs) = tripelStack lg+    let k = lockingSet lg+    unlockTVars (Set.elems k)+    writeIORef tlog lg{lockingSet = Set.empty}+    +unlockTVars [] = return ()+unlockTVars ((TVarAny (i,tvany)):xs) =    +   uninterruptibleMask_ $+    do+       mid <- myThreadId+       _tvany <- takeMVar tvany+       wq <- takeMVar (waitingQueue _tvany)    +       takeMVar (lock _tvany)+       putMVar (waitingQueue _tvany) []+       mapM_ (`putMVar` ()) wq+       putMVar tvany _tvany+       unlockTVars xs++-- | 'writeTVnWithLog' writes the newly created TVars during commit    +writeTVnWithLog :: TLOG -- ^ the transaction log+               -> IO ()++writeTVnWithLog (TLOG tlog) =+  do+    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let ((la,ln,lw):xs) = tripelStack lg+    let t = readTVars lg+    let k = lockingSet lg+    let toBeWritten = Set.elems ln+    writeNew toBeWritten+    writeIORef tlog lg{tripelStack=(la,Set.empty,lw):xs}+    +writeNew [] = return ()+writeNew ((TVarAny (i,tvany)):xs) =+ do+  mid <- myThreadId+  _tvany <- takeMVar tvany+  lmap <- takeMVar (localContent _tvany)+  if Map.null (Map.delete mid lmap) then+   case Map.lookup mid lmap of+    Just conp ->+      do +       (con:_) <- readIORef conp+       takeMVar (globalContent _tvany)+       putMVar (globalContent _tvany) con+       putMVar (localContent _tvany) Map.empty+       putMVar tvany _tvany+       writeNew xs+    else +       error "panic"+       +      +-- ------------------------------------------------+-- writeEndWithLog  implements (writeEnd)+-- ------------------------------------------------++-- | 'writeEndWithLog' clears the local TVars, during commit++writeEndWithLog :: TLOG -- ^ the transaction log+               -> IO ()++writeEndWithLog (TLOG tlog) =+  do+    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let ((la,ln,lw):xs) = tripelStack lg+    let t = readTVars lg+    let k = lockingSet lg+    clearEntries (Set.elems la)++clearEntries [] = return ()+clearEntries ((TVarAny (_,tvany)):xs) =+ do+  mid <- myThreadId+  _tvany <- takeMVar tvany+  localmap <- takeMVar (localContent _tvany)+  putMVar (localContent _tvany) (Map.delete mid localmap)+  putMVar tvany _tvany+  +-- ------------------------------------------------+-- commit performs all the operations for committing+-- ------------------------------------------------+++-- | 'commit' performs the operations for committing+--+--   - 'writeStartWithLog' to lock the read and to-be-written TVars+--+--   - 'writeClearWithLog' (iteratively) to remove the notify entries of the committing transaction+--+--   - 'sendRetryWithLog' (iteratively) to abort conflicting transactions+--+--   - 'writeTVWithLog' (iteratively) to write the local contents in to the global memory+--+--   - 'writeTVnWithLog' (iteratively) to create the newly created TVars in the global memory+--+--   - 'writeEndWithLog'  to clear the local TVar stack+--+--   - 'unlockTVWithLog' (iteratively) to unlock the global TVars+ +commit :: TLOG -- ^ the transaction logs+       -> IO () +commit (TLOG tlog) =+ do+   mid <- myThreadId+--    yield +   writeStartWithLog (TLOG tlog)       -- writeStart +--    yield +   writeClearWithLog (TLOG tlog)     -- clearWrite phase+--    yield +   sendRetryWithLog  (TLOG tlog) -- sendRetry phase+--    yield +   writeTVWithLog (TLOG tlog)   -- writeTV phase+--    yield   +   writeTVnWithLog (TLOG tlog) -- writeTVn phase+--    yield    +   writeEndWithLog (TLOG tlog) -- writeTVn phase+   unlockTVWithLog (TLOG tlog) -- unlockTV phase++           +   +++++    +-- ------------------------------------------------+-- retryCGlobWithLog  implements (retryCGlob)+-- ------------------------------------------------+-- | 'retryCGlobWithLog' performs the removal of notify entries during retry+retryCGlobWithLog :: TLOG -- ^ the transaction log+                  -> IO ()+retryCGlobWithLog (TLOG tlog) =+  do+    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let t = Set.elems (readTVars lg)+    uninterruptibleMask_ $ +      do+       removeNotifyEntries mid t+       writeIORef tlog lg{readTVars = Set.empty}+       +removeNotifyEntries mid [] = return ()+removeNotifyEntries mid ((TVarAny (i,tvany)):xs) =+  uninterruptibleMask_ $+   do+    _tvany <- takeMVar tvany+    nlist <- takeMVar (notifyList _tvany)+    putMVar (notifyList _tvany)  (Set.delete mid nlist)+    putMVar tvany _tvany+    removeNotifyEntries mid xs++  ++    +-- ------------------------------------------------+-- retryEndWithLog  implements (retryEnd) (slightly modified)+-- ------------------------------------------------+-- | 'retryEndWithLog' resets the transaction log and the local tvar content during retry++retryEndWithLog :: TLOG -- ^ the transaction log+                -> IO ()+retryEndWithLog (TLOG tlog) =+  do+    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let ((la,ln,lw):xs) = tripelStack lg+    let tvset = la `Set.union` ln `Set.union` lw+    let toBeResetted = Set.elems tvset+    uninterruptibleMask_ $+      do +       resetEntries mid toBeResetted    +       writeIORef tlog (lg{tripelStack = (Set.empty,Set.empty, Set.empty):xs})+    +resetEntries mid [] = return ()+resetEntries mid ((TVarAny (_,tvany)):xs) =    +  uninterruptibleMask_ $+       do+         _tvany <- takeMVar tvany+         localmap <- takeMVar (localContent _tvany)+         putMVar (localContent _tvany) (Map.delete mid localmap)+         putMVar tvany _tvany+         resetEntries mid xs++         +-- ----------------------------+-- globalRetry should be called when the transaction retries+-------------------------------+-- | 'globalRetry' should be called to retry a transaction, it iteratively +-- perform 'retryCGlobWithLog' and then 'retryEndWithLog'++globalRetry :: TLOG -- ^ the transaction log+            -> IO () +globalRetry (TLOG tlog) =+ catch (+  do+   mid <- myThreadId+   uninterruptibleMask_ (retryCGlobWithLog (TLOG tlog))+   uninterruptibleMask_ (retryEndWithLog  (TLOG tlog))+    ) (\ RetryException -> globalRetry (TLOG tlog))+   +-- ------------------------------------------------+-- orElseWithLog (performs (orElse), i.e duplication of stacks etc.+-- ------------------------------------------------++-- | 'orElseWithLog' should be called for the evaluation of 'orElse' to duplicate the local TVar stacks and+--    the entries in the transaction log+orElseWithLog :: TLOG -- ^ the transaction log +              ->  IO ()+orElseWithLog (TLOG tlog) =+  do+    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let ((la,ln,lw):xs) = tripelStack lg++    -- double all local TVars+    uninterruptibleMask_ (+      do +       doubleLocalTVars mid (Set.elems la)+       writeIORef tlog (lg{tripelStack=(la,ln,lw):((la,ln,lw):xs)})+     )+     +doubleLocalTVars mid [] = return ()+doubleLocalTVars mid ((TVarAny (_,tvany)):xs) =+ uninterruptibleMask_ $+   do+    _tvany <- takeMVar tvany+    localmap <- takeMVar (localContent _tvany)+    case Map.lookup mid localmap of+      Just conp -> +        do +         (x:ys) <- readIORef conp+         writeIORef conp (x:x:ys)+         putMVar (localContent _tvany) localmap+         putMVar tvany _tvany+         doubleLocalTVars mid xs++-- ------------------------------------------------+-- orRetryWithLog (performs (orRetry), i.e removal+-- ------------------------------------------------++-- | 'orRetryWithLog' should be called when the left expression of an 'orElse' evaluates to 'retry'+--   it pops all stacks (local TVars and transaction log)+orRetryWithLog :: TLOG -- ^ the transaction log+               -> IO ()+orRetryWithLog (TLOG tlog) =+  do+    lg <- readIORef tlog  -- access the Log-File+    mid <- myThreadId+    let ((la,ln,lw):xs) = tripelStack lg+    uninterruptibleMask_ $ +      do+        undoubleLocalTVars mid (Set.elems la)    +        writeIORef tlog (lg{tripelStack=xs})++    +undoubleLocalTVars mid [] = return []+undoubleLocalTVars mid ((TVarAny (_,tvany)):xs) =+ uninterruptibleMask_ $+    do+      _tvany <- takeMVar tvany+      localmap <- takeMVar (localContent _tvany)+      case Map.lookup mid localmap of+        Just conp -> do+         (l:ltv) <- readIORef conp+         writeIORef conp ltv+         putMVar tvany _tvany+         putMVar (localContent _tvany) localmap+         undoubleLocalTVars mid xs+         +-- *************************************************************************************           +-- only for debugging: generate a global TVar quickly           +newGlobalTVar content =+ do+    tvar_Id <- nextCounter+    -- Create the TVar  ...+    content_global <- newMVar content       -- set global content+    content_local   <- newMVar Map.empty     +    notify_list     <- newMVar Set.empty+    unset_lock      <- newEmptyMVar+    -- loc <- newIORef Nothing+    content_waiting_queue <- newMVar []                  -- empty broadcast list+    content_tvarx <-         newMVar (TV {globalContent = content_global,+                                  localContent  = content_local,+                                  notifyList    = notify_list,+                                  lock          = unset_lock,   +                                  waitingQueue  = content_waiting_queue+                                  -- local = loc+                                  })+    let tvany = TVarAny (tvar_Id,content_tvarx)+    let tva   = TVarA content_tvarx+    let tvar = TVar (tva,tvany)+    return tvar++    +++            
+ lib/Control/Concurrent/STM/Internal/Map.hs view
@@ -0,0 +1,27 @@+module Control.Concurrent.STM.Internal.Map(+  Map,+  empty,+  null,+  lookup,+  insert,+  delete,+  ) where+import Prelude hiding(lookup, null)+import qualified Prelude as P++newtype Map k v = Map [(k, v)]++empty :: Map k v+empty = Map []++null :: Map k v -> Bool+null (Map m) = P.null m++lookup :: Ord k => k -> Map k v -> Maybe v+lookup k (Map m) = P.lookup k m++insert :: Ord k => k -> v -> Map k v -> Map k v+insert k v (Map m) = Map ((k, v):m)++delete :: Ord k => k -> Map k v -> Map k v+delete k (Map m) = Map $ filter ((k /=) . fst) m
+ lib/Control/Concurrent/STM/Internal/Set.hs view
@@ -0,0 +1,35 @@+module Control.Concurrent.STM.Internal.Set(+  Set,+  empty,+  member,+  insert,+  delete,+  elems,+  union,+  (\\),+  ) where+import Prelude hiding(union)+import qualified Data.List++newtype Set a = Set [a]++empty :: Set a+empty = Set []++member :: Ord a => a -> Set a -> Bool+member a (Set s) = a `elem` s++insert :: Ord a => a -> Set a -> Set a+insert a s = Set [a] `union` s++delete :: Ord a => a -> Set a -> Set a+delete a (Set s) = Set (filter (a /=) s)++elems :: Ord a => Set a -> [a]+elems (Set s) = Data.List.sort s++union :: Ord a => Set a -> Set a -> Set a+union (Set s1) (Set s2) = Set (s1 `Data.List.union` s2)++(\\) :: Ord a => Set a -> Set a -> Set a+Set s1 \\ Set s2 = Set (s1 Data.List.\\ s2)
+ lib/Control/Concurrent/STM/Internal/TVar.hs view
@@ -0,0 +1,111 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Control.Concurrent.SHFSTM.Internal.TVar+-- Copyright   :  (c) D. Sabel, Goethe-University, Frankfurt a.M., Germany+-- License     :  BSD-style +-- +-- Maintainer  :  sabel <at> ki.cs.uni-frankfurt.de+-- Stability   :  experimental+-- Portability :  non-portable (needs GHC and extensions)+--+--  +-- This module implements the interface to the STM implementation.+-----------------------------------------------------------------------------+++module Control.Concurrent.STM.Internal.TVar (+  -- * Types+  TVar(..),+  TVarA(..),+  TVarAny(..),+  ITVar(..),+  TVarId,+  -- * Operations+  nextCounter+  ) where++import Prelude hiding(catch)+import System.IO.Unsafe+import Data.IORef+import qualified Data.List+import Control.Concurrent.STM.Internal.Map as Map+import Control.Concurrent.STM.Internal.Set as Set+import Control.Concurrent+import Control.Exception+import Data.Maybe+import Data.Typeable+    +-- =============================================================+-- Implementation of the TVar with local and global components+-- Everything is packed by pointers to allow easy (side-effecting) +-- updates++-- | The 'TVar'-type represents transactional variables+-- Internally it is represented by a pair of transactional variables:+-- a 'TVarA' and a 'TVarAny', both represent the same transactional+-- variable, but 'TVarA' is  explictely polymorphically typed, while+-- the type is hidden in TVarAny+newtype TVar a = TVar (TVarA a,TVarAny)++-- | 'TVarA' is an 'MVar' containing an 'ITVar'+newtype TVarA a = TVarA (MVar (ITVar a))++-- | 'TVarAny' contains an identifier (of type 'TVarId') and+-- and an 'MVar' which contains an 'ITVar'.+-- The content type is hidden using existential types+data  TVarAny = forall a. TVarAny (TVarId, MVar (ITVar a))++-- | 'tvarAToTVarAny' converts a 'TVarA' a into a 'TVar' +tvarAToTVar :: TVarA a -> TVarId -> IO (TVar a)+tvarAToTVar (TVarA p) tid = + do return (TVar (TVarA p, TVarAny (tid,p)))++instance Eq TVarAny where+ (TVarAny (i,_)) == (TVarAny (j,_)) = i == j++instance Ord TVarAny where+ compare (TVarAny (i,_)) (TVarAny (j,_)) = compare i j+ +instance Show TVarAny where+ show (TVarAny (i,_)) = show i++instance Eq (TVar a) where+ (TVar (TVarA l,_)) == (TVar (TVarA r,_)) = l == r++-- | The real content of a TVar is stored in the 'ITVar' type which has five components,+--   all of them are packed into 'MVar's to allow safe access and efficient updates+data ITVar a = +  TV { +       -- | The global content of the TVar+      globalContent :: MVar a                                +       -- | The local copies: for every Thread a TVar-Stack (protected by a pointer)+     ,localContent  :: MVar (Map.Map ThreadId (IORef [a])) +       -- | The notify-List: a set of thread identifiers, for those threads which are inside+       -- transactions and want to be notfied when their state becomes conflicting.+       -- If this case occurs all threads in notifyList will receive an exception                                                     +     ,notifyList    :: MVar (Set.Set ThreadId) -- a channel of thread ids+       -- | The exclusive lock is used to lock the TVar by the committing transaction+     ,lock          :: MVar ThreadId +       -- | The waitingQueue is used to block, if the TVar is locked, the blocked thread will +       -- be woken up by the committing thread+     ,waitingQueue  :: MVar [MVar ()]+     }+-- | Identifiers 'TVarId' are 'Integer's. They are only necessary for the 'Ord'-instance of 'TVarAny'+     +type TVarId = Integer+++{-# NOINLINE globalCounter #-}+-- | The 'globalCounter' is used to generate new 'TVarId's+globalCounter :: MVar TVarId+globalCounter = unsafePerformIO $ newMVar 0++-- | 'nextCounter' generates a new 'TVarId'+nextCounter :: IO TVarId+nextCounter = + mask_ $ do+   i <- takeMVar globalCounter+   putMVar globalCounter (i+1)+   return i++   
+ lib/Control/Concurrent/STM/Internal/TransactionLog.hs view
@@ -0,0 +1,52 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Control.Concurrent.SHFSTM.Internal.TransactionLog+-- Copyright   :  (c) D. Sabel, Goethe-University, Frankfurt a.M., Germany+-- License     :  BSD-style +-- +-- Maintainer  :  sabel <at> ki.cs.uni-frankfurt.de+-- Stability   :  experimental+-- Portability :  non-portable (needs GHC and extensions)+--+--  +-- This module implements the transaction log+-----------------------------------------------------------------------------++module Control.Concurrent.STM.Internal.TransactionLog (+ TLOG(..),+ Log(..),+ emptyTLOG + ) where++import Control.Concurrent.STM.Internal.TVar +import Control.Concurrent.STM.Internal.Set as Set+import Data.IORef+ +-- | The transaction log 'TLOG' of a thread+--   for easy updates it is packed into a pointer+newtype TLOG = TLOG (IORef Log)++-- | The 'Log' stores several lists +--   it only stores 'TVarAny's++data Log  = +   Log { -- | List T, the read TVars +         readTVars :: Set TVarAny+         -- | A stack of tripels (La,Ln,Lw) where +         --+         --   La = all local tvars,+         --+         --   Ln = new local tvars,+         --+         --   Lw = locally written TVars+       , tripelStack :: [(Set TVarAny, Set TVarAny,Set TVarAny)] +         -- | List K+       , lockingSet :: Set TVarAny +   }+ +-- | 'emptyTLOG' constructs an empty transaction log of type 'TLOG'++emptyTLOG :: IO TLOG+emptyTLOG =+  do p <-  newIORef (Log Set.empty [(Set.empty,Set.empty,Set.empty)] Set.empty)+     return (TLOG p)
+ lib/Control/Concurrent/STM/STMMonad.hs view
@@ -0,0 +1,219 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Control.Concurrent.SHFSTM+-- Copyright   :  (c) D. Sabel, Goethe-University, Frankfurt a.M., Germany+-- License     :  BSD-style +-- +-- Maintainer  :  sabel <at> ki.cs.uni-frankfurt.de+-- Stability   :  experimental+-- Portability :  non-portable (needs GHC and extensions)+--+--  +-- This module implements the interface to the STM implementation.+-----------------------------------------------------------------------------+++module Control.Concurrent.STM.STMMonad (+  -- * Types+  STM,+  TVar,+  -- * Operations in the 'STM'-monad+  newTVar,+  readTVar,+  writeTVar,+  retry,+  orElse,+  -- * Execution of 'STM'-transactions+  atomically,+  newTVarIO,+  --+  throwSTM,+  catchSTM,+  ) where++import Prelude hiding(catch)+import System.IO.Unsafe+import Data.IORef+import qualified Data.List+import Control.Concurrent.STM.Internal.Map as Map+import Control.Concurrent.STM.Internal.Set as Set+import Control.Concurrent+import Control.Exception+import Control.Monad+import Data.Maybe+import Data.Typeable+import Control.Concurrent.STM.Internal+import Control.Concurrent.STM.Internal.TVar+-- | The STM-monad+++++-- The  data type STM, the operations store the continuation    +data STM a = Return a +           | forall b. NewTVar b (TVar b -> STM a)+           | forall b. ReadTVar (TVar b) (b -> STM a)+           | forall b. WriteTVar (TVar b) b (STM a)+           | Retry  +           | forall b. OrElse (STM b) (STM b) (b -> STM a) +           | forall e. Exception e => Throw e+++instance Functor STM where+  fmap f x = x >>= (return . f)++instance Applicative STM where+  pure = Return+  (<*>) = ap+   +-- | The monad instance for 'STM'+instance Monad STM where+  return = Return+  m >>= f = +    case m of+      Return x -> f x+      Retry  -> Retry+      NewTVar x cont -> NewTVar x (cont >=> f)+      ReadTVar x cont -> ReadTVar x (cont >=> f)+      WriteTVar v x cont -> WriteTVar v x (cont >>= f)+      OrElse a1 a2 cont -> OrElse a1 a2 (cont >=> f)+      Throw e -> Throw e+      ++-- | 'newTVar' creates a new 'TVar' in the 'STM' monad++newTVar :: a             -- ^ the content of the TVar+        -> STM (TVar a)  -- ^ the result+newTVar a = NewTVar a return++-- | 'readTVar' reads the content of a 'TVar' in the 'STM' monad++readTVar :: TVar a       -- ^ the to-be-read 'TVar'+            -> STM a     -- ^ the result is an 'STM' action that returns the read content of the 'TVar'+readTVar a = ReadTVar a return+++-- | 'writeTVar' writes new content into a 'TVar' in the 'STM' monad+writeTVar :: TVar a  -- ^ the to-be-written 'TVar'+          -> a       -- ^ the new content+          -> STM ()+writeTVar v x = WriteTVar v x (return ())+++throwSTM :: Exception e => e -> STM a+throwSTM e = Throw e++catchSTM :: Exception e => STM a -> (e -> STM a) -> STM a+catchSTM act handle = error "catchSTM: not implemented yet"++-- | 'orElse' composes two transactions: +-- +-- In 'orElse' @e1@ @e2@ first the transaction @e1@ is executed.+-- If it is successful (i.e. commits), then 'orElse' @e1@ @e2@ is successful.+-- If a 'retry' pops up, then 'orElse' @e1@ @e2@ proceeds with @e2@ ignoring+-- then effects made by execution of @e1@.++orElse :: STM a    -- ^ the first transaction+          -> STM a -- ^ the second transaction+          -> STM a -- ^ the composed transaction+          +orElse a1 a2 = OrElse a1 a2 return++-- | 'retry' aborts and restarts a transaction+--+--   Note that 'retry' has a /different/ semantics if it is used inside an argument of 'orElse':+--+--   If 'retry' pops up in the left @e1@ argument of 'orElse' @e1@ @e2@, then the transaction +--   corresponding to @ e1 @ is roll-back and transaction @e2@ is executed.+--+--   If 'retry' pops up in the right argument @e2@, then it behaves like a ususal 'retry'++retry :: STM a+retry = Retry+  ++-- | 'newTVarIO' creates new 'TVar' in the 'IO'-monad,+--+--   @ newTVarIO a @ is equivalent to 'atomically' @(@'newTVar'@ a)@+newTVarIO :: a            -- ^ the content of the TVar+          -> IO (TVar a)  -- ^ the result is a TVar in the 'IO'-monad+newTVarIO x = atomically (newTVar x)++   +-- | 'atomically' executes an 'STM' transaction atomically in the 'IO'-monad+atomically :: STM a -> IO a+atomically act =+  do+    mid <- myThreadId+    tlog <- emptyTLOG+    catch (performSTM tlog act) +          (\e -> case e of+                   RetryException   ->  do+                                          uninterruptibleMask_ ( do +                                                   globalRetry tlog)+                                          atomically act+                   other -> putStrLn ("other exception" ++ show mid) >> error "error")+++performSTM :: TLOG -> STM a -> IO a+performSTM tlog act =+  case act of +    Return a -> do+               commit tlog+               return a+    Retry  -> do+               waitForExternalRetry -- forever until a retry-exception is received+    NewTVar x cont -> do+                       tv <- newTVarWithLog tlog x+                       performSTM tlog (cont tv) +    ReadTVar x cont -> do +                        res <- readTVarWithLog tlog x+                        performSTM tlog (cont res) +    WriteTVar v x cont -> do+                           writeTVarWithLog tlog v x+                           performSTM tlog cont +    OrElse act1 act2 cont -> do           +                              orElseWithLog tlog -- adjust for left orElse+                              resl <- performOrElseLeft tlog act1+                              case resl of+                                Just a -> performSTM tlog (cont a) +                                Nothing -> do+                                            orRetryWithLog tlog+                                            performSTM tlog (act2 >>= cont) +    Throw e -> throw e+                                +performOrElseLeft :: TLOG -> STM a -> IO (Maybe a)+performOrElseLeft tlog  act = +   case act of +    Return a -> do+               return $ Just a+    Retry  -> do+               return Nothing+    NewTVar x cont -> do+                       tv <- newTVarWithLog tlog x+                       performOrElseLeft tlog (cont tv)+    ReadTVar x cont -> do +                        res <- readTVarWithLog tlog x+                        performOrElseLeft tlog (cont res)+    WriteTVar v x cont -> do+                           writeTVarWithLog tlog v x+                           performOrElseLeft tlog cont +    OrElse act1 act2 cont -> do           +                              orElseWithLog tlog -- adjust for left orElse+                              resl <- performOrElseLeft tlog act1+                              case resl of+                                Just a -> performOrElseLeft tlog (cont a) +                                Nothing -> do+                                            orRetryWithLog tlog+                                            performOrElseLeft tlog (act2 >>= cont) ++                                            +waitForExternalRetry = + do+  x <- newEmptyMVar+  wait x+   where wait x  =  +            catch (takeMVar x >> return undefined) +                  (\e -> case e of BlockedIndefinitelyOnMVar -> putStrLn "BLOCKED IN RETRYWAT" >> wait x+                                   _ -> throw e)+    
+ lib/Control/Concurrent/STM/TBQueue.hs view
@@ -0,0 +1,232 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Control.Concurrent.STM.TBQueue+-- Copyright   :  (c) The University of Glasgow 2012+-- License     :  BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer  :  libraries@haskell.org+-- Stability   :  experimental+-- Portability :  non-portable (requires STM)+--+-- 'TBQueue' is a bounded version of 'TQueue'. The queue has a maximum+-- capacity set when it is created.  If the queue already contains the+-- maximum number of elements, then 'writeTBQueue' retries until an+-- element is removed from the queue.+--+-- The implementation is based on an array to obtain /O(1)/+-- enqueue and dequeue operations.+--+-- @since 2.4+-----------------------------------------------------------------------------++module Control.Concurrent.STM.TBQueue (+    -- * TBQueue+    TBQueue,+    newTBQueue,+    newTBQueueIO,+    readTBQueue,+    tryReadTBQueue,+    flushTBQueue,+    peekTBQueue,+    tryPeekTBQueue,+    writeTBQueue,+    unGetTBQueue,+    lengthTBQueue,+    isEmptyTBQueue,+    isFullTBQueue,+    capacityTBQueue,+  ) where+import Control.Concurrent.STM.STMMonad+import Control.Monad   (unless)+import Numeric.Natural (Natural)+import Prelude         hiding (read)++-- | 'TBQueue' is an abstract type representing a bounded FIFO channel.+--+-- @since 2.4+data TBQueue a+   = TBQueue {-# UNPACK #-} !(TVar Natural) -- CR:  read capacity+             {-# UNPACK #-} !(TVar [a])     -- R:   elements waiting to be read+             {-# UNPACK #-} !(TVar Natural) -- CW:  write capacity+             {-# UNPACK #-} !(TVar [a])     -- W:   elements written (head is most recent)+                            !Natural        -- CAP: initial capacity++instance Eq (TBQueue a) where+  TBQueue a _ _ _ _ == TBQueue b _ _ _ _ = a == b++-- Total channel capacity remaining is CR + CW. Reads only need to+-- access CR, writes usually need to access only CW but sometimes need+-- CR.  So in the common case we avoid contention between CR and CW.+--+--   - when removing an element from R:+--     CR := CR + 1+--+--   - when adding an element to W:+--     if CW is non-zero+--         then CW := CW - 1+--         then if CR is non-zero+--                 then CW := CR - 1; CR := 0+--                 else **FULL**++-- | Builds and returns a new instance of 'TBQueue'.+newTBQueue :: Natural   -- ^ maximum number of elements the queue can hold+           -> STM (TBQueue a)+newTBQueue size = do+  read  <- newTVar []+  write <- newTVar []+  rsize <- newTVar 0+  wsize <- newTVar size+  return (TBQueue rsize read wsize write size)++-- | @IO@ version of 'newTBQueue'.  This is useful for creating top-level+-- 'TBQueue's using 'System.IO.Unsafe.unsafePerformIO', because using+-- 'atomically' inside 'System.IO.Unsafe.unsafePerformIO' isn't+-- possible.+newTBQueueIO :: Natural -> IO (TBQueue a)+newTBQueueIO size = do+  read  <- newTVarIO []+  write <- newTVarIO []+  rsize <- newTVarIO 0+  wsize <- newTVarIO size+  return (TBQueue rsize read wsize write size)++-- |Write a value to a 'TBQueue'; blocks if the queue is full.+writeTBQueue :: TBQueue a -> a -> STM ()+writeTBQueue (TBQueue rsize _read wsize write _size) a = do+  w <- readTVar wsize+  if w > 0+     then do writeTVar wsize $! w - 1+     else do+          r <- readTVar rsize+          if r > 0+             then do writeTVar rsize 0+                     writeTVar wsize $! r - 1+             else retry+  listend <- readTVar write+  writeTVar write (a:listend)++-- |Read the next value from the 'TBQueue'.+readTBQueue :: TBQueue a -> STM a+readTBQueue (TBQueue rsize read _wsize write _size) = do+  xs <- readTVar read+  r <- readTVar rsize+  writeTVar rsize $! r + 1+  case xs of+    x:xs' -> do+      writeTVar read xs'+      return x+    [] -> do+      ys <- readTVar write+      case ys of+        [] -> retry+        _  -> do+          -- NB. lazy: we want the transaction to be+          -- short, otherwise it will conflict+          let ~(z,zs) = case reverse ys of+                          z':zs' -> (z',zs')+                          _      -> error "readTBQueue: impossible"+          writeTVar write []+          writeTVar read zs+          return z++-- | A version of 'readTBQueue' which does not retry. Instead it+-- returns @Nothing@ if no value is available.+tryReadTBQueue :: TBQueue a -> STM (Maybe a)+tryReadTBQueue q = fmap Just (readTBQueue q) `orElse` return Nothing++-- | Efficiently read the entire contents of a 'TBQueue' into a list. This+-- function never retries.+--+-- @since 2.4.5+flushTBQueue :: TBQueue a -> STM [a]+flushTBQueue (TBQueue rsize read wsize write size) = do+  xs <- readTVar read+  ys <- readTVar write+  if null xs && null ys+    then return []+    else do+      unless (null xs) $ writeTVar read []+      unless (null ys) $ writeTVar write []+      writeTVar rsize 0+      writeTVar wsize size+      return (xs ++ reverse ys)++-- | Get the next value from the @TBQueue@ without removing it,+-- retrying if the channel is empty.+peekTBQueue :: TBQueue a -> STM a+peekTBQueue (TBQueue _ read _ write _) = do+  xs <- readTVar read+  case xs of+    x:_ -> return x+    [] -> do+      ys <- readTVar write+      case ys of+        [] -> retry+        _  -> do+          let (z:zs) = reverse ys -- NB. lazy: we want the transaction to be+                                  -- short, otherwise it will conflict+          writeTVar write []+          writeTVar read (z:zs)+          return z++-- | A version of 'peekTBQueue' which does not retry. Instead it+-- returns @Nothing@ if no value is available.+tryPeekTBQueue :: TBQueue a -> STM (Maybe a)+tryPeekTBQueue c = do+  m <- tryReadTBQueue c+  case m of+    Nothing -> return Nothing+    Just x  -> do+      unGetTBQueue c x+      return m++-- | Put a data item back onto a channel, where it will be the next item read.+-- Blocks if the queue is full.+unGetTBQueue :: TBQueue a -> a -> STM ()+unGetTBQueue (TBQueue rsize read wsize _write _size) a = do+  r <- readTVar rsize+  if r > 0+     then do writeTVar rsize $! r - 1+     else do+          w <- readTVar wsize+          if w > 0+             then writeTVar wsize $! w - 1+             else retry+  xs <- readTVar read+  writeTVar read (a:xs)++-- | Return the length of a 'TBQueue'.+--+-- @since 2.5.0.0+lengthTBQueue :: TBQueue a -> STM Natural+lengthTBQueue (TBQueue rsize _read wsize _write size) = do+  r <- readTVar rsize+  w <- readTVar wsize+  return $! size - r - w++-- | Returns 'True' if the supplied 'TBQueue' is empty.+isEmptyTBQueue :: TBQueue a -> STM Bool+isEmptyTBQueue (TBQueue _rsize read _wsize write _size) = do+  xs <- readTVar read+  case xs of+    (_:_) -> return False+    [] -> do ys <- readTVar write+             return $! null ys++-- | Returns 'True' if the supplied 'TBQueue' is full.+--+-- @since 2.4.3+isFullTBQueue :: TBQueue a -> STM Bool+isFullTBQueue (TBQueue rsize _read wsize _write _size) = do+  w <- readTVar wsize+  if w > 0+     then return False+     else do+         r <- readTVar rsize+         return $! r <= 0++-- | The maximum number of elements the queue can hold.+--+-- @since 2.5.2.0+capacityTBQueue :: TBQueue a -> Natural+capacityTBQueue (TBQueue _ _ _ _ cap) = fromIntegral cap
+ lib/Control/Concurrent/STM/TChan.hs view
@@ -0,0 +1,193 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Control.Concurrent.STM.TChan+-- Copyright   :  (c) The University of Glasgow 2004+-- License     :  BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer  :  libraries@haskell.org+-- Stability   :  experimental+-- Portability :  non-portable (requires STM)+--+-- TChan: Transactional channels+-- (GHC only)+--+-----------------------------------------------------------------------------++module Control.Concurrent.STM.TChan (+        -- * TChans+        TChan,++        -- ** Construction+        newTChan,+        newTChanIO,+        newBroadcastTChan,+        newBroadcastTChanIO,+        dupTChan,+        cloneTChan,++        -- ** Reading and writing+        readTChan,+        tryReadTChan,+        peekTChan,+        tryPeekTChan,+        writeTChan,+        unGetTChan,+        isEmptyTChan+  ) where+import Control.Concurrent.STM.STMMonad++-- | 'TChan' is an abstract type representing an unbounded FIFO channel.+data TChan a = TChan !(TVar (TVarList a))+                     !(TVar (TVarList a))+  deriving (Eq)++type TVarList a = TVar (TList a)+data TList a = TNil | TCons a !(TVarList a)++-- |Build and return a new instance of 'TChan'+newTChan :: STM (TChan a)+newTChan = do+  hole <- newTVar TNil+  read <- newTVar hole+  write <- newTVar hole+  return (TChan read write)++-- |@IO@ version of 'newTChan'.  This is useful for creating top-level+-- 'TChan's using 'System.IO.Unsafe.unsafePerformIO', because using+-- 'atomically' inside 'System.IO.Unsafe.unsafePerformIO' isn't+-- possible.+newTChanIO :: IO (TChan a)+newTChanIO = do+  hole <- newTVarIO TNil+  read <- newTVarIO hole+  write <- newTVarIO hole+  return (TChan read write)++-- | Create a write-only 'TChan'.  More precisely, 'readTChan' will 'retry'+-- even after items have been written to the channel.  The only way to read+-- a broadcast channel is to duplicate it with 'dupTChan'.+--+-- Consider a server that broadcasts messages to clients:+--+-- >serve :: TChan Message -> Client -> IO loop+-- >serve broadcastChan client = do+-- >    myChan <- dupTChan broadcastChan+-- >    forever $ do+-- >        message <- readTChan myChan+-- >        send client message+--+-- The problem with using 'newTChan' to create the broadcast channel is that if+-- it is only written to and never read, items will pile up in memory.  By+-- using 'newBroadcastTChan' to create the broadcast channel, items can be+-- garbage collected after clients have seen them.+--+-- @since 2.4+newBroadcastTChan :: STM (TChan a)+newBroadcastTChan = do+    write_hole <- newTVar TNil+    read <- newTVar (error "reading from a TChan created by newBroadcastTChan; use dupTChan first")+    write <- newTVar write_hole+    return (TChan read write)++-- | @IO@ version of 'newBroadcastTChan'.+--+-- @since 2.4+newBroadcastTChanIO :: IO (TChan a)+newBroadcastTChanIO = do+    write_hole <- newTVarIO TNil+    read <- newTVarIO (error "reading from a TChan created by newBroadcastTChanIO; use dupTChan first")+    write <- newTVarIO write_hole+    return (TChan read write)++-- |Write a value to a 'TChan'.+writeTChan :: TChan a -> a -> STM ()+writeTChan (TChan _read write) a = do+  listend <- readTVar write -- listend == TVar pointing to TNil+  new_listend <- newTVar TNil+  writeTVar listend (TCons a new_listend)+  writeTVar write new_listend++-- |Read the next value from the 'TChan'.+readTChan :: TChan a -> STM a+readTChan (TChan read _write) = do+  listhead <- readTVar read+  head <- readTVar listhead+  case head of+    TNil -> retry+    TCons a tail -> do+        writeTVar read tail+        return a++-- | A version of 'readTChan' which does not retry. Instead it+-- returns @Nothing@ if no value is available.+--+-- @since 2.3+tryReadTChan :: TChan a -> STM (Maybe a)+tryReadTChan (TChan read _write) = do+  listhead <- readTVar read+  head <- readTVar listhead+  case head of+    TNil       -> return Nothing+    TCons a tl -> do+      writeTVar read tl+      return (Just a)++-- | Get the next value from the @TChan@ without removing it,+-- retrying if the channel is empty.+--+-- @since 2.3+peekTChan :: TChan a -> STM a+peekTChan (TChan read _write) = do+  listhead <- readTVar read+  head <- readTVar listhead+  case head of+    TNil      -> retry+    TCons a _ -> return a++-- | A version of 'peekTChan' which does not retry. Instead it+-- returns @Nothing@ if no value is available.+--+-- @since 2.3+tryPeekTChan :: TChan a -> STM (Maybe a)+tryPeekTChan (TChan read _write) = do+  listhead <- readTVar read+  head <- readTVar listhead+  case head of+    TNil      -> return Nothing+    TCons a _ -> return (Just a)++-- |Duplicate a 'TChan': the duplicate channel begins empty, but data written to+-- either channel from then on will be available from both.  Hence this creates+-- a kind of broadcast channel, where data written by anyone is seen by+-- everyone else.+dupTChan :: TChan a -> STM (TChan a)+dupTChan (TChan _read write) = do+  hole <- readTVar write+  new_read <- newTVar hole+  return (TChan new_read write)++-- |Put a data item back onto a channel, where it will be the next item read.+unGetTChan :: TChan a -> a -> STM ()+unGetTChan (TChan read _write) a = do+   listhead <- readTVar read+   newhead <- newTVar (TCons a listhead)+   writeTVar read newhead++-- |Returns 'True' if the supplied 'TChan' is empty.+isEmptyTChan :: TChan a -> STM Bool+isEmptyTChan (TChan read _write) = do+  listhead <- readTVar read+  head <- readTVar listhead+  case head of+    TNil -> return True+    TCons _ _ -> return False++-- |Clone a 'TChan': similar to dupTChan, but the cloned channel starts with the+-- same content available as the original channel.+--+-- @since 2.4+cloneTChan :: TChan a -> STM (TChan a)+cloneTChan (TChan read write) = do+  readpos <- readTVar read+  new_read <- newTVar readpos+  return (TChan new_read write)
+ lib/Control/Concurrent/STM/TMVar.hs view
@@ -0,0 +1,159 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Control.Concurrent.STM.TMVar+-- Copyright   :  (c) The University of Glasgow 2004+-- License     :  BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer  :  libraries@haskell.org+-- Stability   :  experimental+-- Portability :  non-portable (requires STM)+--+-- TMVar: Transactional MVars, for use in the STM monad+-- (GHC only)+--+-----------------------------------------------------------------------------++module Control.Concurrent.STM.TMVar (+        -- * TMVars+        TMVar,+        newTMVar,+        newEmptyTMVar,+        newTMVarIO,+        newEmptyTMVarIO,+        takeTMVar,+        putTMVar,+        readTMVar,+        writeTMVar,+        tryReadTMVar,+        swapTMVar,+        tryTakeTMVar,+        tryPutTMVar,+        isEmptyTMVar,+--        mkWeakTMVar,+  ) where+import Control.Concurrent.STM.STMMonad++newtype TMVar a = TMVar (TVar (Maybe a)) deriving (Eq)+{- ^+A 'TMVar' is a synchronising variable, used+for communication between concurrent threads.  It can be thought of+as a box, which may be empty or full.+-}++-- |Create a 'TMVar' which contains the supplied value.+newTMVar :: a -> STM (TMVar a)+newTMVar a = do+  t <- newTVar (Just a)+  return (TMVar t)++-- |@IO@ version of 'newTMVar'.  This is useful for creating top-level+-- 'TMVar's using 'System.IO.Unsafe.unsafePerformIO', because using+-- 'atomically' inside 'System.IO.Unsafe.unsafePerformIO' isn't+-- possible.+newTMVarIO :: a -> IO (TMVar a)+newTMVarIO a = do+  t <- newTVarIO (Just a)+  return (TMVar t)++-- |Create a 'TMVar' which is initially empty.+newEmptyTMVar :: STM (TMVar a)+newEmptyTMVar = do+  t <- newTVar Nothing+  return (TMVar t)++-- |@IO@ version of 'newEmptyTMVar'.  This is useful for creating top-level+-- 'TMVar's using 'System.IO.Unsafe.unsafePerformIO', because using+-- 'atomically' inside 'System.IO.Unsafe.unsafePerformIO' isn't+-- possible.+newEmptyTMVarIO :: IO (TMVar a)+newEmptyTMVarIO = do+  t <- newTVarIO Nothing+  return (TMVar t)++-- |Return the contents of the 'TMVar'.  If the 'TMVar' is currently+-- empty, the transaction will 'retry'.  After a 'takeTMVar',+-- the 'TMVar' is left empty.+takeTMVar :: TMVar a -> STM a+takeTMVar (TMVar t) = do+  m <- readTVar t+  case m of+    Nothing -> retry+    Just a  -> do writeTVar t Nothing; return a++-- | A version of 'takeTMVar' that does not 'retry'.  The 'tryTakeTMVar'+-- function returns 'Nothing' if the 'TMVar' was empty, or @'Just' a@ if+-- the 'TMVar' was full with contents @a@.  After 'tryTakeTMVar', the+-- 'TMVar' is left empty.+tryTakeTMVar :: TMVar a -> STM (Maybe a)+tryTakeTMVar (TMVar t) = do+  m <- readTVar t+  case m of+    Nothing -> return Nothing+    Just a  -> do writeTVar t Nothing; return (Just a)++-- |Put a value into a 'TMVar'.  If the 'TMVar' is currently full,+-- 'putTMVar' will 'retry'.+putTMVar :: TMVar a -> a -> STM ()+putTMVar (TMVar t) a = do+  m <- readTVar t+  case m of+    Nothing -> do writeTVar t (Just a); return ()+    Just _  -> retry++-- | A version of 'putTMVar' that does not 'retry'.  The 'tryPutTMVar'+-- function attempts to put the value @a@ into the 'TMVar', returning+-- 'True' if it was successful, or 'False' otherwise.+tryPutTMVar :: TMVar a -> a -> STM Bool+tryPutTMVar (TMVar t) a = do+  m <- readTVar t+  case m of+    Nothing -> do writeTVar t (Just a); return True+    Just _  -> return False++-- | This is a combination of 'takeTMVar' and 'putTMVar'; ie. it+-- takes the value from the 'TMVar', puts it back, and also returns+-- it.+readTMVar :: TMVar a -> STM a+readTMVar (TMVar t) = do+  m <- readTVar t+  maybe retry return m++-- | A version of 'readTMVar' which does not retry. Instead it+-- returns @Nothing@ if no value is available.+--+-- @since 2.3+tryReadTMVar :: TMVar a -> STM (Maybe a)+tryReadTMVar (TMVar t) = readTVar t++-- |Swap the contents of a 'TMVar' for a new value.+swapTMVar :: TMVar a -> a -> STM a+swapTMVar (TMVar t) new = do+  m <- readTVar t+  case m of+    Nothing -> retry+    Just old -> do writeTVar t (Just new); return old++-- | Non-blocking write of a new value to a 'TMVar'+-- Puts if empty. Replaces if populated.+--+-- @since 2.5.1+writeTMVar :: TMVar a -> a -> STM ()+writeTMVar (TMVar t) new = writeTVar t (Just new)++-- |Check whether a given 'TMVar' is empty.+isEmptyTMVar :: TMVar a -> STM Bool+isEmptyTMVar (TMVar t) = do+  m <- readTVar t+  case m of+    Nothing -> return True+    Just _  -> return False++{-+-- | Make a 'Weak' pointer to a 'TMVar', using the second argument as+-- a finalizer to run when the 'TMVar' is garbage-collected.+--+-- @since 2.4.4+mkWeakTMVar :: TMVar a -> IO () -> IO (Weak (TMVar a))+mkWeakTMVar tmv@(TMVar (TVar t#)) (IO finalizer) = IO $ \s ->+    case mkWeak# t# tmv finalizer s of (# s1, w #) -> (# s1, Weak w #)+-}
+ lib/Control/Concurrent/STM/TQueue.hs view
@@ -0,0 +1,156 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Control.Concurrent.STM.TQueue+-- Copyright   :  (c) The University of Glasgow 2012+-- License     :  BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer  :  libraries@haskell.org+-- Stability   :  experimental+-- Portability :  non-portable (requires STM)+--+-- A 'TQueue' is like a 'TChan', with two important differences:+--+--  * it has faster throughput than both 'TChan' and 'Chan' (although+--    the costs are amortised, so the cost of individual operations+--    can vary a lot).+--+--  * it does /not/ provide equivalents of the 'dupTChan' and+--    'cloneTChan' operations.+--+-- The implementation is based on the traditional purely-functional+-- queue representation that uses two lists to obtain amortised /O(1)/+-- enqueue and dequeue operations.+--+-- @since 2.4+-----------------------------------------------------------------------------++module Control.Concurrent.STM.TQueue (+        -- * TQueue+        TQueue,+        newTQueue,+        newTQueueIO,+        readTQueue,+        tryReadTQueue,+        flushTQueue,+        peekTQueue,+        tryPeekTQueue,+        writeTQueue,+        unGetTQueue,+        isEmptyTQueue,+  ) where+import Control.Concurrent.STM.STMMonad+import Control.Monad (unless)++-- | 'TQueue' is an abstract type representing an unbounded FIFO channel.+--+-- @since 2.4+data TQueue a = TQueue {-# UNPACK #-} !(TVar [a])+                       {-# UNPACK #-} !(TVar [a])++instance Eq (TQueue a) where+  TQueue a _ == TQueue b _ = a == b++-- |Build and returns a new instance of 'TQueue'+newTQueue :: STM (TQueue a)+newTQueue = do+  read  <- newTVar []+  write <- newTVar []+  return (TQueue read write)++-- |@IO@ version of 'newTQueue'.  This is useful for creating top-level+-- 'TQueue's using 'System.IO.Unsafe.unsafePerformIO', because using+-- 'atomically' inside 'System.IO.Unsafe.unsafePerformIO' isn't+-- possible.+newTQueueIO :: IO (TQueue a)+newTQueueIO = do+  read  <- newTVarIO []+  write <- newTVarIO []+  return (TQueue read write)++-- |Write a value to a 'TQueue'.+writeTQueue :: TQueue a -> a -> STM ()+writeTQueue (TQueue _read write) a = do+  listend <- readTVar write+  writeTVar write (a:listend)++-- |Read the next value from the 'TQueue'.+readTQueue :: TQueue a -> STM a+readTQueue (TQueue read write) = do+  xs <- readTVar read+  case xs of+    (x:xs') -> do+      writeTVar read xs'+      return x+    [] -> do+      ys <- readTVar write+      case ys of+        [] -> retry+        _  -> do+          let (z:zs) = reverse ys -- NB. lazy: we want the transaction to be+                                  -- short, otherwise it will conflict+          writeTVar write []+          writeTVar read zs+          return z++-- | A version of 'readTQueue' which does not retry. Instead it+-- returns @Nothing@ if no value is available.+tryReadTQueue :: TQueue a -> STM (Maybe a)+tryReadTQueue c = fmap Just (readTQueue c) `orElse` return Nothing++-- | Efficiently read the entire contents of a 'TQueue' into a list. This+-- function never retries.+--+-- @since 2.4.5+flushTQueue :: TQueue a -> STM [a]+flushTQueue (TQueue read write) = do+  xs <- readTVar read+  ys <- readTVar write+  unless (null xs) $ writeTVar read []+  unless (null ys) $ writeTVar write []+  return (xs ++ reverse ys)++-- | Get the next value from the @TQueue@ without removing it,+-- retrying if the channel is empty.+peekTQueue :: TQueue a -> STM a+peekTQueue (TQueue read write) = do+  xs <- readTVar read+  case xs of+    (x:_) -> return x+    [] -> do+      ys <- readTVar write+      case ys of+        [] -> retry+        _  -> do+          let (z:zs) = reverse ys -- NB. lazy: we want the transaction to be+                                  -- short, otherwise it will conflict+          writeTVar write []+          writeTVar read (z:zs)+          return z++-- | A version of 'peekTQueue' which does not retry. Instead it+-- returns @Nothing@ if no value is available.+tryPeekTQueue :: TQueue a -> STM (Maybe a)+tryPeekTQueue c = do+  m <- tryReadTQueue c+  case m of+    Nothing -> return Nothing+    Just x  -> do+      unGetTQueue c x+      return m++-- |Put a data item back onto a channel, where it will be the next item read.+unGetTQueue :: TQueue a -> a -> STM ()+unGetTQueue (TQueue read _write) a = do+  xs <- readTVar read+  writeTVar read (a:xs)++-- |Returns 'True' if the supplied 'TQueue' is empty.+isEmptyTQueue :: TQueue a -> STM Bool+isEmptyTQueue (TQueue read write) = do+  xs <- readTVar read+  case xs of+    (_:_) -> return False+    [] -> do ys <- readTVar write+             case ys of+               [] -> return True+               _  -> return False
+ lib/Control/Concurrent/STM/TVar.hs view
@@ -0,0 +1,45 @@+module Control.Concurrent.STM.TVar (+        TVar,+        newTVar,+        newTVarIO,+        readTVar,+        readTVarIO,+        writeTVar,+        modifyTVar,+        modifyTVar',+        stateTVar,+        swapTVar,+  ) where+import Control.Concurrent.STM.STMMonad++modifyTVar :: TVar a -> (a -> a) -> STM ()+modifyTVar var f = do+    x <- readTVar var+    writeTVar var (f x)++modifyTVar' :: TVar a -> (a -> a) -> STM ()+modifyTVar' var f = do+    x <- readTVar var+    writeTVar var $! f x++stateTVar :: TVar s -> (s -> (a, s)) -> STM a+stateTVar var f = do+   s <- readTVar var+   let !(a, s') = f s+   writeTVar var s'+   return a++swapTVar :: TVar a -> a -> STM a+swapTVar var new = do+    old <- readTVar var+    writeTVar var new+    return old++readTVarIO :: TVar a -> IO a+readTVarIO = atomically . readTVar++{-+mkWeakTVar :: TVar a -> IO () -> IO (Weak (TVar a))+mkWeakTVar t@(TVar t#) (IO finalizer) = IO $ \s ->+    case mkWeak# t# t finalizer s of (# s1, w #) -> (# s1, Weak w #)+-}
lib/Control/DeepSeq.hs view
@@ -30,7 +30,9 @@ import Data.Ratio import Data.Real import Data.Tuple+import {-# SOURCE #-} Data.Typeable import Data.Word+import qualified Mhs.Array as Arr  infixl 4 <$!!> @@ -40,15 +42,12 @@ rwhnf :: a -> () rwhnf a = a `seq` () -instance NFData Float instance NFData Int8 instance NFData Int16 instance NFData Int32-instance NFData Int64 instance NFData Word8 instance NFData Word16 instance NFData Word32-instance NFData Word64  instance NFData (Proxy a) where rnf Proxy = () instance NFData1 Proxy where liftRnf _ Proxy = ()@@ -209,19 +208,19 @@ -- | @since 1.4.3.0 instance NFData2 Const where   liftRnf2 r _ = r . getConst+-} --- We should use MIN_VERSION array(0,5,1,1) but that's not possible.--- There isn't an underscore to not break C preprocessor-instance (NFData a, NFData b) => NFData (Array a b) where-  rnf x = rnf (bounds x, Data.Array.elems x)+instance (NFData a, NFData b) => NFData (Arr.Array a b) where+  rnf x = rnf (Arr.bounds x) `seq` rnf (Arr.elems x)  -- | @since 1.4.3.0-instance (NFData a) => NFData1 (Array a) where-  liftRnf r x = rnf (bounds x) `seq` liftRnf r (Data.Array.elems x)+instance (NFData a) => NFData1 (Arr.Array a) where+  liftRnf r x = rnf (Arr.bounds x) `seq` liftRnf r (Arr.elems x) +{- -- | @since 1.4.3.0 instance NFData2 Array where-  liftRnf2 r r' x = liftRnf2 r r (bounds x) `seq` liftRnf r' (Data.Array.elems x)+  liftRnf2 r r' x = liftRnf2 r r (Arr.bounds x) `seq` liftRnf r' (Arr.elems x)  -- | @since 1.4.0.0 instance NFData a => NFData (Down a) where rnf = rnf1
lib/Control/DeepSeq/Class.hs view
@@ -2,14 +2,13 @@ -- See LICENSE file for full license. module Control.DeepSeq.Class(module Control.DeepSeq.Class) where import qualified Prelude()-import Primitives(primSeq)+import Primitives import Data.Bool import Data.Char import Data.Eq-import Data.Double import Data.Either import Data.Function-import Data.Int+--import Data.Int.Int import Data.Integer import Data.Integral import Data.List_Type@@ -17,7 +16,7 @@ import Data.Ord import Data.Ratio import Data.Tuple-import Data.Word+--import Data.Word.Word import Mhs.Builtin  -- NFData class and instances for primitive types.@@ -39,7 +38,10 @@  instance NFData Int instance NFData Word+instance NFData Int64+instance NFData Word64 instance NFData Double+instance NFData Float instance NFData Char instance NFData Bool instance NFData Ordering
lib/Control/Error.hs view
@@ -1,27 +1,30 @@ -- Copyright 2023 Lennart Augustsson -- See LICENSE file for full license.-module Control.Error(error, errorWithoutStackTrace, undefined, ErrorCall(..)) where+module Control.Error(+  error, _errorLoc,+  undefined, _undefinedLoc,+  errorWithoutStackTrace,+  ) where import qualified Prelude()              -- do not import Prelude import Data.Char_Type-import Data.List_Type import Control.Exception.Internal-import {-# SOURCE #-} Data.Typeable-import Text.Show -newtype ErrorCall = ErrorCall String-  deriving (Typeable)--instance Show ErrorCall where-  show (ErrorCall s) = ("error: "::String) ++ s--instance Exception ErrorCall-+-- mhs compiler adds location of call and rewrites to _errorLoc error :: forall a . String -> a-error s = throw (ErrorCall s)+error = _errorLoc "" +-- mhs compiler adds location of call and rewrites to _undefinedLoc undefined :: forall a . a-undefined = error "undefined"+undefined = _undefinedLoc "" --- GHC compatibility+-- no location of call added+_errorLoc :: forall a . String -> String -> a+_errorLoc l s = throw (ErrorCallWithLocation s l)++-- no location of call added+_undefinedLoc :: forall a . String -> a+_undefinedLoc l = throw (ErrorCallWithLocation "undefined" l)++-- Error without location errorWithoutStackTrace :: forall a . String -> a-errorWithoutStackTrace = error+errorWithoutStackTrace = _errorLoc ""
lib/Control/Exception.hs view
@@ -3,7 +3,7 @@ module Control.Exception(   -- re-exports   throw,-  SomeException,+  SomeException(..),   Exception(..),   --   Handler(..), catches,@@ -14,6 +14,7 @@   bracket, finally, bracket_, bracketOnError,    try,+  tryJust,   throwIO,   onException,   displaySomeException,@@ -29,6 +30,7 @@   interruptible,   MaskingState(..),   getMaskingState,+  unsafeUnmask,    --   ArithException(..),@@ -36,9 +38,14 @@   asyncExceptionToException,   asyncExceptionFromException,   ---  BlockedIndefinitelyOnMVar(..),+  BlockedIndefinitelyOnMVar(..), blockedIndefinitelyOnMVar,+  BlockedIndefinitelyOnSTM(..), blockedIndefinitelyOnSTM,   --+  ErrorCall(..),+  --   ioError, IOException,+  --+  assert, assertError,   ) where import qualified Prelude(); import MiniPrelude import Control.Exception.Internal@@ -98,14 +105,12 @@ try :: forall a e . Exception e => IO a -> IO (Either e a) try ioa = catch (fmap Right ioa) (return . Left) +tryJust :: Exception e => (e -> Maybe b) -> IO a -> IO (Either b a)+tryJust p a = catchJust p (Right `fmap` a) (return . Left)+ {- bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c-bracket before after thing =-  mask $ \ restore -> do-    a <- before-    r <- restore (thing a) `onException` after a-    _ <- after a-    return r+-- defined in Control.Exception.Internal -}  mask_ :: IO a -> IO a@@ -140,14 +145,28 @@ deriving instance Eq   MaskingState deriving instance Show MaskingState ---------------------+blockedIndefinitelyOnMVar :: SomeException+blockedIndefinitelyOnMVar = toException BlockedIndefinitelyOnMVar -data BlockedIndefinitelyOnMVar = BlockedIndefinitelyOnMVar-  deriving (Typeable)+blockedIndefinitelyOnSTM :: SomeException -- for the RTS+blockedIndefinitelyOnSTM = toException BlockedIndefinitelyOnSTM -instance Exception BlockedIndefinitelyOnMVar+------------------- -instance Show BlockedIndefinitelyOnMVar where-    showsPrec _ BlockedIndefinitelyOnMVar = showString "thread blocked indefinitely in an MVar operation"+-- Assertions are ignored.+-- GHC has a flag to turn assert into assertError, MHS doesn't.+assert :: Bool -> a -> a+assert _pred r = r ------+assertError :: Bool -> a -> a+assertError predicate v+  | predicate = v+  | otherwise = throw (AssertionFailed "Assertion failed")++newtype AssertionFailed = AssertionFailed String++instance Exception AssertionFailed++instance Show AssertionFailed where+  showsPrec _ (AssertionFailed err) = showString err+    
lib/Control/Exception/Internal.hs view
@@ -10,9 +10,12 @@   patternMatchFail, noMethodError, recSelError, recConError,   AsyncException(..),   ArithException(..),-  SomeAsyncException,+  SomeAsyncException(..),   asyncExceptionToException,   asyncExceptionFromException,+  BlockedIndefinitelyOnMVar(..),+  BlockedIndefinitelyOnSTM(..),+  ErrorCall(ErrorCallWithLocation, ErrorCall),    uninterruptibleMask,   uninterruptibleMask_,@@ -68,6 +71,8 @@       else if primIntEQ n (2::Int) then SomeException ThreadKilled       else if primIntEQ n (3::Int) then SomeException UserInterrupt       else if primIntEQ n (4::Int) then SomeException DivideByZero+      else if primIntEQ n (5::Int) then SomeException BlockedIndefinitelyOnMVar+      else if primIntEQ n (6::Int) then SomeException BlockedIndefinitelyOnSTM       else e  -- Throw an exception when executed, not when evaluated@@ -91,7 +96,6 @@ ------------------  data SomeException = forall e . Exception e => SomeException e-  deriving (Typeable)  -- NOTE: The runtime system knows about this class. -- It uses displayException to show an uncaught exception.@@ -127,10 +131,18 @@ newtype RecSelError      = RecSelError      String deriving (Typeable) newtype RecConError      = RecConError      String deriving (Typeable) -instance Show PatternMatchFail where showsPrec _ (PatternMatchFail s) r = showString "no match at "     (showString s r)-instance Show NoMethodError    where showsPrec _ (NoMethodError    s) r = showString "no default for "  (showString s r)-instance Show RecSelError      where showsPrec _ (RecSelError      s) r = showString "no field "        (showString s r)-instance Show RecConError      where showsPrec _ (RecConError      s) r = showString "uninit field "    (showString s r)+instance Show PatternMatchFail where+  showsPrec _ (PatternMatchFail s) r = showString "Non-exhaustive patterns "+                                       (showString s r)+instance Show NoMethodError where+  showsPrec _ (NoMethodError    s) r = showString "No instance nor default method for class operation "+                                       (showString s r)+instance Show RecSelError where+  showsPrec _ (RecSelError      s) r = showString "No field "+                                       (showString s r)+instance Show RecConError where+  showsPrec _ (RecConError      s) r = showString "Missing field in record construction "+                                       (showString s r)  instance Exception PatternMatchFail instance Exception NoMethodError@@ -156,7 +168,16 @@   | DivideByZero   | Denormal   | RatioZeroDenominator-  deriving ({-Eq, Ord,-} Show, Typeable)  -- Eq, Ord in Exception module+  deriving ({-Eq, Ord,-} Typeable)  -- Eq, Ord in Exception module++instance Show ArithException where+  show Overflow             = "arithmetic overflow"+  show Underflow            = "arithmetic underflow"+  show LossOfPrecision      = "loss of precision"+  show DivideByZero         = "divide by zero"+  show Denormal             = "denormal"+  show RatioZeroDenominator = "Ratio has zero denominator"+ instance Exception ArithException  -------------------@@ -179,7 +200,6 @@   fromException = asyncExceptionFromException  data SomeAsyncException = forall e . Exception e => SomeAsyncException e-  deriving (Typeable)  instance Show SomeAsyncException where     showsPrec p (SomeAsyncException e) = showsPrec p e@@ -265,3 +285,33 @@     Unmasked              -> act     MaskedInterruptible   -> unsafeUnmask act     MaskedUninterruptible -> act+++--------------------++data BlockedIndefinitelyOnMVar = BlockedIndefinitelyOnMVar++instance Exception BlockedIndefinitelyOnMVar++instance Show BlockedIndefinitelyOnMVar where+  showsPrec _ BlockedIndefinitelyOnMVar = showString "thread blocked indefinitely in an MVar operation"++data BlockedIndefinitelyOnSTM = BlockedIndefinitelyOnSTM++instance Exception BlockedIndefinitelyOnSTM++instance Show BlockedIndefinitelyOnSTM where+  showsPrec _ BlockedIndefinitelyOnSTM = showString "thread blocked indefinitely in an STM transaction"++--------------------++data ErrorCall = ErrorCallWithLocation String String  -- message and location++instance Exception ErrorCall++instance Show ErrorCall where+  showsPrec _ (ErrorCallWithLocation s l) r = showString "error: " (showString l (showString s r))++pattern ErrorCall :: String -> ErrorCall+pattern ErrorCall s <- ErrorCallWithLocation s _+  where ErrorCall s = ErrorCallWithLocation s ""
lib/Control/Monad.hs view
@@ -48,6 +48,7 @@ import Data.Monoid.Internal import Data.Ord --import Data.Maybe+import {-# SOURCE #-} Data.Typeable  infixl 1 >>, >>=, =<< infixr 1 <=<, >=>
lib/Control/Monad/Fail.hs view
@@ -6,6 +6,7 @@ import Control.Monad import Data.Char import Data.List_Type+import {-# SOURCE #-} Data.Typeable  class Monad m => MonadFail m where   fail :: forall a . String -> m a
lib/Control/Monad/Fix.hs view
@@ -1,7 +1,10 @@ module Control.Monad.Fix(   MonadFix(..),+  _mfix,   fix,   ) where+import qualified Prelude()+import MiniPrelude import Control.Monad import Data.Function(fix) import Data.Functor.Identity@@ -11,6 +14,9 @@  class (Monad m) => MonadFix m where   mfix :: (a -> m a) -> m a++_mfix :: MonadFix m => (a -> m a) -> m a+_mfix = mfix  {- instance MonadFix Solo where
+ lib/Control/Monad/Fix.hs-boot view
@@ -0,0 +1,8 @@+module Control.Monad.Fix where+import qualified Prelude()+import Control.Monad++type MonadFix :: (Type -> Type) -> Constraint+class (Monad m) => MonadFix m where++_mfix :: MonadFix m => (a -> m a) -> m a
lib/Control/Monad/IO/Class.hs view
@@ -4,6 +4,7 @@ import Control.Applicative import Control.Monad import System.IO+import {-# SOURCE #-} Data.Typeable  class (Monad m) => MonadIO m where   liftIO :: IO a -> m a
lib/Control/Monad/ST.hs view
@@ -1,20 +1,36 @@ module Control.Monad.ST(   ST,   runST,+  --+  RealWorld, stToIO,  -- GHC compat   ) where import qualified Prelude(); import MiniPrelude import Primitives(primPerformIO)+import Control.Monad.Fix import Control.Monad.ST_Type+import System.IO(fixIO) -runST :: forall a . (forall s . ST s a) -> a+runST :: (forall s . ST s a) -> a runST (ST ioa) = primPerformIO ioa -instance forall s . Functor (ST s) where+instance Functor (ST s) where   fmap f (ST x) = ST (fmap f x) -instance forall s . Applicative (ST s) where+instance Applicative (ST s) where   pure x = ST (pure x)   ST x <*> ST y = ST (x <*> y) -instance forall s . Monad (ST s) where+instance Monad (ST s) where   ST x >>= f = ST (x >>= (unST . f))++instance MonadFix (ST s) where+  mfix f = ST (fixIO (unST . f))++---------------------------------+-- This does not belong here since it's GHC specific,+-- but to be compatible we do it the same way.++data RealWorld  -- Just to be compatible with GHC.  We don't use it.++stToIO :: forall a . ST RealWorld a -> IO a+stToIO = unST
+ lib/Control/Monad/ST/Unsafe.hs view
@@ -0,0 +1,20 @@+module Control.Monad.ST.Unsafe(+  unsafeInterleaveST,+  unsafeDupableInterleaveST,+  unsafeIOToST,+  unsafeSTToIO,+  ) where+import Control.Monad.ST_Type+import System.IO.Unsafe++unsafeInterleaveST :: ST s a -> ST s a+unsafeInterleaveST (ST io) = ST (unsafeInterleaveIO io)++unsafeDupableInterleaveST :: ST s a -> ST s a+unsafeDupableInterleaveST = unsafeInterleaveST++unsafeIOToST :: IO a -> ST s a+unsafeIOToST = ST++unsafeSTToIO :: ST s a -> IO a+unsafeSTToIO = unST
+ lib/Control/Monad/STM.hs view
@@ -0,0 +1,14 @@+module Control.Monad.STM(+  STM,+  atomically,+  retry,+  orElse,+  check,+  throwSTM,+  catchSTM,+  ) where+import Control.Monad+import Control.Concurrent.STM.STMMonad++check :: Bool -> STM ()+check b = unless b retry
lib/Control/Monad/ST_Type.hs view
@@ -8,7 +8,6 @@  -- The ST monad is implemented with the IO monad. newtype ST s a = ST (IO a)-  deriving (Typeable)  unST :: forall s a . ST s a -> IO a unST (ST io) = io
+ lib/Control/WrappedMonad.hs view
@@ -0,0 +1,34 @@+module Control.WrappedMonad(WrappedMonad(..), WrappedArrow(..)) where+import qualified Prelude(); import MiniPrelude+import Control.Applicative+import Control.Arrow+import Mhs.Builtin++newtype WrappedMonad m a = WrapMonad { unwrapMonad :: m a }+  deriving (Monad)++instance Monad m => Functor (WrappedMonad m) where+  fmap f (WrapMonad v) = WrapMonad (fmap f v)++instance Monad m => Applicative (WrappedMonad m) where+  pure = WrapMonad . pure+  WrapMonad f <*> WrapMonad v = WrapMonad (f `ap` v)+  liftA2 f (WrapMonad x) (WrapMonad y) = WrapMonad (liftM2 f x y)++instance MonadPlus m => Alternative (WrappedMonad m) where+  empty = WrapMonad mzero+  WrapMonad u <|> WrapMonad v = WrapMonad (u `mplus` v)++newtype WrappedArrow a b c = WrapArrow { unwrapArrow :: a b c }++instance Arrow a => Functor (WrappedArrow a b) where+  fmap f (WrapArrow a) = WrapArrow (a >>> arr f)++instance Arrow a => Applicative (WrappedArrow a b) where+  pure x = WrapArrow (arr (const x))+  liftA2 f (WrapArrow u) (WrapArrow v) =+    WrapArrow (u &&& v >>> arr (uncurry f))++instance (ArrowZero a, ArrowPlus a) => Alternative (WrappedArrow a b) where+  empty = WrapArrow zeroArrow+  WrapArrow u <|> WrapArrow v = WrapArrow (u <+> v)
+ lib/Control/WrappedMonad.hs-boot view
@@ -0,0 +1,6 @@+module Control.WrappedMonad where+import qualified Prelude()++newtype WrappedMonad m a = WrapMonad (m a)++newtype WrappedArrow a b c = WrapArrow (a b c)
− lib/Data/Array.hs
@@ -1,139 +0,0 @@-module Data.Array (-    module Data.Ix,-    Array,-    array,-    listArray,-    accumArray,-    (!),-    bounds,-    indices,-    elems,-    assocs,-    (//),-    accum,-    ixmap,-  ) where-import qualified Prelude()-import Primitives(primPerformIO, primArrCopy, primArrEQ)-import Control.Error-import Control.Monad-import Data.Bool-import Data.Char-import Data.Enum-import Data.Eq-import Data.Function-import Data.Functor-import Data.Int-import Data.Ix-import Data.IOArray-import Data.List-import Data.Num-import Data.Ord-import Data.Tuple-import System.IO-import Text.Show--data Array i a-   = Array (i,i)       -- bounds-           !Int        -- = (rangeSize (l,u))-           (IOArray a) -- elements--instance Ix a => Functor (Array a) where-  fmap f a@(Array b _ _) = array b [(i, f (a ! i)) | i <- range b]--instance (Ix a, Eq b)  => Eq (Array a b) where-  (==) (Array b1 _ a1) (Array b2 _ a2) = b1 == b2 && primArrEQ a1 a2--instance (Ix a, Ord b) => Ord (Array a b) where-  compare arr1 arr2 = compare (assocs arr1) (assocs arr2)--instance (Ix a, Show a, Show b) => Show (Array a b) where-  showsPrec p a =-    showParen (p > appPrec) $-    showString "array " .-    showsPrec appPrec1 (bounds a) .-    showChar ' ' .-    showsPrec appPrec1 (assocs a)----instance (Ix a, Read a, Read b) => Read (Array a b) where---  readsPrec = undefined--array :: (Ix a) => (a,a) -> [(a,b)] -> Array a b-array b ies =-  let n = safeRangeSize b-  in  unsafeArray' b n [(safeIndex b n i, e) | (i, e) <- ies]--listArray  :: (Ix a) => (a,a) -> [b] -> Array a b-listArray b es =-  let n = safeRangeSize b-  in  if length es > n then error "listArray: list too long" else unsafeArray' b n (zip [0..] es)--accumArray :: (Ix a) => (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b-accumArray f z b = accum f (array b [(i, z) | i <- range b])--(!) :: (Ix a) => Array a b -> a -> b-(!) (Array b n a) i = primPerformIO $ readIOArray a (safeIndex b n i)--bounds :: (Ix a) => Array a b -> (a,a)-bounds (Array b _ _) = b--indices :: (Ix a) => Array a b -> [a]-indices (Array b _ _) = range b--elems :: (Ix a) => Array a b -> [b]-elems (Array _ _ a) = primPerformIO $ elemsIOArray a--assocs :: (Ix a) => Array a b -> [(a,b)]-assocs a = zip (indices a) (elems a)--(//) :: (Ix a) => Array a b -> [(a,b)] -> Array a b-(//) (Array b n oa) ies = primPerformIO $ do-  a <- primArrCopy oa-  let adj (i, e) = writeIOArray a (safeIndex b n i) e-  mapM_ adj ies-  return $ Array b n a--accum :: (Ix a) => (b -> c -> b) -> Array a b -> [(a,c)] -> Array a b-accum f arr@(Array b n _) ies = unsafeAccum f arr [(safeIndex b n i, e) | (i, e) <- ies]--ixmap :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c -> Array a c-ixmap b f a = array b [(i, a ! f i) | i <- range b]-----------unsafeAccum :: (e -> a -> e) -> Array i e -> [(Int, a)] -> Array i e-unsafeAccum f (Array b n oa) ies = primPerformIO $ do-  a <- primArrCopy oa-  let adj (i, e) = do-        x <- readIOArray a i-        let x' = f x e-        seq x' (writeIOArray a i x')-  mapM_ adj ies-  return $ Array b n a--unsafeArray' :: (i,i) -> Int -> [(Int, e)] -> Array i e-unsafeArray' b n ies = primPerformIO $ do-  a <- newIOArray n arrEleBottom-  mapM_ (uncurry (writeIOArray a)) ies-  return $ Array b n a--arrEleBottom :: a-arrEleBottom = error "(Array.!): undefined array element"--safeIndex :: Ix i => (i, i) -> Int -> i -> Int-safeIndex (l,u) n i | 0 <= i' && i' < n = i'-                    | otherwise         = badSafeIndex i' n-  where i' = index (l,u) i--badSafeIndex :: Int -> Int -> a-badSafeIndex i n = error $ ("Error in array index; "::String) ++ show i ++ (" not in range [0.."::String) ++ show n ++ (")"::String)--safeRangeSize :: Ix i => (i, i) -> Int-safeRangeSize b =-  let r = rangeSize b-  in  if r < 0 then error "Negative range size" else r--elemsIOArray :: forall a . IOArray a -> IO [a]-elemsIOArray a = do-  s <- sizeIOArray a-  mapM (readIOArray a) [0::Int .. s - 1]
+ lib/Data/Array/Byte.hs view
@@ -0,0 +1,78 @@+-- Low level interface to byte arrays.+module Data.Array.Byte(+  ByteArray,+  sizeOfByteArray,+  newByteArray,+  indexWord8,+  byteArrayToByteString,+  byteStringToByteArray,+  withByteArrayPtr,++  MutableByteArray,+  sizeOfMutableByteArray,+  newMutableByteArray,+  freezeMutableByteArray,+  unsafeFreezeMutableByteArray,+  readWord8,+  writeWord8,+  withMutableByteArrayPtr,+  ) where+import Control.Monad.ST+import Control.Monad.ST_Type+import Data.ByteString as BS+import Data.ByteString.Internal(primBS2FPtr)+import Data.Word+import Foreign.ForeignPtr(withForeignPtr)+import Foreign.Ptr(Ptr, castPtr)++newtype ByteArray = A BS.ByteString+  deriving newtype (Eq, Ord, Show)++sizeOfByteArray :: ByteArray -> Int+sizeOfByteArray (A bs) = BS.length bs++newByteArray :: [Word8] -> ByteArray+newByteArray bs = A (BS.pack bs)++indexWord8 :: ByteArray -> Int -> Word8+indexWord8 (A bs) i = BS.index bs i++byteStringToByteArray :: BS.ByteString -> ByteArray+byteStringToByteArray bs = A bs++byteArrayToByteString :: ByteArray -> BS.ByteString+byteArrayToByteString (A bs) = bs++withByteArrayPtr :: ByteArray -> (Ptr Word8 -> IO a) -> IO a+withByteArrayPtr (A bs) act = withForeignPtr (primBS2FPtr bs) (act . castPtr)++----------------------------------------------------++-- Be careful about sequencing since the ByteString+-- operations have pure types.++newtype MutableByteArray s = M BS.ByteString++newMutableByteArray :: Int -> ST s (MutableByteArray s)+newMutableByteArray n = return $! M (BS.replicate n 0)++freezeMutableByteArray :: MutableByteArray s -> ST s ByteArray+freezeMutableByteArray (M bs) = return $! A (BS.copy bs)++writeWord8 :: MutableByteArray s -> Int -> Word8 -> ST s ()+writeWord8 (M bs) n b = ST (primBSwrite bs n b)++readWord8 :: MutableByteArray s -> Int -> ST s Word8+readWord8 (M bs) i = return $! BS.index bs i++sizeOfMutableByteArray :: MutableByteArray s -> ST s Int+sizeOfMutableByteArray (M bs) = return $! BS.length bs++primBSwrite :: BS.ByteString -> Int -> Word8 -> IO ()+primBSwrite = _primitive "bswrite"++unsafeFreezeMutableByteArray :: MutableByteArray s -> ST s ByteArray+unsafeFreezeMutableByteArray (M bs) = return (A bs)++withMutableByteArrayPtr :: MutableByteArray s -> (Ptr Word8 -> IO a) -> IO a+withMutableByteArrayPtr (M bs) act = withForeignPtr (primBS2FPtr bs) (act . castPtr)
lib/Data/Bifoldable.hs view
@@ -279,6 +279,9 @@   bifoldMap f _ (Left a) = f a   bifoldMap _ g (Right b) = g b +instance Bifoldable Arg where+  bifoldMap f g (Arg a b) = f a <> g b+ -- | As 'bifoldr', but strict in the result of the reduction functions at each -- step. --
+ lib/Data/Bifoldable1.hs view
@@ -0,0 +1,49 @@+-- |+-- Copyright: Edward Kmett, Oleg Grenrus+-- License: BSD-3-Clause+--++{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE Safe              #-}++module Data.Bifoldable1 where++import Control.Applicative (Const (..))+import Data.Bifoldable     (Bifoldable (..))+import Data.Semigroup      (Arg (..), Semigroup (..))+import Prelude             (Either (..), id)++class Bifoldable t => Bifoldable1 t where+     bifold1 :: Semigroup m => t m m -> m+     bifold1 = bifoldMap1 id id+     {-# INLINE bifold1 #-}++     bifoldMap1 :: Semigroup m => (a -> m) -> (b -> m) -> t a b -> m++instance Bifoldable1 Arg where+    bifoldMap1 f g (Arg a b) = f a <> g b++instance Bifoldable1 Either where+    bifoldMap1 f _ (Left a) = f a+    bifoldMap1 _ g (Right b) = g b+    {-# INLINE bifoldMap1 #-}++instance Bifoldable1 (,) where+    bifoldMap1 f g (a, b) = f a <> g b+    {-# INLINE bifoldMap1 #-}++instance Bifoldable1 ((,,) x) where+    bifoldMap1 f g (_,a,b) = f a <> g b+    {-# INLINE bifoldMap1 #-}++instance Bifoldable1 ((,,,) x y) where+    bifoldMap1 f g (_,_,a,b) = f a <> g b+    {-# INLINE bifoldMap1 #-}++instance Bifoldable1 ((,,,,) x y z) where+    bifoldMap1 f g (_,_,_,a,b) = f a <> g b+    {-# INLINE bifoldMap1 #-}++instance Bifoldable1 Const where+    bifoldMap1 f _ (Const a) = f a+    {-# INLINE bifoldMap1 #-}
lib/Data/Bifunctor.hs view
@@ -17,6 +17,7 @@   ( Bifunctor(..)   ) where import Control.Applicative  ( Const(..) )+import Data.Tuple.Instances  -- $setup -- >>> import Prelude@@ -141,7 +142,6 @@ -- -- @since 4.8.0.0 -{- instance Bifunctor (,) where     bimap f g ~(a, b) = (f a, g b) @@ -164,7 +164,6 @@ -- | @since 4.8.0.0 instance Bifunctor ((,,,,,,) x1 x2 x3 x4 x5) where     bimap f g ~(x1, x2, x3, x4, x5, a, b) = (x1, x2, x3, x4, x5, f a, g b)--}  -- | @since 4.8.0.0 instance Bifunctor Either where
lib/Data/Bits.hs view
@@ -1,138 +1,174 @@-module Data.Bits(module Data.Bits) where+module Data.Bits(+  Bits(..),+  FiniteBits(..),+  bitDefault,+  testBitDefault,+  popCountDefault,+  toIntegralSized,+  oneBits,+  (.^.),+  (.>>.), (.<<.), (!>>.), (!<<.),+  And(..), Ior(..), Xor(..), Iff(..),+  ) where import qualified Prelude()              -- do not import Prelude-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-  isSigned          :: a -> Bool--  x `shift`   i | i<0       = x `shiftR` (- i)-                | i>0       = x `shiftL` i-                | otherwise = x+import MiniPrelude+import Data.Bits.Base+import Data.Bounded+import Data.List as List+import Mhs.Builtin +oneBits :: (FiniteBits a) => a+oneBits = complement zeroBits -  x `rotate`  i | i<0       = x `rotateR` (- i)-                | i>0       = x `rotateL` i-                | otherwise = x+infixl 6 .^.+(.^.) :: (Bits a) => a -> a -> a+(.^.) = xor -  {--  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))-  -}+infixl 8 .>>.+(.>>.) :: (Bits a) => a -> Int -> a+(.>>.) = shiftR -  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+infixl 8 .<<.+(.<<.) :: (Bits a) => a -> Int -> a+(.<<.) = shiftL -  x `shiftL`  i       = x `shift`  i-  x `unsafeShiftL` i  = x `shiftL` i-  x `shiftR`  i       = x `shift`  (- i)-  x `unsafeShiftR` i  = x `shiftR` i+infixl 8 !>>.+(!>>.) :: (Bits a) => a -> Int -> a+(!>>.) = unsafeShiftR -  x `rotateL` i       = x `rotate` i+infixl 8 !<<.+(!<<.) :: (Bits a) => a -> Int -> a+(!<<.) = unsafeShiftL -  x `rotateR` i       = x `rotate` (- i)+-------- +newtype And a = And { getAnd :: a }+  deriving newtype (+                    Bounded, -- ^ @since base-4.16+                    Enum, -- ^ @since base-4.16+                    Bits, -- ^ @since base-4.16+                    FiniteBits, -- ^ @since base-4.16+                    Eq -- ^ @since base-4.16+                    )+  deriving stock (+                  Show, -- ^ @since base-4.16+                  Read -- ^ @since base-4.16+                 ) -class Bits b => FiniteBits b where-  finiteBitSize :: b -> Int-  countLeadingZeros :: b -> Int-  countTrailingZeros :: b -> Int+-- | @since base-4.16+instance (Bits a) => Semigroup (And a) where+  And x <> And y = And (x .&. y) -  countLeadingZeros x = (w - 1) - go (w - 1)-    where-      go i | i < 0       = i -- no bit set-           | testBit x i = i-           | otherwise   = go (i - 1)+-- | This constraint is arguably too strong. However,+-- as some types (such as 'Natural') have undefined 'complement', this is the+-- only safe choice.+--+-- @since base-4.16+instance (FiniteBits a) => Monoid (And a) where+  mempty = And oneBits+  -- By default, we would get a lazy right fold. This forces the use of a strict+  -- left fold instead.+  mconcat = List.foldl' (<>) mempty+  {-# INLINE mconcat #-} -      w = finiteBitSize x+-- | Monoid under bitwise inclusive OR.+--+-- >>> getIor (Ior 0xab <> Ior 0x12) :: Word8+-- 187+--+-- @since base-4.16+newtype Ior a = Ior { getIor :: a }+  deriving newtype (+                    Bounded, -- ^ @since base-4.16+                    Enum, -- ^ @since base-4.16+                    Bits, -- ^ @since base-4.16+                    FiniteBits, -- ^ @since base-4.16+                    Eq -- ^ @since base-4.16+                    )+  deriving stock (+                  Show, -- ^ @since base-4.16+                  Read -- ^ @since base-4.16+                 ) -  countTrailingZeros x = go 0-    where-      go i | i >= w      = i-           | testBit x i = i-           | otherwise   = go (i + 1)+-- | @since base-4.16+instance (Bits a) => Semigroup (Ior a) where+  Ior x <> Ior y = Ior (x .|. y) -      w = finiteBitSize x+-- | @since base-4.16+instance (Bits a) => Monoid (Ior a) where+  mempty = Ior zeroBits+  -- By default, we would get a lazy right fold. This forces the use of a strict+  -- left fold instead.+  mconcat = List.foldl' (<>) mempty+  {-# INLINE mconcat #-} -bitDefault :: (Bits a, Num a) => Int -> a-bitDefault i = 1 `shiftL` i+-- | Monoid under bitwise XOR.+--+-- >>> getXor (Xor 0xab <> Xor 0x12) :: Word8+-- 185+--+-- @since base-4.16+newtype Xor a = Xor { getXor :: a }+  deriving newtype (+                    Bounded, -- ^ @since base-4.16+                    Enum, -- ^ @since base-4.16+                    Bits, -- ^ @since base-4.16+                    FiniteBits, -- ^ @since base-4.16+                    Eq -- ^ @since base-4.16+                    )+  deriving stock (+                  Show, -- ^ @since base-4.16+                  Read -- ^ @since base-4.16+                 ) -testBitDefault :: (Bits a, Num a) => a -> Int -> Bool-testBitDefault x i = (x .&. bit i) /= 0+-- | @since base-4.16+instance (Bits a) => Semigroup (Xor a) where+  Xor x <> Xor y = Xor (x `xor` y) -popCountDefault :: (Bits a, Num a) => a -> Int-popCountDefault = go 0-  where-    go c 0 = c-    go c w = go (c + 1) (w .&. (w - 1)) -- clear the least significant bit+-- | @since base-4.16+instance (Bits a) => Monoid (Xor a) where+  mempty = Xor zeroBits+  -- By default, we would get a lazy right fold. This forces the use of a strict+  -- left fold instead.+  mconcat = List.foldl' (<>) mempty+  {-# INLINE mconcat #-} -_overflowError :: a-_overflowError = error "arithmetic overflow"+-- | Monoid under bitwise \'equality\'; defined as @1@ if the corresponding+-- bits match, and @0@ otherwise.+--+-- >>> getIff (Iff 0xab <> Iff 0x12) :: Word8+-- 70+--+-- @since base-4.16+newtype Iff a = Iff { getIff :: a }+  deriving newtype (+                    Bounded, -- ^ @since base-4.16+                    Enum, -- ^ @since base-4.16+                    Bits, -- ^ @since base-4.16+                    FiniteBits, -- ^ @since base-4.16+                    Eq -- ^ @since base-4.16+                    )+  deriving stock (+                  Show, -- ^ @since base-4.16+                  Read -- ^ @since base-4.16+                 ) -instance Bits Int where-  (.&.) = primIntAnd-  (.|.) = primIntOr-  xor   = primIntXor-  complement = primIntInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= _wordSize = 0-    | otherwise = x `primIntShl` i-  unsafeShiftL = primIntShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= _wordSize = 0-    | otherwise = x `primIntShr` i-  unsafeShiftR = primIntShr-  bitSizeMaybe _ = Just _wordSize-  bitSize _ = _wordSize-  bit = bitDefault-  testBit = testBitDefault-  popCount = primIntPopcount-  zeroBits = 0-  isSigned _ = True+-- | This constraint is arguably+-- too strong. However, as some types (such as 'Natural') have undefined+-- 'complement', this is the only safe choice.+--+-- @since base-4.16+instance (FiniteBits a) => Semigroup (Iff a) where+  Iff x <> Iff y = Iff . complement $ (x `xor` y) -instance FiniteBits Int where-  finiteBitSize _ = _wordSize-  countLeadingZeros = primIntClz-  countTrailingZeros = primIntCtz+-- | This constraint is arguably+-- too strong. However, as some types (such as 'Natural') have undefined+-- 'complement', this is the only safe choice.+--+-- @since base-4.16+instance (FiniteBits a) => Monoid (Iff a) where+  mempty = Iff oneBits+  -- By default, we would get a lazy right fold. This forces the use of a strict+  -- left fold instead.+  mconcat = List.foldl' (<>) mempty+  {-# INLINE mconcat #-}
+ lib/Data/Bits/Base.hs view
@@ -0,0 +1,192 @@+module Data.Bits.Base(module Data.Bits.Base) where+import qualified Prelude()              -- do not import Prelude+import Primitives+import Control.Error+import Data.Bool+import Data.Eq+import Data.Function+import Data.Int.Int+import Data.Integral+import Data.Maybe+import Data.Ord+import Data.Num+import {-# SOURCE #-} Data.Typeable+import Text.Show++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+  isSigned          :: a -> Bool++  x `shift`   i | i<0       = x `shiftR` (- i)+                | i>0       = x `shiftL` i+                | otherwise = x+++  x `rotate`  i | i<0       = x `rotateR` (- 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`  (- i)+  x `unsafeShiftR` i  = x `shiftR` i++  x `rotateL` i       = x `rotate` i++  x `rotateR` i       = x `rotate` (- 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++bitDefault :: (Bits a, Num a) => Int -> a+bitDefault i = 1 `shiftL` i++testBitDefault :: (Bits a, Num a) => a -> Int -> Bool+testBitDefault x i = (x .&. bit i) /= 0++popCountDefault :: (Bits a, Num a) => a -> Int+popCountDefault = go 0+  where+    go c 0 = c+    go c w = go (c + 1) (w .&. (w - 1)) -- clear the least significant bit++_overflowError :: a+_overflowError = error "arithmetic overflow"++instance Bits Int where+  (.&.) = primIntAnd+  (.|.) = primIntOr+  xor   = primIntXor+  complement = primIntInv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= _wordSize = 0+    | otherwise = x `primIntShl` i+  unsafeShiftL = primIntShl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= _wordSize = 0+    | otherwise = x `primIntShr` i+  unsafeShiftR = primIntShr+  bitSizeMaybe _ = Just _wordSize+  bitSize _ = _wordSize+  bit = bitDefault+  testBit = testBitDefault+  popCount = primIntPopcount+  zeroBits = 0+  isSigned _ = True++instance FiniteBits Int where+  finiteBitSize _ = _wordSize+  countLeadingZeros = primIntClz+  countTrailingZeros = primIntCtz++toIntegralSized :: (Integral a, Integral b, Bits a, Bits b) => a -> Maybe b+toIntegralSized x+  | maybe True (<= x) yMinBound+  , maybe True (x <=) yMaxBound = Just y+  | otherwise                   = Nothing+  where+    y = fromIntegral x++    xWidth = bitSizeMaybe x+    yWidth = bitSizeMaybe y++    yMinBound+      | isBitSubType x y = Nothing+      | isSigned x, not (isSigned y) = Just 0+      | isSigned x, isSigned y+      , Just yW <- yWidth = Just (negate $ bit (yW-1))+      | otherwise = Nothing++    yMaxBound+      | isBitSubType x y = Nothing+      | isSigned x, not (isSigned y)+      , Just xW <- xWidth, Just yW <- yWidth+      , xW <= yW+1 = Nothing+      | Just yW <- yWidth = if isSigned y+                            then Just (bit (yW-1)-1)+                            else Just (bit yW-1)+      | otherwise = Nothing++isBitSubType :: (Bits a, Bits b) => a -> b -> Bool+isBitSubType x y+  -- Reflexive+  | xWidth == yWidth, xSigned == ySigned = True++  -- Every integer is a subset of 'Integer'+  | ySigned, isNothing yWidth                  = True+  | not xSigned, not ySigned, isNothing yWidth = True++  -- Sub-type relations between fixed-with types+  | xSigned == ySigned,   Just xW <- xWidth, Just yW <- yWidth = xW <= yW+  | not xSigned, ySigned, Just xW <- xWidth, Just yW <- yWidth = xW <  yW++  | otherwise = False+  where+    xWidth  = bitSizeMaybe x+    xSigned = isSigned     x++    yWidth  = bitSizeMaybe y+    ySigned = isSigned     y+
lib/Data/Bool_Type.hs view
@@ -3,3 +3,5 @@ module Data.Bool_Type(module Data.Bool_Type) where import qualified Prelude()              -- do not import Prelude data Bool = False | True+  deriving ()  -- avoid deriving Typeable+
lib/Data/Bounded.hs view
@@ -1,6 +1,7 @@ module Data.Bounded(module Data.Bounded) where import qualified Prelude()              -- do not import Prelude import Primitives+import {-# SOURCE #-} Data.Typeable  class Bounded a where   minBound :: a
lib/Data/ByteString.hs view
@@ -152,31 +152,38 @@   hPutNonBlocking,   hPutStr,   ) where+ import qualified Prelude() import MiniPrelude as P hiding(null, length) import qualified Data.List as P+ import Control.Exception (evaluate)-import Data.List.NonEmpty (NonEmpty, fromList)-import Data.Bits+import Control.Monad.Fail+import Data.Bits.Base+import Data.ByteString.Internal+import Data.Coerce import Data.Function (($!))+import Data.List.NonEmpty (NonEmpty, fromList) import Data.Monoid.Internal import Data.Semigroup import Data.String-import Data.Word (Word8)+import Data.Word.Word8(Word8) import Foreign.C.String (CString, CStringLen) import Foreign.C.Types (CChar)-import Foreign.Ptr (Ptr)-import System.IO (Handle, IOMode(..), hClose, openFile, stdin, stdout)-import qualified System.IO as P-import System.IO.Internal (BFILE, withHandleRd, withHandleWr) import Foreign.ForeignPtr-import Data.ByteString.Internal+import Foreign.Marshal.Alloc (allocaBytes)+import Foreign.Marshal.Utils (copyBytes)+import Foreign.Ptr (Ptr, castPtr)+import Foreign.Storable (pokeByteOff)+import System.IO.Base(Handle, IOMode(..), hClose, openFile, stdin, stdout)+import qualified System.IO.Base as P+import System.IO.Internal(BFILE, withHandleRd, withHandleWr)+import qualified Text.Read.Lex as L+import Text.Read  foreign import ccall "readb" c_readb :: CString -> Int -> Ptr BFILE -> IO Int foreign import ccall "writeb" c_writeb :: CString -> Int -> Ptr BFILE -> IO Int -type StrictByteString = ByteString- bsUnimp :: String -> a bsUnimp s = P.error $ "Data.ByteString." P.++ s P.++ " unimplemented" @@ -377,16 +384,16 @@ dropWhileEnd f = pack . P.dropWhileEnd f . unpack  break :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)-break p bs = (takeWhile p bs, dropWhile p bs)+break p = span (not . p)  breakEnd :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)-breakEnd  p bs = (takeWhileEnd p bs, dropWhileEnd p bs)+breakEnd p = spanEnd (not . p)  span :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)-span p = break (not . p)+span p bs = (takeWhile p bs, dropWhile p bs)  spanEnd :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)-spanEnd p = breakEnd (not . p)+spanEnd p bs = (dropWhileEnd p bs, takeWhileEnd p bs)  splitWith :: (Word8 -> Bool) -> ByteString -> [ByteString] splitWith w = P.map pack . P.splitWith w . unpack@@ -530,11 +537,14 @@  useAsCString :: ByteString -> (CString -> IO a) -> IO a useAsCString bs act =-  withForeignPtr (primBS2FPtr bs) act+  allocaBytes (l + 1) $ \buf -> do+    withForeignPtr (primBS2FPtr bs) $ \p -> copyBytes buf p l+    pokeByteOff buf l (0 :: Word8)+    act (castPtr buf)+  where l = length bs  useAsCStringLen :: ByteString -> (CStringLen -> IO a) -> IO a-useAsCStringLen bs act =-  withForeignPtr (primBS2FPtr bs) $ \p -> act (p, length bs)+useAsCStringLen bs act = useAsCString bs $ \cstr -> act (cstr, length bs)  packCString :: CString -> IO ByteString packCString = primPackCString@@ -551,6 +561,8 @@ hGetLine :: Handle -> IO ByteString hGetLine = fmap fromString . P.hGetLine +-- XXX this is wrong if the handle is set to do UTF8 encoding.+-- We should write raw bytes hPut :: Handle -> ByteString -> IO () hPut h bs =   withHandleWr h $ \bfile ->@@ -618,3 +630,10 @@   h <- openFile f AppendMode   hPut h bs   hClose h++instance Read ByteString where+  readPrec =+    parens+    ( do L.String s <- lexP     -- Looks for "foo"+         return (pack (coerce s))+    )
+ lib/Data/ByteString/Builder.hs view
@@ -0,0 +1,178 @@+module Data.ByteString.Builder+    ( Builder+    , toLazyByteString+    , hPutBuilder+    , writeFile++    , byteString+    , lazyByteString+    , shortByteString+    , int8+    , word8++    , int16BE+    , int32BE+    , int64BE++    , word16BE+    , word32BE+    , word64BE++    , floatBE+    , doubleBE++    , int16LE+    , int32LE+    , int64LE++    , word16LE+    , word32LE+    , word64LE++    , floatLE+    , doubleLE++    , char7+    , string7++    , char8+    , string8++    , charUtf8+    , stringUtf8++    , module Data.ByteString.Builder.ASCII+    , module Data.ByteString.Builder.RealFloat+    ) where++import qualified Prelude ()+import MiniPrelude++import Data.Bits+import Data.ByteString.Builder.Internal+import Data.ByteString.Lazy as L+import Data.ByteString.Short.Internal (ShortByteString, fromShort)+import Data.Char (ord)+import qualified Data.List as List+import Data.Int+import Data.Word+import Data.Word.Word8 (intToWord8)+import Numeric.Show (showHex)+import Primitives+import System.IO.Internal+import Unsafe.Coerce (unsafeCoerce)++import Data.ByteString.Builder.ASCII+import Data.ByteString.Builder.RealFloat++hPutBuilder :: Handle -> Builder -> IO ()+hPutBuilder h = hPut h . toLazyByteString++writeFile :: FilePath -> Builder -> IO ()+writeFile f = L.writeFile f . toLazyByteString++shortByteString :: ShortByteString -> Builder+shortByteString = byteString . fromShort++int8 :: Int8 -> Builder+int8 = word8 . fromIntegral++word8 :: Word8 -> Builder+word8 w = lazyByteString $ pack [w]++int16BE :: Int16 -> Builder+int16BE = word16BE . fromIntegral++int32BE :: Int32 -> Builder+int32BE = word32BE . fromIntegral++int64BE :: Int64 -> Builder+int64BE = word64BE . fromIntegral++word16BE :: Word16 -> Builder+word16BE w = lazyByteString $ pack+    [ fromIntegral ((w `shiftR` 8) .&. 0xff)+    , fromIntegral (w .&. 0xff)+    ]++word32BE :: Word32 -> Builder+word32BE w = lazyByteString $ pack+    [ fromIntegral ((w `shiftR` 24) .&. 0xff)+    , fromIntegral ((w `shiftR` 16) .&. 0xff)+    , fromIntegral ((w `shiftR` 8) .&. 0xff)+    , fromIntegral (w .&. 0xff)+    ]++word64BE :: Word64 -> Builder+word64BE w = lazyByteString $ pack+    [ fromIntegral ((w `shiftR` 56) .&. 0xff)+    , fromIntegral ((w `shiftR` 48) .&. 0xff)+    , fromIntegral ((w `shiftR` 40) .&. 0xff)+    , fromIntegral ((w `shiftR` 32) .&. 0xff)+    , fromIntegral ((w `shiftR` 24) .&. 0xff)+    , fromIntegral ((w `shiftR` 16) .&. 0xff)+    , fromIntegral ((w `shiftR` 8) .&. 0xff)+    , fromIntegral (w .&. 0xff)+    ]++floatBE :: Float -> Builder+floatBE = word32BE . unsafeCoerce . primWordFromFloatRaw++doubleBE :: Double -> Builder+doubleBE = word64BE . primWord64FromDoubleRaw++int16LE :: Int16 -> Builder+int16LE = word16LE . fromIntegral++int32LE :: Int32 -> Builder+int32LE = word32LE . fromIntegral++int64LE :: Int64 -> Builder+int64LE = word64LE . fromIntegral++word16LE :: Word16 -> Builder+word16LE w = lazyByteString $ pack+    [ fromIntegral (w .&. 0xff)+    , fromIntegral ((w `shiftR` 8) .&. 0xff)+    ]++word32LE :: Word32 -> Builder+word32LE w = lazyByteString $ pack+    [ fromIntegral (w .&. 0xff)+    , fromIntegral ((w `shiftR` 8) .&. 0xff)+    , fromIntegral ((w `shiftR` 16) .&. 0xff)+    , fromIntegral ((w `shiftR` 24) .&. 0xff)+    ]++word64LE :: Word64 -> Builder+word64LE w = lazyByteString $ pack+    [ fromIntegral (w .&. 0xff)+    , fromIntegral ((w `shiftR` 8) .&. 0xff)+    , fromIntegral ((w `shiftR` 16) .&. 0xff)+    , fromIntegral ((w `shiftR` 24) .&. 0xff)+    , fromIntegral ((w `shiftR` 32) .&. 0xff)+    , fromIntegral ((w `shiftR` 40) .&. 0xff)+    , fromIntegral ((w `shiftR` 48) .&. 0xff)+    , fromIntegral ((w `shiftR` 56) .&. 0xff)+    ]++floatLE :: Float -> Builder+floatLE = word32LE . unsafeCoerce . primWordFromFloatRaw++doubleLE :: Double -> Builder+doubleLE = word64LE . primWord64FromDoubleRaw++char7 :: Char -> Builder+char7 c = word8 (intToWord8 (ord c .&. 0x7f))++string7 :: String -> Builder+string7 = lazyByteString . pack . List.map (\c -> intToWord8 (ord c .&. 0x7f))++char8 :: Char -> Builder+char8 c = word8 (intToWord8 (ord c .&. 0xff))++string8 :: String -> Builder+string8 = lazyByteString . pack . List.map (\c -> intToWord8 (ord c .&. 0xff))++charUtf8 :: Char -> Builder+charUtf8 c = stringUtf8 [c]
+ lib/Data/ByteString/Builder/ASCII.hs view
@@ -0,0 +1,136 @@+module Data.ByteString.Builder.ASCII where++import qualified Prelude ()+import MiniPrelude++import Data.Bits+import Data.ByteString.Builder.Internal+import Data.ByteString.Internal (StrictByteString)+import qualified Data.ByteString.Internal as S+import Data.ByteString.Lazy.Internal (LazyByteString, packChars, unpackBytes)+import Data.Char+import Data.Int+import Data.Integer+import Data.Word+import Data.Word.Word8 (word8ToInt)+import Numeric.Show (showHex)+import Primitives+import Unsafe.Coerce (unsafeCoerce)++int8Dec :: Int8 -> Builder+int8Dec = stringUtf8 . show++int16Dec :: Int16 -> Builder+int16Dec = stringUtf8 . show++int32Dec :: Int32 -> Builder+int32Dec = stringUtf8 . show++int64Dec :: Int64 -> Builder+int64Dec = stringUtf8 . show++intDec :: Int -> Builder+intDec = stringUtf8 . show++integerDec :: Integer -> Builder+integerDec = stringUtf8 . show++word8Dec :: Word8 -> Builder+word8Dec = stringUtf8 . show++word16Dec :: Word16 -> Builder+word16Dec = stringUtf8 . show++word32Dec :: Word32 -> Builder+word32Dec = stringUtf8 . show++word64Dec :: Word64 -> Builder+word64Dec = stringUtf8 . show++wordDec :: Word -> Builder+wordDec = stringUtf8 . show++word8Hex :: Word8 -> Builder+word8Hex w = stringUtf8 (showHex w "")++word16Hex :: Word16 -> Builder+word16Hex w = stringUtf8 (showHex w "")++word32Hex :: Word32 -> Builder+word32Hex w = stringUtf8 (showHex w "")++word64Hex :: Word64 -> Builder+word64Hex w = stringUtf8 (showHex w "")++wordHex :: Word -> Builder+wordHex w = stringUtf8 (showHex w "")++int8HexFixed :: Int8 -> Builder+int8HexFixed = word8HexFixed . fromIntegral++int16HexFixed :: Int16 -> Builder+int16HexFixed = word16HexFixed . fromIntegral++int32HexFixed :: Int32 -> Builder+int32HexFixed = word32HexFixed . fromIntegral++int64HexFixed :: Int64 -> Builder+int64HexFixed = word64HexFixed . fromIntegral++word8HexFixed :: Word8 -> Builder+word8HexFixed w = stringUtf8+    [ intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 4) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce (w .&. 0xf)+    ]++word16HexFixed :: Word16 -> Builder+word16HexFixed w = stringUtf8+    [ intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 12) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 8) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 4) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce (w .&. 0xf)+    ]++word32HexFixed :: Word32 -> Builder+word32HexFixed w = stringUtf8+    [ intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 28) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 24) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 20) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 16) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 12) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 8) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce ((w `shiftR` 4) .&. 0xf)+    , intToDigit . primWordToInt $ unsafeCoerce (w .&. 0xf)+    ]++word64HexFixed :: Word64 -> Builder+word64HexFixed w = stringUtf8+    [ intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 60) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 56) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 52) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 48) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 44) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 40) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 36) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 32) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 28) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 24) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 20) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 16) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 12) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 8) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord ((w `shiftR` 4) .&. 0xf)+    , intToDigit . primWordToInt $ primWord64ToWord (w .&. 0xf)+    ]++floatHexFixed :: Float -> Builder+floatHexFixed = word32HexFixed . unsafeCoerce . primWordFromFloatRaw++doubleHexFixed :: Double -> Builder+doubleHexFixed = word64HexFixed . primWord64FromDoubleRaw++byteStringHex :: StrictByteString -> Builder+byteStringHex = stringUtf8 . concatMap (\w -> [intToDigit $ word8ToInt ((w `shiftR` 4) .&. 0xf), intToDigit $ word8ToInt (w .&. 0xf)]) . S.unpack++lazyByteStringHex :: LazyByteString -> Builder+lazyByteStringHex = stringUtf8 . concatMap (\w -> [intToDigit $ word8ToInt ((w `shiftR` 4) .&. 0xf), intToDigit $ word8ToInt (w .&. 0xf)]) . unpackBytes
+ lib/Data/ByteString/Builder/Extra.hs view
@@ -0,0 +1,55 @@+module Data.ByteString.Builder.Extra where++import qualified Prelude ()+import MiniPrelude++import Control.Monad.ST+import Data.ByteString.Builder+import Data.ByteString.Builder.Internal+import Data.Double+import Data.Float+import Data.Int+import Data.Word+import Foreign.Storable+import Mhs.MutUArr+import Mhs.UArr++flush :: Builder+flush = Builder id++host :: (Storable a) => a -> Builder+host x = runST $ do+    arr <- newMutSTUArr 1+    unsafeWriteMutSTUArr arr 0 x+    UArr bs <- unsafeFreezeMutSTUArr arr+    pure (byteString bs)++intHost :: Int -> Builder+intHost = host++int16Host :: Int16 -> Builder+int16Host = host++int32Host :: Int32 -> Builder+int32Host = host++int64Host :: Int64 -> Builder+int64Host = host++wordHost :: Word -> Builder+wordHost = host++word16Host :: Word16 -> Builder+word16Host = host++word32Host :: Word32 -> Builder+word32Host = host++word64Host :: Word64 -> Builder+word64Host = host++floatHost :: Float -> Builder+floatHost = host++doubleHost :: Double -> Builder+doubleHost = host
+ lib/Data/ByteString/Builder/Internal.hs view
@@ -0,0 +1,33 @@+module Data.ByteString.Builder.Internal where++import qualified Prelude ()+import MiniPrelude++import Data.ByteString.Internal (StrictByteString)+import Data.ByteString.Lazy (LazyByteString, append, empty, fromStrict)++newtype Builder = Builder (LazyByteString -> LazyByteString)++instance Semigroup Builder where+    Builder f <> Builder g = Builder (f . g)++instance Monoid Builder where+    mempty = Builder id++instance IsString Builder where+    fromString = stringUtf8++instance Show Builder where+    show = show . toLazyByteString++toLazyByteString :: Builder -> LazyByteString+toLazyByteString (Builder f) = f empty++byteString :: StrictByteString -> Builder+byteString bs = Builder (fromStrict bs `append`)++lazyByteString :: LazyByteString -> Builder+lazyByteString bs = Builder (bs `append`)++stringUtf8 :: String -> Builder+stringUtf8 = byteString . _primitive "toUTF8"
+ lib/Data/ByteString/Builder/RealFloat.hs view
@@ -0,0 +1,49 @@+module Data.ByteString.Builder.RealFloat where++import qualified Prelude ()+import MiniPrelude++import Data.ByteString.Builder.Internal+import Data.Double+import Data.Float+import Numeric.FormatFloat++floatDec :: Float -> Builder+floatDec = formatFloat generic++doubleDec :: Double -> Builder+doubleDec = formatDouble generic++formatFloat :: FloatFormat -> Float -> Builder+formatFloat (MkFloatFormat fmt prec) f =+  stringUtf8 $ case fmt of+    FScientific -> showEFloat prec f ""+    FStandard -> showFFloat prec f ""+    FGeneric -> showGFloat prec f ""++formatDouble :: FloatFormat -> Double -> Builder+formatDouble (MkFloatFormat fmt prec) d =+  stringUtf8 $ case fmt of+    FScientific -> showEFloat prec d ""+    FStandard -> showFFloat prec d ""+    FGeneric -> showGFloat prec d ""++data FloatFormat = MkFloatFormat FormatMode (Maybe Int)++standard :: Int -> FloatFormat+standard n = MkFloatFormat FStandard (Just n)++standardDefaultPrecision :: FloatFormat+standardDefaultPrecision = MkFloatFormat FStandard Nothing++scientific :: FloatFormat+scientific = MkFloatFormat FScientific Nothing++generic :: FloatFormat+generic = MkFloatFormat FGeneric Nothing++data FormatMode+  = FScientific     -- ^ scientific notation+  | FStandard       -- ^ standard notation with `Maybe Int` digits after the decimal+  | FGeneric        -- ^ dispatches to scientific or standard notation based on the exponent+  deriving Show
lib/Data/ByteString/Char8.hs view
@@ -1,325 +1,491 @@-module Data.ByteString.Char8(module Data.ByteString.Char8) where-import qualified Data.ByteString as B-import Data.Coerce-import Data.List.NonEmpty-import Data.Word(Word8)-import Foreign.C.String(CString, CStringLen)-import System.IO(Handle)+-- |+-- Module      : Data.ByteString.Char8+-- Copyright   : (c) Don Stewart 2006-2008+--               (c) Duncan Coutts 2006-2011+-- License     : BSD-style+--+-- Maintainer  : dons00@gmail.com, duncan@community.haskell.org+-- Stability   : stable+-- Portability : portable+--+-- Manipulate 'ByteString's using 'Char' operations. All Chars will be+-- truncated to 8 bits. It can be expected that these functions will run+-- at identical speeds to their 'Word8' equivalents in "Data.ByteString".+--+-- More specifically these byte strings are taken to be in the+-- subset of Unicode covered by code points 0-255. This covers+-- Unicode Basic Latin, Latin-1 Supplement and C0+C1 Controls.+--+-- See:+--+--  * <http://www.unicode.org/charts/>+--+--  * <http://www.unicode.org/charts/PDF/U0000.pdf>+--+--  * <http://www.unicode.org/charts/PDF/U0080.pdf>+--+-- This module is intended to be imported @qualified@, to avoid name+-- clashes with "Prelude" functions.  eg.+--+-- > import qualified Data.ByteString.Char8 as C+--+-- The Char8 interface to bytestrings provides an instance of IsString+-- for the ByteString type, enabling you to use string literals, and+-- have them implicitly packed to ByteStrings.+-- Use @{-\# LANGUAGE OverloadedStrings \#-}@ to enable this.+-- -newtype ByteString = BS B.ByteString-  deriving (Eq, Ord)+module Data.ByteString.Char8 ( -fromFilePath :: FilePath -> IO ByteString-fromFilePath = coerce B.fromFilePath+        -- * The @ByteString@ type+        ByteString, -toFilePath :: ByteString -> IO FilePath-toFilePath = coerce B.toFilePath+        -- * Introducing and eliminating 'ByteString's+        B.empty,+        singleton,+        pack,+        unpack,+        B.fromStrict,+        B.toStrict, -cons :: Char -> ByteString -> ByteString-cons = coerce B.cons+        -- * Basic interface+        cons,+        snoc,+        B.append,+        head,+        uncons,+        unsnoc,+        last,+        B.tail,+        B.init,+        B.null,+        B.length, -snoc :: ByteString -> Char -> ByteString-snoc = coerce B.snoc+        -- * Transforming ByteStrings+        map,+        B.reverse,+        intersperse,+        B.intercalate,+        B.transpose, -head :: ByteString -> Char-head = coerce B.head+        -- * Reducing 'ByteString's (folds)+        foldl,+        foldl',+        foldl1,+        foldl1', -tail :: ByteString -> ByteString-tail = coerce B.tail+        foldr,+        foldr',+        foldr1,+        foldr1', -uncons :: ByteString -> Maybe (Char, ByteString)-uncons = coerce B.uncons+        -- ** Special folds+        B.concat,+        concatMap,+        any,+        all,+        maximum,+        minimum, -last :: ByteString -> Char-last = coerce B.last+        -- * Building ByteStrings+        -- ** Scans+        scanl,+        scanl1,+        scanr,+        scanr1, -init :: ByteString -> ByteString-init = coerce B.init+        -- ** Accumulating maps+        mapAccumL,+        mapAccumR, +        -- ** Generating and unfolding ByteStrings+        replicate,+        unfoldr,+        unfoldrN,++        -- * Substrings++        -- ** Breaking strings+        B.take,+        B.takeEnd,+        B.drop,+        B.dropEnd,+        B.splitAt,+        takeWhile,+        takeWhileEnd,+        dropWhile,+        dropWhileEnd,+        dropSpace,+        span,+        spanEnd,+        break,+        breakEnd,+        B.group,+        groupBy,+        B.inits,+        B.tails,+        B.initsNE,+        B.tailsNE,+        strip,+        B.stripPrefix,+        B.stripSuffix,++        -- ** Breaking into many substrings+        split,+        splitWith,++        -- ** Breaking into lines and words+        lines,+        words,+        unlines,+        unwords,++        -- * Predicates+        B.isPrefixOf,+        B.isSuffixOf,+        B.isInfixOf,++        -- ** Search for arbitrary substrings+        B.breakSubstring,++        -- * Searching ByteStrings++        -- ** Searching by equality+        elem,+        notElem,++        -- ** Searching with a predicate+        find,+        filter,+        partition,++        -- * Indexing ByteStrings+        index,+        indexMaybe,+        (!?),+        elemIndex,+        elemIndices,+        elemIndexEnd,+        findIndex,+        findIndices,+        findIndexEnd,+        count,++        -- * Zipping and unzipping ByteStrings+        zip,+        zipWith,+        packZipWith,+        unzip,++        -- * Ordered ByteStrings+        B.sort,++        -- * Reading from ByteStrings+        --readInt,+        --readInt64,+        --readInt32,+        --readInt16,+        --readInt8,++        --readWord,+        --readWord64,+        --readWord32,+        --readWord16,+        --readWord8,++        --readInteger,+        --readNatural,++        -- * Low level CString conversions++        -- ** Copying ByteStrings+        B.copy,++        -- ** Packing CStrings and pointers+        B.packCString,+        B.packCStringLen,++        -- ** Using ByteStrings as CStrings+        B.useAsCString,+        B.useAsCStringLen,++        -- * I\/O with 'ByteString's+        -- | ByteString I/O uses binary mode, without any character decoding+        -- or newline conversion. The fact that it does not respect the Handle+        -- newline mode is considered a flaw and may be changed in a future version.++        -- ** Standard input and output+        B.getLine,+        B.getContents,+        B.putStr,+        putStrLn,+        B.interact,++        -- ** Files+        B.readFile,+        B.writeFile,+        B.appendFile,+--      mmapFile,++        -- ** I\/O with Handles+        B.hGetLine,+        B.hGetContents,+        B.hGet,+        B.hGetSome,+        B.hGetNonBlocking,+        B.hPut,+        B.hPutNonBlocking,+        B.hPutStr,+        hPutStrLn,++  ) where++import Primitives++import qualified Prelude ()+import MiniPrelude as P+import Data.ByteString (ByteString)+import qualified Data.ByteString as B+import qualified Data.ByteString.Unsafe as B+import Data.ByteString.Internal (c2w, w2c)+import Data.Word.Word8 (Word8)+import System.IO.Base (Handle, stdout)++singleton :: Char -> ByteString+singleton = B.singleton . c2w++pack :: String -> ByteString+pack = B.pack . P.map c2w++unpack :: ByteString -> [Char]+unpack = P.map w2c . B.unpack++infixr 5 `cons` --same as list (:)+infixl 5 `snoc`++cons :: Char -> ByteString -> ByteString+cons = B.cons . c2w++snoc :: ByteString -> Char -> ByteString+snoc p = B.snoc p . c2w++uncons :: ByteString -> Maybe (Char, ByteString)+uncons bs = case B.uncons bs of+                  Nothing -> Nothing+                  Just (w, bs') -> Just (w2c w, bs')+ unsnoc :: ByteString -> Maybe (ByteString, Char)-unsnoc = coerce B.unsnoc+unsnoc bs = case B.unsnoc bs of+                  Nothing -> Nothing+                  Just (bs', w) -> Just (bs', w2c w) -null :: ByteString -> Bool-null = coerce B.null+head :: ByteString -> Char+head = w2c . B.head -map :: (Char -> Char) -> ByteString -> ByteString-map = coerce B.map+last :: ByteString -> Char+last = w2c . B.last -reverse :: ByteString -> ByteString-reverse = coerce B.reverse+map :: (Char -> Char) -> ByteString -> ByteString+map f = B.map (c2w . f . w2c)  intersperse :: Char -> ByteString -> ByteString-intersperse = coerce B.intersperse--transpose :: [ByteString] -> [ByteString]-transpose = coerce B.transpose+intersperse = B.intersperse . c2w  foldl :: (a -> Char -> a) -> a -> ByteString -> a-foldl f z x = B.foldl (coerce f) z (coerce x)+foldl f = B.foldl (\a c -> f a (w2c c))  foldl' :: (a -> Char -> a) -> a -> ByteString -> a-foldl' f z x = B.foldl' (coerce f) z (coerce x)+foldl' f = B.foldl' (\a c -> f a (w2c c))  foldr :: (Char -> a -> a) -> a -> ByteString -> a-foldr f z x = B.foldr (coerce f) z (coerce x)+foldr f = B.foldr (f . w2c)  foldr' :: (Char -> a -> a) -> a -> ByteString -> a-foldr' f z x = B.foldr' (coerce f) z (coerce x)+foldr' f = B.foldr' (f . w2c)  foldl1 :: (Char -> Char -> Char) -> ByteString -> Char-foldl1 = coerce B.foldl1+foldl1 f ps = w2c (B.foldl1 (\x y -> c2w (f (w2c x) (w2c y))) ps)  foldl1' :: (Char -> Char -> Char) -> ByteString -> Char-foldl1' = coerce B.foldl1'+foldl1' f ps = w2c (B.foldl1' (\x y -> c2w (f (w2c x) (w2c y))) ps)  foldr1 :: (Char -> Char -> Char) -> ByteString -> Char-foldr1 = coerce B.foldr1+foldr1 f ps = w2c (B.foldr1 (\x y -> c2w (f (w2c x) (w2c y))) ps)  foldr1' :: (Char -> Char -> Char) -> ByteString -> Char-foldr1' = coerce B.foldr1'--concat :: [ByteString] -> ByteString-concat = coerce B.concat+foldr1' f ps = w2c (B.foldr1' (\x y -> c2w (f (w2c x) (w2c y))) ps)  concatMap :: (Char -> ByteString) -> ByteString -> ByteString-concatMap = coerce B.concatMap+concatMap f = B.concatMap (f . w2c)  any :: (Char -> Bool) -> ByteString -> Bool-any = coerce B.any+any f = B.any (f . w2c)  all :: (Char -> Bool) -> ByteString -> Bool-all = coerce B.all+all f = B.all (f . w2c)  maximum :: ByteString -> Char-maximum = coerce B.maximum+maximum = w2c . B.maximum  minimum :: ByteString -> Char-minimum = coerce B.minimum+minimum = w2c . B.minimum  mapAccumL :: (acc -> Char -> (acc, Char)) -> acc -> ByteString -> (acc, ByteString)-mapAccumL f s x = coerce (B.mapAccumL (coerce f) s (coerce x))+mapAccumL f = B.mapAccumL (\acc w -> case f acc (w2c w) of (acc', c) -> (acc', c2w c))  mapAccumR :: (acc -> Char -> (acc, Char)) -> acc -> ByteString -> (acc, ByteString)-mapAccumR f s x = coerce (B.mapAccumR (coerce f) s (coerce x))+mapAccumR f = B.mapAccumR (\acc w -> case f acc (w2c w) of (acc', c) -> (acc', c2w c)) +scanl :: (Char -> Char -> Char) -> Char -> ByteString -> ByteString+scanl f z = B.scanl (\a b -> c2w (f (w2c a) (w2c b))) (c2w z)+ scanl1 :: (Char -> Char -> Char) -> ByteString -> ByteString-scanl1 = coerce B.scanl1+scanl1 f = B.scanl1 (\a b -> c2w (f (w2c a) (w2c b))) +scanr :: (Char -> Char -> Char) -> Char -> ByteString -> ByteString+scanr f z = B.scanr (\a b -> c2w (f (w2c a) (w2c b))) (c2w z)+ scanr1 :: (Char -> Char -> Char) -> ByteString -> ByteString-scanr1 = coerce B.scanr1+scanr1 f = B.scanr1 (\a b -> c2w (f (w2c a) (w2c b)))  replicate :: Int -> Char -> ByteString-replicate = coerce B.replicate+replicate n = B.replicate n . c2w  unfoldr :: (a -> Maybe (Char, a)) -> a -> ByteString-unfoldr f a = coerce (B.unfoldr (coerce f) a)+unfoldr f = B.unfoldr (fmap k . f)+    where k (i, j) = (c2w i, j)  unfoldrN :: Int -> (a -> Maybe (Char, a)) -> a -> (ByteString, Maybe a)-unfoldrN n f a = coerce (B.unfoldrN n (coerce f) a)--take :: Int -> ByteString -> ByteString-take = coerce B.take--takeEnd :: Int -> ByteString -> ByteString-takeEnd = coerce B.takeEnd--drop  :: Int -> ByteString -> ByteString-drop = coerce B.drop--dropEnd :: Int -> ByteString -> ByteString-dropEnd = coerce B.dropEnd--splitAt :: Int -> ByteString -> (ByteString, ByteString)-splitAt = coerce B.splitAt+unfoldrN n f = B.unfoldrN n ((k `fmap`) . f)+    where k (i,j) = (c2w i, j)  takeWhile :: (Char -> Bool) -> ByteString -> ByteString-takeWhile = coerce B.takeWhile+takeWhile f = B.takeWhile (f . w2c)  takeWhileEnd :: (Char -> Bool) -> ByteString -> ByteString-takeWhileEnd = coerce B.takeWhileEnd+takeWhileEnd f = B.takeWhileEnd (f . w2c)  dropWhile :: (Char -> Bool) -> ByteString -> ByteString-dropWhile = coerce B.dropWhile+dropWhile f = B.dropWhile (f . w2c)  dropWhileEnd :: (Char -> Bool) -> ByteString -> ByteString-dropWhileEnd = coerce B.dropWhileEnd+dropWhileEnd f = B.dropWhileEnd (f . w2c)  break :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-break = coerce B.break+break f = B.break (f . w2c) -breakEnd :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-breakEnd = coerce B.breakEnd+breakChar :: Char -> ByteString -> (ByteString, ByteString)+breakChar c p = case elemIndex c p of+    Nothing -> (p, B.empty)+    Just n  -> (B.unsafeTake n p, B.unsafeDrop n p)  span :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-span = coerce B.span+span f = B.span (f . w2c)  spanEnd :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-spanEnd = coerce B.spanEnd+spanEnd f = B.spanEnd (f . w2c) -splitWith :: (Char -> Bool) -> ByteString -> [ByteString]-splitWith = coerce B.splitWith+breakEnd :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)+breakEnd f = B.breakEnd (f . w2c)  split :: Char -> ByteString -> [ByteString]-split = coerce B.split+split = B.split . c2w -group :: ByteString -> [ByteString]-group = coerce B.group+splitWith :: (Char -> Bool) -> ByteString -> [ByteString]+splitWith f = B.splitWith (f . w2c)  groupBy :: (Char -> Char -> Bool) -> ByteString -> [ByteString]-groupBy = coerce B.groupBy--intercalate :: ByteString -> [ByteString] -> ByteString-intercalate = coerce B.intercalate+groupBy k = B.groupBy (\a b -> k (w2c a) (w2c b))  index :: ByteString -> Int -> Char-index = coerce B.index+index = (w2c .) . B.index  indexMaybe :: ByteString -> Int -> Maybe Char-indexMaybe = coerce B.indexMaybe+indexMaybe = (fmap w2c .) . B.indexMaybe  (!?) :: ByteString -> Int -> Maybe Char-(!?) = coerce (B.!?)+(!?) = indexMaybe  elemIndex :: Char -> ByteString -> Maybe Int-elemIndex = coerce B.elemIndex+elemIndex = B.elemIndex . c2w  elemIndexEnd :: Char -> ByteString -> Maybe Int-elemIndexEnd = coerce B.elemIndexEnd+elemIndexEnd = B.elemIndexEnd . c2w  elemIndices :: Char -> ByteString -> [Int]-elemIndices = coerce B.elemIndices--count :: Char -> ByteString -> Int-count = coerce B.count+elemIndices = B.elemIndices . c2w  findIndex :: (Char -> Bool) -> ByteString -> Maybe Int-findIndex = coerce B.findIndex+findIndex f = B.findIndex (f . w2c)  findIndexEnd :: (Char -> Bool) -> ByteString -> Maybe Int-findIndexEnd = coerce B.findIndexEnd+findIndexEnd f = B.findIndexEnd (f . w2c)  findIndices :: (Char -> Bool) -> ByteString -> [Int]-findIndices = coerce B.findIndices+findIndices f = B.findIndices (f . w2c) +count :: Char -> ByteString -> Int+count c = B.count (c2w c)+ elem :: Char -> ByteString -> Bool-elem = coerce B.elem+elem    c = B.elem (c2w c)  notElem :: Char -> ByteString -> Bool-notElem = coerce B.notElem+notElem c = B.notElem (c2w c)  filter :: (Char -> Bool) -> ByteString -> ByteString-filter = coerce B.filter--find :: (Char -> Bool) -> ByteString -> Maybe Char-find = coerce B.find+filter f = B.filter (f . w2c)  partition :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-partition = coerce B.partition--isPrefixOf :: ByteString -> ByteString -> Bool-isPrefixOf = coerce B.isPrefixOf--stripPrefix :: ByteString -> ByteString -> Maybe ByteString-stripPrefix = coerce B.stripPrefix--isSuffixOf :: ByteString -> ByteString -> Bool-isSuffixOf = coerce B.isSuffixOf--stripSuffix :: ByteString -> ByteString -> Maybe ByteString-stripSuffix = coerce B.stripSuffix--isInfixOf :: ByteString -> ByteString -> Bool-isInfixOf = coerce B.isInfixOf--isValidUtf8 :: ByteString -> Bool-isValidUtf8 = coerce B.isValidUtf8+partition f = B.partition (f . w2c) -breakSubstring :: ByteString -> ByteString -> (ByteString,ByteString)-breakSubstring = coerce B.breakSubstring+find :: (Char -> Bool) -> ByteString -> Maybe Char+find f ps = w2c `fmap` B.find (f . w2c) ps  zip :: ByteString -> ByteString -> [(Char,Char)]-zip = coerce B.zip+zip ps qs = case uncons ps of+  Nothing         -> []+  Just (psH, psT) -> case uncons qs of+    Nothing         -> []+    Just (qsH, qsT) -> (psH, qsH) : zip psT qsT  zipWith :: (Char -> Char -> a) -> ByteString -> ByteString -> [a]-zipWith f x y = B.zipWith (coerce f) (coerce x) (coerce y)+zipWith f = B.zipWith ((. w2c) . f . w2c)  packZipWith :: (Char -> Char -> Char) -> ByteString -> ByteString -> ByteString-packZipWith = coerce B.packZipWith+packZipWith f = B.packZipWith f'+    where+        f' c1 c2 = c2w $ f (w2c c1) (w2c c2)  unzip :: [(Char,Char)] -> (ByteString,ByteString)-unzip = coerce B.unzip--inits :: ByteString -> [ByteString]-inits = coerce B.inits--initsNE :: ByteString -> NonEmpty ByteString-initsNE = coerce B.initsNE--tails :: ByteString -> [ByteString]-tails = coerce B.tails--tailsNE :: ByteString -> NonEmpty ByteString-tailsNE = coerce B.tailsNE--sort :: ByteString -> ByteString-sort = coerce B.sort--useAsCString :: ByteString -> (CString -> IO a) -> IO a-useAsCString x = B.useAsCString (coerce x)--useAsCStringLen :: ByteString -> (CStringLen -> IO a) -> IO a-useAsCStringLen x = B.useAsCStringLen (coerce x)--packCString :: CString -> IO ByteString-packCString = coerce B.packCString--packCStringLen :: CStringLen -> IO ByteString-packCStringLen = coerce B.packCStringLen--copy :: ByteString -> ByteString-copy = coerce B.copy--getLine :: IO ByteString-getLine = coerce B.getLine--hGetLine :: Handle -> IO ByteString-hGetLine = coerce B.hGetLine--hPut :: Handle -> ByteString -> IO ()-hPut = coerce B.hPut--hPutNonBlocking :: Handle -> ByteString -> IO ByteString-hPutNonBlocking = coerce B.hPutNonBlocking--hPutStr :: Handle -> ByteString -> IO ()-hPutStr = coerce B.hPutStr--putStr :: ByteString -> IO ()-putStr = coerce B.putStr--hGet :: Handle -> Int -> IO ByteString-hGet = coerce B.hGet+unzip ls = (pack (P.map fst ls), pack (P.map snd ls)) -hGetNonBlocking :: Handle -> Int -> IO ByteString-hGetNonBlocking = coerce B.hGetNonBlocking+dropSpace :: ByteString -> ByteString+dropSpace = dropWhile isSpace -hGetSome :: Handle -> Int -> IO ByteString-hGetSome = coerce B.hGetSome+strip :: ByteString -> ByteString+strip = dropWhile isSpace . dropWhileEnd isSpace -hGetContents :: Handle -> IO ByteString-hGetContents = coerce B.hGetContents+lines :: ByteString -> [ByteString]+lines ps+    | B.null ps = []+    | otherwise = case elemIndex '\n' ps of+             Nothing -> [ps]+             Just n  -> B.take n ps : lines (B.drop (n+1) ps) -getContents :: IO ByteString-getContents = coerce B.getContents+unlines :: [ByteString] -> ByteString+unlines = B.intercalate (singleton '\n') -interact :: (ByteString -> ByteString) -> IO ()-interact = coerce B.interact+words :: ByteString -> [ByteString]+words = P.filter (not . B.null) . splitWith isSpace -readFile :: FilePath -> IO ByteString-readFile = coerce B.readFile+unwords :: [ByteString] -> ByteString+unwords = B.intercalate (singleton ' ') -writeFile :: FilePath -> ByteString -> IO ()-writeFile = coerce B.writeFile+hPutStrLn :: Handle -> ByteString -> IO ()+hPutStrLn h ps+    | B.length ps < 1024 = B.hPut h (ps `B.snoc` 0x0a)+    | otherwise        = B.hPut h ps >> B.hPut h (B.singleton 0x0a) -- don't copy -appendFile :: FilePath -> ByteString -> IO ()-appendFile = coerce B.appendFile+putStrLn :: ByteString -> IO ()+putStrLn = hPutStrLn stdout
lib/Data/ByteString/Internal.hs view
@@ -4,22 +4,26 @@ import Control.DeepSeq.Class import Control.Error import Data.Bool+import Data.Coerce import Data.Enum import Data.Eq import Data.Function-import Data.Int+import Data.Int.Int import Data.List (map) import Data.List_Type import Data.Monoid.Internal import Data.Num import Data.Ord import Data.String-import Data.Word (Word8)-import Foreign.C.Types (CChar)+import Data.Word.Word8(Word8, intToWord8, word8ToInt)+import {-# SOURCE #-} Data.Typeable+import Foreign.C.Types(CChar) import Text.Show  data ByteString  -- primitive type +type StrictByteString = ByteString+ primBSappend  :: ByteString -> ByteString -> ByteString primBSappend  = _primitive "bs++" primBSEQ      :: ByteString -> ByteString -> Bool@@ -62,6 +66,9 @@ primFPtr2BS :: ForeignPtr CChar -> Int -> ByteString primFPtr2BS = _primitive "fp2bs" +primBSgrab :: Ptr CChar -> IO ByteString+primBSgrab = _primitive "bsgrab"+ -----------------------------------------  instance NFData ByteString@@ -81,7 +88,7 @@   showsPrec p bs = showsPrec p (toString bs)  instance IsString ByteString where-  fromString = pack . map (toEnum . fromEnum)+  fromString = coerce pack  instance Semigroup ByteString where   (<>) = append@@ -90,7 +97,7 @@   mempty = empty  toString :: ByteString -> String-toString = map (toEnum . fromEnum) . unpack+toString = coerce unpack  empty :: ByteString empty = pack []@@ -122,3 +129,24 @@  null :: ByteString -> Bool null bs = length bs == 0++-- Take a C string and turn it into a ByteString.+-- This will take ownership of the memory which will eventually+-- be free()d.  The pointer should not be used by the caller after this call.+grabCString :: Ptr CChar -> IO ByteString+grabCString = primBSgrab++-- Are the bytestrings the same underlying object?+sameByteString :: ByteString -> ByteString -> Bool+sameByteString bs1 bs2 =+  let r = primPtrToWord (primForeignPtrToPtr (primBS2FPtr bs1)) == primPtrToWord (primForeignPtrToPtr (primBS2FPtr bs2))+  in  r `seq` bs1 `primSeq` bs2 `primSeq` r++c2w :: Char -> Word8+c2w = intToWord8 . primOrd++w2c :: Word8 -> Char+w2c = primChr . word8ToInt++toForeignPtr :: ByteString -> (ForeignPtr Word8, Int, Int)+toForeignPtr bs = (primUnsafeCoerce (primBS2FPtr bs), 0, primBSlength bs)
+ lib/Data/ByteString/Lazy.hs view
@@ -0,0 +1,925 @@+-- |+-- Module      : Data.ByteString.Lazy+-- Copyright   : (c) Don Stewart 2006+--               (c) Duncan Coutts 2006-2011+-- License     : BSD-style+--+-- Maintainer  : dons00@gmail.com, duncan@community.haskell.org+-- Stability   : stable+-- Portability : portable+--+-- A time and space-efficient implementation of lazy byte vectors+-- using lists of packed 'Word8' arrays, suitable for high performance+-- use, both in terms of large data quantities, or high speed+-- requirements. Lazy ByteStrings are encoded as lazy lists of strict chunks+-- of bytes.+--+-- A key feature of lazy ByteStrings is the means to manipulate large or+-- unbounded streams of data without requiring the entire sequence to be+-- resident in memory. To take advantage of this you have to write your+-- functions in a lazy streaming style, e.g. classic pipeline composition. The+-- default I\/O chunk size is 32k, which should be good in most circumstances.+--+-- Some operations, such as 'concat', 'append', 'reverse' and 'cons', have+-- better complexity than their "Data.ByteString" equivalents, due to+-- optimisations resulting from the list spine structure. For other+-- operations lazy ByteStrings are usually within a few percent of+-- strict ones.+--+-- The recomended way to assemble lazy ByteStrings from smaller parts+-- is to use the builder monoid from "Data.ByteString.Builder".+--+-- This module is intended to be imported @qualified@, to avoid name+-- clashes with "Prelude" functions.  eg.+--+-- > import qualified Data.ByteString.Lazy as B+--+-- Original GHC implementation by Bryan O\'Sullivan.+-- Rewritten to use 'Data.Array.Unboxed.UArray' by Simon Marlow.+-- Rewritten to support slices and use 'Foreign.ForeignPtr.ForeignPtr'+-- by David Roundy.+-- Rewritten again and extended by Don Stewart and Duncan Coutts.+-- Lazy variant by Duncan Coutts and Don Stewart.+--++module Data.ByteString.Lazy (++        -- * Lazy @ByteString@+        ByteString,+        LazyByteString,++        -- * Introducing and eliminating 'ByteString's+        empty,+        singleton,+        pack,+        unpack,+        fromStrict,+        toStrict,+        fromChunks,+        toChunks,+        foldrChunks,+        foldlChunks,++        -- * Basic interface+        cons,+        cons',+        snoc,+        append,+        head,+        uncons,+        unsnoc,+        last,+        tail,+        init,+        null,+        length,++        -- * Transforming ByteStrings+        map,+        reverse,+        intersperse,+        intercalate,+        transpose,++        -- * Reducing 'ByteString's (folds)+        foldl,+        foldl',+        foldl1,+        foldl1',+        foldr,+        foldr',+        foldr1,+        foldr1',++        -- ** Special folds+        concat,+        concatMap,+        any,+        all,+        maximum,+        minimum,+        compareLength,++        -- * Building ByteStrings+        -- ** Scans+        scanl,+        scanl1,+        scanr,+        scanr1,++        -- ** Accumulating maps+        mapAccumL,+        mapAccumR,++        -- ** Infinite ByteStrings+        repeat,+        replicate,+        cycle,+        iterate,++        -- ** Unfolding ByteStrings+        unfoldr,++        -- * Substrings++        -- ** Breaking strings+        take,+        takeEnd,+        drop,+        dropEnd,+        splitAt,+        takeWhile,+        takeWhileEnd,+        dropWhile,+        dropWhileEnd,+        span,+        spanEnd,+        break,+        breakEnd,+        group,+        groupBy,+        inits,+        tails,+        initsNE,+        tailsNE,+        stripPrefix,+        stripSuffix,++        -- ** Breaking into many substrings+        split,+        splitWith,++        -- * Predicates+        isPrefixOf,+        isSuffixOf,+--        isInfixOf,++        -- ** Search for arbitrary substrings+--        isSubstringOf,++        -- * Searching ByteStrings++        -- ** Searching by equality+        elem,+        notElem,++        -- ** Searching with a predicate+        find,+        filter,+        partition,++        -- * Indexing ByteStrings+        index,+        indexMaybe,+        (!?),+        elemIndex,+        elemIndexEnd,+        elemIndices,+        findIndex,+        findIndexEnd,+        findIndices,+        count,++        -- * Zipping and unzipping ByteStrings+        zip,+        zipWith,+        packZipWith,+        unzip,++        -- * Ordered ByteStrings+--        sort,++        -- * Low level conversions+        -- ** Copying ByteStrings+        copy,+--        defrag,++        -- * I\/O with 'ByteString's+        -- $IOChunk++        -- ** Standard input and output+        getContents,+        putStr,+        interact,++        -- ** Files+        readFile,+        writeFile,+        appendFile,++        -- ** I\/O with Handles+        hGetContents,+        hGet,+        hGetNonBlocking,+        hPut,+        hPutNonBlocking,+        hPutStr,++  ) where++import qualified Prelude ()+import MiniPrelude hiding (concat)++import Primitives+import Data.Bifunctor (first)+import qualified Data.ByteString as S+import qualified Data.ByteString.Unsafe as S+import Data.ByteString.Lazy.Internal+import qualified Data.List as List+import Data.List.NonEmpty (NonEmpty(..))+import qualified Data.List.NonEmpty as NE+import Data.Int.Int64 (Int64)+import Data.Word.Word8 (Word8)+import System.IO.Base+import System.IO.Unsafe (unsafeInterleaveIO)+import System.IO.Error++empty :: ByteString+empty = Empty++singleton :: Word8 -> ByteString+singleton w = chunk (S.singleton w) Empty++pack :: [Word8] -> ByteString+pack = packBytes++unpack :: ByteString -> [Word8]+unpack = unpackBytes++fromChunks :: [S.ByteString] -> ByteString+fromChunks = List.foldr chunk Empty++toChunks :: ByteString -> [S.ByteString]+toChunks = foldrChunks (:) []++null :: ByteString -> Bool+null Empty = True+null _     = False++length :: ByteString -> Int64+length = foldlChunks (\n c -> n + primIntToInt64 (S.length c)) 0++infixr 5 `cons`, `cons'` --same as list (:)+infixl 5 `snoc`++cons :: Word8 -> ByteString -> ByteString+cons c = Chunk (S.singleton c)++cons' :: Word8 -> ByteString -> ByteString+cons' w (Chunk c cs) | S.length c < 16 = Chunk (S.cons w c) cs+cons' w cs                             = Chunk (S.singleton w) cs++snoc :: ByteString -> Word8 -> ByteString+snoc cs w = foldrChunks Chunk (singleton w) cs++head :: ByteString -> Word8+head Empty       = errorEmpty "head"+head (Chunk c _) = S.unsafeHead c++tail :: ByteString -> ByteString+tail Empty       = errorEmpty "tail"+tail (Chunk c cs)+  | S.length c == 1 = cs+  | otherwise       = Chunk (S.unsafeTail c) cs++uncons :: ByteString -> Maybe (Word8, ByteString)+uncons Empty = Nothing+uncons (Chunk c cs) =+  case S.length c of+    1 -> Just (S.unsafeHead c, cs)+    _ -> Just (S.unsafeHead c, Chunk (S.unsafeTail c) cs)++last :: ByteString -> Word8+last Empty          = errorEmpty "last"+last (Chunk c0 cs0) = go c0 cs0+  where+    go c Empty        = S.unsafeLast c+    go _ (Chunk c cs) = go c cs++init :: ByteString -> ByteString+init Empty          = errorEmpty "init"+init (Chunk c0 cs0) = go c0 cs0+  where+    go c Empty+      | S.length c == 1 = Empty+      | otherwise       = Chunk (S.unsafeInit c) Empty+    go c (Chunk c' cs)  = Chunk c (go c' cs)++unsnoc :: ByteString -> Maybe (ByteString, Word8)+unsnoc Empty = Nothing+unsnoc bs    = Just (init bs, last bs)++map :: (Word8 -> Word8) -> ByteString -> ByteString+map f = go+    where+        go Empty        = Empty+        go (Chunk x xs) = Chunk y ys+            where+                y  = S.map f x+                ys = go xs++reverse :: ByteString -> ByteString+reverse = rev Empty+  where rev a Empty        = a+        rev a (Chunk c cs) = rev (Chunk (S.reverse c) a) cs++intersperse :: Word8 -> ByteString -> ByteString+intersperse _ Empty        = Empty+intersperse w (Chunk c cs) = Chunk (S.intersperse w c) (foldrChunks (Chunk . intersperse') Empty cs)+  where+    intersperse' :: S.ByteString -> S.ByteString+    intersperse' = S.cons w . S.intersperse w++intercalate :: ByteString -> [ByteString] -> ByteString+intercalate s = concat . List.intersperse s++transpose :: [ByteString] -> [ByteString]+transpose = List.map (\bs -> Chunk (S.pack bs) Empty) . List.transpose . List.map unpack++foldl :: (a -> Word8 -> a) -> a -> ByteString -> a+foldl f = go+  where go a Empty        = a+        go a (Chunk c cs) = go (S.foldl f a c) cs++foldl' :: (a -> Word8 -> a) -> a -> ByteString -> a+foldl' f = go+  where go !a Empty        = a+        go !a (Chunk c cs) = go (S.foldl' f a c) cs++foldr :: (Word8 -> a -> a) -> a -> ByteString -> a+foldr k = foldrChunks (flip (S.foldr k))++foldr' :: (Word8 -> a -> a) -> a -> ByteString -> a+foldr' f a = go+  where+    go Empty = a+    go (Chunk c cs) = S.foldr' f (foldr' f a cs) c++foldl1 :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8+foldl1 _ Empty        = errorEmpty "foldl1"+foldl1 f (Chunk c cs) = go (S.unsafeHead c) (S.unsafeTail c) cs+  where+    go v x xs = let v' = S.foldl f v x+      in case xs of+      Empty -> v'+      Chunk x' xs' -> go v' x' xs'++foldl1' :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8+foldl1' _ Empty        = errorEmpty "foldl1'"+foldl1' f (Chunk c cs) = go (S.unsafeHead c) (S.unsafeTail c) cs+  where+    go !v x xs = let v' = S.foldl' f v x+      in case xs of+      Empty -> v'+      Chunk x' xs' -> go v' x' xs'++foldr1 :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8+foldr1 _ Empty          = errorEmpty "foldr1"+foldr1 f (Chunk c0 cs0) = go c0 cs0+  where go c Empty         = S.foldr1 f c+        go c (Chunk c' cs) = S.foldr  f (go c' cs) c++foldr1' :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8+foldr1' _ Empty          = errorEmpty "foldr1'"+foldr1' f (Chunk c0 cs0) = go c0 cs0+  where go c Empty         = S.foldr1' f c+        go c (Chunk c' cs) = S.foldr'  f (go c' cs) c++concatMap :: (Word8 -> ByteString) -> ByteString -> ByteString+concatMap _ Empty          = Empty+concatMap f (Chunk c0 cs0) = to c0 cs0+  where+    go :: ByteString -> S.ByteString -> ByteString -> ByteString+    go Empty        c' cs' = to c' cs'+    go (Chunk c cs) c' cs' = Chunk c (go cs c' cs')++    to :: S.ByteString -> ByteString -> ByteString+    to c cs | S.null c  = case cs of+        Empty          -> Empty+        (Chunk c' cs') -> to c' cs'+            | otherwise = go (f (S.unsafeHead c)) (S.unsafeTail c) cs++any :: (Word8 -> Bool) -> ByteString -> Bool+any f = foldrChunks (\c rest -> S.any f c || rest) False++all :: (Word8 -> Bool) -> ByteString -> Bool+all f = foldrChunks (\c rest -> S.all f c && rest) True++maximum :: ByteString -> Word8+maximum Empty        = errorEmpty "maximum"+maximum (Chunk c cs) = foldlChunks (\n c' -> n `max` S.maximum c') (S.maximum c) cs++minimum :: ByteString -> Word8+minimum Empty        = errorEmpty "minimum"+minimum (Chunk c cs) = foldlChunks (\n c' -> n `min` S.minimum c') (S.minimum c) cs++compareLength :: ByteString -> Int64 -> Ordering+compareLength _ toCmp | toCmp < 0 = GT+compareLength Empty toCmp         = compare 0 toCmp+compareLength (Chunk c cs) toCmp  = compareLength cs (toCmp - primIntToInt64 (S.length c))++mapAccumL :: (acc -> Word8 -> (acc, Word8)) -> acc -> ByteString -> (acc, ByteString)+mapAccumL f = go+  where+    go s Empty        = (s, Empty)+    go s (Chunk c cs) = (s'', Chunk c' cs')+        where (s',  c')  = S.mapAccumL f s c+              (s'', cs') = go s' cs++mapAccumR :: (acc -> Word8 -> (acc, Word8)) -> acc -> ByteString -> (acc, ByteString)+mapAccumR f = go+  where+    go s Empty        = (s, Empty)+    go s (Chunk c cs) = (s'', Chunk c' cs')+        where (s'', c') = S.mapAccumR f s' c+              (s', cs') = go s cs++scanl :: (Word8 -> Word8 -> Word8) -> Word8 -> ByteString -> ByteString+scanl f = fmap (uncurry (flip snoc)) . mapAccumL (\x y -> (f x y, x))++scanl1 :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString+scanl1 f bs = case uncons bs of+  Nothing -> Empty+  Just (b, bs') -> scanl f b bs'++scanr :: (Word8 -> Word8 -> Word8) -> Word8 -> ByteString -> ByteString+scanr f = fmap (uncurry cons) . mapAccumR (\x y -> (f y x, x))++scanr1 :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString+scanr1 f bs = case unsnoc bs of+  Nothing -> Empty+  Just (bs', b) -> scanr f b bs'++iterate :: (Word8 -> Word8) -> Word8 -> ByteString+iterate f = unfoldr (\x -> case f x of !x' -> Just (x', x'))++repeat :: Word8 -> ByteString+repeat w = cs where cs = Chunk (S.replicate smallChunkSize w) cs++replicate :: Int64 -> Word8 -> ByteString+replicate n w+    | n <= 0             = Empty+    | n < primIntToInt64 smallChunkSize = Chunk (S.replicate (primInt64ToInt n) w) Empty+    | r == 0             = cs -- preserve invariant+    | otherwise          = Chunk (S.unsafeTake (primInt64ToInt r) c) cs+ where+    c      = S.replicate smallChunkSize w+    cs     = nChunks q+    (q, r) = quotRem n (primIntToInt64 smallChunkSize)+    nChunks 0 = Empty+    nChunks m = Chunk c (nChunks (m - 1))++cycle :: ByteString -> ByteString+cycle Empty = errorEmpty "cycle"+cycle bs    = bs' where bs' = bs `append` bs'++unfoldr :: (a -> Maybe (Word8, a)) -> a -> ByteString+unfoldr f = unfoldChunk 32+  where unfoldChunk n x =+          case S.unfoldrN n f x of+            (c, Nothing)+              | S.null c  -> Empty+              | otherwise -> Chunk c Empty+            (c, Just x')  -> Chunk c (unfoldChunk (n * 2) x')++take :: Int64 -> ByteString -> ByteString+take i _ | i <= 0 = Empty+take i cs0        = take' i cs0+  where take' 0 _            = Empty+        take' _ Empty        = Empty+        take' n (Chunk c cs) =+          if n < primIntToInt64 (S.length c)+            then Chunk (S.take (primInt64ToInt n) c) Empty+            else Chunk c (take' (n - primIntToInt64 (S.length c)) cs)++takeEnd :: Int64 -> ByteString -> ByteString+takeEnd i bs = drop (length bs - i) bs++drop :: Int64 -> ByteString -> ByteString+drop i p | i <= 0 = p+drop i cs0 = drop' i cs0+  where drop' 0 cs           = cs+        drop' _ Empty        = Empty+        drop' n (Chunk c cs) =+          if n < primIntToInt64 (S.length c)+            then Chunk (S.drop (primInt64ToInt n) c) cs+            else drop' (n - primIntToInt64 (S.length c)) cs++dropEnd :: Int64 -> ByteString -> ByteString+dropEnd i bs = take (length bs - i) bs++splitAt :: Int64 -> ByteString -> (ByteString, ByteString)+splitAt i cs0 | i <= 0 = (Empty, cs0)+splitAt i cs0 = splitAt' i cs0+  where splitAt' 0 cs           = (Empty, cs)+        splitAt' _ Empty        = (Empty, Empty)+        splitAt' n (Chunk c cs) =+          if n < primIntToInt64 (S.length c)+            then (Chunk (S.take (primInt64ToInt n) c) Empty+                 ,Chunk (S.drop (primInt64ToInt n) c) cs)+            else let (cs', cs'') = splitAt' (n - primIntToInt64 (S.length c)) cs+                   in (Chunk c cs', cs'')++takeWhile :: (Word8 -> Bool) -> ByteString -> ByteString+takeWhile f = takeWhile'+  where takeWhile' Empty        = Empty+        takeWhile' (Chunk c cs) =+          case S.findIndex (not . f) c of+            Just 0  -> Empty+            Just n  -> Chunk (S.take n c) Empty+            Nothing -> Chunk c (takeWhile' cs)++takeWhileEnd :: (Word8 -> Bool) -> ByteString -> ByteString+takeWhileEnd f = takeWhileEnd'+  where takeWhileEnd' Empty = Empty+        takeWhileEnd' cs    =+            snd $ foldrChunks takeTuple (True,Empty) cs+        takeTuple _ (False, bs) = (False,bs)+        takeTuple c (True,bs)   =+           case S.takeWhileEnd f c of+                c' | S.length c' == S.length c -> (True, Chunk c bs)+                   | otherwise                 -> (False, fromStrict c' `append` bs)++dropWhile :: (Word8 -> Bool) -> ByteString -> ByteString+dropWhile f = dropWhile'+  where dropWhile' Empty        = Empty+        dropWhile' (Chunk c cs) =+          case S.findIndex (not . f) c of+            Just n  -> Chunk (S.drop n c) cs+            Nothing -> dropWhile' cs++dropWhileEnd :: (Word8 -> Bool) -> ByteString -> ByteString+dropWhileEnd f = go []+  where go acc (Chunk c cs)+            | f (S.last c) = go (c : acc) cs+            | otherwise    = List.foldl (flip Chunk) (go [] cs) (c : acc)+        go acc Empty       = dropEndBytes acc+        dropEndBytes []         = Empty+        dropEndBytes (x : xs)   =+            case S.dropWhileEnd f x of+                 x' | S.null x' -> dropEndBytes xs+                    | otherwise -> List.foldl' (flip Chunk) Empty (x' : xs)++break :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)+break f = break'+  where break' Empty        = (Empty, Empty)+        break' (Chunk c cs) =+          case S.findIndex f c of+            Just 0  -> (Empty, Chunk c cs)+            Just n  -> (Chunk (S.take n c) Empty, Chunk (S.drop n c) cs)+            Nothing -> let (cs', cs'') = break' cs+                       in (Chunk c cs', cs'')++breakEnd :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)+breakEnd  f = go []+  where go acc (Chunk c cs)+            | f (S.last c) = List.foldl (flip $ first . Chunk) (go [] cs) (c : acc)+            | otherwise = go (c : acc) cs+        go acc Empty = dropEndBytes acc+        dropEndBytes [] = (Empty, Empty)+        dropEndBytes (x : xs) =+            case S.breakEnd f x of+                 (x', x'') | S.null x' -> let (y, y') = dropEndBytes xs+                                           in (y, y' `append` fromStrict x)+                           | otherwise ->+                                List.foldl' (flip $ first . Chunk) (fromStrict x', fromStrict x'') xs+        first f (x, y) = (f x, y)++span :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)+span p = break (not . p)++spanEnd :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)+spanEnd p = breakEnd (not . p)++splitWith :: (Word8 -> Bool) -> ByteString -> [ByteString]+splitWith _ Empty          = []+splitWith p (Chunk c0 cs0) = comb [] (S.splitWith p c0) cs0++  where comb :: [S.ByteString] -> [S.ByteString] -> ByteString -> [ByteString]+        comb acc [s] Empty        = [revChunks (s:acc)]+        comb acc [s] (Chunk c cs) = comb (s:acc) (S.splitWith p c) cs+        comb acc (s:ss) cs        = revChunks (s:acc) : comb [] ss cs+        comb _ [] _ = error "Strict splitWith returned [] for nonempty input"++split :: Word8 -> ByteString -> [ByteString]+split _ Empty     = []+split w (Chunk c0 cs0) = comb [] (S.split w c0) cs0++  where comb :: [S.ByteString] -> [S.ByteString] -> ByteString -> [ByteString]+        comb acc [s] Empty        = [revChunks (s:acc)]+        comb acc [s] (Chunk c cs) = comb (s:acc) (S.split w c) cs+        comb acc (s:ss) cs        = revChunks (s:acc) : comb [] ss cs+        comb _ [] _ = error "Strict split returned [] for nonempty input"++group :: ByteString -> [ByteString]+group = go+  where+    go Empty        = []+    go (Chunk c cs)+      | S.length c == 1  = to [c] (S.unsafeHead c) cs+      | otherwise        = to [S.unsafeTake 1 c] (S.unsafeHead c) (Chunk (S.unsafeTail c) cs)++    to acc !_ Empty        = [revNonEmptyChunks acc]+    to acc !w (Chunk c cs) =+      case S.findIndex (/= w) c of+        Just 0  -> revNonEmptyChunks acc : go (Chunk c cs)+        Nothing -> to (c : acc) w cs+        Just n  -> revNonEmptyChunks (S.unsafeTake n c : acc) : go (Chunk (S.unsafeDrop n c) cs)++groupBy :: (Word8 -> Word8 -> Bool) -> ByteString -> [ByteString]+groupBy k = go+  where+    go Empty        = []+    go (Chunk c cs)+      | S.length c == 1  = to [c] (S.unsafeHead c) cs+      | otherwise        = to [S.unsafeTake 1 c] (S.unsafeHead c) (Chunk (S.unsafeTail c) cs)++    to acc !_ Empty        = [revNonEmptyChunks acc]+    to acc !w (Chunk c cs) =+      case S.findIndex (not . k w) c of+        Just 0  -> revNonEmptyChunks acc : go (Chunk c cs)+        Nothing -> to (c : acc) w cs+        Just n  -> revNonEmptyChunks (S.unsafeTake n c : acc) : go (Chunk (S.unsafeDrop n c) cs)++index :: ByteString -> Int64 -> Word8+index _  i | i < 0  = error ("Data.ByteString.Lazy.index: negative index: " ++ show i)+index cs0 i         = index' cs0 i+  where index' Empty     n = error ("Data.ByteString.Lazy.index: index too large: " ++ show n)+        index' (Chunk c cs) n+          | n >= primIntToInt64 (S.length c) =+              index' cs (n - primIntToInt64 (S.length c))+          | otherwise       = S.unsafeIndex c (primInt64ToInt n)++indexMaybe :: ByteString -> Int64 -> Maybe Word8+indexMaybe _ i | i < 0 = Nothing+indexMaybe cs0 i       = index' cs0 i+  where index' Empty _ = Nothing+        index' (Chunk c cs) n+          | n >= primIntToInt64 (S.length c) =+              index' cs (n - primIntToInt64 (S.length c))+          | otherwise       = Just $! S.unsafeIndex c (primInt64ToInt n)++(!?) :: ByteString -> Int64 -> Maybe Word8+(!?) = indexMaybe++elemIndex :: Word8 -> ByteString -> Maybe Int64+elemIndex w = elemIndex' 0+  where elemIndex' _ Empty        = Nothing+        elemIndex' n (Chunk c cs) =+          case S.elemIndex w c of+            Nothing -> elemIndex' (n + primIntToInt64 (S.length c)) cs+            Just i  -> Just (n + primIntToInt64 i)++elemIndexEnd :: Word8 -> ByteString -> Maybe Int64+elemIndexEnd = findIndexEnd . (==)++elemIndices :: Word8 -> ByteString -> [Int64]+elemIndices w = elemIndices' 0+  where elemIndices' _ Empty        = []+        elemIndices' n (Chunk c cs) = List.map ((+ n) . primIntToInt64) (S.elemIndices w c)+                             ++ elemIndices' (n + primIntToInt64 (S.length c)) cs++count :: Word8 -> ByteString -> Int64+count w = foldlChunks (\n c -> n + primIntToInt64 (S.count w c)) 0++findIndex :: (Word8 -> Bool) -> ByteString -> Maybe Int64+findIndex k = findIndex' 0+  where findIndex' _ Empty        = Nothing+        findIndex' n (Chunk c cs) =+          case S.findIndex k c of+            Nothing -> findIndex' (n + primIntToInt64 (S.length c)) cs+            Just i  -> Just (n + primIntToInt64 i)++findIndexEnd :: (Word8 -> Bool) -> ByteString -> Maybe Int64+findIndexEnd k = findIndexEnd' 0+  where+    findIndexEnd' _ Empty = Nothing+    findIndexEnd' n (Chunk c cs) =+      let !n' = n + S.length c+          !i  = primIntToInt64 . (n +) <$> S.findIndexEnd k c+      in findIndexEnd' n' cs `mplus` i++find :: (Word8 -> Bool) -> ByteString -> Maybe Word8+find f = find'+  where find' Empty        = Nothing+        find' (Chunk c cs) = case S.find f c of+            Nothing -> find' cs+            Just w  -> Just w++findIndices :: (Word8 -> Bool) -> ByteString -> [Int64]+findIndices k = findIndices' 0+  where findIndices' _ Empty        = []+        findIndices' n (Chunk c cs) = List.map ((+ n) . primIntToInt64) (S.findIndices k c)+                             ++ findIndices' (n + primIntToInt64 (S.length c)) cs++elem :: Word8 -> ByteString -> Bool+elem w bs =+  case elemIndex w bs of+    Nothing -> False+    _       -> True++notElem :: Word8 -> ByteString -> Bool+notElem w cs = not (w `elem` cs)++filter :: (Word8 -> Bool) -> ByteString -> ByteString+filter p = go+    where+        go Empty        = Empty+        go (Chunk x xs) = chunk (S.filter p x) (go xs)++partition :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)+partition _ Empty = (Empty, Empty)+partition p (Chunk x xs) = (chunk t ts, chunk f fs)+  where+    (t,   f) = S.partition p x+    (ts, fs) = partition   p xs++isPrefixOf :: ByteString -> ByteString -> Bool+isPrefixOf Empty _  = True+isPrefixOf _ Empty  = False+isPrefixOf (Chunk x xs) (Chunk y ys)+    | S.length x == S.length y = x == y  && isPrefixOf xs ys+    | S.length x <  S.length y = x == yh && isPrefixOf xs (Chunk yt ys)+    | otherwise                = xh == y && isPrefixOf (Chunk xt xs) ys+  where (xh,xt) = S.splitAt (S.length y) x+        (yh,yt) = S.splitAt (S.length x) y++stripPrefix :: ByteString -> ByteString -> Maybe ByteString+stripPrefix Empty bs  = Just bs+stripPrefix _ Empty  = Nothing+stripPrefix (Chunk x xs) (Chunk y ys)+    | S.length x == S.length y = if x == y then stripPrefix xs ys else Nothing+    | S.length x <  S.length y = do yt <- S.stripPrefix x y+                                    stripPrefix xs (Chunk yt ys)+    | otherwise                = do xt <- S.stripPrefix y x+                                    stripPrefix (Chunk xt xs) ys++isSuffixOf :: ByteString -> ByteString -> Bool+isSuffixOf x y = reverse x `isPrefixOf` reverse y++stripSuffix :: ByteString -> ByteString -> Maybe ByteString+stripSuffix x y = reverse <$> stripPrefix (reverse x) (reverse y)++zip :: ByteString -> ByteString -> [(Word8, Word8)]+zip = zipWith (,)++zipWith :: (Word8 -> Word8 -> a) -> ByteString -> ByteString -> [a]+zipWith _ Empty     _  = []+zipWith _ _      Empty = []+zipWith f (Chunk a as) (Chunk b bs) = go a as b bs+  where+    -- This loop is written in a slightly awkward way but ensures we+    -- don't have to allocate any 'Chunk' objects to pass to a recursive+    -- call.  We have in some sense performed SpecConstr manually.+    go !x xs !y ys = let+      -- Creating a thunk for reading one byte would+      -- be wasteful, so we evaluate these eagerly.+      -- See also #558 for a similar issue with uncons.+      !xHead = S.unsafeHead x+      !yHead = S.unsafeHead y+      in f xHead yHead : to (S.unsafeTail x) xs (S.unsafeTail y) ys++    to !x xs !y ys+      | Chunk x' xs' <- chunk x xs+      , Chunk y' ys' <- chunk y ys+      = go x' xs' y' ys'+      | otherwise = []++packZipWith :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString -> ByteString+packZipWith _ Empty _ = Empty+packZipWith _ _ Empty = Empty+packZipWith f (Chunk a as) (Chunk b bs) = Chunk (S.packZipWith f a b) $+    case compare al bl of+        LT -> packZipWith f as $ Chunk (S.drop al b) bs+        EQ -> packZipWith f as bs+        GT -> packZipWith f (Chunk (S.drop bl a) as) bs+  where+    al = S.length a+    bl = S.length b++unzip :: [(Word8, Word8)] -> (ByteString, ByteString)+unzip ls = (pack (List.map fst ls), pack (List.map snd ls))++inits :: ByteString -> [ByteString]+inits bs = NE.toList $! initsNE bs++initsNE :: ByteString -> NonEmpty ByteString+initsNE = (Empty :|) . inits' id+  where+    inits' :: (ByteString -> ByteString) -> ByteString -> [ByteString]+    -- inits' f bs === map f (tail (inits bs))+    inits' _ Empty = []+    inits' f (Chunk c cs)+      = [f (S.unsafeTake n c `Chunk` Empty) | n <- [1..S.length c]]+      ++ inits' (f . Chunk c) cs++tails :: ByteString -> [ByteString]+tails bs = NE.toList $! tailsNE bs++tailsNE :: ByteString -> NonEmpty ByteString+tailsNE bs = case uncons bs of+  Nothing -> Empty :| []+  Just (_, tl) -> bs :| tails tl++copy :: ByteString -> ByteString+copy = foldrChunks (Chunk . S.copy) Empty++hGetContentsN :: Int -> Handle -> IO ByteString+hGetContentsN k h = lazyRead -- TODO close on exceptions+  where+    lazyRead = unsafeInterleaveIO loop++    loop = do+        c <- S.hGetSome h k -- only blocks if there is no data available+        if S.null c+          then hClose h >> return Empty+          else Chunk c <$> lazyRead++hGetN :: Int -> Handle -> Int -> IO ByteString+hGetN k h n | n > 0 = readChunks n+  where+    readChunks !i = do+        c <- S.hGet h (min k i)+        case S.length c of+            0 -> return Empty+            m -> do cs <- readChunks (i - m)+                    return (Chunk c cs)+hGetN _ _ 0 = return Empty+hGetN _ h n = illegalBufferSize h "hGet" n++hGetNonBlockingN :: Int -> Handle -> Int -> IO ByteString+hGetNonBlockingN k h n | n > 0 = readChunks n+  where+    readChunks !i = do+        c <- S.hGetNonBlocking h (min k i)+        case S.length c of+            0 -> return Empty+            m -> do cs <- readChunks (i - m)+                    return (Chunk c cs)+hGetNonBlockingN _ _ 0 = return Empty+hGetNonBlockingN _ h n = illegalBufferSize h "hGetNonBlocking" n++illegalBufferSize :: Handle -> String -> Int -> IO a+illegalBufferSize handle fn sz =+    ioError (mkIOError InvalidArgument msg (Just handle) Nothing)+    where+      msg = fn ++ ": illegal ByteString size " ++ showsPrec 9 sz []++hGetContents :: Handle -> IO ByteString+hGetContents = hGetContentsN defaultChunkSize++hGet :: Handle -> Int -> IO ByteString+hGet = hGetN defaultChunkSize++hGetNonBlocking :: Handle -> Int -> IO ByteString+hGetNonBlocking = hGetNonBlockingN defaultChunkSize++readFile :: FilePath -> IO ByteString+readFile f = openBinaryFile f ReadMode >>= hGetContents++modifyFile :: IOMode -> FilePath -> ByteString -> IO ()+modifyFile mode f txt = withBinaryFile f mode (`hPut` txt)++writeFile :: FilePath -> ByteString -> IO ()+writeFile = modifyFile WriteMode++appendFile :: FilePath -> ByteString -> IO ()+appendFile = modifyFile AppendMode++getContents :: IO ByteString+getContents = hGetContents stdin++hPut :: Handle -> ByteString -> IO ()+hPut h = foldrChunks (\c rest -> S.hPut h c >> rest) (return ())++hPutNonBlocking :: Handle -> ByteString -> IO ByteString+hPutNonBlocking _ Empty           = return Empty+hPutNonBlocking h bs@(Chunk c cs) = do+  c' <- S.hPutNonBlocking h c+  case S.length c' of+    l' | l' == S.length c -> hPutNonBlocking h cs+    0                     -> return bs+    _                     -> return (Chunk c' cs)++hPutStr :: Handle -> ByteString -> IO ()+hPutStr = hPut++putStr :: ByteString -> IO ()+putStr = hPut stdout++interact :: (ByteString -> ByteString) -> IO ()+interact transformer = putStr . transformer =<< getContents++-- ---------------------------------------------------------------------+-- Internal utilities++errorEmpty :: String -> a+errorEmpty fun = error ("Data.ByteString.Lazy." ++ fun ++ ": empty bytestring")++-- reverse a list of non-empty chunks into a lazy ByteString+revNonEmptyChunks :: [S.ByteString] -> ByteString+revNonEmptyChunks = List.foldl' (flip Chunk) Empty++-- reverse a list of possibly-empty chunks into a lazy ByteString+revChunks :: [S.ByteString] -> ByteString+revChunks = List.foldl' (flip chunk) Empty
lib/Data/ByteString/Lazy/Char8.hs view
@@ -1,325 +1,485 @@-module Data.ByteString.Lazy.Char8(module Data.ByteString.Lazy.Char8) where+-- |+-- Module      : Data.ByteString.Lazy.Char8+-- Copyright   : (c) Don Stewart 2006-2008+--               (c) Duncan Coutts 2006-2011+-- License     : BSD-style+--+-- Maintainer  : dons00@gmail.com, duncan@community.haskell.org+-- Stability   : stable+-- Portability : portable+--+-- Manipulate /lazy/ 'ByteString's using 'Char' operations. All Chars will+-- be truncated to 8 bits. It can be expected that these functions will+-- run at identical speeds to their 'Data.Word.Word8' equivalents in+-- "Data.ByteString.Lazy".+--+-- This module is intended to be imported @qualified@, to avoid name+-- clashes with "Prelude" functions.  eg.+--+-- > import qualified Data.ByteString.Lazy.Char8 as C+--+-- The Char8 interface to bytestrings provides an instance of IsString+-- for the ByteString type, enabling you to use string literals, and+-- have them implicitly packed to ByteStrings.+-- Use @{-\# LANGUAGE OverloadedStrings \#-}@ to enable this.+--++module Data.ByteString.Lazy.Char8 (++        -- * The @ByteString@ type+        ByteString,++        -- * Introducing and eliminating 'ByteString's+        L.empty,+        singleton,+        pack,+        unpack,+        L.fromChunks,+        L.toChunks,+        L.fromStrict,+        L.toStrict,++        -- * Basic interface+        cons,+        --cons',+        snoc,+        L.append,+        head,+        uncons,+        last,+        L.tail,+        unsnoc,+        L.init,+        L.null,+        L.length,++        -- * Transforming ByteStrings+        map,+        L.reverse,+        intersperse,+        L.intercalate,+        L.transpose,++        -- * Reducing 'ByteString's (folds)+        foldl,+        foldl',+        foldl1,+        foldl1',+        foldr,+        foldr',+        foldr1,+        foldr1',++        -- ** Special folds+        L.concat,+        concatMap,+        any,+        all,+        maximum,+        minimum,+        L.compareLength,++        -- * Building ByteStrings+        -- ** Scans+        scanl,+        scanl1,+        scanr,+        scanr1,++        -- ** Accumulating maps+        mapAccumL,+        mapAccumR,++        -- ** Infinite ByteStrings+        repeat,+        replicate,+        L.cycle,+        iterate,++        -- ** Unfolding ByteStrings+        unfoldr,++        -- * Substrings++        -- ** Breaking strings+        L.take,+        L.takeEnd,+        L.drop,+        L.dropEnd,+        L.splitAt,+        takeWhile,+        takeWhileEnd,+        dropWhile,+        dropWhileEnd,+        span,+        spanEnd,+        break,+        breakEnd,+        L.group,+        groupBy,+        L.inits,+        L.tails,+        L.initsNE,+        L.tailsNE,+        L.stripPrefix,+        L.stripSuffix,++        -- ** Breaking into many substrings+        split,+        splitWith,++        -- ** Breaking into lines and words+        lines,+        words,+        unlines,+        unwords,++        -- * Predicates+        L.isPrefixOf,+        L.isSuffixOf,++        -- * Searching ByteStrings++        -- ** Searching by equality+        elem,+        notElem,++        -- ** Searching with a predicate+        find,+        filter,+        partition,++        -- * Indexing ByteStrings+        index,+        indexMaybe,+        (!?),+        elemIndex,+        elemIndexEnd,+        elemIndices,+        findIndex,+        findIndexEnd,+        findIndices,+        count,++        -- * Zipping and unzipping ByteStrings+        zip,+        zipWith,+        packZipWith,+        unzip,++        -- * Ordered ByteStrings+--        sort,++        -- * Low level conversions+        -- ** Copying ByteStrings+        L.copy,++        -- * Reading from ByteStrings+        -- | Note that a lazy 'ByteString' may hold an unbounded stream of+        -- @\'0\'@ digits, in which case the functions below may never return.+        -- If that's a concern, you can use 'take' to first truncate the input+        -- to an acceptable length.  Non-termination is also possible when+        -- reading arbitrary precision numbers via 'readInteger' or+        -- 'readNatural', if the input is an unbounded stream of arbitrary+        -- decimal digits.+        --+        --readInt,+        --readInt64,+        --readInt32,+        --readInt16,+        --readInt8,++        --readWord,+        --readWord64,+        --readWord32,+        --readWord16,+        --readWord8,++        --readInteger,+        --readNatural,++        -- * I\/O with 'ByteString's+        -- | ByteString I/O uses binary mode, without any character decoding+        -- or newline conversion. The fact that it does not respect the Handle+        -- newline mode is considered a flaw and may be changed in a future version.++        -- ** Standard input and output+        L.getContents,+        L.putStr,+        putStrLn,+        L.interact,++        -- ** Files+        L.readFile,+        L.writeFile,+        L.appendFile,++        -- ** I\/O with Handles+        L.hGetContents,+        L.hGet,+        L.hGetNonBlocking,+        L.hPut,+        L.hPutNonBlocking,+        L.hPutStr,+        hPutStrLn,++  ) where++import qualified Prelude ()+import MiniPrelude as P+import Data.ByteString.Lazy (ByteString)+import qualified Data.ByteString.Lazy as L+import qualified Data.ByteString as S (ByteString) -- typename only import qualified Data.ByteString as B-import Data.Coerce-import Data.List.NonEmpty-import Data.Word(Word8)-import Foreign.C.String(CString, CStringLen)-import System.IO(Handle)+import qualified Data.ByteString.Unsafe as B+import Data.List.NonEmpty (NonEmpty(..)) -newtype ByteString = BS B.ByteString-  deriving (Eq, Ord)+import Data.ByteString.Internal (c2w, w2c) -fromFilePath :: FilePath -> IO ByteString-fromFilePath = coerce B.fromFilePath+import Data.Int (Int64)+import qualified Data.List as List -toFilePath :: ByteString -> IO FilePath-toFilePath = coerce B.toFilePath+import System.IO.Base (Handle, stdout) +------------------------------------------------------------------------++singleton :: Char -> ByteString+singleton = L.singleton . c2w++pack :: [Char] -> ByteString+pack = L.pack . P.map c2w++unpack :: ByteString -> [Char]+unpack = P.map w2c . L.unpack++infixr 5 `cons`, `cons'` --same as list (:)+infixl 5 `snoc`+ cons :: Char -> ByteString -> ByteString-cons = coerce B.cons+cons = L.cons . c2w +--cons' :: Char -> ByteString -> ByteString+--cons' = L.cons' . c2w+ snoc :: ByteString -> Char -> ByteString-snoc = coerce B.snoc+snoc p = L.snoc p . c2w  head :: ByteString -> Char-head = coerce B.head--tail :: ByteString -> ByteString-tail = coerce B.tail+head = w2c . L.head  uncons :: ByteString -> Maybe (Char, ByteString)-uncons = coerce B.uncons--last :: ByteString -> Char-last = coerce B.last--init :: ByteString -> ByteString-init = coerce B.init+uncons bs = case L.uncons bs of+                  Nothing -> Nothing+                  Just (w, bs') -> Just (w2c w, bs')  unsnoc :: ByteString -> Maybe (ByteString, Char)-unsnoc = coerce B.unsnoc+unsnoc bs = case L.unsnoc bs of+                  Nothing -> Nothing+                  Just (bs', w) -> Just (bs', w2c w) -null :: ByteString -> Bool-null = coerce B.null+last :: ByteString -> Char+last = w2c . L.last  map :: (Char -> Char) -> ByteString -> ByteString-map = coerce B.map--reverse :: ByteString -> ByteString-reverse = coerce B.reverse+map f = L.map (c2w . f . w2c)  intersperse :: Char -> ByteString -> ByteString-intersperse = coerce B.intersperse--transpose :: [ByteString] -> [ByteString]-transpose = coerce B.transpose+intersperse = L.intersperse . c2w  foldl :: (a -> Char -> a) -> a -> ByteString -> a-foldl f z x = B.foldl (coerce f) z (coerce x)+foldl f = L.foldl (\a c -> f a (w2c c))  foldl' :: (a -> Char -> a) -> a -> ByteString -> a-foldl' f z x = B.foldl' (coerce f) z (coerce x)+foldl' f = L.foldl' (\a c -> f a (w2c c))  foldr :: (Char -> a -> a) -> a -> ByteString -> a-foldr f z x = B.foldr (coerce f) z (coerce x)+foldr f = L.foldr (f . w2c)  foldr' :: (Char -> a -> a) -> a -> ByteString -> a-foldr' f z x = B.foldr' (coerce f) z (coerce x)+foldr' f = L.foldr' (f . w2c)  foldl1 :: (Char -> Char -> Char) -> ByteString -> Char-foldl1 = coerce B.foldl1+foldl1 f ps = w2c (L.foldl1 (\x y -> c2w (f (w2c x) (w2c y))) ps)  foldl1' :: (Char -> Char -> Char) -> ByteString -> Char-foldl1' = coerce B.foldl1'+foldl1' f ps = w2c (L.foldl1' (\x y -> c2w (f (w2c x) (w2c y))) ps)  foldr1 :: (Char -> Char -> Char) -> ByteString -> Char-foldr1 = coerce B.foldr1+foldr1 f ps = w2c (L.foldr1 (\x y -> c2w (f (w2c x) (w2c y))) ps)  foldr1' :: (Char -> Char -> Char) -> ByteString -> Char-foldr1' = coerce B.foldr1'--concat :: [ByteString] -> ByteString-concat = coerce B.concat+foldr1' f ps = w2c (L.foldr1' (\x y -> c2w (f (w2c x) (w2c y))) ps)  concatMap :: (Char -> ByteString) -> ByteString -> ByteString-concatMap = coerce B.concatMap+concatMap f = L.concatMap (f . w2c)  any :: (Char -> Bool) -> ByteString -> Bool-any = coerce B.any+any f = L.any (f . w2c)  all :: (Char -> Bool) -> ByteString -> Bool-all = coerce B.all+all f = L.all (f . w2c)  maximum :: ByteString -> Char-maximum = coerce B.maximum+maximum = w2c . L.maximum  minimum :: ByteString -> Char-minimum = coerce B.minimum--mapAccumL :: (acc -> Char -> (acc, Char)) -> acc -> ByteString -> (acc, ByteString)-mapAccumL f s x = coerce (B.mapAccumL (coerce f) s (coerce x))+minimum = w2c . L.minimum -mapAccumR :: (acc -> Char -> (acc, Char)) -> acc -> ByteString -> (acc, ByteString)-mapAccumR f s x = coerce (B.mapAccumR (coerce f) s (coerce x))+scanl :: (Char -> Char -> Char) -> Char -> ByteString -> ByteString+scanl f z = L.scanl (\a b -> c2w (f (w2c a) (w2c b))) (c2w z)  scanl1 :: (Char -> Char -> Char) -> ByteString -> ByteString-scanl1 = coerce B.scanl1--scanr1 :: (Char -> Char -> Char) -> ByteString -> ByteString-scanr1 = coerce B.scanr1+scanl1 f = L.scanl1 f'+  where f' accumulator value = c2w (f (w2c accumulator) (w2c value)) -replicate :: Int -> Char -> ByteString-replicate = coerce B.replicate+scanr+    :: (Char -> Char -> Char)+    -- ^ element -> accumulator -> new accumulator+    -> Char+    -- ^ starting value of accumulator+    -> ByteString+    -- ^ input of length n+    -> ByteString+    -- ^ output of length n+1+scanr f = L.scanr f' . c2w+  where f' accumulator value = c2w (f (w2c accumulator) (w2c value)) -unfoldr :: (a -> Maybe (Char, a)) -> a -> ByteString-unfoldr f a = coerce (B.unfoldr (coerce f) a)+scanr1 :: (Char -> Char -> Char) -> ByteString -> ByteString+scanr1 f = L.scanr1 f'+  where f' accumulator value = c2w (f (w2c accumulator) (w2c value)) -unfoldrN :: Int -> (a -> Maybe (Char, a)) -> a -> (ByteString, Maybe a)-unfoldrN n f a = coerce (B.unfoldrN n (coerce f) a)+mapAccumL :: (acc -> Char -> (acc, Char)) -> acc -> ByteString -> (acc, ByteString)+mapAccumL f = L.mapAccumL (\a w -> case f a (w2c w) of (a',c) -> (a', c2w c)) -take :: Int -> ByteString -> ByteString-take = coerce B.take+mapAccumR :: (acc -> Char -> (acc, Char)) -> acc -> ByteString -> (acc, ByteString)+mapAccumR f = L.mapAccumR (\acc w -> case f acc (w2c w) of (acc', c) -> (acc', c2w c)) -takeEnd :: Int -> ByteString -> ByteString-takeEnd = coerce B.takeEnd+iterate :: (Char -> Char) -> Char -> ByteString+iterate f = L.iterate (c2w . f . w2c) . c2w -drop  :: Int -> ByteString -> ByteString-drop = coerce B.drop+repeat :: Char -> ByteString+repeat = L.repeat . c2w -dropEnd :: Int -> ByteString -> ByteString-dropEnd = coerce B.dropEnd+replicate :: Int64 -> Char -> ByteString+replicate w c = L.replicate w (c2w c) -splitAt :: Int -> ByteString -> (ByteString, ByteString)-splitAt = coerce B.splitAt+unfoldr :: (a -> Maybe (Char, a)) -> a -> ByteString+unfoldr f = L.unfoldr $ \a -> case f a of+                                    Nothing      -> Nothing+                                    Just (c, a') -> Just (c2w c, a')  takeWhile :: (Char -> Bool) -> ByteString -> ByteString-takeWhile = coerce B.takeWhile+takeWhile f = L.takeWhile (f . w2c)  takeWhileEnd :: (Char -> Bool) -> ByteString -> ByteString-takeWhileEnd = coerce B.takeWhileEnd+takeWhileEnd f = L.takeWhileEnd (f . w2c)  dropWhile :: (Char -> Bool) -> ByteString -> ByteString-dropWhile = coerce B.dropWhile+dropWhile f = L.dropWhile (f . w2c)  dropWhileEnd :: (Char -> Bool) -> ByteString -> ByteString-dropWhileEnd = coerce B.dropWhileEnd+dropWhileEnd f = L.dropWhileEnd (f . w2c)  break :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-break = coerce B.break+break f = L.break (f . w2c)  breakEnd :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-breakEnd = coerce B.breakEnd+breakEnd f = L.breakEnd (f . w2c)  span :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-span = coerce B.span+span f = L.span (f . w2c)  spanEnd :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-spanEnd = coerce B.spanEnd--splitWith :: (Char -> Bool) -> ByteString -> [ByteString]-splitWith = coerce B.splitWith+spanEnd f = L.spanEnd (f . w2c)  split :: Char -> ByteString -> [ByteString]-split = coerce B.split+split = L.split . c2w -group :: ByteString -> [ByteString]-group = coerce B.group+splitWith :: (Char -> Bool) -> ByteString -> [ByteString]+splitWith f = L.splitWith (f . w2c)  groupBy :: (Char -> Char -> Bool) -> ByteString -> [ByteString]-groupBy = coerce B.groupBy--intercalate :: ByteString -> [ByteString] -> ByteString-intercalate = coerce B.intercalate+groupBy k = L.groupBy (\a b -> k (w2c a) (w2c b)) -index :: ByteString -> Int -> Char-index = coerce B.index+index :: ByteString -> Int64 -> Char+index = (w2c .) . L.index -indexMaybe :: ByteString -> Int -> Maybe Char-indexMaybe = coerce B.indexMaybe+indexMaybe :: ByteString -> Int64 -> Maybe Char+indexMaybe = (fmap w2c .) . L.indexMaybe -(!?) :: ByteString -> Int -> Maybe Char-(!?) = coerce (B.!?)+(!?) :: ByteString -> Int64 -> Maybe Char+(!?) = indexMaybe -elemIndex :: Char -> ByteString -> Maybe Int-elemIndex = coerce B.elemIndex+elemIndex :: Char -> ByteString -> Maybe Int64+elemIndex = L.elemIndex . c2w -elemIndexEnd :: Char -> ByteString -> Maybe Int-elemIndexEnd = coerce B.elemIndexEnd+elemIndexEnd :: Char -> ByteString -> Maybe Int64+elemIndexEnd = L.elemIndexEnd . c2w -elemIndices :: Char -> ByteString -> [Int]-elemIndices = coerce B.elemIndices+elemIndices :: Char -> ByteString -> [Int64]+elemIndices = L.elemIndices . c2w -count :: Char -> ByteString -> Int-count = coerce B.count+findIndex :: (Char -> Bool) -> ByteString -> Maybe Int64+findIndex f = L.findIndex (f . w2c) -findIndex :: (Char -> Bool) -> ByteString -> Maybe Int-findIndex = coerce B.findIndex+findIndexEnd :: (Char -> Bool) -> ByteString -> Maybe Int64+findIndexEnd f = L.findIndexEnd (f . w2c) -findIndexEnd :: (Char -> Bool) -> ByteString -> Maybe Int-findIndexEnd = coerce B.findIndexEnd+findIndices :: (Char -> Bool) -> ByteString -> [Int64]+findIndices f = L.findIndices (f . w2c) -findIndices :: (Char -> Bool) -> ByteString -> [Int]-findIndices = coerce B.findIndices+count :: Char -> ByteString -> Int64+count c = L.count (c2w c)  elem :: Char -> ByteString -> Bool-elem = coerce B.elem+elem c = L.elem (c2w c)  notElem :: Char -> ByteString -> Bool-notElem = coerce B.notElem+notElem c = L.notElem (c2w c)  filter :: (Char -> Bool) -> ByteString -> ByteString-filter = coerce B.filter--find :: (Char -> Bool) -> ByteString -> Maybe Char-find = coerce B.find+filter f = L.filter (f . w2c)  partition :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)-partition = coerce B.partition--isPrefixOf :: ByteString -> ByteString -> Bool-isPrefixOf = coerce B.isPrefixOf--stripPrefix :: ByteString -> ByteString -> Maybe ByteString-stripPrefix = coerce B.stripPrefix--isSuffixOf :: ByteString -> ByteString -> Bool-isSuffixOf = coerce B.isSuffixOf--stripSuffix :: ByteString -> ByteString -> Maybe ByteString-stripSuffix = coerce B.stripSuffix--isInfixOf :: ByteString -> ByteString -> Bool-isInfixOf = coerce B.isInfixOf--isValidUtf8 :: ByteString -> Bool-isValidUtf8 = coerce B.isValidUtf8+partition f = L.partition (f . w2c) -breakSubstring :: ByteString -> ByteString -> (ByteString,ByteString)-breakSubstring = coerce B.breakSubstring+find :: (Char -> Bool) -> ByteString -> Maybe Char+find f ps = w2c `fmap` L.find (f . w2c) ps  zip :: ByteString -> ByteString -> [(Char,Char)]-zip = coerce B.zip+zip ps qs+    | L.null ps || L.null qs = []+    | otherwise = (head ps, head qs) : zip (L.tail ps) (L.tail qs)  zipWith :: (Char -> Char -> a) -> ByteString -> ByteString -> [a]-zipWith f x y = B.zipWith (coerce f) (coerce x) (coerce y)+zipWith f = L.zipWith ((. w2c) . f . w2c)  packZipWith :: (Char -> Char -> Char) -> ByteString -> ByteString -> ByteString-packZipWith = coerce B.packZipWith--unzip :: [(Char,Char)] -> (ByteString,ByteString)-unzip = coerce B.unzip--inits :: ByteString -> [ByteString]-inits = coerce B.inits--initsNE :: ByteString -> NonEmpty ByteString-initsNE = coerce B.initsNE--tails :: ByteString -> [ByteString]-tails = coerce B.tails--tailsNE :: ByteString -> NonEmpty ByteString-tailsNE = coerce B.tailsNE--sort :: ByteString -> ByteString-sort = coerce B.sort--useAsCString :: ByteString -> (CString -> IO a) -> IO a-useAsCString x = B.useAsCString (coerce x)--useAsCStringLen :: ByteString -> (CStringLen -> IO a) -> IO a-useAsCStringLen x = B.useAsCStringLen (coerce x)--packCString :: CString -> IO ByteString-packCString = coerce B.packCString--packCStringLen :: CStringLen -> IO ByteString-packCStringLen = coerce B.packCStringLen--copy :: ByteString -> ByteString-copy = coerce B.copy--getLine :: IO ByteString-getLine = coerce B.getLine--hGetLine :: Handle -> IO ByteString-hGetLine = coerce B.hGetLine--hPut :: Handle -> ByteString -> IO ()-hPut = coerce B.hPut--hPutNonBlocking :: Handle -> ByteString -> IO ByteString-hPutNonBlocking = coerce B.hPutNonBlocking--hPutStr :: Handle -> ByteString -> IO ()-hPutStr = coerce B.hPutStr--putStr :: ByteString -> IO ()-putStr = coerce B.putStr--hGet :: Handle -> Int -> IO ByteString-hGet = coerce B.hGet--hGetNonBlocking :: Handle -> Int -> IO ByteString-hGetNonBlocking = coerce B.hGetNonBlocking+packZipWith f = L.packZipWith f'+    where+        f' c1 c2 = c2w $ f (w2c c1) (w2c c2) -hGetSome :: Handle -> Int -> IO ByteString-hGetSome = coerce B.hGetSome+unzip :: [(Char, Char)] -> (ByteString, ByteString)+unzip ls = (pack (fmap fst ls), pack (fmap snd ls)) -hGetContents :: Handle -> IO ByteString-hGetContents = coerce B.hGetContents+lines :: ByteString -> [ByteString]+lines bs+  | L.null bs = []+  | otherwise = case elemIndex '\n' bs of+      Nothing -> [bs]+      Just n  -> L.take n bs : lines (L.drop (n + 1) bs) -getContents :: IO ByteString-getContents = coerce B.getContents+unlines :: [ByteString] -> ByteString+unlines = List.foldr (\x t -> x `L.append` cons '\n' t) L.empty -interact :: (ByteString -> ByteString) -> IO ()-interact = coerce B.interact+words :: ByteString -> [ByteString]+words = List.filter (not . L.null) . splitWith isSpace -readFile :: FilePath -> IO ByteString-readFile = coerce B.readFile+unwords :: [ByteString] -> ByteString+unwords = L.intercalate (singleton ' ') -writeFile :: FilePath -> ByteString -> IO ()-writeFile = coerce B.writeFile+hPutStrLn :: Handle -> ByteString -> IO ()+hPutStrLn h ps = L.hPut h ps >> L.hPut h (L.singleton 0x0a) -appendFile :: FilePath -> ByteString -> IO ()-appendFile = coerce B.appendFile+putStrLn :: ByteString -> IO ()+putStrLn = hPutStrLn stdout
+ lib/Data/ByteString/Lazy/Internal.hs view
@@ -0,0 +1,147 @@+module Data.ByteString.Lazy.Internal where++import Control.DeepSeq.Class+import qualified Data.ByteString.Internal as S+import qualified Data.ByteString.Unsafe as S+import qualified Data.ByteString.Char8 as C+import Data.Word.Word8+import Data.List.NonEmpty_Type++data ByteString = Empty | Chunk !S.StrictByteString ByteString++type LazyByteString = ByteString++instance Eq ByteString where+  (==) = eq++instance Ord ByteString where+  compare = cmp++instance Semigroup ByteString where+  (<>) = append+  sconcat (b :| bs) = concat (b : bs)+  stimes = times++instance Monoid ByteString where+  mempty = Empty+  mconcat = concat++instance NFData ByteString where+  rnf Empty        = ()+  rnf (Chunk c cs) = rnf c `seq` rnf cs++instance Show ByteString where+  showsPrec p bs = showsPrec p (unpackChars bs)++instance Read ByteString where+  readsPrec p bs = [(packChars x, y) | (x, y) <- readsPrec p bs]++instance IsString ByteString where+  fromString = packChars++------------------------------------------------------------------------+-- Packing and unpacking from lists++packBytes :: [Word8] -> ByteString+packBytes cs0 =+    packChunks 32 cs0+  where+    packChunks n cs = case splitAt n cs of+      (bs, [])  -> chunk (S.pack bs) Empty+      (bs, cs') -> Chunk (S.pack bs) (packChunks (min (n * 2) smallChunkSize) cs')++packChars :: [Char] -> ByteString+packChars cs0 = packChunks 32 cs0+  where+    packChunks n cs = case splitAt n cs of+      (bs, [])  -> chunk (C.pack bs) Empty+      (bs, cs') -> Chunk (C.pack bs) (packChunks (min (n * 2) smallChunkSize) cs')++unpackBytes :: ByteString -> [Word8]+unpackBytes Empty        = []+unpackBytes (Chunk c cs) = S.unpack c ++ unpackBytes cs++unpackChars :: ByteString -> [Char]+unpackChars Empty        = []+unpackChars (Chunk c cs) = C.unpack c ++ unpackChars cs++chunk :: S.StrictByteString -> ByteString -> ByteString+chunk c cs+  | S.null c = cs+  | otherwise = Chunk c cs++foldrChunks :: (S.StrictByteString -> a -> a) -> a -> ByteString -> a+foldrChunks f z = go+  where go Empty        = z+        go (Chunk c cs) = f c (go cs)++foldlChunks :: (a -> S.StrictByteString -> a) -> a -> ByteString -> a+foldlChunks f = go+  where go !a Empty        = a+        go !a (Chunk c cs) = go (f a c) cs++defaultChunkSize :: Int+defaultChunkSize = 32 * k - chunkOverhead+   where k = 1024++smallChunkSize :: Int+smallChunkSize = 4 * k - chunkOverhead+   where k = 1024++chunkOverhead :: Int+chunkOverhead = 2 * _wordSize++eq :: ByteString -> ByteString -> Bool+eq Empty Empty = True+eq Empty _     = False+eq _     Empty = False+eq (Chunk a as) (Chunk b bs) =+  let+    al = S.length a+    bl = S.length b+  in case compare al bl of+    LT -> a == S.unsafeTake al b && eq as (Chunk (S.unsafeDrop al b) bs)+    EQ -> a == b && eq as bs+    GT -> S.unsafeTake bl a == b && eq (Chunk (S.unsafeDrop bl a) as) bs++cmp :: ByteString -> ByteString -> Ordering+cmp Empty Empty = EQ+cmp Empty _     = LT+cmp _     Empty = GT+cmp (Chunk a as) (Chunk b bs) =+  let+    al = S.length a+    bl = S.length b+  in case compare al bl of+    LT -> case compare a (S.unsafeTake al b) of+            EQ     -> cmp as (Chunk (S.unsafeDrop al b) bs)+            result -> result+    EQ -> case compare a b of+            EQ     -> cmp as bs+            result -> result+    GT -> case compare (S.unsafeTake bl a) b of+            EQ     -> cmp (Chunk (S.unsafeDrop bl a) as) bs+            result -> result++append :: ByteString -> ByteString -> ByteString+append xs ys = foldrChunks Chunk ys xs++concat :: [ByteString] -> ByteString+concat = foldr append Empty++times :: Integral a => a -> ByteString -> ByteString+times 0 _ = Empty+times n lbs0+  | n < 0 = error "stimes: non-negative multiplier expected"+  | otherwise = case lbs0 of+    Empty -> Empty+    Chunk bs lbs -> Chunk bs (go lbs)+  where+    go Empty = times (n-1) lbs0+    go (Chunk c cs) = Chunk c (go cs)++fromStrict :: S.StrictByteString -> LazyByteString+fromStrict bs = chunk bs Empty++toStrict :: LazyByteString -> S.StrictByteString+toStrict = foldlChunks S.append S.empty
+ lib/Data/ByteString/Short.hs view
@@ -0,0 +1,2 @@+module Data.ByteString.Short(module Data.ByteString.Short.Internal) where+import Data.ByteString.Short.Internal
+ lib/Data/ByteString/Short/Internal.hs view
@@ -0,0 +1,447 @@+{-++API matches that of++-- Package     : bytestring-0.12.2.0+--+-- Module      : Data.ByteString.Short.Internal+-- Copyright   : (c) Duncan Coutts 2012-2013, Julian Ospald 2022+-- License     : BSD-style+--+-- Maintainer  : hasufell@posteo.de+-- Stability   : stable+-- Portability : ghc only++but with the representation of ShortByteString hidden+(it is different from GHC).++types and documentation below are copied from bytestring-0.12.2.0+though the implementations differ (except where stated)++-}+module Data.ByteString.Short.Internal(+    -- * The @ShortByteString@ type and representation+    ShortByteString,++    -- * Introducing and eliminating 'ShortByteString's+    empty,+    singleton,+    pack,+    unpack,+    fromShort,+    toShort,++    -- * Basic interface+    snoc,+    cons,+    append,+    last,+    tail,+    uncons,+    head,+    init,+    unsnoc,+    null,+    length,++    -- * Transforming ShortByteStrings+    map,+    reverse,+    intercalate,++    -- * Reducing 'ShortByteString's (folds)+    foldl,+    foldl',+    foldl1,+    foldl1',++    foldr,+    foldr',+    foldr1,+    foldr1',++    -- ** Special folds+    all,+    any,+    concat,++    -- ** Generating and unfolding ShortByteStrings+    replicate,+    unfoldr,+    unfoldrN,++    -- * Substrings++    -- ** Breaking strings+    take,+    takeEnd,+    takeWhileEnd,+    takeWhile,+    drop,+    dropEnd,+    dropWhile,+    dropWhileEnd,+    breakEnd,+    break,+    span,+    spanEnd,+    splitAt,+    split,+    splitWith,+    stripSuffix,+    stripPrefix,++    -- * Predicates+    isInfixOf,+    isPrefixOf,+    isSuffixOf,++    -- ** Search for arbitrary substrings+    breakSubstring,++    -- * Searching ShortByteStrings++    -- ** Searching by equality+    elem,++    -- ** Searching with a predicate+    find,+    filter,+    partition,++    -- * Indexing ShortByteStrings+    index,+    indexMaybe,+    (!?),+    elemIndex,+    elemIndices,+    count,+    findIndex,+    findIndices,+    unsafeIndex,++{-+    -- * Low level operations -- XXX+    createFromPtr,+    copyToPtr,+-}++    -- ** Encoding validation+    isValidUtf8,++    -- * Low level conversions+    -- ** Packing 'Foreign.C.String.CString's and pointers+    packCString,+    packCStringLen,++    -- ** Using ShortByteStrings as 'Foreign.C.String.CString's+    useAsCString,+    useAsCStringLen+  ) where++import Prelude hiding+  ( empty, singleton, pack, unpack, fromShort, toShort,+    snoc, cons, append, unsnoc, last, tail, uncons, head, init,+    null, length, map, reverse, intercalate,+    foldl, foldl', foldl1, foldl1', foldr, foldr', foldr1, foldr1',+    all, any, concat, replicate, unfoldr, unfoldrN,+    take, takeEnd, takeWhileEnd, takeWhile,+    drop, dropEnd, dropWhileEnd, dropWhile,+    break, breakEnd, span, spanEnd, splitAt, split, splitWith,+    stripSuffix, stripPrefix, isInfixOf, isPrefixOf, isSuffixOf,+    breakSubstring, elem, find, filter, partition,+    index, indexMaybe, (!?), elemIndex, elemIndices, count,+    findIndex, findIndices, unsafeIndex,+--  createFromPtr, copyToPtr, -- XXX+    isValidUtf8,+    packCString, packCStringLen, useAsCString, useAsCStringLen,+  )+import Control.DeepSeq.Class+import Foreign (Ptr)+import Foreign.C.String (CString, CStringLen)++import Data.Coerce ( coerce )+import Data.Data ( Data(..) )+import Data.Typeable ( Typeable(..) )+import GHC.Generics ( Generic(..) )+import Data.Monoid ( Monoid(..) )+import Data.Semigroup ( Semigroup(..), stimesMonoid )+import Data.List.NonEmpty ( NonEmpty(..) )+import Data.String ( IsString(..) )+-- import qualified GHC.Exts -- XXX OverloadedLists+import Data.ByteString as BS+import Data.ByteString.Unsafe as BS.Unsafe++import Data.Word (Word8)++newtype ShortByteString = S ByteString+--  deriving (Eq, Ord, Data, Typeable, Generic)+  deriving (Eq, Ord, Typeable, NFData)++fromShort :: ShortByteString -> ByteString+fromShort (S b) = b++toShort :: ByteString -> ShortByteString+toShort b = S b++-- copied from bytestring-0.12.2.0+instance Semigroup ShortByteString where+  (<>)    = append+  sconcat (b:|bs) = concat (b:bs)+  stimes  = stimesMonoid++-- copied from bytestring-0.12.2.0+instance Monoid ShortByteString where+  mempty  = empty+  mappend = (<>)+  mconcat = concat++-- copied from bytestring-0.12.2.0+instance Show ShortByteString where+  showsPrec p ps r = showsPrec p (unpackChars ps) r++-- copied from bytestring-0.12.2.0+instance Read ShortByteString where+  readsPrec p str = [ (packChars x, y) | (x, y) <- readsPrec p str ]++-- copied from bytestring-0.12.2.0+instance IsString ShortByteString where+  fromString = packChars++{-+instance GHC.Exts.IsList ShortByteString where -- XXX OverloadedLists+  type Item ShortByteString = Word8+  fromList  = toShort . GHC.Exts.fromList+  fromListN = (toShort .) . GHC.Exts.fromListN+  toList    = GHC.Exts.toList . fromShort+-}++empty :: ShortByteString+empty = coerce BS.empty++singleton :: Word8 -> ShortByteString+singleton = coerce BS.singleton++pack :: [Word8] -> ShortByteString+pack = coerce BS.pack++unpack :: ShortByteString -> [Word8]+unpack = coerce BS.unpack++snoc :: ShortByteString -> Word8 -> ShortByteString+snoc = coerce BS.snoc++cons :: Word8 -> ShortByteString -> ShortByteString+cons = coerce BS.cons++append :: ShortByteString -> ShortByteString -> ShortByteString+append = coerce BS.append++last :: {-HasCallStack => -} ShortByteString -> Word8+last = coerce BS.last++tail :: {-HasCallStack => -} ShortByteString -> ShortByteString+tail = coerce BS.tail++uncons :: ShortByteString -> Maybe (Word8, ShortByteString)+uncons = coerce BS.uncons++head :: {-HasCallStack => -} ShortByteString -> Word8+head = coerce BS.head++init :: {-HasCallStack => -} ShortByteString -> ShortByteString+init = coerce BS.init++unsnoc :: ShortByteString -> Maybe (ShortByteString, Word8)+unsnoc = coerce BS.unsnoc++null :: ShortByteString -> Bool+null = coerce BS.null++length :: ShortByteString -> Int+length = coerce BS.length++map :: (Word8 -> Word8) -> ShortByteString -> ShortByteString+map = coerce BS.map++reverse :: ShortByteString -> ShortByteString+reverse = coerce BS.reverse++intercalate :: ShortByteString -> [ShortByteString] -> ShortByteString+intercalate = coerce BS.intercalate++foldl :: (a -> Word8 -> a) -> a -> ShortByteString -> a+foldl f e = BS.foldl f e . coerce++foldl' :: (a -> Word8 -> a) -> a -> ShortByteString -> a+foldl' f e = BS.foldl' f e . coerce++foldl1 :: {- HasCallStack => -} (Word8 -> Word8 -> Word8) -> ShortByteString -> Word8+foldl1 = coerce BS.foldl1++foldl1' :: {- HasCallStack => -} (Word8 -> Word8 -> Word8) -> ShortByteString -> Word8+foldl1' = coerce BS.foldl1'++foldr :: (Word8 -> a -> a) -> a -> ShortByteString -> a+foldr f e = BS.foldr f e . coerce++foldr' :: (Word8 -> a -> a) -> a -> ShortByteString -> a+foldr' f e = BS.foldr' f e . coerce++foldr1 :: {- HasCallStack => -} (Word8 -> Word8 -> Word8) -> ShortByteString -> Word8+foldr1 = coerce BS.foldr1++foldr1' :: {- HasCallStack => -} (Word8 -> Word8 -> Word8) -> ShortByteString -> Word8+foldr1' = coerce BS.foldr1'++all :: (Word8 -> Bool) -> ShortByteString -> Bool+all = coerce BS.all++any :: (Word8 -> Bool) -> ShortByteString -> Bool+any = coerce BS.any++concat :: [ShortByteString] -> ShortByteString+concat = coerce BS.concat++replicate :: Int -> Word8 -> ShortByteString+replicate = coerce BS.replicate++unfoldr :: (a -> Maybe (Word8, a)) -> a -> ShortByteString+unfoldr f = coerce . BS.unfoldr f++unfoldrN :: Int -> (a -> Maybe (Word8, a)) -> a -> (ShortByteString, Maybe a)+unfoldrN n f = coerce . BS.unfoldrN n f++take :: Int -> ShortByteString -> ShortByteString+take = coerce BS.take++takeEnd :: Int -> ShortByteString -> ShortByteString+takeEnd = coerce BS.takeEnd++takeWhileEnd :: (Word8 -> Bool) -> ShortByteString -> ShortByteString+takeWhileEnd = coerce BS.takeWhileEnd++takeWhile :: (Word8 -> Bool) -> ShortByteString -> ShortByteString+takeWhile = coerce BS.takeWhile++drop :: Int -> ShortByteString -> ShortByteString+drop = coerce BS.drop++dropEnd :: Int -> ShortByteString -> ShortByteString+dropEnd = coerce BS.dropEnd++dropWhile :: (Word8 -> Bool) -> ShortByteString -> ShortByteString+dropWhile = coerce BS.dropWhile++dropWhileEnd :: (Word8 -> Bool) -> ShortByteString -> ShortByteString+dropWhileEnd = coerce BS.dropWhileEnd++breakEnd :: (Word8 -> Bool) -> ShortByteString -> (ShortByteString, ShortByteString)+breakEnd = coerce BS.breakEnd++break :: (Word8 -> Bool) -> ShortByteString -> (ShortByteString, ShortByteString)+break = coerce BS.break++span :: (Word8 -> Bool) -> ShortByteString -> (ShortByteString, ShortByteString)+span = coerce BS.span++spanEnd :: (Word8 -> Bool) -> ShortByteString -> (ShortByteString, ShortByteString)+spanEnd = coerce BS.spanEnd++splitAt :: Int -> ShortByteString -> (ShortByteString, ShortByteString)+splitAt = coerce BS.splitAt++split :: Word8 -> ShortByteString -> [ShortByteString]+split = coerce BS.split++splitWith :: (Word8 -> Bool) -> ShortByteString -> [ShortByteString]+splitWith = coerce BS.splitWith++stripSuffix :: ShortByteString -> ShortByteString -> Maybe ShortByteString+stripSuffix = coerce BS.stripSuffix++stripPrefix :: ShortByteString -> ShortByteString -> Maybe ShortByteString+stripPrefix = coerce BS.stripPrefix++isInfixOf :: ShortByteString -> ShortByteString -> Bool+isInfixOf = coerce BS.isInfixOf++isPrefixOf :: ShortByteString -> ShortByteString -> Bool+isPrefixOf = coerce BS.isPrefixOf++isSuffixOf :: ShortByteString -> ShortByteString -> Bool+isSuffixOf = coerce BS.isSuffixOf++breakSubstring :: ShortByteString -> ShortByteString -> (ShortByteString, ShortByteString)+breakSubstring = coerce BS.breakSubstring++elem :: Word8 -> ShortByteString -> Bool+elem = coerce BS.elem++find :: (Word8 -> Bool) -> ShortByteString -> Maybe Word8+find = coerce BS.find++filter :: (Word8 -> Bool) -> ShortByteString -> ShortByteString+filter = coerce BS.filter++partition :: (Word8 -> Bool) -> ShortByteString -> (ShortByteString, ShortByteString)+partition = coerce BS.partition++index :: {- HasCallStack => -} ShortByteString -> Int -> Word8+index = coerce BS.index++indexMaybe :: ShortByteString -> Int -> Maybe Word8+indexMaybe = coerce BS.indexMaybe++(!?) :: ShortByteString -> Int -> Maybe Word8+(!?) = coerce (BS.!?)++elemIndex :: Word8 -> ShortByteString -> Maybe Int+elemIndex = coerce BS.elemIndex++elemIndices :: Word8 -> ShortByteString -> [Int]+elemIndices = coerce BS.elemIndices++count :: Word8 -> ShortByteString -> Int+count = coerce BS.count++findIndex :: (Word8 -> Bool) -> ShortByteString -> Maybe Int+findIndex = coerce BS.findIndex++findIndices :: (Word8 -> Bool) -> ShortByteString -> [Int]+findIndices = coerce BS.findIndices++unsafeIndex :: ShortByteString -> Int -> Word8+unsafeIndex = coerce BS.Unsafe.unsafeIndex++{- XXX+createFromPtr :: Ptr a -> Int -> IO ShortByteString+createFromPtr p = coerce . BS.createFromPtr p++copyToPtr :: ShortByteString -> Int -> Ptr a -> Int -> IO ()+copyToPtr = BS.copyToPtr . coerce+-}++isValidUtf8 :: ShortByteString -> Bool+isValidUtf8 = coerce BS.isValidUtf8++packCString :: CString -> IO ShortByteString+packCString = coerce BS.packCString++packCStringLen :: CStringLen -> IO ShortByteString+packCStringLen = coerce BS.packCStringLen++useAsCString :: ShortByteString -> (CString -> IO a) -> IO a+useAsCString = BS.useAsCString . coerce++useAsCStringLen :: ShortByteString -> (CStringLen -> IO a) -> IO a+useAsCStringLen = BS.useAsCStringLen . coerce++-- private++-- truncates wide characters+packChars :: [Char] -> ShortByteString+packChars = toShort . BS.pack . fmap (toEnum . fromEnum)++unpackChars :: ShortByteString -> [Char]+unpackChars = fmap  (toEnum . fromEnum) . BS.unpack . fromShort
+ lib/Data/ByteString/Unsafe.hs view
@@ -0,0 +1,66 @@+-- These are not really unsafe, but provided for compatibility+module Data.ByteString.Unsafe (++        -- * Unchecked access+        unsafeHead,+        unsafeTail,+        unsafeInit,+        unsafeLast,+        unsafeIndex,+        unsafeTake,+        unsafeDrop,++        -- * Low level interaction with CStrings+        -- ** Using ByteStrings with functions for CStrings+        unsafeUseAsCString,+        unsafeUseAsCStringLen,+{-+        -- ** Converting CStrings to ByteStrings+        unsafePackCString,+        unsafePackCStringLen,+        unsafePackMallocCString,+        unsafePackMallocCStringLen,++        unsafePackAddress,+        unsafePackAddressLen,+        unsafePackCStringFinalizer,+        unsafeFinalize,+-}+  ) where++import qualified Prelude ()+import Primitives+import Data.Word.Word8+import Data.ByteString.Internal+import Foreign.C.String (CString, CStringLen)+import Foreign.ForeignPtr (withForeignPtr)++unsafeHead :: ByteString -> Word8+unsafeHead bs = primBSindex bs 0++unsafeTail :: ByteString -> ByteString+unsafeTail bs = primBSsubstr bs 1 (primBSlength bs `primIntSub` 1)++unsafeInit :: ByteString -> ByteString+unsafeInit bs = primBSsubstr bs 0 (primBSlength bs `primIntSub` 1)++unsafeLast :: ByteString -> Word8+unsafeLast bs = primBSindex bs (primBSlength bs `primIntSub` 1)++unsafeIndex :: ByteString -> Int -> Word8+unsafeIndex = primBSindex++unsafeTake :: Int -> ByteString -> ByteString+unsafeTake n bs = primBSsubstr bs 0 n++unsafeDrop  :: Int -> ByteString -> ByteString+unsafeDrop n bs = primBSsubstr bs n (primBSlength bs `primIntSub` n)++-- Get actual data pointer out of a ByteString.  There is no copying involved.+-- The RTS retains ownership of the string, and the pointer+-- should not be used after the subcomputations finishes.+unsafeUseAsCString :: ByteString -> (CString -> IO a) -> IO a+unsafeUseAsCString bs act = withForeignPtr (primBS2FPtr bs) act++unsafeUseAsCStringLen :: ByteString -> (CStringLen -> IO a) -> IO a+unsafeUseAsCStringLen bs act = withForeignPtr (primBS2FPtr bs) (\p -> act (p, primBSlength bs))
lib/Data/Char.hs view
@@ -33,7 +33,7 @@ import {-# SOURCE #-} qualified Data.Char.Unicode as U import Data.Eq import Data.Function-import Data.Int+import Data.Int.Int import Data.List_Type import Data.Num import Data.Ord@@ -52,17 +52,6 @@   (>)  = primCharGT   (>=) = primCharGE --- Using primitive comparison is still a small speedup, even using mostly bytestrings-instance Eq String where-  (==) = primStringEQ--instance Ord String where-  compare =  primStringCompare-  x <  y  =  case primStringCompare x y of { LT -> True; _ -> False }-  x <= y  =  case primStringCompare x y of { GT -> False; _ -> True }-  x >  y  =  case primStringCompare x y of { GT -> True; _ -> False }-  x >= y  =  case primStringCompare x y of { LT -> False; _ -> True }- instance Bounded Char where   minBound = primChr 0   maxBound = primChr 0x10ffff@@ -77,7 +66,7 @@  isLower :: Char -> Bool isLower c =-  if primCharLE c '\177' then+  if c <= '\177' then      isAsciiLower c   else      U.isLower c@@ -178,14 +167,17 @@ isLatin1 c = c <= '\255'  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"+digitToInt c | isDigit c            = ord c - ord '0'+             | 'a' <= c && c <= 'f' = ord c - (ord 'a' - 10)+             | 'A' <= c && c <= 'F' = ord c - (ord 'A' - 10)+             | otherwise            = error "digitToInt"  intToDigit :: Int -> Char-intToDigit i | i < 10 = primChr (ord '0' + i)-             | otherwise = primChr (ord 'A' - 10 + i)+intToDigit i | w `primWordLT` 10 = primChr (ord '0' + i)+             | w `primWordLT` 16 = primChr (ord 'a' - 10 + i)+             | otherwise = error "intToDigit"+  where+    w = primIntToWord i  toLower :: Char -> Char toLower c | isAsciiUpper c = primChr (ord c - ord 'A' + ord 'a')
lib/Data/Char/Unicode.hs view
@@ -11,12 +11,12 @@     ) where import qualified Prelude(); import MiniPrelude import Primitives(primOrd, primUnsafeCoerce)-import Data.Bits+import Data.Bits.Base import Data.Bounded import qualified Data.ByteString.Internal as BS import Data.ByteString.Internal(ByteString) import Data.Version-import Data.Word(Word8)+import Data.Word.Word8(Word8)  data GeneralCategory   = UppercaseLetter       -- Lu: Letter, Uppercase
lib/Data/Char/Unicode.hs-boot view
@@ -1,9 +1,50 @@ module Data.Char.Unicode where import qualified Prelude() import Data.Bool_Type+import Data.Bounded import Data.Char_Type+import Data.Enum_Class+import Data.Eq+import Data.Ord+import Text.Show  data GeneralCategory+  = UppercaseLetter       -- Lu: Letter, Uppercase+  | LowercaseLetter       -- Ll: Letter, Lowercase+  | TitlecaseLetter       -- Lt: Letter, Titlecase+  | ModifierLetter        -- Lm: Letter, Modifier+  | OtherLetter           -- Lo: Letter, Other+  | NonSpacingMark        -- Mn: Mark, Non-Spacing+  | SpacingCombiningMark  -- Mc: Mark, Spacing Combining+  | EnclosingMark         -- Me: Mark, Enclosing+  | DecimalNumber         -- Nd: Number, Decimal+  | LetterNumber          -- Nl: Number, Letter+  | OtherNumber           -- No: Number, Other+  | ConnectorPunctuation  -- Pc: Punctuation, Connector+  | DashPunctuation       -- Pd: Punctuation, Dash+  | OpenPunctuation       -- Ps: Punctuation, Open+  | ClosePunctuation      -- Pe: Punctuation, Close+  | InitialQuote          -- Pi: Punctuation, Initial quote+  | FinalQuote            -- Pf: Punctuation, Final quote+  | OtherPunctuation      -- Po: Punctuation, Other+  | MathSymbol            -- Sm: Symbol, Math+  | CurrencySymbol        -- Sc: Symbol, Currency+  | ModifierSymbol        -- Sk: Symbol, Modifier+  | OtherSymbol           -- So: Symbol, Other+  | Space                 -- Zs: Separator, Space+  | LineSeparator         -- Zl: Separator, Line+  | ParagraphSeparator    -- Zp: Separator, Paragraph+  | Control               -- Cc: Other, Control+  | Format                -- Cf: Other, Format+  | Surrogate             -- Cs: Other, Surrogate+  | PrivateUse            -- Co: Other, Private Use+  | NotAssigned           -- Cn: Other, Not Assigned+  --deriving (Show, Eq, Ord, Enum, Bounded)+instance Show    GeneralCategory+instance Eq      GeneralCategory+instance Ord     GeneralCategory+instance Enum    GeneralCategory+instance Bounded GeneralCategory  isControl :: Char -> Bool isPrint :: Char -> Bool
lib/Data/Coerce.hs view
@@ -1,6 +1,7 @@ module Data.Coerce(Coercible, coerce) where import qualified Prelude() import Primitives+import {-# SOURCE #-} Data.Typeable  type Coercible :: forall k . k -> k -> Constraint class Coercible a b
lib/Data/Complex.hs view
@@ -1,16 +1,24 @@-module Data.Complex(module Data.Complex) where+module Data.Complex (+  Complex((:+)),+  realPart,+  imagPart,+  mkPolar,+  cis,+  polar,+  magnitude,+  phase,+  conjugate,+) where+ import Data.Typeable+import Text.ParserCombinators.ReadPrec+import Text.Read.Internal+import qualified Text.Read.Lex as L  infix 6 :+  data Complex a = !a :+ !a-  deriving(Typeable)--instance Eq a => Eq (Complex a) where-  (x :+ y) == (x' :+ y')  =  x == x' && y == y'   -- parser bug--instance Show a => Show (Complex a) where-  show (x :+ y) = show x ++ " :+ " ++ show y+  deriving (Typeable, Eq, Read, Show)  realPart :: forall a . Complex a -> a realPart (x :+ _) =  x@@ -41,9 +49,8 @@   in  mx * sqrt(1 + r*r)  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+phase (0 :+ 0) = 0+phase (x :+ y) = atan2 y x   instance (RealFloat a) => Num (Complex a)  where@@ -52,9 +59,8 @@     (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+    signum (0:+0)       =  0+    signum z@(x:+y)     =  x/r :+ y/r  where r = magnitude z     fromInteger n       =  fromInteger n :+ 0  instance (RealFloat a) => Fractional (Complex a)  where@@ -71,27 +77,24 @@     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++    x ** y = case (x, y) of+      (_ , 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 - v else v)+        inf = 1 / 0+        nan = 0 / 0+    sqrt (0:+0)    =  0+    sqrt z@(x:+y)  =  u :+ (if y < 0 then - 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)
lib/Data/Constraint.hs view
@@ -2,7 +2,7 @@ -- See LICENSE file for full license. module Data.Constraint(module Data.Constraint) where import qualified Prelude()              -- do not import Prelude-import Primitives  -- for (->)+import {-# SOURCE #-} Data.Typeable import Text.Show  -- A very, very minimal version of the constraints package
lib/Data/Data.hs view
@@ -1,5 +1,698 @@-module Data.Data(Data(..), module Data.Typeable) where+module Data.Data (+  module Data.Typeable,+  Data(..),+  DataType,+  mkDataType,+  mkIntType,+  mkFloatType,+  mkCharType,+  mkNoRepType,+  dataTypeName,+  DataRep(..),+  dataTypeRep,+  repConstr,+  isAlgType,+  dataTypeConstrs,+  indexConstr,+  maxConstrIndex,+  isNorepType,+  Constr,+  ConIndex,+  Fixity(..),+  mkConstr,+  mkConstrTag,+  mkIntegralConstr,+  mkRealConstr,+  mkCharConstr,+  constrType,+  ConstrRep(..),+  constrRep,+  constrFields,+  constrFixity,+  constrIndex,+  showConstr,+  readConstr,+  tyconUQname,+  tyconModule,+  fromConstr,+  fromConstrB,+  fromConstrM,+  ) where+import Data.Data_Class+import Data.Functor.Const(Const(..))+import Data.Functor.Identity(Identity(..))+import Data.Int(Int8, Int16, Int32, Int64)+import Data.Ix(Ix)+import Data.List(findIndex)+import Data.List.NonEmpty(NonEmpty(..))+import Data.Monoid+import Data.Proxy+import Data.Ratio((%))+import Data.Ratio_Type+import Data.Tuple import Data.Typeable+import Data.Type.Equality+import Data.Version+import Data.Void+import Data.Word(Word, Word8, Word16, Word32, Word64)+import Foreign.ForeignPtr(ForeignPtr)+import Foreign.Ptr(Ptr)+import Mhs.Array(Array, listArray, bounds, elems)+import Numeric.Natural(Natural) --- Fake Data class until the type checker bug has been fixed-class (Typeable a) => Data a+-- instances for types in Data.Data_Class++deriving instance Eq DataRep+deriving instance Show DataRep+deriving instance Eq ConstrRep+deriving instance Show ConstrRep+deriving instance Eq Fixity+deriving instance Show Fixity+deriving instance Show DataType++instance Eq Constr where+  c == c' = conrep c == conrep c'++instance Show Constr where+  show = constring++-----------------++fromConstr :: Data a => Constr -> a+fromConstr = fromConstrB (error "Data.Data.fromConstr")++fromConstrB :: Data a+            => (forall d. Data d => d)+            -> Constr+            -> a+fromConstrB f = runIdentity . gunfold k z+ where+  k :: forall b r. Data b => Identity (b -> r) -> Identity r+  k c = Identity (runIdentity c f)++  z :: forall r. r -> Identity r+  z = Identity++fromConstrM :: forall m a. (Monad m, Data a)+            => (forall d. Data d => m d)+            -> Constr+            -> m a+fromConstrM f = gunfold k z+ where+  k :: forall b r. Data b => m (b -> r) -> m r+  k c = do { c' <- c; c' <$> f }++  z :: forall r. r -> m r+  z = return++dataTypeName :: DataType -> String+dataTypeName = tycon++dataTypeRep :: DataType -> DataRep+dataTypeRep = datarep++constrType :: Constr -> DataType+constrType = datatype++constrRep :: Constr -> ConstrRep+constrRep = conrep++repConstr :: DataType -> ConstrRep -> Constr+repConstr dt cr =+      case (dataTypeRep dt, cr) of+        (AlgRep cs, AlgConstr i)      -> cs !! (i-1)+        (IntRep,    IntConstr i)      -> mkIntegralConstr dt i+        (FloatRep,  FloatConstr f)    -> mkRealConstr dt f+        (CharRep,   CharConstr c)     -> mkCharConstr dt c+        _ -> error "Data.Data.repConstr: The given ConstrRep does not fit to the given DataType."++mkConstr :: DataType -> String -> [String] -> Fixity -> Constr+mkConstr dt str fields fix = mkConstrTag dt str idx fields fix+  where+    idx = case findIndex (\c -> showConstr c == str) (dataTypeConstrs dt) of+            Just i  -> i+1 -- ConTag starts at 1+            Nothing -> error $ "Data.Data.mkConstr: couldn't find constructor " ++ str+++dataTypeConstrs :: DataType -> [Constr]+dataTypeConstrs dt = case datarep dt of+                        (AlgRep cons) -> cons+                        _ -> error $ "Data.Data.dataTypeConstrs is not supported for "+                                    ++ dataTypeName dt +++                                    ", as it is not an algebraic data type."++constrFields :: Constr -> [String]+constrFields = confields++constrFixity :: Constr -> Fixity+constrFixity = confixity++showConstr :: Constr -> String+showConstr = constring++readConstr :: DataType -> String -> Maybe Constr+readConstr dt str =+      case dataTypeRep dt of+        AlgRep cons -> idx cons+        IntRep      -> mkReadCon (mkPrimCon dt str . IntConstr)+        FloatRep    -> mkReadCon ffloat+        CharRep     -> mkReadCon (mkPrimCon dt str . CharConstr)+        NoRep       -> Nothing+  where++    -- Read a value and build a constructor+    mkReadCon :: Read t => (t -> Constr) -> Maybe Constr+    mkReadCon f = case reads str of+                    [(t,"")] -> Just (f t)+                    _ -> Nothing++    -- Traverse list of algebraic datatype constructors+    idx :: [Constr] -> Maybe Constr+    idx cons = case filter ((==) str . showConstr) cons of+                [] -> Nothing+                hd : _ -> Just hd++    ffloat :: Double -> Constr+    ffloat =  mkPrimCon dt str . FloatConstr . toRational++isAlgType :: DataType -> Bool+isAlgType dt = case datarep dt of+                 (AlgRep _) -> True+                 _ -> False++indexConstr :: DataType -> ConIndex -> Constr+indexConstr dt idx = case datarep dt of+                        (AlgRep cs) -> cs !! (idx-1)+                        _           -> error $ "Data.Data.indexConstr is not supported for "+                                               ++ dataTypeName dt +++                                               ", as it is not an algebraic data type."++maxConstrIndex :: DataType -> ConIndex+maxConstrIndex dt = case dataTypeRep dt of+                        AlgRep cs -> length cs+                        _            -> error $ "Data.Data.maxConstrIndex is not supported for "+                                                 ++ dataTypeName dt +++                                                 ", as it is not an algebraic data type."+++mkIntType :: String -> DataType+mkIntType = mkPrimType IntRep++mkFloatType :: String -> DataType+mkFloatType = mkPrimType FloatRep++mkCharType :: String -> DataType+mkCharType = mkPrimType CharRep++mkPrimType :: DataRep -> String -> DataType+mkPrimType dr str = DataType+                        { tycon   = str+                        , datarep = dr+                        }++mkPrimCon :: DataType -> String -> ConstrRep -> Constr+mkPrimCon dt str cr = Constr+                        { datatype  = dt+                        , conrep    = cr+                        , constring = str+                        , confields = error "Data.Data.confields"+                        , confixity = error "Data.Data.confixity"+                        }++mkIntegralConstr :: (Integral a, Show a) => DataType -> a -> Constr+mkIntegralConstr dt i = case datarep dt of+                  IntRep -> mkPrimCon dt (show i) (IntConstr (toInteger  i))+                  _ -> error $ "Data.Data.mkIntegralConstr is not supported for "+                               ++ dataTypeName dt +++                               ", as it is not an Integral data type."++mkRealConstr :: (Real a, Show a) => DataType -> a -> Constr+mkRealConstr dt f = case datarep dt of+                    FloatRep -> mkPrimCon dt (show f) (FloatConstr (toRational f))+                    _ -> error $ "Data.Data.mkRealConstr is not supported for "+                                 ++ dataTypeName dt +++                                 ", as it is not a Real data type."++mkCharConstr :: DataType -> Char -> Constr+mkCharConstr dt c = case datarep dt of+                   CharRep -> mkPrimCon dt (show c) (CharConstr c)+                   _ -> error $ "Data.Data.mkCharConstr is not supported for "+                                ++ dataTypeName dt +++                                ", as it is not an Char data type."++mkNoRepType :: String -> DataType+mkNoRepType str = DataType+                        { tycon   = str+                        , datarep = NoRep+                        }++isNorepType :: DataType -> Bool+isNorepType dt = case datarep dt of+                   NoRep -> True+                   _ -> False++tyconUQname :: String -> String+tyconUQname x = case dropWhile (not . (==) '.') x of+                  [] -> x+                  _ : tl -> tyconUQname tl++tyconModule :: String -> String+tyconModule x = case break ('.' ==) x of+                  (_, "") -> ""+                  (a, _ : tl) -> a ++ tyconModule' tl+  where+    tyconModule' y = let y' = tyconModule y+                      in if y' == "" then "" else '.':y'++deriving instance Data Bool++------------------------------------------------------------------------------++charType :: DataType+charType = mkCharType "Prelude.Char"++instance Data Char where+  toConstr x = mkCharConstr charType x+  gunfold _ z c = case constrRep c of+                    (CharConstr x) -> z x+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Char."+  dataTypeOf _ = charType+++------------------------------------------------------------------------------++floatType :: DataType+floatType = mkFloatType "Prelude.Float"++instance Data Float where+  toConstr = mkRealConstr floatType+  gunfold _ z c = case constrRep c of+                    (FloatConstr x) -> z (realToFrac x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Float."+  dataTypeOf _ = floatType+++------------------------------------------------------------------------------++doubleType :: DataType+doubleType = mkFloatType "Prelude.Double"++instance Data Double where+  toConstr = mkRealConstr doubleType+  gunfold _ z c = case constrRep c of+                    (FloatConstr x) -> z (realToFrac x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Double."+  dataTypeOf _ = doubleType+++------------------------------------------------------------------------------++intType :: DataType+intType = mkIntType "Prelude.Int"++instance Data Int where+  toConstr x = mkIntegralConstr intType x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Int."+  dataTypeOf _ = intType+++------------------------------------------------------------------------------++integerType :: DataType+integerType = mkIntType "Prelude.Integer"++instance Data Integer where+  toConstr = mkIntegralConstr integerType+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z x+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Integer."+  dataTypeOf _ = integerType+++------------------------------------------------------------------------------++naturalType :: DataType+naturalType = mkIntType "Numeric.Natural.Natural"++instance Data Natural where+  toConstr x = mkIntegralConstr naturalType x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Natural"+  dataTypeOf _ = naturalType+++------------------------------------------------------------------------------++int8Type :: DataType+int8Type = mkIntType "Data.Int.Int8"++instance Data Int8 where+  toConstr x = mkIntegralConstr int8Type x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Int8."+  dataTypeOf _ = int8Type+++------------------------------------------------------------------------------++int16Type :: DataType+int16Type = mkIntType "Data.Int.Int16"++instance Data Int16 where+  toConstr x = mkIntegralConstr int16Type x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Int16."+  dataTypeOf _ = int16Type+++------------------------------------------------------------------------------++int32Type :: DataType+int32Type = mkIntType "Data.Int.Int32"++instance Data Int32 where+  toConstr x = mkIntegralConstr int32Type x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Int32."+  dataTypeOf _ = int32Type+++------------------------------------------------------------------------------++int64Type :: DataType+int64Type = mkIntType "Data.Int.Int64"++instance Data Int64 where+  toConstr x = mkIntegralConstr int64Type x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Int64."+  dataTypeOf _ = int64Type+++------------------------------------------------------------------------------++wordType :: DataType+wordType = mkIntType "Data.Word.Word"++instance Data Word where+  toConstr x = mkIntegralConstr wordType x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Word"+  dataTypeOf _ = wordType+++------------------------------------------------------------------------------++word8Type :: DataType+word8Type = mkIntType "Data.Word.Word8"++instance Data Word8 where+  toConstr x = mkIntegralConstr word8Type x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Word8."+  dataTypeOf _ = word8Type+++------------------------------------------------------------------------------++word16Type :: DataType+word16Type = mkIntType "Data.Word.Word16"++instance Data Word16 where+  toConstr x = mkIntegralConstr word16Type x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Word16."+  dataTypeOf _ = word16Type+++------------------------------------------------------------------------------++word32Type :: DataType+word32Type = mkIntType "Data.Word.Word32"++instance Data Word32 where+  toConstr x = mkIntegralConstr word32Type x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Word32."+  dataTypeOf _ = word32Type+++------------------------------------------------------------------------------++word64Type :: DataType+word64Type = mkIntType "Data.Word.Word64"++instance Data Word64 where+  toConstr x = mkIntegralConstr word64Type x+  gunfold _ z c = case constrRep c of+                    (IntConstr x) -> z (fromIntegral x)+                    _ -> error $ "Data.Data.gunfold: Constructor " ++ show c+                                 ++ " is not of type Word64."+  dataTypeOf _ = word64Type+++------------------------------------------------------------------------------++ratioConstr :: Constr+ratioConstr = mkConstr ratioDataType ":%" [] Infix++ratioDataType :: DataType+ratioDataType = mkDataType "Data.Ratio" [ratioConstr]++-- NB: This Data instance intentionally uses the (%) smart constructor instead+-- of the internal (:%) constructor to preserve the invariant that a Ratio+-- value is reduced to normal form. See #10011.++-- | @since base-4.0.0.0+instance (Data a, Integral a) => Data (Ratio a) where+  gfoldl k z (a :% b) = z (%) `k` a `k` b+  toConstr _ = ratioConstr+  gunfold k z c | constrIndex c == 1 = k (k (z (%)))+  gunfold _ _ _ = error "Data.Data.gunfold(Ratio)"+  dataTypeOf _  = ratioDataType+++------------------------------------------------------------------------------++nilConstr :: Constr+nilConstr    = mkConstr listDataType "[]" [] Prefix+consConstr :: Constr+consConstr   = mkConstr listDataType "(:)" [] Infix++listDataType :: DataType+listDataType = mkDataType "Prelude.[]" [nilConstr,consConstr]++instance Data a => Data [a] where+  gfoldl _ z []     = z []+  gfoldl f z (x:xs) = z (:) `f` x `f` xs+  toConstr []    = nilConstr+  toConstr (_:_) = consConstr+  gunfold k z c = case constrIndex c of+                    1 -> z []+                    2 -> k (k (z (:)))+                    _ -> error "Data.Data.gunfold(List)"+  dataTypeOf _ = listDataType+  dataCast1 f  = gcast1 f++  gmapT  _   []     = []+  gmapT  f   (x:xs) = f x : f xs+  gmapQ  _   []     = []+  gmapQ  f   (x:xs) = [f x,f xs]+  gmapM  _   []     = return []+  gmapM  f   (x:xs) = f x >>= \x' -> f xs >>= \xs' -> return (x':xs')+++------------------------------------------------------------------------------+deriving instance Data a => Data (NonEmpty a)+deriving instance Data a => Data (Maybe a)+deriving instance Data Ordering+deriving instance (Data a, Data b) => Data (Either a b)+deriving instance Data Void+deriving instance Data ()+deriving instance Data a => Data (Solo a)+deriving instance (Data a, Data b) => Data (a,b)+deriving instance (Data a, Data b, Data c) => Data (a,b,c)+deriving instance (Data a, Data b, Data c, Data d) => Data (a,b,c,d)+deriving instance (Data a, Data b, Data c, Data d, Data e) => Data (a,b,c,d,e)++{-+-- | @since base-4.0.0.0+deriving instance (Data a, Data b, Data c, Data d, Data e, Data f)+         => Data (a,b,c,d,e,f)++-- | @since base-4.0.0.0+deriving instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g)+         => Data (a,b,c,d,e,f,g)+-}+------------------------------------------------------------------------------++-- | @since base-4.8.0.0+instance Data a => Data (Ptr a) where+  toConstr _   = error "Data.Data.toConstr(Ptr)"+  gunfold _ _  = error "Data.Data.gunfold(Ptr)"+  dataTypeOf _ = mkNoRepType "Primitives.Ptr"+  dataCast1 x  = gcast1 x++-- NOT YET deriving instance Data a => Data (ConstPtr a)++------------------------------------------------------------------------------++instance Data a => Data (ForeignPtr a) where+  toConstr _   = error "Data.Data.toConstr(ForeignPtr)"+  gunfold _ _  = error "Data.Data.gunfold(ForeignPtr)"+  dataTypeOf _ = mkNoRepType "Primitives.ForeignPtr"+  dataCast1 x  = gcast1 x++-- NOT YET deriving instance Data IntPtr++-- NOT YET deriving instance Data WordPtr++------------------------------------------------------------------------------+instance (Data a, Data b, Ix a) => Data (Array a b)+ where+  gfoldl f z a = z (listArray (bounds a)) `f` elems a+  toConstr _   = error "Data.Data.toConstr(Array)"+  gunfold _ _  = error "Data.Data.gunfold(Array)"+  dataTypeOf _ = mkNoRepType "Data.Array.Array"+  dataCast2 x  = gcast2 x++----------------------------------------------------------------------------+-- Data instance for Proxy++-- | @since base-4.7.0.0+deriving instance (Data t) => Data (Proxy t)++-- | @since base-4.7.0.0+deriving instance (a ~ b, Data a) => Data (a :~: b)++{-+-- | @since base-4.10.0.0+deriving instance (Typeable i, Typeable j, Typeable a, Typeable b,+                    (a :: i) ~~ (b :: j))+    => Data (a :~~: b)++-- | @since base-4.7.0.0+deriving instance (Coercible a b, Data a, Data b) => Data (Coercion a b)+-}++-- | @since base-4.9.0.0+deriving instance Data a => Data (Identity a)++-- | @since base-4.10.0.0+deriving instance (Data a, Data b) => Data (Const a b)++-- | @since base-4.7.0.0+deriving instance Data Version++----------------------------------------------------------------------------+-- Data instances for Data.Monoid wrappers++-- | @since base-4.8.0.0+deriving instance Data a => Data (Dual a)++-- | @since base-4.8.0.0+deriving instance Data All++-- | @since base-4.8.0.0+deriving instance Data Any++-- | @since base-4.8.0.0+deriving instance Data a => Data (Sum a)++-- | @since base-4.8.0.0+deriving instance Data a => Data (Product a)++-- | @since base-4.8.0.0+deriving instance Data a => Data (First a)++-- | @since base-4.8.0.0+deriving instance Data a => Data (Last a)++-- | @since base-4.8.0.0+--deriving instance (Data (f a), Data a, Typeable f) => Data (Alt f a)++-- | @since base-4.12.0.0+--deriving instance (Data (f a), Data a, Typeable f) => Data (Ap f a)++{-+----------------------------------------------------------------------------+-- Data instances for GHC.Generics representations++-- | @since base-4.9.0.0+deriving instance Data p => Data (U1 p)++-- | @since base-4.9.0.0+deriving instance Data p => Data (Par1 p)++-- | @since base-4.9.0.0+deriving instance (Data (f p), Typeable f, Data p) => Data (Rec1 f p)++-- | @since base-4.9.0.0+deriving instance (Typeable i, Data p, Data c) => Data (K1 i c p)++-- | @since base-4.9.0.0+deriving instance (Data p, Data (f p), Typeable c, Typeable i, Typeable f)+    => Data (M1 i c f p)++-- | @since base-4.9.0.0+deriving instance (Typeable f, Typeable g, Data p, Data (f p), Data (g p))+    => Data ((f :+: g) p)++-- | @since base-4.9.0.0+deriving instance (Typeable (f :: Type -> Type), Typeable (g :: Type -> Type),+          Data p, Data (f (g p)))+    => Data ((f :.: g) p)++-- | @since base-4.9.0.0+deriving instance Data p => Data (V1 p)++-- | @since base-4.9.0.0+deriving instance (Typeable f, Typeable g, Data p, Data (f p), Data (g p))+    => Data ((f :*: g) p)++-- | @since base-4.9.0.0+deriving instance Data Generics.Fixity++-- | @since base-4.9.0.0+deriving instance Data Associativity++-- | @since base-4.9.0.0+deriving instance Data SourceUnpackedness++-- | @since base-4.9.0.0+deriving instance Data SourceStrictness++-- | @since base-4.9.0.0+deriving instance Data DecidedStrictness++----------------------------------------------------------------------------+-- Data instances for GHC.Internal.Data.Ord++-- | @since base-4.12.0.0+deriving instance Data a => Data (Down a)+-}
+ lib/Data/Data_Class.hs view
@@ -0,0 +1,177 @@+module Data.Data_Class(module Data.Data_Class) where+import qualified Prelude()+import Control.Error+import Control.Monad+import Data.Bool+import Data.Char+import Data.Eq+import Data.Function(($), (.), const, id)+import Data.Functor.Const(Const(..))+import Data.Functor.Identity(Identity(..))+import Data.Int+import Data.Integer+import Data.List((++))+import Data.Maybe+import Data.Num+import Data.Ratio+import {-# SOURCE #-} Data.Typeable+import Text.Show++class Typeable a => Data a where+  gfoldl  :: (forall d b. Data d => c (d -> b) -> d -> c b)+          -> (forall g. g -> c g)+          -> a+          -> c a++  gfoldl _ z = z++  gunfold :: (forall b r. Data b => c (b -> r) -> c r)+          -> (forall r. r -> c r)+          -> Constr+          -> c a++  toConstr   :: a -> Constr++  dataTypeOf  :: a -> DataType++  dataCast1 :: Typeable t+            => (forall d. Data d => c (t d))+            -> Maybe (c a)+  dataCast1 _ = Nothing++  dataCast2 :: Typeable t+            => (forall d e. (Data d, Data e) => c (t d e))+            -> Maybe (c a)+  dataCast2 _ = Nothing++  gmapT :: (forall b. Data b => b -> b) -> a -> a++  gmapT f x0 = runIdentity (gfoldl k Identity x0)+    where+      k :: Data d => Identity (d->b) -> d -> Identity b+      k (Identity c) x = Identity (c (f x))++  gmapQl :: forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r+  gmapQl o r f = getConst . gfoldl k z+    where+      k :: Data d => Const r (d->b) -> d -> Const r b+      k c x = Const $ getConst c `o` f x+      z :: g -> Const r g+      z _   = Const r++  gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r+  gmapQr o r0 f x0 = unQr (gfoldl k (const (Qr id)) x0) r0+    where+      k :: Data d => Qr r (d->b) -> d -> Qr r b+      k (Qr c) x = Qr (\r -> c (f x `o` r))++  gmapQ :: (forall d. Data d => d -> u) -> a -> [u]+  gmapQ f = gmapQr (:) [] f++  gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> a -> u+  gmapQi i f x = case gfoldl k z x of { Qi _ q -> fromJust q }+    where+      k :: Data d => Qi u (d -> b) -> d -> Qi u b+      k (Qi i' q) a = Qi (i'+1) (if i==i' then Just (f a) else q)+      z :: g -> Qi q g+      z _           = Qi 0 Nothing++  gmapM :: forall m. Monad m => (forall d. Data d => d -> m d) -> a -> m a+  gmapM f = gfoldl k return+    where+      k :: Data d => m (d -> b) -> d -> m b+      k c x = do c' <- c+                 x' <- f x+                 return (c' x')++  gmapMp :: forall m. MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a+  gmapMp f x = unMp (gfoldl k z x) >>= \(x',b) ->+                if b then return x' else mzero+    where+      z :: g -> Mp m g+      z g = Mp (return (g,False))+      k :: Data d => Mp m (d -> b) -> d -> Mp m b+      k (Mp c) y+        = Mp ( c >>= \(h, b) ->+                 (f y >>= \y' -> return (h y', True))+                 `mplus` return (h y, b)+             )++  gmapMo :: forall m. MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a+  gmapMo f x = unMp (gfoldl k z x) >>= \(x',b) ->+                if b then return x' else mzero+    where+      z :: g -> Mp m g+      z g = Mp (return (g,False))+      k :: Data d => Mp m (d -> b) -> d -> Mp m b+      k (Mp c) y+        = Mp ( c >>= \(h,b) -> if b+                        then return (h y, b)+                        else (f y >>= \y' -> return (h y',True))+                             `mplus` return (h y, b)+             )++data Qi q a = Qi Int (Maybe q)++newtype Qr r a = Qr { unQr  :: r -> r }++newtype Mp m x = Mp { unMp :: m (x, Bool) }+++data DataType = DataType {+    tycon   :: String+  , datarep :: DataRep+  }+--  deriving Show++data Constr = Constr {+    conrep    :: ConstrRep+  , constring :: String+  , confields :: [String] -- for AlgRep only+  , confixity :: Fixity   -- for AlgRep only+  , datatype  :: DataType+  }++data DataRep = AlgRep [Constr]+             | IntRep+             | FloatRep+             | CharRep+             | NoRep+--            deriving (Eq, Show)++data ConstrRep = AlgConstr    ConIndex+               | IntConstr    Integer+               | FloatConstr  Rational+               | CharConstr   Char+--               deriving (Eq, Show)++type ConIndex = Int++data Fixity = Prefix+            | Infix+--            deriving (Eq, Show)++mkDataType :: String -> [Constr] -> DataType+mkDataType str cs =+  DataType {+    tycon   = str+  , datarep = AlgRep cs+  }++mkConstrTag :: DataType -> String -> Int -> [String] -> Fixity -> Constr+mkConstrTag dt str idx fields fix =+  Constr {+    conrep    = AlgConstr idx+  , constring = str+  , confields = fields+  , confixity = fix+  , datatype  = dt+  }++constrIndex :: Constr -> ConIndex+constrIndex con =+  case conrep con of+    AlgConstr idx -> idx+    _ -> error $ "Data.Data.constrIndex is not supported for "+                 ++ tycon (datatype con)+                 ++ ", as it is not an algebraic data type."
lib/Data/Double.hs view
@@ -1,20 +1,204 @@+-- Copyright 2025 Lennart Augustsson+-- See LICENSE file for full license. module Data.Double(Double) where-import qualified Prelude()+import qualified Prelude()              -- do not import Prelude+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Char import Data.Enum import Data.Eq-import Data.FloatW import Data.Floating import Data.Fractional-import Data.Num+import Data.Function+import Data.Integer+import Data.Integer.Internal(_integerToDouble, _wordToInteger)+import Data.Integral+import Data.List import Data.Ord+import Data.Ratio import Data.Real import Data.RealFloat import Data.RealFrac-import Mhs.Builtin+import Data.Num+import Data.Word.Word64+import {-# SOURCE #-} Numeric.FormatFloat(showFloat)+import Numeric.Show(showSignedNeg) import Text.Show -newtype Double = D FloatW-  deriving(Eq, Ord, Num, Fractional, Real, RealFrac, Floating, RealFloat, Enum)+--+-- This is a floating point type that is a wide as the word width of the machine.+-- +instance Num Double where+  (+)  = primDoubleAdd+  (-)  = primDoubleSub+  (*)  = primDoubleMul+  negate = primDoubleNeg+  abs x = if x < 0.0 then - 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+  fromRational x =+    let n = numerator x+        d = denominator x+        maxVal = 2 ^ (1023::Int)  -- actually bigger, but this converts correctly+    in  if abs n <= maxVal && d < maxVal then+          fromInteger n / fromInteger d+        else+          let (ne, nm) = scaleToMax maxVal n+              (de, dm) = scaleToMax maxVal d+          in  scaleFloat64 (ne - de) (fromInteger nm / fromInteger dm)++-- XXX Very inefficient scaling+-- If we get here the number has > 1023 bits, so shifting by 256 is fine.+scaleToMax :: Integer -> Integer -> (Int, Integer)+scaleToMax m = f 0+  where f e x = if abs x < m then (e, x) else f (e+256) (x `shiftR` 256)++instance Eq Double where+  (==) = primDoubleEQ+  (/=) = primDoubleNE++instance Ord Double where+  (<)  = primDoubleLT+  (<=) = primDoubleLE+  (>)  = primDoubleGT+  (>=) = primDoubleGE+ instance Show Double where-  showsPrec p (D x) = showsPrec p x+  showsPrec = showSignedNeg (\ x -> x < 0 || isNegZeroFloat64 x) showFloat++{- in Text.Read.Internal+instance Read Double where+  readsPrec _ = readSigned $ \ r -> [ (primDoubleRead s, t) | (s@(c:_), t) <- lex r, isDigit c ]+-}++instance Enum Double where+  succ x = x + 1+  pred x = x - 1+  toEnum n = fromIntegral n+  fromEnum = fromInteger . truncate+  enumFrom = numericEnumFrom+  enumFromThen = numericEnumFromThen+  enumFromTo = numericEnumFromTo+  enumFromThenTo = numericEnumFromThenTo++instance Real Double where+  toRational x | isNaN x = rationalNaN+               | isInfinite x = if x < 0 then -rationalInfinity else rationalInfinity+               | isNegativeZero x = rationalNegativeZero+               | otherwise =+    case decodeFloat x of+      (m, e) -> toRational m * 2^^e++instance RealFrac Double where+  properFraction x =+    case decodeFloat x of+      (m, e) ->   -- x = m * 2^e+        let m' | e < 0     = m `quot` 2^(-e)+               | otherwise = m * 2^e+        in  (fromInteger m', x - fromInteger m')++instance Floating Double where+  pi     = 3.141592653589793+  log  x = clog x+  exp  x = cexp x+  sqrt x = csqrt x+  sin  x = csin x+  cos  x = ccos x+  tan  x = ctan x+  asin x = casin x+  acos x = cacos x+  atan x = catan x++foreign import ccall "log"  clog  :: Double -> Double+foreign import ccall "exp"  cexp  :: Double -> Double+foreign import ccall "sqrt" csqrt :: Double -> Double+foreign import ccall "sin"  csin  :: Double -> Double+foreign import ccall "cos"  ccos  :: Double -> Double+foreign import ccall "tan"  ctan  :: Double -> Double+foreign import ccall "asin" casin :: Double -> Double+foreign import ccall "acos" cacos :: Double -> Double+foreign import ccall "atan" catan :: Double -> Double+foreign import ccall "atan2" catan2 :: Double -> Double -> Double+foreign import ccall "scalbn" cscalbn :: Double -> Int -> Double++-- Assumes 32/64 bit floats+instance RealFloat Double where+  floatRadix     _ = 2+  floatDigits    _ = 53+  floatRange     _ = (-1021,1024)+  decodeFloat      = decodeFloat64+  encodeFloat      = encodeFloat64+  isNaN            = isNaNFloat64+  isInfinite       = isInfFloat64+  isDenormalized   = isDenFloat64+  isNegativeZero   = isNegZeroFloat64+  isIEEE         _ = True+  atan2 x y        = catan2 x y+  scaleFloat       = scaleFloat64++decodeFloat64 :: Double -> (Integer, Int)+decodeFloat64 x =+  let xw   = primWord64FromDoubleRaw x+      sign =  xw .&. 0x8000000000000000+      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+      mant =  xw .&. 0x000fffffffffffff+      neg  = if sign /= 0 then negate else id+      -- Haskell promises that the mantissa is normalized+      adjDenorm m e | abs m < (1 `shiftL` 52) = adjDenorm (2 * m) (e - 1)+                    | otherwise = (m, e)+  in  if expn == 0 then+        -- denormalized or 0+        if mant == 0 then+          (0, 0)  -- 0+        else+          adjDenorm (neg (_word64ToInteger mant)) (-1074)  -- denormalized+      else if expn == 0x7ff then+        -- infinity or NaN+        --(0, 0)+        error "decodeFloat64: inf or NaN"+      else+        -- ordinary number, add hidden bit+        -- mant is offset-1023, and assumes scaled mantissa (thus -52)+        (neg (_word64ToInteger (mant .|. 0x0010000000000000)),+         primWordToInt (primWord64ToWord expn) - 1023 - 52)++isNaNFloat64 :: Double -> Bool+isNaNFloat64 x =+  let xw   = primWord64FromDoubleRaw x+      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+      mant =  xw .&. 0x000fffffffffffff+  in  expn == 0x7ff && mant /= 0++isInfFloat64 :: Double -> Bool+isInfFloat64 x =+  let xw   = primWord64FromDoubleRaw x+      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+      mant =  xw .&. 0x000fffffffffffff+  in  expn == 0x7ff && mant == 0++isDenFloat64 :: Double -> Bool+isDenFloat64 x =+  let xw   = primWord64FromDoubleRaw x+      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+      mant =  xw .&. 0x000fffffffffffff+  in  expn == 0 && mant /= 0++isNegZeroFloat64 :: Double -> Bool+isNegZeroFloat64 x =+  primWord64FromDoubleRaw x == 0x8000000000000000++scaleFloat64 :: Int -> Double -> Double+scaleFloat64 n x = cscalbn x n++encodeFloat64 :: Integer -> Int -> Double+encodeFloat64 mant expn = scaleFloat64 expn (fromInteger mant)
lib/Data/Dynamic.hs view
@@ -11,8 +11,15 @@ import Data.Proxy import Data.Typeable import Unsafe.Coerce+import Control.Exception  data Dynamic = D TypeRep AnyType+  deriving Typeable++instance Exception Dynamic++instance Show Dynamic where+  show (D t _) = "<<" ++ show t ++ ">>"  toDyn :: forall a . Typeable a => a -> Dynamic toDyn a = D (typeOf a) (unsafeCoerce a)
lib/Data/Either.hs view
@@ -9,8 +9,9 @@ import Data.Eq import Data.Function import Data.Functor-import Data.Int+import Data.Int.Int import Data.Ord+import {-# SOURCE #-} Data.Typeable import Text.Show  data Either a b = Left a | Right b
lib/Data/Enum.hs view
@@ -15,7 +15,7 @@ import Data.Bounded import Data.Enum_Class import Data.Function-import Data.Int+import Data.Int.Int import Data.List import Data.Num import Data.Ord
lib/Data/Enum_Class.hs view
@@ -5,6 +5,7 @@ import Data.Bool import Data.Function((.)) import Data.List_Type+import {-# SOURCE #-} Data.Typeable  class Enum a where   succ           :: a -> a
lib/Data/Eq.hs view
@@ -4,6 +4,7 @@ import qualified Prelude()              -- do not import Prelude import Primitives import Data.Bool_Type+import {-# SOURCE #-} Data.Typeable  infix 4 ==,/= 
lib/Data/Fixed.hs view
@@ -39,6 +39,7 @@ import Text.ParserCombinators.ReadPrec import Text.Read.Lex import Data.Coerce+import Data.Data import Data.Double import Data.Floating import Data.Fractional@@ -66,7 +67,6 @@                  , Ord -- ^ @since 2.01                  ) -{- tyFixed :: DataType tyFixed = mkDataType "Data.Fixed.Fixed" [conMkFixed] @@ -74,12 +74,11 @@ conMkFixed = mkConstr tyFixed "MkFixed" [] Prefix  -- | @since 4.1.0.0-instance (Typeable k,Typeable a) => Data (Fixed (a :: k)) where+instance (Typeable a) => Data (Fixed a) where     gfoldl k z (MkFixed a) = k (z MkFixed) a     gunfold k z _ = k (z MkFixed)     dataTypeOf _ = tyFixed     toConstr _ = conMkFixed--}  type HasResolution :: forall k . k -> Constraint class HasResolution a where
lib/Data/Float.hs view
@@ -1,20 +1,199 @@+-- Copyright 2025 Lennart Augustsson+-- See LICENSE file for full license. module Data.Float(Float) where-import qualified Prelude()+import qualified Prelude()              -- do not import Prelude+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Char import Data.Enum import Data.Eq-import Data.FloatW import Data.Floating import Data.Fractional-import Data.Num+import Data.Function+import Data.Integer+import Data.Integer.Internal(_integerToFloat, _wordToInteger)+import Data.Integral+import Data.List import Data.Ord+import Data.Ratio import Data.Real import Data.RealFloat import Data.RealFrac-import Mhs.Builtin+import Data.Num+import Data.Word.Word+import {-# SOURCE #-} Numeric.FormatFloat(showFloat)+import Numeric.Show(showSignedNeg) import Text.Show -newtype Float = D FloatW-  deriving(Eq, Ord, Num, Fractional, Real, RealFrac, Floating, RealFloat, Enum)+instance Num Float where+  (+)  = primFloatAdd+  (-)  = primFloatSub+  (*)  = primFloatMul+  negate = primFloatNeg+  abs x = if x < 0.0 then - x else x+  signum x =+    case compare x 0.0 of+      LT -> -1.0+      EQ ->  0.0+      GT ->  1.0+  fromInteger = _integerToFloat +instance Fractional Float where+  (/) = primFloatDiv+  fromRational x =+    let n = numerator x+        d = denominator x+        maxVal = 2 ^ (127::Int)  -- actually bigger, but this converts correctly+    in  if abs n <= maxVal && d < maxVal then+          fromInteger n / fromInteger d+        else+          let (ne, nm) = scaleToMax maxVal n+              (de, dm) = scaleToMax maxVal d+          in  scaleFloat32 (ne - de) (fromInteger nm / fromInteger dm)++-- XXX Very inefficient scaling+-- If we get here the number has > 127 bits, so shifting by 64 is fine.+scaleToMax :: Integer -> Integer -> (Int, Integer)+scaleToMax m = f 0+  where f e x = if abs x < m then (e, x) else f (e+64) (x `shiftR` 64)++instance Eq Float where+  (==) = primFloatEQ+  (/=) = primFloatNE++instance Ord Float where+  (<)  = primFloatLT+  (<=) = primFloatLE+  (>)  = primFloatGT+  (>=) = primFloatGE+ instance Show Float where-  showsPrec p (D x) = showsPrec p x+  showsPrec = showSignedNeg (\ x -> x < 0 || isNegZeroFloat32 x) showFloat++{- in Text.Read.Internal+instance Read Float where+  readsPrec _ = readSigned $ \ r -> [ (primFloatRead s, t) | (s@(c:_), t) <- lex r, isDigit c ]+-}++instance Enum Float where+  succ x = x + 1+  pred x = x - 1+  toEnum n = fromIntegral n+  fromEnum = fromInteger . truncate+  enumFrom = numericEnumFrom+  enumFromThen = numericEnumFromThen+  enumFromTo = numericEnumFromTo+  enumFromThenTo = numericEnumFromThenTo++instance Real Float where+  toRational x | isNaN x = rationalNaN+               | isInfinite x = if x < 0 then -rationalInfinity else rationalInfinity+               | isNegativeZero x = rationalNegativeZero+               | otherwise =+    case decodeFloat x of+      (m, e) -> toRational m * 2^^e++instance RealFrac Float where+  properFraction x =+    case decodeFloat x of+      (m, e) ->   -- x = m * 2^e+        let m' | e < 0     = m `quot` 2^(-e)+               | otherwise = m * 2^e+        in  (fromInteger m', x - fromInteger m')++instance Floating Float where+  pi     = 3.141592653589793+  log  x = clog x+  exp  x = cexp x+  sqrt x = csqrt x+  sin  x = csin x+  cos  x = ccos x+  tan  x = ctan x+  asin x = casin x+  acos x = cacos x+  atan x = catan x++foreign import ccall "logf"  clog  :: Float -> Float+foreign import ccall "expf"  cexp  :: Float -> Float+foreign import ccall "sqrtf" csqrt :: Float -> Float+foreign import ccall "sinf"  csin  :: Float -> Float+foreign import ccall "cosf"  ccos  :: Float -> Float+foreign import ccall "tanf"  ctan  :: Float -> Float+foreign import ccall "asinf" casin :: Float -> Float+foreign import ccall "acosf" cacos :: Float -> Float+foreign import ccall "atanf" catan :: Float -> Float+foreign import ccall "atan2f" catan2 :: Float -> Float -> Float+foreign import ccall "scalbnf" cscalbn :: Float -> Int -> Float++-- Assumes 32/64 bit floats+instance RealFloat Float where+  floatRadix     _ = 2+  floatDigits    _ = 24+  floatRange     _ = (-125,128)+  decodeFloat      = decodeFloat32+  encodeFloat      = encodeFloat32+  isNaN            = isNaNFloat32+  isInfinite       = isInfFloat32+  isDenormalized   = isDenFloat32+  isNegativeZero   = isNegZeroFloat32+  isIEEE         _ = True+  atan2 x y        = catan2 x y+  scaleFloat       = scaleFloat32++decodeFloat32 :: Float -> (Integer, Int)+decodeFloat32 x =+  let xw   = primWordFromFloatRaw x+      sign =  xw .&. 0x80000000+      expn = (xw .&. 0x7fffffff) `shiftR` 23+      mant =  xw .&. 0x007fffff+      neg  = if sign /= 0 then negate else id+      -- Haskell promises that the mantissa is normalized+      adjDenorm m e | abs m < (1 `shiftL` 23) = adjDenorm (2 * m) (e - 1)+                    | otherwise = (m, e)+  in  if expn == 0 then+        -- denormalized or 0+        if mant == 0 then+          (0, 0)  -- 0+        else+          adjDenorm (neg (_wordToInteger mant)) (-149)  -- denormalized+      else if expn == 0xff then+        -- infinity or NaN+        error "decodeFloat32: inf or NaN"+      else+        -- ordinary number, add hidden bit+        -- mant is offset-127, and assumes scaled mantissa (thus -23)+        (neg (_wordToInteger (mant .|. 0x00800000)),+         primWordToInt expn - 127 - 23)++isNaNFloat32 :: Float -> Bool+isNaNFloat32 x =+  let xw   = primWordFromFloatRaw x+      expn = (xw .&. 0x7fffffff) `shiftR` 23+      mant =  xw .&. 0x007fffff+  in  expn == 0xff && mant /= 0++isInfFloat32 :: Float -> Bool+isInfFloat32 x =+  let xw   = primWordFromFloatRaw x+      expn = (xw .&. 0x7fffffff) `shiftR` 23+      mant =  xw .&. 0x007fffff+  in  expn == 0xff && mant == 0++isDenFloat32 :: Float -> Bool+isDenFloat32 x =+  let xw   = primWordFromFloatRaw x+      expn = (xw .&. 0x7fffffff) `shiftR` 23+      mant =  xw .&. 0x007fffff+  in  expn == 0 && mant /= 0++isNegZeroFloat32 :: Float -> Bool+isNegZeroFloat32 x =+  primWordFromFloatRaw x == 0x80000000++scaleFloat32 :: Int -> Float -> Float+scaleFloat32 n x = cscalbn x n++encodeFloat32 :: Integer -> Int -> Float+encodeFloat32 mant expn = scaleFloat32 expn (fromInteger mant)
− lib/Data/FloatW.hs
@@ -1,241 +0,0 @@--- Copyright 2023 Lennart Augustsson--- See LICENSE file for full license.-module Data.FloatW(FloatW) where-import qualified Prelude()              -- do not import Prelude-import Primitives-import Control.Error-import Data.Bits-import Data.Bool-import Data.Char-import Data.Enum-import Data.Eq-import Data.Floating-import Data.Fractional-import Data.Function-import Data.Integer-import Data.Integer.Internal(_integerToFloatW, _wordToInteger)-import Data.Integral-import Data.List-import Data.Ord-import Data.Ratio-import Data.Real-import Data.RealFloat-import Data.RealFrac-import Data.Num-import Data.Word-import Text.Show------- This is a floating point type that is a wide as the word width of the machine.-----instance Num FloatW where-  (+)  = primFloatWAdd-  (-)  = primFloatWSub-  (*)  = primFloatWMul-  negate = primFloatWNeg-  abs x = if x < 0.0 then - x else x-  signum x =-    case compare x 0.0 of-      LT -> -1.0-      EQ ->  0.0-      GT ->  1.0-  fromInteger = _integerToFloatW--instance Fractional FloatW where-  (/) = primFloatWDiv-  -- This version of fromRational can go horribly wrong-  -- if the integers are bigger than can be represented in a FloatW.-  -- It'll do for now.-  fromRational x | x == rationalNaN = 0/0-                 | x == rationalInfinity = 1/0-                 | x == -rationalInfinity = (-1)/0-                 | otherwise =-    fromInteger (numerator x) / fromInteger (denominator x)--instance Eq FloatW where-  (==) = primFloatWEQ-  (/=) = primFloatWNE--instance Ord FloatW where-  (<)  = primFloatWLT-  (<=) = primFloatWLE-  (>)  = primFloatWGT-  (>=) = primFloatWGE---- For now, cheat and call C-instance Show FloatW where-  show = primFloatWShow -- should be Numeric.FormatFloat.showFloat, but that drags in a lot of stuff--{- in Text.Read.Internal-instance Read FloatW where-  readsPrec _ = readSigned $ \ r -> [ (primFloatWRead s, t) | (s@(c:_), t) <- lex r, isDigit c ]--}--instance Enum FloatW where-  succ x = x + 1-  pred x = x - 1-  toEnum n = fromIntegral n-  fromEnum = fromInteger . truncate-  enumFrom = numericEnumFrom-  enumFromThen = numericEnumFromThen-  enumFromTo = numericEnumFromTo-  enumFromThenTo = numericEnumFromThenTo--instance Real FloatW where-  toRational x | isNaN x = rationalNaN-               | isInfinite x = if x < 0 then -rationalInfinity else rationalInfinity-               | otherwise =-    case decodeFloat x of-      (m, e) -> toRational m * 2^^e--instance RealFrac FloatW where-  properFraction x =-    case decodeFloat x of-      (m, e) ->   -- x = m * 2^e-        let m' | e < 0     = m `quot` 2^(-e)-               | otherwise = m * 2^e-        in  (fromInteger m', x - fromInteger m')--instance Floating FloatW 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  :: FloatW -> IO FloatW-foreign import ccall "exp"  cexp  :: FloatW -> IO FloatW-foreign import ccall "sqrt" csqrt :: FloatW -> IO FloatW-foreign import ccall "sin"  csin  :: FloatW -> IO FloatW-foreign import ccall "cos"  ccos  :: FloatW -> IO FloatW-foreign import ccall "tan"  ctan  :: FloatW -> IO FloatW-foreign import ccall "asin" casin :: FloatW -> IO FloatW-foreign import ccall "acos" cacos :: FloatW -> IO FloatW-foreign import ccall "atan" catan :: FloatW -> IO FloatW-foreign import ccall "atan2" catan2 :: FloatW -> FloatW -> IO FloatW---- Assumes 32/64 bit floats-instance RealFloat FloatW where-  floatRadix     _ = 2-  floatDigits    _ = flt 24 53-  floatRange     _ = flt (-125,128) (-1021,1024)-  decodeFloat      = flt decodeFloat32 decodeFloat64-  encodeFloat      = flt encodeFloat32 encodeFloat64-  isNaN            = flt isNaNFloat32 isNaNFloat64-  isInfinite       = flt isInfFloat32 isInfFloat64-  isDenormalized   = flt isDenFloat32 isDenFloat64-  isNegativeZero   = flt isNegZeroFloat32 isNegZeroFloat64-  isIEEE         _ = True-  atan2 x y        = primPerformIO (catan2 x y)--flt :: forall a . a -> a -> a-flt f d | _wordSize == 32 = f-        | otherwise       = d--decodeFloat64 :: FloatW -> (Integer, Int)-decodeFloat64 x =-  let xw   = primWordFromFloatWRaw 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)--isNaNFloat64 :: FloatW -> Bool-isNaNFloat64 x =-  let xw   = primWordFromFloatWRaw x-      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52-      mant =  xw .&. 0x000fffffffffffff-  in  expn == 0x7ff && mant /= 0--isInfFloat64 :: FloatW -> Bool-isInfFloat64 x =-  let xw   = primWordFromFloatWRaw x-      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52-      mant =  xw .&. 0x000fffffffffffff-  in  expn == 0x7ff && mant == 0--isDenFloat64 :: FloatW -> Bool-isDenFloat64 x =-  let xw   = primWordFromFloatWRaw x-      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52-      mant =  xw .&. 0x000fffffffffffff-  in  expn == 0 && mant /= 0--isNegZeroFloat64 :: FloatW -> Bool-isNegZeroFloat64 x =-  let xw   = primWordFromFloatWRaw x-      sign = xw .&. 0x8000000000000000-      rest = xw .&. 0x7fffffffffffffff-  in  sign /= 0 && rest == 0---- Simple (and sometimes wrong) encoder-encodeFloat64 :: Integer -> Int -> FloatW-encodeFloat64 mant expn = fromInteger mant * 2^^expn--decodeFloat32 :: FloatW -> (Integer, Int)-decodeFloat32 x =-  let xw   = primWordFromFloatWRaw x-      sign =  xw .&. 0x80000000-      expn = (xw .&. 0x7fffffff) `shiftR` 23-      mant =  xw .&. 0x007fffff-      neg  = if sign /= 0 then negate else id-  in  if expn == 0 then-        -- subnormal or 0-        (neg (_wordToInteger mant), 0)-      else if expn == 0xff 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 .|. 0x00400000)),-         primWordToInt expn - 127 - 22)--isNaNFloat32 :: FloatW -> Bool-isNaNFloat32 x =-  let xw   = primWordFromFloatWRaw x-      expn = (xw .&. 0x7fffffff) `shiftR` 23-      mant =  xw .&. 0x007fffff-  in  expn == 0xff && mant /= 0--isInfFloat32 :: FloatW -> Bool-isInfFloat32 x =-  let xw   = primWordFromFloatWRaw x-      expn = (xw .&. 0x7fffffff) `shiftR` 23-      mant =  xw .&. 0x007fffff-  in  expn == 0x7ff && mant == 0--isDenFloat32 :: FloatW -> Bool-isDenFloat32 x =-  let xw   = primWordFromFloatWRaw x-      expn = (xw .&. 0x7fffffff) `shiftR` 23-      mant =  xw .&. 0x007fffff-  in  expn == 0 && mant /= 0--isNegZeroFloat32 :: FloatW -> Bool-isNegZeroFloat32 x =-  let xw   = primWordFromFloatWRaw x-      sign = xw .&. 0x80000000-      rest = xw .&. 0x7fffffff-  in  sign /= 0 && rest == 0---- Simple (and sometimes wrong) encoder-encodeFloat32 :: Integer -> Int -> FloatW-encodeFloat32 mant expn = fromInteger mant * 2^^expn
lib/Data/Floating.hs view
@@ -3,6 +3,7 @@ import Primitives import Data.Fractional import Data.Num+import {-# SOURCE #-} Data.Typeable  infixr 8 ** 
lib/Data/Foldable.hs view
@@ -61,6 +61,7 @@ import Data.Num import Data.Ord import Data.Proxy+import {-# SOURCE #-} Data.Typeable  infix  4 `elem`, `notElem` 
lib/Data/Foldable/Internal.hs view
@@ -9,14 +9,11 @@ import Data.Monoid.Internal hiding (Max(..), Min(..)) import Data.List import Data.Ord+import {-# SOURCE #-} Data.Typeable -newtype Max a = Max (Maybe a)-getMax :: forall a . Max a -> Maybe a-getMax (Max ma) = ma+newtype Max a = Max { getMax :: Maybe a } -newtype Min a = Min (Maybe a)-getMin :: forall a . Min a -> Maybe a-getMin (Min ma) = ma+newtype Min a = Min { getMin :: Maybe a }  instance forall a . Ord a => Semigroup (Max a) where     m <> Max Nothing = m@@ -40,9 +37,7 @@     mempty = Min Nothing     mconcat = foldl' (<>) mempty -newtype StateL s a = StateL (s -> (s, a))-runStateL :: StateL s a -> s -> (s, a)-runStateL (StateL f) = f+newtype StateL s a = StateL { runStateL :: s -> (s, a) }  instance Functor (StateL s) where     fmap f (StateL k) = StateL $ \ s -> let (s', v) = k s in (s', f v)@@ -54,9 +49,7 @@             (s'', v) = kv s'         in (s'', f v) -newtype StateR s a = StateR (s -> (s, a))-runStateR :: StateR s a -> s -> (s, a)-runStateR (StateR f) = f+newtype StateR s a = StateR { runStateR :: s -> (s, a) }  instance Functor (StateR s) where     fmap f (StateR k) = StateR $ \ s -> let (s', v) = k s in (s', f v)@@ -68,9 +61,7 @@             (s'', f) = kf s'         in (s'', f v) -newtype StateT s m a = StateT (s -> m (s, a))-runStateT :: StateT s m a -> s -> m (s, a)-runStateT (StateT f) = f+newtype StateT s m a = StateT { runStateT :: s -> m (s, a) }  instance Monad m => Functor (StateT s m) where     fmap = liftM
lib/Data/Fractional.hs view
@@ -8,6 +8,9 @@ import Data.Ord import Data.Ratio_Type import Data.Real+import {-# SOURCE #-} Data.Typeable++infixl 7 /  class Num a => Fractional a where   (/) :: a -> a -> a
lib/Data/Function.hs view
@@ -37,6 +37,7 @@ asTypeOf :: forall a . a -> a -> a asTypeOf = const +infixr 0 `seq` seq :: forall a b . a -> b -> b seq = primSeq 
lib/Data/Functor.hs view
@@ -9,6 +9,7 @@ import qualified Prelude()              -- do not import Prelude import Primitives  -- for fixity import Data.Function+import {-# SOURCE #-} Data.Typeable  infixl 4 <$ 
lib/Data/Functor/Compose.hs view
@@ -38,7 +38,7 @@            , Semigroup -- ^ @since 4.16.0.0            , Monoid    -- ^ @since 4.16.0.0            )-+-} deriving instance Eq (f (g a)) => Eq (Compose f g a) deriving instance Ord (f (g a)) => Ord (Compose f g a) @@ -47,13 +47,7 @@      readListPrec = readListPrecDefault     readList     = readListDefault--}-instance Eq (f (g a)) => Eq (Compose f g a) where-  Compose x == Compose y  =  x == y -instance Ord (f (g a)) => Ord (Compose f g a) where-  Compose x `compare` Compose y  =  x `compare` y- instance Show (f (g a)) => Show (Compose f g a) where     showsPrec = liftShowsPrecCompose showsPrec @@ -83,11 +77,9 @@         sp' = liftShowsPrec sp sl         sl' = liftShowList sp sl -{- -- The workhorse for Compose's Read and Read1 instances. liftReadPrecCompose :: ReadPrec (f (g a)) -> ReadPrec (Compose f g a) liftReadPrecCompose rp = readData $ readUnaryWith rp "Compose" Compose--}  -- The workhorse for Compose's Show and Show1 instances. liftShowsPrecCompose :: (Int -> f (g a) -> ShowS) -> Int -> Compose f g a -> ShowS
lib/Data/Functor/Const.hs view
@@ -10,7 +10,7 @@ import Data.Function import Data.Functor import Data.Functor.Const_Type-import Data.Int+import Data.Int.Int import Data.Monoid.Internal import Data.Ord import Text.Show
lib/Data/Functor/Const_Type.hs view
@@ -1,6 +1,6 @@ -- Copyright 2023 Lennart Augustsson -- See LICENSE file for full license.-module Data.Functor.Const_Type(Const(..), getConst) where+module Data.Functor.Const_Type(Const(..)) where import qualified Prelude()              -- do not import Prelude import Primitives import Data.Bool@@ -8,13 +8,11 @@ import Data.Eq import Data.Function import Data.Functor-import Data.Int+import Data.Int.Int import Data.Ord+import {-# SOURCE #-} Data.Typeable import Text.Show  type Const :: forall k . Type -> k -> Type-newtype Const a b = Const a+newtype Const a b = Const { getConst :: a }   deriving (Eq, Ord, Show)--getConst :: forall a b . Const a b -> a-getConst (Const a) = a
lib/Data/Functor/Contravariant.hs view
@@ -26,6 +26,7 @@ {-   -- * Predicates   , Predicate(..)+-}    -- * Comparisons   , Comparison(..)@@ -38,7 +39,6 @@    -- * Dual arrows   , Op(..)--}   ) where  import Control.Applicative@@ -160,25 +160,25 @@ -}  instance (Contravariant f, Contravariant g) => Contravariant (Sum f g) where---  contramap :: (a' -> a) -> (Sum f g a -> Sum f g a')+  contramap :: (a' -> a) -> (Sum f g a -> Sum f g a')   contramap f (InL xs) = InL (contramap f xs)   contramap f (InR ys) = InR (contramap f ys)  instance (Contravariant f, Contravariant g)       => Contravariant (Product f g) where---  contramap :: (a' -> a) -> (Product f g a -> Product f g a')+  contramap :: (a' -> a) -> (Product f g a -> Product f g a')   contramap f (Pair a b) = Pair (contramap f a) (contramap f b)  instance Contravariant (Const a) where---  contramap :: (b' -> b) -> (Const a b -> Const a b')+  contramap :: (b' -> b) -> (Const a b -> Const a b')   contramap _ (Const a) = Const a  instance (Functor f, Contravariant g) => Contravariant (Compose f g) where---  contramap :: (a' -> a) -> (Compose f g a -> Compose f g a')+  contramap :: (a' -> a) -> (Compose f g a -> Compose f g a')   contramap f (Compose fga) = Compose (fmap (contramap f) fga)  instance Contravariant Proxy where---  contramap :: (a' -> a) -> (Proxy a -> Proxy a')+  contramap :: (a' -> a) -> (Proxy a -> Proxy a')   contramap _ _ = Proxy  {-@@ -219,6 +219,7 @@       Contravariant     )   via Op Bool+-}  -- | Defines a total ordering on a type as per 'compare'. --@@ -374,4 +375,3 @@   acosh (Op f) = Op $ acosh . f   Op f ** Op g = Op $ \a -> f a ** g a   logBase (Op f) (Op g) = Op $ \a -> logBase (f a) (g a)--}
lib/Data/Functor/Identity.hs view
@@ -10,9 +10,10 @@ import Data.Eq import Data.Function import Data.Functor-import Data.Int+import Data.Int.Int import Data.Ord import Data.Records   -- needed since we don't import Mhs.Builtin+import {-# SOURCE #-} Data.Typeable import Text.Show  newtype Identity a = Identity { runIdentity :: a }
lib/Data/Functor/Product.hs view
@@ -34,7 +34,7 @@            , Generic  -- ^ @since 4.9.0.0            , Generic1 -- ^ @since 4.9.0.0            )-+-} -- | @since 4.18.0.0 deriving instance (Eq (f a), Eq (g a)) => Eq (Product f g a) -- | @since 4.18.0.0@@ -43,7 +43,6 @@ deriving instance (Read (f a), Read (g a)) => Read (Product f g a) -- | @since 4.18.0.0 deriving instance (Show (f a), Show (g a)) => Show (Product f g a)--}  instance (Eq1 f, Eq1 g) => Eq1 (Product f g) where     liftEq eq (Pair x1 y1) (Pair x2 y2) = liftEq eq x1 x2 && liftEq eq y1 y2@@ -52,14 +51,12 @@     liftCompare comp (Pair x1 y1) (Pair x2 y2) =         liftCompare comp x1 x2 `mappend` liftCompare comp y1 y2 -{- instance (Read1 f, Read1 g) => Read1 (Product f g) where     liftReadPrec rp rl = readData $         readBinaryWith (liftReadPrec rp rl) (liftReadPrec rp rl) "Pair" Pair      liftReadListPrec = liftReadListPrecDefault     liftReadList     = liftReadListDefault--}  instance (Show1 f, Show1 g) => Show1 (Product f g) where     liftShowsPrec sp sl d (Pair x y) =
lib/Data/Functor/Sum.hs view
@@ -38,7 +38,7 @@            , Generic  -- ^ @since 4.9.0.0            , Generic1 -- ^ @since 4.9.0.0            )-+-} -- | @since 4.18.0.0 deriving instance (Eq (f a), Eq (g a)) => Eq (Sum f g a) -- | @since 4.18.0.0@@ -47,7 +47,6 @@ deriving instance (Read (f a), Read (g a)) => Read (Sum f g a) -- | @since 4.18.0.0 deriving instance (Show (f a), Show (g a)) => Show (Sum f g a)--}  -- | @since 4.9.0.0 instance (Eq1 f, Eq1 g) => Eq1 (Sum f g) where
lib/Data/Hashable.hs view
@@ -2,11 +2,15 @@  module Data.Hashable(   Hashable(..),+  hashInt,+  defaultSalt,+  distinguisher,   ) where  --import Data.Bits import qualified Data.ByteString as B import Data.Complex+import Data.Eq import Data.Fixed import Data.Int import Data.Integer(_integerToIntList)@@ -19,7 +23,7 @@  infixl 0 `hashWithSalt` -class Hashable a where+class Eq a => Hashable a where   hashWithSalt :: Salt -> a -> Int    hash :: a -> Int
+ lib/Data/Hashable/Class.hs view
@@ -0,0 +1,67 @@+module Data.Hashable.Class(+  Hashable(..),+  Hashable1(..),+  Hashable2(..),+  hashWithSalt1,+  hashWithSalt2,+  defaultLiftHashWithSalt,+  ) where+import Data.Functor.Classes+import Data.Functor.Const+import Data.Hashable+import Data.List+import qualified Data.List.NonEmpty as NE++class (Eq1 t {-, forall a. Hashable a => Hashable (t a)-}) => Hashable1 t where+    liftHashWithSalt :: (Int -> a -> Int) -> Int -> t a -> Int++class (Eq2 t {-, forall a. Hashable a => Hashable1 (t a)-}) => Hashable2 t where+    liftHashWithSalt2 :: (Int -> a -> Int) -> (Int -> b -> Int) -> Int -> t a b -> Int++hashWithSalt1 :: (Hashable1 f, Hashable a) => Int -> f a -> Int+hashWithSalt1 = liftHashWithSalt hashWithSalt++hashWithSalt2 :: (Hashable2 f, Hashable a, Hashable b) => Int -> f a b -> Int+hashWithSalt2 = liftHashWithSalt2 hashWithSalt hashWithSalt++defaultLiftHashWithSalt :: (Hashable2 f, Hashable a) => (Int -> b -> Int) -> Int -> f a b -> Int+defaultLiftHashWithSalt h = liftHashWithSalt2 hashWithSalt h++hashUsing :: (Hashable b) =>+             (a -> b)           -- ^ Transformation function.+          -> Int                -- ^ Salt.+          -> a                  -- ^ Value to transform.+          -> Int+hashUsing f salt x = hashWithSalt salt (f x)++instance Hashable1 Maybe where+    liftHashWithSalt _ s Nothing = s `hashInt` 0+    liftHashWithSalt h s (Just a) = s `hashInt` distinguisher `h` a++instance Hashable a => Hashable1 (Either a) where+    liftHashWithSalt = defaultLiftHashWithSalt++instance Hashable2 Either where+    liftHashWithSalt2 h _ s (Left a) = s `hashInt` 0 `h` a+    liftHashWithSalt2 _ h s (Right b) = s `hashInt` distinguisher `h` b++instance Hashable a1 => Hashable1 ((,) a1) where+    liftHashWithSalt = defaultLiftHashWithSalt++instance Hashable2 (,) where+    liftHashWithSalt2 h1 h2 s (a1, a2) = s `h1` a1 `h2` a2++instance Hashable1 [] where+    liftHashWithSalt h salt arr = finalise (foldl' step (salt, 0) arr)+      where+        finalise (s, l) = hashWithSalt s l+        step (s, l) x   = (h s x, l + 1)++instance Hashable2 Const where+    liftHashWithSalt2 f _ salt (Const x) = f salt x++instance Hashable1 Proxy where+    liftHashWithSalt _ s _ = s++instance Hashable1 NE.NonEmpty where+    liftHashWithSalt h salt (a NE.:| as) = liftHashWithSalt h (h salt a) as
+ lib/Data/Hashable/Lifted.hs view
@@ -0,0 +1,8 @@+module Data.Hashable.Lifted(+  Hashable1(..),+  Hashable2(..),+  hashWithSalt1,+  hashWithSalt2,+  defaultLiftHashWithSalt,+  ) where+import Data.Hashable.Class
− lib/Data/IOArray.hs
@@ -1,17 +0,0 @@-module Data.IOArray(module Data.IOArray, IOArray) where-import qualified Prelude()              -- do not import Prelude-import Primitives---- data IOArray--newIOArray :: forall a . Int -> a -> IO (IOArray a)-newIOArray = primArrAlloc--sizeIOArray :: forall a . IOArray a -> IO Int-sizeIOArray = primArrSize--readIOArray :: forall a . IOArray a -> Int -> IO a-readIOArray = primArrRead--writeIOArray :: forall a . IOArray a -> Int -> a -> IO ()-writeIOArray = primArrWrite
lib/Data/IORef.hs view
@@ -4,12 +4,18 @@   readIORef,   writeIORef,   modifyIORef,+  modifyIORef',   atomicModifyIORef,+  atomicModifyIORef',+  atomicWriteIORef,+  mkWeakIORef,   ) where import qualified Prelude()              -- do not import Prelude import Primitives import Data.Eq+import Data.Maybe_Type import {-# SOURCE #-} Data.Typeable+import System.Mem.Weak  -- An IORef is represented as an IOArray with a single element. newtype IORef a = R (IOArray a)@@ -30,6 +36,19 @@ modifyIORef :: forall a . IORef a -> (a -> a) -> IO () modifyIORef (R p) f = primArrRead p 0 `primBind` \ a -> primArrWrite p 0 (f a) +modifyIORef' :: forall a . IORef a -> (a -> a) -> IO ()+modifyIORef' (R p) f = primArrRead p 0 `primBind` \ a -> let a' = f a in primSeq a' (primArrWrite p 0 a')++mkWeakIORef :: IORef a -> IO () -> IO (Weak (IORef a))+mkWeakIORef r fin = mkWeakPtr r (Just fin)+ -- XXX WRONG atomicModifyIORef :: forall a b . IORef a -> (a -> (a, b)) -> IO b atomicModifyIORef r f = readIORef r `primBind` \ a -> let (a', b) = f a in writeIORef r a' `primThen` primReturn b++-- XXX WRONG+atomicModifyIORef' :: forall a b . IORef a -> (a -> (a, b)) -> IO b+atomicModifyIORef' r f = readIORef r `primBind` \ a -> let (a', b) = f a in primSeq a' (writeIORef r a') `primThen` primSeq b (primReturn b)++atomicWriteIORef :: forall a . IORef a -> a -> IO ()+atomicWriteIORef = writeIORef
lib/Data/Int.hs view
@@ -2,77 +2,8 @@ -- See LICENSE file for full license. module Data.Int(Int, Int8, Int16, Int32, Int64) where import qualified Prelude()              -- do not import Prelude-import Primitives-import Data.Bool_Type-import Data.Bounded-import Data.Char_Type-import Data.Eq-import Data.Int.IntN-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 - 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 ((primWordInv (0::Word) `primWordQuot` 2) `primWordAdd` 1)-  maxBound = primWordToInt  (primWordInv (0::Word) `primWordQuot` 2)--instance Real Int where-  toRational i = _integerToRational (_intToInteger i)--instance Eq Int where-  (==) = primIntEQ-  (/=) = primIntNE--instance Ord Int where-  compare = primIntCompare-  (<)  = primIntLT-  (<=) = primIntLE-  (>)  = primIntGT-  (>=) = primIntGE--instance Show Int where-  showsPrec p n r =-    if n < (0::Int) then-      if p > (6::Int) then-        '(' : '-' : showUnsignedNegInt n (')' : r)-      else-        '-' : showUnsignedNegInt n r-    else-      showUnsignedNegInt (- n) r---- Some trickery to show minBound correctly.--- To print the number n, pass -n.-showUnsignedNegInt :: Int -> ShowS-showUnsignedNegInt n r =-  let c = primChr (primOrd '0' - rem n (10::Int))-  in  if n > -(10::Int) then-        c : r-      else-        showUnsignedNegInt (quot n (10::Int)) (c : r)-------------------------------------- In Text.Read: instance Read Int+import Data.Int.Int+import Data.Int.Int8+import Data.Int.Int16+import Data.Int.Int32+import Data.Int.Int64
− lib/Data/Int/Instances.hs
@@ -1,417 +0,0 @@-module Data.Int.Instances() where-import qualified Prelude()-import Primitives-import Control.Error-import Data.Bits-import Data.Bool-import Data.Bounded-import Data.Coerce-import Data.Enum-import Data.Eq-import Data.Function-import Data.Int.IntN-import Data.Integer_Type-import Data.Integral-import Data.List-import Data.Maybe_Type-import Data.Num-import Data.Ord-import Data.Ratio_Type-import Data.Real-import Numeric.Show-import Text.Show---------------------------------------------------------------------------------------    Int8---- Do sign extension by shifting.-i8 :: Int -> Int8-i8 w = I8 ((w `primIntShl` n) `primIntShr` n)-  where n = _wordSize `primIntSub` 8--bin8 :: (Int -> Int -> Int) -> (Int8 -> Int8 -> Int8)-bin8 op (I8 x) (I8 y) = i8 (x `op` y)--bini8 :: (Int -> Int -> Int) -> (Int8 -> Int -> Int8)-bini8 op (I8 x) y = i8 (x `op` y)--cmp8 :: (Int -> Int -> a) -> (Int8 -> Int8 -> a)-cmp8 op (I8 x) (I8 y) = x `op` y--una8 :: (Int -> Int) -> (Int8 -> Int8)-una8 op (I8 x) = i8 (op x)--instance Num Int8 where-  (+)  = bin8 primIntAdd-  (-)  = bin8 primIntSub-  (*)  = bin8 primIntMul-  abs x = x-  signum x = if x < 0 then -1 else if x > 0 then 1 else 0-  fromInteger i = i8 (_integerToInt i)--instance Integral Int8 where-  quot = bin8 primIntQuot-  rem  = bin8 primIntRem-  toInteger = _intToInteger . unI8--instance Bounded Int8 where-  minBound = i8 0x80-  maxBound = i8 0x7f--instance Real Int8 where-  toRational = _integerToRational . _intToInteger . unI8--instance Show Int8 where-  showsPrec = showIntegral--{- in Text.Read.Internal-instance Read Int8 where-  readsPrec = readIntegral--}--instance Enum Int8 where-  succ x = if x == maxBound then error "Int8.succ: overflow" else x + 1-  pred x = if x == minBound then error "Int8.pred: underflow" else x - 1-  toEnum = i8-  fromEnum = unI8-  enumFrom n = enumFromTo n maxBound-  enumFromThen n m-    | m >= n = enumFromThenTo n m maxBound-    | otherwise = enumFromThenTo n m minBound-  enumFromTo = coerce (enumFromTo @Int)-  enumFromThenTo = coerce (enumFromThenTo @Int)--instance Eq Int8 where-  (==) = cmp8 primIntEQ-  (/=) = cmp8 primIntNE--instance Ord Int8 where-  compare = cmp8 primIntCompare-  (<)  = cmp8 primIntLT-  (<=) = cmp8 primIntLE-  (>)  = cmp8 primIntGT-  (>=) = cmp8 primIntGE--instance Bits Int8 where-  (.&.) = bin8 primIntAnd-  (.|.) = bin8 primIntOr-  xor   = bin8 primIntXor-  complement = una8 primIntInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= 8 = 0-    | True = x `unsafeShiftL` i-  unsafeShiftL = bini8 primIntShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= 8 = 0-    | True = x `unsafeShiftR` i-  unsafeShiftR = bini8 primIntShr-  bitSizeMaybe _ = Just 8-  bitSize _ = 8-  bit = bitDefault-  testBit = testBitDefault-  popCount (I8 x) = primIntPopcount (x .&. 0xff)-  zeroBits = 0-  isSigned _ = True--instance FiniteBits Int8 where-  finiteBitSize _ = 8-  countLeadingZeros (I8 x) = primIntClz (x .&. 0xff) - (_wordSize - 8)-  countTrailingZeros (I8 x) = if x == 0 then 8 else primIntCtz x---------------------------------------------------------------------------------------    Int16---- Do sign extension by shifting.-i16 :: Int -> Int16-i16 w = I16 ((w `primIntShl` n) `primIntShr` n)-  where n = _wordSize `primIntSub` 16--bin16 :: (Int -> Int -> Int) -> (Int16 -> Int16 -> Int16)-bin16 op (I16 x) (I16 y) = i16 (x `op` y)--bini16 :: (Int -> Int -> Int) -> (Int16 -> Int -> Int16)-bini16 op (I16 x) y = i16 (x `op` y)--cmp16 :: (Int -> Int -> a) -> (Int16 -> Int16 -> a)-cmp16 op (I16 x) (I16 y) = x `op` y--una16 :: (Int -> Int) -> (Int16 -> Int16)-una16 op (I16 x) = i16 (op x)--instance Num Int16 where-  (+)  = bin16 primIntAdd-  (-)  = bin16 primIntSub-  (*)  = bin16 primIntMul-  abs x = x-  signum x = if x < 0 then -1 else if x > 0 then 1 else 0-  fromInteger i = i16 (_integerToInt i)--instance Integral Int16 where-  quot = bin16 primIntQuot-  rem  = bin16 primIntRem-  toInteger = _intToInteger . unI16--instance Bounded Int16 where-  minBound = i16 0x8000-  maxBound = i16 0x7fff--instance Real Int16 where-  toRational = _integerToRational . _intToInteger . unI16--instance Show Int16 where-  showsPrec = showIntegral--{- in Text.Read.Internal-instance Read Int16 where-  readsPrec = readIntegral--}--instance Enum Int16 where-  succ x = if x == maxBound then error "Int16.succ: overflow" else x + 1-  pred x = if x == minBound then error "Int16.pred: underflow" else x - 1-  toEnum = i16-  fromEnum = unI16-  enumFrom n = enumFromTo n maxBound-  enumFromThen n m-    | m >= n = enumFromThenTo n m maxBound-    | otherwise = enumFromThenTo n m minBound-  enumFromTo = coerce (enumFromTo @Int)-  enumFromThenTo = coerce (enumFromThenTo @Int)--instance Eq Int16 where-  (==) = cmp16 primIntEQ-  (/=) = cmp16 primIntNE--instance Ord Int16 where-  compare = cmp16 primIntCompare-  (<)  = cmp16 primIntLT-  (<=) = cmp16 primIntLE-  (>)  = cmp16 primIntGT-  (>=) = cmp16 primIntGE--instance Bits Int16 where-  (.&.) = bin16 primIntAnd-  (.|.) = bin16 primIntOr-  xor   = bin16 primIntXor-  complement = una16 primIntInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= 16 = 0-    | True = x `unsafeShiftL` i-  unsafeShiftL = bini16 primIntShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= 16 = 0-    | True = x `unsafeShiftR` i-  unsafeShiftR = bini16 primIntShr-  bitSizeMaybe _ = Just 16-  bitSize _ = 16-  bit = bitDefault-  testBit = testBitDefault-  popCount (I16 x) = primIntPopcount (x .&. 0xffff)-  zeroBits = 0-  isSigned _ = True--instance FiniteBits Int16 where-  finiteBitSize _ = 16-  countLeadingZeros (I16 x) = primIntClz (x .&. 0xffff) - (_wordSize - 16)-  countTrailingZeros (I16 x) = if x == 0 then 16 else primIntCtz x---------------------------------------------------------------------------------------    Int32---- Do sign extension by shifting.-i32 :: Int -> Int32-i32 w = if n == 0 then I32 w else I32 ((w `primIntShl` n) `primIntShr` n)-  where n = _wordSize `primIntSub` 32--bin32 :: (Int -> Int -> Int) -> (Int32 -> Int32 -> Int32)-bin32 op (I32 x) (I32 y) = i32 (x `op` y)--bini32 :: (Int -> Int -> Int) -> (Int32 -> Int -> Int32)-bini32 op (I32 x) y = i32 (x `op` y)--cmp32 :: (Int -> Int -> a) -> (Int32 -> Int32 -> a)-cmp32 op (I32 x) (I32 y) = x `op` y--una32 :: (Int -> Int) -> (Int32 -> Int32)-una32 op (I32 x) = i32 (op x)--instance Num Int32 where-  (+)  = bin32 primIntAdd-  (-)  = bin32 primIntSub-  (*)  = bin32 primIntMul-  abs x = x-  signum x = if x < 0 then -1 else if x > 0 then 1 else 0-  fromInteger i = i32 (_integerToInt i)--instance Integral Int32 where-  quot = bin32 primIntQuot-  rem  = bin32 primIntRem-  toInteger = _intToInteger . unI32--instance Bounded Int32 where-  minBound = i32 0x80000000-  maxBound = i32 0x7fffffff--instance Real Int32 where-  toRational = _integerToRational . _intToInteger . unI32--instance Show Int32 where-  showsPrec = showIntegral--{- in Text.Read.Internal-instance Read Int32 where-  readsPrec = readIntegral--}--instance Enum Int32 where-  succ x = if x == maxBound then error "Int32.succ: overflow" else x + 1-  pred x = if x == minBound then error "Int32.pred: underflow" else x - 1-  toEnum = i32-  fromEnum = unI32-  enumFrom n = enumFromTo n maxBound-  enumFromThen n m-    | m >= n = enumFromThenTo n m maxBound-    | otherwise = enumFromThenTo n m minBound-  enumFromTo = coerce (enumFromTo @Int)-  enumFromThenTo = coerce (enumFromThenTo @Int)--instance Eq Int32 where-  (==) = cmp32 primIntEQ-  (/=) = cmp32 primIntNE--instance Ord Int32 where-  compare = cmp32 primIntCompare-  (<)  = cmp32 primIntLT-  (<=) = cmp32 primIntLE-  (>)  = cmp32 primIntGT-  (>=) = cmp32 primIntGE--instance Bits Int32 where-  (.&.) = bin32 primIntAnd-  (.|.) = bin32 primIntOr-  xor   = bin32 primIntXor-  complement = una32 primIntInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= 32 = 0-    | True = x `unsafeShiftL` i-  unsafeShiftL = bini32 primIntShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= 32 = 0-    | True = x `unsafeShiftR` i-  unsafeShiftR = bini32 primIntShr-  bitSizeMaybe _ = Just 32-  bitSize _ = 32-  bit = bitDefault-  testBit = testBitDefault-  popCount (I32 x) = primIntPopcount (x .&. 0xffffffff)-  zeroBits = 0-  isSigned _ = True--instance FiniteBits Int32 where-  finiteBitSize _ = 32-  countLeadingZeros (I32 x) = primIntClz (x .&. 0xffffffff) - (_wordSize - 32)-  countTrailingZeros (I32 x) = if x == 0 then 32 else primIntCtz x---------------------------------------------------------------------------------------    Int64---- Do sign extension by shifting.-i64 :: Int -> Int64-i64 w = if _wordSize == 64 then I64 w else error "No Int64"--bin64 :: (Int -> Int -> Int) -> (Int64 -> Int64 -> Int64)-bin64 op (I64 x) (I64 y) = i64 (x `op` y)--bini64 :: (Int -> Int -> Int) -> (Int64 -> Int -> Int64)-bini64 op (I64 x) y = i64 (x `op` y)--cmp64 :: (Int -> Int -> a) -> (Int64 -> Int64 -> a)-cmp64 op (I64 x) (I64 y) = x `op` y--una64 :: (Int -> Int) -> (Int64 -> Int64)-una64 op (I64 x) = i64 (op x)--instance Num Int64 where-  (+)  = bin64 primIntAdd-  (-)  = bin64 primIntSub-  (*)  = bin64 primIntMul-  abs x = x-  signum x = if x < 0 then -1 else if x > 0 then 1 else 0-  fromInteger i = i64 (_integerToInt i)--instance Integral Int64 where-  quot = bin64 primIntQuot-  rem  = bin64 primIntRem-  toInteger = _intToInteger . unI64--instance Bounded Int64 where-  minBound = i64 0x8000000000000000-  maxBound = i64 0x7fffffffffffffff--instance Real Int64 where-  toRational = _integerToRational . _intToInteger . unI64--instance Show Int64 where-  showsPrec = showIntegral--{- in Text.Read.Internal-instance Read Int64 where-  readsPrec = readIntegral--}--instance Enum Int64 where-  succ x = if x == maxBound then error "Int64.succ: overflow" else x + 1-  pred x = if x == minBound then error "Int64.pred: underflow" else x - 1-  toEnum = i64-  fromEnum = unI64-  enumFrom n = enumFromTo n maxBound-  enumFromThen n m-    | m >= n = enumFromThenTo n m maxBound-    | otherwise = enumFromThenTo n m minBound-  enumFromTo = coerce (enumFromTo @Int)-  enumFromThenTo = coerce (enumFromThenTo @Int)--instance Eq Int64 where-  (==) = cmp64 primIntEQ-  (/=) = cmp64 primIntNE--instance Ord Int64 where-  compare = cmp64 primIntCompare-  (<)  = cmp64 primIntLT-  (<=) = cmp64 primIntLE-  (>)  = cmp64 primIntGT-  (>=) = cmp64 primIntGE--instance Bits Int64 where-  (.&.) = bin64 primIntAnd-  (.|.) = bin64 primIntOr-  xor   = bin64 primIntXor-  complement = una64 primIntInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= 64 = 0-    | True = x `unsafeShiftL` i-  unsafeShiftL = bini64 primIntShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= 64 = 0-    | True = x `unsafeShiftR` i-  unsafeShiftR = bini64 primIntShr-  bitSizeMaybe _ = Just 64-  bitSize _ = 64-  bit = bitDefault-  testBit = testBitDefault-  popCount (I64 x) = primIntPopcount x-  zeroBits = 0-  isSigned _ = True--instance FiniteBits Int64 where-  finiteBitSize _ = 64-  countLeadingZeros = primIntClz . unI64-  countTrailingZeros = primIntCtz . unI64
+ lib/Data/Int/Int.hs view
@@ -0,0 +1,77 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Int.Int(Int) where+import qualified Prelude()              -- do not import Prelude+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 - x else x+  signum x =+    case compare x (0::Int) of+      LT -> -(1::Int)+      EQ ->  (0::Int)+      GT ->  (1::Int)+  fromInteger = _integerToInt++instance Integral Int where+  quot = primIntQuot+  rem  = primIntRem+  toInteger = _intToInteger++instance Bounded Int where+  minBound = primWordToInt ((primWordInv (0::Word) `primWordQuot` (2::Word)) `primWordAdd` (1::Word))+  maxBound = primWordToInt  (primWordInv (0::Word) `primWordQuot` (2::Word))++instance Real Int where+  toRational i = _integerToRational (_intToInteger i)++instance Eq Int where+  (==) = primIntEQ+  (/=) = primIntNE++instance Ord Int where+  compare = primIntCompare+  (<)  = primIntLT+  (<=) = primIntLE+  (>)  = primIntGT+  (>=) = primIntGE++instance Show Int where+  showsPrec p n r =+    if n < (0::Int) then+      if p > (6::Int) then+        '(' : '-' : showUnsignedNegInt n (')' : r)+      else+        '-' : showUnsignedNegInt n r+    else+      showUnsignedNegInt (- n) r++-- Some trickery to show minBound correctly.+-- To print the number n, pass -n.+showUnsignedNegInt :: Int -> ShowS+showUnsignedNegInt n r =+  let c = primChr (primOrd '0' - rem n (10::Int))+  in  if n > -(10::Int) then+        c : r+      else+        showUnsignedNegInt (quot n (10::Int)) (c : r)++--------------------------------++-- In Text.Read: instance Read Int
+ lib/Data/Int/Int16.hs view
@@ -0,0 +1,111 @@+module Data.Int.Int16(Int16) where+import qualified Prelude()+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Bounded+import Data.Coerce+import Data.Enum+import Data.Eq+import Data.Function+import Data.Int.Int+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import {-# SOURCE #-} Data.Typeable+import Numeric.Show+import Text.Show++newtype Int16 = I16 Int+  deriving (Typeable, Eq, Ord)++unI16 :: Int16 -> Int+unI16 (I16 x) = x++-- Do sign extension by shifting.+i16 :: Int -> Int16+i16 w = I16 ((w `primIntShl` n) `primIntShr` n)+  where n = _wordSize `primIntSub` 16++bin16 :: (Int -> Int -> Int) -> (Int16 -> Int16 -> Int16)+bin16 op (I16 x) (I16 y) = i16 (x `op` y)++bini16 :: (Int -> Int -> Int) -> (Int16 -> Int -> Int16)+bini16 op (I16 x) y = i16 (x `op` y)++una16 :: (Int -> Int) -> (Int16 -> Int16)+una16 op (I16 x) = i16 (op x)++instance Num Int16 where+  (+)  = bin16 primIntAdd+  (-)  = bin16 primIntSub+  (*)  = bin16 primIntMul+  abs x = x+  signum x = if x < 0 then -1 else if x > 0 then 1 else 0+  fromInteger i = i16 (_integerToInt i)++instance Integral Int16 where+  quot = bin16 primIntQuot+  rem  = bin16 primIntRem+  toInteger = _intToInteger . unI16++instance Bounded Int16 where+  minBound = i16 0x8000+  maxBound = i16 0x7fff++instance Real Int16 where+  toRational = _integerToRational . _intToInteger . unI16++instance Show Int16 where+  showsPrec = showIntegral++{- in Text.Read.Internal+instance Read Int16 where+  readsPrec = readIntegral+-}++instance Enum Int16 where+  succ x = if x == maxBound then error "Int16.succ: overflow" else x + 1+  pred x = if x == minBound then error "Int16.pred: underflow" else x - 1+  toEnum = i16+  fromEnum = unI16+  enumFrom n = enumFromTo n maxBound+  enumFromThen n m+    | m >= n = enumFromThenTo n m maxBound+    | otherwise = enumFromThenTo n m minBound+  enumFromTo = coerce (enumFromTo @Int)+  enumFromThenTo = coerce (enumFromThenTo @Int)++instance Bits Int16 where+  (.&.) = bin16 primIntAnd+  (.|.) = bin16 primIntOr+  xor   = bin16 primIntXor+  complement = una16 primIntInv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= 16 = 0+    | True = x `unsafeShiftL` i+  unsafeShiftL = bini16 primIntShl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= 16 = 0+    | True = x `unsafeShiftR` i+  unsafeShiftR = bini16 primIntShr+  bitSizeMaybe _ = Just 16+  bitSize _ = 16+  bit = bitDefault+  testBit = testBitDefault+  popCount (I16 x) = primIntPopcount (x .&. 0xffff)+  zeroBits = 0+  isSigned _ = True++instance FiniteBits Int16 where+  finiteBitSize _ = 16+  countLeadingZeros (I16 x) = primIntClz (x .&. 0xffff) - (_wordSize - 16)+  countTrailingZeros (I16 x) = if x == 0 then 16 else primIntCtz x
+ lib/Data/Int/Int32.hs view
@@ -0,0 +1,111 @@+module Data.Int.Int32(Int32) where+import qualified Prelude()+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Bounded+import Data.Coerce+import Data.Enum+import Data.Eq+import Data.Function+import Data.Int.Int+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import {-# SOURCE #-} Data.Typeable+import Numeric.Show+import Text.Show++newtype Int32 = I32 Int+  deriving (Typeable, Eq, Ord)++unI32 :: Int32 -> Int+unI32 (I32 x) = x++-- Do sign extension by shifting.+i32 :: Int -> Int32+i32 w = if n == 0 then I32 w else I32 ((w `primIntShl` n) `primIntShr` n)+  where n = _wordSize `primIntSub` 32++bin32 :: (Int -> Int -> Int) -> (Int32 -> Int32 -> Int32)+bin32 op (I32 x) (I32 y) = i32 (x `op` y)++bini32 :: (Int -> Int -> Int) -> (Int32 -> Int -> Int32)+bini32 op (I32 x) y = i32 (x `op` y)++una32 :: (Int -> Int) -> (Int32 -> Int32)+una32 op (I32 x) = i32 (op x)++instance Num Int32 where+  (+)  = bin32 primIntAdd+  (-)  = bin32 primIntSub+  (*)  = bin32 primIntMul+  abs x = x+  signum x = if x < 0 then -1 else if x > 0 then 1 else 0+  fromInteger i = i32 (_integerToInt i)++instance Integral Int32 where+  quot = bin32 primIntQuot+  rem  = bin32 primIntRem+  toInteger = _intToInteger . unI32++instance Bounded Int32 where+  minBound = i32 0x80000000+  maxBound = i32 0x7fffffff++instance Real Int32 where+  toRational = _integerToRational . _intToInteger . unI32++instance Show Int32 where+  showsPrec = showIntegral++{- in Text.Read.Internal+instance Read Int32 where+  readsPrec = readIntegral+-}++instance Enum Int32 where+  succ x = if x == maxBound then error "Int32.succ: overflow" else x + 1+  pred x = if x == minBound then error "Int32.pred: underflow" else x - 1+  toEnum = i32+  fromEnum = unI32+  enumFrom n = enumFromTo n maxBound+  enumFromThen n m+    | m >= n = enumFromThenTo n m maxBound+    | otherwise = enumFromThenTo n m minBound+  enumFromTo = coerce (enumFromTo @Int)+  enumFromThenTo = coerce (enumFromThenTo @Int)++instance Bits Int32 where+  (.&.) = bin32 primIntAnd+  (.|.) = bin32 primIntOr+  xor   = bin32 primIntXor+  complement = una32 primIntInv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= 32 = 0+    | True = x `unsafeShiftL` i+  unsafeShiftL = bini32 primIntShl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= 32 = 0+    | True = x `unsafeShiftR` i+  unsafeShiftR = bini32 primIntShr+  bitSizeMaybe _ = Just 32+  bitSize _ = 32+  bit = bitDefault+  testBit = testBitDefault+  popCount (I32 x) = primIntPopcount (x .&. 0xffffffff)+  zeroBits = 0+  isSigned _ = True++instance FiniteBits Int32 where+  finiteBitSize _ = 32+  countLeadingZeros (I32 x) = primIntClz (x .&. 0xffffffff) - (_wordSize - 32)+  countTrailingZeros (I32 x) = if x == 0 then 32 else primIntCtz x
+ lib/Data/Int/Int64.hs view
@@ -0,0 +1,104 @@+module Data.Int.Int64(Int64) where+import qualified Prelude()+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Bounded+import Data.Coerce+import Data.Enum+import Data.Eq+import Data.Function+import Data.Int.Int+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import Numeric.Show+import Text.Show++instance Num Int64 where+  (+)  = primInt64Add+  (-)  = primInt64Sub+  (*)  = primInt64Mul+  negate x = primInt64Neg x+  abs x = if x < 0 then - x else x+  signum x =+    case compare x 0 of+      LT -> -1+      EQ ->  0+      GT ->  1+  fromInteger = _integerToInt64++instance Integral Int64 where+  quot = primInt64Quot+  rem  = primInt64Rem+  toInteger = _int64ToInteger++instance Bounded Int64 where+  minBound = primWord64ToInt64 ((primWord64Inv (0::Word64) `primWord64Quot` 2) `primWord64Add` 1)+  maxBound = primWord64ToInt64  (primWord64Inv (0::Word64) `primWord64Quot` 2)++instance Real Int64 where+  toRational i = _integerToRational (_int64ToInteger i)++instance Eq Int64 where+  (==) = primInt64EQ+  (/=) = primInt64NE++instance Ord Int64 where+  compare = primInt64Compare+  (<)  = primInt64LT+  (<=) = primInt64LE+  (>)  = primInt64GT+  (>=) = primInt64GE++instance Show Int64 where+  showsPrec = showIntegral++{- in Text.Read.Internal+instance Read Int32 where+  readsPrec = readIntegral+-}++instance Enum Int64 where+  succ x = if x == maxBound then error "Int64.succ: overflow" else x + 1+  pred x = if x == minBound then error "Int64.pred: underflow" else x - 1+  toEnum = primIntToInt64+  fromEnum = primInt64ToInt+  enumFrom = numericEnumFrom+  enumFromThen = numericEnumFromThen+  enumFromTo = numericEnumFromTo+  enumFromThenTo = numericEnumFromThenTo++instance Bits Int64 where+  (.&.) = primInt64And+  (.|.) = primInt64Or+  xor   = primInt64Xor+  complement = primInt64Inv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= 64 = 0+    | otherwise = x `unsafeShiftL` i+  unsafeShiftL = primInt64Shl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= 64 = 0+    | otherwise = x `unsafeShiftR` i+  unsafeShiftR = primInt64Shr+  bitSizeMaybe _ = Just 64+  bitSize _ = 64+  bit = bitDefault+  testBit = testBitDefault+  popCount = primInt64Popcount+  zeroBits = 0+  isSigned _ = False++instance FiniteBits Int64 where+  finiteBitSize _ = 64+  countLeadingZeros = primInt64Clz+  countTrailingZeros = primInt64Ctz
+ lib/Data/Int/Int8.hs view
@@ -0,0 +1,111 @@+module Data.Int.Int8(Int8) where+import qualified Prelude()+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Bounded+import Data.Coerce+import Data.Enum+import Data.Eq+import Data.Function+import Data.Int.Int+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import {-# SOURCE #-} Data.Typeable+import Numeric.Show+import Text.Show++newtype Int8 = I8 Int+  deriving (Typeable, Eq, Ord)++unI8 :: Int8 -> Int+unI8 (I8 x) = x++-- Do sign extension by shifting.+i8 :: Int -> Int8+i8 w = I8 ((w `primIntShl` n) `primIntShr` n)+  where n = _wordSize `primIntSub` 8++bin8 :: (Int -> Int -> Int) -> (Int8 -> Int8 -> Int8)+bin8 op (I8 x) (I8 y) = i8 (x `op` y)++bini8 :: (Int -> Int -> Int) -> (Int8 -> Int -> Int8)+bini8 op (I8 x) y = i8 (x `op` y)++una8 :: (Int -> Int) -> (Int8 -> Int8)+una8 op (I8 x) = i8 (op x)++instance Num Int8 where+  (+)  = bin8 primIntAdd+  (-)  = bin8 primIntSub+  (*)  = bin8 primIntMul+  abs x = x+  signum x = if x < 0 then -1 else if x > 0 then 1 else 0+  fromInteger i = i8 (_integerToInt i)++instance Integral Int8 where+  quot = bin8 primIntQuot+  rem  = bin8 primIntRem+  toInteger = _intToInteger . unI8++instance Bounded Int8 where+  minBound = i8 0x80+  maxBound = i8 0x7f++instance Real Int8 where+  toRational = _integerToRational . _intToInteger . unI8++instance Show Int8 where+  showsPrec = showIntegral++{- in Text.Read.Internal+instance Read Int8 where+  readsPrec = readIntegral+-}++instance Enum Int8 where+  succ x = if x == maxBound then error "Int8.succ: overflow" else x + 1+  pred x = if x == minBound then error "Int8.pred: underflow" else x - 1+  toEnum = i8+  fromEnum = unI8+  enumFrom n = enumFromTo n maxBound+  enumFromThen n m+    | m >= n = enumFromThenTo n m maxBound+    | otherwise = enumFromThenTo n m minBound+  enumFromTo = coerce (enumFromTo @Int)+  enumFromThenTo = coerce (enumFromThenTo @Int)++instance Bits Int8 where+  (.&.) = bin8 primIntAnd+  (.|.) = bin8 primIntOr+  xor   = bin8 primIntXor+  complement = una8 primIntInv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= 8 = 0+    | True = x `unsafeShiftL` i+  unsafeShiftL = bini8 primIntShl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= 8 = 0+    | True = x `unsafeShiftR` i+  unsafeShiftR = bini8 primIntShr+  bitSizeMaybe _ = Just 8+  bitSize _ = 8+  bit = bitDefault+  testBit = testBitDefault+  popCount (I8 x) = primIntPopcount (x .&. 0xff)+  zeroBits = 0+  isSigned _ = True++instance FiniteBits Int8 where+  finiteBitSize _ = 8+  countLeadingZeros (I8 x) = primIntClz (x .&. 0xff) - (_wordSize - 8)+  countTrailingZeros (I8 x) = if x == 0 then 8 else primIntCtz x
− lib/Data/Int/IntN.hs
@@ -1,24 +0,0 @@--- Copyright 2024 Lennart Augustsson--- See LICENSE file for full license.-module Data.Int.IntN(module Data.Int.IntN) where-import qualified Prelude()              -- do not import Prelude-import Primitives---- Just the types for sized Int.--- The types are exported in Data.Int, instances are in Data.Int.Instances--newtype Int8 = I8 Int-unI8 :: Int8 -> Int-unI8 (I8 x) = x--newtype Int16 = I16 Int-unI16 :: Int16 -> Int-unI16 (I16 x) = x--newtype Int32 = I32 Int-unI32 :: Int32 -> Int-unI32 (I32 x) = x--newtype Int64 = I64 Int-unI64 :: Int64 -> Int-unI64 (I64 x) = x
lib/Data/Integer.hs view
@@ -6,11 +6,11 @@   _intListToInteger,   ) where import qualified Prelude()              -- do not import Prelude-import Data.Bits+import Data.Bits.Base import Data.Bool import Data.Enum import Data.Eq-import Data.Int+import Data.Int.Int import Data.Integer.Internal import Data.Integral import Data.List
lib/Data/Integer/Internal.hs view
@@ -9,20 +9,23 @@   andI, orI, xorI,   shiftLI, shiftRI,   testBitI, popCountI,+  log2I,   _intToInteger,-  _integerToFloatW,+  _integerToFloat,+  _integerToDouble,   _integerToInt,   _wordToInteger,   ) where import qualified Prelude()              -- do not import Prelude---import Primitives+import Primitives import Control.Error-import Data.Bits+import Control.Exception.Internal+import Data.Bits.Base import Data.Bool import Data.Enum import Data.Eq import Data.Function-import Data.Int+import Data.Int.Int import Data.Integral import Data.List import Data.Maybe_Type@@ -138,7 +141,7 @@ --  - +  -> (-,-) --  - -  -> (+,-) quotRemI :: Integer -> Integer -> (Integer, Integer)-quotRemI _         (I _  [])  = error "Integer: division by 0" -- n / 0+quotRemI _         (I _  [])  = throw DivideByZero             -- n / 0 quotRemI (I _  [])          _ = (I Plus [], I Plus [])         -- 0 / n quotRemI (I sx xs) (I sy ys) | Just (y, n) <- msd ys =   -- All but the MSD are 0.  Scale numerator accordingly and divide.@@ -365,6 +368,15 @@   in  case sign of         Plus  ->  count         Minus -> -count++log2I :: Integer -> Int+log2I (I _ ds) = case go 0 ds of+  Nothing -> 0+  Just (d, n) -> n * shiftD + _wordSize - 1 - primWordClz d+  where+    go _ [] = Nothing+    go n [d] = Just (d, n)+    go n (d : ds) = go (n + 1) ds  --------------------------------- {-
lib/Data/Integer_Type.hs view
@@ -15,9 +15,9 @@ --  * no trailing 0s in the digits --  * 0 is positive -data Integer = I Sign [Digit]+data Integer = I Sign [Digit] deriving () -data Sign = Plus | Minus+data Sign = Plus | Minus deriving ()  type Digit = Word @@ -71,12 +71,57 @@         [d1]        -> d1         d1 : d2 : _ -> d1 `primWordAdd` (d2 `primWordShl` shiftD) -_integerToFloatW :: Integer -> FloatW-_integerToFloatW (I sign ds) = s `primFloatWMul` loop ds+_integerToWord64 :: Integer -> Word64+_integerToWord64 (I sign ds) =+  case sign of+    Plus  -> i+    Minus -> 0 `primWord64Sub` i   where-    loop [] = 0.0 :: FloatW-    loop (d : ds) = primFloatWFromInt (primWordToInt d) `primFloatWAdd` (primFloatWFromInt (primWordToInt maxD) `primFloatWMul` loop ds)-    s =+    xadd = primWord64Add+    xmul x = primWord64Shl x shiftD+    conv [] = []+    conv (x:xs) = primWordToWord64 x : conv xs+    i =+      case conv ds of+        []            -> 0 :: Word64+        [d1]          -> d1+        -- XXX should really depend of the width of a digit+        [d1, d2]      -> xmul                                  d2  `xadd` d1+        [d1, d2, d3]  -> xmul (xmul                 d3  `xadd` d2) `xadd` d1+        d1:d2:d3:d4:_ -> xmul (xmul (xmul d4 `xadd` d3) `xadd` d2) `xadd` d1++_word64ToInteger :: Word64 -> Integer+_word64ToInteger w = I Plus (conv w)+  where conv i | primWord64EQ i 0 = []+               | True = primWord64ToWord (primWord64Rem i base) : conv (primWord64Quot i base)+        base = primWordToWord64 maxD++_integerToInt64 :: Integer -> Int64+_integerToInt64 x = primWord64ToInt64 (_integerToWord64 x)++_int64ToInteger :: Int64 -> Integer+_int64ToInteger i+  | i `primInt64EQ` 0 = I Plus []+  | i `primInt64GE` 0 = _word64ToInteger (primInt64ToWord64 i)+  | True              = I Minus ds+    where I _ ds = _word64ToInteger (primInt64ToWord64 (0 `primInt64Sub` i))++_integerToFloat :: Integer -> Float+_integerToFloat (I sign ds) = sgn (loop ds)+  where+    loop [] = 0.0 :: Float+    loop (d : ds) = primFloatFromInt (primWordToInt d) `primFloatAdd` (primFloatFromInt (primWordToInt maxD) `primFloatMul` loop ds)+    sgn x =       case sign of-        Plus  -> 1.0 :: FloatW-        Minus -> 0.0 `primFloatWSub` 1.0+        Plus  -> x+        Minus -> primFloatNeg x++_integerToDouble :: Integer -> Double+_integerToDouble (I sign ds) = sgn (loop ds)+  where+    loop [] = 0.0 :: Double+    loop (d : ds) = primDoubleFromInt (primWordToInt d) `primDoubleAdd` (primDoubleFromInt (primWordToInt maxD) `primDoubleMul` loop ds)+    sgn x =+      case sign of+        Plus  -> x+        Minus -> primDoubleNeg x
lib/Data/Integral.hs view
@@ -11,6 +11,7 @@ import Data.Num import Data.Ord import Data.Real+import {-# SOURCE #-} Data.Typeable  infixl 7 `quot`,`rem` infixl 7 `div`,`mod`
lib/Data/Ix.hs view
@@ -4,6 +4,7 @@ import Data.Bool import Data.Char import Data.Enum+import Data.Eq import Data.Int import Data.Integer import Data.Integral@@ -12,6 +13,8 @@ import Data.Ord import Data.Tuple import Data.Word+import {-# SOURCE #-} Data.Typeable+import System.IO.Internal (IOMode(..))  class Ord a => Ix a where   range :: (a, a) -> [a]@@ -34,6 +37,26 @@   unsafeIndex (m,_n) i = i - m   inRange (m, n) i = m <= i && i <= n +instance Ix Int8 where+  range (m,n) = [m..n]+  unsafeIndex (m,_n) i = fromIntegral (i - m)+  inRange (m, n) i = m <= i && i <= n++instance Ix Int16 where+  range (m,n) = [m..n]+  unsafeIndex (m,_n) i = fromIntegral (i - m)+  inRange (m, n) i = m <= i && i <= n++instance Ix Int32 where+  range (m,n) = [m..n]+  unsafeIndex (m,_n) i = fromIntegral (i - m)+  inRange (m, n) i = m <= i && i <= n++instance Ix Int64 where+  range (m,n) = [m..n]+  unsafeIndex (m,_n) i = fromIntegral (i - m)+  inRange (m, n) i = m <= i && i <= n+ instance Ix Integer where   range (m,n) = [m..n]   unsafeIndex (m,_n) i = fromInteger (i - m)@@ -49,6 +72,21 @@   unsafeIndex (m,_n) i = fromIntegral (i - m)   inRange (m, n) i = m <= i && i <= n +instance Ix Word16 where+  range (m,n) = [m..n]+  unsafeIndex (m,_n) i = fromIntegral (i - m)+  inRange (m, n) i = m <= i && i <= n++instance Ix Word32 where+  range (m,n) = [m..n]+  unsafeIndex (m,_n) i = fromIntegral (i - m)+  inRange (m, n) i = m <= i && i <= n++instance Ix Word64 where+  range (m,n) = [m..n]+  unsafeIndex (m,_n) i = fromIntegral (i - m)+  inRange (m, n) i = m <= i && i <= n+ instance Ix Bool where   range (m,n) = [m..n]   unsafeIndex (m,_n) i = fromEnum i - fromEnum m@@ -59,6 +97,18 @@   unsafeIndex (m,_n) i = fromEnum i - fromEnum m   inRange (m, n) i = m <= i && i <= n +instance Ix Ordering where+  range (m,n) = [m..n]+  unsafeIndex (m,_n) i = fromEnum i - fromEnum m+  inRange (m, n) i = m <= i && i <= n++deriving instance Ix GeneralCategory++-- XXX+--deriving instance Ix SeekMode++deriving instance Ix IOMode+ instance Ix () where   range ((),()) = [()]   unsafeIndex ((),_n) () = 0@@ -80,7 +130,7 @@   inRange ((l1,l2),(u1,u2)) (i1,i2) =     inRange (l1,u1) i1 && inRange (l2,u2) i2 -instance (Ix a1, Ix a2, Ix a3) => Ix (a1,a2,a3)  where+instance (Ix a1, Ix a2, Ix a3) => Ix (a1, a2, a3)  where   range ((l1,l2,l3),(u1,u2,u3)) =     [(i1,i2,i3) | i1 <- range (l1,u1),                   i2 <- range (l2,u2),@@ -88,14 +138,14 @@    unsafeIndex ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =     unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (-    unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * -                             unsafeIndex (l1,u1) i1)+    unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) *+    unsafeIndex (l1,u1) i1)    inRange ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =     inRange (l1,u1) i1 && inRange (l2,u2) i2 &&     inRange (l3,u3) i3 -instance (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1,a2,a3,a4)  where+instance (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1, a2, a3, a4)  where   range ((l1,l2,l3,l4),(u1,u2,u3,u4)) =     [(i1,i2,i3,i4) | i1 <- range (l1,u1),                      i2 <- range (l2,u2),@@ -106,8 +156,28 @@     unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (     unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (     unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) *-                             unsafeIndex (l1,u1) i1))+    unsafeIndex (l1,u1) i1))    inRange ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =     inRange (l1,u1) i1 && inRange (l2,u2) i2 &&     inRange (l3,u3) i3 && inRange (l4,u4) i4++instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1, a2, a3, a4, a5) where+  range ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) =+    [(i1,i2,i3,i4,i5) | i1 <- range (l1,u1),+                        i2 <- range (l2,u2),+                        i3 <- range (l3,u3),+                        i4 <- range (l4,u4),+                        i5 <- range (l5,u5)]++  unsafeIndex ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =+    unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (+    unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (+    unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (+    unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) *+    unsafeIndex (l1,u1) i1)))++  inRange ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =+    inRange (l1,u1) i1 && inRange (l2,u2) i2 &&+    inRange (l3,u3) i3 && inRange (l4,u4) i4 &&+    inRange (l5,u5) i5
lib/Data/List.hs view
@@ -36,7 +36,7 @@ import Data.Eq import Data.Function import Data.Functor hiding(unzip)-import Data.Int+import Data.Int.Int import Data.Integral import Data.List_Type import Data.Maybe_Type
lib/Data/List/NonEmpty.hs view
@@ -109,7 +109,7 @@ import qualified Data.Foldable as Foldable import Data.Function import Data.Functor hiding(unzip)-import Data.Int+import Data.Int.Int import qualified Data.List as List import Data.List_Type import Data.List.NonEmpty_Type@@ -119,7 +119,6 @@ import Data.Ord import Data.Traversable import Data.Tuple-import GHC.Stack(HasCallStack) import Text.Show  {- In Data.List.NonEmpty_Type@@ -129,11 +128,8 @@   deriving (Eq, Ord) -} -instance (Eq a) => Eq (NonEmpty a) where-  (x :| xs) == (y :| ys)  =  x == y && xs == ys--instance (Ord a) => Ord (NonEmpty a) where-  compare (x :| xs) (y :| ys) = compare x y <> compare xs ys+deriving instance (Eq a) => Eq (NonEmpty a)+deriving instance (Ord a) => Ord (NonEmpty a)  instance Semigroup (NonEmpty a) where   (a :| as) <> ~(b :| bs) = a :| (as ++ b : bs)@@ -157,10 +153,11 @@ --instance Read a => Read (NonEmpty a) -- Defined in GHC.Read --instance Show a => Show (NonEmpty a) -- Defined in GHC.Show -instance Show a => Show (NonEmpty a) where-  showsPrec p = showsPrec p . toList+deriving instance Show a => Show (NonEmpty a)+ instance Foldable NonEmpty where   foldr f z = foldr f z . toList+ instance Traversable NonEmpty where   traverse f = fmap fromList . traverse f . toList @@ -282,7 +279,7 @@ -- | Converts a normal list to a 'NonEmpty' stream. -- -- Raises an error if given an empty list.-fromList :: HasCallStack => [a] -> NonEmpty a+fromList :: {-HasCallStack => -} [a] -> NonEmpty a fromList (a:as) = a :| as fromList [] = error "NonEmpty.fromList: empty list" @@ -585,7 +582,7 @@ -- @n@. Note that the head of the stream has index 0. -- -- /Beware/: a negative or out-of-bounds index will cause an error.-(!!) :: HasCallStack => NonEmpty a -> Int -> a+(!!) :: {-HasCallStack => -} NonEmpty a -> Int -> a (!!) ~(x :| xs) n   | n == 0 = x   | n > 0  = xs List.!! (n - 1)
lib/Data/List/NonEmpty_Type.hs view
@@ -1,5 +1,6 @@ module Data.List.NonEmpty_Type(module Data.List.NonEmpty_Type) where import qualified Prelude()+import {-# SOURCE #-} Data.Typeable  infixr 5 :| 
lib/Data/List_Type.hs view
@@ -4,6 +4,7 @@  infixr 5 : data [] a = [] | (:) a [a]  -- Parser hacks makes this acceptable+  deriving ()  -- avoid deriving Typeable  -- This does not really belong here, but it makes the module structure -- much simpler.
lib/Data/Maybe.hs view
@@ -12,7 +12,7 @@ import Data.Eq import Data.Function import Data.Functor-import Data.Int+import Data.Int.Int import Data.List import Data.Maybe_Type import Data.Monoid.Internal
lib/Data/Maybe_Type.hs view
@@ -4,3 +4,4 @@ import qualified Prelude()              -- do not import Prelude  data Maybe a = Nothing | Just a+  deriving ()  -- avoid deriving Typeable
lib/Data/Monoid.hs view
@@ -6,7 +6,6 @@   Product(..),   All(..),   Any(..),-  Arg(..),   Alt(..),   First(..),   Last(..),@@ -15,6 +14,7 @@ import Data.Maybe_Type import Data.Monoid.Internal import Data.Records+import {-# SOURCE #-} Data.Typeable  -- First and Last are different in Monoid and Semigroup, -- so put them here.
lib/Data/Monoid/Internal.hs view
@@ -9,7 +9,7 @@ import Data.Eq import Data.Function import Data.Functor-import Data.Int+import Data.Int.Int import Data.Integral import Data.List_Type import Data.List.NonEmpty_Type@@ -17,6 +17,7 @@ import Data.Maybe_Type import Data.Num import Data.Records+import {-# SOURCE #-} Data.Typeable import Text.Show  class Semigroup a => Monoid a where@@ -90,7 +91,7 @@ ---------------------  newtype Sum a = Sum { getSum :: a }-  deriving (Bounded, Eq, Ord, Show)+  deriving (Bounded, Eq, Ord, Show, Num)  instance forall a . Num a => Semigroup (Sum a) where   Sum a <> Sum b = Sum (a + b)@@ -101,7 +102,7 @@ ---------------------  newtype Product a = Product { getProduct :: a }-  deriving (Bounded, Eq, Ord, Show)+  deriving (Bounded, Eq, Ord, Show, Num)  instance forall a . Num a => Semigroup (Product a) where   Product a <> Product b = Product (a * b)@@ -167,10 +168,7 @@  ---------------------- -newtype Alt f a = Alt (f a)---  deriving (Show)-getAlt :: Alt f a -> f a-getAlt (Alt x) = x+newtype Alt f a = Alt {getAlt :: f a} {-   deriving ( Generic     -- ^ @since base-4.8.0.0            , Generic1    -- ^ @since base-4.8.0.0
lib/Data/Num.hs view
@@ -4,6 +4,7 @@ import qualified Prelude()              -- do not import Prelude import Primitives import Data.Integer_Type+import {-# SOURCE #-} Data.Typeable  infixl 6 +,- infixl 7 *
lib/Data/Ord.hs view
@@ -6,9 +6,11 @@ import Primitives import Data.Bool_Type import Data.Bounded+import Data.Eq import Data.Functor import Data.Ordering_Type-import Data.Eq+import Data.Records+import {-# SOURCE #-} Data.Typeable import Text.Show  infix 4 <,<=,>,>=@@ -34,20 +36,10 @@   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--instance Show Ordering where-  showsPrec _ LT = showString "LT"-  showsPrec _ EQ = showString "EQ"-  showsPrec _ GT = showString "GT"--instance Bounded Ordering where-  minBound = LT-  maxBound = GT+deriving instance Eq Ordering+deriving instance Ord Ordering+deriving instance Show Ordering+deriving instance Bounded Ordering  comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering comparing f x y = compare (f x) (f y)@@ -55,11 +47,10 @@ clamp :: (Ord a) => (a, a) -> a -> a clamp (low, high) a = min high (max a low) -{- newtype Down a = Down     { getDown :: a -- ^ @since 4.14.0.0     }-    deriving+{-    deriving       ( Eq        -- ^ @since 4.6.0.0       , Num       -- ^ @since 4.11.0.0       , Semigroup -- ^ @since 4.11.0.0@@ -76,18 +67,9 @@       ) -} -newtype Down a = Down a--getDown :: Down a -> a-getDown (Down a) = a--{--instance (Read a) => Read (Down a) where-  readsPrec d = readParen (d > 10) $ \ r ->-    [(Down x,t) | ("Down",s) <- lex r, (x,t) <- readsPrec 11 s]--} {-  In Data.Orphans-instance (Show a) => Show (Down a) where+instance (Read a) => Read (Down a)+instance (Show a) => Show (Down a) -}  instance Eq a => Eq (Down a) where
lib/Data/Ordering_Type.hs view
@@ -1,3 +1,4 @@ module Data.Ordering_Type(Ordering(..)) where import qualified Prelude()              -- do not import Prelude data Ordering = LT | EQ | GT+  deriving ()  -- avoid deriving Typeable
lib/Data/Orphans.hs view
@@ -2,6 +2,11 @@ -- due to import cycles. module Data.Orphans where import qualified Prelude(); import MiniPrelude+import Text.Read++instance (Read a) => Read (Down a) where+  readsPrec d = readParen (d > 10) $ \ r ->+    [(Down x,t) | ("Down",s) <- lex r, (x,t) <- readsPrec 11 s]  instance (Show a) => Show (Down a) where   showsPrec d (Down x) = showParen (d > 10) $
lib/Data/Proxy.hs view
@@ -4,6 +4,7 @@ import Data.Bool_Type import Data.Eq import Data.Functor+import {-# SOURCE #-} Data.Typeable import Text.Show  type Proxy :: forall (k::Kind) . k -> Type
lib/Data/Ratio.hs view
@@ -5,7 +5,7 @@   approxRational,   rationalInfinity,   rationalNaN,-  rationalMinusZero,+  rationalNegativeZero,   ) where import qualified Prelude()              -- do not import Prelude import Data.Bool@@ -94,8 +94,8 @@ rationalNaN :: Rational rationalNaN = 0 :% 0 -rationalMinusZero :: Rational-rationalMinusZero = 0 :% (-1)+rationalNegativeZero :: Rational+rationalNegativeZero = 0 :% (-1)  infixl 7 % (%) :: forall a . (Integral a, Ord a) => a -> a -> Ratio a
lib/Data/Ratio_Type.hs view
@@ -2,6 +2,7 @@ import qualified Prelude()              -- do not import Prelude import Primitives import Data.Integer_Type+import {-# SOURCE #-} Data.Typeable  data Ratio a = !a :% !a 
lib/Data/Real.hs view
@@ -4,6 +4,7 @@ import Data.Num import Data.Ord import Data.Ratio_Type+import {-# SOURCE #-} Data.Typeable  class (Num a, Ord a) => Real a where   toRational :: a -> Rational
lib/Data/RealFloat.hs view
@@ -7,10 +7,11 @@ import Data.Eq import Data.Floating import Data.Fractional-import Data.Int+import Data.Int.Int import Data.Integer import Data.Num import Data.Ord+import {-# SOURCE #-} Data.Typeable  class (Fractional a, Ord a, Floating a) => RealFloat a  where   floatRadix          :: a -> Integer
lib/Data/RealFrac.hs view
@@ -6,6 +6,7 @@ import Data.Integral import Data.Num import Data.Real+import {-# SOURCE #-} Data.Typeable  class  (Ord a, Real a, Fractional a) => RealFrac a  where   properFraction :: (Integral b) => a -> (b,a)
lib/Data/Records.hs view
@@ -9,6 +9,7 @@ import Primitives import Data.Function import Data.Proxy+import {-# SOURCE #-} Data.Typeable  type Get r a = r -> a type Set r a = r -> a -> r
lib/Data/Semigroup.hs view
@@ -12,31 +12,29 @@   Alt(..),   First(..),   Last(..),+  WrappedMonoid(..),   stimesIdempotent, stimesIdempotentMonoid, stimesMonoid,   diff, cycle1,   ) where import qualified Prelude()              -- do not import Prelude-import Data.Bool+import MiniPrelude+import Control.Monad.Fix import Data.Bounded-import Data.Coerce-import Data.Eq-import Data.Function+import Data.Foldable+import Data.Traversable import Data.List.NonEmpty_Type-import Data.Ord-import Data.Monoid.Internal-import Data.Records-import Text.Show+import Text.Read+import Mhs.Builtin -{- newtype First a = First { getFirst :: a }   deriving ( Bounded  -- ^ @since 4.9.0.0            , Eq       -- ^ @since 4.9.0.0            , Ord      -- ^ @since 4.9.0.0            , Show     -- ^ @since 4.9.0.0            , Read     -- ^ @since 4.9.0.0-           , Data     -- ^ @since 4.9.0.0-           , Generic  -- ^ @since 4.9.0.0-           , Generic1 -- ^ @since 4.9.0.0+--           , Data     -- ^ @since 4.9.0.0+--           , Generic  -- ^ @since 4.9.0.0+--           , Generic1 -- ^ @since 4.9.0.0            )  instance Enum a => Enum (First a) where@@ -48,17 +46,12 @@   enumFromThen (First a) (First b) = First `fmap` enumFromThen a b   enumFromTo (First a) (First b) = First `fmap` enumFromTo a b   enumFromThenTo (First a) (First b) (First c) = First `fmap` enumFromThenTo a b c--} -newtype First a = First { getFirst :: a }-  deriving(Eq, Ord, Show, Bounded)- instance Semigroup (First a) where   a <> _ = a   stimes = stimesIdempotent   sconcat (x :| _) = x -{- -- | @since 4.9.0.0 instance Functor First where   fmap f (First x) = First (f x)@@ -87,18 +80,16 @@ -- | @since 4.9.0.0 instance MonadFix First where   mfix f = fix (f . getFirst)--} -{- newtype Last a = Last { getLast :: a }   deriving ( Bounded  -- ^ @since 4.9.0.0            , Eq       -- ^ @since 4.9.0.0            , Ord      -- ^ @since 4.9.0.0            , Show     -- ^ @since 4.9.0.0            , Read     -- ^ @since 4.9.0.0-           , Data     -- ^ @since 4.9.0.0-           , Generic  -- ^ @since 4.9.0.0-           , Generic1 -- ^ @since 4.9.0.0+--           , Data     -- ^ @since 4.9.0.0+--           , Generic  -- ^ @since 4.9.0.0+--           , Generic1 -- ^ @since 4.9.0.0            )  -- | @since 4.9.0.0@@ -111,16 +102,11 @@   enumFromThen (Last a) (Last b) = Last `fmap` enumFromThen a b   enumFromTo (Last a) (Last b) = Last `fmap` enumFromTo a b   enumFromThenTo (Last a) (Last b) (Last c) = Last `fmap` enumFromThenTo a b c--} -newtype Last a = Last { getLast :: a }-  deriving(Eq, Ord, Show, Bounded)- instance Semigroup (Last a) where   _ <> b = b   stimes = stimesIdempotent -{- -- | @since 4.9.0.0 instance Functor Last where   fmap f (Last x) = Last (f x)@@ -150,10 +136,44 @@ -- | @since 4.9.0.0 instance MonadFix Last where   mfix f = fix (f . getLast)--} + diff :: Semigroup m => m -> Endo m diff = Endo . (<>)  cycle1 :: Semigroup m => m -> m cycle1 xs = xs' where xs' = xs <> xs'++newtype WrappedMonoid m = WrapMonoid { unwrapMonoid :: m }+  deriving ( Bounded  -- ^ @since 4.9.0.0+           , Eq       -- ^ @since 4.9.0.0+           , Ord      -- ^ @since 4.9.0.0+           , Show     -- ^ @since 4.9.0.0+           , Read     -- ^ @since 4.9.0.0+--           , Data     -- ^ @since 4.9.0.0+--           , Generic  -- ^ @since 4.9.0.0+--           , Generic1 -- ^ @since 4.9.0.0+           )++-- | @since 4.9.0.0+instance Monoid m => Semigroup (WrappedMonoid m) where+  (<>) = coerce (mappend :: m -> m -> m)++-- | @since 4.9.0.0+instance Monoid m => Monoid (WrappedMonoid m) where+  mempty = WrapMonoid mempty+  -- This ensures that we use whatever mconcat is defined for the wrapped+  -- Monoid.+  mconcat = coerce (mconcat :: [m] -> m)++-- | @since 4.9.0.0+instance Enum a => Enum (WrappedMonoid a) where+  succ (WrapMonoid a) = WrapMonoid (succ a)+  pred (WrapMonoid a) = WrapMonoid (pred a)+  toEnum = WrapMonoid . toEnum+  fromEnum = fromEnum . unwrapMonoid+  enumFrom (WrapMonoid a) = WrapMonoid `fmap` enumFrom a+  enumFromThen (WrapMonoid a) (WrapMonoid b) = WrapMonoid `fmap` enumFromThen a b+  enumFromTo (WrapMonoid a) (WrapMonoid b) = WrapMonoid `fmap` enumFromTo a b+  enumFromThenTo (WrapMonoid a) (WrapMonoid b) (WrapMonoid c) =+      WrapMonoid `fmap` enumFromThenTo a b c
lib/Data/String.hs view
@@ -10,6 +10,7 @@ import Data.Eq import Data.Function import Data.List+import {-# SOURCE #-} Data.Typeable  class IsString a where   fromString :: String -> a
lib/Data/Text.hs view
@@ -1,6 +1,7 @@ module Data.Text(   Text,   pack, unpack,+  show,   empty,   singleton,   append,@@ -17,13 +18,27 @@   words,   foldr,   concat,+  lines,+  unlines,+  take,+  drop,+  takeWhile,+  dropWhile,+  dropWhileEnd,+  intercalate,+  isPrefixOf,+  isSuffixOf,+  isInfixOf,+  map,   ) where-import qualified Prelude(); import MiniPrelude hiding(head, tail, null, length, words)+import qualified Prelude(); import MiniPrelude hiding(head, tail, null, length, words, map)+import Primitives(Ptr) import Control.DeepSeq.Class import qualified Data.List as L import Data.Monoid.Internal import Data.String import qualified Data.ByteString.Internal as BS+import Foreign.C.Types(CChar) import Unsafe.Coerce(unsafeCoerce)  newtype Text = T BS.ByteString@@ -38,6 +53,9 @@   (>)  = cmp (>)   (>=) = cmp (>=) +show :: Show a => a -> Text+show = pack . MiniPrelude.show+ cmp :: (BS.ByteString -> BS.ByteString -> Bool) -> (Text -> Text -> Bool) cmp op (T x) (T y) = op x y @@ -101,7 +119,7 @@ replicate = stimes  splitOn :: Text -> Text -> [Text]-splitOn s t = map pack $ splitOnList (unpack s) (unpack t)+splitOn s t = L.map pack $ splitOnList (unpack s) (unpack t)  dropWhileEnd :: (Char -> Bool) -> Text -> Text dropWhileEnd p = pack . L.dropWhileEnd p . unpack@@ -115,10 +133,46 @@                      | otherwise = loop (c:r) cs  words :: Text -> [Text]-words = map pack . L.words . unpack+words = L.map pack . L.words . unpack  foldr :: (Char -> a -> a) -> a -> Text -> a foldr f z = L.foldr f z . unpack  concat :: [Text] -> Text concat = L.foldr append empty++unlines :: [Text] -> Text+unlines = L.foldr (\ l -> append (append l (pack "\n"))) empty++lines :: Text -> [Text]+lines = L.map pack . L.lines . unpack++take :: Int -> Text -> Text+take n = pack . L.take n . unpack++drop :: Int -> Text -> Text+drop n = pack . L.drop n . unpack++intercalate :: Text -> [Text] -> Text+intercalate _ [] = empty+intercalate _ [x] = x+intercalate s (x:xs) = x `append` s `append` intercalate s xs++-- XXX Should make the BS version efficient and go via that+isPrefixOf :: Text -> Text -> Bool+isPrefixOf p s = L.isPrefixOf (unpack p) (unpack s)++isSuffixOf :: Text -> Text -> Bool+isSuffixOf p s = L.isSuffixOf (unpack p) (unpack s)++isInfixOf :: Text -> Text -> Bool+isInfixOf p s = L.isInfixOf (unpack p) (unpack s)++dropWhile :: (Char -> Bool) -> Text -> Text+dropWhile p = pack . L.dropWhile p . unpack++takeWhile :: (Char -> Bool) -> Text -> Text+takeWhile p = pack . L.takeWhile p . unpack++map :: (Char -> Char) -> Text -> Text+map f = pack . L.map f . unpack
lib/Data/Text/Encoding.hs view
@@ -17,19 +17,13 @@     encodeUtf32BE, ) where -import Data.Bits+import Data.Bits.Base import Data.ByteString (ByteString, isValidUtf8) import Data.ByteString qualified as BS import Data.Char import Data.Text-import Data.Word (Word8)+import Data.Word.Word8 (intToWord8, word8ToInt) import Unsafe.Coerce (unsafeCoerce)--intToWord8 :: Int -> Word8-intToWord8 i = unsafeCoerce (i .&. 0xFF) -- Safety: Int and Word8 have the same representation and `i .&. 0xFF` ensures that the value is in the Word8 range--word8ToInt :: Word8 -> Int-word8ToInt w = unsafeCoerce w -- Safety: Int and Word8 have the same representation and a Word8 is in the Int range  isValidASCII :: ByteString -> Bool isValidASCII = BS.all (< 0x80)
lib/Data/Text/IO.hs view
@@ -23,8 +23,8 @@ import qualified Data.ByteString as BS import Data.Text import Data.Text.Encoding-import System.IO (Handle, IOMode(..), hClose, openFile, stdin, stdout)-import qualified System.IO as IO+import System.IO.Base(Handle, IOMode(..), hClose, openFile, stdin, stdout)+import qualified System.IO.Base as IO  readFile :: FilePath -> IO Text readFile f = do@@ -57,7 +57,11 @@   evaluate (decodeUtf8 bs)  hPutStr :: Handle -> Text -> IO ()-hPutStr h t = BS.hPutStr h (encodeUtf8 t)+hPutStr h t =+  -- BS.hPutStr is "buggy", if the handle is UTF8 encoding mode, there will be a double encoding+  -- BS.hPutStr h (encodeUtf8 t)+  -- For now, go via String+  IO.hPutStr h (unpack t)  hPutStrLn :: Handle -> Text -> IO () hPutStrLn h t = hPutStr h t >> hPutStr h (pack "\n")
lib/Data/Text/Lazy.hs view
@@ -15,6 +15,8 @@   replicate,   splitOn,   dropWhileEnd,+  map,+  concat,   ) where import qualified Prelude(); import MiniPrelude hiding(head) import Control.DeepSeq.Class@@ -24,11 +26,7 @@ import qualified Data.Text as T  newtype Text = L T.Text-  deriving newtype (Eq, Ord, Show, IsString, {-Semigroup,-} Monoid, NFData)---- Bug in newtype deriving-instance Semigroup Text where-  (<>) = append+  deriving newtype (Eq, Ord, Show, IsString, Semigroup, Monoid, NFData)  toStrict :: Text -> T.Text toStrict (L t) = t@@ -73,10 +71,16 @@ uncons = coerce T.uncons  replicate :: Int -> Text -> Text-replicate n = undefined -- coerce (T.replicate n)+replicate n = coerce (T.replicate n)  splitOn :: Text -> Text -> [Text] splitOn = coerce T.splitOn  dropWhileEnd :: (Char -> Bool) -> Text -> Text dropWhileEnd = coerce T.dropWhileEnd++map :: (Char -> Char) -> Text -> Text+map f = coerce (T.map f)++concat :: [Text] -> Text+concat = coerce T.concat
lib/Data/Text/Lazy/IO.hs view
@@ -2,7 +2,7 @@ import Prelude hiding (readFile, writeFile) import qualified Prelude as P import Data.Text.Lazy-import qualified System.IO as IO+import qualified System.IO.Base as IO  readFile :: FilePath -> IO Text readFile fn = pack <$> P.readFile fn
lib/Data/Traversable.hs view
@@ -45,6 +45,7 @@ import Data.Maybe import Data.Monoid.Internal import Data.Proxy+import {-# SOURCE #-} Data.Typeable --import Data.Ord ( Down(..) ) --import Data.Proxy ( Proxy(..) ) 
lib/Data/Tuple.hs view
@@ -8,10 +8,11 @@ import Data.Bounded import Data.Eq import Data.Function-import Data.Int+import Data.Int.Int import Data.Monoid.Internal import Data.Records import Data.Ord+import {-# SOURCE #-} Data.Typeable import Text.Show  --data (a,b) = (a,b)  -- all tuples are built in@@ -96,6 +97,14 @@ instance (Show a, Show b, Show c, Show d, Show e) => Show (a, b, c, d, e) where   showsPrec _ (a, b, c, d, e) = showParen True (shows a . showString "," . shows b . showString "," . shows c .                                                 showString "," . shows d . showString "," . shows e)++instance (Show a, Show b, Show c, Show d, Show e, Show f) => Show (a, b, c, d, e, f) where+  showsPrec _ (a, b, c, d, e, f) = showParen True (shows a . showString "," . shows b . showString "," . shows c .+                                                showString "," . shows d . showString "," . shows e . showString "," . shows f)++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g) => Show (a, b, c, d, e, f, g) where+  showsPrec _ (a, b, c, d, e, f, g) = showParen True (shows a . showString "," . shows b . showString "," . shows c .+                                                showString "," . shows d . showString "," . shows e . showString "," . shows f . showString "," . shows g)  ----------------------------------- 
lib/Data/Tuple/Instances.hs view
@@ -1,7 +1,13 @@ module Data.Tuple.Instances where+import Data.Foldable+import Data.Traversable+import Data.Tuple  -- Dubious instances for tuples +instance Functor Solo where+  fmap f (MkSolo a) = MkSolo (f a)+ instance Functor ((,) a1) where   fmap f (a1, a) = (a1, f a) @@ -11,6 +17,15 @@ instance Functor ((,,,) a1 a2 a3) where   fmap f (a1, a2, a3, a) = (a1, a2, a3, f a) +instance Functor ((,,,,) a1 a2 a3 a4) where+  fmap f (a1, a2, a3, a4, a) = (a1, a2, a3, a4, f a)++instance Functor ((,,,,,) a1 a2 a3 a4 a5) where+  fmap f (a1, a2, a3, a4, a5, a) = (a1, a2, a3, a4, a5, f a)++instance Functor ((,,,,,,) a1 a2 a3 a4 a5 a6) where+  fmap f (a1, a2, a3, a4, a5, a6, a) = (a1, a2, a3, a4, a5, a6, f a)+ instance (Monoid a1) => Applicative ((,) a1) where   pure a = (mempty, a)   (a1, f) <*> (a1', a) = (a1 <> a1', f a)@@ -31,3 +46,22 @@  instance (Monoid a1, Monoid a2, Monoid a3) => Monad ((,,,) a1 a2 a3) where   (a1, a2, a3, a) >>= k = case k a of (a1', a2', a3', b) -> (a1 <> a1', a2 <> a2', a3 <> a3', b)++instance Foldable Solo where+  foldMap f (MkSolo a) = f a+  foldr f z (MkSolo a) = f a z+  length _ = 1+  null _ = False++instance Foldable ((,) a) where+  foldMap f (_, y) = f y+  foldr f z (_, y) = f y z+  length _  = 1+  null _ = False++instance Traversable Solo where+  traverse f (MkSolo a) = MkSolo <$> f a++instance Traversable ((,) a) where+  traverse f (x, y) = (,) x <$> f y+    
+ lib/Data/Type/Coercion.hs view
@@ -0,0 +1,55 @@+module Data.Type.Coercion+  ( Coercion(..)+  , coerceWith+  , gcoerceWith+  , sym+--  , trans+  , repr+  , TestCoercion(..)+  ) where+import Data.Coerce+import qualified Data.Type.Equality as Eq++data Coercion a b where+  Coercion :: Coercible a b => Coercion a b++coerceWith :: Coercion a b -> a -> b+coerceWith Coercion x = coerce x++gcoerceWith :: Coercion a b -> (Coercible a b => r) -> r+gcoerceWith Coercion x = x++sym :: Coercion a b -> Coercion b a+sym Coercion = Coercion++--XXX BUG: mhs does not take the transitive closure.+--trans :: Coercion a b -> Coercion b c -> Coercion a c+--trans Coercion Coercion = Coercion++repr :: (a Eq.:~: b) -> Coercion a b+repr Eq.Refl = Coercion++deriving instance Eq   (Coercion a b)+deriving instance Show (Coercion a b)+deriving instance Ord  (Coercion a b)+deriving instance Coercible a b => Read (Coercion a b)+instance Coercible a b => Enum (Coercion a b) where+  toEnum 0 = Coercion+  toEnum _ = error "Data.Type.Coercion.toEnum: bad argument"++  fromEnum Coercion = 0++deriving instance Coercible a b => Bounded (Coercion a b)++class TestCoercion f where+  testCoercion :: f a -> f b -> Maybe (Coercion a b)++instance TestCoercion ((Eq.:~:) a) where+  testCoercion Eq.Refl Eq.Refl = Just Coercion++instance TestCoercion ((Eq.:~~:) a) where+  testCoercion Eq.HRefl Eq.HRefl = Just Coercion++--XXX BUG+--instance TestCoercion (Coercion a) where+--  testCoercion Coercion Coercion = Just Coercion
lib/Data/Type/Equality.hs view
@@ -1,23 +1,89 @@-module Data.Type.Equality(module Data.Type.Equality) where+module Data.Type.Equality (+  --type (~~),+  (:~:)(..),+  (:~~:)(..),+  sym, trans, castWith, gcastWith, apply, inner, outer,+  TestEquality(..),+  ) where import qualified Prelude(); import MiniPrelude--type (:~:) :: forall k . k -> k -> Type-data a :~: b = (a ~ b) => Refl+import Data.Bounded+import {-# SOURCE #-} Data.Typeable+import Text.Read(Read)+import Mhs.Builtin -instance forall a b . Eq (a :~: b) where-  Refl == Refl  =  True+infix 4 :~:, :~~: -instance forall a b . Show (a :~: b) where-  show Refl = "Refl"+type (:~:) :: forall k . k -> k -> Type+data a :~: b where+  Refl :: a :~: a -sym :: forall a b . (a :~: b) -> (b :~: a)+sym :: (a :~: b) -> (b :~: a) sym Refl = Refl -trans :: forall a b c . (a :~: b) -> (b :~: c) -> (a :~: c)+trans :: (a :~: b) -> (b :~: c) -> (a :~: c) trans Refl Refl = Refl -castWith :: forall a b . (a :~: b) -> a -> b+castWith :: (a :~: b) -> a -> b castWith Refl x = x -apply :: forall f g a b . (f :~: g) -> (a :~: b) -> (f a :~: g b)+gcastWith :: (a :~: b) -> ((a ~ b) => r) -> r+gcastWith Refl x = x++apply :: (f :~: g) -> (a :~: b) -> (f a :~: g b) apply Refl Refl = Refl++inner :: (f a :~: g b) -> (a :~: b)+inner Refl = Refl++outer :: (f a :~: g b) -> (f :~: g)+outer Refl = Refl++deriving instance Eq   (a :~: b)+deriving instance Show (a :~: b)+deriving instance Ord  (a :~: b)+deriving instance a ~ b => Read (a :~: b)++instance a ~ b => Enum (a :~: b) where+  toEnum 0 = Refl+  toEnum _ = error "Data.Type.Equality.toEnum: bad argument"++  fromEnum Refl = 0++deriving instance a ~ b => Bounded (a :~: b)++type (:~~:) :: forall k1 k2 . k1 -> k2 -> Type+data a :~~: b where+   HRefl :: a :~~: a++deriving instance Eq   (a :~~: b)+deriving instance Show (a :~~: b)+deriving instance Ord  (a :~~: b)+{- XXX no ~~+deriving instance a ~~ b => Read (a :~~: b)+instance a ~~ b => Enum (a :~~: b) where+  toEnum 0 = HRefl+  toEnum _ = error "Data.Type.Equality.toEnum: bad argument"++  fromEnum HRefl = 0++deriving instance a ~~ b => Bounded (a :~~: b)+-}++class TestEquality f where+  testEquality :: f a -> f b -> Maybe (a :~: b)++instance TestEquality ((:~:) a) where+  testEquality Refl Refl = Just Refl++instance TestEquality ((:~~:) a) where+  testEquality HRefl HRefl = Just Refl++{-+infix 4 ==++type (==) :: k -> k -> Bool+type family a == b where+  f a == g b = f == g && a == b+  a == a = 'True+  _ == _ = 'False+-}
lib/Data/TypeLits.hs view
@@ -8,6 +8,7 @@ import Primitives import Data.Char_Type import Data.Integer+import {-# SOURCE #-} Data.Typeable  class KnownNat (n :: Nat) where   natVal :: forall (proxy :: Nat -> Type) . proxy n -> Integer
lib/Data/Typeable.hs view
@@ -4,11 +4,12 @@   typeOf,   cast,   eqT,-  gcast,+  gcast, gcast1, gcast2,   TyCon,   tyConModule,   tyConName,   mkTyCon,+  _mkTyCon,   mkTyConApp,   mkAppTy,   mkFunTy,@@ -19,13 +20,12 @@   ) where import qualified Prelude(); import MiniPrelude import Primitives-import Data.Double import Data.Integer+import Data.List.NonEmpty(NonEmpty) import Data.Proxy import Data.Ratio import Data.Type.Equality import Data.Void-import Data.Word import System.IO.MD5 import Unsafe.Coerce @@ -73,6 +73,9 @@ mkTyConApp tc@(TyCon cmd5 _ _) trs = TypeRep md5 tc trs   where md5 = md5Combine $ cmd5 : map trMd5 trs +_mkTyCon :: String -> String -> a -> TypeRep+_mkTyCon m n _ = mkTyConApp (mkTyCon m n) []+ -----------------  data TyCon = TyCon MD5CheckSum String String@@ -123,57 +126,65 @@       then Just $ unsafeCoerce (Refl :: () :~: ())       else Nothing -gcast :: forall a b c .-         (Typeable a, Typeable b) => c a -> Maybe (c b)+gcast :: forall c t t' .+         (Typeable t, Typeable t') => c t -> Maybe (c t') gcast x =-  case eqT :: Maybe (a :~: b) of+  case eqT :: Maybe (t :~: t') of     Just Refl -> Just x     Nothing -> Nothing ---------------------- I really need to implement deriving...--nullary :: forall a . String -> String -> a -> TypeRep-nullary m n _ = mkTyConApp (mkTyCon m n) []+gcast1 :: forall c t t' a .+          (Typeable t, Typeable t') => c (t a) -> Maybe (c (t' a))+gcast1 x =+  case eqT :: Maybe (t :~: t') of+    Just Refl -> Just x+    Nothing -> Nothing -prim :: forall a . String -> a -> TypeRep-prim n = nullary "Primitives" n+gcast2 :: forall c t t' a b .+          (Typeable t, Typeable t') => c (t a b) -> Maybe (c (t' a b))+gcast2 x =+  case eqT :: Maybe (t :~: t') of+    Just Refl -> Just x+    Nothing -> Nothing -instance Typeable ()          where typeRep = nullary "Data.Tuple"          "()"-instance Typeable AnyType     where typeRep = prim                          "AnyType"-instance Typeable Bool        where typeRep = nullary "Data.Bool_Type"      "Bool"-instance Typeable Char        where typeRep = prim                          "Char"-instance Typeable Int         where typeRep = prim                          "Int"-instance Typeable Integer     where typeRep = nullary "Data.Integer_Type"   "Integer"-instance Typeable Double      where typeRep = prim                          "Double"-instance Typeable Void        where typeRep = nullary "Data.Void"           "Void"-instance Typeable Word        where typeRep = prim                          "Word"-instance Typeable Word8       where typeRep = nullary "Data.Word8"          "Word8"+----------------- -instance Typeable TypeRep     where typeRep = nullary "Data.Typeable"       "TypeRep"-instance Typeable TyCon       where typeRep = nullary "Data.Typeable"       "TyCon"+-- Primitive types+deriving instance Typeable AnyType+deriving instance Typeable Char+deriving instance Typeable Double+deriving instance Typeable Float+deriving instance Typeable ForeignPtr+deriving instance Typeable Int+deriving instance Typeable Int64+deriving instance Typeable IO+deriving instance Typeable IOArray+deriving instance Typeable MVar+deriving instance Typeable Ptr+deriving instance Typeable FunPtr+deriving instance Typeable ThreadId+deriving instance Typeable Weak+deriving instance Typeable Word+deriving instance Typeable Word64 -instance Typeable IO          where typeRep = prim                          "IO"-instance Typeable Ptr         where typeRep = prim                          "Ptr"-instance Typeable FunPtr      where typeRep = prim                          "FunPtr"-instance Typeable ForeignPtr  where typeRep = prim                          "ForeignPtr"-instance Typeable IOArray     where typeRep = prim                          "IOArray"+-- Types too basic to have working deriving+deriving instance Typeable Bool+deriving instance Typeable Integer+deriving instance Typeable []+deriving instance Typeable Maybe+deriving instance Typeable Ordering -instance Typeable []          where typeRep = nullary "Data.List_Type"      "[]"-instance Typeable Maybe       where typeRep = nullary "Data.Maybe_Type"     "Maybe"-instance Typeable Proxy       where typeRep = nullary "Data.Proxy"          "Proxy"-instance Typeable Ratio       where typeRep = nullary "Data.Ratio"          "Ratio"-instance Typeable Functor     where typeRep = nullary "Data.Functor"        "Functor"-instance Typeable Applicative where typeRep = nullary "Control.Applicative" "Applicative"-instance Typeable Monad       where typeRep = nullary "Control.Monad"       "Monad"+prim :: forall a . String -> a -> TypeRep+prim n = _mkTyCon "Primitives" n -instance Typeable (,)         where typeRep = nullary "Data.Tuple"          ","+-- Builtin types instance Typeable (->)        where typeRep = prim                          "->"-instance Typeable Either      where typeRep = nullary "Data.Either"         "Either"--instance Typeable (,,)        where typeRep = nullary "Data.Tuple"          ",,"-instance Typeable (,,,)       where typeRep = nullary "Data.Tuple"          ",,,"+instance Typeable ()          where typeRep = _mkTyCon "Data.Tuple"          "()"+instance Typeable (,)         where typeRep = _mkTyCon "Data.Tuple"          ","+instance Typeable (,,)        where typeRep = _mkTyCon "Data.Tuple"          ",,"+instance Typeable (,,,)       where typeRep = _mkTyCon "Data.Tuple"          ",,,"+instance Typeable (,,,,)      where typeRep = _mkTyCon "Data.Tuple"          ",,,," +-- Type application instance (Typeable f, Typeable a) => Typeable (f a) where   typeRep _ = mkAppTy (typeRep (Proxy :: Proxy f)) (typeRep (Proxy :: Proxy a))
lib/Data/Typeable.hs-boot view
@@ -8,9 +8,11 @@   typeRep :: forall proxy . proxy a -> TypeRep  data TypeRep-mkTyConApp :: TyCon -> [TypeRep] -> TypeRep -data TyCon-mkTyCon :: String -> String -> TyCon+_mkTyCon :: forall a . String -> String -> a -> TypeRep  cast :: forall a b. (Typeable a, Typeable b) => a -> Maybe b++gcast1 :: forall c t t' a . (Typeable t, Typeable t') => c (t a) -> Maybe (c (t' a))++gcast2 :: forall c t t' a b . (Typeable t, Typeable t') => c (t a b) -> Maybe (c (t' a b))
+ lib/Data/Unique.hs view
@@ -0,0 +1,20 @@+module Data.Unique(+  Unique,+  newUnique,+  hashUnique,+  ) where+import Data.IORef+import System.IO.Unsafe++newtype Unique = Unique Integer deriving (Eq, Ord)++uniqSource :: IORef Integer+uniqSource = unsafePerformIO (newIORef 0)++newUnique :: IO Unique+newUnique = do+  r <- atomicModifyIORef' uniqSource $ \x -> let z = x+1 in (z,z)+  return (Unique r)++hashUnique :: Unique -> Int+hashUnique (Unique i) = fromInteger i
lib/Data/Version.hs view
@@ -1,25 +1,27 @@ module Data.Version(   Version(..),   showVersion,-  makeVersion+  makeVersion,+  parseVersion,   ) where import qualified Prelude(); import MiniPrelude import Control.DeepSeq.Class import Data.List(intercalate)+import Text.ParserCombinators.ReadP+import Text.Read -data Version = Version { versionBranch :: [Int] }+data Version = Version { versionBranch :: [Int], versionTags :: [String] }   deriving (Show, Eq, Ord)  instance NFData Version where-  rnf (Version x) = rnf x+  rnf (Version x y) = rnf x `seq` rnf y  showVersion :: Version -> String-showVersion (Version b) = intercalate "." (map show b)+showVersion (Version b _) = intercalate "." (map show b) -{- parseVersion :: ReadP Version parseVersion = do branch <- sepBy1 (fmap read (munch1 isDigit)) (char '.')-                  pure Version{versionBranch=branch}--}+                  pure Version{versionBranch=branch, versionTags=[]}+ makeVersion :: [Int] -> Version-makeVersion b = Version b+makeVersion b = Version b []
lib/Data/Void.hs view
@@ -1,7 +1,8 @@ module Data.Void(module Data.Void) where import qualified Prelude(); import MiniPrelude+import Text.Read -data Void+data Void deriving (Eq, Ord, Read, Show)  absurd :: forall a . Void -> a absurd v = seq v (error "absurd")
lib/Data/Word.hs view
@@ -1,554 +1,15 @@--- Copyright 2023,2024 Lennart Augustsson+-- Copyright 2023,2024,2025 Lennart Augustsson -- See LICENSE file for full license.-module Data.Word(Word, Word8, Word16, Word32, Word64) where+module Data.Word(+  Word,+  Word8, bitReverse8,+  Word16, bitReverse16, byteSwap16,+  Word32, bitReverse32, byteSwap32,+  Word64, bitReverse64, byteSwap64,+  ) where import qualified Prelude()              -- do not import Prelude-import Primitives-import Control.Error-import Data.Bits-import Data.Bool-import Data.Bounded-import Data.Char-import Data.Coerce-import Data.Enum-import Data.Eq-import Data.Function-import Data.Int()  -- instances only-import Data.Integer_Type-import Data.Integral-import Data.List-import Data.Maybe_Type-import Data.Num-import Data.Ord-import Data.Ratio_Type-import Data.Real-import Numeric.Show-import Text.Show--instance Num Word where-  (+)  = primWordAdd-  (-)  = primWordSub-  (*)  = primWordMul-  abs x = x-  signum x = if x == 0 then 0 else 1-  fromInteger = _integerToWord--instance Integral Word where-  quot = primWordQuot-  rem  = primWordRem-  toInteger = _wordToInteger--instance Bounded Word where-  minBound = 0::Word-  maxBound = primWordInv (0::Word)--instance Real Word where-  toRational i = _integerToRational (_wordToInteger i)--instance Show Word where-  showsPrec _ = showUnsigned---- Avoid showIntegral to avoid Integer-showUnsigned :: Word -> ShowS-showUnsigned n r =-  let c = primChr (primOrd '0' + primWordToInt (rem n (10::Word)))-  in  if n < (10::Word) then-        c : r-      else-        showUnsigned (quot n (10::Word)) (c : r)--{- in Text.Read.Internal-instance Read Word where-  readsPrec = readIntegral--}------------------------------------eftWord :: Word -> Word -> [Word]-eftWord x y-  | x `primWordGT` y = []-  | otherwise = go x-  where-    go n = n : if n `primWordEQ` y then [] else go (n `primWordAdd` 1)--efttWordUp :: Word -> Word -> Word -> [Word]--- x2 >= x1-efttWordUp x1 x2 y-  | y `primWordLT` x2 = if y `primWordLT` x1 then [] else [x1]-  | otherwise =-    let-      delta = x2 `primWordSub` x1-      y' = y `primWordSub` delta-      go x = if x `primWordGT` y' then [x] else x : go (x `primWordAdd` delta)-    in x1 : go x2--efttWordDown :: Word -> Word -> Word -> [Word]--- x2 <= x1-efttWordDown x1 x2 y-  | y `primWordGT` x2 = if y `primWordGT` x1 then [] else [x1]-  | otherwise =-    let-      delta = x2 `primWordSub` x1-      y' = y `primWordSub` delta-      go x = if x `primWordLT` y' then [x] else x : go (x `primWordAdd` delta)-    in x1 : go x2--instance Enum Word where-  succ x = if x `primWordEQ` maxBound then error "Word.succ: overflow" else x + 1-  pred x = if x `primWordEQ` minBound then error "Word.pred: underflow" else x - 1-  toEnum = primIntToWord-  fromEnum = primWordToInt-  enumFrom n = eftWord n maxBound-  enumFromThen x1 x2-    | x2 `primWordGE` x1 = efttWordUp x1 x2 maxBound-    | otherwise          = efttWordDown x1 x2 minBound-  enumFromTo = eftWord-  enumFromThenTo x1 x2 y-    | x2 `primWordGE` x1 = efttWordUp x1 x2 y-    | otherwise          = efttWordDown x1 x2 y------------------------------------instance Eq Word where-  (==) = primWordEQ-  (/=) = primWordNE--instance Ord Word where-  compare = primWordCompare-  (<)  = primWordLT-  (<=) = primWordLE-  (>)  = primWordGT-  (>=) = primWordGE------------------------------------instance Bits Word where-  (.&.) = primWordAnd-  (.|.) = primWordOr-  xor   = primWordXor-  complement = primWordInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= _wordSize = 0-    | otherwise = x `primWordShl` i-  unsafeShiftL = primWordShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= _wordSize = 0-    | otherwise = x `primWordShr` i-  unsafeShiftR = primWordShr-  bitSizeMaybe _ = Just _wordSize-  bitSize _ = _wordSize-  bit = bitDefault-  testBit = testBitDefault-  popCount = primWordPopcount-  zeroBits = 0-  isSigned _ = False--instance FiniteBits Word where-  finiteBitSize _ = _wordSize-  countLeadingZeros = primWordClz-  countTrailingZeros = primWordCtz---------------------------------------------------------------------------------------    Word8--newtype Word8 = W8 Word-unW8 :: Word8 -> Word-unW8 (W8 x) = x--w8 :: Word -> Word8-w8 w = W8 (w .&. 0xff)--bin8 :: (Word -> Word -> Word) -> (Word8 -> Word8 -> Word8)-bin8 op (W8 x) (W8 y) = w8 (x `op` y)--bini8 :: (Word -> Int -> Word) -> (Word8 -> Int -> Word8)-bini8 op (W8 x) y = w8 (x `op` y)--cmp8 :: (Word -> Word -> a) -> (Word8 -> Word8 -> a)-cmp8 op (W8 x) (W8 y) = x `op` y--una8 :: (Word -> Word) -> (Word8 -> Word8)-una8 op (W8 x) = w8 (op x)--instance Num Word8 where-  (+)  = bin8 primWordAdd-  (-)  = bin8 primWordSub-  (*)  = bin8 primWordMul-  abs x = x-  signum x = if x == 0 then 0 else 1-  fromInteger i = w8 (_integerToWord i)--instance Integral Word8 where-  quot = bin8 primWordQuot-  rem  = bin8 primWordRem-  toInteger = _wordToInteger . unW8--instance Bounded Word8 where-  minBound = w8 0-  maxBound = w8 0xff--instance Real Word8 where-  toRational = _integerToRational . _wordToInteger . unW8--instance Show Word8 where-  showsPrec = showIntegral--{- in Text.Read.Internal-instance Read Word8 where-  readsPrec = readIntegral--}--instance Enum Word8 where-  succ x = if x == maxBound then error "Word8.succ: overflow" else x + 1-  pred x = if x == minBound then error "Word8.pred: underflow" else x - 1-  toEnum = w8 . primIntToWord-  fromEnum = primWordToInt . unW8-  enumFrom n = enumFromTo n maxBound-  enumFromThen n m-    | m >= n = enumFromThenTo n m maxBound-    | otherwise = enumFromThenTo n m minBound-  enumFromTo = coerce (enumFromTo @Word)-  enumFromThenTo = coerce (enumFromThenTo @Word)--instance Eq Word8 where-  (==) = cmp8 primWordEQ-  (/=) = cmp8 primWordNE--instance Ord Word8 where-  compare = cmp8 primWordCompare-  (<)  = cmp8 primWordLT-  (<=) = cmp8 primWordLE-  (>)  = cmp8 primWordGT-  (>=) = cmp8 primWordGE--instance Bits Word8 where-  (.&.) = bin8 primWordAnd-  (.|.) = bin8 primWordOr-  xor   = bin8 primWordXor-  complement = una8 primWordInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= 8 = 0-    | otherwise = x `unsafeShiftL` i-  unsafeShiftL = bini8 primWordShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= 8 = 0-    | otherwise = x `unsafeShiftR` i-  unsafeShiftR = bini8 primWordShr-  bitSizeMaybe _ = Just 8-  bitSize _ = 8-  bit = bitDefault-  testBit = testBitDefault-  popCount = primWordPopcount . unW8-  zeroBits = 0-  isSigned _ = False--instance FiniteBits Word8 where-  finiteBitSize _ = 8-  countLeadingZeros (W8 x) = primWordClz x - (_wordSize - 8)-  countTrailingZeros (W8 x) = if x == 0 then 8 else primWordCtz x---------------------------------------------------------------------------------------    Word16--newtype Word16 = W16 Word-unW16 :: Word16 -> Word-unW16 (W16 x) = x--w16 :: Word -> Word16-w16 w = W16 (w .&. 0xffff)--bin16 :: (Word -> Word -> Word) -> (Word16 -> Word16 -> Word16)-bin16 op (W16 x) (W16 y) = w16 (x `op` y)--bini16 :: (Word -> Int -> Word) -> (Word16 -> Int -> Word16)-bini16 op (W16 x) y = w16 (x `op` y)--cmp16 :: (Word -> Word -> a) -> (Word16 -> Word16 -> a)-cmp16 op (W16 x) (W16 y) = x `op` y--una16 :: (Word -> Word) -> (Word16 -> Word16)-una16 op (W16 x) = w16 (op x)--instance Num Word16 where-  (+)  = bin16 primWordAdd-  (-)  = bin16 primWordSub-  (*)  = bin16 primWordMul-  abs x = x-  signum x = if x == 0 then 0 else 1-  fromInteger i = w16 (_integerToWord i)--instance Integral Word16 where-  quot = bin16 primWordQuot-  rem  = bin16 primWordRem-  toInteger = _wordToInteger . unW16--instance Bounded Word16 where-  minBound = w16 0-  maxBound = w16 0xffff--instance Real Word16 where-  toRational = _integerToRational . _wordToInteger . unW16--instance Show Word16 where-  showsPrec = showIntegral--{- in Text.Read.Internal-instance Read Word16 where-  readsPrec = readIntegral--}--instance Enum Word16 where-  succ x = if x == maxBound then error "Word16.succ: overflow" else x + 1-  pred x = if x == minBound then error "Word16.pred: underflow" else x - 1-  toEnum = w16 . primIntToWord-  fromEnum = primWordToInt . unW16-  enumFrom n = enumFromTo n maxBound-  enumFromThen n m-    | m >= n = enumFromThenTo n m maxBound-    | otherwise = enumFromThenTo n m minBound-  enumFromTo = coerce (enumFromTo @Word)-  enumFromThenTo = coerce (enumFromThenTo @Word)--instance Eq Word16 where-  (==) = cmp16 primWordEQ-  (/=) = cmp16 primWordNE--instance Ord Word16 where-  compare = cmp16 primWordCompare-  (<)  = cmp16 primWordLT-  (<=) = cmp16 primWordLE-  (>)  = cmp16 primWordGT-  (>=) = cmp16 primWordGE--instance Bits Word16 where-  (.&.) = bin16 primWordAnd-  (.|.) = bin16 primWordOr-  xor   = bin16 primWordXor-  complement = una16 primWordInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= 16 = 0-    | otherwise = x `unsafeShiftL` i-  unsafeShiftL = bini16 primWordShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= 16 = 0-    | otherwise = x `unsafeShiftR` i-  unsafeShiftR = bini16 primWordShr-  bitSizeMaybe _ = Just 16-  bitSize _ = 16-  bit = bitDefault-  testBit = testBitDefault-  popCount = primWordPopcount . unW16-  zeroBits = 0-  isSigned _ = False--instance FiniteBits Word16 where-  finiteBitSize _ = 16-  countLeadingZeros (W16 x) = primWordClz x - (_wordSize - 16)-  countTrailingZeros (W16 x) = if x == 0 then 16 else primWordCtz x---------------------------------------------------------------------------------------    Word32--newtype Word32 = W32 Word-unW32 :: Word32 -> Word-unW32 (W32 x) = x--w32 :: Word -> Word32-w32 w = if _wordSize == 32 then W32 w else W32 (w .&. 0xffffffff)--bin32 :: (Word -> Word -> Word) -> (Word32 -> Word32 -> Word32)-bin32 op (W32 x) (W32 y) = w32 (x `op` y)--bini32 :: (Word -> Int -> Word) -> (Word32 -> Int -> Word32)-bini32 op (W32 x) y = w32 (x `op` y)--cmp32 :: (Word -> Word -> a) -> (Word32 -> Word32 -> a)-cmp32 op (W32 x) (W32 y) = x `op` y--una32 :: (Word -> Word) -> (Word32 -> Word32)-una32 op (W32 x) = w32 (op x)--instance Num Word32 where-  (+)  = bin32 primWordAdd-  (-)  = bin32 primWordSub-  (*)  = bin32 primWordMul-  abs x = x-  signum x = if x == 0 then 0 else 1-  fromInteger i = w32 (_integerToWord i)--instance Integral Word32 where-  quot = bin32 primWordQuot-  rem  = bin32 primWordRem-  toInteger = _wordToInteger . unW32--instance Bounded Word32 where-  minBound = w32 0-  maxBound = w32 0xffffffff--instance Real Word32 where-  toRational = _integerToRational . _wordToInteger . unW32--instance Show Word32 where-  showsPrec = showIntegral--{- in Text.Read.Internal-instance Read Word32 where-  readsPrec = readIntegral--}--instance Enum Word32 where-  succ x = if x == maxBound then error "Word32.succ: overflow" else x + 1-  pred x = if x == minBound then error "Word32.pred: underflow" else x - 1-  toEnum = w32 . primIntToWord-  fromEnum = primWordToInt . unW32-  enumFrom n = enumFromTo n maxBound-  enumFromThen n m-    | m >= n = enumFromThenTo n m maxBound-    | otherwise = enumFromThenTo n m minBound-  enumFromTo = coerce (enumFromTo @Word)-  enumFromThenTo = coerce (enumFromThenTo @Word)--instance Eq Word32 where-  (==) = cmp32 primWordEQ-  (/=) = cmp32 primWordNE--instance Ord Word32 where-  compare = cmp32 primWordCompare-  (<)  = cmp32 primWordLT-  (<=) = cmp32 primWordLE-  (>)  = cmp32 primWordGT-  (>=) = cmp32 primWordGE--instance Bits Word32 where-  (.&.) = bin32 primWordAnd-  (.|.) = bin32 primWordOr-  xor   = bin32 primWordXor-  complement = una32 primWordInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= 32 = 0-    | otherwise = x `unsafeShiftL` i-  unsafeShiftL = bini32 primWordShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= 32 = 0-    | otherwise = x `unsafeShiftR` i-  unsafeShiftR = bini32 primWordShr-  bitSizeMaybe _ = Just 32-  bitSize _ = 32-  bit = bitDefault-  testBit = testBitDefault-  popCount = primWordPopcount . unW32-  zeroBits = 0-  isSigned _ = False--instance FiniteBits Word32 where-  finiteBitSize _ = 32-  countLeadingZeros (W32 x) = primWordClz x - (_wordSize - 32)-  countTrailingZeros (W32 x) = if x == 0 then 32 else primWordCtz x---------------------------------------------------------------------------------------    Word64--newtype Word64 = W64 Word-unW64 :: Word64 -> Word-unW64 (W64 x) = x--w64 :: Word -> Word64-w64 w = if _wordSize == 64 then W64 w else error "No Word64"--bin64 :: (Word -> Word -> Word) -> (Word64 -> Word64 -> Word64)-bin64 op (W64 x) (W64 y) = w64 (x `op` y)--bini64 :: (Word -> Int -> Word) -> (Word64 -> Int -> Word64)-bini64 op (W64 x) y = w64 (x `op` y)--cmp64 :: (Word -> Word -> a) -> (Word64 -> Word64 -> a)-cmp64 op (W64 x) (W64 y) = x `op` y--una64 :: (Word -> Word) -> (Word64 -> Word64)-una64 op (W64 x) = w64 (op x)--instance Num Word64 where-  (+)  = bin64 primWordAdd-  (-)  = bin64 primWordSub-  (*)  = bin64 primWordMul-  abs x = x-  signum x = if x == 0 then 0 else 1-  fromInteger i = w64 (_integerToWord i)--instance Integral Word64 where-  quot = bin64 primWordQuot-  rem  = bin64 primWordRem-  toInteger = _wordToInteger . unW64--instance Bounded Word64 where-  minBound = w64 0-  maxBound = w64 0xffffffffffffffff--instance Real Word64 where-  toRational = _integerToRational . _wordToInteger . unW64--instance Show Word64 where-  showsPrec = showIntegral--{- in Text.Read.Internal-instance Read Word64 where-  readsPrec = readIntegral--}--instance Enum Word64 where-  succ x = if x == maxBound then error "Word64.succ: overflow" else x + 1-  pred x = if x == minBound then error "Word64.pred: underflow" else x - 1-  toEnum = w64 . primIntToWord-  fromEnum = primWordToInt . unW64-  enumFrom n = enumFromTo n maxBound-  enumFromThen n m-    | m >= n = enumFromThenTo n m maxBound-    | otherwise = enumFromThenTo n m minBound-  enumFromTo = coerce (enumFromTo @Word)-  enumFromThenTo = coerce (enumFromThenTo @Word)--instance Eq Word64 where-  (==) = cmp64 primWordEQ-  (/=) = cmp64 primWordNE--instance Ord Word64 where-  compare = cmp64 primWordCompare-  (<)  = cmp64 primWordLT-  (<=) = cmp64 primWordLE-  (>)  = cmp64 primWordGT-  (>=) = cmp64 primWordGE--instance Bits Word64 where-  (.&.) = bin64 primWordAnd-  (.|.) = bin64 primWordOr-  xor   = bin64 primWordXor-  complement = una64 primWordInv-  x `shiftL` i-    | i < 0 = _overflowError-    | i >= 64 = 0-    | otherwise = x `unsafeShiftL` i-  unsafeShiftL = bini64 primWordShl-  x `shiftR` i-    | i < 0 = _overflowError-    | i >= 64 = 0-    | otherwise = x `unsafeShiftR` i-  unsafeShiftR = bini64 primWordShr-  bitSizeMaybe _ = Just 64-  bitSize _ = 64-  bit = bitDefault-  testBit = testBitDefault-  popCount = primWordPopcount . unW64-  zeroBits = 0-  isSigned _ = False--instance FiniteBits Word64 where-  finiteBitSize _ = 64-  countLeadingZeros = primWordClz . unW64-  countTrailingZeros = primWordCtz . unW64+import Data.Word.Word+import Data.Word.Word8+import Data.Word.Word16+import Data.Word.Word32+import Data.Word.Word64
+ lib/Data/Word/Word.hs view
@@ -0,0 +1,151 @@+-- Copyright 2023,2024 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Word.Word(Word) where+import qualified Prelude()              -- do not import Prelude+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Bounded+import Data.Char+import Data.Coerce+import Data.Enum+import Data.Eq+import Data.Function+--import Data.Int()  -- instances only+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import Numeric.Show+import Text.Show++instance Num Word where+  (+)  = primWordAdd+  (-)  = primWordSub+  (*)  = primWordMul+  abs x = x+  signum x = if x == 0 then 0 else 1+  fromInteger = _integerToWord++instance Integral Word where+  quot = primWordQuot+  rem  = primWordRem+  toInteger = _wordToInteger++instance Bounded Word where+  minBound = 0::Word+  maxBound = primWordInv (0::Word)++instance Real Word where+  toRational i = _integerToRational (_wordToInteger i)++instance Show Word where+  showsPrec _ = showUnsigned++-- Avoid showIntegral to avoid Integer+showUnsigned :: Word -> ShowS+showUnsigned n r =+  let c = primChr (primOrd '0' + primWordToInt (rem n (10::Word)))+  in  if n < (10::Word) then+        c : r+      else+        showUnsigned (quot n (10::Word)) (c : r)++{- in Text.Read.Internal+instance Read Word where+  readsPrec = readIntegral+-}++--------------------------------++eftWord :: Word -> Word -> [Word]+eftWord x y+  | x `primWordGT` y = []+  | otherwise = go x+  where+    go n = n : if n `primWordEQ` y then [] else go (n `primWordAdd` 1)++efttWordUp :: Word -> Word -> Word -> [Word]+-- x2 >= x1+efttWordUp x1 x2 y+  | y `primWordLT` x2 = if y `primWordLT` x1 then [] else [x1]+  | otherwise =+    let+      delta = x2 `primWordSub` x1+      y' = y `primWordSub` delta+      go x = if x `primWordGT` y' then [x] else x : go (x `primWordAdd` delta)+    in x1 : go x2++efttWordDown :: Word -> Word -> Word -> [Word]+-- x2 <= x1+efttWordDown x1 x2 y+  | y `primWordGT` x2 = if y `primWordGT` x1 then [] else [x1]+  | otherwise =+    let+      delta = x2 `primWordSub` x1+      y' = y `primWordSub` delta+      go x = if x `primWordLT` y' then [x] else x : go (x `primWordAdd` delta)+    in x1 : go x2++instance Enum Word where+  succ x = if x `primWordEQ` maxBound then error "Word.succ: overflow" else x + 1+  pred x = if x `primWordEQ` minBound then error "Word.pred: underflow" else x - 1+  toEnum = primIntToWord+  fromEnum = primWordToInt+  enumFrom n = eftWord n maxBound+  enumFromThen x1 x2+    | x2 `primWordGE` x1 = efttWordUp x1 x2 maxBound+    | otherwise          = efttWordDown x1 x2 minBound+  enumFromTo = eftWord+  enumFromThenTo x1 x2 y+    | x2 `primWordGE` x1 = efttWordUp x1 x2 y+    | otherwise          = efttWordDown x1 x2 y++--------------------------------++instance Eq Word where+  (==) = primWordEQ+  (/=) = primWordNE++instance Ord Word where+  compare = primWordCompare+  (<)  = primWordLT+  (<=) = primWordLE+  (>)  = primWordGT+  (>=) = primWordGE++--------------------------------++instance Bits Word where+  (.&.) = primWordAnd+  (.|.) = primWordOr+  xor   = primWordXor+  complement = primWordInv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= _wordSize = 0+    | otherwise = x `primWordShl` i+  unsafeShiftL = primWordShl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= _wordSize = 0+    | otherwise = x `primWordShr` i+  unsafeShiftR = primWordShr+  bitSizeMaybe _ = Just _wordSize+  bitSize _ = _wordSize+  bit = bitDefault+  testBit = testBitDefault+  popCount = primWordPopcount+  zeroBits = 0+  isSigned _ = False++instance FiniteBits Word where+  finiteBitSize _ = _wordSize+  countLeadingZeros = primWordClz+  countTrailingZeros = primWordCtz+
+ lib/Data/Word/Word16.hs view
@@ -0,0 +1,127 @@+-- Copyright 2023,2024 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Word.Word16(Word16, byteSwap16, bitReverse16) where+import qualified Prelude()              -- do not import Prelude+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Bounded+import Data.Char+import Data.Coerce+import Data.Enum+import Data.Eq+import Data.Function+--import Data.Int()  -- instances only+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import {-# SOURCE #-} Data.Typeable+import Data.Word.Word+import Numeric.Show+import Text.Show++newtype Word16 = W16 Word+  deriving (Typeable, Eq, Ord)++unW16 :: Word16 -> Word+unW16 (W16 x) = x++w16 :: Word -> Word16+w16 w = W16 (w .&. 0xffff)++bin16 :: (Word -> Word -> Word) -> (Word16 -> Word16 -> Word16)+bin16 op (W16 x) (W16 y) = w16 (x `op` y)++bini16 :: (Word -> Int -> Word) -> (Word16 -> Int -> Word16)+bini16 op (W16 x) y = w16 (x `op` y)++una16 :: (Word -> Word) -> (Word16 -> Word16)+una16 op (W16 x) = w16 (op x)++instance Num Word16 where+  (+)  = bin16 primWordAdd+  (-)  = bin16 primWordSub+  (*)  = bin16 primWordMul+  abs x = x+  signum x = if x == 0 then 0 else 1+  fromInteger i = w16 (_integerToWord i)++instance Integral Word16 where+  quot = bin16 primWordQuot+  rem  = bin16 primWordRem+  toInteger = _wordToInteger . unW16++instance Bounded Word16 where+  minBound = w16 0+  maxBound = w16 0xffff++instance Real Word16 where+  toRational = _integerToRational . _wordToInteger . unW16++instance Show Word16 where+  showsPrec = showIntegral++{- in Text.Read.Internal+instance Read Word16 where+  readsPrec = readIntegral+-}++instance Enum Word16 where+  succ x = if x == maxBound then error "Word16.succ: overflow" else x + 1+  pred x = if x == minBound then error "Word16.pred: underflow" else x - 1+  toEnum = w16 . primIntToWord+  fromEnum = primWordToInt . unW16+  enumFrom n = enumFromTo n maxBound+  enumFromThen n m+    | m >= n = enumFromThenTo n m maxBound+    | otherwise = enumFromThenTo n m minBound+  enumFromTo = coerce (enumFromTo @Word)+  enumFromThenTo = coerce (enumFromThenTo @Word)++instance Bits Word16 where+  (.&.) = bin16 primWordAnd+  (.|.) = bin16 primWordOr+  xor   = bin16 primWordXor+  complement = una16 primWordInv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= 16 = 0+    | otherwise = x `unsafeShiftL` i+  unsafeShiftL = bini16 primWordShl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= 16 = 0+    | otherwise = x `unsafeShiftR` i+  unsafeShiftR = bini16 primWordShr+  bitSizeMaybe _ = Just 16+  bitSize _ = 16+  bit = bitDefault+  testBit = testBitDefault+  popCount = primWordPopcount . unW16+  zeroBits = 0+  isSigned _ = False++instance FiniteBits Word16 where+  finiteBitSize _ = 16+  countLeadingZeros (W16 x) = primWordClz x - (_wordSize - 16)+  countTrailingZeros (W16 x) = if x == 0 then 16 else primWordCtz x++byteSwap16 :: Word16 -> Word16+byteSwap16 w = (w <<< 8) .|. (w >>> 8)+  where (<<<) = unsafeShiftL+        (>>>) = unsafeShiftR++bitReverse16 :: Word16 -> Word16+bitReverse16 x0 = x4+  where (<<<) = unsafeShiftL+        (>>>) = unsafeShiftR+        x1 = ((x0 .&. 0x5555) <<<  1) .|. ((x0 .&. 0xAAAA) >>>  1)+        x2 = ((x1 .&. 0x3333) <<<  2) .|. ((x1 .&. 0xCCCC) >>>  2)+        x3 = ((x2 .&. 0x0F0F) <<<  4) .|. ((x2 .&. 0xF0F0) >>>  4)+        x4 = ((x3 .&. 0x00FF) <<<  8) .|. ((x3 .&. 0xFF00) >>>  8)
+ lib/Data/Word/Word32.hs view
@@ -0,0 +1,128 @@+-- Copyright 2023,2024 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Word.Word32(Word32, byteSwap32, bitReverse32) where+import qualified Prelude()              -- do not import Prelude+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Bounded+import Data.Char+import Data.Coerce+import Data.Enum+import Data.Eq+import Data.Function+--import Data.Int()  -- instances only+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import {-# SOURCE #-} Data.Typeable+import Data.Word.Word+import Numeric.Show+import Text.Show++newtype Word32 = W32 Word+  deriving (Typeable, Eq, Ord)++unW32 :: Word32 -> Word+unW32 (W32 x) = x++w32 :: Word -> Word32+w32 w = if _wordSize == 32 then W32 w else W32 (w .&. 0xffffffff)++bin32 :: (Word -> Word -> Word) -> (Word32 -> Word32 -> Word32)+bin32 op (W32 x) (W32 y) = w32 (x `op` y)++bini32 :: (Word -> Int -> Word) -> (Word32 -> Int -> Word32)+bini32 op (W32 x) y = w32 (x `op` y)++una32 :: (Word -> Word) -> (Word32 -> Word32)+una32 op (W32 x) = w32 (op x)++instance Num Word32 where+  (+)  = bin32 primWordAdd+  (-)  = bin32 primWordSub+  (*)  = bin32 primWordMul+  abs x = x+  signum x = if x == 0 then 0 else 1+  fromInteger i = w32 (_integerToWord i)++instance Integral Word32 where+  quot = bin32 primWordQuot+  rem  = bin32 primWordRem+  toInteger = _wordToInteger . unW32++instance Bounded Word32 where+  minBound = w32 0+  maxBound = w32 0xffffffff++instance Real Word32 where+  toRational = _integerToRational . _wordToInteger . unW32++instance Show Word32 where+  showsPrec = showIntegral++{- in Text.Read.Internal+instance Read Word32 where+  readsPrec = readIntegral+-}++instance Enum Word32 where+  succ x = if x == maxBound then error "Word32.succ: overflow" else x + 1+  pred x = if x == minBound then error "Word32.pred: underflow" else x - 1+  toEnum = w32 . primIntToWord+  fromEnum = primWordToInt . unW32+  enumFrom n = enumFromTo n maxBound+  enumFromThen n m+    | m >= n = enumFromThenTo n m maxBound+    | otherwise = enumFromThenTo n m minBound+  enumFromTo = coerce (enumFromTo @Word)+  enumFromThenTo = coerce (enumFromThenTo @Word)++instance Bits Word32 where+  (.&.) = bin32 primWordAnd+  (.|.) = bin32 primWordOr+  xor   = bin32 primWordXor+  complement = una32 primWordInv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= 32 = 0+    | otherwise = x `unsafeShiftL` i+  unsafeShiftL = bini32 primWordShl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= 32 = 0+    | otherwise = x `unsafeShiftR` i+  unsafeShiftR = bini32 primWordShr+  bitSizeMaybe _ = Just 32+  bitSize _ = 32+  bit = bitDefault+  testBit = testBitDefault+  popCount = primWordPopcount . unW32+  zeroBits = 0+  isSigned _ = False++instance FiniteBits Word32 where+  finiteBitSize _ = 32+  countLeadingZeros (W32 x) = primWordClz x - (_wordSize - 32)+  countTrailingZeros (W32 x) = if x == 0 then 32 else primWordCtz x++byteSwap32 :: Word32 -> Word32+byteSwap32 w = (w <<< 24) .|. (w <<< 8 .&. 0x00ff0000) .|. (w >>> 8 .&. 0x0000ff00) .|. (w >>> 24)+  where (<<<) = unsafeShiftL+        (>>>) = unsafeShiftR++bitReverse32 :: Word32 -> Word32+bitReverse32 x0 = x5+  where (<<<) = unsafeShiftL+        (>>>) = unsafeShiftR+        x1 = ((x0 .&. 0x55555555) <<<  1) .|. ((x0 .&. 0xAAAAAAAA) >>>  1)+        x2 = ((x1 .&. 0x33333333) <<<  2) .|. ((x1 .&. 0xCCCCCCCC) >>>  2)+        x3 = ((x2 .&. 0x0F0F0F0F) <<<  4) .|. ((x2 .&. 0xF0F0F0F0) >>>  4)+        x4 = ((x3 .&. 0x00FF00FF) <<<  8) .|. ((x3 .&. 0xFF00FF00) >>>  8)+        x5 = ((x4 .&. 0x0000FFFF) <<< 16) .|. ((x4 .&. 0xFFFF0000) >>> 16)
+ lib/Data/Word/Word64.hs view
@@ -0,0 +1,119 @@+module Data.Word.Word64(+  Word64,+  byteSwap64, bitReverse64,+  _word64ToInteger,+  ) where+import qualified Prelude()              -- do not import Prelude+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Bounded+import Data.Enum+import Data.Eq+import Data.Function+import Data.Integer_Type+import Data.Integral+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import Numeric.Show+import Text.Show++instance Num Word64 where+  (+)  = primWord64Add+  (-)  = primWord64Sub+  (*)  = primWord64Mul+  abs x = x+  signum x = if x == 0 then 0 else 1+  fromInteger i = _integerToWord64 i++instance Integral Word64 where+  quot = primWord64Quot+  rem  = primWord64Rem+  toInteger = _word64ToInteger++instance Bounded Word64 where+  minBound = 0+  maxBound = 0xffff_ffff_ffff_ffff++instance Real Word64 where+  toRational = _integerToRational . _word64ToInteger++instance Show Word64 where+  showsPrec = showIntegral++{- in Text.Read.Internal+instance Read Word64 where+  readsPrec = readIntegral+-}++instance Enum Word64 where+  succ x = if x == maxBound then error "Word64.succ: overflow" else x + 1+  pred x = if x == minBound then error "Word64.pred: underflow" else x - 1+  toEnum = primWordToWord64 . primIntToWord+  fromEnum = primWordToInt . primWord64ToWord+  enumFrom = numericEnumFrom+  enumFromThen = numericEnumFromThen+  enumFromTo = numericEnumFromTo+  enumFromThenTo = numericEnumFromThenTo++instance Eq Word64 where+  (==) = primWord64EQ+  (/=) = primWord64NE++instance Ord Word64 where+  compare = primWord64Compare+  (<)  = primWord64LT+  (<=) = primWord64LE+  (>)  = primWord64GT+  (>=) = primWord64GE++instance Bits Word64 where+  (.&.) = primWord64And+  (.|.) = primWord64Or+  xor   = primWord64Xor+  complement = primWord64Inv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= 64 = 0+    | otherwise = x `unsafeShiftL` i+  unsafeShiftL = primWord64Shl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= 64 = 0+    | otherwise = x `unsafeShiftR` i+  unsafeShiftR = primWord64Shr+  bitSizeMaybe _ = Just 64+  bitSize _ = 64+  bit = bitDefault+  testBit = testBitDefault+  popCount = primWord64Popcount+  zeroBits = 0+  isSigned _ = False++instance FiniteBits Word64 where+  finiteBitSize _ = 64+  countLeadingZeros = primWord64Clz+  countTrailingZeros = primWord64Ctz++byteSwap64 :: Word64 -> Word64+byteSwap64 w = (w <<< 56                          ) .|. (w <<< 40 .&. 0x00ff_0000_0000_0000) .|.+               (w <<< 24 .&. 0x0000_ff00_0000_0000) .|. (w <<<  8 .&. 0x0000_00ff_0000_0000) .|.+               (w >>>  8 .&. 0x0000_0000_ff00_0000) .|. (w >>> 24 .&. 0x0000_0000_00ff_0000) .|.+               (w >>> 40 .&. 0x0000_0000_0000_ff00) .|. (w >>> 56                          )+  where (<<<) = unsafeShiftL+        (>>>) = unsafeShiftR++bitReverse64:: Word64 -> Word64+bitReverse64 x0 = x6+  where (<<<) = unsafeShiftL+        (>>>) = unsafeShiftR+        x1 = ((x0 .&. 0x5555555555555555) <<<  1) .|. ((x0 .&. 0xAAAAAAAAAAAAAAAA) >>>  1)+        x2 = ((x1 .&. 0x3333333333333333) <<<  2) .|. ((x1 .&. 0xCCCCCCCCCCCCCCCC) >>>  2)+        x3 = ((x2 .&. 0x0F0F0F0F0F0F0F0F) <<<  4) .|. ((x2 .&. 0xF0F0F0F0F0F0F0F0) >>>  4)+        x4 = ((x3 .&. 0x00FF00FF00FF00FF) <<<  8) .|. ((x3 .&. 0xFF00FF00FF00FF00) >>>  8)+        x5 = ((x4 .&. 0x0000FFFF0000FFFF) <<< 16) .|. ((x4 .&. 0xFFFF0000FFFF0000) >>> 16)+        x6 = ((x5 .&. 0x00000000FFFFFFFF) <<< 32) .|. ((x5 .&. 0xFFFFFFFF00000000) >>> 32)
+ lib/Data/Word/Word8.hs view
@@ -0,0 +1,127 @@+-- Copyright 2023,2024 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Word.Word8(Word8, bitReverse8, intToWord8, word8ToInt) where+import qualified Prelude()              -- do not import Prelude+import Primitives+import Control.Error+import Data.Bits.Base+import Data.Bool+import Data.Bounded+import Data.Char+import Data.Coerce+import Data.Enum+import Data.Eq+import Data.Function+--import Data.Int()  -- instances only+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Maybe_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import {-# SOURCE #-} Data.Typeable+import Data.Word.Word+import Numeric.Show+import Text.Show++newtype Word8 = W8 Word+  deriving (Typeable, Eq, Ord)++unW8 :: Word8 -> Word+unW8 (W8 x) = x++w8 :: Word -> Word8+w8 w = W8 (w .&. 0xff)++bin8 :: (Word -> Word -> Word) -> (Word8 -> Word8 -> Word8)+bin8 op (W8 x) (W8 y) = w8 (x `op` y)++bini8 :: (Word -> Int -> Word) -> (Word8 -> Int -> Word8)+bini8 op (W8 x) y = w8 (x `op` y)++una8 :: (Word -> Word) -> (Word8 -> Word8)+una8 op (W8 x) = w8 (op x)++instance Num Word8 where+  (+)  = bin8 primWordAdd+  (-)  = bin8 primWordSub+  (*)  = bin8 primWordMul+  abs x = x+  signum x = if x == 0 then 0 else 1+  fromInteger i = w8 (_integerToWord i)++instance Integral Word8 where+  quot = bin8 primWordQuot+  rem  = bin8 primWordRem+  toInteger = _wordToInteger . unW8++instance Bounded Word8 where+  minBound = w8 0+  maxBound = w8 0xff++instance Real Word8 where+  toRational = _integerToRational . _wordToInteger . unW8++instance Show Word8 where+  showsPrec = showIntegral++{- in Text.Read.Internal+instance Read Word8 where+  readsPrec = readIntegral+-}++instance Enum Word8 where+  succ x = if x == maxBound then error "Word8.succ: overflow" else x + 1+  pred x = if x == minBound then error "Word8.pred: underflow" else x - 1+  toEnum = w8 . primIntToWord+  fromEnum = primWordToInt . unW8+  enumFrom n = enumFromTo n maxBound+  enumFromThen n m+    | m >= n = enumFromThenTo n m maxBound+    | otherwise = enumFromThenTo n m minBound+  enumFromTo = coerce (enumFromTo @Word)+  enumFromThenTo = coerce (enumFromThenTo @Word)++instance Bits Word8 where+  (.&.) = bin8 primWordAnd+  (.|.) = bin8 primWordOr+  xor   = bin8 primWordXor+  complement = una8 primWordInv+  x `shiftL` i+    | i < 0 = _overflowError+    | i >= 8 = 0+    | otherwise = x `unsafeShiftL` i+  unsafeShiftL = bini8 primWordShl+  x `shiftR` i+    | i < 0 = _overflowError+    | i >= 8 = 0+    | otherwise = x `unsafeShiftR` i+  unsafeShiftR = bini8 primWordShr+  bitSizeMaybe _ = Just 8+  bitSize _ = 8+  bit = bitDefault+  testBit = testBitDefault+  popCount = primWordPopcount . unW8+  zeroBits = 0+  isSigned _ = False++instance FiniteBits Word8 where+  finiteBitSize _ = 8+  countLeadingZeros (W8 x) = primWordClz x - (_wordSize - 8)+  countTrailingZeros (W8 x) = if x == 0 then 8 else primWordCtz x++bitReverse8 :: Word8 -> Word8+bitReverse8 x0 = x3+  where (<<<) = unsafeShiftL+        (>>>) = unsafeShiftR+        x1 = ((x0 .&. 0x55) <<<  1) .|. ((x0 .&. 0xAA) >>>  1)+        x2 = ((x1 .&. 0x33) <<<  2) .|. ((x1 .&. 0xCC) >>>  2)+        x3 = ((x2 .&. 0x0F) <<<  4) .|. ((x2 .&. 0xF0) >>>  4)++intToWord8 :: Int -> Word8+intToWord8 i = primUnsafeCoerce (i .&. 0xFF) -- Safety: Int and Word8 have the same representation and `i .&. 0xFF` ensures that the value is in the Word8 range++word8ToInt :: Word8 -> Int+word8ToInt w = primUnsafeCoerce w -- Safety: Int and Word8 have the same representation and a Word8 is in the Int range
lib/Data/ZipList.hs view
@@ -1,11 +1,12 @@-module Data.ZipList(ZipList(..), getZipList) where-import Prelude--newtype ZipList a = ZipList [a]-  deriving (Eq, Ord, Show)+module Data.ZipList(ZipList(..)) where+--import qualified Prelude(); import MiniPrelude+import Control.Applicative+import Data.Foldable+import Data.Traversable+--import Mhs.Builtin -getZipList :: forall a . ZipList a -> [a]-getZipList (ZipList as) = as+newtype ZipList a = ZipList { getZipList :: [a] }+  deriving (Eq, Ord, Show, Foldable)  instance Functor ZipList where   fmap f (ZipList as) = ZipList (map f as)@@ -13,3 +14,14 @@ instance Applicative ZipList where   pure a = ZipList (repeat a)   liftA2 f (ZipList xs) (ZipList ys) = ZipList (zipWith f xs ys)++instance Alternative ZipList where+   empty = ZipList []+   ZipList xs0 <|> ZipList ys0 = ZipList $ go xs0 ys0+     where+       go (x:xs) (_:ys) = x : go xs ys+       go    []     ys  = ys+       go    xs      _  = xs++instance Traversable ZipList where+    traverse f (ZipList x) = ZipList `fmap` traverse f x
+ lib/Data/ZipList.hs-boot view
@@ -0,0 +1,5 @@+module Data.ZipList where+import qualified Prelude()+import Data.List_Type++newtype ZipList a = ZipList [a]
lib/Debug/Trace.hs view
@@ -1,12 +1,13 @@ module Debug.Trace(module Debug.Trace) where import qualified Prelude(); import MiniPrelude-import System.IO(hPutStrLn, stderr)+import System.IO.Base(hPutStrLn, stderr, hFlush) import Primitives  trace :: forall a . String -> a -> a trace msg a = _primitive "IO.performIO" (   do     hPutStrLn stderr msg+    hFlush stderr     return a   ) 
lib/Foreign.hs view
@@ -4,9 +4,9 @@   , module Data.Word   , module Foreign.Ptr   , module Foreign.ForeignPtr---  , module Foreign.StablePtr-  , module Foreign.Storable   , module Foreign.Marshal+  , module Foreign.StablePtr+  , module Foreign.Storable   ) where  import Data.Bits@@ -14,6 +14,6 @@ import Data.Word import Foreign.Ptr import Foreign.ForeignPtr---import Foreign.StablePtr-import Foreign.Storable import Foreign.Marshal+import Foreign.StablePtr+import Foreign.Storable
+ lib/Foreign/C/ConstPtr.hs view
@@ -0,0 +1,11 @@+module Foreign.C.ConstPtr (ConstPtr(..)) where+import Foreign.Ptr+import Foreign.Storable++newtype ConstPtr a = ConstPtr { unConstPtr :: Ptr a }+  deriving (Eq, Ord)+  deriving newtype (Storable)++-- doesn't use record syntax+instance Show (ConstPtr a) where+  showsPrec d (ConstPtr p) = showParen (d > 10) $ showString "ConstPtr " . showsPrec 11 p
lib/Foreign/C/Error.hs view
@@ -17,7 +17,7 @@    Errno(..), -  eAGAIN, eINTR, eWOULDBLOCK,+  eOK, e2BIG, eACCES, eAGAIN, eINTR, eINVAL, eNOENT, ePERM, eRANGE, eROFS, eTXTBSY, eWOULDBLOCK, {-   -- ** Common @errno@ symbols   -- | Different operating systems and\/or C libraries often support@@ -90,7 +90,7 @@ import Foreign.Storable import Data.Functor(void) import Data.Maybe-import System.IO(Handle)+import System.IO.Base(Handle) import System.IO.Error import System.IO.Unsafe(unsafePerformIO) @@ -228,15 +228,24 @@ eXDEV           = Errno (CONST_EXDEV) -} -eINTR :: Errno+eOK, e2BIG, eAGAIN, eINTR, eINVAL, eWOULDBLOCK :: Errno+eOK         = Errno 0+e2BIG       = Errno c2BIG;       foreign import capi "value E2BIG"       c2BIG       :: Int+eACCES      = Errno cACCES;      foreign import capi "value EACCES"      cACCES      :: Int eAGAIN      = Errno cAGAIN;      foreign import capi "value EAGAIN"      cAGAIN      :: Int eINTR       = Errno cINTR;       foreign import capi "value EINTR"       cINTR       :: Int+eINVAL      = Errno cINVAL;      foreign import capi "value EINVAL"      cINVAL      :: Int+eNOENT      = Errno cNOENT;      foreign import capi "value ENOENT"      cNOENT      :: Int+ePERM       = Errno cPERM;       foreign import capi "value EPERM"       cPERM       :: Int+eRANGE      = Errno cRANGE;      foreign import capi "value ERANGE"      cRANGE      :: Int+eROFS       = Errno cROFS;       foreign import capi "value EROFS"       cROFS       :: Int+eTXTBSY     = Errno cTXTBSY ;    foreign import capi "value ETXTBSY"     cTXTBSY     :: Int eWOULDBLOCK = Errno cWOULDBLOCK; foreign import capi "value EWOULDBLOCK" cWOULDBLOCK :: Int  isValidErrno               :: Errno -> Bool isValidErrno (Errno errno)  = errno /= -1 -foreign import ccall unsafe "sys/errno.h &errno" c_errno_ptr :: IO (Ptr Int)+foreign import ccall unsafe "errno.h &errno" c_errno_ptr :: IO (Ptr Int)  getErrno :: IO Errno getErrno = do@@ -384,17 +393,18 @@     str <- errnoToString errno     return (IOError maybeHdl errType loc str (Just errno') maybeName)   where-    errType = OtherError-{--    errType =+    errType         | errno == eOK             = OtherError         | errno == e2BIG           = ResourceExhausted         | errno == eACCES          = PermissionDenied+{-         | errno == eADDRINUSE      = ResourceBusy         | errno == eADDRNOTAVAIL   = UnsupportedOperation         | errno == eADV            = OtherError         | errno == eAFNOSUPPORT    = UnsupportedOperation+-}         | errno == eAGAIN          = ResourceExhausted+{-         | errno == eALREADY        = AlreadyExists         | errno == eBADF           = InvalidArgument         | errno == eBADMSG         = InappropriateType@@ -419,8 +429,10 @@         | errno == eIDRM           = ResourceVanished         | errno == eILSEQ          = InvalidArgument         | errno == eINPROGRESS     = AlreadyExists+-}         | errno == eINTR           = Interrupted         | errno == eINVAL          = InvalidArgument+{-         | errno == eIO             = HardwareFault         | errno == eISCONN         = AlreadyExists         | errno == eISDIR          = InappropriateType@@ -437,7 +449,9 @@         | errno == eNOBUFS         = ResourceExhausted         | errno == eNODATA         = NoSuchThing         | errno == eNODEV          = UnsupportedOperation+-}         | errno == eNOENT          = NoSuchThing+{-         | errno == eNOEXEC         = InvalidArgument         | errno == eNOLCK          = ResourceExhausted         | errno == eNOLINK         = ResourceVanished@@ -457,7 +471,9 @@         | errno == eNOTTY          = IllegalOperation         | errno == eNXIO           = NoSuchThing         | errno == eOPNOTSUPP      = UnsupportedOperation+-}         | errno == ePERM           = PermissionDenied+{-         | errno == ePFNOSUPPORT    = UnsupportedOperation         | errno == ePIPE           = ResourceVanished         | errno == ePROCLIM        = PermissionDenied@@ -467,10 +483,14 @@         | errno == ePROTO          = ProtocolError         | errno == ePROTONOSUPPORT = ProtocolError         | errno == ePROTOTYPE      = ProtocolError+-}         | errno == eRANGE          = UnsupportedOperation+{-         | errno == eREMCHG         = ResourceVanished         | errno == eREMOTE         = IllegalOperation+-}         | errno == eROFS           = PermissionDenied+{-         | errno == eRPCMISMATCH    = ProtocolError         | errno == eRREMOTE        = IllegalOperation         | errno == eSHUTDOWN       = IllegalOperation@@ -482,9 +502,14 @@         | errno == eTIME           = TimeExpired         | errno == eTIMEDOUT       = TimeExpired         | errno == eTOOMANYREFS    = ResourceExhausted+-}         | errno == eTXTBSY         = ResourceBusy+{-         | errno == eUSERS          = ResourceExhausted+-}         | errno == eWOULDBLOCK     = OtherError+{-         | errno == eXDEV           = UnsupportedOperation-        | otherwise                = OtherError -}+        | otherwise                = OtherError+
lib/Foreign/C/String.hs view
@@ -11,15 +11,15 @@ import Primitives import Data.ByteString.Internal import Data.Char_Type-import Data.Coerce (coerce)-import Foreign.C.Types (CChar)+import Data.Coerce(coerce)+import Foreign.C.Types(CChar) import Foreign.Marshal.Alloc -primNewCAStringLen :: [Char] -> IO (Ptr CChar, Int)-primNewCAStringLen = _primitive "newCAStringLen"- type CString = Ptr CChar type CStringLen = (Ptr CChar, Int)++primNewCAStringLen :: [Char] -> IO (Ptr CChar, Int)+primNewCAStringLen = _primitive "newCAStringLen"  newCAString :: String -> IO CString newCAString s = primNewCAStringLen s `primBind` \ (s, _) -> primReturn s
lib/Foreign/C/Types.hs view
@@ -1,76 +1,105 @@ -- Types used for C FFI. module Foreign.C.Types(- CChar(..),  CSChar(..),  CUChar(..),- CShort(..), CUShort(..),- CInt(..),   CUInt(..),- CLong(..),  CULong(..),- CPtrdiff(..),- CSize(..),  CSSize(..),- CLLong(..), CULLong(..),- CIntPtr(..), CUIntPtr(..),- CFloat(..), CDouble(..),- CTime(..),- intToCSize, cSizeToInt,- ) where+  CBool(..),+  CChar(..),  CSChar(..),  CUChar(..), CWchar(..),+  CShort(..), CUShort(..),+  CInt(..),   CUInt(..),+  CLong(..),  CULong(..),+  CPtrdiff(..),+  CSize(..),  CSSize(..),+  CLLong(..), CULLong(..),+  CIntMax(..), CUIntMax(..),+  CIntPtr(..), CUIntPtr(..),+  CFloat(..), CDouble(..),+  CSigAtomic(..),+  CTime(..), CClock(..),+  CUSeconds(..), CSUSeconds(..),+  intToCSize, cSizeToInt,+  ) where import qualified Prelude() import Primitives+import Data.Bits.Base import Data.Bool+import Data.Bounded import Data.Coerce import Data.Enum import Data.Eq-import Data.Int+import Data.Floating+import Data.Fractional+import Data.Int.Int import Data.Integral import Data.Num import Data.Ord import Data.Real-import Data.Word-import Data.FloatW+import Data.RealFrac+import Data.RealFloat+import Data.Word.Word+import Data.Word.Word8+import Data.Float+import Data.Double+import {-# SOURCE #-} Data.Typeable+import Text.Show  -- The MicroHs Word type is the "natural" architecture word size; -- it is the same as the pointer difference type. -- And Int is the natural signed word size.-newtype CChar    = CChar    Char-  deriving (Eq, Ord, Enum)+newtype CBool    = CBool    Word8+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits)+newtype CChar    = CChar    Int+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CSChar   = CSChar   Int-  deriving (Eq, Ord, Enum)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CUChar   = CUChar   Word-  deriving (Eq, Ord, Enum)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits)+newtype CWchar = CWchar Int+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CShort   = CShort   Int-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CUShort  = CUShort  Word-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CInt     = CInt     Int-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CUInt    = CUInt    Word-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CLong    = CLong    Int-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CULong   = CULong   Word-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CPtrdiff = CPtrdiff Word-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CSize    = CSize    Word-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CSSize   = CSSize   Int-  deriving (Eq, Ord, Enum, Num, Integral, Real)-newtype CLLong   = CLLong   Int-  deriving (Eq, Ord, Enum, Num, Integral, Real)-newtype CULLong  = CULLong  Word-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits)+newtype CLLong   = CLLong   Int64+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits)+newtype CULLong  = CULLong  Word64+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CIntPtr  = CIntPtr  Int-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits) newtype CUIntPtr = CUIntPtr Word-  deriving (Eq, Ord, Enum, Num, Integral, Real)+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits)+newtype CIntMax = CIntMax Int64+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits)+newtype CUIntMax = CUIntMax Word64+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits)+newtype CSigAtomic = CSigAtomic Word  -- XXX platform specific+  deriving newtype (Eq, Ord, Show, Enum, Num, Integral, Real, Bounded, Bits, FiniteBits)  -- XXX This is really platform specific+newtype CClock = CClock Int+  deriving newtype (Eq, Ord, Show, Enum, Num, Real) newtype CTime = CTime Int-  deriving (Eq, Ord)+  deriving newtype (Eq, Ord, Show, Enum, Num, Real)+newtype CUSeconds = CUSeconds Word+  deriving newtype (Eq, Ord, Show, Enum, Num, Real)+newtype CSUSeconds = CSUSeconds Int+  deriving newtype (Eq, Ord, Show, Enum, Num, Real) --- XXX only one of these is actually correct-newtype CFloat   = CFloat   FloatW-  deriving (Eq, Ord, Num)-newtype CDouble  = CDouble  FloatW-  deriving (Eq, Ord, Num)+newtype CFloat   = CFloat   Float+  deriving newtype (Eq, Ord, Show, Num, Real, Fractional, RealFrac, Floating, RealFloat)+newtype CDouble  = CDouble  Double+  deriving newtype (Eq, Ord, Show, Num, Real, Fractional, RealFrac, Floating, RealFloat)  -- Temporary conversion functions. intToCSize :: Int -> CSize
lib/Foreign/ForeignPtr.hs view
@@ -16,6 +16,8 @@   ) where import qualified Prelude(); import MiniPrelude import Primitives+import Foreign.ForeignPtr_Type+import Foreign.ForeignPtr.Unsafe import Foreign.Ptr import Foreign.Storable import Foreign.Marshal.Alloc@@ -30,35 +32,25 @@ instance Show (ForeignPtr a) where     showsPrec p f = showsPrec p (unsafeForeignPtrToPtr f) -unsafeForeignPtrToPtr :: ForeignPtr a -> Ptr a-unsafeForeignPtrToPtr = primForeignPtrToPtr--type FinalizerPtr a = FunPtr (Ptr a -> IO ())--foreign import ccall "&free" c_freefun_io :: IO (FinalizerPtr ())--c_freefun :: forall a . FinalizerPtr a-c_freefun = primUnsafeCoerce (primPerformIO c_freefun_io)- mallocForeignPtr :: Storable a => IO (ForeignPtr a) mallocForeignPtr = do   ptr <- malloc-  newForeignPtr c_freefun ptr+  newForeignPtr finalizerFree ptr  mallocForeignPtrBytes :: Int -> IO (ForeignPtr a) mallocForeignPtrBytes size = do   ptr <- mallocBytes size-  newForeignPtr c_freefun ptr+  newForeignPtr finalizerFree ptr  mallocForeignPtrArray :: Storable a => Int -> IO (ForeignPtr a) mallocForeignPtrArray size = do   ptr <- mallocArray size-  newForeignPtr c_freefun ptr+  newForeignPtr finalizerFree ptr  mallocForeignPtrArray0 :: Storable a => Int -> IO (ForeignPtr a) mallocForeignPtrArray0 size = do   ptr <- mallocArray0 size-  newForeignPtr c_freefun ptr+  newForeignPtr finalizerFree ptr  addForeignPtrFinalizer :: FinalizerPtr a -> ForeignPtr a -> IO () addForeignPtrFinalizer = primAddFinalizer
+ lib/Foreign/ForeignPtr/Unsafe.hs view
@@ -0,0 +1,7 @@+module Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr) where++import qualified Prelude ()+import Primitives++unsafeForeignPtrToPtr :: ForeignPtr a -> Ptr a+unsafeForeignPtrToPtr = primForeignPtrToPtr
+ lib/Foreign/ForeignPtr_Type.hs view
@@ -0,0 +1,9 @@+module Foreign.ForeignPtr_Type (+  ForeignPtr,+  FinalizerPtr,+) where++import qualified Prelude ()+import Primitives++type FinalizerPtr a = FunPtr (Ptr a -> IO ())
lib/Foreign/Marshal/Alloc.hs view
@@ -1,13 +1,14 @@ module Foreign.Marshal.Alloc(-  malloc, calloc, alloca,-  free,-  mallocBytes, callocBytes, allocaBytes,+  malloc, calloc, realloc, alloca,+  free, finalizerFree,+  mallocBytes, callocBytes, reallocBytes, allocaBytes,   ) where import qualified Prelude()              -- do not import Prelude import Primitives import Control.Error(undefined) import Foreign.C.Types import Foreign.Ptr+import Foreign.ForeignPtr_Type import Foreign.Storable  foreign import ccall "free" c_free :: Ptr () -> IO ()@@ -15,6 +16,11 @@ free :: forall a . Ptr a -> IO () free p = c_free (castPtr p) +foreign import ccall "&free" c_freefun :: IO (FinalizerPtr ())++finalizerFree :: FinalizerPtr a+finalizerFree = primUnsafeCoerce (primPerformIO c_freefun)+ foreign import ccall "malloc" c_malloc :: CSize -> IO (Ptr ())  mallocBytes :: forall a . Int -> IO (Ptr a)@@ -23,13 +29,21 @@ foreign import ccall "calloc" c_calloc :: CSize -> CSize -> IO (Ptr ())  callocBytes :: forall a . Int -> IO (Ptr a)-callocBytes n = c_calloc (intToCSize (1::Int)) (intToCSize n) `primBind` \ p -> primReturn (castPtr p)+callocBytes n = c_calloc (intToCSize (1::Int)) (intToCSize n) `primBind` \p -> primReturn (castPtr p) +foreign import ccall "realloc" c_realloc :: Ptr () -> CSize -> IO (Ptr ())++reallocBytes :: Ptr a -> Int -> IO (Ptr a)+reallocBytes p n = c_realloc (castPtr p) (intToCSize n) `primBind` \q -> primReturn (castPtr q)+ malloc :: forall a . Storable a => IO (Ptr a) malloc  = mallocBytes (sizeOf (undefined :: a))  calloc :: forall a . Storable a => IO (Ptr a) calloc = callocBytes (sizeOf (undefined :: a))++realloc :: forall a b . Storable b => Ptr a -> IO (Ptr b)+realloc p = reallocBytes (castPtr p) (sizeOf (undefined :: b))  alloca :: forall a b . Storable a => (Ptr a -> IO b) -> IO b alloca = allocaBytes (sizeOf (undefined :: a))
lib/Foreign/Marshal/Array.hs view
@@ -1,17 +1,44 @@-module Foreign.Marshal.Array(module Foreign.Marshal.Array) where+module Foreign.Marshal.Array (+  mallocArray, mallocArray0,+  allocaArray, allocaArray0,+  reallocArray, reallocArray0,+  callocArray, callocArray0,+  peekArray, peekArray0,+  pokeArray, pokeArray0,+  newArray, newArray0,+  withArray, withArray0,+  withArrayLen, withArrayLen0,+  copyArray, moveArray,+  lengthArray0,+  advancePtr,+) where+ import qualified Prelude(); import MiniPrelude import Foreign.Ptr import Foreign.Storable import Foreign.Marshal.Alloc+import Foreign.Marshal.Utils (copyBytes, moveBytes)  mallocArray :: forall a . Storable a => Int -> IO (Ptr a)-mallocArray size = mallocBytes (size * sizeOf (undefined :: a))+mallocArray size = mallocBytes (size * sizeOf (error "mallocArray" :: a))  mallocArray0 :: forall a . Storable a => Int -> IO (Ptr a) mallocArray0 size  = mallocArray (size + 1) +allocaArray :: forall a b. (Storable a) => Int -> (Ptr a -> IO b) -> IO b+allocaArray n = allocaBytes (n * sizeOf (error "allocaArray" :: a))++allocaArray0 :: forall a b. (Storable a) => Int -> (Ptr a -> IO b) -> IO b+allocaArray0 n = allocaArray (n + 1)++reallocArray :: forall a . Storable a => Ptr a -> Int -> IO (Ptr a)+reallocArray p n = reallocBytes p (n * sizeOf (error "reallocArray" :: a))++reallocArray0 :: forall a . Storable a => Ptr a -> Int -> IO (Ptr a)+reallocArray0 p n = reallocArray p (n + 1)+ callocArray :: forall a . Storable a => Int -> IO (Ptr a)-callocArray size = callocBytes (size * sizeOf (undefined :: a))+callocArray size = callocBytes (size * sizeOf (error "callocArray" :: a))  callocArray0 :: forall a . Storable a => Int -> IO (Ptr a) callocArray0 size  = callocArray (size + 1)@@ -57,9 +84,34 @@         val <- peekElemOff ptr i         if val == marker then return i else loop (i+1) -withArrray :: forall a b . Storable a => [a] -> (Ptr a -> IO b) -> IO b-withArrray vals iob = do-  ptr <- newArray vals-  b <- iob ptr-  free ptr-  return b+withArray :: forall a b . Storable a => [a] -> (Ptr a -> IO b) -> IO b+withArray vals f = withArrayLen vals (const f)++withArray0 :: forall a b . Storable a => a -> [a] -> (Ptr a -> IO b) -> IO b+withArray0 marker vals f = withArrayLen0 marker vals (const f)++withArrayLen :: forall a b . Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b+withArrayLen vals f =+  allocaArray len $ \ptr -> do+    pokeArray ptr vals+    f len ptr+  where+    len = length vals++withArrayLen0 :: forall a b . Storable a => a -> [a] -> (Int -> Ptr a -> IO b) -> IO b+withArrayLen0 marker vals f =+  allocaArray0 len $ \ptr -> do+    pokeArray0 marker ptr vals+    f len ptr+  where+    len = length vals+++advancePtr :: forall a. (Storable a) => Ptr a -> Int -> Ptr a+advancePtr p n = plusPtr p (n * sizeOf (error "advancePtr" :: a))++copyArray :: forall a. Storable a => Ptr a -> Ptr a -> Int -> IO ()+copyArray dest src n = copyBytes dest src (n * sizeOf (error "copyArray" :: a))++moveArray :: forall a. Storable a => Ptr a -> Ptr a -> Int -> IO ()+moveArray dest src n = moveBytes dest src (n * sizeOf (error "moveArray" :: a))
lib/Foreign/Marshal/Utils.hs view
@@ -1,4 +1,16 @@-module Foreign.Marshal.Utils(module Foreign.Marshal.Utils) where+module Foreign.Marshal.Utils (+  with,+  new,+  fromBool,+  toBool,+  maybeNew,+  maybeWith,+  maybePeek,+  withMany,+  copyBytes,+  moveBytes,+) where+ import qualified Prelude(); import MiniPrelude import Foreign.Marshal.Alloc import Foreign.C.Types
lib/Foreign/Ptr.hs view
@@ -1,14 +1,38 @@ module Foreign.Ptr(-  module Foreign.Ptr,   Ptr,+  nullPtr,+  castPtr,+  plusPtr,+  alignPtr,+  minusPtr,   FunPtr,+  nullFunPtr,+  castFunPtr,+  castFunPtrToPtr,+  castPtrToFunPtr,+  freeHaskellFunPtr,+  IntPtr,+  ptrToIntPtr,+  intPtrToPtr,+  WordPtr,+  ptrToWordPtr,+  wordPtrToPtr,   ) where import qualified Prelude()              -- do not import Prelude import Primitives-import Data.Word+import Data.Bits.Base+import Data.Bool_Type+import Data.Bounded+import Data.Coerce+import Data.Enum import Data.Eq import Data.Function+import Data.Integral+import Data.Num import Data.Ord+import Data.Real+import {-# SOURCE #-} Data.Typeable+import Data.Word.Word () import Numeric.Show(showHex) import Text.Show @@ -34,6 +58,12 @@ plusPtr :: forall a b . Ptr a -> Int -> Ptr b plusPtr p i = primIntToPtr (primPtrToInt p `primIntAdd` i) +alignPtr :: forall a . Ptr a -> Int -> Ptr a+alignPtr p i =+  case primIntRem (primPtrToInt p) i of+    (0::Int) -> p+    n -> plusPtr p (i `primIntSub` n)+ minusPtr :: forall a b . Ptr a -> Ptr b -> Int minusPtr p q = primPtrToInt p `primIntSub` primPtrToInt q @@ -64,7 +94,25 @@ castPtrToFunPtr :: forall a b . Ptr a -> FunPtr b castPtrToFunPtr = primPtrToFunPtr +freeHaskellFunPtr :: forall a . FunPtr a -> IO ()+freeHaskellFunPtr _p = primReturn ()+ -------- -type IntPtr = Int-type WordPtr = Word+newtype IntPtr = IntPtr Int+  deriving newtype (Bounded, Enum, Eq, Integral, Num, Ord, Real, Show, Bits, FiniteBits)++ptrToIntPtr :: forall a . Ptr a -> IntPtr+ptrToIntPtr p = IntPtr (primPtrToInt p)++intPtrToPtr :: forall a . IntPtr -> Ptr a+intPtrToPtr (IntPtr i) = primIntToPtr i++newtype WordPtr = WordPtr Word+  deriving newtype (Bounded, Enum, Eq, Integral, Num, Ord, Real, Show, Bits, FiniteBits)++ptrToWordPtr :: forall a . Ptr a -> WordPtr+ptrToWordPtr p = WordPtr (primPtrToWord p)++wordPtrToPtr :: forall a . WordPtr -> Ptr a+wordPtrToPtr (WordPtr w) = primWordToPtr w
+ lib/Foreign/StablePtr.hs view
@@ -0,0 +1,39 @@+module Foreign.StablePtr(+  StablePtr,+  newStablePtr,+  deRefStablePtr,+  freeStablePtr,+  castStablePtrToPtr,+  castPtrToStablePtr,+  ) where+import qualified Prelude()+import Mhs.Builtin+import MiniPrelude+import Primitives+import Data.Typeable+import Foreign.Storable++newtype StablePtr a = StablePtr Word+  deriving (Typeable)+  deriving newtype (Storable)++instance Eq (StablePtr a) where+  StablePtr a == StablePtr a'  =  a == a'++instance Show (StablePtr a) where+  show (StablePtr sp) = "StablePtr#" ++ show sp++newStablePtr :: a -> IO (StablePtr a)+newStablePtr a = StablePtr <$> primNewStablePtr a++deRefStablePtr :: StablePtr a -> IO a+deRefStablePtr (StablePtr sp) = primDeRefStablePtr sp++freeStablePtr :: StablePtr a -> IO ()+freeStablePtr (StablePtr sp) = primFreeStablePtr sp++castStablePtrToPtr :: StablePtr a -> Ptr ()+castStablePtrToPtr (StablePtr sp) = primWordToPtr sp++castPtrToStablePtr :: Ptr () -> StablePtr a+castPtrToStablePtr = StablePtr . primPtrToWord
lib/Foreign/Storable.hs view
@@ -1,12 +1,16 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license. module Foreign.Storable(Storable(..)) where import qualified Prelude()              -- do not import Prelude import Primitives import Control.Error(undefined) import Foreign.C.Types import Foreign.Ptr+import Data.Bool_Type import Data.Int-import Data.Int.Instances import Data.Word+import Data.Coerce+import {-# SOURCE #-} Data.Typeable  class Storable a where    sizeOf      :: a -> Int@@ -51,6 +55,12 @@   peek p      = c_peek_int32 (castPtr p) `primBind` \ i -> primReturn (primChr (primUnsafeCoerce i))   poke p c    = c_poke_int32 (castPtr p) (primUnsafeCoerce (primOrd c)) +instance Storable Bool where+  sizeOf    _ = intSize+  alignment _ = intSize+  peek p      = c_peek_int (castPtr p) `primBind` \(CInt i) -> primReturn (i `primIntNE` 0)+  poke p b    = c_poke_int (castPtr p) (if b then CInt 1 else CInt 0)+ foreign import ccall "peekPtr" c_peekPtr :: Ptr (Ptr ()) -> IO (Ptr ()) foreign import ccall "pokePtr" c_pokePtr :: Ptr (Ptr ()) -> Ptr () -> IO () @@ -60,6 +70,12 @@   peek p      = c_peekPtr (castPtr p) `primBind` \ q -> primReturn (castPtr q)   poke p w    = c_pokePtr (castPtr p) (castPtr w) +instance Storable (FunPtr a) where+  sizeOf    _ = wordSizeInBytes+  alignment _ = wordSizeInBytes+  peek p      = c_peekPtr (castPtr p) `primBind` \ q -> primReturn (castPtrToFunPtr (castPtr q))+  poke p w    = c_pokePtr (castPtr p) (castPtr (castFunPtrToPtr w))+ foreign import ccall "peek_uint8" c_peek_uint8 :: Ptr Word8 -> IO Word8 foreign import ccall "poke_uint8" c_poke_uint8 :: Ptr Word8 -> Word8 -> IO () @@ -132,6 +148,51 @@   peek p      = c_peek_int64 p   poke p w    = c_poke_int64 p w +foreign import ccall "peek_char" c_peek_char :: Ptr CChar -> IO CChar+foreign import ccall "poke_char" c_poke_char :: Ptr CChar -> CChar -> IO ()++instance Storable CChar where+  sizeOf    _ = charSize+  alignment _ = charSize+  peek        = c_peek_char+  poke        = c_poke_char++foreign import ccall "peek_schar" c_peek_schar :: Ptr CSChar -> IO CSChar+foreign import ccall "poke_schar" c_poke_schar :: Ptr CSChar -> CSChar -> IO ()++instance Storable CSChar where+  sizeOf    _ = charSize+  alignment _ = charSize+  peek        = c_peek_schar+  poke        = c_poke_schar++foreign import ccall "peek_uchar" c_peek_uchar :: Ptr CUChar -> IO CUChar+foreign import ccall "poke_uchar" c_poke_uchar :: Ptr CUChar -> CUChar -> IO ()++instance Storable CUChar where+  sizeOf    _ = charSize+  alignment _ = charSize+  peek        = c_peek_uchar+  poke        = c_poke_uchar++foreign import ccall "peek_short" c_peek_short :: Ptr CShort -> IO CShort+foreign import ccall "poke_short" c_poke_short :: Ptr CShort -> CShort -> IO ()++instance Storable CShort where+  sizeOf    _ = shortSize+  alignment _ = shortSize+  peek        = c_peek_short+  poke        = c_poke_short++foreign import ccall "peek_ushort" c_peek_ushort :: Ptr CUShort -> IO CUShort+foreign import ccall "poke_ushort" c_poke_ushort :: Ptr CUShort -> CUShort -> IO ()++instance Storable CUShort where+  sizeOf    _ = shortSize+  alignment _ = shortSize+  peek        = c_peek_ushort+  poke        = c_poke_ushort+ foreign import ccall "peek_int" c_peek_int :: Ptr CInt -> IO CInt foreign import ccall "poke_int" c_poke_int :: Ptr CInt -> CInt -> IO () @@ -186,21 +247,74 @@   peek p      = c_peek_ullong p   poke p w    = c_poke_ullong p w -foreign import ccall "peek_flt" c_peek_flt :: Ptr FloatW -> IO FloatW-foreign import ccall "poke_flt" c_poke_flt :: Ptr FloatW -> FloatW -> IO ()+foreign import ccall "peek_size_t" c_peek_size_t :: Ptr CSize -> IO CSize+foreign import ccall "poke_size_t" c_poke_size_t :: Ptr CSize -> CSize -> IO () -instance Storable FloatW where-  sizeOf    _ = _wordSize-  alignment _ = _wordSize-  peek p      = c_peek_flt p-  poke p w    = c_poke_flt p w+instance Storable CSize where+  sizeOf    _ = sizeTSize+  alignment _ = sizeTSize+  peek p      = c_peek_size_t p+  poke p w    = c_poke_size_t p w +foreign import ccall "peek_long" c_peek_time_t :: Ptr CTime -> IO CTime+foreign import ccall "poke_long" c_poke_time_t :: Ptr CTime -> CTime -> IO ()++instance Storable CTime where+  sizeOf    _ = longSize+  alignment _ = longSize+  peek p      = c_peek_time_t p+  poke p w    = c_poke_time_t p w++foreign import ccall "peek_flt32" c_peek_flt32 :: Ptr Float -> IO Float+foreign import ccall "poke_flt32" c_poke_flt32 :: Ptr Float -> Float -> IO ()++instance Storable Float where+  sizeOf    _ = 4+  alignment _ = 4+  peek p      = c_peek_flt32 p+  poke p w    = c_poke_flt32 p w++instance Storable CFloat where+  sizeOf    _ = 4+  alignment _ = 4+  peek p      = c_peek_flt32 (castPtr p) `primBind` \f -> primReturn (CFloat f)+  poke p (CFloat w) = c_poke_flt32 (castPtr p) w++foreign import ccall "peek_flt64" c_peek_flt64 :: Ptr Double -> IO Double+foreign import ccall "poke_flt64" c_poke_flt64 :: Ptr Double -> Double -> IO ()++instance Storable Double where+  sizeOf    _ = 8+  alignment _ = 8+  peek p      = c_peek_flt64 p+  poke p w    = c_poke_flt64 p w++instance Storable CDouble where+  sizeOf    _ = 8+  alignment _ = 8+  peek p      = c_peek_flt64 (castPtr p) `primBind` \d -> primReturn (CDouble d)+  poke p (CDouble w) = c_poke_flt64 (castPtr p) w++foreign import ccall "sizeof_char" c_sizeof_char :: IO Int+foreign import ccall "sizeof_short" c_sizeof_short :: IO Int foreign import ccall "sizeof_int" c_sizeof_int :: IO Int foreign import ccall "sizeof_long" c_sizeof_long :: IO Int foreign import ccall "sizeof_llong" c_sizeof_llong :: IO Int+foreign import ccall "sizeof_size_t" c_sizeof_size_t :: IO Int+charSize :: Int+charSize = primPerformIO c_sizeof_char+shortSize :: Int+shortSize = primPerformIO c_sizeof_short intSize :: Int intSize = primPerformIO c_sizeof_int longSize :: Int longSize = primPerformIO c_sizeof_long llongSize :: Int llongSize = primPerformIO c_sizeof_llong+sizeTSize :: Int+sizeTSize = primPerformIO c_sizeof_size_t++deriving newtype instance Storable IntPtr+deriving newtype instance Storable WordPtr+deriving newtype instance Storable CBool+deriving newtype instance Storable CClock
lib/GHC/Generics.hs view
@@ -1,3 +1,4 @@ -- This is a dummy module so deriving Generic can be spoofed.-module GHC.Generics(Generic) where+module GHC.Generics(Generic, Generic1) where class Generic a+class Generic1 f
− lib/GHC/Stack.hs
@@ -1,9 +0,0 @@--- Copyright 2023 Lennart Augustsson--- See LICENSE file for full license.-module GHC.Stack(HasCallStack(..)) where-import qualified Prelude()              -- do not import Prelude--- So we can import GHC.Stack.--- Sadly, this does not give us stack traces. :(--class HasCallStack-instance HasCallStack
− lib/GHC/Types.hs
@@ -1,4 +0,0 @@--- Copyright 2023 Lennart Augustsson--- See LICENSE file for full license.-module GHC.Types() where-import qualified Prelude()              -- do not import Prelude
− lib/Language/Haskell/TH/Syntax.hs
@@ -1,3 +0,0 @@--- This is a dummy module so deriving Lift can be spoofed.-module Language.Haskell.TH.Syntax(Lift(..)) where-class Lift a
+ lib/Math/NumberTheory/Logarithms.hs view
@@ -0,0 +1,295 @@+-- |+-- Module:      Math.NumberTheory.Logarithms+-- Copyright:   (c) 2011 Daniel Fischer, 2017 Oleg Grenrus, 2025 konsumlamm+-- Licence:     MIT+-- Stability:   Provisional+-- Portability: Non-portable (MicroHs)+--+-- Integer Logarithms.+module Math.NumberTheory.Logarithms+    ( -- * Integer logarithms with input checks+      integerLogBase+    , integerLog2+    , integerLog10++    , naturalLogBase+    , naturalLog2+    , naturalLog10++    , intLog2+    , wordLog2++      -- * Integer logarithms without input checks+      --+      -- | These functions are total, however, don't rely on the values with out-of-domain arguments.+    , integerLogBase'+    , integerLog2'+    , integerLog10'++    , intLog2'+    , wordLog2'+    ) where++import qualified Prelude (); import MiniPrelude+import Data.Bits+import Data.Integer.Internal+import Mhs.UArr+import Numeric.Natural+import Primitives++-- | Calculate the integer logarithm for an arbitrary base.+--   The base must be greater than 1, the second argument, the number+--   whose logarithm is sought, must be positive, otherwise an error is thrown.+--   If @base == 2@, the specialised version is called, which is more+--   efficient than the general algorithm.+--+--   Satisfies:+--+-- > base ^ integerLogBase base m <= m < base ^ (integerLogBase base m + 1)+--+-- for @base > 1@ and @m > 0@.+integerLogBase :: Integer -> Integer -> Int+integerLogBase b n+  | n < 1       = error "Math.NumberTheory.Logarithms.integerLogBase: argument must be positive."+  | n < b       = 0+  | b == 2      = integerLog2' n+  | b < 2       = error "Math.NumberTheory.Logarithms.integerLogBase: base must be greater than one."+  | otherwise   = integerLogBase' b n++-- | Calculate the integer logarithm of an 'Integer' to base 2.+--   The argument must be positive, otherwise an error is thrown.+integerLog2 :: Integer -> Int+integerLog2 n+  | n < 1       = error "Math.NumberTheory.Logarithms.integerLog2: argument must be positive"+  | otherwise   = integerLog2' n++-- | Cacluate the integer logarithm for an arbitrary base.+--   The base must be greater than 1, the second argument, the number+--   whose logarithm is sought, must be positive, otherwise an error is thrown.+--   If @base == 2@, the specialised version is called, which is more+--   efficient than the general algorithm.+--+--   Satisfies:+--+-- > base ^ integerLogBase base m <= m < base ^ (integerLogBase base m + 1)+--+-- for @base > 1@ and @m > 0@.+naturalLogBase :: Natural -> Natural -> Int+naturalLogBase b n+  | n < 1       = error "Math.NumberTheory.Logarithms.naturalLogBase: argument must be positive."+  | n < b       = 0+  | b == 2      = naturalLog2' n+  | b < 2       = error "Math.NumberTheory.Logarithms.naturalLogBase: base must be greater than one."+  | otherwise   = naturalLogBase' b n++-- | Calculate the natural logarithm of an 'Natural' to base 2.+--   The argument must be non-zero, otherwise an error is thrown.+naturalLog2 :: Natural -> Int+naturalLog2 n+  | n < 1       = error "Math.NumberTheory.Logarithms.naturalLog2: argument must be non-zero"+  | otherwise   = naturalLog2' n++-- | Calculate the integer logarithm of an 'Int' to base 2.+--   The argument must be positive, otherwise an error is thrown.+intLog2 :: Int -> Int+intLog2 i+  | i < 1       = error "Math.NumberTheory.Logarithms.intLog2: argument must be positive"+  | otherwise   = intLog2' i++-- | Calculate the integer logarithm of a 'Word' to base 2.+--   The argument must be positive, otherwise an error is thrown.+wordLog2 :: Word -> Int+wordLog2 w+  | w == 0      = error "Math.NumberTheory.Logarithms.wordLog2: argument must not be 0."+  | otherwise   = wordLog2' w++-- | Same as 'integerLog2', but without checks, saves a little time when+--   called often for known good input.+integerLog2' :: Integer -> Int+integerLog2' = log2I++-- | Same as 'naturalLog2', but without checks, saves a little time when+--   called often for known good input.+naturalLog2' :: Natural -> Int+naturalLog2' n = integerLog2' (toInteger n)++-- | Same as 'intLog2', but without checks, saves a little time when+--   called often for known good input.+intLog2' :: Int -> Int+intLog2' i = wordLog2' (primIntToWord i)++-- | Same as 'wordLog2', but without checks, saves a little time when+--   called often for known good input.+wordLog2' :: Word -> Int+wordLog2' w = _wordSize - 1 - primWordClz w++-- | Calculate the integer logarithm of an 'Integer' to base 10.+--   The argument must be positive, otherwise an error is thrown.+integerLog10 :: Integer -> Int+integerLog10 n+  | n < 1     = error "Math.NumberTheory.Logarithms.integerLog10: argument must be positive"+  | otherwise = integerLog10' n++-- | Calculate the integer logarithm of an 'Integer' to base 10.+--   The argument must be not zero, otherwise an error is thrown.+naturalLog10 :: Natural -> Int+naturalLog10 n+  | n < 1     = error "Math.NumberTheory.Logarithms.naturalLog10: argument must be non-zero"+  | otherwise = naturalLog10' n++-- | Same as 'integerLog10', but without a check for a positive+--   argument. Saves a little time when called often for known good+--   input.+integerLog10' :: Integer -> Int+integerLog10' n+  | n < 10      = 0+  | n < 100     = 1+  | otherwise   = ex + integerLog10' (n `quot` 10 ^ ex)+    where+      ln = integerLog2' n+      -- u/v is a good approximation of log 2/log 10+      u  = 1936274+      v  = 6432163+      -- so ex is a good approximation to integerLogBase 10 n+      ex = fromInteger ((u * fromIntegral ln) `quot` v)++-- | Same as 'naturalLog10', but without a check for a positive+--   argument. Saves a little time when called often for known good+--   input.+naturalLog10' :: Natural -> Int+naturalLog10' n+  | n < 10      = 0+  | n < 100     = 1+  | otherwise   = ex + naturalLog10' (n `quot` 10 ^ ex)+    where+      ln = naturalLog2' n+      -- u/v is a good approximation of log 2/log 10+      u  = 1936274+      v  = 6432163+      -- so ex is a good approximation to naturalLogBase 10 n+      ex = fromInteger ((u * fromIntegral ln) `quot` v)++-- | Same as 'integerLogBase', but without checks, saves a little time when+--   called often for known good input.+integerLogBase' :: Integer -> Integer -> Int+integerLogBase' b n+  | n < b       = 0+  | ln-lb < lb  = 1     -- overflow safe version of ln < 2*lb, implies n < b*b+  | b < 33      = let bi = fromInteger b+                      ix = 2*bi-4+                      -- u/v is a good approximation of log 2/log b+                      u  = logArr `unsafeAt` ix+                      v  = logArr `unsafeAt` (ix+1)+                      -- hence ex is a rather good approximation of integerLogBase b n+                      -- most of the time, it will already be exact+                      ex = fromInteger ((fromIntegral u * fromIntegral ln) `quot` fromIntegral v)+                  in case u of+                      1 -> ln `quot` v      -- a power of 2, easy+                      _ -> ex + integerLogBase' b (n `quot` b ^ ex)+  | otherwise   = let -- shift b so that 16 <= bi < 32+                      bi = fromInteger (b `shiftR` (lb-4))+                      -- we choose an approximation of log 2 / log (bi+1) to+                      -- be sure we underestimate+                      ix = 2*bi-2+                      -- u/w is a reasonably good approximation to log 2/log b+                      -- it is too small, but not by much, so the recursive call+                      -- should most of the time be caught by one of the first+                      -- two guards unless n is huge, but then it'd still be+                      -- a call with a much smaller second argument.+                      u  = fromIntegral $ logArr `unsafeAt` ix+                      v  = fromIntegral $ logArr `unsafeAt` (ix+1)+                      w  = v + u*fromIntegral (lb-4)+                      ex = fromInteger ((u * fromIntegral ln) `quot` w)+                  in ex + integerLogBase' b (n `quot` b ^ ex)+    where+      lb = integerLog2' b+      ln = integerLog2' n++-- | Same as 'naturalLogBase', but without checks, saves a little time when+--   called often for known good input.+naturalLogBase' :: Natural -> Natural -> Int+naturalLogBase' b n+  | n < b       = 0+  | ln-lb < lb  = 1     -- overflow safe version of ln < 2*lb, implies n < b*b+  | b < 33      = let bi = fromIntegral b+                      ix = 2*bi-4+                      -- u/v is a good approximation of log 2/log b+                      u  = logArr `unsafeAt` ix+                      v  = logArr `unsafeAt` (ix+1)+                      -- hence ex is a rather good approximation of integerLogBase b n+                      -- most of the time, it will already be exact+                      ex = fromNatural ((fromIntegral u * fromIntegral ln) `quot` fromIntegral v)+                  in case u of+                      1 -> ln `quot` v      -- a power of 2, easy+                      _ -> ex + naturalLogBase' b (n `quot` b ^ ex)+  | otherwise   = let -- shift b so that 16 <= bi < 32+                      bi = fromNatural (b `shiftR` (lb-4))+                      -- we choose an approximation of log 2 / log (bi+1) to+                      -- be sure we underestimate+                      ix = 2*bi-2+                      -- u/w is a reasonably good approximation to log 2/log b+                      -- it is too small, but not by much, so the recursive call+                      -- should most of the time be caught by one of the first+                      -- two guards unless n is huge, but then it'd still be+                      -- a call with a much smaller second argument.+                      u  = fromIntegral $ logArr `unsafeAt` ix+                      v  = fromIntegral $ logArr `unsafeAt` (ix+1)+                      w  = v + u*fromIntegral (lb-4)+                      ex = fromNatural ((u * fromIntegral ln) `quot` w)+                  in ex + naturalLogBase' b (n `quot` b ^ ex)+    where+      lb = naturalLog2' b+      ln = naturalLog2' n++-- Lookup table for logarithms of 2 <= k <= 32+-- In each row "x , y", x/y is a good rational approximation of log 2  / log k.+-- For the powers of 2, it is exact, otherwise x/y < log 2/log k, since we don't+-- want to overestimate integerLogBase b n = floor $ (log 2/log b)*logBase 2 n.+logArr :: UArr Int+logArr = newUArr 62 $ zip [0..]+          [ 1 , 1,+            190537 , 301994,+            1 , 2,+            1936274 , 4495889,+            190537 , 492531,+            91313 , 256348,+            1 , 3,+            190537 , 603988,+            1936274 , 6432163,+            1686227 , 5833387,+            190537 , 683068,+            5458 , 20197,+            91313 , 347661,+            416263 , 1626294,+            1 , 4,+            32631 , 133378,+            190537 , 794525,+            163451 , 694328,+            1936274 , 8368437,+            1454590 , 6389021,+            1686227 , 7519614,+            785355 , 3552602,+            190537 , 873605,+            968137 , 4495889,+            5458 , 25655,+            190537 , 905982,+            91313 , 438974,+            390321 , 1896172,+            416263 , 2042557,+            709397 , 3514492,+            1 , 5+          ]++-------------------------------------------------------------------------------+-- Unsafe+-------------------------------------------------------------------------------++unsafeAt :: UArr Int -> Int -> Int+unsafeAt = unsafeReadUArr++-------------------------------------------------------------------------------+-- Natural helpers+-------------------------------------------------------------------------------++fromNatural :: Num a => Natural -> a+fromNatural = fromIntegral
+ lib/Mhs/Arr.hs view
@@ -0,0 +1,51 @@+module Mhs.Arr(+  Arr(..),+  newArr,+  sizeArr,+  unsafeReadArr,+  copyArr,+  unsafeFreezeMutSTArr,+  unsafeThawSTArr,+  unsafeFreezeMutIOArr,+  unsafeThawIOArr,+  ) where+import qualified Prelude(); import MiniPrelude+import Primitives(primPerformIO, primArrSize)+import Control.Monad.ST+import Control.Monad.ST_Type+import Data.ByteString(copy)+import Data.ByteString.Internal+import Foreign.ForeignPtr+import Foreign.Ptr+import Foreign.Storable+import Mhs.MutArr++newtype Arr a = Arr (MutIOArr a)++newArr :: forall a . Int -> [(Int, a)] -> Arr a+newArr n ies = primPerformIO $ do+  let undef = error "undefined array element"+  a <- newMutIOArr n undef+  mapM_ (uncurry (unsafeWriteMutIOArr a)) ies+  unsafeFreezeMutIOArr a++sizeArr :: Arr a -> Int+sizeArr (Arr a) = primPerformIO $ primArrSize a++unsafeReadArr :: Arr a -> Int -> a+unsafeReadArr (Arr a) i = primPerformIO $ unsafeReadMutIOArr a i++copyArr :: Arr a -> Arr a+copyArr (Arr a) = primPerformIO $ Arr <$> copyMutIOArr a++unsafeFreezeMutSTArr :: MutSTArr s a -> ST s (Arr a)+unsafeFreezeMutSTArr (MutSTArr a) = return (Arr a)++unsafeThawSTArr :: Arr a -> ST s (MutSTArr s a)+unsafeThawSTArr (Arr a) = return (MutSTArr a)++unsafeFreezeMutIOArr :: MutIOArr a -> IO (Arr a)+unsafeFreezeMutIOArr a = return (Arr a)++unsafeThawIOArr :: Arr a -> IO (MutIOArr a)+unsafeThawIOArr (Arr a) = return a
+ lib/Mhs/Array.hs view
@@ -0,0 +1,219 @@+module Mhs.Array(+  module Data.Ix,+  Array(..),+  array,+  listArray,+  accumArray,+  (!),+  bounds,+  indices,+  elems,+  assocs,+  (//),+  accum,+  ixmap,+  -----+  numElements,+  safeRangeSize,+  safeIndex,+  unsafeArray,+  unsafeAt,+  unsafeReplace,+  unsafeAccum,+--  freezeIOArray,+  ) where+import qualified Prelude()+import Primitives(primPerformIO, primArrCopy, primArrEQ)+import Control.Error+import Control.Monad+import Data.Bool+import Data.Char+import Data.Enum+import Data.Eq+import Data.Foldable(Foldable(..))+import Data.Function+import Data.Functor+import Data.Int.Int+import Data.Ix+import Data.List as List+import Data.Num+import Data.Ord+import Data.Traversable(Traversable(traverse))+import Data.Tuple+import Mhs.MutArr+import {-# SOURCE #-} Data.Typeable+import System.IO.Base+import Text.ParserCombinators.ReadPrec+import Text.Read.Internal+import qualified Text.Read.Lex as L+import Text.Show++data Array i a+   = Array (i,i)        -- bounds+           !Int         -- = (rangeSize (l,u))+           (MutIOArr a) -- elements++instance Ix a => Functor (Array a) where+  fmap f a@(Array b _ _) = array b [(i, f (a ! i)) | i <- range b]++instance (Ix a, Eq b)  => Eq (Array a b) where+  (==) (Array b1 _ a1) (Array b2 _ a2) = b1 == b2 && primArrEQ a1 a2++instance (Ix a, Ord b) => Ord (Array a b) where+  compare arr1 arr2 = compare (assocs arr1) (assocs arr2)++instance Foldable (Array i) where+  foldr f b0 arr@(Array _ n _) =+    let+      go i | i == n = b0+           | e <- unsafeAt arr i = f e (go (i + 1))+    in go 0+  foldl f b0 arr@(Array _ n _) =+    let+      go i | i == -1 = b0+           | e <- unsafeAt arr i = f (go (i - 1)) e+    in go (n - 1)+  foldr' f b0 arr@(Array _ n _) =+    let+      go i a | i == -1 = a+             | e <- unsafeAt arr i = go (i - 1) (f e $! a)+    in go (n - 1) b0+  foldl' f b0 arr@(Array _ n _) =+    let+      go i a | i == n = a+             | e <- unsafeAt arr i = go (i + 1) (a `seq` f a e)+    in go 0 b0+  foldl1 f arr@(Array _ n _) =+    let+      go i | i == 0 = unsafeAt arr 0+           | e <- unsafeAt arr i = f (go (i - 1)) e+    in if n == 0 then error "foldl1: empty Array" else go (n - 1)+  foldr1 f arr@(Array _ n _) =+    let+      go i | i == n - 1 = unsafeAt arr i+           | e <- unsafeAt arr i = f e (go (i + 1))+    in if n == 0 then error "foldr1: empty Array" else go 0+  toList = elems+  length = numElements+  null a = numElements a == 0++instance Ix i => Traversable (Array i) where+  traverse f arr = listArray (bounds arr) `fmap` traverse f (elems arr)++instance (Ix a, Show a, Show b) => Show (Array a b) where+  showsPrec p a =+    showParen (p > appPrec) $+    showString "array " .+    showsPrec appPrec1 (bounds a) .+    showChar ' ' .+    showsPrec appPrec1 (assocs a)++instance (Ix a, Read a, Read b) => Read (Array a b)  where+    readPrec = parens $ prec appPrec $+               do expectP (L.Ident "array")+                  theBounds <- step readPrec+                  vals   <- step readPrec+                  return (array theBounds vals)++    readListPrec = readListPrecDefault+    readList     = readListDefault++array :: (Ix a) => (a,a) -> [(a,b)] -> Array a b+array b ies =+  let n = safeRangeSize b+  in  unsafeArray' b n [(safeIndex b n i, e) | (i, e) <- ies]++listArray  :: (Ix a) => (a,a) -> [b] -> Array a b+listArray b es =+  let n = safeRangeSize b+  in  if List.length es > n then error "listArray: list too long" else unsafeArray' b n (zip [0..] es)++accumArray :: (Ix a) => (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b+accumArray f z b = accum f (array b [(i, z) | i <- range b])++(!) :: (Ix a) => Array a b -> a -> b+(!) arr@(Array b n _) i = unsafeAt arr (safeIndex b n i)++unsafeAt :: Array a b -> Int -> b+unsafeAt (Array _ _ a) i = primPerformIO $ unsafeReadMutIOArr a i++bounds :: Array a b -> (a,a)+bounds (Array b _ _) = b++numElements :: Array a b -> Int+numElements (Array _ n _) = n++indices :: (Ix a) => Array a b -> [a]+indices (Array b _ _) = range b++elems :: Array a b -> [b]+elems (Array _ _ a) = primPerformIO $ elemsIOArr a++assocs :: (Ix a) => Array a b -> [(a,b)]+assocs a = zip (indices a) (elems a)++(//) :: (Ix a) => Array a b -> [(a,b)] -> Array a b+(//) arr@(Array b n _) ies = unsafeReplace arr [(safeIndex b n i, e) | (i, e) <- ies ]++unsafeReplace :: Array a b -> [(Int,b)] -> Array a b+unsafeReplace (Array b n oa) ies = primPerformIO $ do+  a <- primArrCopy oa+  let adj (i, e) = unsafeWriteMutIOArr a i e+  mapM_ adj ies+  return $ Array b n a++accum :: (Ix a) => (b -> c -> b) -> Array a b -> [(a,c)] -> Array a b+accum f arr@(Array b n _) ies = unsafeAccum f arr [(safeIndex b n i, e) | (i, e) <- ies]++ixmap :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c -> Array a c+ixmap b f a = array b [(i, a ! f i) | i <- range b]++-------++unsafeAccum :: (e -> a -> e) -> Array i e -> [(Int, a)] -> Array i e+unsafeAccum f (Array b n oa) ies = primPerformIO $ do+  a <- primArrCopy oa+  let adj (i, e) = do+        x <- unsafeReadMutIOArr a i+        let x' = f x e+        seq x' (unsafeWriteMutIOArr a i x')+  mapM_ adj ies+  return $ Array b n a++unsafeArray :: Ix i => (i,i) -> [(Int, e)] -> Array i e+unsafeArray lu ies = unsafeArray' lu (unsafeRangeSize lu) ies++unsafeArray' :: (i,i) -> Int -> [(Int, e)] -> Array i e+unsafeArray' b n ies = primPerformIO $ do+  a <- newMutIOArr n arrEleBottom+  mapM_ (uncurry (unsafeWriteMutIOArr a)) ies+  return $ Array b n a++arrEleBottom :: a+arrEleBottom = error "(Array.!): undefined array element"++safeIndex :: Ix i => (i, i) -> Int -> i -> Int+safeIndex (l,u) n i | 0 <= i' && i' < n = i'+                    | otherwise         = badSafeIndex i' n+  where i' = index (l,u) i++badSafeIndex :: Int -> Int -> a+badSafeIndex i n = error $ ("Error in array index; "::String) ++ show i ++ (" not in range [0.."::String) ++ show n ++ (")"::String)++safeRangeSize :: Ix i => (i, i) -> Int+safeRangeSize b =+  let r = rangeSize b+  in  if r < 0 then error "Negative range size" else r++elemsIOArr :: forall a . MutIOArr a -> IO [a]+elemsIOArr a = do+  s <- sizeMutIOArr a+  mapM (unsafeReadMutIOArr a) [0::Int .. s - 1]++{-+freezeIOArray :: IOArray a -> IO (Array Int a)+freezeIOArray ioa = do+  s <- sizeIOArray ioa+  ioa' <- primArrCopy ioa+  return $ Array (0, s-1) s ioa'+-}
lib/Mhs/Builtin.hs view
@@ -1,45 +1,115 @@--- Copyright 2023 Lennart Augustsson+-- Copyright 2023-2025 Lennart Augustsson -- See LICENSE file for full license. module Mhs.Builtin(   module Control.Monad,+  module Control.Monad.Fail,+  module Control.Monad.Fix,   module Data.Bool,   module Data.Char,   module Data.Coerce,+  module Data.Data_Class,   module Data.Enum,   module Data.Eq,+--  module Data.Foldable,   module Data.Fractional,   module Data.Function,+  module Data.Functor,   module Data.Ord,   module Data.Num,   module Data.Records,   module Data.Typeable,-  module Data.Semigroup,+  module Data.Monoid.Internal,   module Data.String,+  module Text.ParserCombinators.ReadPrec,+  module Text.Read.Internal,+  module Text.Read.Lex,   module Text.Show,+  module Mhs.Builtin,   ) where -- -- These are the identifiers that can be generated by the compiler,--- so the always have to be in scope.+-- so they always have to be in scope. -- In the compiler this module is treated specially, it is imported--- qualified with the name B@, this ways these names are always available+-- qualified with the name B@, this way these names are always available -- qualified, but under a name that cannot be used accidentally. -- If the Prelude is not imported, then neither is this module.-import qualified Prelude()+import qualified Prelude()  -- no Prelude+import Control.Applicative(Applicative((<*>))) import Control.Error(error) import Control.Monad(Monad(..)) import Control.Monad.Fail(MonadFail(..))+import {-# SOURCE #-} Control.Monad.Fix(_mfix) import Data.Bool((&&), Bool(..)) import Data.Char(Char) import Data.Coerce(Coercible, coerce)+import Data.Data_Class(Data(..), Fixity(..), mkDataType, mkConstrTag, constrIndex) import Data.Enum(Enum(enumFrom, enumFromThen, enumFromTo, enumFromThenTo)) import Data.Eq(Eq(..))+--import Data.Foldable(Foldable(..))+import qualified Data.Foldable import Data.Fractional(Fractional(fromRational))-import Data.Function((.))+import Data.Function((.), id, flip)+import Data.Functor(Functor(..), (<$>)) import Data.Ord(Ord(..), Ordering(..))-import Data.Num(Num(fromInteger, negate))+import Data.Num(Num((+), (-), (*), fromInteger, negate)) import Data.Proxy(Proxy(..))-import Data.Semigroup(Semigroup(..))+import Data.Monoid.Internal(Semigroup(..)) import Data.String(IsString(..)) import Data.Records(HasField(..), SetField(..), composeSet)-import {-# SOURCE #-} Data.Typeable(Typeable(..), mkTyConApp, mkTyCon)+import Data.Traversable(Traversable(..))+import {-# SOURCE #-} Data.Typeable(Typeable(..), _mkTyCon, gcast1, gcast2)+import Text.ParserCombinators.ReadPrec((+++), pfail, prec, step, reset)+import Text.Read.Internal(Read(..), readListDefault, readListPrecDefault, parens, expectP, readField)+import Text.Read.Lex(Lexeme(..)) import Text.Show(Show(..), showString, showParen)++-- Types to fake unboxed sums+data USum2 a0 a1 = USum2_0 a0 | USum2_1 a1+data USum3 a0 a1 a2 = USum3_0 a0 | USum3_1 a1 | USum3_2 a2+data USum4 a0 a1 a2 a3 = USum4_0 a0 | USum4_1 a1 | USum4_2 a2 | USum4_3 a3++-- Types to fake unboxed tuples+data UProd0 = UProd0+newtype UProd1 a0 = UProd1 a0+data UProd2 a0 a1 = UProd2 a0 a1+data UProd3 a0 a1 a2 = UProd3 a0 a1 a2+data UProd4 a0 a1 a2 a3 = UProd4 a0 a1 a2 a3++-- Functions used for deriving Foldable+ffoldr :: Data.Foldable.Foldable f => (a -> b -> b) -> f a -> b -> b+ffoldr f = flip (Data.Foldable.foldr f)++flipConst :: a -> b -> b+flipConst _ b = b++foldTuple2 :: (a1 -> b -> b) -> (a2 -> b -> b) -> (a1, a2) -> b -> b+foldTuple2 f1 f2 (a1, a2) z = f1 a1 (f2 a2 z)++foldTuple3 :: (a1 -> b -> b) -> (a2 -> b -> b) -> (a3 -> b -> b) -> (a1, a2, a3) -> b -> b+foldTuple3 f1 f2 f3 (a1, a2, a3) z = f1 a1 (f2 a2 (f3 a3 z))++foldTuple4 :: (a1 -> b -> b) -> (a2 -> b -> b) -> (a3 -> b -> b) -> (a4 -> b -> b) -> (a1, a2, a3, a4) -> b -> b+foldTuple4 f1 f2 f3 f4 (a1, a2, a3, a4) z = f1 a1 (f2 a2 (f3 a3 (f4 a4 z)))++-- Functions used for deriving Functor+fmapTuple2 :: (a1 -> b1) -> (a2 -> b2) -> (a1, a2) -> (b1, b2)+fmapTuple2 f1 f2 (a1, a2) = (f1 a1, f2 a2)++fmapTuple3 :: (a1 -> b1) -> (a2 -> b2) -> (a3 -> b3) -> (a1, a2, a3) -> (b1, b2, b3)+fmapTuple3 f1 f2 f3 (a1, a2, a3) = (f1 a1, f2 a2, f3 a3)++fmapTuple4 :: (a1 -> b1) -> (a2 -> b2) -> (a3 -> b3) -> (a4 -> b4) -> (a1, a2, a3, a4) -> (b1, b2, b3, b4)+fmapTuple4 f1 f2 f3 f4 (a1, a2, a3, a4) = (f1 a1, f2 a2, f3 a3, f4 a4)++-- Functions used for deriving Traversable+travTuple2 :: Applicative f =>+              (a1 -> f b1) -> (a2 -> f b2) -> (a1, a2) -> f (b1, b2)+travTuple2 f1 f2 (a1, a2) = (,) <$> f1 a1 <*> f2 a2++travTuple3 :: Applicative f =>+              (a1 -> f b1) -> (a2 -> f b2) -> (a3 -> f b3) -> (a1, a2, a3) -> f (b1, b2, b3)+travTuple3 f1 f2 f3 (a1, a2, a3) = (,,) <$> f1 a1 <*> f2 a2 <*> f3 a3++travTuple4 :: Applicative f =>+              (a1 -> f b1) -> (a2 -> f b2) -> (a3 -> f b3) -> (a4 -> f b4) -> (a1, a2, a3, a4) -> f (b1, b2, b3, b4)+travTuple4 f1 f2 f3 f4 (a1, a2, a3, a4) = (,,,) <$> f1 a1 <*> f2 a2 <*> f3 a3 <*> f4 a4
+ lib/Mhs/MutArr.hs view
@@ -0,0 +1,49 @@+-- Temporary module+module Mhs.MutArr(module Mhs.MutArr, MutIOArr) where+import qualified Prelude(); import MiniPrelude              -- do not import Prelude+import Primitives(Int, IO, IOArray, primArrAlloc, primArrSize, primArrRead, primArrWrite, primArrCopy, primArrTrunc)+import Control.Monad.ST_Type+import Mhs.Builtin++-- primitive IOArray+type MutIOArr a = IOArray a++newMutIOArr :: forall a . Int -> a -> IO (MutIOArr a)+newMutIOArr = primArrAlloc++sizeMutIOArr :: forall a . MutIOArr a -> IO Int+sizeMutIOArr = primArrSize++unsafeReadMutIOArr :: forall a . MutIOArr a -> Int -> IO a+unsafeReadMutIOArr = primArrRead++unsafeWriteMutIOArr :: forall a . MutIOArr a -> Int -> a -> IO ()+unsafeWriteMutIOArr = primArrWrite++copyMutIOArr :: forall a . MutIOArr a -> IO (MutIOArr a)+copyMutIOArr = primArrCopy++shrinkMutIOArr :: forall a . MutIOArr a -> Int -> IO ()+shrinkMutIOArr = primArrTrunc++----------------++newtype MutSTArr s a = MutSTArr (MutIOArr a)++newMutSTArr :: forall s a . Int -> a -> ST s (MutSTArr s a)+newMutSTArr n a = ST $ MutSTArr <$> newMutIOArr n a++sizeMutSTArr :: forall s a . MutSTArr s a -> ST s Int+sizeMutSTArr (MutSTArr a) = ST $ sizeMutIOArr a++unsafeReadMutSTArr :: forall s a . MutSTArr s a -> Int -> ST s a+unsafeReadMutSTArr (MutSTArr a) i = ST $ unsafeReadMutIOArr a i++unsafeWriteMutSTArr :: forall s a . MutSTArr s a -> Int -> a -> ST s ()+unsafeWriteMutSTArr (MutSTArr a) i x = ST $ unsafeWriteMutIOArr a i x++copyMutSTArr :: forall s a . MutSTArr s a -> ST s (MutSTArr s a)+copyMutSTArr (MutSTArr a) = ST $ MutSTArr <$> copyMutIOArr a++shrinkMutSTArr :: forall s a . MutSTArr s a -> Int -> ST s ()+shrinkMutSTArr (MutSTArr a) n = ST $ shrinkMutIOArr a n
+ lib/Mhs/MutUArr.hs view
@@ -0,0 +1,53 @@+module Mhs.MutUArr(+  MutSTUArr(..),+  newMutSTUArr,+  newMutSTUArrB,+  unsafeReadMutSTUArr,+  unsafeWriteMutSTUArr,+  MutIOUArr(..),+  newMutIOUArr,+  newMutIOUArrB,+  unsafeReadMutIOUArr,+  unsafeWriteMutIOUArr,+  sameByteString,+  withMutIOUArr,+  ) where+import qualified Prelude(); import MiniPrelude+import Control.Monad.ST+import Control.Monad.ST_Type+import Data.ByteString.Internal+import Data.Word.Word8(Word8)+import Foreign.ForeignPtr+import Foreign.Ptr+import Foreign.Storable++newtype MutSTUArr s a = MutSTUArr (MutIOUArr a)++newMutSTUArrB :: forall s a . (Storable a) => Word8 -> Int -> ST s (MutSTUArr s a)+newMutSTUArrB b n = ST $ MutSTUArr <$> newMutIOUArrB b n++newMutSTUArr :: forall s a . (Storable a) => Int -> ST s (MutSTUArr s a)+newMutSTUArr n = ST $ MutSTUArr <$> newMutIOUArr n++unsafeReadMutSTUArr :: (Storable a) => MutSTUArr s a -> Int -> ST s a+unsafeReadMutSTUArr (MutSTUArr bs) i = ST $ unsafeReadMutIOUArr bs i++unsafeWriteMutSTUArr :: (Storable a) => MutSTUArr s a -> Int -> a -> ST s ()+unsafeWriteMutSTUArr (MutSTUArr bs) i a = ST $ unsafeWriteMutIOUArr bs i a++newtype MutIOUArr a = MutIOUArr ByteString++newMutIOUArrB :: forall a . (Storable a) => Word8 -> Int -> IO (MutIOUArr a)+newMutIOUArrB b n = return (MutIOUArr (primBSreplicate (n * sizeOf (undefined :: a)) b))++newMutIOUArr :: forall a . (Storable a) => Int -> IO (MutIOUArr a)+newMutIOUArr = newMutIOUArrB 0++unsafeReadMutIOUArr :: (Storable a) => MutIOUArr a -> Int -> IO a+unsafeReadMutIOUArr arr i = withMutIOUArr arr $ \ p -> peekElemOff p i++unsafeWriteMutIOUArr :: (Storable a) => MutIOUArr a -> Int -> a -> IO ()+unsafeWriteMutIOUArr arr i a = withMutIOUArr arr $ \ p -> pokeElemOff p i a++withMutIOUArr :: MutIOUArr a -> (Ptr a -> IO b) -> IO b+withMutIOUArr (MutIOUArr bs) act = withForeignPtr (primBS2FPtr bs) (act . castPtr)
+ lib/Mhs/Reflect.hs view
@@ -0,0 +1,101 @@+module Mhs.Reflect where+import Data.Int+import Data.Word+import System.IO.Serialize+import System.IO.StringHandle++newtype Exp a = Exp UExp+  deriving (Eq, Show)++type Label = Int++data UExp+  = App UExp UExp+  | Lit Literal+  | Lbl Label UExp+  | Ref Label+  deriving (Eq, Show)++data Literal+  = Prim    String+  | Int     Int+  | Int64   Int64+  | Integer Integer+  | Bytes   [Word8]+  | Float   Float+  | Double  Double+  deriving (Eq, Show)++reflect :: a -> IO (Exp a)+reflect a = Exp . parse . dropHeader <$> handleWriteToString (\ h -> hSerialize h a)++-- The first two lines are version and number of definitions+dropHeader = dropWhile (/= '\n') . drop 1 . dropWhile (/= '\n')++str :: a -> IO String+str a = handleWriteToString (\ h -> hSerialize h a)++parse :: String -> UExp+parse = parseStk []+  where+    nonSP c = c /= ' ' && c /= '\n'+    lit stk con cs =+      case span nonSP cs of+        (p, cs') -> parseStk (Lit (con p) : stk) cs'+    parseStk stk [] = error "parse: EOF"+    parseStk stk (c:cs) =+      case c of+        ' '  -> parseStk stk cs+        '\n' -> parseStk stk cs+        '@'  -> case stk of+                  x:y:stk' -> parseStk (App y x : stk') cs+                  _ -> error "parse: App"+        '}'  -> case stk of+                  [x] -> x+                  _ -> error "parse: }"+        '%' -> lit stk (Integer . read) cs+        '&' | '&':cs' <- cs -> lit stk (Float  . read) cs'+            | otherwise     -> lit stk (Double . read) cs+        '#' | '#':cs' <- cs -> lit stk (Int64  . read) cs'+            | otherwise     -> lit stk (Int    . read) cs+        '[' -> undefined -- array+        '_' ->+          case span nonSP cs of+            (l, cs') -> parseStk (Ref (read l) : stk) cs'+        ':' ->+          case span nonSP cs of+            (l, cs') ->+              case stk of+                x : stk' -> parseStk (Lbl (read l) x : stk') cs'+                _ -> error "parse: :"+        '"' ->+          case getString cs of+            (s, cs') -> parseStk (Lit (Bytes s) : stk) cs'+        '^' -> undefined -- FFI+        ';' -> undefined -- C function pointer+        _   -> lit stk Prim (c:cs)+          +    getString :: String -> ([Word8], String)+    getString = get []+      where+        get :: [Word8] -> String -> ([Word8], String)+        get _ [] = error "getString"+        get bs ('"':cs) = (reverse bs, cs)+        get bs ('\\':'?':cs) = get (0x7f : bs) cs+        get bs ('\\':'_':cs) = get (0xff : bs) cs+        get bs ('\\':  c:cs) = get (byte c : bs) cs+        get bs ('^':c:cs)    = get (b : bs) cs+          where b | d < 0x40  =  d `rem` 0x20+                  | otherwise = (d `rem` 0x20) + 0x80+                d = byte c+        get bs ('|':c:cs)    = get (byte c + 0x80 : bs) cs+        get bs (c:cs)        = get (byte c : bs) cs+    byte :: Char -> Word8+    byte = fromIntegral . fromEnum++main :: IO ()+main = do+  let f x = x+1 :: Int+  print (f 5)+  x <- reflect (f)+  print x
+ lib/Mhs/UArr.hs view
@@ -0,0 +1,48 @@+module Mhs.UArr(+  UArr(..),+  newUArr,+  unsafeReadUArr,+  copyUArr,+  unsafeFreezeMutSTUArr,+  unsafeThawSTUArr,+  unsafeFreezeMutIOUArr,+  unsafeThawIOUArr,+  ) where+import qualified Prelude(); import MiniPrelude+import Primitives(primPerformIO)+import Control.Monad.ST+import Control.Monad.ST_Type+import Data.ByteString(copy)+import Data.ByteString.Internal+import Foreign.ForeignPtr+import Foreign.Ptr+import Foreign.Storable+import Mhs.MutUArr++newtype UArr a = UArr ByteString++newUArr :: forall s a . (Storable a) => Int -> [(Int, a)] -> UArr a+newUArr n ies = runST $ do+  a <- newMutSTUArr n+  mapM_ (uncurry (unsafeWriteMutSTUArr a)) ies+  unsafeFreezeMutSTUArr a++unsafeReadUArr :: (Storable a) => UArr a -> Int -> a+unsafeReadUArr (UArr bs) i = primPerformIO $+  withForeignPtr (primBS2FPtr bs) $ \ p ->+    peekElemOff (castPtr p) i++copyUArr :: UArr a -> UArr a+copyUArr (UArr a) = UArr (copy a)++unsafeFreezeMutSTUArr :: MutSTUArr s a -> ST s (UArr a)+unsafeFreezeMutSTUArr (MutSTUArr (MutIOUArr a)) = return (UArr a)++unsafeThawSTUArr :: UArr a -> ST s (MutSTUArr s a)+unsafeThawSTUArr (UArr a) = return (MutSTUArr (MutIOUArr a))++unsafeFreezeMutIOUArr :: MutIOUArr a -> IO (UArr a)+unsafeFreezeMutIOUArr (MutIOUArr a) = return (UArr a)++unsafeThawIOUArr :: UArr a -> IO (MutIOUArr a)+unsafeThawIOUArr (UArr a) = return (MutIOUArr a)
lib/MiniPrelude.hs view
@@ -10,7 +10,7 @@   module Data.Function,   module Data.Functor,   module Data.Ord,-  module Data.Int,+  module Data.Int.Int,   module Data.Integral,   module Data.List,   module Data.Maybe,@@ -19,9 +19,10 @@   module Data.Records,   module Data.String,   module Data.Tuple,-  module System.IO,+  module Data.Typeable,+  module System.IO.Base,   module Text.Show,-  usingMhs, _wordSize, _isWindows,+  _usingMhs, _wordSize, _isWindows,   ) where import qualified Prelude() import Control.Applicative(Applicative(..))@@ -35,7 +36,7 @@ import Data.Function import Data.Functor import Data.Ord-import Data.Int+import Data.Int.Int import Data.Integral import Data.List([](..), map, (++), filter, head, last, tail, init, null, length, (!!),                  reverse, foldl, foldl1, foldr, foldr1, and, or, any, all,@@ -50,13 +51,14 @@ import Data.Records import Data.String import Data.Tuple-import System.IO(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,-                 FilePath, readFile, writeFile, appendFile,-                 cprint, cuprint)+import {-# SOURCE #-} Data.Typeable+import System.IO.Base(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,+                      FilePath, readFile, writeFile, appendFile,+                      cprint, cuprint) import Text.Show(Show(..), ShowS, shows, showChar, showString, showParen) import Text.Show import Primitives(_wordSize, _isWindows)  -- So we can detect mhs vs ghc-usingMhs :: Bool-usingMhs = True+_usingMhs :: Bool+_usingMhs = True
lib/Numeric.hs view
@@ -1,14 +1,88 @@ module Numeric(-  module Numeric.Show,-+  showSigned,+  showIntAtBase,+  showInt,+  showBin,+  showHex,+  showOct,+  showEFloat,--+  showFFloat,+  showGFloat,+  showFloat,+  floatToDigits,   readSigned,   readInt,   readBin,   readDec,   readOct,   readHex,-  readIntegral,+  readFloat,+  lexDigits,+  fromRat,   ) where-import qualified Prelude()              -- do not import Prelude+import qualified Prelude(); import MiniPrelude+import Data.Fractional+import Data.Integer_Type+import Data.Ratio+import Data.Ratio_Type+import Data.Real+import Data.RealFloat+import Data.RealFrac+import Math.NumberTheory.Logarithms+import Numeric.FormatFloat import Numeric.Read import Numeric.Show+import Text.ParserCombinators.ReadP (ReadP, pfail, readP_to_S)+import Text.Read.Internal (ReadS, lexDigits)+import qualified Text.Read.Lex as L++-- | Reads an /unsigned/ 'RealFrac' value,+-- expressed in decimal scientific notation.+readFloat :: RealFrac a => ReadS a+readFloat = readP_to_S readFloatP++readFloatP :: RealFrac a => ReadP a+readFloatP =+  do tok <- L.lex+     case tok of+       L.Number n -> return $ fromRational $ L.numberToRational n+       _          -> pfail++-- | Converts a 'Rational' value into any type in class 'RealFloat'.+fromRat :: (RealFloat a) => Rational -> a++-- Deal with special cases first, delegating the real work to fromRat'+fromRat (n :% 0) | n > 0     =   1/0       -- +Infinity+                 | n < 0     = -(1/0)      -- -Infinity+                 | otherwise =   0/0       -- NaN++fromRat (n :% d) | n > 0     = fromRat' (n :% d)+                 | n < 0     = - fromRat' ((-n) :% d)+                 | otherwise = encodeFloat 0 0             -- Zero++fromRat' :: (RealFloat a) => Rational -> a+-- Invariant: argument is strictly positive+fromRat' x = r+  where+    n = numerator x+    d = denominator x+    b = floatRadix r+    p = floatDigits r+    (minExp, _) = floatRange r+    maxVal = b ^ p+    r =+      if n < maxVal && d < maxVal then+        -- no scaling needed+        fromInteger n / fromInteger d+      else+        let+          ln = integerLogBase b n+          ld = integerLogBase b d+          -- b^(ln-ld-1) < x < b^(ln-ld+1)+          p0 = max (ln - ld) minExp - p+          f = if p0 < 0 then 1 :% (b ^ (-p0)) else (b ^ p0) :% 1+          x0 = x / f+          -- if ln - ld >= minExp, then b^(p-1) < x0 < b^(p+1), so there's at most+          -- one scaling step needed, otherwise, x0 < b^p and no scaling is needed+          (x', p') = if x0 >= toRational maxVal then (x0 / toRational b, p0 + 1) else (x0, p0)+        in encodeFloat (round x') p'
lib/Numeric/FormatFloat.hs view
@@ -10,8 +10,17 @@   showGFloatAlt,   showHFloat, +  floatToDigits,   ) where+import qualified Prelude()+import MiniPrelude import Data.Char+import Data.Float+import Data.Floating+import Data.Fractional+import Data.Integer+import Data.RealFloat+import Data.RealFrac import Numeric.Show  showFloat :: (RealFloat a) => a -> ShowS
+ lib/Numeric/FormatFloat.hs-boot view
@@ -0,0 +1,7 @@+module Numeric.FormatFloat where+import qualified Prelude()+import Data.Char_Type+import Data.RealFloat+--import Data.Text++showFloat :: (RealFloat a) => a -> {-ShowS-} (String -> String)
lib/Numeric/Natural.hs view
@@ -3,17 +3,25 @@   , minusNaturalMaybe   ) where import qualified Prelude(); import MiniPrelude-import Data.Bits+import Control.Exception+import Data.Bits.Base import Data.Coerce import Data.Integer+import Data.Ix import Data.Real-import Control.Exception+import Text.Read  newtype Natural = N Integer-  deriving (Eq, Ord)+  deriving (Eq, Ord, Ix)  instance Show Natural where   showsPrec p (N i) = showsPrec p i++instance Read Natural where+  readsPrec d = map (\(n, s) -> (fromInteger n, s))+                  . filter ((>= 0) . fst) . readsPrec d+  readListPrec = readListPrecDefault+  readList     = readListDefault  instance Num Natural where   N x + N y = N (x + y)
lib/Numeric/Read.hs view
@@ -22,6 +22,7 @@ import Data.Maybe_Type import Data.Num import Data.Ord+import Data.Real import Data.String import {-# SOURCE #-} Text.Read.Internal(lex) import Text.Show@@ -58,7 +59,7 @@ readHex :: forall a . (Num a) => ReadS a readHex = readInt 16 isHexDigit digitToInt -readSigned :: forall a . (Num a) => ReadS a -> ReadS a+readSigned :: forall a . (Real a) => ReadS a -> ReadS a readSigned readPos = readParen False read'   where     read' :: ReadS a
lib/Numeric/Show.hs view
@@ -1,5 +1,6 @@ module Numeric.Show(   showSigned,+  showSignedNeg,   showIntAtBase,   showInt,   showBin,@@ -18,11 +19,15 @@ import Data.List import Data.Num import Data.Ord+import Data.Real import Text.Show(ShowS, showChar) -showSigned :: forall a . (Ord a, Integral a) => (a -> ShowS) -> Int -> a -> ShowS-showSigned showPos p n r-    | n < 0 =+showSigned :: (Real a) => (a -> ShowS) -> Int -> a -> ShowS+showSigned = showSignedNeg (< 0)++showSignedNeg :: (Real a) => (a -> Bool) -> (a -> ShowS) -> Int -> a -> ShowS+showSignedNeg isNeg showPos p n r+    | isNeg n =       if p > (6::Int) then         '(' : '-' : showPos (-n) (')' : r)       else@@ -33,7 +38,7 @@ -- first argument, and the character representation specified by the second. -- If the argument, n, is <0 and -n == n (i.e., n == minBound) it will -- return the string for (abs n).-showIntAtBase :: forall a . (Ord a, Integral a) => a -> (Int -> Char) -> a -> ShowS+showIntAtBase :: (Integral a) => a -> (Int -> Char) -> a -> ShowS showIntAtBase base toChr an   | base <= 1 = error "Numeric.showIntAtBase: unsupported base"   | an < 0 =@@ -53,17 +58,17 @@           else             showPos (quot n base) (c : r) -showInt :: forall a . (Ord a, Integral a) => a -> ShowS+showInt :: (Integral a) => a -> ShowS showInt = showIntAtBase 10 intToDigit -showHex :: forall a . (Ord a, Integral a) => a -> ShowS+showHex :: (Integral a) => a -> ShowS showHex = showIntAtBase 16 intToDigit -showOct :: forall a . (Ord a, Integral a) => a -> ShowS+showOct :: (Integral a) => a -> ShowS showOct = showIntAtBase 8  intToDigit -showBin :: forall a . (Ord a, Integral a) => a -> ShowS+showBin :: (Integral a) => a -> ShowS showBin = showIntAtBase 2  intToDigit -showIntegral :: forall a . (Ord a, Integral a) => Int -> a -> ShowS+showIntegral :: (Integral a) => Int -> a -> ShowS showIntegral = showSigned showInt
lib/Prelude.hs view
@@ -12,10 +12,11 @@   module Data.Enum,   module Data.Eq,   module Data.Floating,+  module Data.Foldable,   module Data.Fractional,   module Data.Function,   module Data.Functor,-  module Data.Int,+  module Data.Int.Int,   module Data.Integer,   module Data.Integral,   module Data.List,@@ -30,8 +31,9 @@   module Data.Records,   module Data.Semigroup,   module Data.String,+  module Data.Traversable,   module Data.Tuple,-  module Data.Word,+  module Data.Word.Word,   module System.IO,   module System.IO.Error,   module Text.Read,@@ -39,28 +41,29 @@   Float, Double,   default Num,   default IsString,-  usingMhs, _wordSize, _isWindows,+  _usingMhs, _wordSize,+  _isLinux, _isMacOS, _isWindows,   ) where import qualified Prelude()              -- do not import Prelude import Control.Applicative(Applicative(..))-import Control.Error(error, undefined)+import Control.Error(error, undefined, errorWithoutStackTrace) import Control.Monad(Monad(..), mapM, mapM_, sequence, sequence_, (=<<)) import Control.Monad.Fail(MonadFail(..)) import Data.Bool(Bool(..), (&&), (||), not, otherwise) import Data.Bounded(Bounded(..)) import Data.Char(Char, String) import Data.Double(Double)-import Data.FloatW(FloatW)+import Data.Float(Float) import Data.Either(Either(..), either) import Data.Enum(Enum(..)) import Data.Eq(Eq(..)) import Data.Float(Float) import Data.Floating(Floating(..))+import Data.Foldable(Foldable) import Data.Fractional(Fractional(..), (^^), realToFrac) import Data.Function(id, const, (.), flip, ($), seq, ($!), until, asTypeOf) import Data.Functor(Functor(..), (<$>))-import Data.Int(Int)-import Data.Int.Instances+import Data.Int.Int(Int) import Data.Integer(Integer) import Data.Integral(Integral(..), fromIntegral, gcd, lcm, even, odd, (^)) import Data.List([](..), map, (++), filter, head, last, tail, init, null, length, (!!),@@ -81,15 +84,16 @@ import Data.Records  -- XXX redo this somehow import Data.Semigroup(Semigroup((<>))) import Data.String(IsString(..), lines, unlines, words, unwords)+import Data.Traversable(Traversable) import Data.Tuple(fst, snd, curry, uncurry)-import Data.Word(Word)-import System.IO(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,-                 FilePath, readFile, writeFile, appendFile,+import Data.Word.Word(Word)+import System.IO(IO, putChar, putStr, putStrLn, print, getChar, getLine, getContents, interact,+                 FilePath, readFile, writeFile, appendFile, readLn, readIO,                  cprint, cuprint)-import System.IO.Error(IOError)+import System.IO.Error(IOError, ioError, userError) import Text.Read(ReadS, Read(..), read, reads, readParen, lex) import Text.Show(Show(..), ShowS, shows, showChar, showString, showParen)-import Primitives(_wordSize, _isWindows)+import Primitives(_wordSize, _isLinux, _isMacOS, _isWindows)  import Data.Orphans()  -- Extra instances @@ -97,5 +101,5 @@ default IsString (String)  -- So we can detect mhs vs ghc-usingMhs :: Bool-usingMhs = True+_usingMhs :: Bool+_usingMhs = True
lib/Primitives.hs view
@@ -11,11 +11,13 @@ -- infixr -2 => infix   4 ~ +-- Use deriving () everywhere to avoid the automatic Data.Typeable derivation.+ -- Kinds-data Constraint-data Nat-data Symbol-data Type+data Constraint deriving ()+data Nat deriving ()+data Symbol deriving ()+data Type deriving ()  -- Classes -- Type equality as a constraint.@@ -25,19 +27,23 @@ -- class KnownSymbol in Data.TypeLits  -- Types-data AnyType+data AnyType deriving () --data Char-newtype Char = Char Word-data Int-data FloatW-data IO a-data Word-data Ptr a-data ForeignPtr a-data FunPtr a-data IOArray a-data ThreadId-data MVar a+newtype Char = Char Word deriving ()+data Int deriving ()+data Int64 deriving ()  -- same representation as Int on a 64 bit platform+data Float deriving ()+data Double deriving ()+data IO a deriving ()+data Word deriving ()+data Word64 deriving ()+data Ptr a deriving ()+data ForeignPtr a deriving ()+data FunPtr a deriving ()+data IOArray a deriving ()+data ThreadId deriving ()+data MVar a deriving ()+data Weak v deriving () -- (), (,), (,,), etc are built in to the compiler  primIntAdd :: Int -> Int -> Int@@ -68,36 +74,62 @@ primIntGE   :: Int -> Int -> Bool primIntGE   = _primitive ">=" -primFloatWAdd :: FloatW -> FloatW -> FloatW-primFloatWAdd  = _primitive "f+"-primFloatWSub :: FloatW -> FloatW -> FloatW-primFloatWSub  = _primitive "f-"-primFloatWMul :: FloatW -> FloatW -> FloatW-primFloatWMul  = _primitive "f*"-primFloatWDiv :: FloatW -> FloatW -> FloatW-primFloatWDiv = _primitive "f/"-primFloatWNeg :: FloatW -> FloatW-primFloatWNeg = _primitive "fneg"+primFloatAdd :: Float -> Float -> Float+primFloatAdd  = _primitive "f+"+primFloatSub :: Float -> Float -> Float+primFloatSub  = _primitive "f-"+primFloatMul :: Float -> Float -> Float+primFloatMul  = _primitive "f*"+primFloatDiv :: Float -> Float -> Float+primFloatDiv = _primitive "f/"+primFloatNeg :: Float -> Float+primFloatNeg = _primitive "fneg" -primFloatWEQ :: FloatW -> FloatW -> Bool-primFloatWEQ = _primitive "f=="-primFloatWNE :: FloatW -> FloatW -> Bool-primFloatWNE = _primitive "f/="-primFloatWLT :: FloatW -> FloatW -> Bool-primFloatWLT = _primitive "f<"-primFloatWLE :: FloatW -> FloatW -> Bool-primFloatWLE = _primitive "f<="-primFloatWGT :: FloatW -> FloatW -> Bool-primFloatWGT = _primitive "f>"-primFloatWGE :: FloatW -> FloatW -> Bool-primFloatWGE = _primitive "f>="-primFloatWShow :: FloatW -> [Char]-primFloatWShow = _primitive "fshow"-primFloatWRead :: [Char] -> FloatW-primFloatWRead = _primitive "fread"-primFloatWFromInt :: Int -> FloatW-primFloatWFromInt = _primitive "itof"+primFloatEQ :: Float -> Float -> Bool+primFloatEQ = _primitive "f=="+primFloatNE :: Float -> Float -> Bool+primFloatNE = _primitive "f/="+primFloatLT :: Float -> Float -> Bool+primFloatLT = _primitive "f<"+primFloatLE :: Float -> Float -> Bool+primFloatLE = _primitive "f<="+primFloatGT :: Float -> Float -> Bool+primFloatGT = _primitive "f>"+primFloatGE :: Float -> Float -> Bool+primFloatGE = _primitive "f>="+primFloatFromInt64 :: Int64 -> Float+primFloatFromInt64 = _primitive "Itof"+primFloatFromInt :: Int -> Float+primFloatFromInt = _primitive "itof" +primDoubleAdd :: Double -> Double -> Double+primDoubleAdd  = _primitive "d+"+primDoubleSub :: Double -> Double -> Double+primDoubleSub  = _primitive "d-"+primDoubleMul :: Double -> Double -> Double+primDoubleMul  = _primitive "d*"+primDoubleDiv :: Double -> Double -> Double+primDoubleDiv = _primitive "d/"+primDoubleNeg :: Double -> Double+primDoubleNeg = _primitive "dneg"++primDoubleEQ :: Double -> Double -> Bool+primDoubleEQ = _primitive "d=="+primDoubleNE :: Double -> Double -> Bool+primDoubleNE = _primitive "d/="+primDoubleLT :: Double -> Double -> Bool+primDoubleLT = _primitive "d<"+primDoubleLE :: Double -> Double -> Bool+primDoubleLE = _primitive "d<="+primDoubleGT :: Double -> Double -> Bool+primDoubleGT = _primitive "d>"+primDoubleGE :: Double -> Double -> Bool+primDoubleGE = _primitive "d>="+primDoubleFromInt64 :: Int64 -> Double+primDoubleFromInt64 = _primitive "Itod"+primDoubleFromInt :: Int -> Double+primDoubleFromInt = _primitive "itod"+ primWordAdd :: Word -> Word -> Word primWordAdd  = _primitive "+" primWordSub :: Word -> Word -> Word@@ -128,10 +160,14 @@ primWordClz = _primitive "clz" primWordCtz :: Word -> Int primWordCtz = _primitive "ctz"-primWordToFloatWRaw :: Word -> FloatW-primWordToFloatWRaw = _primitive "toDbl"-primWordFromFloatWRaw :: FloatW -> Word-primWordFromFloatWRaw = _primitive "toInt"+primWordToFloatRaw :: Word -> Float+primWordToFloatRaw = _primitive "toFlt"+primWord64ToDoubleRaw :: Word64 -> Double+primWord64ToDoubleRaw = _primitive "toDbl"+primWordFromFloatRaw :: Float -> Word+primWordFromFloatRaw = _primitive "fromFlt"+primWord64FromDoubleRaw :: Double -> Word64+primWord64FromDoubleRaw = _primitive "fromDbl"  primIntAnd :: Int -> Int -> Int primIntAnd  = _primitive "and"@@ -190,21 +226,16 @@ primSeq    :: forall a b . a -> b -> b primSeq    = _primitive "seq" ---primEqual  :: forall a . a -> a -> Bool---primEqual  = _primitive "equal"---- Works for Int, Char, String-primStringCompare :: [Char] -> [Char] -> Ordering-primStringCompare  = _primitive "scmp" primIntCompare :: Int -> Int -> Ordering primIntCompare  = _primitive "icmp"+primInt64Compare :: Int64 -> Int64 -> Ordering+primInt64Compare  = _primitive "Iicmp" primCharCompare :: Char -> Char -> Ordering primCharCompare  = _primitive "icmp" primWordCompare :: Word -> Word -> Ordering primWordCompare  = _primitive "ucmp"--primStringEQ  :: [Char] -> [Char] -> Bool-primStringEQ  = _primitive "sequal"+primWord64Compare :: Word64 -> Word64 -> Ordering+primWord64Compare  = _primitive "Iucmp"  primChr :: Int -> Char primChr = _primitive "chr"@@ -268,6 +299,16 @@ _isWindows :: Bool _isWindows = primPerformIO c_iswindows `primIntEQ` 1 +-- Is this MacOS?+foreign import ccall "ismacos" c_ismacos :: IO Int+_isMacOS :: Bool+_isMacOS = primPerformIO c_ismacos `primIntEQ` 1++-- Is this Linux?+foreign import ccall "islinux" c_islinux :: IO Int+_isLinux :: Bool+_isLinux = primPerformIO c_islinux `primIntEQ` 1+ primArrAlloc :: forall a . Int -> a -> IO (IOArray a) primArrAlloc = _primitive "A.alloc" @@ -283,11 +324,14 @@ primArrWrite :: forall a . IOArray a -> Int -> a -> IO () primArrWrite = _primitive "A.write" +primArrTrunc :: forall a . IOArray a -> Int -> IO ()+primArrTrunc = _primitive "A.trunc"+ -- Not referentially transparent primArrEQ :: forall a . IOArray a -> IOArray a -> Bool primArrEQ = _primitive "A.==" -primGC :: IO ()+primGC :: Int -> IO () primGC = _primitive "IO.gc"  primForeignPtrToPtr :: ForeignPtr a -> Ptr a@@ -341,3 +385,116 @@ primGetMaskingState = _primitive "IO.getmaskingstate" primSetMaskingState :: Int -> IO () primSetMaskingState = _primitive "IO.setmaskingstate"++primStats :: IO (Word, Word)+primStats = _primitive "IO.stats"++primNewStablePtr :: a -> IO Word+primNewStablePtr = _primitive "SPnew"+primDeRefStablePtr :: Word -> IO a+primDeRefStablePtr = _primitive "SPderef"+primFreeStablePtr :: Word -> IO ()+primFreeStablePtr = _primitive "SPfree"+++primInt64Add :: Int64 -> Int64 -> Int64+primInt64Add  = _primitive "I+"+primInt64Sub :: Int64 -> Int64 -> Int64+primInt64Sub  = _primitive "I-"+primInt64Mul :: Int64 -> Int64 -> Int64+primInt64Mul  = _primitive "I*"+primInt64Quot :: Int64 -> Int64 -> Int64+primInt64Quot = _primitive "Iquot"+primInt64Rem :: Int64 -> Int64 -> Int64+primInt64Rem  = _primitive "Irem"+primInt64SubR :: Int64 -> Int64 -> Int64+primInt64SubR = _primitive "Isubtract"+primInt64Neg :: Int64 -> Int64+primInt64Neg = _primitive "Ineg"+primInt64EQ   :: Int64 -> Int64 -> Bool+primInt64EQ   = _primitive "I=="+primInt64NE   :: Int64 -> Int64 -> Bool+primInt64NE   = _primitive "I/="+primInt64LT   :: Int64 -> Int64 -> Bool+primInt64LT   = _primitive "I<"+primInt64LE   :: Int64 -> Int64 -> Bool+primInt64LE   = _primitive "I<="+primInt64GT   :: Int64 -> Int64 -> Bool+primInt64GT   = _primitive "I>"+primInt64GE   :: Int64 -> Int64 -> Bool+primInt64GE   = _primitive "I>="+primInt64And :: Int64 -> Int64 -> Int64+primInt64And  = _primitive "Iand"+primInt64Or :: Int64 -> Int64 -> Int64+primInt64Or  = _primitive "Ior"+primInt64Xor :: Int64 -> Int64 -> Int64+primInt64Xor  = _primitive "Ixor"+primInt64Shl :: Int64 -> Int -> Int64+primInt64Shl  = _primitive "Ishl"+primInt64Shr :: Int64 -> Int -> Int64+primInt64Shr  = _primitive "Iashr"+primInt64Inv :: Int64 -> Int64+primInt64Inv  = _primitive "Iinv"+primInt64Popcount :: Int64 -> Int+primInt64Popcount = _primitive "Ipopcount"+primInt64Clz :: Int64 -> Int+primInt64Clz = _primitive "Iclz"+primInt64Ctz :: Int64 -> Int+primInt64Ctz = _primitive "Ictz"++primWord64Add :: Word64 -> Word64 -> Word64+primWord64Add  = _primitive "I+"+primWord64Sub :: Word64 -> Word64 -> Word64+primWord64Sub  = _primitive "I-"+primWord64Mul :: Word64 -> Word64 -> Word64+primWord64Mul  = _primitive "I*"+primWord64Quot :: Word64 -> Word64 -> Word64+primWord64Quot = _primitive "Iuquot"+primWord64Rem :: Word64 -> Word64 -> Word64+primWord64Rem  = _primitive "Iurem"+primWord64And :: Word64 -> Word64 -> Word64+primWord64And  = _primitive "Iand"+primWord64Or :: Word64 -> Word64 -> Word64+primWord64Or  = _primitive "Ior"+primWord64Xor :: Word64 -> Word64 -> Word64+primWord64Xor  = _primitive "Ixor"+primWord64Shl :: Word64 -> Int -> Word64+primWord64Shl  = _primitive "Ishl"+primWord64Shr :: Word64 -> Int -> Word64+primWord64Shr  = _primitive "Ishr"+primWord64Ashr :: Word64 -> Int -> Word64+primWord64Ashr  = _primitive "Iashr"+primWord64Inv :: Word64 -> Word64+primWord64Inv  = _primitive "Iinv"+primWord64Popcount :: Word64 -> Int+primWord64Popcount = _primitive "Ipopcount"+primWord64Clz :: Word64 -> Int+primWord64Clz = _primitive "Iclz"+primWord64Ctz :: Word64 -> Int+primWord64Ctz = _primitive "Ictz"+primWord64EQ  :: Word64 -> Word64 -> Bool+primWord64EQ  = _primitive "I=="+primWord64NE  :: Word64 -> Word64 -> Bool+primWord64NE  = _primitive "I/="+primWord64LT  :: Word64 -> Word64 -> Bool+primWord64LT  = _primitive "Iu<"+primWord64LE   :: Word64 -> Word64 -> Bool+primWord64LE   = _primitive "Iu<="+primWord64GT   :: Word64 -> Word64 -> Bool+primWord64GT   = _primitive "Iu>"+primWord64GE   :: Word64 -> Word64 -> Bool+primWord64GE   = _primitive "Iu>="++primWord64ToInt64 :: Word64 -> Int64+primWord64ToInt64 = _primitive "I"+primInt64ToWord64 :: Int64 -> Word64+primInt64ToWord64 = _primitive "I"++primIntToInt64 :: Int -> Int64+primIntToInt64 = _primitive "itoI"+primInt64ToInt :: Int64 -> Int+primInt64ToInt = _primitive "Itoi"+primWordToWord64 :: Word -> Word64+primWordToWord64 = _primitive "utoU"+primWord64ToWord :: Word64 -> Word+primWord64ToWord = _primitive "Utou"
+ lib/System/CPUTime.hs view
@@ -0,0 +1,25 @@+module System.CPUTime(getCPUTime, cpuTimePrecision) where+import qualified Prelude()+import MiniPrelude+import Data.Integer+import Foreign.C.Types+import Foreign.Marshal.Utils+import Foreign.Ptr+import Foreign.Storable++foreign import ccall getcpu :: Ptr CULong -> Ptr CULong -> IO ()++getCPUTime :: IO Integer+getCPUTime = do+  psec <- new 0+  pnsec <- new 0+  getcpu psec pnsec+  sec <- peek psec+  nsec <- peek pnsec+  return $ toInteger sec * 1000_000_000_000 + toInteger nsec * 1000++-- Arbitrarily set it to  1us.+-- Using the system call clock_getres() will not give an accurate+-- result anyway.+cpuTimePrecision :: Integer+cpuTimePrecision = 1_000_000
lib/System/Compress.hs view
@@ -20,8 +20,8 @@  type PBFILE = Ptr BFILE type Transducer = PBFILE -> IO PBFILE-foreign import ccall "openb_wr_buf"          c_openb_wr_buf          :: IO PBFILE-foreign import ccall "openb_rd_buf"          c_openb_rd_buf          :: CString -> Int -> IO PBFILE+foreign import ccall "openb_wr_mem"          c_openb_wr_mem          :: IO PBFILE+foreign import ccall "openb_rd_mem"          c_openb_rd_mem          :: CString -> Int -> IO PBFILE foreign import ccall "add_lz77_compressor"   c_add_lz77_compressor   :: Transducer foreign import ccall "add_lz77_decompressor" c_add_lz77_decompressor :: Transducer foreign import ccall "add_rle_compressor"    c_add_rle_compressor    :: Transducer@@ -30,19 +30,19 @@ foreign import ccall "add_bwt_decompressor"  c_add_bwt_decompressor  :: Transducer foreign import ccall "putb"                  c_putb                  :: Int -> PBFILE -> IO () foreign import ccall "getb"                  c_getb                  :: PBFILE -> IO Int-foreign import ccall "get_buf"               c_get_buf               :: PBFILE -> Ptr CString -> Ptr Int -> IO ()+foreign import ccall "get_mem"               c_get_mem               :: PBFILE -> Ptr CString -> Ptr Int -> IO () foreign import ccall "closeb"                c_close                 :: PBFILE -> IO () foreign import ccall "flushb"                c_flush                 :: PBFILE -> IO ()  withPutTransducer :: Transducer -> [Char] -> [Char] withPutTransducer trans file = unsafePerformIO $ do-  bf <- c_openb_wr_buf          -- create a buffer+  bf <- c_openb_wr_mem          -- create a buffer   cbf <- trans bf               -- and add transducer (e.g., a compressor)   mapM_ (flip c_putb cbf . ord) file -- copy all the bytes   c_flush cbf                   -- do compression and write to buffer   with nullPtr $ \ bufp ->     with 0 $ \ lenp -> do-      c_get_buf bf bufp lenp    -- get buffer and length+      c_get_mem bf bufp lenp    -- get buffer and length       buf <- peek bufp       len <- peek lenp       res <- peekCAStringLen (buf, len) -- encode as a string@@ -53,7 +53,7 @@ withGetTransducer :: Transducer -> [Char] -> [Char] withGetTransducer trans file = unsafePerformIO $ do   (ptr, len) <- newCAStringLen file            -- make memory buffer-  bf <- c_openb_rd_buf ptr len                 -- open it for reading+  bf <- c_openb_rd_mem ptr len                 -- open it for reading   cbf <- trans bf                              -- and add transducer (e.g., decompressor)   h <- mkHandle "withGetTransducer" cbf HRead   cs <- hGetContents h                         -- get contents
lib/System/Compress/ByteString.hs view
@@ -6,6 +6,7 @@ import qualified Prelude(); import MiniPrelude import Primitives(primForeignPtrToPtr) import qualified Data.ByteString as BS+import qualified Data.ByteString.Unsafe as BS import Data.Function import Foreign.C.String import Foreign.C.Types@@ -19,8 +20,8 @@  type PBFILE = Ptr BFILE type Transducer = PBFILE -> IO PBFILE-foreign import ccall "openb_wr_buf"          c_openb_wr_buf          :: IO PBFILE-foreign import ccall "openb_rd_buf"          c_openb_rd_buf          :: CString -> Int -> IO PBFILE+foreign import ccall "openb_wr_mem"          c_openb_wr_mem          :: IO PBFILE+foreign import ccall "openb_rd_mem"          c_openb_rd_mem          :: CString -> Int -> IO PBFILE foreign import ccall "add_lz77_compressor"   c_add_lz77_compressor   :: Transducer foreign import ccall "add_lz77_decompressor" c_add_lz77_decompressor :: Transducer foreign import ccall "add_rle_compressor"    c_add_rle_compressor    :: Transducer@@ -29,14 +30,14 @@ foreign import ccall "add_bwt_decompressor"  c_add_bwt_decompressor  :: Transducer foreign import ccall "putb"                  c_putb                  :: Int -> PBFILE -> IO () foreign import ccall "getb"                  c_getb                  :: PBFILE -> IO Int-foreign import ccall "get_buf"               c_get_buf               :: PBFILE -> Ptr CString -> Ptr Int -> IO ()+foreign import ccall "get_mem"               c_get_mem               :: PBFILE -> Ptr CString -> Ptr Int -> IO () foreign import ccall "closeb"                c_close                 :: PBFILE -> IO () foreign import ccall "flushb"                c_flush                 :: PBFILE -> IO ()  withGetTransducerBS :: Transducer -> BS.ByteString -> BS.ByteString withGetTransducerBS trans bs = unsafePerformIO $ do-  BS.useAsCStringLen bs $ \ (ptr, len) -> do-  bf <- c_openb_rd_buf ptr len                 -- open it for reading+  BS.unsafeUseAsCStringLen bs $ \ (ptr, len) -> do+  bf <- c_openb_rd_mem ptr len                 -- open it for reading   cbf <- trans bf                              -- and add transducer (e.g., decompressor)   h <- mkHandle "withGetTransducer" cbf HRead   seq bs (return ())
lib/System/Directory.hs view
@@ -11,6 +11,7 @@   createDirectoryIfMissing,   copyFile,   getHomeDirectory,+  getTemporaryDirectory,   ) where import qualified Prelude(); import MiniPrelude import Control.Exception(bracket)@@ -128,3 +129,17 @@     return $ "C:/Users/" ++ user    -- it's a guess   else     getEnv "HOME"++getTemporaryDirectory :: IO FilePath+getTemporaryDirectory =+  if _isWindows then do+    mtemp <- lookupEnv "TEMP"+    case mtemp of+      Just s -> return s+      Nothing -> do+        mtmp <- lookupEnv "TMP"+        case mtmp of+          Just s -> return s+          Nothing -> error "no temp directory"+  else+    fromMaybe "/tmp" <$> lookupEnv "TMP"
lib/System/Environment.hs view
@@ -6,12 +6,21 @@   withArgs,   lookupEnv,   getEnv,+  getEnvironment,+  setEnv,+  unsetEnv,   ) where import qualified Prelude(); import MiniPrelude import Primitives+import Control.Exception(throwIO)+import Data.Bifunctor(second)+import Data.List(span)+import Foreign.C.Error import Foreign.C.String+import Foreign.Marshal.Array import Foreign.Ptr import System.IO+import System.IO.Error  -- primArgRef returns an array containing a list of strings. -- The first element is the program name, the rest are the arguments.@@ -50,5 +59,39 @@ getEnv var = do   mval <- lookupEnv var   case mval of-    Nothing  -> error $ "getEnv: not found " ++ var+    Nothing  -> throwIO (mkIOError NoSuchThing "getEnv" Nothing (Just var))     Just val -> return val++foreign import capi "unistd.h value environ" c_environ :: Ptr CString++getEnvironment :: IO [(String, String)]+getEnvironment = do+  cstrs <- peekArray0 nullPtr c_environ+  strs <- mapM peekCAString cstrs+  let splitEq = second (drop 1) . span (/= '=')+  return $ map splitEq strs++setEnv :: String -> String -> IO ()+setEnv key value+  | null value     = unsetEnv key+  | otherwise      = do chkKey "setEnv" key; setEnv' key value++chkKey :: String -> String -> IO ()+chkKey msg key | null key || '=' `elem` key = throwIO (mkIOError InvalidArgument msg Nothing Nothing)+               | otherwise = return ()++foreign import ccall "setenv" c_setenv :: CString -> CString -> Int -> IO Int++setEnv' :: String -> String -> IO ()+setEnv' key value =+  withCAString key $ \ ckey ->+    withCAString value $ \ cvalue ->+      throwErrnoIfMinus1_ "setenv" $ c_setenv ckey cvalue 1++foreign import ccall "unsetenv" c_unsetenv :: CString -> IO Int++unsetEnv :: String -> IO ()+unsetEnv key = do+  chkKey "unsetEnv" key+  withCAString key $ \ ckey ->+    throwErrnoIfMinus1_ "unsetEnv" $ c_unsetenv ckey
lib/System/IO.hs view
@@ -1,353 +1,167 @@ -- Copyright 2023,2024 Lennart Augustsson -- See LICENSE file for full license. module System.IO(-  IO, Handle, FilePath,-  IOMode(..),-  stdin, stdout, stderr,-  hGetChar, hPutChar,-  hLookAhead,-  putChar, getChar,-  hClose, hFlush,-  openFile, openFileM, openBinaryFile,-  hPutStr, hPutStrLn,-  putStr, putStrLn,-  print,-  hGetContents, getContents,-  hGetLine, getLine,-  interact,-  writeFile, readFile, appendFile,--  cprint, cuprint,--  mkTextEncoding, hSetEncoding, utf8,--  openTmpFile, openTempFile, openBinaryTempFile,--  withFile,--  BufferMode(..),-  hSetBuffering,+  module System.IO.Base,+  readIO,+  readLn,+  fixIO, FixIOException,+  Newline(..),+  NewlineMode(..), -  IOException(..),+  TextEncoding,+  mkTextEncoding, hSetEncoding,+  latin1, utf8, utf8_bom, utf16, utf16le, utf16be, utf32, utf32le, utf32be, localeEncoding, char8,+  SeekMode(..),+  hIsOpen,+  hIsClosed,+  hIsReadable,+  hIsWritable,+  hIsSeekable,+  hIsTerminalDevice,+  hGetEcho,+  hSetEcho,+  hReady,    ) where import qualified Prelude()              -- do not import Prelude-import Primitives-import Control.Applicative-import Control.Error-import Control.Exception.Internal(bracket)-import Control.Monad-import Control.Monad.Fail-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.Ord-import Data.String-import Data.Tuple-import Text.Show-import Foreign.C.String-import Foreign.Marshal.Alloc-import Foreign.Ptr-import System.IO.Unsafe-import System.IO.Internal+import MiniPrelude+import Control.Concurrent.MVar+import Control.Exception+import Control.Monad.Fix+import Data.Bounded+import Data.IORef+import Mhs.Builtin+import System.IO.Base import System.IO.Error--data FILE--primHPrint       :: forall a . Ptr BFILE -> a -> IO ()-primHPrint        = _primitive "IO.print"-primStdin        :: ForeignPtr BFILE-primStdin         = _primitive "IO.stdin"-primStdout       :: ForeignPtr BFILE-primStdout        = _primitive "IO.stdout"-primStderr       :: ForeignPtr BFILE-primStderr        = _primitive "IO.stderr"--foreign import ccall "fopen"        c_fopen        :: CString -> CString -> IO (Ptr FILE)-foreign import ccall "closeb"       c_closeb       :: Ptr BFILE          -> IO ()-foreign import ccall "flushb"       c_flushb       :: Ptr BFILE          -> IO ()-foreign import ccall "getb"         c_getb         :: Ptr BFILE          -> IO Int-foreign import ccall "ungetb"       c_ungetb       :: Int -> Ptr BFILE   -> IO ()-foreign import ccall "putb"         c_putb         :: Int -> Ptr BFILE   -> IO ()-foreign import ccall "add_FILE"     c_add_FILE     :: Ptr FILE           -> IO (Ptr BFILE)-foreign import ccall "add_utf8"     c_add_utf8     :: Ptr BFILE          -> IO (Ptr BFILE)--------------------------------------------------------------stdin  :: Handle-stdin  = unsafeHandle primStdin  HRead  "stdin"-stdout :: Handle-stdout = unsafeHandle primStdout HWrite "stdout"-stderr :: Handle-stderr = unsafeHandle primStderr HWrite "stderr"----bFILE :: Ptr FILE -> Handle---bFILE = Handle . primPerformIO . (c_add_utf8 <=< c_add_FILE)--hClose :: Handle -> IO ()-hClose h =-  -- Don't close the std handles, the runtime assume they remain open.-  if h == stdin then-    return ()-  else if h == stdout || h == stderr then-    hFlush h       -- closing would have flushed-  else-    hCloseReal h--hCloseReal :: Handle -> IO ()-hCloseReal h = do-  m <- getHandleState h-  case m of-    HClosed -> return ()-    HSemiClosed -> return ()-    _ -> do-      killHandle h-      withHandleAny h c_closeb-  setHandleState h HClosed--hFlush :: Handle -> IO ()-hFlush h = withHandleWr h c_flushb--hGetChar :: Handle -> IO Char-hGetChar h = withHandleRd h $ \ p -> do-  c <- c_getb p-  if c == (-1::Int) then-    ioErrH h EOF "hGetChar"-  else if c `primIntAnd` 0x1ff800 == 0xd800 then-    ioErrH h InvalidArgument "hGetChar: surrogate"-  else-    return (chr c)--hLookAhead :: Handle -> IO Char-hLookAhead h = withHandleRd h $ \ p -> do-  c <- hGetChar h-  c_ungetb (ord c) p-  return c--hPutChar :: Handle -> Char -> IO ()-hPutChar h c-  | i `primIntAnd` 0x1ff800 == 0xd800 = ioErrH h InvalidArgument "hPutChar: surrogate"-  | otherwise = withHandleWr h $ c_putb i-  where i = ord c--openFILEM :: FilePath -> IOMode -> IO (Maybe (Ptr FILE))-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 == nullPtr then-    return Nothing-   else-    return (Just h)--openFileM :: FilePath -> IOMode -> IO (Maybe Handle)-openFileM fn m = do-  mf <- openFILEM fn m-  case mf of-    Nothing -> return Nothing-    Just p -> do { q <- c_add_utf8 =<< c_add_FILE p; Just <$> mkHandle fn q (ioModeToHMode m) }--openFile :: String -> IOMode -> IO Handle-openFile p m = do-  mh <- openFileM p m-  case mh of-    Nothing -> ioErr NoSuchThing "openFile" p-    Just h -> return h--putChar :: Char -> IO ()-putChar = hPutChar stdout--getChar :: IO Char-getChar = hGetChar stdin--cprint :: forall a . a -> IO ()-cprint a = withHandleWr stdout $ \ p ->-  primRnfNoErr a `seq`-  primGC `primThen`     -- Do GC reductions-  primGC `primThen`-  primGC `primThen`-  primGC `primThen`-  primGC `primThen`-  primGC `primThen`-  primHPrint p a--cuprint :: forall a . a -> IO ()-cuprint a = withHandleWr stdout $ \ p -> primHPrint p a--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'--hGetLine :: Handle -> IO String-hGetLine h = loop ""-  where loop s = do-          c <- hGetChar h-          if c == '\n' then-            return (reverse s)-           else-            loop (c:s)--getLine :: IO String-getLine = hGetLine stdin--writeFile :: FilePath -> String -> IO ()-writeFile p s = do-  h <- openFile p WriteMode-  hPutStr h s-  hClose h+import System.IO.Unsafe(unsafeInterleaveIO)+import System.IO_Handle+import Text.Read -appendFile :: FilePath -> String -> IO ()-appendFile p s = do-  h <- openFile p AppendMode-  hPutStr h s-  hClose h+readLn :: Read a => IO a+readLn = getLine >>= readIO -{---- Faster, but uses a lot more C memory.-writeFileFast :: FilePath -> String -> IO ()-writeFileFast p s = do-  h <- openFile p WriteMode-  (cs, l) <- newCAStringLen s-  n <- c_fwrite cs 1 l h-  free cs-  hClose h-  when (l /= n) $-    error "writeFileFast failed"--}+readIO :: Read a => String -> IO a+readIO s =+  case (do { (x,t) <- reads s;+             ("","") <- lex t;+             return x }) of+    [x]    -> return x+    []     -> ioError (userError "Prelude.readIO: no parse")+    _      -> ioError (userError "Prelude.readIO: ambiguous parse") --- Lazy readFile-readFile :: FilePath -> IO String-readFile p = do-  h <- openFile p ReadMode-  hGetContents h  --  can't close with lazy hGetContents+------------------------------------------------ --- Lazy hGetContents-hGetContents :: Handle -> IO String-hGetContents h = withHandleRd h $ \ p -> do-  c <- c_getb p-  if c == (-1::Int) then do-    hClose h                           -- EOF, so close the handle-    setHandleState h HSemiClosed       -- but still allow a regular close-    return ""-  else if c `primIntAnd` 0x1ff800 == 0xd800 then-    ioErrH h InvalidArgument "hGetContents: surrogate"-  else do-    cs <- unsafeInterleaveIO (hGetContents h)-    return (chr c : cs)+data FixIOException = FixIOException -getContents :: IO String-getContents = hGetContents stdin+instance Exception FixIOException -interact :: (String -> String) -> IO ()-interact f = getContents >>= putStr . f+instance Show FixIOException where+  showsPrec _ FixIOException = showString "cyclic evaluation in fixIO" -openBinaryFile :: String -> IOMode -> IO Handle-openBinaryFile fn m = do-  mf <- openFILEM fn m-  case mf of-    Nothing -> ioErr NoSuchThing "openBinaryFile" fn-    Just p -> do { q <- c_add_FILE p; mkHandle fn q (ioModeToHMode m) }+fixIO :: (a -> IO a) -> IO a+fixIO k = do+    m <- newEmptyMVar+    ans <- unsafeInterleaveIO+             (readMVar m `catch` \ BlockedIndefinitelyOnMVar ->+                                   throwIO FixIOException)+    result <- k ans+    putMVar m result+    return result ---------+instance MonadFix IO where+  mfix = fixIO -ioErrH :: Handle -> IOErrorType -> String -> IO a-ioErrH h typ desc   = ioError $ IOError (Just h) typ "" desc Nothing Nothing+data Newline = LF | CRLF+  deriving (Eq, Ord, Show, Read) -ioErr :: IOErrorType -> String -> String -> IO a-ioErr typ desc name = ioError $ IOError Nothing  typ "" "" Nothing (Just $ name ++ ": " ++ desc)+data NewlineMode = NewlineMode {inputNL :: Newline, outputNL :: Newline}+  deriving (Eq, Ord, Show, Read)  -------- -- For compatibility+-- This is a complete lie  data TextEncoding = UTF8 -utf8 :: TextEncoding-utf8 = UTF8- mkTextEncoding :: String -> IO TextEncoding mkTextEncoding "UTF-8//ROUNDTRIP" = return UTF8 mkTextEncoding _ = error "unknown text encoding" --- Always in UTF8 mode+-- XXX Always in UTF8 mode hSetEncoding :: Handle -> TextEncoding -> IO () hSetEncoding _ _ = return () ---------+latin1, utf8, utf8_bom, utf16, utf16le, utf16be, utf32, utf32le, utf32be, localeEncoding, char8 :: TextEncoding+latin1 = UTF8+utf8 = UTF8+utf8_bom = UTF8+utf16 = UTF8+utf16le = UTF8+utf16be = UTF8+utf32 = UTF8+utf32le = UTF8+utf32be = UTF8+localeEncoding = UTF8+char8 = UTF8 -withFile :: forall r . FilePath -> IOMode -> (Handle -> IO r) -> IO r-withFile fn md io = bracket (openFile fn md) hClose io+------- -withBinaryFile :: forall r . FilePath -> IOMode -> (Handle -> IO r) -> IO r-withBinaryFile fn md io = bracket (openBinaryFile fn md) hClose io+data SeekMode = AbsoluteSeek | RelativeSeek | SeekFromEnd+  deriving (Eq, Ord, Bounded, Enum, Read, Show) ---------+------- -splitTmp :: String -> (String, String)-splitTmp tmpl =-  case span (/= '.') (reverse tmpl) of-    (rsuf, "") -> (tmpl, "")-    (rsuf, _:rpre) -> (reverse rpre, '.':reverse rsuf)+-- XXX This currently does nothing.+hIsTerminalDevice :: Handle -> IO Bool+hIsTerminalDevice _ = return True --- 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+hIsOpen :: Handle -> IO Bool+hIsOpen (Handle _ r _) = do+  s <- readIORef r+  return $+    case s of+      HSemiClosed -> False+      HClosed -> False+      _ -> True --- Create and open a temporary file.-openTmpFile :: String -> IO (String, Handle)-openTmpFile tmpl = do-  let (pre, suf) = splitTmp tmpl-  ctmp <- withCAString pre $ withCAString suf . c_tmpname-  tmp <- peekCAString ctmp-  free ctmp-  h <- openFile tmp ReadWriteMode-  return (tmp, h)+hIsClosed :: Handle -> IO Bool+hIsClosed (Handle _ r _) = do+  s <- readIORef r+  return $+    case s of+      HClosed -> True+      _ -> False --- Sloppy implementation of openTempFile-openTempFile' :: (FilePath -> IOMode -> IO Handle) -> FilePath -> String -> IO (String, Handle)-openTempFile' open tmp tmplt = do-  let (pre, suf) = splitTmp tmplt-      loop n = do-        let fn = tmp ++ "/" ++ pre ++ show n ++ suf-        mh <- openFileM fn ReadMode-        case mh of-          Just h -> do-            hClose h-            loop (n+1 :: Int)-          Nothing -> do-            h <- open fn ReadWriteMode-            return (fn, h)-  loop 0+hIsReadable :: Handle -> IO Bool+hIsReadable (Handle _ r _) = do+  s <- readIORef r+  return $+    case s of+      HRead -> True+      HReadWrite -> True+      _ -> False -openTempFile :: FilePath -> String -> IO (String, Handle)-openTempFile = openTempFile' openFile+hIsWritable :: Handle -> IO Bool+hIsWritable (Handle _ r _) = do+  s <- readIORef r+  return $+    case s of+      HWrite -> True+      HReadWrite -> True+      _ -> False -openBinaryTempFile :: FilePath -> String -> IO (String, Handle)-openBinaryTempFile = openTempFile' openBinaryFile+-- XXX This currently does nothing.+hIsSeekable :: Handle -> IO Bool+hIsSeekable _ = return False -data BufferMode = NoBuffering | LineBuffering | BlockBuffering (Maybe Int)-  deriving (Eq, Ord, Show)+-- XXX This currently does nothing.+hGetEcho :: Handle -> IO Bool+hGetEcho _ = return True --- This currently does nothing.-hSetBuffering :: Handle -> BufferMode -> IO ()-hSetBuffering _ _ = return ()+-- XXX This currently does nothing.+hSetEcho :: Handle -> Bool -> IO ()+hSetEcho _ _ = return ()++-- XXX This currently does nothing.+hReady :: Handle -> IO Bool+hReady _ = return False
+ lib/System/IO/Base.hs view
@@ -0,0 +1,328 @@+-- Copyright 2023,2024 Lennart Augustsson+-- See LICENSE file for full license.+module System.IO.Base(+  IO, Handle, FilePath,+  IOMode(..),+  stdin, stdout, stderr,+  hGetChar, hPutChar,+  hLookAhead,+  putChar, getChar,+  hClose, hFlush,+  openFile, openFileM, openBinaryFile,+  hPutStr, hPutStrLn,+  putStr, putStrLn,+  print,+  hGetContents, getContents,+  hGetLine, getLine,+  interact,+  writeFile, readFile, appendFile,+  writeBinaryFile, readBinaryFile,++  cprint, cuprint,++  hPutBuf, hGetBuf,++  openTmpFile, openTempFile, openBinaryTempFile,++  withFile, withBinaryFile,++  BufferMode(..),+  hSetBuffering,+  hGetBuffering,++  IOException(..),+  ) where+import qualified Prelude()              -- do not import Prelude+import Primitives+import Control.Applicative+import Control.Error+import Control.Exception.Internal(bracket)+import Control.Monad+import Control.Monad.Fail+import Data.Bool+import Data.Char+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int.Int+import Data.List+import Data.Maybe+import Data.Num+import Data.Ord+import Data.String+import Data.Tuple+import {-# SOURCE #-} Data.Typeable+import Text.Show+import Foreign.C.String+import Foreign.Marshal.Alloc+import Foreign.Ptr+import System.IO.Error+import System.IO.Internal+import System.IO.Open+import System.IO.Unsafe++primHPrint       :: forall a . Ptr BFILE -> a -> IO ()+primHPrint        = _primitive "IO.print"++-- BFILE stuff+foreign import ccall "closeb"       c_closeb       ::                 Ptr BFILE -> IO ()+foreign import ccall "flushb"       c_flushb       ::                 Ptr BFILE -> IO ()+foreign import ccall "getb"         c_getb         ::                 Ptr BFILE -> IO Int+foreign import ccall "ungetb"       c_ungetb       :: Int ->          Ptr BFILE -> IO ()+foreign import ccall "putb"         c_putb         :: Int ->          Ptr BFILE -> IO ()+foreign import ccall "writeb"       c_writeb       :: Ptr a -> Int -> Ptr BFILE -> IO Int+foreign import ccall "readb"        c_readb        :: Ptr a -> Int -> Ptr BFILE -> IO Int++----------------------------------------------------------++hClose :: Handle -> IO ()+hClose h =+  -- Don't close the std handles, the runtime assume they remain open.+  if h == stdin then+    return ()+  else if h == stdout || h == stderr then+    hFlush h       -- closing would have flushed+  else+    hCloseReal h++hCloseReal :: Handle -> IO ()+hCloseReal h = do+  m <- getHandleState h+  case m of+    HClosed -> return ()+    HSemiClosed -> return ()+    _ -> do+      killHandle h+      withHandleAny h c_closeb+  setHandleState h HClosed++hFlush :: Handle -> IO ()+hFlush h = withHandleWr h c_flushb++hGetChar :: Handle -> IO Char+hGetChar h = withHandleRd h $ \ p -> do+  c <- c_getb p+  if c == (-1::Int) then+    ioErrH h EOF "hGetChar"+  else if c `primIntAnd` 0x1ff800 == 0xd800 then+    ioErrH h InvalidArgument "hGetChar: surrogate"+  else+    return (chr c)++hLookAhead :: Handle -> IO Char+hLookAhead h = withHandleRd h $ \ p -> do+  c <- hGetChar h+  c_ungetb (ord c) p+  return c++hPutChar :: Handle -> Char -> IO ()+hPutChar h c+  | i `primIntAnd` 0x1ff800 == 0xd800 = ioErrH h InvalidArgument "hPutChar: surrogate"+  | otherwise = withHandleWr h $ c_putb i+  where i = ord c++openFile :: String -> IOMode -> IO Handle+openFile p m = do+  mh <- openFileM p m+  case mh of+    Nothing -> ioErr NoSuchThing "openFile" p+    Just h -> return h++putChar :: Char -> IO ()+putChar = hPutChar stdout++getChar :: IO Char+getChar = hGetChar stdin++cprint :: forall a . a -> IO ()+cprint a = withHandleWr stdout $ \ p ->+  let gc = primGC 1 in+  primRnfNoErr a `seq`+  gc `primThen`     -- Do GC reductions+  gc `primThen`+  gc `primThen`+  gc `primThen`+  gc `primThen`+  gc `primThen`+  primHPrint p a++cuprint :: forall a . a -> IO ()+cuprint a = withHandleWr stdout $ \ p -> primHPrint p a++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'++hGetLine :: Handle -> IO String+hGetLine h = loop ""+  where loop s = do+          c <- hGetChar h+          if c == '\n' then+            return (reverse s)+           else+            loop (c:s)++getLine :: IO String+getLine = hGetLine stdin++writeFile :: FilePath -> String -> IO ()+writeFile p s = do+  h <- openFile p WriteMode+  hPutStr h s+  hClose h++writeBinaryFile :: FilePath -> String -> IO ()+writeBinaryFile p s = do+  h <- openBinaryFile p WriteMode+  hPutStr h s+  hClose h++appendFile :: FilePath -> String -> IO ()+appendFile p s = do+  h <- openFile p AppendMode+  hPutStr h s+  hClose h++{-+-- Faster, but uses a lot more C memory.+writeFileFast :: FilePath -> String -> IO ()+writeFileFast p s = do+  h <- openFile p WriteMode+  (cs, l) <- newCAStringLen s+  n <- c_fwrite cs 1 l h+  free cs+  hClose h+  when (l /= n) $+    error "writeFileFast failed"+-}++-- Lazy readFile+readFile :: FilePath -> IO String+readFile p = do+  h <- openFile p ReadMode+  hGetContents h  --  can't close with lazy hGetContents++-- Lazy readFile+readBinaryFile :: FilePath -> IO String+readBinaryFile p = do+  h <- openBinaryFile p ReadMode+  hGetContents h  --  can't close with lazy hGetContents++-- Lazy hGetContents+hGetContents :: Handle -> IO String+hGetContents h = withHandleRd h $ \ p -> do+  c <- c_getb p+  if c == (-1::Int) then do+    hClose h                           -- EOF, so close the handle+    setHandleState h HSemiClosed       -- but still allow a regular close+    return ""+  else if c `primIntAnd` 0x1ff800 == 0xd800 then+    ioErrH h InvalidArgument "hGetContents: surrogate"+  else do+    cs <- unsafeInterleaveIO (hGetContents h)+    return (chr c : cs)++getContents :: IO String+getContents = hGetContents stdin++interact :: (String -> String) -> IO ()+interact f = getContents >>= putStr . f++openBinaryFile :: String -> IOMode -> IO Handle+openBinaryFile fn m = do+  mf <- openBinaryFileM fn m+  case mf of+    Nothing -> ioErr NoSuchThing "openBinaryFile" fn+    Just p -> return p++--------++ioErrH :: Handle -> IOErrorType -> String -> IO a+ioErrH h typ desc   = ioError $ IOError (Just h) typ "" desc Nothing Nothing++ioErr :: IOErrorType -> String -> String -> IO a+ioErr typ desc name = ioError $ IOError Nothing  typ "" "" Nothing (Just $ name ++ ": " ++ desc)++--------++withFile :: forall r . FilePath -> IOMode -> (Handle -> IO r) -> IO r+withFile fn md io = bracket (openFile fn md) hClose io++withBinaryFile :: forall r . FilePath -> IOMode -> (Handle -> IO r) -> IO r+withBinaryFile fn md io = bracket (openBinaryFile fn md) hClose io++--------++splitTmp :: String -> (String, String)+splitTmp tmpl =+  case span (/= '.') (reverse tmpl) of+    (rsuf, "") -> (tmpl, "")+    (rsuf, _:rpre) -> (reverse rpre, '.':reverse rsuf)++-- 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++chkNull :: String -> CString -> CString+chkNull s p | p == nullPtr = error s+            | otherwise = p++-- Create and open a temporary file.+openTmpFile :: String -> IO (String, Handle)+openTmpFile tmpl = do+  let (pre, suf) = splitTmp tmpl+  ctmp <- withCAString pre $ \ p -> withCAString suf $ fmap (chkNull "openTmpFile") . c_tmpname p+  tmp <- peekCAString ctmp+  free ctmp+  h <- openFile tmp ReadWriteMode+  return (tmp, h)++-- Sloppy implementation of openTempFile+openTempFile' :: (FilePath -> IOMode -> IO Handle) -> FilePath -> String -> IO (String, Handle)+openTempFile' open tmp tmplt = do+  let (pre, suf) = splitTmp tmplt+      loop n = do+        let fn = tmp ++ "/" ++ pre ++ show n ++ suf+        mh <- openFileM fn ReadMode+        case mh of+          Just h -> do+            hClose h+            loop (n+1 :: Int)+          Nothing -> do+            h <- open fn ReadWriteMode+            return (fn, h)+  loop 0++openTempFile :: FilePath -> String -> IO (String, Handle)+openTempFile = openTempFile' openFile++openBinaryTempFile :: FilePath -> String -> IO (String, Handle)+openBinaryTempFile = openTempFile' openBinaryFile++data BufferMode = NoBuffering | LineBuffering | BlockBuffering (Maybe Int)+  deriving (Eq, Ord, Show)++-- XXX This currently does nothing.+hSetBuffering :: Handle -> BufferMode -> IO ()+hSetBuffering _ _ = return ()++-- XXX This currently does nothing.+hGetBuffering :: Handle -> IO BufferMode+hGetBuffering _ = return NoBuffering++hPutBuf :: Handle -> Ptr a -> Int -> IO ()+hPutBuf h p n = do withHandleWr h $ c_writeb p n; return ()++hGetBuf :: Handle -> Ptr a -> Int -> IO Int+hGetBuf h p n = withHandleRd h $ c_readb p n
lib/System/IO/Error.hs view
@@ -1,5 +1,6 @@ module System.IO.Error (     IOException(..),+    ioException,      -- * I\/O errors     IOError,@@ -36,7 +37,6 @@     ioeSetFileName,      -- * Types of I\/O error-    IOErrorType,                -- abstract      alreadyExistsErrorType,     doesNotExistErrorType,@@ -78,12 +78,12 @@ import Data.Eq import Data.Function import Data.Functor-import Data.Int+import Data.Int.Int import Data.List import Data.Maybe import Data.Records   -- needed since we don't import Mhs.Builtin import Data.String-import {-#SOURCE#-} Data.Typeable+import {-# SOURCE #-} Data.Typeable import System.IO.Internal import Text.Show @@ -227,6 +227,9 @@ isResourceVanishedError :: IOError -> Bool isResourceVanishedError = isResourceVanishedErrorType . ioeGetErrorType +isUnsupportedOperation :: IOError -> Bool+isUnsupportedOperation = isUnsupportedOperationType . ioeGetErrorType+ alreadyExistsErrorType   :: IOErrorType alreadyExistsErrorType    = AlreadyExists @@ -289,6 +292,10 @@ isResourceVanishedErrorType :: IOErrorType -> Bool isResourceVanishedErrorType ResourceVanished = True isResourceVanishedErrorType _ = False++isUnsupportedOperationType :: IOErrorType -> Bool+isUnsupportedOperationType UnsupportedOperation = True+isUnsupportedOperationType _ = False  ioeGetErrorType       :: IOError -> IOErrorType ioeGetErrorString     :: IOError -> String
lib/System/IO/Internal.hs view
@@ -16,13 +16,15 @@ import Control.Monad.Fail import Data.Bool import Data.Char+import Data.Enum import Data.Eq import Data.Function import Data.IORef import Data.List+import Data.Ord+import {-# SOURCE #-} Data.Typeable --import Foreign.ForeignPtr  causes import cycle import Foreign.Ptr-import Mhs.Builtin import System.IO_Handle import System.IO.Unsafe import Text.Show@@ -42,7 +44,7 @@ type FilePath = String  data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode-  deriving (Eq)+  deriving (Eq, Ord, Enum)  ioModeToHMode :: IOMode -> HandleState ioModeToHMode ReadMode = HRead
lib/System/IO/MD5.hs view
@@ -5,7 +5,7 @@ import Primitives(primPerformIO) import Control.DeepSeq.Class import Data.Coerce-import Data.Word+import Data.Word.Word import Foreign.C.String import Foreign.Marshal.Alloc import Foreign.Marshal.Array@@ -60,5 +60,5 @@ md5Combine [] = error "md5Combine: empty" md5Combine [m] = m md5Combine ms = primPerformIO $-  withArrray [ w | MD5 ws <- ms, w <- ws ] $ \ a ->+  withArray [ w | MD5 ws <- ms, w <- ws ] $ \ a ->     chksum $ \ w -> c_md5Array a w (length ms * md5Len)
+ lib/System/IO/Open.hs view
@@ -0,0 +1,68 @@+module System.IO.Open(+  stdin, stdout, stderr,+  openFileM,+  openBinaryFileM,+  ) where+import qualified Prelude()              -- do not import Prelude+import Primitives(ForeignPtr, IO)+import Control.Monad+import Data.Char+import Data.Function+import Data.Functor+import Data.Maybe+import Foreign.C.String+import Foreign.Ptr+import Mhs.Builtin+import System.IO.Internal++-- Functions returning Handles+-- These can be based on FILE or file descriptors.++primStdin        :: ForeignPtr BFILE+primStdin         = _primitive "IO.stdin"+primStdout       :: ForeignPtr BFILE+primStdout        = _primitive "IO.stdout"+primStderr       :: ForeignPtr BFILE+primStderr        = _primitive "IO.stderr"++data FILE++-- FILE stuff+foreign import ccall "fopen"        c_fopen        :: CString -> CString -> IO (Ptr FILE)+foreign import ccall "add_FILE"     c_add_FILE     :: Ptr FILE           -> IO (Ptr BFILE)+foreign import ccall "add_utf8"     c_add_utf8     :: Ptr BFILE          -> IO (Ptr BFILE)++stdin  :: Handle+stdin  = unsafeHandle primStdin  HRead  "stdin"+stdout :: Handle+stdout = unsafeHandle primStdout HWrite "stdout"+stderr :: Handle+stderr = unsafeHandle primStderr HWrite "stderr"++openFILEM :: FilePath -> IOMode -> IO (Maybe (Ptr FILE))+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 == nullPtr then+    return Nothing+   else+    return (Just h)++openFileM :: FilePath -> IOMode -> IO (Maybe Handle)+openFileM fn m = do+  mf <- openFILEM fn m+  case mf of+    Nothing -> return Nothing+    Just p -> do { q <- c_add_utf8 =<< c_add_FILE p; Just <$> mkHandle fn q (ioModeToHMode m) }++openBinaryFileM :: String -> IOMode -> IO (Maybe Handle)+openBinaryFileM fn m = do+  mf <- openFILEM fn m+  case mf of+    Nothing -> return Nothing+    Just p -> do { q <- c_add_FILE p; Just <$> mkHandle fn q (ioModeToHMode m) }
lib/System/IO/PrintOrRun.hs view
@@ -1,19 +1,27 @@ -- Copyright 2023-2025 Lennart Augustsson -- See LICENSE file for full license. module System.IO.PrintOrRun(PrintOrRun(..), _withArgs) where-import qualified Prelude()              -- do not import Prelude-import Primitives-import Data.Char(String) import System.Environment-import System.IO-import Text.Show+import System.IO.TimeMilli+import System.RTS  -- Helper for interactive system class PrintOrRun a where-  printOrRun :: a -> IO ()+  _printOrRun :: a -> IO ()+  _printOrRunStats :: a -> IO ()  instance PrintOrRun (IO ()) where-  printOrRun a = a+  _printOrRun a = a+  _printOrRunStats a = do+    t1 <- getTimeMilli+    s1 <- getStats+    r <- a+    s2 <- getStats+    t2 <- getTimeMilli+    putStrLn $ "(" ++ show (t2 - t1) ++ "ms, " +++                show (reductions s2 - reductions s1) ++ " reds, " +++                show (cellsAllocated s2 - cellsAllocated s1) ++ " cells)"+    return r;  {-  Resolution of overlapping instances is not good enough for this.  Yet. instance Show a => PrintOrRun (IO a) where@@ -21,7 +29,8 @@ -}  instance Show a => PrintOrRun a where-  printOrRun = print+  _printOrRun = print+  _printOrRunStats a = _printOrRunStats (print a)  _withArgs :: [String] -> IO () -> IO () _withArgs = withArgs
lib/System/IO/StringHandle.hs view
@@ -9,21 +9,21 @@ import System.IO import System.IO.Internal -foreign import ccall "openb_wr_buf"          c_openb_wr_buf          :: IO (Ptr BFILE)-foreign import ccall "openb_rd_buf"          c_openb_rd_buf          :: CString -> Int -> IO (Ptr BFILE)-foreign import ccall "get_buf"               c_get_buf               :: Ptr BFILE -> Ptr CString -> Ptr Int -> IO ()+foreign import ccall "openb_wr_mem"          c_openb_wr_mem          :: IO (Ptr BFILE)+foreign import ccall "openb_rd_mem"          c_openb_rd_mem          :: CString -> Int -> IO (Ptr BFILE)+foreign import ccall "get_mem"               c_get_mem               :: Ptr BFILE -> Ptr CString -> Ptr Int -> IO ()  -- Turn all writes to a Handle into a String. -- Do not close the Handle in the action handleWriteToString :: (Handle -> IO ()) -> IO String handleWriteToString act = do-  bf <- c_openb_wr_buf                         -- create a buffer+  bf <- c_openb_wr_mem                         -- create a buffer   h <- mkHandle "handleToString" bf HWrite   act h   hFlush h   with nullPtr $ \ bufp ->     with 0 $ \ lenp -> do-      c_get_buf bf bufp lenp                   -- get buffer and length+      c_get_mem bf bufp lenp                   -- get buffer and length       buf <- peek bufp       len <- peek lenp       res <- peekCAStringLen (buf, len)        -- encode as a string@@ -36,5 +36,5 @@ stringToHandle :: String -> IO Handle stringToHandle file = do   (ptr, len) <- newCAStringLen file            -- make memory buffer-  bf <- c_openb_rd_buf ptr len                 -- open it for reading+  bf <- c_openb_rd_mem ptr len                 -- open it for reading   mkHandle "stringToHandle" bf HRead           -- and make a handle
+ lib/System/IO/Transducers.hs view
@@ -0,0 +1,55 @@+module System.IO.Transducers(+  addUTF8, addCRLF, addBuffer, addLZ77, addRLE, addBWT, addBase64,+  ) where+import qualified Prelude(); import MiniPrelude+--import Data.Maybe+import Foreign.Ptr(Ptr)+import System.IO.Base+import System.IO.Internal++foreign import ccall add_utf8              :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_crlf              :: Ptr BFILE -> IO (Ptr BFILE)+--foreign import ccall add_base64            :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_buf        :: Int -> Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_lz77_compressor   :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_lz77_decompressor :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_rle_compressor    :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_rle_decompressor  :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_bwt_compressor    :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_bwt_decompressor  :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_base64_encoder    :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_base64_decoder    :: Ptr BFILE -> IO (Ptr BFILE)++addTransducerRW :: (Ptr BFILE -> IO (Ptr BFILE)) -> (Ptr BFILE -> IO (Ptr BFILE)) -> Handle -> IO Handle+addTransducerRW rd wr h = do+  hs <- getHandleState h+  case hs of+    HRead  -> addTransducer rd h+    HWrite -> addTransducer wr h+    _      -> error "addTransducerRW: bad R/W mode"++addUTF8 :: Handle -> IO Handle+addUTF8 = addTransducer add_utf8++addCRLF :: Handle -> IO Handle+addCRLF = addTransducer add_crlf++addBuffer :: BufferMode -> Handle -> IO Handle+addBuffer NoBuffering h = return h+addBuffer LineBuffering h = addTransducer (add_buf (-defaultBufSize)) h+addBuffer (BlockBuffering mb) h = addTransducer (add_buf (fromMaybe defaultBufSize mb)) h++defaultBufSize :: Int+defaultBufSize = 512++addLZ77 :: Handle -> IO Handle+addLZ77 = addTransducerRW add_lz77_decompressor add_lz77_compressor++addRLE :: Handle -> IO Handle+addRLE = addTransducerRW add_rle_decompressor add_rle_compressor++addBWT :: Handle -> IO Handle+addBWT = addTransducerRW add_bwt_decompressor add_bwt_compressor++addBase64 :: Handle -> IO Handle+addBase64 = addTransducerRW add_base64_decoder add_base64_encoder
lib/System/IO/Unsafe.hs view
@@ -1,9 +1,12 @@-module System.IO.Unsafe(unsafePerformIO, unsafeInterleaveIO) where+module System.IO.Unsafe(unsafePerformIO, unsafeDupablePerformIO, unsafeInterleaveIO) where import qualified Prelude() import Primitives  unsafePerformIO :: IO a -> a unsafePerformIO = primPerformIO -unsafeInterleaveIO :: forall a . IO a -> IO a+unsafeDupablePerformIO :: IO a -> a+unsafeDupablePerformIO = primPerformIO++unsafeInterleaveIO :: IO a -> IO a unsafeInterleaveIO ioa = primReturn (primPerformIO ioa)
lib/System/IO_Handle.hs view
@@ -4,12 +4,14 @@ import Data.Bool import Data.Eq import Data.IORef+import {-# SOURCE #-} Data.Typeable  -- A handle is a ForeignPtr to a C BFILE transducer. -- It needs to be a ForeignPtr so it can have a finalizer -- that closes the underlying BFILE when the Handle is gc():ed.  data BFILE  -- tag used for C pointers to BFILE structs+  deriving ()  data Handle = Handle (ForeignPtr BFILE) (IORef HandleState) [Char] 
lib/System/Info.hs view
@@ -32,4 +32,4 @@     error "System.Into: uname failed"   return $ map toLower $ filter (not . isSpace) res -fullCompilerVersion = makeVersion [0,13,0,0]+fullCompilerVersion = makeVersion [0,15,0,0]
+ lib/System/Mem.hs view
@@ -0,0 +1,10 @@+module System.Mem(performGC, performGCWithReduction) where+import qualified Prelude()+import MiniPrelude+import Primitives++performGC :: IO ()+performGC = primGC 0++performGCWithReduction :: IO ()+performGCWithReduction = primGC 1
+ lib/System/Mem/Weak.hs view
@@ -0,0 +1,46 @@+module System.Mem.Weak(+  Weak,+  mkWeak,+  deRefWeak,+  finalize,+  mkWeakPtr,+  addFinalizer,+  mkWeakPtr,+  ) where+import qualified Prelude()+import Primitives(IO, primReturn, primThen, Weak)+import Data.Maybe_Type++primWeakPtr :: k -> v -> IO (Weak v)+primWeakPtr = _primitive "Wknew"++primWeakPtrFin :: k -> v -> IO () -> IO (Weak v)+primWeakPtrFin = _primitive "Wknewfin"++primDerefWeak :: Weak v -> IO (Maybe v)+primDerefWeak = _primitive "Wkderef"++primFinalizeWeak :: Weak v -> IO ()+primFinalizeWeak = _primitive "Wkfinal"++-- Warning: Do NOT use any Int/Word based type as the key, nor Char.+-- The garbage collector changes the sharing of small ints so+-- the weak pointer will be unreliable.+mkWeak :: k -> v -> Maybe (IO ()) -> IO (Weak v)+mkWeak k v Nothing = primWeakPtr k v+mkWeak k v (Just fin) = primWeakPtrFin k v fin++deRefWeak :: Weak v -> IO (Maybe v)+deRefWeak = primDerefWeak++finalize :: Weak v -> IO ()+finalize = primFinalizeWeak++mkWeakPtr :: k -> Maybe (IO ()) -> IO (Weak k)+mkWeakPtr k fin = mkWeak k k fin++addFinalizer :: key -> IO () -> IO ()+addFinalizer k fin = mkWeakPtr k (Just fin)`primThen` primReturn ()++mkWeakPair :: k -> v -> Maybe (IO ()) -> IO (Weak (k, v))+mkWeakPair k v fin = mkWeak k (k, v) fin
+ lib/System/Posix/Types.hs view
@@ -0,0 +1,193 @@+module System.Posix.Types (+  CDev(..),+  CIno(..),+  CMode(..),+  COff(..),+  CPid(..),+  CSsize(..),+  CGid(..),+  CNlink(..),+  CUid(..),+  CCc(..),+  CSpeed(..),+  CTcflag(..),+  CRLim(..),+  CBlkSize(..),+  CBlkCnt(..),+  CClockId(..),+  CFsBlkCnt(..),+  CFsFilCnt(..),+  CId(..),+  CKey(..),+  CTimer(..),+  CSocklen(..),+  CNfds(..),+  Fd(..),+  LinkCount,+  UserID,+  GroupID,++  ByteCount,+  ClockTick,+  EpochTime,+  FileOffset,+  ProcessID,+  ProcessGroupID,+  DeviceID,+  FileID,+  FileMode,+  Limit+ ) where++import Data.Bits+import Data.Int+import Data.Ix+import Data.Word+import Foreign.C.Types+import Foreign.Ptr+import Foreign.Storable++-- The types are highly platform dependent.+-- What we have here should work on+--  Linux 64 bit+--  Linux 32 bit+--  MacOS 64 bit+-- The actual size of the representation type is >= the platform type,+-- but the storable instance has the right size.++toI32 :: Integral a => a -> Int32+toI32 = fromIntegral++fromI32 :: Integral a => Int32 -> a+fromI32 = fromIntegral++toU32 :: Integral a => a -> Word32+toU32 = fromIntegral++fromU32 :: Integral a => Word32 -> a+fromU32 = fromIntegral++toU16 :: Integral a => a -> Word16+toU16 = fromIntegral++fromU16 :: Integral a => Word16 -> a+fromU16 = fromIntegral++newtype CDev = CDev Word64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord)+instance Storable CDev where+  sizeOf    (CDev x) =          if _isMacOS then sizeOf              (toI32 x) else sizeOf    x+  alignment (CDev x) =          if _isMacOS then alignment           (toI32 x) else alignment x+  peek p             = CDev <$> if _isMacOS then fromI32 <$> peek (castPtr p)  else peek (castPtr p)+  poke p    (CDev x) =          if _isMacOS then poke (castPtr p)    (toI32 x) else poke (castPtr p) x++newtype CIno = CIno Word64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CMode = CMode Word32+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype COff = COff Int64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CPid = CPid Int32+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CSsize = CSsize Int+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CGid = CGid Word32+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CNlink = CNlink Word+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord)+instance Storable CNlink where+  sizeOf    (CNlink x) =            if _isMacOS then sizeOf              (toU16 x) else sizeOf    x+  alignment (CNlink x) =            if _isMacOS then alignment           (toU16 x) else alignment x+  peek p               = CNlink <$> if _isMacOS then fromU16 <$> peek (castPtr p)  else peek (castPtr p)+  poke p    (CNlink x) =            if _isMacOS then poke (castPtr p)    (toU16 x) else poke (castPtr p) x++newtype CUid = CUid Word32+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CCc = CCc Word8+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CSpeed = CSpeed Word64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord)+instance Storable CSpeed where+  sizeOf    (CSpeed x) =            if not _isMacOS then sizeOf              (toU32 x) else sizeOf    x+  alignment (CSpeed x) =            if not _isMacOS then alignment           (toU32 x) else alignment x+  peek p               = CSpeed <$> if not _isMacOS then fromU32 <$> peek (castPtr p)  else peek (castPtr p)+  poke p    (CSpeed x) =            if not _isMacOS then poke (castPtr p)    (toU32 x) else poke (castPtr p) x++newtype CTcflag = CTcflag Word64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord)+instance Storable CTcflag where+  sizeOf    (CTcflag x) =             if not _isMacOS then sizeOf              (toU32 x) else sizeOf    x+  alignment (CTcflag x) =             if not _isMacOS then alignment           (toU32 x) else alignment x+  peek p                = CTcflag <$> if not _isMacOS then fromU32 <$> peek (castPtr p)  else peek (castPtr p)+  poke p    (CTcflag x) =             if not _isMacOS then poke (castPtr p)    (toU32 x) else poke (castPtr p) x++newtype CRLim = CRLim Word64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CBlkSize = CBlkSize Word+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord)+instance Storable CBlkSize where+  sizeOf    (CBlkSize x) =              if _isMacOS then sizeOf              (toI32 x) else sizeOf    x+  alignment (CBlkSize x) =              if _isMacOS then alignment           (toI32 x) else alignment x+  peek p                 = CBlkSize <$> if _isMacOS then fromI32 <$> peek (castPtr p)  else peek (castPtr p)+  poke p    (CBlkSize x) =              if _isMacOS then poke (castPtr p)    (toI32 x) else poke (castPtr p) x++newtype CBlkCnt = CBlkCnt Word64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CClockId = CClockId Int+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CFsBlkCnt = CFsBlkCnt Word64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CFsFilCnt = CFsFilCnt Word64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CId = CId Int+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CKey = CKey Int+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CTimer = CTimer Word+  deriving (Show, Eq, Ord, Storable)++newtype CSocklen = CSocklen Word32+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord, Storable)++newtype CNfds = CNfds Word64+  deriving (Bits, FiniteBits, Bounded, Enum, Ix, Num, Read, Integral, Real, Show, Eq, Ord)+instance Storable CNfds where+  sizeOf    (CNfds x) =           if _isMacOS then sizeOf              (toI32 x) else sizeOf    x+  alignment (CNfds x) =           if _isMacOS then alignment           (toI32 x) else alignment x+  peek p              = CNfds <$> if _isMacOS then fromI32 <$> peek (castPtr p)  else peek (castPtr p)+  poke p    (CNfds x) =           if _isMacOS then poke (castPtr p)    (toI32 x) else poke (castPtr p) x++newtype Fd = Fd CInt+  deriving (Bits, FiniteBits, Bounded, Enum, {-Ix,-} Num, {-Read,-} Integral, Real, Show, Eq, Ord, Storable)+++type LinkCount      = CNlink+type UserID         = CUid+type GroupID        = CGid++type ByteCount      = CSize+type ClockTick      = CClock+type EpochTime      = CTime+type DeviceID       = CDev+type FileID         = CIno+type FileMode       = CMode+type ProcessID      = CPid+type FileOffset     = COff+type ProcessGroupID = CPid+type Limit          = CLong+
lib/System/Process.hs view
@@ -1,12 +1,44 @@-module System.Process(callCommand) where+module System.Process(+  callCommand,+  system,+  readProcess,+  ) where import qualified Prelude(); import MiniPrelude+import Control.Exception(bracket_) import Control.Monad(when) import Foreign.C.String+import System.Directory+import System.Exit+import System.IO.Base  foreign import ccall "system" systemc :: CString -> IO Int  callCommand :: String -> IO () callCommand cmd = do+  rc <- system cmd+  case rc of+    ExitSuccess -> return ()+    ExitFailure r -> error $ "callCommand: failed " ++ show r ++ ", cmd=\n" ++ show cmd++system :: String -> IO ExitCode+system cmd = do   r <- withCAString cmd systemc-  when (r /= 0) $-    error $ "callCommand: failed " ++ show r ++ ", " ++ show cmd+  if r == 0 then+    return ExitSuccess+   else+    return (ExitFailure r)++-- An approximation of readProcess+readProcess :: FilePath -> [String] -> String -> IO String+readProcess cmd args sin = do+  tmpDir <- getTemporaryDirectory+  (fin, hin) <- openTempFile tmpDir "in.txt"+  hPutStr hin sin+  hClose hin+  (fout, hout) <- openTempFile tmpDir "out.txt"+  bracket_ (return ())+           (removeFile fin >> removeFile fout)+           (do+               callCommand $ unwords $ cmd : ("<" ++ fin) : (">" ++ fout) : args+               res <- hGetContents hout+               length res `seq` return res)
+ lib/System/RTS.hs view
@@ -0,0 +1,17 @@+module System.RTS(gc, Stats(..), getStats) where+import qualified Prelude()+import MiniPrelude+import Primitives++gc :: IO ()+gc = primGC 0++data Stats = Stats+  { cellsAllocated :: Word+  , reductions     :: Word+  } deriving (Show)++getStats :: IO Stats+getStats = do+  (a, r) <- primStats+  return Stats{ cellsAllocated = a, reductions = r }
+ lib/System/Timeout.hs view
@@ -0,0 +1,29 @@+module System.Timeout(Timeout, timeout) where+import Control.Concurrent+import Control.Exception+import Data.Unique++newtype Timeout = Timeout Unique+  deriving (Eq)++instance Show Timeout where+  show _ = "<<timeout>>"++instance Exception Timeout where+  toException = asyncExceptionToException+  fromException = asyncExceptionFromException++timeout :: Int -> IO a -> IO (Maybe a)+timeout n f+    | n <  0    = fmap Just f+    | n == 0    = return Nothing+    | otherwise = do+        pid <- myThreadId+        ex  <- fmap Timeout newUnique+        handleJust (\ e -> if e == ex then Just () else Nothing)+                   (\ _ -> return Nothing)+                   (bracket (forkIOWithUnmask $ \ unmask ->+                                 unmask $ threadDelay n >> throwTo pid ex)+                            (uninterruptibleMask_ . killThread)+                            (const $ fmap Just f))+        
lib/Text/ParserCombinators/ReadP.hs view
@@ -76,11 +76,12 @@ import Data.Eq import Data.Function import Data.Functor-import Data.Int+import Data.Int.Int import Data.Num import Data.List import Data.List.NonEmpty import Data.Monoid.Internal+import {-# SOURCE #-} Data.Typeable  default (Int) 
lib/Text/ParserCombinators/ReadPrec.hs view
@@ -51,10 +51,11 @@ import Control.Monad.Fail import Data.Char import Data.Function-import Data.Int+import Data.Int.Int import Data.Num import Data.List import Data.Ord+import {-# SOURCE #-} Data.Typeable import Text.ParserCombinators.ReadP(ReadP, ReadS, readP_to_S, readS_to_P) import qualified Text.ParserCombinators.ReadP as ReadP(get, look, (+++), (<++), pfail) 
lib/Text/Read.hs view
@@ -36,7 +36,8 @@      readListDefault,      readListPrecDefault,      readEither,-     readMaybe+     readMaybe,+     expectP,      ) where import qualified Prelude() import Control.Error
lib/Text/Read/Internal.hs view
@@ -47,9 +47,9 @@ import Control.Error import Control.Monad import Control.Monad.Fail-import Data.Array import Data.Bool import Data.Char+import Data.Coerce import Data.Double import Data.Either import Data.Eq@@ -62,6 +62,7 @@ import Data.Integral import Data.Ix import Data.List+import Data.List.NonEmpty_Type import Data.Num import Data.Ord import Data.Ratio@@ -69,11 +70,13 @@ import Data.RealFloat import Data.String import Data.Tuple+import {-# SOURCE #-} Data.Typeable import Data.Word-import Numeric.Natural+import Foreign.Ptr import qualified Text.ParserCombinators.ReadP as P import Text.ParserCombinators.ReadP(ReadS, readP_to_S) import Text.ParserCombinators.ReadPrec+import Text.Read.Lex (Lexeme(..)) -- needed for deriving import qualified Text.Read.Lex as L import Text.Show(appPrec) @@ -480,8 +483,7 @@   readList     = readListDefault  -- | @since base-4.11.0.0--- deriving instance Read a => Read (NonEmpty a)--- XXX+deriving instance Read a => Read (NonEmpty a)  -------------------------------------------------------------- -- Structure instances of Read: Maybe, List etc@@ -553,17 +555,6 @@   readList     = readListDefault  -- | @since base-2.01-instance  (Ix a, Read a, Read b) => Read (Array a b)  where-    readPrec = parens $ prec appPrec $-               do expectP (L.Ident "array")-                  theBounds <- step readPrec-                  vals   <- step readPrec-                  return (array theBounds vals)--    readListPrec = readListPrecDefault-    readList     = readListDefault---- | @since base-2.01 instance Read L.Lexeme where   readPrec     = lexP   readListPrec = readListPrecDefault@@ -613,15 +604,15 @@  -- | @since base-2.01 instance Read Word8 where-    readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s]+    readsPrec p s = [(fromIntegral (x::Word), r) | (x, r) <- readsPrec p s]  -- | @since base-2.01 instance Read Word16 where-    readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s]+    readsPrec p s = [(fromIntegral (x::Word), r) | (x, r) <- readsPrec p s]  -- | @since base-2.01 instance Read Word32 where-    readsPrec p s = [(fromInteger x, r) | (x, r) <- readsPrec p s]+    readsPrec p s = [(fromIntegral (x::Word), r) | (x, r) <- readsPrec p s]  -- | @since base-2.01 instance Read Word64 where@@ -633,13 +624,6 @@   readListPrec = readListPrecDefault   readList     = readListDefault --- | @since base-4.8.0.0-instance Read Natural where-  readsPrec d = map (\(n, s) -> (fromInteger n, s))-                  . filter ((>= 0) . fst) . readsPrec d-  readListPrec = readListPrecDefault-  readList     = readListDefault- -- | @since base-2.01 instance Read Float where   readPrec     = readNumber convertFrac@@ -672,13 +656,6 @@ -- Tuple instances of Read, up to size 15 ------------------------------------------------------------------------ --- | Reading a 'Void' value is always a parse error, considering--- 'Void' as a data type with no constructors.------ @since base-4.8.0.0--- deriving instance Read Void--- XXX- -- | @since base-2.01 instance Read () where   readPrec =@@ -692,8 +669,7 @@   readList     = readListDefault  -- | @since base-4.15--- deriving instance Read a => Read (Solo a)--- XXX+deriving instance Read a => Read (Solo a)  -- | @since base-2.01 instance (Read a, Read b) => Read (a,b) where@@ -796,3 +772,22 @@                           ; return (a,b,c,d,e,f,g,h,i,j) })   readListPrec = readListPrecDefault   readList     = readListDefault++instance Read Int8 where+    readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s]++instance Read Int16 where+    readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s]++instance Read Int32 where+    readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s]++instance Read Int64 where+    readsPrec p s = [(fromInteger x, r) | (x, r) <- readsPrec p s]++--------------------------------------------------------------+-- Foreign.Ptr instances of Read+--------------------------------------------------------------++deriving newtype instance Read IntPtr+deriving newtype instance Read WordPtr
lib/Text/Read/Lex.hs view
@@ -43,7 +43,7 @@ import Data.Bounded import Data.Eq import Data.Function-import Data.Int+import Data.Int.Int import Data.Integer import Data.Integral import Data.List@@ -52,6 +52,7 @@ import Data.Ord import Data.Ratio import Data.Tuple+import {-# SOURCE #-} Data.Typeable import Text.Show import Text.ParserCombinators.ReadP {-
lib/Text/Show.hs view
@@ -6,6 +6,7 @@ import Data.Bool_Type import Data.Char_Type import Data.List_Type+import {-# SOURCE #-} Data.Typeable  type ShowS = String -> String 
+ lib/dist-mcabal/autogen/Paths_base.hs view
@@ -0,0 +1,4 @@+module Paths_base where+import Data.Version+version :: Version; version = makeVersion [0,15,0,0]+getDataDir :: IO FilePath; getDataDir = return "/Users/augustss/.mcabal/mhs-0.15.0.0/packages/base-0.15.0.0/data"
− lib/dist-mcabal/autogen/Paths_libs.hs
@@ -1,4 +0,0 @@-module Paths_libs where-import Data.Version-version :: Version; version = makeVersion [0,13,0,0]-getDataDir :: IO FilePath; getDataDir = return "/Users/augustss/.mcabal/mhs-0.13.0.0/packages/base-0.13.0.0/data"
lib/gmp/Data/Integer/Internal.hs view
@@ -9,15 +9,18 @@   andI, orI, xorI,   shiftLI, shiftRI,   testBitI, popCountI,+  log2I,   _intToInteger,-  _integerToFloatW,+  _integerToFloat,+  _integerToDouble,   _integerToInt,   _wordToInteger,   ) where import qualified Prelude() import Primitives-import Mhs.Builtin+import Control.Monad import Data.Bool+import Data.Eq import Data.Function import Data.Ord --import Foreign.Ptr(Ptr)@@ -48,6 +51,7 @@ foreign import capi "mpz_fdiv_q_2exp" mpz_fdiv_q_2exp :: Ptr MPZ -> Ptr MPZ -> Int ->                IO () foreign import capi "mpz_popcount"    mpz_popcount    :: Ptr MPZ ->                                  IO Int foreign import capi "mpz_tstbit"      mpz_tstbit      :: Ptr MPZ -> Int ->                           IO Int+foreign import capi "mpz_log2"        mpz_log2        :: Ptr MPZ ->                                  IO Int  binop :: (Ptr MPZ -> Ptr MPZ -> Ptr MPZ -> IO ()) -> Integer -> Integer -> Integer binop f (I x) (I y) = unsafePerformIO $ do@@ -159,6 +163,9 @@  popCountI :: Integer -> Int popCountI (I x) = unsafePerformIO $ withForeignPtr x mpz_popcount++log2I :: Integer -> Int+log2I (I x) = unsafePerformIO $ withForeignPtr x mpz_log2  --------------------------------- {-
lib/gmp/Data/Integer_Type.hs view
@@ -1,11 +1,16 @@ module Data.Integer_Type(   Integer(..),   MPZ, newMPZ,-  _intToInteger, _wordToInteger, _integerToInt, _integerToWord,-  _integerToFloatW,+  _intToInteger, _wordToInteger, _int64ToInteger, _word64ToInteger,+  _integerToInt, _integerToWord, _integerToInt64, _integerToWord64,+  _integerToFloat,+  _integerToDouble,   ) where import qualified Prelude() import Primitives+import Control.Error+import Data.Function(($))+import {-# SOURCE #-} Data.Typeable --import Foreign.ForeignPtr --import Mhs.Builtin --import System.IO.Unsafe@@ -26,8 +31,8 @@ foreign import capi "mpz_init_set_si" mpz_init_set_si :: Ptr MPZ -> Int -> IO () foreign import capi "mpz_init_set_ui" mpz_init_set_ui :: Ptr MPZ -> Word -> IO () foreign import capi "mpz_get_si"      mpz_get_si      :: Ptr MPZ -> IO Int-foreign import capi "mpz_get_ui"      mpz_get_ui      :: Ptr MPZ -> IO Word-foreign import capi "mpz_get_d"       mpz_get_d       :: Ptr MPZ -> IO FloatW+foreign import capi "mpz_get_f"       mpz_get_f       :: Ptr MPZ -> IO Float+foreign import capi "mpz_get_d"       mpz_get_d       :: Ptr MPZ -> IO Double  newMPZ :: IO (ForeignPtr MPZ) newMPZ =@@ -52,7 +57,36 @@ _integerToInt (I x) = primPerformIO (withForeignPtr x mpz_get_si)  _integerToWord :: Integer -> Word-_integerToWord (I x) = primPerformIO (withForeignPtr x mpz_get_ui)+_integerToWord i = primIntToWord (_integerToInt i) -_integerToFloatW :: Integer -> FloatW-_integerToFloatW (I x) = primPerformIO (withForeignPtr x mpz_get_d)+_integerToFloat :: Integer -> Float+_integerToFloat (I x) = primPerformIO (withForeignPtr x mpz_get_f)++_integerToDouble :: Integer -> Double+_integerToDouble (I x) = primPerformIO (withForeignPtr x mpz_get_d)++-------++foreign import capi "mpz_init_set_si64" mpz_init_set_si64 :: Ptr MPZ -> Int64 -> IO ()+foreign import capi "mpz_init_set_ui64" mpz_init_set_ui64 :: Ptr MPZ -> Word64 -> IO ()+foreign import capi "mpz_get_si64"      mpz_get_si64      :: Ptr MPZ -> IO Int64++_integerToInt64 :: Integer -> Int64+_integerToInt64 (I x) = primPerformIO (withForeignPtr x mpz_get_si64)++_integerToWord64 :: Integer -> Word64+_integerToWord64 i = primInt64ToWord64 (_integerToInt64 i)++_word64ToInteger :: Word64 -> Integer+_word64ToInteger i = primPerformIO (do+  newMPZ `primBind` \ x ->+  withForeignPtr x ( \ p -> mpz_init_set_ui64 p i) `primThen`+  primReturn (I x)+  )++_int64ToInteger :: Int64 -> Integer+_int64ToInteger i = primPerformIO (+  newMPZ `primBind` \ x ->+  withForeignPtr x ( \ p -> mpz_init_set_si64 p i) `primThen`+  primReturn (I x)+  )
mhs/MHSPrelude.hs view
@@ -11,10 +11,11 @@   module Data.Either,   module Data.Enum,   module Data.Eq,+  module Data.Float,   module Data.Fractional,   module Data.Function,   module Data.Functor,-  module Data.Int,+  module Data.Int.Int,   module Data.Integer,   module Data.Integral,   module Data.List,@@ -27,19 +28,24 @@   module Data.Records,   module Data.String,   module Data.Tuple,-  module System.IO,+  module Data.Typeable,+  module System.IO.Base,   module Text.Show,   first, second,-  usingMhs, _wordSize, _isWindows,+  mhsError,+  _usingMhs, _wordSize,+  _isWindows,   appendDot,   wantGMP,   compiledWithMhs,+  Int64,+  HasCallStack,   ) where import qualified Prelude() --import Primitives(primRnfNoErr, primRnfErr) import Control.Applicative(Applicative(..)) import Control.DeepSeq.Class-import Control.Error(error, undefined)+import Control.Error(error, undefined, errorWithoutStackTrace) import Control.Monad(Monad(..), mapM, mapM_, sequence, sequence_, (=<<)) import Control.Monad.Fail(MonadFail(..)) import Data.Bool(Bool(..), (&&), (||), not, otherwise)@@ -49,11 +55,12 @@ import Data.Either(Either(..), either) import Data.Enum(Enum(..)) import Data.Eq(Eq(..))+import Data.Float(Float) import Data.Fractional(Fractional(..), (^^), realToFrac) import Data.Function(id, const, (.), flip, ($), seq, ($!), until, asTypeOf) import Data.Functor(Functor(..), (<$>))-import Data.Int(Int)-import Data.Int.Instances+import Data.Int.Int(Int)+import Data.Int.Int64(Int64) import Data.Integer(Integer) import Data.Integral(Integral(..), fromIntegral, gcd, lcm, even, odd, (^)) import Data.List([](..), map, (++), filter, head, last, tail, init, null, length, (!!),@@ -72,17 +79,20 @@ import Data.Records  -- needed for data types with fields import Data.String(IsString(..), lines, unlines, words, unwords) import Data.Tuple(fst, snd, curry, uncurry)-import Data.Word(Word)-import System.IO(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,-                 FilePath, readFile, writeFile, appendFile,-                 cprint, cuprint)+import System.IO.Base(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,+                      FilePath, readFile, writeFile, appendFile,+                      cprint, cuprint) import Text.Show(Show(..), ShowS, shows, showChar, showString, showParen)+import {-# SOURCE #-} Data.Typeable import Primitives(_wordSize, _isWindows) import Data.Text(Text) +mhsError :: String -> a+mhsError = errorWithoutStackTrace+ -- So we can detect mhs vs ghc-usingMhs :: Bool-usingMhs = True+_usingMhs :: Bool+_usingMhs = True  ------- @@ -108,3 +118,6 @@  second :: forall a b c . (b -> c) -> (a, b) -> (a, c) second f (a, b) = (a, f b)++class HasCallStack+instance HasCallStack
+ mhs/MhsEval.hs view
@@ -0,0 +1,21 @@+module MhsEval (+    MhsContext,+    withMhsContext,+    run,+    compiledWithGhc+) where++compiledWithGhc :: Bool+compiledWithGhc = False++data MhsContext+type MhsCombCode = String++withMhsContext :: (MhsContext -> IO a) -> IO a+withMhsContext = err++run :: MhsContext -> MhsCombCode -> IO ()+run = err++err :: a+err = error "only supported with GHC"
mhs/System/FilePath.hs view
@@ -109,7 +109,10 @@  dropExtension :: FilePath -> FilePath --dropExtension = fst . splitExtension-dropExtension = reverse . drop 1 . dropWhile (not . isExtSeparator) . reverse+dropExtension s =+  case dropWhile (not . isExtSeparator) . reverse $ s of+    "" -> s+    s' -> reverse . drop 1 $ s'  (<.>) :: FilePath -> String -> FilePath (<.>) = addExtension
paths/Paths_MicroHs.hs view
@@ -10,4 +10,4 @@ getDataDir = return "."  version :: Version-version = makeVersion [0,13,0,0]+version = makeVersion [0,15,0,0]
src/MicroHs/Compile.hs view
@@ -2,6 +2,9 @@ -- See LICENSE file for full license. module MicroHs.Compile(   compileCacheTop,+  compileModuleP,+  compileToCombinators,+  compileInteractive,   compileMany,   maybeSaveCache,   getCached,@@ -12,8 +15,11 @@   mhsVersion,   getMhsDir,   openFilePath,+  loadPkg,+  addPreludeImport,   ) where import qualified Prelude(); import MHSPrelude+import Control.Exception import Data.Char import Data.List import Data.Maybe@@ -40,6 +46,7 @@ import MicroHs.Parse import MicroHs.StateIO import MicroHs.SymTab+import MicroHs.TCMonad(TCState) import MicroHs.TypeCheck import Paths_MicroHs(version, getDataDir) @@ -65,7 +72,10 @@   return res  compileMany :: Flags -> [IdentModule] -> Cache -> IO Cache-compileMany flags mns ach = snd <$> runStateIO (mapM_ (compileModuleCached flags ImpNormal) mns) ach+compileMany flags mns ach =+  execStateIO (do mapM_ (loadPkg flags) (preload flags)+                  mapM_ (compileModuleCached flags ImpNormal) mns)+              ach  getCached :: Flags -> IO Cache getCached flags | not (readCache flags) = return emptyCache@@ -86,28 +96,40 @@       putStrLn $ "Saving cache " ++ show mhsCacheName     saveCache mhsCacheName cash +-- Load the real modules for imported boot modules.+-- Doing so can result in more boot imports, so we recurse.+loadBoots :: Flags -> CM ()+loadBoots flags = do+  bs <- gets getBoots+  case bs of+    [] -> return ()+    bmn:_ -> do+      when (verbosityGT flags 0) $+        liftIO $ putStrLn $ "compiling used boot module " ++ showIdent bmn+      _ <- compileModuleCached flags ImpNormal bmn+      loadBoots flags+ compile :: Flags -> IdentModule -> Cache -> IO ((IdentModule, [LDef]), Symbols, Cache) compile flags nm ach = do   let comp = do---XXX        modify $ addBoot $ mkIdent "Control.Exception.Internal"      -- the compiler generates references to this module-        r <- compileModuleCached flags ImpNormal nm-        let loadBoots = do-              bs <- gets getBoots-              case bs of-                [] -> return ()-                bmn:_ -> do-                  when (verbosityGT flags 0) $-                    liftIO $ putStrLn $ "compiling used boot module " ++ showIdent bmn-                  _ <- compileModuleCached flags ImpNormal bmn-                  loadBoots-        loadBoots+        mapM_ (loadPkg flags) (preload flags)+        res <- compileModuleCached flags ImpNormal nm+        loadBoots flags         loadDependencies flags-        return r+        return res   ((cm, syms, t), ch) <- runStateIO comp ach   when (verbosityGT flags 0) $     putStrLn $ "total import time     " ++ padLeft 6 (show t) ++ "ms"   return ((tModuleName cm, concatMap tBindingsOf $ cachedModules ch), syms, ch) +-- Compile a module for the interactive system+compileInteractive :: Flags -> EModule -> CM (TModule [LDef], Symbols, TCState)+compileInteractive flags mdl = do+  ((dmdl, syms, _, _, _), tcstate) <- compileModuleP flags ImpNormal mdl+  loadBoots flags+  loadDependencies flags+  return (dmdl, syms, tcstate)+ -- Compile a module with the given name. -- If the module has already been compiled, return the cached result. -- If the module has not been compiled, first try to find a source file.@@ -138,6 +160,8 @@                 when (verbosityGT flags 2) $                   putStrLn $ " (" ++ show pathfn ++ ")"                 putStrLn ""+              dumpIf flags Dpreproc $+                liftIO $ putStrLn $ "preprocessed:\n" ++ file               modify $ addWorking mn               compileModule flags ImpNormal mn pathfn file     Just tm -> do@@ -164,8 +188,10 @@     putStrLnInd $ "importing boot " ++ showIdent mn   mres <- liftIO (readModulePath flags ".hs-boot" mn)   case mres of-    Nothing -> error $ "boot module not found: " ++ showIdent mn+    Nothing -> mhsError $ "boot module not found: " ++ showIdent mn     Just (pathfn, file) -> do+      dumpIf flags Dpreproc $+        liftIO $ putStrLn $ "preprocessed:\n" ++ file       modify $ addBoot mn       compileModule flags ImpBoot mn pathfn file @@ -177,58 +203,71 @@       chksum = fromMaybe undefined mchksum   when (verbosityGT flags 4) $     liftIO $ putStrLn $ "parsing: " ++ pathfn-  let pmdl = parseDie pTop pathfn file+  let pmdl@(EModule mnn _ _) = parseDie pTop pathfn file+  t2 <- liftIO (seq pmdl getTimeMilli)   dumpIf flags Dparse $     liftIO $ putStrLn $ "parsed:\n" ++ show pmdl-  let mdl@(EModule mnn _ defs) = addPreludeImport pmdl+  when (isNothing (getFileName mn) && mn /= mnn) $+    mhsError $ "module name does not agree with file name: " ++ showIdent mn ++ " " ++ showIdent mnn+  ((dmdl, syms, imported, tTCDesug, tImp), _) <- compileModuleP flags impt (addPreludeImport pmdl) +  t4 <- liftIO getTimeMilli+  cmdl <- liftIO $ evaluate $ compileToCombinators dmdl+  t5 <- liftIO getTimeMilli++  let tParse = t2 - t1+      tAbstract = t5 - t4+      tThis = tParse + tTCDesug + tAbstract++  dumpIf flags Ddesugar $+    liftIO $ putStrLn $ "desugared:\n" ++ showTModule showLDefs dmdl+  when (verbosityGT flags 0) $+    putStrLnInd $ "importing done " ++ showIdent mn ++ ", " ++ show tThis ++ "ms " +++                  " (" ++ show tParse ++ " + " ++ show tTCDesug ++ " + " ++ show tAbstract ++ ")"+  when (loading flags && mn /= mkIdent "Interactive" && not (verbosityGT flags 0)) $+    liftIO $ putStrLn $ "loaded " ++ showIdent mn ++ " (" ++ pathfn ++ ")"++  case impt of+    ImpNormal -> modify $ workToDone (cmdl, map snd imported, chksum)+    ImpBoot   -> return ()+  return (cmdl, syms, tThis + tImp)++compileModuleP :: Flags -> ImpType -> EModule -> CM ((TModule [LDef], Symbols, [(ImpType, IdentModule)], Time, Time), TCState)+compileModuleP flags impt mdl@(EModule _ _ defs) = do   -- liftIO $ putStrLn $ showEModule mdl   -- liftIO $ putStrLn $ showEDefs defs-  -- TODO: skip test when mn is a file name-  when (isNothing (getFileName mn) && mn /= mnn) $-    error $ "module name does not agree with file name: " ++ showIdent mn ++ " " ++ showIdent mnn   let     specs = [ s | Import s <- defs ]     imported = [ (boot, m) | ImportSpec boot _ m _ _ <- specs ]-  t2 <- liftIO getTimeMilli   (impMdls, _, tImps) <- unzip3 <$> mapM (uncurry $ compileModuleCached flags) imported    t3 <- liftIO getTimeMilli   glob <- gets getCacheTables   let-    (tmdl, glob', syms) = typeCheck flags glob impt (zip specs impMdls) mdl+    (tmdl, glob', syms, tcstate) = typeCheck flags glob impt (zip specs impMdls) mdl   modify $ setCacheTables glob'   dumpIf flags Dtypecheck $     liftIO $ putStrLn $ "type checked:\n" ++ showTModule showEDefs tmdl ++ "-----\n"   let     dmdl = desugar flags tmdl-   t4 <- liftIO getTimeMilli-  let-    cmdl = setBindings dmdl [ (i, compileOpt e) | (i, e) <- tBindingsOf dmdl ]-  () <- return $ rnf cmdl  -- This makes execution slower, but speeds up GC-  t5 <- liftIO getTimeMilli -  let tParse = t2 - t1-      tTCDesug = t4 - t3-      tAbstract = t5 - t4-      tThis = tParse + tTCDesug + tAbstract+  let tThis = t4 - t3       tImp = sum tImps -  dumpIf flags Ddesugar $-    liftIO $ putStrLn $ "desugared:\n" ++ showTModule showLDefs dmdl-  when (verbosityGT flags 0) $-    putStrLnInd $ "importing done " ++ showIdent mn ++ ", " ++ show tThis ++-            "ms (" ++ show tParse ++ " + " ++ show tTCDesug ++ " + " ++ show tAbstract ++ ")"-  when (loading flags && mn /= mkIdent "Interactive" && not (verbosityGT flags 0)) $-    liftIO $ putStrLn $ "loaded " ++ showIdent mn ++ " (" ++ pathfn ++ ")"--  case impt of-    ImpNormal -> modify $ workToDone (cmdl, map snd imported, chksum)-    ImpBoot   -> return ()+  return ((dmdl, syms, imported, tThis, tImp), tcstate) -  return (cmdl, syms, tThis + tImp)+compileToCombinators :: TModule [LDef] -> TModule [LDef]+compileToCombinators dmdl = do+  let cmdl = setBindings dmdl [ (i, compileOpt e) | (i, e) <- tBindingsOf dmdl ]+  seq (rnf cmdl) cmdl  -- This makes execution slower, but speeds up GC +-- Add implicit imports:+--   import Prelude+--   import Mhs.Builting as B@+-- No implicitr imports are added when+--   import qualified Prelude()+-- is present. addPreludeImport :: EModule -> EModule addPreludeImport (EModule mn es ds) =   EModule mn es ds'@@ -291,10 +330,16 @@  -- Is the module name actually a file name? getFileName :: IdentModule -> Maybe String-getFileName m | ".hs" `isSuffixOf` s = Just s+getFileName m | ".hs" `isSuffixOf` s || ".lhs" `isSuffixOf` s ||+                not (validModuleName s) = Just s               | otherwise = Nothing   where s = unIdent m +-- A hack to allow files that don't end in .hs+validModuleName :: String -> Bool+validModuleName (uc:s) = isUpper uc && all (\ c -> isAlphaNum c || c == '.' || c == '_' || c == '\'') s+validModuleName _ = False+ readModulePath :: Flags -> String -> IdentModule -> IO (Maybe (FilePath, String)) readModulePath flags suf mn = do   case getFileName mn of@@ -314,8 +359,8 @@               case mhl of                 Nothing -> do                   return Nothing-                Just (fn, h) -> readRest fn . unlit =<< hGetContents h-            Just (_fn, _h) -> undefined  -- hsc2hs no implemented yet+                Just (fn, h) -> readRest fn . unlit fn =<< hGetContents h+            Just (fn, _h) -> readRest fn =<< runHsc2hs flags fn         Just (fn, h) -> readRest fn =<< hGetContents h   where readRest :: FilePath -> String -> IO (Maybe (FilePath, String))         readRest fn file = do@@ -334,6 +379,7 @@   let scanFor _ [] = False       scanFor s ('{':'-':'#':cs) = scanFor' s cs       scanFor _ ('m':'o':'d':'u':'l':'e':_) = False+      scanFor s ('-':'-':cs) = scanFor s (dropWhile (/= '\n') cs)       scanFor s (_:cs) = scanFor s cs       scanFor' _ [] = False       scanFor' s ('#':'-':'}':cs) = scanFor s cs@@ -387,11 +433,30 @@       mhsIncludes = ["-I" ++ datadir </> "src/runtime"]       args = mhsDefines ++ mhsIncludes ++ map quote (cppArgs flags)       cmd = cpphs ++ " --strip " ++ unwords args ++ " " ++ infile ++ " -O" ++ outfile-      quote s = "'" ++ s ++ "'"   when (verbosityGT flags 1) $     putStrLn $ "Run cpphs: " ++ show cmd   callCommand cmd +quote :: String -> String+quote s = "'" ++ s ++ "'"++runHsc2hs :: Flags -> FilePath -> IO String+runHsc2hs flags fni = do+  (fno, ho) <- openTmpFile "mhshsc2hs.hs"+  mhsc2hs <- lookupEnv "MHSHSC2HS"+  datadir <- getMhsDir+  let hsc2hs = fromMaybe "hsc2hs" mhsc2hs+      mhsIncludes = ["-I" ++ datadir </> "src/runtime"+                    ,"-I" ++ datadir </> "src/runtime/unix"]+      args = mhsDefines ++ mhsIncludes ++ map quote (cppArgs flags)+      cmd = unwords $ [hsc2hs, "-o", fno] ++ args ++ [fni]+  when (verbosityGT flags 1) $+    putStrLn $ "Run hsc2hs: " ++ show cmd+  callCommand cmd+  ofile <- hGetContents ho+  removeFile fno+  return ofile  + packageDir :: String packageDir = "packages" packageSuffix :: String@@ -413,7 +478,7 @@       loadPkg flags (dir ++ packageDir </> pkg)       cash <- get       case lookupCache mn cash of-        Nothing -> error $ "package does not contain module " ++ pkg ++ " " ++ showIdent mn+        Nothing -> mhsError $ "package does not contain module " ++ pkg ++ " " ++ showIdent mn         Just t -> do           t1 <- liftIO getTimeMilli           return (pfn, (t, noSymbols, t1 - t0))@@ -429,7 +494,7 @@     liftIO $ putStrLn $ "Loading package " ++ fn   pkg <- liftIO $ readSerialized fn   when (pkgCompiler pkg /= mhsVersion) $-    error $ "Package compile version mismatch: file=" ++ fn ++ ", package=" ++ pkgCompiler pkg ++ ", compiler=" ++ mhsVersion+    mhsError $ "Package compile version mismatch: file=" ++ fn ++ ", package=" ++ pkgCompiler pkg ++ ", compiler=" ++ mhsVersion   modify $ addPackage fn pkg  -- XXX add function to find&load package from package name@@ -440,18 +505,18 @@   loadedPkgs <- gets getPkgs   let deps = concatMap pkgDepends loadedPkgs       loaded = map pkgName loadedPkgs-      deps' = [ p | (p, _v) <- deps, p `notElem` loaded ]+      deps' = [ pv | pv@(p, _v) <- deps, p `notElem` loaded ]   if null deps' then     return ()    else do     mapM_ (loadDeps flags) deps'     loadDependencies flags  -- loadDeps can add new dependencies -loadDeps :: Flags -> IdentPackage -> CM ()-loadDeps flags pid = do-  mres <- liftIO $ openFilePath (pkgPath flags) (packageDir </> unIdent pid <.> packageSuffix)+loadDeps :: Flags -> (IdentPackage, Version) -> CM ()+loadDeps flags (pid, pver) = do+  mres <- liftIO $ openFilePath (pkgPath flags) (packageDir </> unIdent pid ++ "-" ++ showVersion pver <.> packageSuffix)   case mres of-    Nothing -> error $ "Cannot find package " ++ showIdent pid+    Nothing -> mhsError $ "Cannot find package " ++ showIdent pid     Just (pfn, hdl) -> do       liftIO $ hClose hdl       loadPkg flags pfn@@ -460,17 +525,21 @@ getMhsDir = maybe getDataDir return =<< lookupEnv "MHSDIR"  -- Deal with literate Haskell-unlit :: String -> String-unlit = unlines . un True . lines+unlit :: FilePath -> String -> String+unlit fn = unlines . un 1 True . lines   where-    un _ [] = []-    un _ (l:ls) | all isSpace l = un True ls-    un _ ("\\begin{code}":ls) = "" : code ls-    un spc (l@('#':'!':_) : ls) = l : un spc ls-    un spc (('>':l):ls) | spc = (' ':l) : un True ls-                        | otherwise = error "unlit: missing blank before >"-    un _ (_:ls) = un False ls+    un :: Int -> Bool -> [String] -> [String]+    un _ _ [] = []+    un n _ (l:ls) | all isSpace l = un (n+1) True ls+    un n _ ("\\begin{code}":ls) = "" : code (n+1) ls+    un n spc (l@('#':_) : ls) = l : un (n+1) spc ls+    un n spc (('>':l):ls) | spc = (' ':l) : un (n+1) True ls+                          | otherwise = err n "missing blank before >"+    un n _ (_:ls) = un (n+1) False ls     -- We allow non-blank to follow directly after >-    code ("\\end{code}":ls) = "" : un False ls-    code (l : ls) = l : code ls-    code [] = error "unlit: missing \\end{code}"+    code :: Int -> [String] -> [String]+    code n ("\\end{code}":ls) = "" : un (n+1) False ls+    code n (l : ls) = l : code (n+1) ls+    code n [] = err n "unlit: missing \\end{code}"+    err :: Int -> String -> a+    err n s = error $ "unlit: " ++ fn ++ ":" ++ show n ++ ": " ++ s
src/MicroHs/CompileCache.hs view
@@ -82,7 +82,7 @@ addWorking mn c =   let ws = working c   in  if mn `elem` ws then-        error $ "recursive module: " ++ showIdent mn ++ ", import chain: " ++ unwords (map showIdent ws)+        mhsError $ "recursive module: " ++ showIdent mn ++ ", import chain: " ++ unwords (map showIdent ws)       else         c{ working = mn : ws } 
src/MicroHs/Deriving.hs view
@@ -1,10 +1,12 @@-module MicroHs.Deriving(deriveStrat, expandField, mkGetName, etaReduce) where+module MicroHs.Deriving(deriveStrat, expandField, mkGetName, etaReduce, mkTypeableInst) where import qualified Prelude(); import MHSPrelude import Data.Char import Data.Function import Data.List+import Data.Maybe(fromMaybe) import MicroHs.Builtin import MicroHs.Expr+import MicroHs.Fixity(defaultFixity) import MicroHs.Ident import qualified MicroHs.IdentMap as M import MicroHs.List@@ -21,11 +23,12 @@ --   constructor names in the derived type unqualified --   all other names should be qualified with B@ -deriveStrat :: Maybe EConstraint -> Bool -> LHS -> [Constr] -> DerStrategy -> (Int, EConstraint) -> T [EDef]+deriveStrat :: StandM -> Bool -> LHS -> [Constr] -> DerStrategy -> (Int, EConstraint) -> T [EDef] deriveStrat mctx newt lhs cs strat (narg, cls) =  -- narg is the number of arguments that need eta reducing --  trace ("deriveStrat " ++ show (mctx, newt, lhs, cs, strat, narg, cls)) $   case strat of-    DerNone | newt && useNewt cls -> newtypeDer  mctx narg lhs (cs!!0) cls Nothing+    DerNone | newt && useNewt cls -> maybe (deriveNoHdr mctx narg lhs cs cls) return =<<+                                     newtypeDerM mctx narg lhs (cs!!0) cls Nothing             | otherwise           -> deriveNoHdr mctx narg lhs cs cls     DerStock                      -> deriveNoHdr mctx narg lhs cs cls     DerNewtype | newt             -> newtypeDer  mctx narg lhs (cs!!0) cls Nothing@@ -33,21 +36,27 @@     DerVia via | newt             -> newtypeDer  mctx narg lhs (cs!!0) cls (Just via)     _                             -> cannotDerive lhs cls   where useNewt d = unIdent (getAppCon d) `notElem`-          ["Data.Data.Data", "Data.Typeable.Typeable", "GHC.Generics.Generic",+          ["Data.Data_Class.Data", "Data.Typeable.Typeable", "GHC.Generics.Generic",            "Language.Haskell.TH.Syntax.Lift", "Text.Read.Internal.Read", "Text.Show.Show"]  type DeriverT = Int -> LHS -> [Constr] -> EConstraint -> T [EDef]   -- Bool indicates a newtype-type Deriver = Maybe EConstraint -> DeriverT+type Deriver = StandM -> DeriverT+-- StandM is+--   Nothing for regular deriving+--   Just (instance-context, qualified-type-name) for standalone+type StandM = Maybe (EConstraint, Ident)  derivers :: [(String, Deriver)] derivers =   [("Data.Bounded.Bounded",            derBounded)   ,("Data.Enum_Class.Enum",            derEnum)-  ,("Data.Data.Data",                  derData)+  ,("Data.Data_Class.Data",            derData)   ,("Data.Eq.Eq",                      derEq)-  ,("Data.Functor.Functor",            derNotYet) -- derFunctor)-  ,("Data.Ix.Ix",                      derNotYet)+  ,("Data.Foldable.Foldable",          derFoldable)+  ,("Data.Functor.Functor",            derFunctor)+  ,("Data.Ix.Ix",                      derIx)   ,("Data.Ord.Ord",                    derOrd)+  ,("Data.Traversable.Traversable",    derTraversable)   ,("Data.Typeable.Typeable",          derTypeable)   ,("GHC.Generics.Generic",            derNotYet)   ,("Language.Haskell.TH.Syntax.Lift", derLift)@@ -55,9 +64,9 @@   ,("Text.Show.Show",                  derShow)   ] -deriveNoHdr :: Maybe EConstraint -> DeriverT+deriveNoHdr :: StandM -> DeriverT deriveNoHdr mctx narg lhs cs d = do---  traceM ("deriveNoHdr " ++ show d)+  --traceM ("deriveNoHdr " ++ show (narg, lhs, d))   case getDeriver d of     Just f -> f mctx narg lhs cs d     _      -> cannotDerive lhs d@@ -78,17 +87,34 @@ derLift :: Deriver derLift _ _ _ _ _ = return [] +-- Get the name of the module where the type is defined.+-- For regular deriving it's the current module, for standalone it's elsewhere.+getDefModuleName :: StandM -> T IdentModule+getDefModuleName mctx = maybe (gets moduleName) (pure . qualOf . snd) mctx++-- Get a fixity lookup function.+-- The fixity table has qualified names as keys, so qualify first.+getFixLookup :: StandM -> T (Ident -> Fixity)+getFixLookup mctx = do+  mn <- getDefModuleName mctx+  fxt <- gets fixTable+  pure $ \ i -> fromMaybe defaultFixity (M.lookup (qualIdent mn i) fxt)+ --------------------------------------------  expandField :: EDef -> T [EDef]-expandField def@(Data    lhs cs _) = (++ [def]) <$> genHasFields lhs cs-expandField def@(Newtype lhs  c _) = (++ [def]) <$> genHasFields lhs [c]-expandField def                    = return [def]+expandField def@(Data    lhs cs ds) | not (doNotDerive ds) = (++ [def]) <$> genHasFields lhs cs+expandField def@(Newtype lhs  c ds) | not (doNotDerive ds) = (++ [def]) <$> genHasFields lhs [c]+expandField def                                            = return [def]  genHasFields :: LHS -> [Constr] -> T [EDef] genHasFields lhs cs = do-  let fldtys = nubBy ((==) `on` fst) [ (fld, ty) | Constr _ _ _ (Right fs) <- cs, (fld, (_, ty)) <- fs ]---      flds = map fst fldtys+  let -- filter out fields with existential variables, the selector type makes no sense for there.+      fldtys = nubBy ((==) `on` fst) [ (fld, ty)+                                     | Constr evks _ _ _ (Right fs) <- cs+                                     , let evs = map idKindIdent evks  -- existential variables+                                     , (fld, (_, ty)) <- fs+                                     , null (freeTyVars [ty] `intersect` evs) ]   concat <$> mapM (genHasField lhs cs) fldtys  genHasField :: LHS -> [Constr] -> (Ident, EType) -> T [EDef]@@ -111,13 +137,13 @@                                    (ELit loc (LStr ufld))                                    (eApps (EVar qtycon) (map (EVar . idKindIdent) iks))                                    fldty-      conEqnGet (Constr _ _ c (Left ts))   = eEqn [eApps (EVar c) (map (const eDummy) ts)] undef-      conEqnGet (Constr _ _ c (Right fts)) = eEqn [conApp] $ if fld `elem` fs then rhs else undef+      conEqnGet (Constr _ _ c _ (Left ts))   = eEqn [eApps (EVar c) (map (const eDummy) ts)] undef+      conEqnGet (Constr _ _ c _ (Right fts)) = eEqn [conApp] $ if fld `elem` fs then rhs else undef         where fs = map fst fts               conApp = eApps (EVar c) (map EVar fs)               rhs = eFld-      conEqnSet (Constr _ _ c (Left ts))   = eEqn [eDummy, eApps (EVar c) (map (const eDummy) ts)] undef-      conEqnSet (Constr _ _ c (Right fts)) = eEqn [eDummy, conApp] $ if fld `elem` fs then rhs else undef+      conEqnSet (Constr _ _ c _ (Left ts))   = eEqn [eDummy, eApps (EVar c) (map (const eDummy) ts)] undef+      conEqnSet (Constr _ _ c _ (Right fts)) = eEqn [eDummy, conApp] $ if fld `elem` fs then rhs else undef         where fs = map fst fts               conApp = eApps (EVar c) (map EVar fs)               rhs = eLam [eFld] conApp@@ -130,30 +156,40 @@   pure $ [ Sign [getName] $ eForall iks $ lhsToType (qtycon, iks) `tArrow` fldty          , Fcn getName $ map conEqnGet cs ]     ++ if not (validType fldty) then [] else-         [ Instance hdrGet [Fcn igetField [eEqn [eDummy] $ EVar getName] ]-         , Instance hdrSet [Fcn isetField $ map conEqnSet cs]+         [ Instance hdrGet [Fcn igetField [eEqn [eDummy] $ EVar getName] ] []+         , Instance hdrSet [Fcn isetField $ map conEqnSet cs] []          ] +-- Given a (qualified) type name and a field name,+-- return the name of the selector function. mkGetName :: Ident -> Ident -> Ident-mkGetName tycon fld = qualIdent (mkIdent "get") $ qualIdent tycon fld+mkGetName tycon fld = qualIdent (mkIdent "get$") $ qualIdent tycon fld  --------------------------------------------  derTypeable :: Deriver-derTypeable _ 0 (i, _) _ etyp = do-  mn <- gets moduleName+derTypeable mctx 0 (i, _) _ _ = do+  -- The module name we need is the current module for regular deriving,+  -- and the module of the type for standalone deriving.+  -- We use mctx to decide which it is.+  mn <- getDefModuleName mctx+  return [mkTypeableInst mn i]+derTypeable _ _ lhs _ e = cannotDerive lhs e++-- Generate a Typeable instance given a module and type/class name.+mkTypeableInst :: IdentModule -> Ident -> EDef+mkTypeableInst mn i =   let     loc = getSLoc i     itypeRep  = mkIdentSLoc loc "typeRep"-    imkTyConApp = mkBuiltin loc "mkTyConApp"-    imkTyCon = mkBuiltin loc "mkTyCon"+    i_mkTyCon = mkBuiltin loc "_mkTyCon"+    etyp = EVar (mkIdentSLoc loc nameDataTypeableTypeable)     hdr = EApp etyp (EVar $ qualIdent mn i)     mdl = ELit loc $ LStr $ unIdent mn     nam = ELit loc $ LStr $ unIdent i-    eqns = eEqns [eDummy] $ eAppI2 imkTyConApp (eAppI2 imkTyCon mdl nam) (EListish (LList []))-    inst = Instance hdr [Fcn itypeRep eqns]-  return [inst]-derTypeable _ _ lhs _ e = cannotDerive lhs e+    eqns = eEqns [] $ eAppI2 i_mkTyCon mdl nam+    inst = Instance hdr [Fcn itypeRep eqns] []+  in inst  -------------------------------------------- @@ -161,55 +197,88 @@ getFieldTys (Left ts) = map snd ts getFieldTys (Right ts) = map (snd . snd) ts -decomp :: EType -> [EType]-decomp t =-  case getAppM t of-    Just (c, ts) | isConIdent c -> concatMap decomp ts-    _                           -> [t]- -- If there is no mctx we use the default strategy to derive the instance context.--- The default strategy basically extracts all subtypes with variables.-mkHdr :: Maybe EConstraint -> LHS -> [Constr] -> EConstraint -> T EConstraint-mkHdr (Just ctx) _ _ _ = return ctx+-- The default strategy basically is to require the class constraint for every+-- constructor argument (except direct recursion) with free type variables.+-- E.g.  data T = C a | D (a, Int) deriving Eq+-- will get context  (Eq a, Eq (a, Int))+-- Used for regular deriving, not standalone.+mkHdr :: StandM -> LHS -> [Constr] -> EConstraint -> T EConstraint+mkHdr (Just (ctx, _)) _ _ _ = return ctx mkHdr _ lhs@(_, iks) cs cls = do-  ty <- mkLhsTy lhs+  ty <- mkLhsTy 0 lhs   let ctys :: [EType]  -- All top level types used by the constructors.-      ctys = nubBy eqEType [ tt | Constr evs _ _ flds <- cs, ft <- getFieldTys flds, tt <- decomp ft,+      ctys = nubBy eqEType [ tt | Constr evs _ _ _ flds <- cs, tt <- getFieldTys flds,                             not $ null $ freeTyVars [tt] \\ map idKindIdent evs, not (eqEType ty tt) ]   pure $ eForall iks $ addConstraints (map (tApp cls) ctys) $ tApp cls ty -mkLhsTy :: LHS -> T EType-mkLhsTy (t, iks) = do+-- instance header for Functor, Foldable, Traversable+mkHdr1 :: StandM -> LHS -> [Constr] -> EConstraint -> T EConstraint+mkHdr1 (Just (ctx, _)) _ _ _ = return ctx+mkHdr1 _ lhs@(_, iks) cs cls = do+  ty' <- mkLhsTy 1 lhs+  let tvar = idKindIdent $ last iks        -- safe, because iks is non-null when calling mkHdr1+      ctys :: [EType]                             -- All top level types used by the constructors.+      ctys = nubBy eqEType [ tt+                           | Constr evs _ _ _ flds <- cs+                           , t <- getFieldTys flds+                           , tt <- mkCtx t+                           , not (tt `eqEType` ty')+                           , not $ null $ freeTyVars [tt] \\ map idKindIdent evs+                           ]+      mkCtx :: EType -> [EType]+      mkCtx t =+        case getExprTuple t of+          Just ts -> concatMap mkCtx ts+          Nothing ->+            case getAppM t of+              Just (con, ts@(_:_)) ->+                let tt = eApps (EVar con) (init ts) in+                case last ts of+                  EVar v | v == tvar -> [tt]+                         | otherwise -> []+                  _ ->+                    case mkCtx (last ts) of+                      [] -> []+                      tts -> tt : tts+              _ -> []+  pure $ eForall (init iks) $ addConstraints (map (tApp cls) ctys) $ tApp cls ty'++-- Used for regular deriving, not standalone.+mkLhsTy :: Int -> LHS -> T EType+mkLhsTy narg (t, iks) = do   mn <- gets moduleName-  return $ tApps (qualIdent mn t) $ map tVarK iks+  return $ tApps (qualIdent mn t) $ map tVarK $ dropEnd narg iks  mkPat :: Constr -> String -> (EPat, [Expr])-mkPat (Constr _ _ c flds) s =+mkPat (Constr _ _ c _ flds) s =   let n = either length length flds-      loc = getSLoc c-      vs = map (EVar . mkIdentSLoc loc . (s ++) . show) [1..n]+      vs = mkVars (getSLoc c) n s   in  (tApps c vs, vs) +mkVars :: SLoc -> Int -> String -> [Expr]+mkVars loc n s = map (EVar . mkIdentSLoc loc . (s ++) . show) [1..n]+ cannotDerive :: LHS -> EConstraint -> T [EDef] cannotDerive (c, _) e = tcError (getSLoc e) $ "Cannot derive " ++ showEType (EApp e (EVar c))  --------------------------------------------  derEq :: Deriver-derEq mctx 0 lhs cs@(_:_) eeq = do+derEq mctx 0 lhs cs eeq = do   hdr <- mkHdr mctx lhs cs eeq   let loc = getSLoc eeq       mkEqn c =-        let (xp, xs) = mkPat c "x"-            (yp, ys) = mkPat c "y"+        let (xp, xs) = mkPat c "x$"+            (yp, ys) = mkPat c "y$"         in  eEqn [xp, yp] $ if null xs then eTrue else foldr1 eAnd $ zipWith eEq xs ys-      eqns = map mkEqn cs ++ [eEqn [eDummy, eDummy] eFalse]+      eqns = if null cs then [eEqn [eDummy, eDummy] eTrue] else map mkEqn cs ++ [eEqn [eDummy, eDummy] eFalse]       iEq = mkIdentSLoc loc "=="-      eEq = EApp . EApp (EVar $ mkBuiltin loc "==")-      eAnd = EApp . EApp (EVar $ mkBuiltin loc "&&")+      eEq = eAppI2 (mkBuiltin loc "==")+      eAnd = eAppI2 (mkBuiltin loc "&&")       eTrue = EVar $ mkBuiltin loc "True"       eFalse = EVar $ mkBuiltin loc "False"-      inst = Instance hdr [Fcn iEq eqns]+      inst = Instance hdr [Fcn iEq eqns] [] --  traceM $ showEDefs [inst]   return [inst] derEq _ _ lhs _ e = cannotDerive lhs e@@ -217,23 +286,23 @@ --------------------------------------------  derOrd :: Deriver-derOrd mctx 0 lhs cs@(_:_) eord = do+derOrd mctx 0 lhs cs eord = do   hdr <- mkHdr mctx lhs cs eord   let loc = getSLoc eord       mkEqn c =-        let (xp, xs) = mkPat c "x"-            (yp, ys) = mkPat c "y"+        let (xp, xs) = mkPat c "x$"+            (yp, ys) = mkPat c "y$"         in  [eEqn [xp, yp] $ if null xs then eEQ else foldr1 eComb $ zipWith eCompare xs ys             ,eEqn [xp, eDummy] eLT             ,eEqn [eDummy, yp] eGT]-      eqns = concatMap mkEqn cs+      eqns = if null cs then [eEqn [eDummy, eDummy] eEQ] else concatMap mkEqn cs       iCompare = mkIdentSLoc loc "compare"-      eCompare = EApp . EApp (EVar $ mkBuiltin loc "compare")-      eComb = EApp . EApp (EVar $ mkBuiltin loc "<>")+      eCompare = eAppI2 (mkBuiltin loc "compare")+      eComb = eAppI2 (mkBuiltin loc "<>")       eEQ = EVar $ mkBuiltin loc "EQ"       eLT = EVar $ mkBuiltin loc "LT"       eGT = EVar $ mkBuiltin loc "GT"-      inst = Instance hdr [Fcn iCompare eqns]+      inst = Instance hdr [Fcn iCompare eqns] [] --  traceM $ showEDefs [inst]   return [inst] derOrd _ _ lhs _ e = cannotDerive lhs e@@ -244,7 +313,7 @@ derBounded mctx 0 lhs cs@(c0:_) ebnd = do   hdr <- mkHdr mctx lhs cs ebnd   let loc = getSLoc ebnd-      mkEqn bnd (Constr _ _ c flds) =+      mkEqn bnd (Constr _ _ c _ flds) =         let n = either length length flds         in  eEqn [] $ tApps c (replicate n (EVar bnd)) @@ -252,7 +321,7 @@       iMaxBound = mkIdentSLoc loc "maxBound"       minEqn = mkEqn iMinBound c0       maxEqn = mkEqn iMaxBound (last cs)-      inst = Instance hdr [Fcn iMinBound [minEqn], Fcn iMaxBound [maxEqn]]+      inst = Instance hdr [Fcn iMinBound [minEqn], Fcn iMaxBound [maxEqn]] []   -- traceM $ showEDefs [inst]   return [inst] derBounded _ _ lhs _ e = cannotDerive lhs e@@ -264,12 +333,8 @@   hdr <- mkHdr mctx lhs cs enm   let loc = getSLoc enm -      mkFrom (Constr _ _ c _) i =-        eEqn [EVar c] $ ELit loc (LInt i)-      mkTo (Constr _ _ c _) i =-        eEqn [ELit loc (LInt i)] $ EVar c-      eFirstCon = case c0 of Constr _ _ c _ -> tCon c-      eLastCon = case last cs of Constr _ _ c _ -> tCon c+      eFirstCon = case c0 of Constr _ _ c _ _ -> tCon c+      eLastCon = case last cs of Constr _ _ c _ _ -> tCon c        iFromEnum = mkIdentSLoc loc "fromEnum"       iToEnum = mkIdentSLoc loc "toEnum"@@ -277,8 +342,6 @@       iEnumFromThen = mkIdentSLoc loc "enumFromThen"       iEnumFromTo = mkBuiltin loc "enumFromTo"       iEnumFromThenTo = mkBuiltin loc "enumFromThenTo"-      fromEqns = zipWith mkFrom cs [0..]-      toEqns   = zipWith mkTo   cs [0..] ++ [eEqn [eDummy] $ EApp (EVar $ mkBuiltin loc "error") (ELit loc (LStr "toEnum: out of range"))]       enumFromEqn =         -- enumFrom x = enumFromTo x (last cs)         let x = EVar (mkIdentSLoc loc "x")@@ -289,25 +352,84 @@           x1 = EVar (mkIdentSLoc loc "x1")           x2 = EVar (mkIdentSLoc loc "x2")         in eEqn [x1, x2] (EIf (eAppI2 (mkBuiltin loc ">=") (EApp (EVar iFromEnum) x2) (EApp (EVar iFromEnum) x1)) (eAppI3 iEnumFromThenTo x1 x2 eLastCon) (eAppI3 iEnumFromThenTo x1 x2 eFirstCon))-      inst = Instance hdr [Fcn iFromEnum fromEqns, Fcn iToEnum toEqns, Fcn iEnumFrom [enumFromEqn], Fcn iEnumFromThen [enumFromThenEqn]]+      inst = Instance hdr [Fcn iFromEnum (fromEnumEqns loc cs), Fcn iToEnum (toEnumEqns loc cs), Fcn iEnumFrom [enumFromEqn], Fcn iEnumFromThen [enumFromThenEqn]] []   return [inst] derEnum _ _ lhs _ e = cannotDerive lhs e  isNullary :: Constr -> Bool-isNullary (Constr _ _ _ flds) = either null null flds+isNullary (Constr _ _ _ _ flds) = either null null flds +fromEnumEqns :: SLoc -> [Constr] -> [Eqn]+fromEnumEqns loc cs = zipWith mkFrom cs [0..]+  where+    mkFrom (Constr _ _ c _ _) i = eEqn [EVar c] $ ELit loc (LInt i)++toEnumEqns :: SLoc -> [Constr] -> [Eqn]+toEnumEqns loc cs = zipWith mkTo cs [0..] ++ [eEqn [eDummy] $ eAppI (mkBuiltin loc "error") (ELit loc (LStr "toEnum: out of range"))]+  where+    mkTo (Constr _ _ c _ _) i = eEqn [ELit loc (LInt i)] $ EVar c+ -------------------------------------------- +derIx :: Deriver+derIx mctx 0 lhs cs@(c0:cs') eix = do+  hdr <- mkHdr mctx lhs cs eix+  let loc = getSLoc eix+      iRange       = mkIdentSLoc loc "range"+      iUnsafeIndex = mkIdentSLoc loc "unsafeIndex"+      iInRange     = mkIdentSLoc loc "inRange"+  if all isNullary cs then do+    let iToInt = mkIdentSLoc loc "toInt"+        iFromInt = mkIdentSLoc loc "fromInt"+        eToInt = eAppI iToInt+        eFromInt = eAppI iFromInt+        eEnumFromTo = eAppI2 (mkBuiltin loc "enumFromTo")+        eSub = eAppI2 (mkBuiltin loc "-")+        eAnd = eAppI2 (mkBuiltin loc "&&")+        eLE = eAppI2 (mkBuiltin loc "<=")+        x = EVar (mkIdentSLoc loc "x")+        y = EVar (mkIdentSLoc loc "y")+        z = EVar (mkIdentSLoc loc "z")+        w = EVar (mkIdentSLoc loc "w")+        rangeEqn = eEqn [ETuple [x, y]] $ EListish (LCompr (eFromInt z) [SBind z (eEnumFromTo (eToInt x) (eToInt y))])+        unsafeIndexEqn = eEqn [ETuple [x, eDummy], y] $ eSub (eToInt y) (eToInt x)+        inRangeEqn = eEqn [ETuple [x, y], z] $ ECase (eToInt z) [(w, oneAlt $ eAnd (eLE (eToInt x) w) (eLE w (eToInt y)))]+        inst = Instance hdr [Fcn iRange [rangeEqn], Fcn iUnsafeIndex [unsafeIndexEqn], Fcn iInRange [inRangeEqn]] [Fcn iToInt (fromEnumEqns loc cs), Fcn iFromInt (toEnumEqns loc cs)]+    return [inst]+  else if null cs' then do+    let Constr _ _ iC0 _ _ = c0+        eAnd = eAppI2 (mkBuiltin loc "&&")+        eAdd = eAppI2 (mkBuiltin loc "+")+        eMul = eAppI2 (mkBuiltin loc "*")+        iUnsafeRangeSize = mkIdentSLoc loc "unsafeRangeSize"+        (xp, xs) = mkPat c0 "x$"+        (yp, ys) = mkPat c0 "y$"+        (zp, zs) = mkPat c0 "z$"+        rangeEqn = eEqn [ETuple [xp, yp]] $ EListish (LCompr (tApps iC0 zs) (zipWith3 (\x y z -> SBind z (eAppI iRange (ETuple [x, y]))) xs ys zs))+        unsafeIndexEqn =+          let mkUnsafeIndex x y z = eAppI2 iUnsafeIndex (ETuple [x, y]) z+              mkUnsafeRangeSize x y = eAppI iUnsafeRangeSize (ETuple [x, y])+          in eEqn [ETuple [xp, yp], zp] $ foldl (\ acc (x, y, z) -> eAdd (mkUnsafeIndex x y z) (eMul (mkUnsafeRangeSize x y) acc)) (mkUnsafeIndex (head xs) (head ys) (head zs)) $ zip3 (tail xs) (tail ys) (tail zs)+        inRangeEqn = eEqn [ETuple [xp, yp], zp] $ foldr1 eAnd $ zipWith3 (\x y z -> eAppI2 iInRange (ETuple [x, y]) z) xs ys zs+        inst = Instance hdr [Fcn iRange [rangeEqn], Fcn iUnsafeIndex [unsafeIndexEqn], Fcn iInRange [inRangeEqn]] []+    return [inst]+  else+    cannotDerive lhs eix+derIx _ _ lhs _ e = cannotDerive lhs e++--------------------------------------------+ derShow :: Deriver-derShow mctx 0 lhs cs@(_:_) eshow = do+derShow mctx 0 lhs cs eshow = do   hdr <- mkHdr mctx lhs cs eshow+  fixLookup <- getFixLookup mctx  -- fixity lookup function.  Not used yet.   let loc = getSLoc eshow-      mkEqn c@(Constr _ _ nm flds) =-        let (xp, xs) = mkPat c "x"-        in  eEqn [varp, xp] $ showRHS nm xs flds+      mkEqn c@(Constr _ _ name isInfix fields) =+        let (xp, xs) = mkPat c "x$"+        in  eEqn [varp, xp] $ showRHS name isInfix xs fields        var = EVar . mkBuiltin loc-      varp = EVar $ mkIdent "p"+      varp = EVar $ mkIdentSLoc loc "p"       lit = ELit loc        iShowsPrec = mkIdentSLoc loc "showsPrec"@@ -317,20 +439,25 @@       eShowL s = foldr1 ejoin . intersperse (eShowString s)       ejoin = eApp2 (var ".") -      showRHS nm [] _ = eShowString (unIdentPar nm)-      showRHS nm xs (Left   _) = showRHSN nm xs-      showRHS nm xs (Right fs) = showRHSR nm $ zip (map fst fs) xs+      showRHS nm _ [] _ = eShowString (unIdentPar nm)+      showRHS nm inf xs (Left   _) = showRHSN nm inf xs+      showRHS nm _ xs (Right fs) = showRHSR nm $ zip (map fst fs) xs -      showRHSN nm xs = eParen 10 $ eShowL " " $ eShowString (unIdentPar nm) : map (eShowsPrec 11) xs+      showRHSN nm inf xs =+        if inf then+          let p = snd $ fixLookup nm+          in eParen p $ eShowL " " [eShowsPrec (p + 1) (xs !! 0), eShowString (unIdentTick nm), eShowsPrec (p + 1) (xs !! 1)]+        else+          eParen 10 $ eShowL " " $ eShowString (unIdentPar nm) : map (eShowsPrec 11) xs        showRHSR nm fxs =-        eShowString (unIdentPar nm ++ "{") `ejoin`-        eShowL "," (map fld fxs) `ejoin`+        eShowString (unIdentPar nm ++ " {") `ejoin`+        eShowL ", " (map fld fxs) `ejoin`         eShowString "}"-          where fld (f, x) = eShowString (unIdentPar f ++ "=") `ejoin` eShowsPrec 0 x+          where fld (f, x) = eShowString (unIdentPar f ++ " = ") `ejoin` eShowsPrec 0 x        eqns = map mkEqn cs-      inst = Instance hdr [Fcn iShowsPrec eqns]+      inst = Instance hdr [Fcn iShowsPrec eqns] [] --  traceM $ showEDefs [inst]   return [inst] derShow _ _ lhs _ e = cannotDerive lhs e@@ -340,117 +467,310 @@   let s = unIdent i   in  if isAlpha (head s) then s else "(" ++ s ++ ")" ------------------------------------------------- Deriving for the fake Data class.-derData :: Deriver-derData mctx _ lhs cs edata = do-  notYet edata-  hdr <- mkHdr mctx lhs cs edata-  let-    inst = Instance hdr []-  return [inst]+unIdentTick :: Ident -> String+unIdentTick i =+  let s = unIdent i+  in  if isAlpha (head s) then "`" ++ s ++ "`" else s  --------------------------------------------  derRead :: Deriver derRead mctx 0 lhs cs eread = do-  notYet eread   hdr <- mkHdr mctx lhs cs eread+  fixLookup <- getFixLookup mctx -- fixity lookup function   let     loc = getSLoc eread     iReadPrec = mkIdentSLoc loc "readPrec"-    err = eEqn [] $ EApp (EVar $ mkBuiltin loc "error") (ELit loc (LStr "readPrec not defined"))-    inst = Instance hdr [Fcn iReadPrec [err]]+    iReadList = mkIdentSLoc loc "readList"+    iReadListPrec = mkIdentSLoc loc "readListPrec"+    eReadListDefault = EVar (mkBuiltin loc "readListDefault")+    eReadListPrecDefault = EVar (mkBuiltin loc "readListPrecDefault")+    eParens = eAppI (mkBuiltin loc "parens")+    eChoice = eAppI2 (mkBuiltin loc "+++")+    ePrec n = eAppI2 (mkBuiltin loc "prec") (ELit loc (LInt n))+    iExpectP = mkBuiltin loc "expectP"+    eExpectIdent s = eAppI iExpectP (eAppI (mkBuiltin loc "Ident") (ELit loc (LStr s)))+    eExpectPunc s = eAppI iExpectP (eAppI (mkBuiltin loc "Punc") (ELit loc (LStr s)))+    eExpectSymbol s = eAppI iExpectP (eAppI (mkBuiltin loc "Symbol") (ELit loc (LStr s)))+    eReadField = eAppI (mkBuiltin loc "step") (EVar iReadPrec)+    eReadNamedField name = eAppI2 (mkBuiltin loc "readField") (ELit loc (LStr name)) (eAppI (mkBuiltin loc "reset") (EVar iReadPrec))+    eReturn = eAppI (mkBuiltin loc "return")+    ePfail = EVar (mkBuiltin loc "pfail")+    readConstr c@(Constr _ _ ident isInfix fields) =+      let (xe, xs) = mkPat c "x$"+          name = unIdent ident+          readName = map SThen $ if isAlpha (head name) then [eExpectIdent name] else [eExpectPunc "(", eExpectSymbol name, eExpectPunc ")"]+          readNameInfix = map SThen $ if isAlpha (head name) then [eExpectPunc "`", eExpectIdent name, eExpectPunc "`"] else [eExpectSymbol name]+      in case fields of+        Left _ ->+          if isInfix then+            ePrec (snd $ fixLookup ident) $ EDo Nothing $ [SBind (xs !! 0) eReadField] ++ readNameInfix ++ [SBind (xs !! 1) eReadField, SThen (eReturn xe)]+          else+            ePrec 10 $ EDo Nothing $ readName ++ map (\x -> SBind x eReadField) xs ++ [SThen $ eReturn xe]+        Right fs -> ePrec 11 $ EDo Nothing $ readName ++ [SThen $ eExpectPunc "{"] ++ intersperse (SThen $ eExpectPunc ",") (zipWith (\(f, _) x -> SBind x (eReadNamedField (unIdentPar f))) fs xs) ++ [SThen $ eExpectPunc "}", SThen $ eReturn xe]+    readPrecEqn = eEqn [] $ if null cs then ePfail else eParens $ foldr1 eChoice (map readConstr cs)+    readListEqn = eEqn [] eReadListDefault+    readListPrecEqn = eEqn [] eReadListPrecDefault+    inst = Instance hdr [Fcn iReadPrec [readPrecEqn], Fcn iReadList [readListEqn], Fcn iReadListPrec [readListPrecEqn]] []   return [inst] derRead _ _ lhs _ e = cannotDerive lhs e  -------------------------------------------- -newtypeDer :: Maybe EConstraint -> Int -> LHS -> Constr -> EConstraint -> Maybe EConstraint -> T [EDef]-newtypeDer mctx narg (tycon, iks) c acls mvia = do+-- Deriving for the Data class.+--  data T a = A+derData :: Deriver+derData mctx _ lhs@(utyname, vks) cs edata = do+  hdr <- mkHdr mctx lhs cs edata+  mn <- getDefModuleName mctx+  let+    tyname = qualIdent mn utyname+    loc = getSLoc edata+    mkB = mkBuiltin loc+    mkI = mkIdentSLoc loc+    lit = ELit loc+    str = lit . LStr . unIdentPar+    eList = EListish . LList+    iMkDataType = mkB "mkDataType"+    iMkConstrTag = mkB "mkConstrTag"+    iConstrIndex = mkB "constrIndex"+    iPrefix = mkB "Prefix"+    iInfix = mkB "Infix"+    eK = EVar $ mkI "k$"+    eZ = EVar $ mkI "z$"+    eC = EVar $ mkI "c$"+    gfoldlDef = Fcn (mkI "gfoldl") $ map con cs+      where con c@(Constr _ _ name _ _) = eEqn [eK, eZ, p] $ foldl (eApp2 eK) (EApp eZ (EVar name)) xs+                                          where (p, xs) = mkPat c "x$"+    gunfoldDef = Fcn (mkI "gunfold") [eEqn [eK, eZ, eC] $ ECase (eAppI iConstrIndex eC) $ zipWith con [1..] cs]+      where con k (Constr _ _ name _ eflds) = (lit $ LInt k, oneAlt $ foldr EApp (EApp eZ (EVar name)) (replicate n eK))+                                              where n = either length length eflds+    toConstrDef = Fcn (mkI "toConstr") $ zipWith con cs eConDefs+      where con c e = eEqn [fst $ mkPat c "x$"] e+    dataTypeOfDef = Fcn (mkI "dataTypeOf") [eEqn [eDummy] $ EVar iTyDef]+    dataCastDef = case length vks of+                    1 -> mk "1"+                    2 -> mk "2"+                    _ -> []+                    where mk s = [Fcn (mkI $ "dataCast" ++ s) [eEqn [] $ EVar $ mkB $ "gcast" ++ s]]+    iTyDef = mkI "ty$"+    tyDef = Fcn iTyDef [ eEqn [] $ eAppI2 iMkDataType (str tyname) (eList eConDefs) ]+    iConDefs = [ mkI $ "con$" ++ show i | i <- [1 .. length cs] ]+    eConDefs = map EVar iConDefs+    constrInfo k (Constr _ _ name infx eflds) =+      eApps (EVar iMkConstrTag) [ EVar iTyDef,+                                  str name,+                                  lit $ LInt k,+                                  eList $ map str flds,+                                  EVar $ if infx then iInfix else iPrefix+                                ]+        where flds = case eflds of Left _ -> []; Right xs -> map fst xs++    mdefs = (if null cs then [] else [gfoldlDef, gunfoldDef, toConstrDef]) +++            dataCastDef ++ [dataTypeOfDef]+    edefs = tyDef : zipWith3 (\ k i c -> Fcn i [eEqn [] $ constrInfo k c]) [1..] iConDefs cs+    inst = Instance hdr mdefs edefs+--  traceM (show inst)+  return [inst]++--------------------------------------------++derFunctor :: Deriver+derFunctor mctx 1 lhs@(_, tyvs@(_:_)) cs efunctor = do+  hdr <- mkHdr1 mctx lhs cs efunctor+  let loc = getSLoc efunctor+      var = idKindIdent (last tyvs)+      eqns = map mkEqn cs+      mkEqn c@(Constr _ _ con _ flds) =+        let (xp, xs) = mkPat c "x$"+            ts = getFieldTys flds+            rhs = eApps (EVar con) $ zipWith EApp (map (mkFmap eF) ts) xs+        in  eEqn [EVar iF, xp] rhs++      mkFmap :: Expr -> EType -> Expr    -- result has type a->a+      mkFmap f t =+        case getExprTuple t of+          Just ts ->+            let fs = map (mkFmap eF) ts+                ft = mkBuiltin loc ("fmapTuple" ++ show (length ts))+            in  eApps (EVar ft) fs+          Nothing ->+            case getAppM t of+              Just (con, []) | con == var -> f+              Just (_, ts@(_:_)) -> eFmap (mkFmap f (last ts))+              _ -> eId++      iF = mkIdentSLoc loc "f"+      eF = EVar iF+      eId = EVar (mkBuiltin loc "id")+      iFmap = mkIdentSLoc loc "fmap"+      eFmap = eAppI (mkBuiltin loc "fmap")+      inst = Instance hdr [Fcn iFmap eqns] []+  --traceM $ showEDefs [inst]+  return [inst]+derFunctor _ _ lhs _ e = cannotDerive lhs e++--------------------------------------------++derFoldable :: Deriver+derFoldable mctx 1 lhs@(_, tyvs@(_:_)) cs efoldable = do+  hdr <- mkHdr1 mctx lhs cs efoldable+  let loc = getSLoc efoldable+      var = idKindIdent (last tyvs)+      eqns = map mkEqn cs+      mkEqn c@(Constr _ _ _ _ flds) =+        let (xp, xs) = mkPat c "x$"+            ts = getFieldTys flds+            rhs = foldr EApp eZ (zipWith EApp (map (mkFold eF) ts) xs)+        in  eEqn [EVar iF, EVar iZ, xp] rhs++      mkFold :: Expr -> EType -> Expr   -- result has type a->b->b+      mkFold f t =+        case getExprTuple t of+          Just ts ->+            let fs = map (mkFold eF) ts+                ft = mkBuiltin loc ("foldTuple" ++ show (length ts))+            in  eApps (EVar ft) fs+          Nothing ->+            case getAppM t of+              Just (con, []) | con == var -> f+              Just (_, ts@(_:_)) -> eFfoldr (mkFold f (last ts))+              _ -> eFlipConst+        +      iF = mkIdentSLoc loc "f"+      eF = EVar iF+      iZ = mkIdentSLoc loc "z"+      eZ = EVar iZ+      iFoldr = mkIdentSLoc loc "foldr"+      eFfoldr = eAppI (mkBuiltin loc "ffoldr")+      eFlipConst = EVar (mkBuiltin loc "flipConst")+      inst = Instance hdr [Fcn iFoldr eqns] []+  --traceM $ showEDefs [inst]+  return [inst]+derFoldable _ _ lhs _ e = cannotDerive lhs e+++--------------------------------------------++derTraversable :: Deriver+derTraversable mctx 1 lhs@(_, tyvs@(_:_)) cs eTraversable = do+  hdr <- mkHdr1 mctx lhs cs eTraversable+  let loc = getSLoc eTraversable+      var = idKindIdent (last tyvs)+      eqns = map mkEqn cs+      mkEqn c@(Constr _ _ con _ flds) =+        let (xp, xs) = mkPat c "x$"+            ts = getFieldTys flds+            rhs = foldl eAp (EApp ePure (EVar con)) $ zipWith EApp (map (mkTrav eF) ts) xs+        in  eEqn [EVar iF, xp] rhs++      mkTrav :: Expr -> EType -> Expr    -- result has type a->f b+      mkTrav f t =+        case getExprTuple t of+          Just ts ->+            let fs = map (mkTrav eF) ts+                ft = mkBuiltin loc ("travTuple" ++ show (length ts))+            in  eApps (EVar ft) fs+          Nothing ->+            case getAppM t of+              Just (con, []) | con == var -> f+              Just (_, ts@(_:_)) -> eTrav (mkTrav f (last ts))+              _ -> ePure++      iF = mkIdentSLoc loc "f"+      eF = EVar iF+      ePure = EVar (mkBuiltin loc "pure")+      eAp = eAppI2 (mkBuiltin loc "<*>")+      iTrav = mkIdentSLoc loc "traverse"+      eTrav = eAppI (mkBuiltin loc "traverse")+      inst = Instance hdr [Fcn iTrav eqns] []+  --traceM $ showEDefs [inst]+  return [inst]+derTraversable _ _ lhs _ e = cannotDerive lhs e++--------------------------------------------++newtypeDer :: StandM -> Int -> LHS -> Constr -> EConstraint -> Maybe EConstraint -> T [EDef]+newtypeDer mctx narg lhs c acls mvia =+  maybe (tcError (getSLoc acls) "Bad newtype deriving") return =<<+  newtypeDerM mctx narg lhs c acls mvia++newtypeDerM :: StandM -> Int -> LHS -> Constr -> EConstraint -> Maybe EConstraint -> T (Maybe [EDef])+newtypeDerM mctx narg lhs@(_, iks) c acls mvia = do   let loc = getSLoc cls       (clsIks, cls) = unForall acls       oldty' =                           -- the underlying type, full         case c of-          Constr [] [] _ (Left [(False, t)]) -> t-          Constr [] [] _ (Right [(_, (_, t))]) -> t+          Constr [] [] _ _ (Left [(False, t)]) -> t+          Constr [] [] _ _ (Right [(_, (_, t))]) -> t           _ -> error "newtypeDer" --  traceM ("newtypeDer " ++ show (mctx, narg, tycon, iks, c, acls, mvia, oldty'))-  viaty <--    case mvia of-      Just via -> return via-      Nothing  ->-        case etaReduce (takeEnd narg iks) oldty' of  -- the underlying type, eta reduced-          ([], rt) -> return rt-          _ -> tcError loc "Bad deriving"-  hdr <--    case mctx of-      Nothing -> do-        let iks' = dropEnd narg iks-        newty <- mkLhsTy (tycon, iks')         -- the newtype, eta reduced-        -- XXX repeats what we might have done above-        oldty <- case etaReduce (takeEnd narg iks) oldty' of  -- the underlying type, eta reduced-                   ([], rt) -> return rt-                   _ -> tcError loc "Bad deriving"-        let ctxOld = tApp cls viaty-            coOldNew = mkCoercible loc oldty newty-            coOldVia =-              case mvia of  -- the via type is also eta reduced-                Just via -> [mkCoercible loc via newty]-                Nothing  -> []-            ctx = filter (not . null . freeTyVars . (:[])) (ctxOld : coOldNew : coOldVia)-        pure (eForall (clsIks ++ iks') $ addConstraints ctx $ tApp cls newty)-      Just hdr -> pure hdr+  let mviaty =+        case mvia of+          Just via -> Just via+          Nothing  ->+            case etaReduce (takeEnd narg iks) oldty' of  -- the underlying type, eta reduced+              ([], rt) -> Just rt+              _ -> Nothing+  case mviaty of+    Nothing -> return Nothing+    Just viaty -> do+      mhdr <-+        case mctx of+          Just (hdr, _) -> pure $ Just hdr+          Nothing -> do+            newty <- mkLhsTy narg lhs                    -- the newtype, eta reduced+            -- XXX repeats what we might have done above+            let moldty = case etaReduce (takeEnd narg iks) oldty' of  -- the underlying type, eta reduced+                           ([], rt) -> Just rt+                           _ -> Nothing+            case moldty of+              Nothing -> return Nothing+              Just oldty -> do+                let ctxOld = tApp cls viaty+                    coOldNew = mkCoercible loc oldty newty+                    coOldVia =+                      case mvia of  -- the via type is also eta reduced+                        Just via -> [mkCoercible loc via newty]+                        Nothing  -> []+                    ctx = filter (not . null . freeTyVars . (:[])) (ctxOld : coOldNew : coOldVia)+                    iks' = dropEnd narg iks+                pure $ Just (eForall (clsIks ++ iks') $ addConstraints ctx $ tApp cls newty) --  traceM ("newtypeDer: " ++ show (hdr, newty, viaty))-  -----  let qiCls = getAppCon cls-      clsQual = qualOf qiCls-  ct <- gets classTable-  (ClassInfo _ _ _ mits _) <--    case M.lookup qiCls ct of-      Nothing -> tcError loc $ "not a class " ++ showIdent qiCls-      Just x -> return x--  -- hdr looks like forall vs . ctx => C t1 ... tn-  let (_, newtys) = getApp $ dropContext $ dropForall hdr-      mkMethod (mi, amty) = do-        let (tvs, mty) =-              case amty of-                EForall _ xs (EApp (EApp _implies _Ca) t) -> (map idKindIdent xs, t)-                _ -> impossibleShow amty-            qvar t = EQVar t kType-            nty =-              if length tvs /= length newtys then error "mkMethod: arity" else-              case subst (zip tvs newtys) mty of-                EForall q vks t -> EForall q (map (\ (IdKind i _) -> IdKind i (EVar dummyIdent)) vks) $ qvar t-                t -> qvar t--            vty = qvar $ dropContext $ dropForall $ subst (zip tvs (init newtys ++ [viaty])) mty-            msign = Sign [mi] nty-            qmi = EQVar (EVar $ qualIdent clsQual mi) amty   -- Use a qualified name for the method-            body = Fcn mi [eEqn [] $ eAppI2 (mkBuiltin loc "coerce") (ETypeArg vty) qmi]-        return [msign, body]-  body <- concat <$> mapM mkMethod mits----  traceM $ "newtypeDer: " ++ show (Instance hdr body)-  return [Instance hdr body]+      case mhdr of+        Nothing -> return Nothing+        Just hdr -> do+          let qiCls = getAppCon cls+              clsQual = qualOf qiCls+          ct <- gets classTable+          (ClassInfo _ _ _ mits _) <-+            case M.lookup qiCls ct of+              Nothing -> tcError loc $ "not a class " ++ showIdent qiCls+              Just x -> return x -dropForall :: EType -> EType-dropForall (EForall _ _ t) = dropForall t-dropForall t = t+          -- hdr looks like forall vs . ctx => C t1 ... tn+          let (_, newtys) = getApp $ dropForallContext hdr+              mkMethod (mi, amty) = do+                let (tvs, mty) =+                      case amty of+                        EForall _ xs (EApp (EApp _implies _Ca) t) -> (map idKindIdent xs, t)+                        _ -> impossibleShow amty+                    qvar t = EQVar t kType+                    nty =+                      if length tvs /= length newtys then mhsError "mkMethod: arity" else+                        case subst (zip tvs newtys) mty of+                          EForall q vks t -> EForall q (map (\ (IdKind i _) -> IdKind i eDummy) vks) $ qvar t+                          t -> qvar t -dropContext :: EType -> EType-dropContext t =-  case getImplies t of-    Just (_, t') -> dropContext t'-    _ -> t+                    vty = qvar $ dropForallContext $ subst (zip tvs (init newtys ++ [viaty])) mty+                    msign = Sign [mi] nty+                    qmi = EQVar (EVar $ qualIdent clsQual mi) amty   -- Use a qualified name for the method+                    body = Fcn mi [eEqn [] $ eAppI2 (mkBuiltin loc "coerce") (ETypeArg vty) qmi]+                return [msign, body]+          body <- concat <$> mapM mkMethod mits -{--freshForall :: EType -> EType-freshForall (EForall _ iks t) = EForall True (map (\ (IdKind i _) -> IdKind i (EVar dummyIdent)) iks) $ freshForall t-freshForall t = t--}+--  traceM $ "newtypeDer: " ++ show (Instance hdr body [])+          return (Just [Instance hdr body []])  -- Eta reduce as many of the variables as possible. -- E.g. etaReduce [a,b] (T a b) = ([], T)@@ -460,7 +780,7 @@   where eta (IdKind i _ : is) (EApp t (EVar i')) | i == i' && i `notElem` freeTyVars [t] = eta is t         eta is t = (reverse is, t) -anyclassDer :: Maybe EConstraint -> Int -> LHS -> EConstraint -> T [EDef]+anyclassDer :: StandM -> Int -> LHS -> EConstraint -> T [EDef] anyclassDer mctx _ lhs cls = do   hdr <- mkHdr mctx lhs [] cls-  return [Instance hdr []]+  return [Instance hdr [] []]
src/MicroHs/Desugar.hs view
@@ -14,7 +14,6 @@ import Data.Maybe import Data.Ratio import Debug.Trace-import GHC.Stack  import MicroHs.EncodeData import MicroHs.Expr@@ -23,6 +22,7 @@ import MicroHs.Graph import MicroHs.Ident import MicroHs.List+import MicroHs.Names import MicroHs.State as S import MicroHs.TypeCheck @@ -30,34 +30,33 @@  desugar :: Flags -> TModule [EDef] -> TModule [LDef] desugar flags tm =-  setBindings tm (map lazier $ checkDup $ concatMap (dsDef flags (tModuleName tm)) (tBindingsOf tm))+  setBindings tm $ map lazier $ checkDup $ concat $ zipWith (dsDef flags (tModuleName tm)) [1..] (tBindingsOf tm) -dsDef :: Flags -> IdentModule -> EDef -> [LDef]-dsDef flags mn adef =+dsDef :: Flags -> IdentModule -> Int -> EDef -> [LDef]+dsDef flags mn ffiNo adef =   case adef of     Data _ cs _ ->       let         n = length cs-        dsConstr i (Constr _ ctx c ets) =+        dsConstr i (Constr _ ctx c _ ets) =           let             ss = (if null ctx then [] else [False]) ++                  map fst (either id (map snd) ets)   -- strict flags           in (qualIdent mn c, encConstr i n ss)       in  zipWith dsConstr [0::Int ..] cs-    Newtype _ (Constr _ _ c _) _ -> [ (qualIdent mn c, Lit (LPrim "I")) ]+    Newtype _ (Constr _ _ c _ _) _ -> [ (qualIdent mn c, Lit (LPrim "I")) ]     Fcn f eqns -> [(f, wrapTick (useTicks flags) f $ dsEqns (getSLoc f) eqns)]-    PatBind p e ->-      case patVarsQ p of-        [] -> []    -- no bound variable, just throw it away-        -- Create a unique varible by adding a "$g" suffix to one of the bound variables.-        v : _ -> dsPatBind (addIdentSuffix v "$g") p e-    ForImp ie i t -> [(i, if isIO t then frgn else App perf frgn)]-      where frgn = Lit $ LForImp (fromMaybe (unIdent (unQualIdent i)) ie) cty-            cty = CType t-            perf = Lit $ LPrim "IO.performIO"-            isIO x | Just (_, r) <- getArrow x = isIO r-            isIO (EApp (EVar io) _) = io == mkIdent "Primitives.IO"-            isIO _ = False+    ForImp cc ie i t -> [(i, ccall t $ Lit $ mkForImp ffiNo cc ie i t)]+    -- Foreign exports don't fit very well into the desugared syntax.+    -- We represent+    --   foreign export "foo" bar :: ty+    -- with+    --   foo = FE bar' ty'+    -- where bar' is the desugared expression for bar, and ty' is the C type+    -- (currently just a newtype of an EType).+    ForExp _ (Just s) e t ->  [(mkIdentSLoc l s, mkForExp e' (CType t))]+      where l = getSLoc e+            e' = dsExpr e     Class ctx (c, _) _ bs ->       let f = mkIdent "$f"           meths :: [Ident]@@ -69,6 +68,21 @@           zipWith (\ i x -> (i, Lam f $ App (Var f) (lams xs $ Var x))) (supers ++ meths) xs     _ -> [] +-- Code for a 'foreign import'.+-- If the function is impure then wrap a performIO around the call.+ccall :: EType -> Exp -> Exp+ccall t f =+  case getArrows t of+    (_, EApp (EVar io) _) | io == identIO ->+      f+    (as, _) ->+      -- pure function, need a performIO.+      --   ^f  -->  \ x1 ... xn -> performIO (^f x1 ... xn)+      let xs = map (\ i -> mkIdent $ '_' : show i) [1..length as]+          perf = Lit $ LPrim "IO.performIO"+          call = App perf $ apps f (map Var xs)+      in  foldr Lam call xs+ wrapTick :: Bool -> Ident -> Exp -> Exp wrapTick False _ ee = ee wrapTick True  i ee = wrap ee@@ -83,9 +97,6 @@                        _ -> e -} -oneAlt :: Expr -> EAlts-oneAlt e = EAlts [([], e)] []- dsBind :: Ident -> EBind -> [LDef] dsBind v abind =   case abind of@@ -93,17 +104,13 @@     PatBind p e -> dsPatBind v p e     _ -> [] +-- Desugaring ~p in case introduces PatBind, so we need to get rid of it again. dsPatBind :: Ident -> EPat -> Expr -> [LDef] dsPatBind v p e =   let de = (v, dsExpr e)-      ds = [ (i, dsExpr (ECase (EVar v) [(p, oneAlt $ EVar i)])) | i <- patVarsQ p ]+      ds = [ (i, dsExpr (ECase (EVar v) [(p, oneAlt $ EVar i)])) | i <- patVars p ]   in  de : ds --- patVars does not work wth qualified bound variable names,--- but that's what we get for a top level PatBind-patVarsQ :: EPat -> [Ident]-patVarsQ = filter (\ i -> not (isDummyIdent i) && not (isConIdent $ unQualIdent i)) . allVarsExpr- dsEqns :: SLoc -> [Eqn] -> Exp dsEqns loc eqns =   case eqns of@@ -113,7 +120,7 @@         xs = take (length aps) $ newVars "$q" vs         mkArm (Eqn ps alts) =           let ps' = map dsPat ps-          in  (ps', dsAlts alts)+          in  (ps', id, dsAlts alts)         ex = dsCaseExp loc (vs ++ xs) (map Var xs) (map mkArm eqns)       in foldr Lam ex xs     _ -> eMatchErr loc@@ -136,15 +143,18 @@ 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)+dsAlt _    (SRec _ : _) _ = impossible  dsBinds :: [EBind] -> Exp -> Exp dsBinds [] ret = ret+{- dsBinds ads@(PatBind (ELazy False p) e : ds) ret =   -- Turn a strict let/where into a case.   -- XXX This does no reordering of bindings.   let rest = dsBinds ds ret       used = allVarsExp ret ++ allVarsExpr (ELet ads (ETuple []))   in  dsCaseExp (getSLoc p) used [dsExpr e] [([dsPat p], const rest)]+-} dsBinds ads ret =   let     avs = concatMap allVarsBind ads@@ -216,8 +226,14 @@ dsExpr :: Expr -> Exp dsExpr aexpr =   case aexpr of+    -- Change calls to error&undefined to include location+    EVar f | f == mkIdent "Control.Error.undefined" ->+      dsExpr $ addLoc (mkIdentSLoc (getSLoc f) "Control.Error._undefinedLoc")+    EVar f | f == mkIdent "Control.Error.error" ->+      dsExpr $ addLoc (mkIdentSLoc (getSLoc f) "Control.Error._errorLoc")+     EVar i -> Var i-    EApp (EApp (EVar app) (EListish (LCompr e stmts))) l | app == mkIdent "Data.List_Type.++" ->+    EApp (EApp (EVar app) (EListish (LCompr e stmts))) l | app == iapp ->       dsExpr $ dsCompr e stmts l     EApp f a -> App (dsExpr f) (dsExpr a)     ELam l qs -> dsEqns l qs@@ -241,9 +257,11 @@             in foldr Lam body xs           Nothing -> Var (conIdent c)     _ -> impossibleShow aexpr+  where addLoc i = EApp (EVar i) (ELit l (LStr (show l ++ ": "))) where l = getSLoc i+        iapp = mkIdent "Data.List_Type.++"  dsCompr :: Expr -> [EStmt] -> Expr -> Expr-dsCompr e [] l = EApp (EApp consCon e) l+dsCompr e [] l = EApp (EApp conCons e) l dsCompr e (SThen c : ss) l = EIf c (dsCompr e ss l) l dsCompr e (SLet ds : ss) l = ELet ds (dsCompr e ss l) -- Special case for the idiom [ ... | ..., p <- [x], ... ].  This is a little more efficient.@@ -251,14 +269,15 @@ dsCompr e xss@(SBind p g : ss) l = ELet [hdef] (EApp eh g)   where     hdef = Fcn h [eqn1, eqn2, eqn3]-    eqn1 = eEqn [nilCon] l-    eqn2 = eEqn [EApp (EApp consCon p) vs] (dsCompr e ss (EApp eh vs))-    eqn3 = eEqn [EApp (EApp consCon u) vs]               (EApp eh vs)+    eqn1 = eEqn [conNil] l+    eqn2 = eEqn [EApp (EApp conCons p) vs] (dsCompr e ss (EApp eh vs))+    eqn3 = eEqn [EApp (EApp conCons u) vs]               (EApp eh vs)     u = EVar dummyIdent     h = head $ newVars "$h" allVs     eh = EVar h     vs = EVar $ head $ newVars "$vs" allVs     allVs = allVarsExpr (EListish (LCompr (ETuple [e,l]) xss))  -- all used identifiers+dsCompr _ (SRec _ : _) _ = impossible  -- Use tuple encoding to make a tuple mkTupleE :: [Exp] -> Exp@@ -279,7 +298,7 @@     EVar _ -> apat     ECon _ -> apat     EApp f a -> EApp (dsPat f) (dsPat a)-    EListish (LList ps) -> dsPat $ foldr (EApp . EApp consCon) nilCon ps+    EListish (LList ps) -> dsPat $ foldr (EApp . EApp conCons) conNil ps     ETuple ps -> dsPat $ foldl EApp (tupleCon (getSLoc apat) (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)))@@ -289,24 +308,6 @@     ELazy b pat -> ELazy b (dsPat pat)     _ -> 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 []- newVars :: String -> [Ident] -> [Ident] newVars s is = deleteAllsBy (==) [ mkIdent (s ++ show i) | i <- [1::Int ..] ] is @@ -331,12 +332,13 @@     mkArm :: ECaseArm -> Arm     mkArm (p, alts) =       let p' = dsPat p-      in  ([p'], dsAlts alts)+      in  ([p'], id, dsAlts alts)  type MState = [Ident]  -- supply of unused variables.  type M a = State MState a-type Arm = ([EPat], Exp -> Exp)  -- Patterns, and a function that expects the default (which might be ignored).+type Arm = ([EPat], Exp -> Exp, Exp -> Exp)  -- Patterns, a substitution,+                                             -- and a function that expects the default (which might be ignored). type Matrix = [Arm]  newIdents :: Int -> M [Ident]@@ -367,7 +369,7 @@ dsMatrixL dflt is arms = dsMatrix dflt is (map dsLazy arms)  dsLazy :: Arm -> Arm-dsLazy (ps, rhs) =+dsLazy (ps, sub, rhs) =   -- Accumulate lazy bindings and strict bindings   let ((_, rbs, ris), ps') = mapAccumL lazy (1, [], []) ps       lazy :: (Int, [EBind], [Exp]) -> EPat -> ((Int, [EBind], [Exp]), EPat)@@ -385,7 +387,7 @@           EApp p1 p2              -> (s'', EApp p1' p2') where (s', p1') = lazy s p1; (s'', p2') = lazy s' p2           EAt i p                 -> (s', EAt i p')      where (s', p')  = lazy s p           _                       -> impossible-  in  (ps', \ d -> dsBinds (reverse rbs) $ foldr eSeq (rhs d) (reverse ris))+  in  (ps', sub, \ d -> dsBinds (reverse rbs) $ foldr eSeq (rhs d) (reverse ris))  eSeq :: Exp -> Exp -> Exp eSeq e1 e2 = App (App (Lit (LPrim "seq")) e1) e2@@ -412,33 +414,35 @@ dsMatrix dflt []         aarms =   -- We can have several arms if there are guards.   -- Combine them in order.-  return $ foldr snd dflt aarms-dsMatrix dflt iis@(i:is) aarms@(aarm : aarms') =+  return $ foldr (\ (_, sub, rhs) -> sub . rhs) dflt aarms+dsMatrix dflt iis@(i:is) aarms@(aarm : _) =   case leftMost aarm of     EVar _ -> do       -- Find all variables, substitute with i, and proceed       let (vars, nvars) = span (isPVar . leftMost) aarms           vars' = map (sub . unAt i) vars-          sub (EVar x : ps, rhs) = (ps, substAlpha x i . rhs)+          sub (EVar x : ps, sb, rhs) = (ps, substAlpha x i . sb, rhs)           sub _ = impossible       letBind (dsMatrix dflt iis nvars) $ \ drest ->         dsMatrix drest is vars'     -- Collect identical transformations, do the transformation and proceed.     EViewPat e _ -> do-      let (views, nviews) = span (isPView e . leftMost) aarms'+      let e' = case unAt i aarm of (_, sub, _) -> sub (dsExpr e)+      let (views, nviews) = span (isPView e') (map (unAt i) aarms)       letBind (dsMatrix dflt iis nviews) $ \ drest ->-        letBind (return $ App (dsExpr e) i) $ \ vi -> do-        let views' = map (unview . unAt i) (aarm : views)-            unview (EViewPat _ p:ps, rhs) = (p:ps, rhs)+        letBind (return $ App e' i) $ \ vi -> do+        let views' = map unview views+            unview (EViewPat _ p:ps, sub, rhs) = (p:ps, sub, rhs)             unview _ = impossible         dsMatrix drest (vi:is) views'+     -- Collect all constructors, group identical ones.     _ -> do             -- must be ECon/EApp       let         (cons, ncons) = span (isPCon . leftMost) aarms       letBind (dsMatrix dflt iis ncons) $ \ drest -> do         let-          idOf (p:_, _) = pConOf p+          idOf (p:_, _, _) = pConOf p           idOf _ = impossible           grps = groupEq (on (==) idOf) $ map (unAt i) cons           oneGroup grp = do@@ -446,14 +450,14 @@               con = pConOf $ leftMost $ head grp             xs <- newIdents (conArity con)             let-              one (p : ps, e) = (pArgs p ++ ps, e)+              one (p : ps, sub, e) = (pArgs p ++ ps, sub, e)               one _ = impossible             cexp <- dsMatrix drest (map Var xs ++ is) (map one grp)             return (SPat con xs, cexp)         narms <- mapM oneGroup grps         return $ mkCase i narms drest   where-    leftMost (p:_, _) = skipEAt p  -- pattern in first column+    leftMost (p:_, _, _) = skipEAt p  -- pattern in first column     leftMost _ = impossible     skipEAt (EAt _ p) = skipEAt p     skipEAt p = p@@ -462,11 +466,14 @@     isPCon _ = True     isPVar (EVar _) = True     isPVar _ = False-    isPView e (EViewPat e' _) = eqExpr e e'+    isPView :: Exp -> Arm -> Bool+    isPView e (EViewPat ee _:_, sub, _) = e == sub (dsExpr ee)     isPView _ _ = False-    unAt ii (EAt x p : ps, rhs) = unAt i (p:ps, substAlpha x ii . rhs)-    unAt _ arm = arm +unAt :: Exp{-Ident-} -> Arm -> Arm+unAt ii (EAt x p : ps, sub, rhs) = unAt ii (p:ps, substAlpha x ii . sub, rhs)+unAt _ arm = arm+ mkCase :: Exp -> [(SPat, Exp)] -> Exp -> Exp mkCase var pes dflt =   --trace ("mkCase " ++ show pes) $@@ -497,7 +504,8 @@ cheap ae =   case ae of     Var _ -> True-    Lit _ -> True+    Lit (LInt _) -> True+--    Lit _ -> True  -- inlining all literals can reduce sharing     _ -> False  eLet :: Ident -> Exp -> Exp -> Exp@@ -578,6 +586,7 @@       minn a 0 = a       minn a b = min a b       minMatch :: [Ident] -> Exp -> Int+      minMatch _ (Lam i _) | i `elem` as = 0   -- name capture, so ignore matches       minMatch _ (Lam _ e) = minMatch [] e       minMatch vs (App f (Var v)) = minMatch (v:vs) f       minMatch _ (App f a) = minMatch [] f `minn` minMatch [] a@@ -602,3 +611,51 @@       then (fcn, lams drops $ letRecE fcn' (lams keeps (repl [] body)) vfcn')       else def lazier def = def++---------++-- "[static] [name.h] [&] [expr]"+-- "[static] [name.h] value [expr]"+-- "dynamic"+-- "wrapper"+-- When the calling convention is ccall the 'expr' has to be a name,+-- with capi it can be any C expression.+parseImpEnt :: SLoc -> CallConv -> String -> ImpEnt+parseImpEnt _ Cjavascript s = ImpJS s+parseImpEnt loc _cc s =+  case words s of+    ["dynamic"] -> ImpDynamic+    ["wrapper"] -> ImpWrapper+    "static" : r -> rest r+    r            -> rest r+ where rest (inc : r) | ".h" `isSuffixOf` inc = rest' (ImpStatic [inc]) r+       rest r                                 = rest' (ImpStatic [])    r+       rest' c ("&"     : r) = rest'' (c IPtr) r+       rest' c ['&'     : r] = rest'' (c IPtr) [r]+       rest' c ("value" : r) = rest'' (c IValue) [unwords r]+       rest' c r             = rest'' (c IFunc) r+       rest'' c [n] = c n+       rest'' _ _ = badForImp loc++badForImp :: SLoc -> a+badForImp loc = errorMessage loc "bad foreign import"++mkForImp :: Int -> CallConv -> Maybe String -> Ident -> EType -> Lit+mkForImp _ Cjavascript Nothing i _ = badForImp (getSLoc i)+mkForImp no cc ms i ty =+  let cty = CType ty+      loc = getSLoc i+      ui  = unIdent (unQualIdent i)+      isValidC (c:cs) = isAlpha c && all (\ d -> isAlphaNum d || d == '_') cs+      isValidC _ = False+  in  case ms of+        Nothing -> LForImp (ImpStatic [] IFunc ui) ui cty+        Just s  ->+          let impent = parseImpEnt loc cc s+              fno = show no+              cid =+                case impent of+                  ImpStatic _ _ n ->+                    if isValidC n then n else fno+                  _ -> fno+          in  LForImp impent cid cty
src/MicroHs/EncodeData.hs view
@@ -25,8 +25,7 @@   where n = numConstr pes  encConstr :: Int -> Int -> [Bool] -> Exp-encConstr i n ss | n /= n = undefined  -- XXX without this, everything slows down.  Why?-                 | n <= scottLimit = encConstrScott i n ss+encConstr i n ss | n <= scottLimit = encConstrScott i n ss                  | otherwise       = encConstrNo i n ss  encIf :: Exp -> Exp -> Exp -> Exp
src/MicroHs/Exp.hs view
@@ -8,12 +8,13 @@   app2, app3,   allVarsExp, freeVars,   lams, apps,+  mkForExp, getForExp,   ) where import qualified Prelude(); import MHSPrelude hiding((<>)) import Data.Char import Data.List import MicroHs.Ident-import MicroHs.Expr(Lit(..), showLit)+import MicroHs.Expr(Lit(..), showLit, CType(..)) import MicroHs.List import Text.PrettyPrint.HughesPJLite import Debug.Trace@@ -95,3 +96,12 @@ apps :: Exp -> [Exp] -> Exp apps f = foldl App f +-- Encoding for 'foreign export' definitions.+mkForExp :: Exp -> CType -> Exp+mkForExp e t = app2 cfe e cty+  where cty = Lit $ LCType t+        cfe = Lit $ LPrim "FE"++getForExp :: Exp -> Maybe (Exp, CType)+getForExp (App (App (Lit (LPrim "FE")) e) (Lit (LCType t))) = Just (e, t)+getForExp _ = Nothing
src/MicroHs/ExpPrint.hs view
@@ -1,4 +1,5 @@-module MicroHs.ExpPrint(toStringCMdl, toStringP, encodeString, combVersion) where+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}+module MicroHs.ExpPrint(toStringCMdl, toStringP, encodeString, combVersion, removeUnused, renumberCMdl) where import qualified Prelude(); import MHSPrelude import Data.Char(ord, chr) import qualified MicroHs.IdentMap as M@@ -6,26 +7,45 @@ import MicroHs.Desugar(LDef) import MicroHs.EncodeData(encList) import MicroHs.Exp-import MicroHs.Expr(Lit(..), showLit, errorMessage, HasLoc(..))+import MicroHs.Expr(Lit(..), showLit, errorMessage, HasLoc(..), CType) import MicroHs.Ident(Ident, showIdent, mkIdent, showSLoc) import MicroHs.List(groupSort) import MicroHs.State import MicroHs.TypeCheck(isInstId) +type CMdl = ([LDef], Exp)+type ForExpTable = [(Ident, Ident, CType)]+ -- Version number of combinator file. -- Must match version in eval.c. combVersion :: String-combVersion = "v8.0\n"+combVersion = "v8.3\n" +-- Remove unused definitions.  Only used for dumping definitions.+removeUnused :: CMdl -> [LDef]+removeUnused (ds, emain) = dfs roots M.empty+  where+    fexps = [ i | (i, e) <- ds, isJust $ getForExp e ]+    roots = freeVars emain ++ fexps+    dMap = M.fromList ds+    dfs :: [Ident] -> M.Map Exp -> [LDef]+    dfs [] done = M.toList done+    dfs (i:is) done | Just _ <- M.lookup i done = dfs is done+                    | otherwise = dfs (freeVars e ++ is) (M.insert i e done)+                                  where e = fromMaybe (error $ "removeUnused: undef " ++ show i) $ M.lookup i dMap+ -- Rename (to a numbers) top level definitions and remove unused ones.--- Also check for duplicated instances.-toStringCMdl :: (Ident, [LDef]) -> (Int, String)-toStringCMdl (mainName, ds) =+-- This is the "linking" of the program.+-- Returns the renamed foreign exports and the "linked" CNdl+renumberCMdl :: CMdl -> (ForExpTable, CMdl)+renumberCMdl (ds, emain) =   let+    fexps = [ (i, t) | (i, e) <- ds, Just (_, t) <- [getForExp e] ]+    roots = freeVars emain ++ map fst fexps     dMap = M.fromList ds-    -- Shake the tree bottom-up, serializing nodes as we see them.+    -- Shake the tree bottom-up, renaming identifiers as we go along.     -- This is much faster than (say) computing the sccs and walking that.-    dfs :: Ident -> State (Int, M.Map Exp, String -> String) ()+    dfs :: Ident -> State (Int, M.Map Exp, [LDef]) ()     dfs n = do       (i, seen, r) <- get       case M.lookup n seen of@@ -38,26 +58,45 @@           mapM_ dfs $ freeVars e           -- Now that n's children are done, compute its actual entry.           (i', seen', r') <- get-          put (i'+1, M.insert n (ref i') seen', def r' (i', e))-    (_,(ndefs, defs, res)) = runState (dfs mainName) (0, M.empty, toStringP emain)+          put (i'+1, M.insert n (ref i') seen', (mkIdent $ show i', substv e) : r')+    (_, (_, defs, res)) = runState (mapM_ dfs roots) (0, M.empty, [])     ref i = Var $ mkIdent $ "_" ++ show i     findIdentIn n m = fromMaybe (errorMessage (getSLoc n) $ "No definition found for: " ++ showIdent n) $                       M.lookup n m     findIdent n = findIdentIn 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 :: (String -> String) -> (Int, Exp) -> (String -> String)-    def r (i, e) =-      ("A " ++) . toStringP (substv e) . ((":" ++ show i ++  " @\n") ++) . r . ("@" ++)+    fexps' = [ (unVar (findIdent i), i, t) | (i, t) <- fexps ]+      where unVar (Var n) = n+            unVar _ = undefined   in-    case dupInstances ds of-      (n1 : n2 : _) : _ -> errorMessage (getSLoc n1) $ "Duplicate instance " ++ unmangleInst (showIdent n1) ++ " at " ++ showSLoc (getSLoc n2)-      _ -> (ndefs, combVersion ++ show ndefs ++ "\n" ++ res " }")+    (fexps', (checkDupInstances res, substv emain)) +-- The argument is all definitions and the main expression.+-- The result is the program as a string.+toStringCMdl :: CMdl -> String+toStringCMdl (ds, emain) =+  let+    def :: (Ident, Exp) -> (String -> String) -> (String -> String)+    def (i, e) r | Just (e', _) <- getForExp e = def (i, e') r+    def (i, e) r =+      ("A " ++) . toStringP e . ((":" ++ showIdent i ++  " @\n") ++) . r . ("@" ++)++    res :: String -> String+    res = foldr def (toStringP emain) ds++  in combVersion ++ show (length ds) ++ "\n" ++ res " }"++checkDupInstances :: [LDef] -> [LDef]+checkDupInstances ds =+  case dupInstances ds of+    (n1 : n2 : _) : _ ->+      errorMessage (getSLoc n1) $ "Duplicate instance " ++ unmangleInst (showIdent n1) ++ " at " ++ showSLoc (getSLoc n2)+    _ -> ds+ dupInstances :: [LDef] -> [[Ident]] dupInstances = filter ((> 1) . length) . groupSort . filter isInstId . map fst @@ -86,10 +125,11 @@     --App f a -> ("(" ++) . toStringP f . (" " ++) . toStringP a . (")" ++)     App f a -> toStringP f . toStringP a . ("@" ++) --- Strings are encoded in a slightly unusal way.+-- Strings are encoded in a slightly unusual way. -- It ensure that (most) printable ASCII only take -- up 1 byte, and outside this range, only 2 bytes. -- The input should be in the range 0x00-0xff.+-- This encoding must agree with the decoder in eval.c. -- '\x00'..'\x1f'  "^\x20".."^\x3f" -- '\x20'..'\x7e'  '\x20'..'\x7e', except '^','\\','|','"' -- '"'             "\\\""@@ -137,4 +177,4 @@             (i1,   i2) = quotRem i12  0x40         in  [chr (i1 + 0xf0), chr (i2 + 0x80), chr (i3 + 0x80), chr (i4 + 0x80)]       else-        error "utf8Char: bad Char"+        mhsError "utf8Char: bad Char"
src/MicroHs/Expr.hs view
@@ -6,11 +6,13 @@   ImportItem(..),   ImpType(..),   EDef(..), showEDefs,-  Deriving(..), DerStrategy(..),-  Expr(..), eLam, eLamWithSLoc, eEqn, eEqns, showExpr, eqExpr,+  Deriving(..), DerStrategy(..), doNotDerive,+  Expr(..), eLam, eLamWithSLoc, eEqn, oneAlt, eEqns, showExpr, eqExpr,+  CallConv(..),   QForm(..),   Listish(..),   Lit(..), showLit,+  ImpEnt(..), ImpVal(..),   CType(..),   EBind, showEBind, showEBinds,   Eqn(..),@@ -30,9 +32,10 @@   Constr(..), ConstrField, SType,   ConTyInfo,   Con(..), conIdent, conArity, conFields,-  tupleConstr, getTupleConstr,+  tupleConstr, getTupleConstr, getExprTuple,   mkTupleSel,   eAppI, eApp2, eAppI2, eApp3, eAppI3, eApps,+  eLetB,   lhsToType,   subst, allBinders,   allVarsExpr, allVarsBind, allVarsEqns, allVarsPat,@@ -40,6 +43,7 @@   errorMessage,   Assoc(..), Fixity,   getBindsVars,+  getStmtBound,   HasLoc(..),   eForall, eForall', unForall,   eDummy,@@ -50,14 +54,15 @@   getAppM, getApp,   TyVar, freeTyVars,   getImplies,+  dropForallContext,   ) where import qualified Prelude(); import MHSPrelude hiding ((<>)) import Data.List import Data.Maybe import MicroHs.Builtin import MicroHs.Ident+import {-# SOURCE #-} MicroHs.TCMonad(TCState) import Text.PrettyPrint.HughesPJLite-import GHC.Stack  type IdentModule = Ident @@ -82,14 +87,17 @@   | Sign [Ident] EType   | KindSign Ident EKind   | Import ImportSpec-  | ForImp (Maybe String) Ident EType+  | ForImp CallConv (Maybe String) Ident EType+  | ForExp CallConv (Maybe String) Expr EType   | Infix Fixity [Ident]   | Class [EConstraint] LHS [FunDep] [EBind]  -- XXX will probable need initial forall with FD-  | Instance EConstraint [EBind]+  | Instance EConstraint [EBind] [EBind]      -- second set of bindings are the non-method bindings   | Default (Maybe Ident) [EType]   | Pattern LHS EPat (Maybe [Eqn])   | StandDeriving DerStrategy Int EConstraint   | DfltSign Ident EType                      -- only in class declarations+  -- Only used by interactive system to load a cached TCState to avoid import processing+  | SetTCState TCState --DEBUG  deriving (Show)  instance NFData EDef where@@ -101,20 +109,27 @@   rnf (Sign a b) = rnf a `seq` rnf b   rnf (KindSign a b) = rnf a `seq` rnf b   rnf (Import a) = rnf a-  rnf (ForImp a b c) = rnf a `seq` rnf b `seq` rnf c+  rnf (ForImp a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d+  rnf (ForExp a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d   rnf (Infix a b) = rnf a `seq` rnf b   rnf (Class a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d-  rnf (Instance a b) = rnf a `seq` rnf b+  rnf (Instance a b c) = rnf a `seq` rnf b `seq` rnf c   rnf (Default a b) = rnf a `seq` rnf b   rnf (Pattern a b c) = rnf a `seq` rnf b `seq` rnf c   rnf (StandDeriving a b c) = rnf a `seq` rnf b `seq` rnf c   rnf (DfltSign a b) = rnf a `seq` rnf b+  rnf (SetTCState a) = seq a ()  data ImpType = ImpNormal | ImpBoot   deriving (Eq)  instance NFData ImpType where rnf x = x `seq` () +data CallConv = Cccall | Ccapi | Cjavascript+  deriving (Eq, Show)++instance NFData CallConv where rnf x = x `seq` ()+ data ImportSpec = ImportSpec ImpType Bool Ident (Maybe Ident) (Maybe (Bool, [ImportItem]))  -- first Bool indicates 'qualified', second 'hiding' --DEBUG  deriving (Show) @@ -144,11 +159,17 @@   | DerNewtype   | DerAnyClass   | DerVia EConstraint+--DEBUG  deriving (Show)  instance NFData DerStrategy where   rnf (DerVia a) = rnf a   rnf _ = () +-- Indication that we don't want any deriving+doNotDerive :: [Deriving] -> Bool+doNotDerive [Deriving DerNone []] = True+doNotDerive _ = False+ data Expr   = EVar Ident   | EApp Expr Expr@@ -246,8 +267,11 @@ eEqns ps e = [eEqn ps e]  eEqn :: [EPat] -> Expr -> Eqn-eEqn ps e = Eqn ps (EAlts [([], e)] [])+eEqn ps e = Eqn ps (oneAlt e) +oneAlt :: Expr -> EAlts+oneAlt e = EAlts [([], e)] []+ type FieldName = Ident  data Con@@ -302,30 +326,36 @@  data Lit   = LInt Int+  | LInt64 Int64   | LInteger Integer   | LDouble Double+  | LFloat Float   | LRat Rational   | LChar Char   | LStr String   | LBStr String            -- bytestring   | LPrim String   | LExn String             -- exception to raise-  | LForImp String CType+  | LForImp ImpEnt String CType+  | LCType CType            -- used for foreign export   | LTick String --DEBUG  deriving (Show)   deriving (Eq)  instance NFData Lit where   rnf (LInt a) = rnf a+  rnf (LInt64 a) = rnf a   rnf (LInteger a) = rnf a   rnf (LDouble a) = rnf a+  rnf (LFloat a) = rnf a   rnf (LRat a) = rnf a   rnf (LChar a) = rnf a   rnf (LStr a) = rnf a   rnf (LBStr a) = rnf a   rnf (LPrim a) = rnf a   rnf (LExn a) = rnf a-  rnf (LForImp a b) = rnf a `seq` rnf b+  rnf (LForImp a b c) = rnf a `seq` rnf b `seq` rnf c+  rnf (LCType e) = rnf e   rnf (LTick a) = rnf a  -- A type of a C FFI function@@ -337,15 +367,37 @@ instance NFData CType where   rnf (CType t) = rnf t +data ImpEnt+  = ImpStatic [String] ImpVal String   -- includes, type of value, C name/expr+  | ImpDynamic+  | ImpWrapper+  | ImpJS String+  deriving (Eq)++instance NFData ImpEnt where+  rnf (ImpStatic a b c) = rnf a `seq` rnf b `seq` rnf c+  rnf ImpDynamic = ()+  rnf ImpWrapper = ()+  rnf (ImpJS s) = rnf s++data ImpVal = IPtr | IValue | IFunc+  deriving (Eq)++instance NFData ImpVal where+  rnf a = seq a ()++---------------+ type ECaseArm = (EPat, EAlts) -data EStmt = SBind EPat Expr | SThen Expr | SLet [EBind]+data EStmt = SBind EPat Expr | SThen Expr | SLet [EBind] | SRec [EStmt] --DEBUG  deriving (Show)  instance NFData EStmt where   rnf (SBind a b) = rnf a `seq` rnf b   rnf (SThen a) = rnf a   rnf (SLet a) = rnf a+  rnf (SRec a) = rnf a  type EBind = EDef   -- subset with Fcn, PatBind, Sign, and DfltSign @@ -406,11 +458,12 @@ data Constr = Constr   [IdKind] [EConstraint]          -- existentials: forall vs . ctx =>   Ident                           -- constructor name+  Bool                            -- if the constructor is written in infix notation   (Either [SType] [ConstrField])  -- types or named fields   deriving(Show)  instance NFData Constr where-  rnf (Constr a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d+  rnf (Constr a b c d e) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e  type ConstrField = (Ident, SType)              -- record label and type type SType = (Bool, EType)                     -- the Bool indicates strict@@ -459,6 +512,12 @@     ',':xs -> Just (length xs + 2)  -- "," is 2-tuple     _ -> Nothing +getExprTuple :: EType -> Maybe [EType]+getExprTuple = loop []+  where loop ts (EApp f a) = loop (a:ts) f+        loop ts (EVar i) | Just n <- getTupleConstr i, length ts == n = Just ts+        loop _ _ = 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)@@ -482,6 +541,10 @@ eApps :: Expr -> [Expr] -> Expr eApps = foldl EApp +eLetB :: [EBind] -> Expr -> Expr+eLetB [] e = e+eLetB bs e = ELet bs e+ lhsToType :: LHS -> EType lhsToType (i, iks) = eApps (EVar i) $ map (EVar . idKindIdent) iks @@ -500,6 +563,8 @@   getSLoc (Sign i _) = getSLoc i   getSLoc (DfltSign i _) = getSLoc i   getSLoc (Infix _ is) = getSLoc is+  getSLoc (Instance t _ _) = getSLoc t+  getSLoc (StandDeriving _ _ t) = getSLoc t   getSLoc _ = error "HasLoc EDef: unimplemented"  -- Approximate location; only identifiers and literals carry a location@@ -556,9 +621,10 @@   getSLoc (LFromThenTo e _ _) = getSLoc e  instance HasLoc EStmt where-  getSLoc (SBind p _) = getSLoc p+  getSLoc (SBind p e) = getSLoc p `orSLoc` getSLoc e   getSLoc (SThen e) = getSLoc e   getSLoc (SLet bs) = getSLoc bs+  getSLoc (SRec bs) = getSLoc bs  instance HasLoc Eqn where   getSLoc (Eqn [] a) = getSLoc a@@ -631,6 +697,7 @@ eqExpr (ELit _ l) (ELit _ l') = l == l' eqExpr (EApp f a) (EApp f' a') = eqExpr f f' && eqExpr a a' eqExpr (EUVar r) (EUVar r') = r == r'+eqExpr (EForall _ iks t) (EForall _ iks' t') = map idKindIdent iks == map idKindIdent iks' && eqExpr t t' eqExpr _ _ = False -- XXX good enough for instances --eqExpr e1 e2 = error $ "eqExpr: unimplemented " ++ showExpr e1 ++ " == " ++ showExpr e2 @@ -655,10 +722,10 @@     Infix _ _ -> id     _ -> impossible -allVarsEqns :: [Eqn] -> [Ident]+allVarsEqns :: HasCallStack => [Eqn] -> [Ident] allVarsEqns eqns = composeMap allVarsEqn eqns [] -allVarsEqn :: Eqn -> DList Ident+allVarsEqn :: HasCallStack => Eqn -> DList Ident allVarsEqn eqn =   case eqn of     Eqn ps alts -> composeMap allVarsPat ps . allVarsAlts alts@@ -669,13 +736,13 @@ allVarsAlt :: EAlt -> DList Ident allVarsAlt (ss, e) = composeMap allVarsStmt ss . allVarsExpr' e -allVarsPat :: EPat -> DList Ident+allVarsPat :: HasCallStack => EPat -> DList Ident allVarsPat = allVarsExpr' -allVarsExpr :: Expr -> [Ident]+allVarsExpr :: HasCallStack => Expr -> [Ident] allVarsExpr e = allVarsExpr' e [] -allVarsExpr' :: Expr -> DList Ident+allVarsExpr' :: HasCallStack => Expr -> DList Ident allVarsExpr' aexpr =   case aexpr of     EVar i -> (i:)@@ -709,7 +776,10 @@     EForall _ iks e -> (map (\ (IdKind i _) -> i) iks ++) . allVarsExpr' e   where field (EField _ e) = allVarsExpr' e         field (EFieldPun is) = (last is :)-        field EFieldWild = impossible+        field EFieldWild = id  -- XXX This is wrong.  But this can happen when there is no type signature+                               -- and the dependency analysis tries to find all used variables.+                               -- The correct fix is to desugar EFieldWild early and have tcDefsValue+                               -- only use free variables.  allVarsListish :: Listish -> DList Ident allVarsListish (LList es) = composeMap allVarsExpr' es@@ -728,6 +798,7 @@     SBind p e -> allVarsPat p . allVarsExpr' e     SThen e -> allVarsExpr' e     SLet bs -> composeMap allVarsBind' bs+    SRec ss -> composeMap allVarsStmt ss  ----------------------------- @@ -735,6 +806,7 @@ setSLocExpr l (EVar i) = EVar (setSLocIdent l i) setSLocExpr l (ECon c) = ECon (setSLocCon l c) setSLocExpr l (ELit _ k) = ELit l k+setSLocExpr _ e@(EUVar _) = e setSLocExpr _ _ = error "setSLocExpr"  -- what other cases do we need?  setSLocCon :: SLoc -> Con -> Con@@ -745,13 +817,19 @@ errorMessage :: forall a .                 HasCallStack =>                 SLoc -> String -> a-errorMessage loc msg = error $ showSLoc loc ++ ": " ++ msg+errorMessage loc msg = mhsError $ showSLoc loc ++ ": " ++ msg  ----------------  instance Show EModule where-  show (EModule nm _ ds) = "module " ++ showIdent nm ++ "(...) where\n" ++ showEDefs ds+  show (EModule nm es ds) = "module " ++ showIdent nm ++ "(" ++ concatMap ((++ ", ") . show) es ++ ") where\n" ++ showEDefs ds +instance Show ExportItem where+  show (ExpModule m) = "module " ++ showIdent m+  show (ExpTypeSome i is) = showIdent i ++ "(" ++ intercalate "," (map showIdent is) ++ ")"+  show (ExpValue i) = showIdent i+  show (ExpDefault i) = "default " ++ showIdent i+ instance Show Expr where   show = showExpr @@ -810,15 +888,17 @@       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" <+> maybe empty (text . show) ie <+> ppIdent i <+> text "::" <+> ppEType t+    ForImp cc ie i t -> text "foreign import" <+> text (drop 1 $ show cc) <+> maybe empty (text . show) ie <+> ppIdent i <+> text "::" <+> ppEType t+    ForExp cc ie e t -> text "foreign export" <+> text (drop 1 $ show cc) <+> maybe empty (text . show) ie <+> ppExpr e <+> 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 ct bs -> ppWhere (text "instance" <+> ppEType ct) bs+    Instance ct bs bs' -> ppWhere (ppWhere (text "instance" <+> ppEType ct) bs) bs'     Default mc ts -> text "default" <+> maybe empty ppIdent mc <+> parens (hsep (punctuate (text ", ") (map ppEType ts)))     Pattern lhs@(i,_) p meqns -> text "pattern" <+> ppLHS lhs <+> text "=" <+> ppExpr p <+> maybe empty (ppWhere (text ";") . (:[]) . Fcn i) meqns     StandDeriving _s _narg ct -> text "deriving instance" <+> ppEType ct     DfltSign i t -> text "default" <+> ppIdent i <+> text "::" <+> ppEType t+    SetTCState _ -> text "SetTCState ..."  ppDerivings :: [Deriving] -> Doc ppDerivings = sep . map ppDeriving@@ -850,7 +930,7 @@ 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 QImpl iks <+> ppCtx ct <+> ppIdent c <+> ppCs cs+ppConstr (Constr iks ct c _ cs) = ppForall QImpl 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 ","@@ -972,7 +1052,10 @@  -- Literals are tagged the way they appear in the combinator file: --  #   Int---  %   Double+--  ##  Int64+--  %   Integer+--  &   Double+--  &&  Float --  '   Char    (not in file) --  "   String --  ^   FFI function@@ -981,15 +1064,19 @@ showLit l =   case l of     LInt i     -> '#' : show i-    LInteger i -> '#' : '#' : show i+    LInt64 i   -> '#' : '#' : show i+    LInteger i -> '%' : show i     LDouble d  -> '&' : show d+    LFloat d   -> '&' : '&' : show d     LRat r     -> '%' : show r     LChar c    -> show c     LStr s     -> show s     LBStr s    -> show s     LPrim s    -> s     LExn s     -> s-    LForImp s _-> '^' : last (words s)  -- XXX needs improvement+    LForImp ie s _-> '^' : if isPtr then '&':s else s+      where isPtr = case ie of ImpStatic _ IPtr _ -> True; _ -> False+    LCType (CType t) -> show t     LTick s    -> '!' : s  ppEStmt :: EStmt -> Doc@@ -998,6 +1085,7 @@     SBind p e -> ppEPat p <+> text "<-" <+> ppExpr e     SThen e -> ppExpr e     SLet bs -> text "let" $$ nest 2 (vcat (map ppEBind bs))+    SRec ss -> text "rec" $$ nest 2 (vcat (map ppEStmt ss))  ppCaseArm :: ECaseArm -> Doc ppCaseArm arm =@@ -1026,6 +1114,12 @@ getBindsVars :: HasCallStack => [EBind] -> [Ident] getBindsVars = concatMap getBindVars +getStmtBound :: EStmt -> [Ident]+getStmtBound (SBind p _) = patVars p+getStmtBound (SThen _) = []+getStmtBound (SLet bs) = concatMap getBindVars bs+getStmtBound (SRec ss) = concatMap getStmtBound ss+ eForall :: [IdKind] -> EType -> EType eForall = eForall' QExpl @@ -1078,6 +1172,7 @@   where loop as (EVar i) = Just (i, as)         loop as (EApp f a) = loop (a:as) f         loop as (EParen e) = loop as e+        loop as (EOper e1 [(op, e2)]) = loop as $ EApp (EApp (EVar op) e1) e2         loop _ _ = Nothing  getApp :: HasCallStack => EType -> (Ident, [EType])@@ -1112,7 +1207,12 @@     go _ x _ = error ("freeTyVars: " ++ show x) --  impossibleShow x     goList bound es acc = foldr (go bound) acc es -getImplies :: EType -> Maybe (EType, EType)+getImplies :: EType -> Maybe (EConstraint, EType) getImplies (EApp (EApp (EVar n) a) b) =   if isIdent "=>" n || isIdent "Primitives.=>" n then Just (a, b) else Nothing getImplies _ = Nothing++dropForallContext :: EType -> EType+dropForallContext (EForall _ _ t) = dropForallContext t+dropForallContext t | Just (_, t') <- getImplies t = dropForallContext t'+                    | otherwise = t
src/MicroHs/FFI.hs view
@@ -1,6 +1,5 @@ module MicroHs.FFI(makeFFI) where import qualified Prelude(); import MHSPrelude-import Data.Function import Data.List import MicroHs.Desugar(LDef) import MicroHs.Exp@@ -8,66 +7,94 @@ import MicroHs.Flags import MicroHs.Ident import MicroHs.Names+--import Debug.Trace -makeFFI :: Flags -> [LDef] -> String-makeFFI _ ds =-  let ffiImports = [ (parseImpEnt i f, t) | (i, d) <- ds, Lit (LForImp f (CType t)) <- [get d] ]+-- The export table has (internal-name, external-name, external-type)+makeFFI :: Flags -> [(Ident, Ident, CType)] -> [LDef] -> (String, String)+makeFFI _ forExps ds =+  let ffiImports = nubBy eq [ (ie, n, t) | (_, d) <- ds, Lit (LForImp ie n (CType t)) <- [get d] ]                  where get (App _ a) = a   -- if there is no IO type, we have (App primPerform (LForImp ...))                        get a = a-      wrappers = [ t | (ImpWrapper, t) <- ffiImports]-      dynamics = [ t | (ImpDynamic, t) <- ffiImports]-      imps     = uniqName $ filter ((`notElem` runtimeFFI) . impName) ffiImports-      includes = "mhsffi.h" : nub [ inc | (ImpStatic _ (Just inc) _ _, _) <- imps ]+                       eq (_, n, _) (_, n', _) = n == n'+      wrappers = [ t | (ImpWrapper, _, t) <- ffiImports]+      dynamics = [ t | (ImpDynamic, _, t) <- ffiImports]+      imps     = filter ((`notElem` runtimeFFI) . impName) ffiImports+      includes = jsincs ++ nub [ inc | (ImpStatic iincs _ _, _, _) <- imps, inc <- iincs ]+      jsincs   = if any isJS ffiImports then ["emscripten.h"] else []+        where isJS (ImpJS _, _, _) = True+              isJS _ = False+      mkSig (_, i, CType t) = let (as, ior) = getArrows t in mkExportSig i as ior ++ ";"+      header = unlines+        ["#include <stdint.h>",+         "#if defined(__cplusplus)",+         "extern \"C\" {",+         "#endif",+         "void mhs_init(void);",+         intercalate "\n" $ map mkSig forExps,+         "#if defined(__cplusplus)",+         "}",+         "#endif"+        ]   in-    if not (null wrappers) || not (null dynamics) then error "Unimplemented FFI feature" else-    unlines $+    if not (null wrappers) || not (null dynamics) then mhsError "Unimplemented FFI feature" else+    (unlines $       map (\ fn -> "#include \"" ++ fn ++ "\"") includes ++       map mkHdr imps ++-      ["static struct ffi_entry table[] = {"] +++      ["static const struct ffi_entry imp_table[] = {"] ++       map mkEntry imps ++       ["{ 0,0 }",        "};",-       "struct ffi_entry *xffi_table = table;"-      ]--uniqName :: [(ImpEnt, EType)] -> [(ImpEnt, EType)]-uniqName = map head . groupBy ((==) `on` impName) . sortBy (compare `on` impName)+       "const struct ffi_entry *xffi_table = imp_table;"+      ] +++      ["static struct ffe_entry exp_table[] = {"] +++      map mkExport forExps +++      ["  { 0,0 }",+       "};",+       "struct ffe_entry *xffe_table = exp_table;",+       "\n"+      ] ++ zipWith mkExportWrapper [0..] forExps+    , header) -data ImpEnt = ImpStatic Ident (Maybe String) Imp String | ImpDynamic | ImpWrapper---  deriving (Show)+mkExportSig :: Ident -> [EType] -> EType -> String+mkExportSig n as ior =+  let outT = cTypeName $ checkIO ior+      ins = zipWith (\ i a -> cTypeName a ++ " _x" ++ show i) [1::Int ..] as+   in outT ++ " " ++ unIdent n ++ "(" ++ intercalate ", " ins ++ ")" -impName :: (ImpEnt, EType) -> String-impName (ImpStatic i _ Value _, _) = unIdent' i-impName (ImpStatic _ _ _ s, _) = s-impName _ = undefined+mkExport :: (Ident, Ident, CType) -> String+mkExport (i, _, _) = "  { \"" ++ unIdent i ++ "\", 0 }," -data Imp = Ptr | Value | Func---  deriving (Show)+mkExportWrapper :: Int -> (Ident, Ident, CType) -> String+mkExportWrapper no (_, n, CType t) = unlines $+  let (as, ior) = getArrows t+      r = checkIO ior+      outT = cTypeName r+      arg k a = "  mhs_from_" ++ cTypeHsName a ++ "(ffe_alloc(), 0, _x" ++ show k ++ "); ffe_apply();"+      eval = if eqEType r ior then "ffe_eval()" else "ffe_exec()"+  in  [mkExportSig n as ior ++ " {",+       "  gc_check(" ++ show (2 * length as + 4) ++ ");",+       "  ffe_push(xffe_table[" ++ show no ++ "].ffe_value);" ]+      ++ zipWith arg [1::Int ..] as +++      if isUnit r then+        [ "  (void)" ++ eval ++ ";",+          "  ffe_pop();",+          "}"+        ]+       else+        [ "  " ++ outT ++ " _res = mhs_to_" ++ cTypeHsName r ++ "(" ++ eval ++ ", -1);",+          "  ffe_pop();",+          "  return _res;",+          "}"+        ] --- "[static] [name.h] [&] [name]"--- "dynamic"--- "wrapper"-parseImpEnt :: Ident -> String -> ImpEnt-parseImpEnt i s =-  case words s of-    ["dynamic"] -> ImpDynamic-    ["wrapper"] -> ImpWrapper-    "static" : r -> rest r-    r            -> rest r- where rest (inc : r) | ".h" `isSuffixOf` inc = rest' (ImpStatic i (Just inc)) r-       rest r                                 = rest' (ImpStatic i Nothing)    r-       rest' c ("&"     : r) = rest'' (c Ptr) r-       rest' c ['&'     : r] = rest'' (c Ptr) [r]-       rest' c ("value" : r) = rest'' (c Value) [unwords r]-       rest' c r             = rest'' (c Func) r-       rest'' c [n] = c n-       rest'' _ _ = errorMessage loc $ "bad foreign import " ++ show s-       loc = getSLoc i+impName :: (ImpEnt, String, EType) -> String+impName (_, s, _) = s -mkEntry :: (ImpEnt, EType) -> String-mkEntry (ImpStatic _ _ Func  f, t) = "{ \"" ++ f ++ "\", " ++ show (arity t) ++ ", mhs_" ++ f ++ "},"-mkEntry (ImpStatic _ _ Ptr   f, _) = "{ \"&" ++ f ++ "\", 0, mhs_addr_" ++ f ++ "},"-mkEntry (ImpStatic i _ Value _, _) = "{ \"" ++ f ++ "\", 0, mhs_" ++ f ++ "}," where f = unIdent' i+mkEntry :: (ImpEnt, String, EType) -> String+mkEntry (ImpStatic _ IFunc  _, f, t) = "{ \"" ++ f ++ "\", " ++ show (arity t) ++ ", mhs_" ++ f ++ "},"+mkEntry (ImpStatic _ IPtr   _, f, _) = "{ \"&" ++ f ++ "\", 0, mhs_addr_" ++ f ++ "},"+mkEntry (ImpStatic _ IValue _, f, _) = "{ \"" ++ f ++ "\", 0, mhs_" ++ f ++ "},"+mkEntry (ImpJS _,              f, t) = "{ \"" ++ f ++ "\", " ++ show (arity t) ++ ", mhs_" ++ f ++ "}," mkEntry _ = undefined  mkMhsFun :: String -> String -> String@@ -87,14 +114,17 @@ isUnit (EVar unit) = unit == identUnit isUnit _ = False -mkRet :: EType -> Int -> String -> String-mkRet t n call = "mhs_from_" ++ cTypeName t ++ "(s, " ++ show n ++ ", " ++ call ++ ")"+mkRet :: HasCallStack => EType -> Int -> String -> String+mkRet t n call = "mhs_from_" ++ cTypeHsName t ++ "(s, " ++ show n ++ ", " ++ call ++ ")"  mkArg :: EType -> Int -> String-mkArg t i = "mhs_to_" ++ cTypeName t ++ "(s, " ++ show i ++ ")"+mkArg t i = "mhs_to_" ++ cTypeHsName t ++ "(s, " ++ show i ++ ")" -mkHdr :: (ImpEnt, EType) -> String-mkHdr (ImpStatic _ _ Ptr fn, iot) =+mkJSArg :: EType -> Int -> String+mkJSArg t i = "mhs_to_" ++ jsTypeName t ++ "(s, " ++ show i ++ ")"++mkHdr :: (ImpEnt, String, EType) -> String+mkHdr (ImpStatic _ IPtr fn, f, iot) =   let r = checkIO iot       (s, _) =         case dropApp identPtr r of@@ -103,9 +133,9 @@             case dropApp identFunPtr r of               Just t  -> ("(HsFunPtr)", t)               Nothing -> errorMessage (getSLoc r) "foreign & must be Ptr/FunPtr"-      body = mkRet r 0 (s ++ "&" ++ fn)-  in  mkMhsFun ("addr_" ++ fn) body-mkHdr (ImpStatic _ _ Func fn, t) =+      body = "return " ++ mkRet r 0 (s ++ "&" ++ fn)+  in  mkMhsFun ("addr_" ++ f) body+mkHdr (ImpStatic _ IFunc fn, f, t) =   let (as, ior) = getArrows t       r = checkIO ior       n = length as@@ -115,77 +145,137 @@           call ++ "; return mhs_from_Unit(s, " ++ show n ++ ")"         else           "return " ++ mkRet r n call-  in  mkMhsFun fn fcall-mkHdr (ImpStatic i _ Value val, iot) =+  in  mkMhsFun f fcall+mkHdr (ImpStatic _ IValue val, f, iot) =   let r = checkIO iot-      body = mkRet r 0 val-  in  mkMhsFun (unIdent' i) body+      body = "return " ++ mkRet r 0 val+  in  mkMhsFun f body+mkHdr (ImpJS s, f, ty) =+  let (as, ior) = getArrows ty+      rt = checkIO ior+      jsr = jsTypeNameR rt+      n = length as+      args = concat $ zipWith arg as [0..]+      arg t i = ", " ++ mkJSArg t i+      call = "EM_ASM" +++             (if isUnit rt then "" else '_':jsr) +++             "({ " ++ s ++ " }" ++ args ++ ")"+      fcall =+        if isUnit rt then+          call ++ "; return mhs_from_Unit(s, " ++ show n ++ ")"+        else+          "return " ++ mkRet rt n call+  in  mkMhsFun f fcall mkHdr _ = undefined  arity :: EType -> Int arity = length . fst . getArrows -unIdent' :: Ident -> String-unIdent' = unIdent . unQualIdent+-- Use to construct 'foreign import/export ccall' wrapper.+cTypeHsName :: HasCallStack => EType -> String+cTypeHsName (EApp (EVar ptr) _t) | ptr == identPtr = "Ptr"+                                 | ptr == identFunPtr = "FunPtr"+cTypeHsName (EVar i) | Just c <- lookup (unIdent i) cHsTypes = c+cTypeHsName t = errorMessage (getSLoc t) $ "Not a valid C type: " ++ showEType t +cHsTypes :: [(String, String)]+cHsTypes =+  [ ("Primitives.Float",  "Float")+  , ("Primitives.Double", "Double")+  , ("Primitives.Int",    "Int")+  , ("Primitives.Int64",  "Int64")+  , ("Primitives.Word",   "Word")+  , ("Primitives.Word64", "Word64")+  , ("()",                "Unit")+  , ("System.IO.Handle",  "Ptr")+  ]++-- Use to construct 'foreign export ccall' signature. cTypeName :: EType -> String-cTypeName (EApp (EVar ptr) _t) | ptr == identPtr = "Ptr"-                               | ptr == identFunPtr = "FunPtr"+cTypeName (EApp (EVar ptr) _t) | ptr == identPtr = "void*" cTypeName (EVar i) | Just c <- lookup (unIdent i) cTypes = c cTypeName t = errorMessage (getSLoc t) $ "Not a valid C type: " ++ showEType t  cTypes :: [(String, String)] cTypes =-  -- These are temporary-  [ ("Primitives.FloatW", "FloatW")-  , ("Primitives.Int",    "Int")-  , ("Primitives.Word",   "Word")-  , ("Data.Word.Word8",   "Word8")-  , ("()",                "Unit")-  , ("System.IO.Handle",  "Ptr")-  ] ++ map (\ t -> ("Foreign.C.Types." ++ t, t))-  [ "CChar",-    "CSChar",-    "CUChar",-    "CShort",-    "CUShort",-    "CInt",-    "CUInt",-    "CLong",-    "CULong",-    "CPtrdiff",-    "CSize",-    "CSSize",-    "CLLong",-    "CULLong",-    "CTime"+  [ ("Primitives.Float",  "float")+  , ("Primitives.Double", "double")+  , ("Primitives.Int",    "intptr_t")   -- value_t+  , ("Primitives.Int64",  "int64_t")+  , ("Primitives.Word",   "uintptr_t")  -- uvalue_t+  , ("Primitives.Word64", "uint64_t")+  , ("()",                "void")+  , ("System.IO.Handle",  "void*")   ] +-- Use to construct 'foreign import javascript' return value wrapper.+jsTypeNameR :: EType -> String+jsTypeNameR (EApp (EVar ptr) _) | ptr == identPtr = "PTR"+jsTypeNameR (EVar i) | Just c <- lookup (unIdent i) jsTypesR = c+jsTypeNameR t = errorMessage (getSLoc t) $ "Not a valid Javascript return type: " ++ showEType t++jsTypesR :: [(String, String)]+jsTypesR =+  [ ("Primitives.Int",    "INT")+  , ("Primitives.Double", "DOUBLE")+  , ("Primitives.Float",  "DOUBLE")+  ]++-- Use to construct 'foreign import javascript' argument wrapper.+jsTypeName :: EType -> String+jsTypeName (EApp (EVar ptr) _) | ptr == identPtr = "Ptr"+jsTypeName (EVar i) | Just c <- lookup (unIdent i) jsTypes = c+jsTypeName t = errorMessage (getSLoc t) $ "Not a valid Javascript argument type: " ++ showEType t++jsTypes :: [(String, String)]+jsTypes =+  [ ("Primitives.Int",    "Int")+  , ("Primitives.Double", "Double")+  , ("Primitives.Float",  "Double")+  ]+ -- These are already in the runtime runtimeFFI :: [String] runtimeFFI = [-  "GETRAW", "GETTIMEMILLI", "acos", "add_FILE", "add_utf8", "asin", "atan", "atan2", "calloc", "closeb",-  "cos", "exp", "flushb", "fopen", "free", "getb", "getenv", "iswindows", "log", "malloc",-  "md5Array", "md5BFILE", "md5String", "memcpy", "memmove",+  "GETRAW", "GETTIMEMILLI", "acos", "add_FILE", "add_fd", "open", "add_utf8", "add_buf", "add_crlf",+  "asin", "atan", "atan2", "calloc", "closeb",+  "cos", "exp", "flushb", "fopen", "free", "getb", "getenv", "islinux", "ismacos", "iswindows", "log", "malloc",+  "md5Array", "md5BFILE", "md5String", "memcpy", "memmove", "realloc", "strlen", "strcpy",   "putb", "sin", "sqrt", "system", "tan", "tmpname", "ungetb", "unlink",+  "acosf", "asinf", "atanf", "atan2f", "cosf", "expf", "logf", "sinf", "sqrtf", "tanf",+  "scalbn", "scalbnf",+  "js_debug", "js_eval_run", "js_eval_call", "js_set_haskellCallback",   "readb", "writeb",   "peekPtr", "pokePtr", "pokeWord", "peekWord",   "add_lz77_compressor", "add_lz77_decompressor",   "add_rle_compressor", "add_rle_decompressor",+  "add_base64_encoder", "add_base64_decoder",   "add_bwt_compressor", "add_bwt_decompressor",   "peek_uint8", "poke_uint8", "peek_uint16", "poke_uint16", "peek_uint32", "poke_uint32", "peek_uint64", "poke_uint64",   "peek_int8", "poke_int8", "peek_int16", "poke_int16", "peek_int32", "poke_int32", "peek_int64", "poke_int64",+  "peek_char", "poke_char", "peek_schar", "poke_schar", "peek_uchar", "poke_uchar",   "peek_ushort", "poke_ushort", "peek_short", "poke_short",   "peek_uint", "poke_uint", "peek_int", "poke_int",   "peek_ulong", "poke_ulong", "peek_long", "poke_long",   "peek_ullong", "poke_ullong", "peek_llong", "poke_llong",-  "peek_flt", "poke_flt",-  "sizeof_int", "sizeof_long", "sizeof_llong",+  "peek_size_t", "poke_size_t",+  "peek_flt32", "poke_flt32",+  "peek_flt64", "poke_flt64",+  "sizeof_char", "sizeof_short", "sizeof_int", "sizeof_long", "sizeof_llong", "sizeof_size_t",   "opendir", "closedir", "readdir", "c_d_name", "chdir", "mkdir", "getcwd",-  "get_buf", "openb_rd_buf", "openb_wr_buf",-  "new_mpz", "mpz_abs", "mpz_add", "mpz_and", "mpz_cmp", "mpz_get_d",-  "mpz_get_si", "mpz_get_ui", "mpz_init_set_si", "mpz_init_set_ui", "mpz_ior",+  "getcpu",+  "get_mem", "openb_rd_mem", "openb_wr_mem",+  "new_mpz", "mpz_abs", "mpz_add", "mpz_and", "mpz_cmp", "mpz_get_d", "mpz_get_f",+  "mpz_get_si", "mpz_init_set_si", "mpz_init_set_ui",+  "mpz_ior",   "mpz_mul", "mpz_mul_2exp", "mpz_neg", "mpz_popcount", "mpz_sub", "mpz_fdiv_q_2exp",   "mpz_tdiv_qr", "mpz_tstbit", "mpz_xor",-  "want_gmp"+  "mpz_get_si64", "mpz_init_set_si64", "mpz_init_set_ui64",+  "mpz_log2",+  "want_gmp",+  "gettimeofday",+  "E2BIG", "EAGAIN", "EINTR", "EINVAL", "EWOULDBLOCK",+  "errno",+  "strerror_r",+  "environ"   ]
src/MicroHs/Fixity.hs view
@@ -1,4 +1,4 @@-module MicroHs.Fixity(resolveFixity) where+module MicroHs.Fixity(defaultFixity, resolveFixity) where import qualified Prelude(); import MHSPrelude import MicroHs.Builtin import MicroHs.Expr@@ -39,6 +39,9 @@  data FixInput = Rator Fix Expr Fixity | Rand Expr --  deriving (Show)++defaultFixity :: Fixity+defaultFixity = (AssocLeft, 9)  eNeg :: SLoc -> Expr eNeg loc = EVar (mkBuiltin loc "negate")
src/MicroHs/Flags.hs view
@@ -18,13 +18,18 @@   doCPP      :: Bool,       -- run ccphs on input files   cppArgs    :: [String],   -- flags for CPP   cArgs      :: [String],   -- arguments for C compiler+  lArgs      :: [String],   -- arguments for C linker   compress   :: Bool,       -- compress generated combinators+  base64     :: Bool,       -- base64 encode generated combinators   buildPkg   :: Maybe FilePath, -- build a package   listPkg    :: Maybe FilePath, -- list package contents   pkgPath    :: [FilePath], -- package search path   installPkg :: Bool,       -- install a package+  preload    :: [String],   -- packages to preload   target     :: String,     -- Compile target defined in target.conf-  dumpFlags  :: [DumpFlag]  -- For debugging+  dumpFlags  :: [DumpFlag], -- For debugging,+  useStdin   :: Bool,       -- Use stdin in interactive system+  noLink     :: Bool        -- Just generate an unlinked object file   }   deriving (Show) @@ -46,19 +51,24 @@   doCPP      = False,   cppArgs    = [],   cArgs      = [],+  lArgs      = [],   compress   = False,+  base64     = False,   buildPkg   = Nothing,   listPkg    = Nothing,   pkgPath    = [],   installPkg = False,+  preload    = [],   target     = "default",-  dumpFlags  = []+  dumpFlags  = [],+  useStdin   = False,+  noLink     = False   }   -- This is a hack so that the in-place mhs picks up GMP.   where gmp | dir == "." && wantGMP = ["lib/gmp"]             | otherwise             = [] -data DumpFlag = Dparse | Dderive | Dtypecheck | Ddesugar | Dtoplevel | Dcombinator | Dall+data DumpFlag = Dpreproc | Dparse | Dderive | Dtypecheck | Ddesugar | Dlinked | Dtoplevel | Dcombinator | Dall   deriving (Eq, Show, Enum, Bounded)  dumpIf :: Monad m => Flags -> DumpFlag -> m () -> m ()
src/MicroHs/Ident.hs view
@@ -16,16 +16,18 @@   qualOf,   addIdentSuffix,   SLoc(..), noSLoc,+  orSLoc,   showSLoc, slocFile,   isUpperX,+  hideIdent,+  isHiddenIdent,   ) where import qualified Prelude(); import MHSPrelude hiding(head) import Data.Char import Text.PrettyPrint.HughesPJLite-import GHC.Stack import MicroHs.List(dropEnd) -import Data.Text(Text, pack, unpack, append, head)+import Data.Text(Text, pack, unpack, append, head, cons)  {- -- Uncomment this section, and comment out the two lines above@@ -81,6 +83,14 @@ noSLoc :: SLoc noSLoc = SLoc "" 0 0 +isNoSLoc :: SLoc -> Bool+isNoSLoc (SLoc "" 0 0) = True+isNoSLoc _ = False++orSLoc :: SLoc -> SLoc -> SLoc+l1 `orSLoc` l2 | isNoSLoc l1 = l2+               | otherwise   = l1+ mkIdent :: String -> Ident mkIdent = mkIdentSLoc noSLoc @@ -190,6 +200,13 @@ slocFile (SLoc f _ _) = f  isUpperX :: Char -> Bool-isUpperX '\8658' = False+isUpperX '\8658' = False  -- these two lines avoid using the whole Unicode machinery isUpperX '\8594' = False isUpperX c = isUpper c++-- This is a hack to hide an identifier without removing it+hideIdent :: Ident -> Ident+hideIdent (Ident l s) = Ident l (cons ' ' s)++isHiddenIdent :: Ident -> Bool+isHiddenIdent (Ident _ s) = Data.Text.head s == ' '
src/MicroHs/IdentMap.hs view
@@ -90,6 +90,9 @@ node Nil  key val Nil   = One key val node left key val right = Node left (size left + 1 + size right) key val right +node' :: forall a . Map a -> Ident -> a -> Map a -> Map a+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@@ -167,39 +170,50 @@ --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+balance       Nil                key val        Nil               = One key val+balance       Nil                key val right@(One _ _)          = Node Nil  2 key val right+balance       Nil                key val right@(Node rl _ _ _ rr)+                                        | size rl < alpha*size rr = singleL Nil key val right+                                        | otherwise               = doubleL Nil key val right+balance left@(One _ _)           key val        Nil               = Node left 2 key val Nil+balance left@(One _ _)           key val right@(One _ _)          = Node left 3 key val right+balance left@(One _ _)           key val right@(Node rl sr _ _ rr)+                                        | sr > omega {- *1+delta-}= if size rl < alpha*size rr then singleL left key val right+                                                                                               else doubleL left key val right+                                        | otherwise               = Node left (2 + sr) key val right+balance left@(Node ll  _ _ _ lr) key val        Nil+                                        | size lr < alpha*size ll = singleR left key val Nil+                                        | otherwise               = doubleR left key val Nil+balance left@(Node ll sl _ _ lr) key val right@(One _ _)+                                        | sl > omega {- *1+delta-}= if size lr < alpha*size ll then singleR left key val right+                                                                                               else doubleR left key val right+                                        | otherwise               = Node left (2 + sl) key val right+balance left@(Node ll sl _ _ lr) key val right@(Node rl sr _ _ rr)+  | sr > omega * sl {- + delta -} =+         if size rl < alpha*size rr then singleL left key val right+                                    else doubleL left key val right+  | sl > omega * sr {- + delta -} =+         if size lr < alpha*size ll then singleR left key val right+                                    else doubleR left key val right+  | 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 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 (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 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 (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  -- Merge two maps.  There is no guarantee which side "wins"
src/MicroHs/Interactive.hs view
@@ -7,35 +7,53 @@ import MicroHs.Compile import MicroHs.CompileCache import MicroHs.Desugar(LDef)-import MicroHs.Expr(EType, showEType)+import MicroHs.Exp(Exp(Var))+import MicroHs.Expr(showEType, EModule(..), EDef(..)) import MicroHs.Flags import MicroHs.Ident(mkIdent, Ident, unIdent, isIdentChar)+import qualified MicroHs.IdentMap as M import MicroHs.List import MicroHs.Parse import MicroHs.StateIO-import MicroHs.SymTab(Entry(..), stEmpty, stKeysGlbU)+import MicroHs.SymTab(Entry(..), stEmpty, stKeysGlbU, stLookup) import MicroHs.Translate-import MicroHs.TypeCheck(ValueExport(..), TypeExport(..), TModule(..), Symbols)+import MicroHs.TCMonad(TCState(..))+import MicroHs.TypeCheck(TModule(..), Symbols) import Unsafe.Coerce import System.Console.SimpleReadline import Paths_MicroHs(version)+import System.Environment+import System.FilePath+import System.IO+--import System.IO.TimeMilli  data IState = IState {   isLines   :: String,   isFlags   :: Flags,   isCache   :: Cache,-  isSymbols :: Symbols+  isSymbols :: Symbols,+  isStats   :: Bool,+  isCComp   :: (Int, TCState, TranslateMap),+  isHistory :: FilePath   } +-- To speed up interactive use, the state of the symbol table after+-- processing all imports is cached in isCComp together with the+-- mapping from all imported names to their actual values.+-- Every time the imports change, these tables are recomputed.+ type I a = StateIO IState a  mainInteractive :: Flags -> IO () mainInteractive flags = do   putStrLn $ "Welcome to interactive MicroHs, version " ++ showVersion version   when wantGMP $ putStrLn "Using GMP"+  mhome <- lookupEnv "HOME"   let flags' = flags{ loading = True }+      hist = maybe mhsi (</> mhsi) mhome+      mhsi = ".mhsi"   cash <- getCached flags'-  _ <- runStateIO start $ IState preamble flags' cash noSymbols+  _ <- runStateIO start $ IState preamble flags' cash noSymbols False (-1, error "tcstate", M.empty) hist   return ()  noSymbols :: Symbols@@ -48,60 +66,77 @@            \default IsString (String)\n\            \default Show (())\n" +putStrLnI :: String -> I ()+putStrLnI = liftIO . putStrLn+ start :: I () start = do   reload   is <- get   liftIO $ maybeSaveCache (isFlags is) (isCache is)-  liftIO $ putStrLn "Type ':quit' to quit, ':help' for help"+  putStrLnI "Type ':quit' to quit, ':help' for help"   unless compiledWithMhs $ do-    --liftIO $ putStrLn "WARNING: Not compiled with mhs, so limited functionality."-    error "The interactive system currently only works with mhs"+    --putStrLnI "WARNING: Not compiled with mhs, so limited functionality."+    mhsError "The interactive system currently only works with mhs"   repl  repl :: I () repl = do   mdls <- gets (cachedModuleNames . isCache)   syms <- gets isSymbols-  ms <- liftIO $ getInputLineHistComp (return . complete mdls syms) ".mhsi" "> "+  stdinFlag <- gets (useStdin . isFlags)+  hist <- gets isHistory+  ms <- liftIO $+    if stdinFlag then do+      putStr "> "+      hFlush stdout+      es <- try getLine+      case es of+        Left  (_::SomeException) -> return Nothing+        Right s                  -> return (Just s)+    else do+      ms <- getInputLineHistComp (return . complete mdls syms) hist "> "+      return (ms <|> Just "")  -- ignore ^D+  let bye = putStrLnI "Bye"   case ms of-    Nothing -> repl+    Nothing -> bye     Just s ->       case s of         [] -> repl         ':':r -> do           c <- command r-          if c then repl else liftIO $ putStrLn "Bye"+          if c then repl else bye         _ -> do           oneline s           repl  command :: String -> I Bool command s =+  let fw = (!!0) . words . fst in   case words s of     [] -> return True     c : ws ->-      case filter (isPrefixOf c . (!!0) . words . fst) commands of+      case filter (isPrefixOf c . fw) commands of         [] -> do-          liftIO $ putStrLn "Unrecognized command"+          putStrLnI "Unrecognized command"           return True         [(_, cmd)] ->           cmd (unwords ws)         xs -> do-          liftIO $ putStrLn $ "Ambiguous command: " ++ unwords (map fst xs)+          putStrLnI $ "Ambiguous command: " ++ unwords (map fw xs)           return True  commands :: [(String, String -> I Bool)] commands =-  [ ("quit      quit MicroHs",+  [ ("quit        quit MicroHs",      const $ return False     )-  , ("clear     clear all definitions", const $ do+  , ("clear       clear all definitions", const $ do       updateLines (const preamble)       modify $ \ is -> is{ isCache = emptyCache, isSymbols = noSymbols }       return True     )-  , ("reload    reload modules", const $ do+  , ("reload      reload modules", const $ do       flgs <- gets isFlags       cash <- gets isCache       cash' <- liftIO $ validateCache flgs cash@@ -109,32 +144,52 @@       reload       return True     )-  , ("delete d  delete definition(s) d", \ line -> do+  , ("delete d    delete definition(s) d", \ line -> do       updateLines (unlines . filter (not . isPrefixOf line) . lines)       return True     )-  , ("type e    show type of e", \ line -> do+  , ("type e      show type of e", \ line -> do       showType line       return True     )-  , ("kind t    show kind of t", \ line -> do+  , ("kind t      show kind of t", \ line -> do       showKind line       return True     )-  , ("main args run main with arguments", \ line -> do+  , ("main args   run main with arguments", \ line -> do       runMain line       return True     )-  , ("defs      show current definitions", const $ do+  , ("defs        show current definitions", const $ do       showDefs       return True     )-  , ("help      this text", const $ do-      liftIO $ putStrLn $ helpText ++ unlines (map ((':' :) . fst) commands)+  , ("save [FILE] save current definitions", \ line -> do+      saveDefs line       return True     )+  , ("help        this text", const $ do+      putStrLnI $ helpText ++ unlines (map ((':' :) . fst) commands)+      return True+    )+  , ("set [FLAG]  (un)set flag", \ line -> do+      setFlags line+      return True+    )   ] +setFlags :: String -> I ()+setFlags "" = do+  stats <- gets isStats+  putStrLnI "Current flags: (use + to set and - to unset)"+  putStrLnI $ "  " ++ (if stats then "+" else "-") ++ "s"+setFlags "+s" = do+  modify $ \ is -> is{ isStats = True }+setFlags "-s" = do+  modify $ \ is -> is{ isStats = False }+setFlags _ =+  putStrLnI "Unknown flag.  Known flags: +s, -s"+ reload :: I () reload = do   ls <- gets isLines@@ -145,25 +200,25 @@  helpText :: String helpText = "\-  \Commands:\n\-  \expr       evaluate expression\n\-  \defn       add top level definition\n\+  \Commands (may be abbreviated):\n\+  \expr         evaluate expression\n\+  \defn         add top level definition\n\   \"  updateLines :: (String -> String) -> I () updateLines f = modify $ \ is -> is{ isLines = f (isLines is) } -updateCache :: (Cache -> Cache) -> I ()-updateCache f = modify $ \ is -> is{ isCache = f (isCache is) }+--updateCache :: (Cache -> Cache) -> I ()+--updateCache f = modify $ \ is -> is{ isCache = f (isCache is) } -setSyms :: Symbols -> I ()-setSyms syms = modify $ \ is -> is{ isSymbols = syms }+--setSyms :: Symbols -> I ()+--setSyms syms = modify $ \ is -> is{ isSymbols = syms }  interactiveName :: String interactiveName = "Interactive" -interactiveId :: Ident-interactiveId = mkIdent interactiveName+--interactiveId :: Ident+--interactiveId = mkIdent interactiveName  itName :: String itName = "_it"@@ -178,10 +233,11 @@ mkIt l =   itName ++ " = " ++ l ++ "\n" -mkItIO :: String -> String-mkItIO l =-  mkIt l ++-  itIOName ++ " = printOrRun " ++ itName ++ "\n"+mkItIO :: Bool -> String -> String+mkItIO stats l =+  let prt = if stats then "_printOrRunStats" else "_printOrRun"+  in  mkIt l +++      itIOName ++ " = " ++ prt ++ " " ++ itName ++ "\n"  mkTypeIt :: String -> String mkTypeIt l =@@ -196,16 +252,25 @@ oneline :: String -> I () oneline line = do   ls <- gets isLines+  stats <- gets isStats   let lls = ls ++ line ++ "\n"       def = do         defTest <- tryCompile lls         case defTest of-          Right _ -> updateLines (const lls)+          Right _ -> do+            updateLines (const lls)           Left  e -> liftIO $ err e       expr = do-        exprTest <- tryCompile (ls ++ "\n" ++ mkItIO line)+--        t1 <- liftIO getTimeMilli+        exprTest <- tryCompile (ls ++ "\n" ++ mkItIO stats line)         case exprTest of-          Right m -> evalExpr m+          Right (m, _) -> do+            evalExpr m+{-+            t2 <- liftIO getTimeMilli+            when (stats) $+              liftIO $ putStrLn $ "total " ++ show (t2 - t1) ++ "ms"+-}           Left  e -> liftIO $ err e   -- First try to parse as a definition,   tryParse pTopModule lls def $ \ _ ->@@ -219,23 +284,29 @@     Right _ -> ok     Left  e -> bad e -tryCompile :: String -> I (Either SomeException [LDef])-tryCompile file = do-  updateCache (deleteFromCache interactiveId)+tryCompile :: String -> I (Either SomeException ([LDef], TCState))+tryCompile file = trySIO $ compile file++compile :: String -> I ([LDef], TCState)+compile file = do+--  putStrLnI $ "tryCompile:\n" ++ file+  let mdl@(EModule mn es _) = parseDie pTopModule "" file+  defs <- updateTCStateCache mdl+  (_, tcstate, _) <- gets isCComp+  let mdl' = EModule mn es (SetTCState tcstate : defs)   flgs <- gets isFlags   cash <- gets isCache-  liftIO $ writeFile (interactiveName ++ ".hs") file-  res <- liftIO $ try $ compileCacheTop flgs interactiveId cash-  case res of-    Left e -> return (Left e)-    Right ((_, m), syms, cash') -> do-      updateCache (const cash')-      setSyms syms-      return (Right m)+--  putStrLnI $ " tryCompile compile " ++ show mdl'+  ((dmdl, _, tcstate'), _) <- liftIO $ runStateIO (compileInteractive flgs mdl') cash+  cmdl <- liftIO $ evaluate $ compileToCombinators dmdl+--  putStrLnI $ " tryCompile dmdl = " ++ (show $ tBindingsOf dmdl)+  return (tBindingsOf cmdl, tcstate')  evalExpr :: [LDef] -> I () evalExpr cmdl = do-  let ares = translate (mkIdent (interactiveName ++ "." ++ itIOName), cmdl)+--  putStrLnI $ "evalExpr: " ++ show cmdl+  (_, _, tmap) <- gets isCComp+  let ares = translateWithMap tmap (cmdl, Var $ mkIdent (interactiveName ++ "." ++ itIOName))       res = unsafeCoerce ares :: IO ()   mval <- liftIO $ try (seq res (return res))   liftIO $@@ -252,10 +323,10 @@   ls <- gets isLines   res <- tryCompile (ls ++ "\n" ++ mkIt line)   case res of-    Right _ -> do-      cash <- gets isCache-      let t = getTypeInCache cash (mkIdent itName)-      liftIO $ putStrLn $ showEType t+    Right (_, tcs) -> do+      case stLookup "" (mkIdent itName) (valueTable tcs) of+        Right (Entry _ t) -> putStrLnI $ showEType t+        _ -> error "showType"     Left  e ->       liftIO $ err e @@ -264,10 +335,10 @@   ls <- gets isLines   res <- tryCompile (ls ++ "\n" ++ mkTypeIt line)   case res of-    Right _ -> do-      cash <- gets isCache-      let t = getKindInCache cash (mkIdent itTypeName)-      liftIO $ putStrLn $ showEType t+    Right (_, tcs) -> do+      case stLookup "" (mkIdent itTypeName) (typeTable tcs) of+        Right (Entry _ t) -> putStrLnI $ showEType t+        _ -> error "showKind"     Left  e ->       liftIO $ err e @@ -277,21 +348,14 @@ showDefs :: I () showDefs = do   ls <- gets isLines-  liftIO $ putStrLn ls--getCModule :: Cache -> TModule [LDef]-getCModule cash =-  case lookupCache interactiveId cash of-    Nothing -> undefined   -- this cannot happen-    Just cm -> cm--getTypeInCache :: Cache -> Ident -> EType-getTypeInCache cash i =-  head $ [ t | ValueExport i' (Entry _ t) <- tValueExps (getCModule cash), i == i' ] ++ [undefined]+  putStrLnI ls -getKindInCache :: Cache -> Ident -> EType-getKindInCache cash i =-  head $ [ k | TypeExport i' (Entry _ k) _ <- tTypeExps (getCModule cash), i == i' ] ++ [undefined]+saveDefs :: String -> I ()+saveDefs "" = saveDefs (interactiveName ++ ".hs")+saveDefs line = do+  ls <- gets isLines+  liftIO $ writeFile line ls+  liftIO $ putStrLn $ "wrote " ++ line  -- This could be smarter: --  ":a"        should complete with commands@@ -313,3 +377,27 @@           case findCommonPrefix ss of             [] -> ss             p  -> [p]++updateTCStateCache :: EModule -> I [EDef]+updateTCStateCache (EModule mn es ds) = do+  let isImport (Import _) = True+      isImport _ = False+      (imps, notImps) = partition isImport ds+      nImps = length imps+      mdl = EModule mn es imps+  (oNImps, _, _) <- gets isCComp+  -- Imports can only be added and deleted, so if it's the same+  -- number of imports as before, then they must be identical.+  if nImps == oNImps then+    return ()+   else do+    -- imports have changed, update TCState cache+    flgs <- gets isFlags+    cash <- gets isCache+--    putStrLnI "*** update tcstate"+    let mdl' = addPreludeImport mdl+    ((_, syms, tcstate), ch) <- liftIO $ runStateIO (compileInteractive flgs mdl') cash+    let idmap = translateMap $ concatMap tBindingsOf $ cachedModules ch+--    putStrLnI $ "*** update isFast " ++ show nImps+    modify $ \ is -> is{ isCComp = (nImps, tcstate, idmap), isCache = ch, isSymbols = syms }+  return notImps
src/MicroHs/Lex.hs view
@@ -24,6 +24,8 @@                                   --  ~  for lazy                                   --  !  for strict                                   --  NOT YET  @  for type app+                                  --  L  for (#+                                  --  R  for #)   | TError  SLoc String           -- lexical error   | TBrace  SLoc                  -- {n} in the Haskell report   | TIndent SLoc                  -- <n> in the Haskell report@@ -40,6 +42,8 @@ showToken (TRat _ d) = show d showToken (TSpec _ c) | c == '<' = "{ layout"                       | c == '>' = "} layout"+                      | c == 'L' = "(#"+                      | c == 'R' = "#)"                       | otherwise = [c] showToken (TError _ s) = s showToken (TBrace _) = "TBrace"@@ -54,8 +58,9 @@ addCol :: SLoc -> Int -> SLoc addCol (SLoc f l c) i = let c' = c+i in seq c' (SLoc f l c') +-- Columns are numbered from 1, so tabs stop are 1, 9, 17, ... tabCol :: SLoc -> SLoc-tabCol (SLoc f l c) = SLoc f l (((c + 7) `quot` 8) * 8)+tabCol (SLoc f l c) = SLoc f l (((c + 7) `quot` 8) * 8 + 1)  mkLocEOF :: SLoc mkLocEOF = SLoc "" (-1) 0@@ -78,7 +83,7 @@     isComm [] = True     isComm (d:_) = not (isOperChar d) lex loc (d:cs) | isLower_ d =-  case span isIdentChar cs of+  case spanIdent 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)@@ -88,10 +93,13 @@   where isBinDigit c = c == '0' || c == '1' lex loc cs@(d:_) | isDigit d =   case readNumDec cs of-    (Left n, len, rs) -> TInt loc n : lex (addCol loc len) rs-    (Right q, len, rs) -> TRat loc q : lex (addCol loc len) rs+    (Left n,  len, rs) -> TInt loc n : lexSkipHash (addCol loc len) rs+    (Right q, len, rs) -> TRat loc q : lexSkipHash (addCol loc len) rs lex loc ('.':cs@(d:_)) | isLower_ d =   TSpec loc '.' : lex (addCol loc 1) cs+lex loc ('(':dcs@(d:cs)) | d == '#'  = TSpec loc 'L' : lex (addCol loc 2) cs+                         | otherwise = TSpec loc '(' : lex (addCol loc 1) dcs+lex loc ('#':')':cs) = TSpec loc 'R' : lex (addCol loc 2) cs -- Recognize #line 123 "file/name.hs" lex loc ('#':xcs) | (SLoc _ _ 1) <- loc, Just cs <- stripPrefix "line " xcs =   case span (/= '\n') cs of@@ -100,6 +108,9 @@           file = tail $ init $ ws!!1   -- strip the initial and final '"'           loc' = SLoc file (readInt (ws!!0) - 1) 1       in  lex loc' rs+                  | (SLoc _ 1 1) <- loc, take 1 xcs == "!" =+  -- It's a shebang (#!), ignore the rest of the line+  skipLine loc xcs lex loc ('!':' ':cs) =  -- ! followed by a space is always an operator   TIdent loc [] "!" : lex (addCol loc 2) cs lex loc (c:cs@(d:_)) | isSpecSing c && not (isOperChar d) = -- handle reserved@@ -109,7 +120,8 @@ 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 (d:cs) | isSpec d =+  TSpec loc d : lex (addCol loc 1) cs lex loc ('"':'"':'"':cs) = lexLitStr loc (addCol loc 3) (TString loc) isTrip multiLine cs   where isTrip ('"':'"':'"':_) = Just 3         isTrip _ = Nothing@@ -133,9 +145,14 @@ lexNumBasePrefix :: Char -> Integer -> (Char -> Bool) -> SLoc -> String -> [Token] lexNumBasePrefix x base isDig loc cs =   case readIntBase base isDig cs of-    Just (n, len, rs) -> TInt loc n : lex (addCol loc $ len + 2) rs-    Nothing -> TInt loc 0 : lex (addCol loc 1) (x : cs)+    Just (n, len, rs) -> TInt loc n : lexSkipHash (addCol loc $ len + 2) rs+    Nothing           -> TInt loc 0 : lexSkipHash (addCol loc 1) (x : cs) +-- Used to skip # after numbers+lexSkipHash :: SLoc -> String -> [Token]+lexSkipHash loc ('#':cs) = lexSkipHash (addCol loc 1) cs+lexSkipHash loc cs = lex loc cs+ readIntBase :: Integer -> (Char -> Bool) -> String -> Maybe (Integer, Int, String) readIntBase base isDig ds =     let (n, len, rest) = goDig 0 0 ds@@ -232,7 +249,8 @@         remGap l rs ('\t':cs) = remGap (tabCol   l) ('\t':rs) cs         remGap l rs ('\r':cs) = remGap           l        rs  cs         remGap l rs (' ' :cs) = remGap (addCol l 1)       rs  cs-        remGap _ _         _  = error "bad string gap"+        remGap l _         _  = --errorMessage oloc "bad string gap"+                                mhsError (show l ++ ": bad string gap")  decodeEscs :: String -> String decodeEscs [] = []@@ -255,7 +273,7 @@ decodeEsc (c1:c2:c3:cs) | Just c <- lookup [c1,c2,c3] ctlCodes = c : decodeEscs cs decodeEsc (c1:c2:cs) | Just c <- lookup [c1,c2] ctlCodes = c : decodeEscs cs decodeEsc (c  :cs) = c : decodeEscs cs-decodeEsc []       = error "Bad \\ escape"+decodeEsc []       = mhsError "Bad \\ escape"  -- Nobody uses these, but it's part of the Haskell Report so... ctlCodes :: [(String, Char)]@@ -335,27 +353,33 @@    (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+                   | isLower_ d   -> ident (spanIdent cs)+                   | isOperChar d -> ident (span isOperChar cs)+         where+           ident (xs, ys) = tIdent sloc (reverse (ds:qs)) xs (lex (addCol loc $ 1 + length ds + length xs) ys)+      '#':_ -> mk (ds ++ hs) rs' where (hs, rs') = span (== '#') rs+      _ -> mk ds rs+  where+     mk ds rs = TIdent sloc (reverse qs) ds : lex (addCol loc $ length ds) rs +spanIdent :: String -> (String, String)+spanIdent s = mk $ span isIdentChar s+  where mk (ds, '#':rs) = mk (ds ++ "#", rs)+        mk r = r+ -- For LambdaCase tLam :: [Token] -> [Token] tLam (t@(TIdent _ [] "case") : ts) = t : tBrace ts tLam ts = ts  tIdent :: SLoc -> [String] -> String -> [Token] -> [Token]-tIdent loc qs kw ats | elem kw ["let", "where", "do", "of"]+tIdent loc qs kw ats | elem kw ["let", "where", "do", "of", "mdo"]                        || kw == "if" && isBar ats                -- For MultiWayIf                                  = ti : tBrace ats                      | otherwise = ti : ats   where     isBar (TSpec _ '|' : _) = True+    isBar (TIndent _ : TSpec _ '|' : _) = True     isBar _ = False      ti = TIdent loc qs kw@@ -389,10 +413,14 @@ -- XXX This is a pretty hacky recognition of pragmas. pragma :: SLoc -> [Char] -> [Token] pragma loc cs =-  let as = map toUpper $ takeWhile isAlpha $ dropWhile isSpace cs-      skip = skipNest loc 1 ('#':cs)-  in  case as of-        "SOURCE" -> TPragma loc as : skip+  let skip = skipNest loc 1 ('#':cs)+  in  case words cs of+        p : _ | map toUpper p == "SOURCE" -> TPragma loc p : skip+        -- hsc2hs generates LINE pragmas+        p : ln@(_:_) : fn : _ | map toUpper p == "LINE", all isDigit ln ->+          let f = tail (init fn)+              l = readInt ln - 1+          in  seq l $ skipNest (SLoc f l 1) 1 ('#':cs)         _ -> skip  -- | This is the magical layout resolver, straight from the Haskell report.@@ -408,7 +436,7 @@ --   Pop   pop the context stack --   Raw   return the rest of the tokens, unprocessed -newtype LexState = LS (Cmd -> (Token, LexState))+data LexState = LS (Cmd -> (Token, LexState))  data Cmd = Next | Raw | Pop @@ -422,6 +450,8 @@ layoutLS tts@(TIndent x       : ts) mms@(m : ms) _ | n == m = (TSpec (tokensLoc ts) ';', LS $ layoutLS  ts    mms )                                                    | n <  m = (TSpec (tokensLoc ts) '>', LS $ layoutLS tts     ms ) where {n = getCol x} layoutLS     (TIndent _       : ts)          ms  _          =                                 layoutLS  ts     ms  Next+layoutLS     (t@(TIdent _ _ "do") :  -- for NondecreasingIndentation+              TBrace x        : ts) mms@(m :  _) _ | n >= m = (t                       , LS $ layoutLS  (TSpec (tokensLoc ts) '<' : ts) (n:mms)) where {n = getCol x} layoutLS     (TBrace x        : ts) mms@(m :  _) _ | n > m  = (TSpec (tokensLoc ts) '<', LS $ layoutLS  ts (n:mms)) where {n = getCol x} layoutLS     (TBrace x        : ts)          []  _ | n > 0  = (TSpec (tokensLoc ts) '<', LS $ layoutLS  ts     [n]) where {n = getCol x} layoutLS     (TBrace x        : ts)          ms  _          = (TSpec (tokensLoc ts) '<', LS $ layoutLS  (TSpec (tokensLoc ts) '>' : TIndent x : ts) ms)
src/MicroHs/List.hs view
@@ -80,13 +80,6 @@   (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) =-  case stripPrefix from xs of-    Just rs -> to ++ substString from to rs-    _       -> c : substString from to cs- showPairS :: forall a b . (a -> String) -> (b -> String) -> (a, b) -> String showPairS sa sb (a, b) = "(" ++ sa a ++ "," ++ sb b ++ ")" 
src/MicroHs/Main.hs view
@@ -12,6 +12,8 @@ import System.Environment import MicroHs.Compile import MicroHs.CompileCache+import MicroHs.Exp(Exp(Var, Lit))+import MicroHs.Expr(Lit(LInt)) import MicroHs.ExpPrint import MicroHs.FFI import MicroHs.Flags@@ -20,9 +22,10 @@ import MicroHs.List import MicroHs.Package import MicroHs.Translate-import MicroHs.TypeCheck(tModuleName)+import MicroHs.TypeCheck(TModule(..), showValueExport, showTypeExport, showTypeExportAssocs, TypeExport) import MicroHs.Interactive import MicroHs.MakeCArray+import MhsEval import System.Cmd import System.Exit import System.FilePath@@ -30,6 +33,7 @@ import System.IO import System.IO.Serialize import System.IO.TimeMilli+import System.IO.Transducers(addLZ77, addBase64) import MicroHs.TargetConfig import Paths_MicroHs(getDataDir) @@ -53,20 +57,22 @@         putStrLn $ "flags = " ++ show flags       case listPkg flags of         Just p -> mainListPkg flags p-        Nothing ->-          case buildPkg flags of-            Just p -> mainBuildPkg flags p mdls+        Nothing -> do+          preload' <- mapM (findAPackage flags) (preload flags)+          let flags' = flags { preload = preload' }+          case buildPkg flags' of+            Just p -> mainBuildPkg flags' p mdls             Nothing ->-              if installPkg flags then mainInstallPackage flags mdls else+              if installPkg flags' then mainInstallPackage flags' mdls else               withArgs rargs $ do                 case mdls of-                  []  | null (cArgs flags) -> mainInteractive flags-                      | otherwise -> mainCompileC flags [] ""-                  [s] -> mainCompile flags (mkIdentSLoc (SLoc "command-line" 0 0) s)-                  _   -> error usage+                  []  | null (cArgs flags') -> mainInteractive flags'+                      | otherwise -> mainCompileC flags' [] ""+                  [s] -> mainCompile flags' (mkIdentSLoc (SLoc "command-line" 0 0) s)+                  _   -> mhsError usage  usage :: String-usage = "Usage: mhs [-h|?] [--help] [--version] [--numeric-version] [-v] [-q] [-l] [-s] [-r] [-C[R|W]] [-XCPP] [-DDEF] [-IPATH] [-T] [-z] [-iPATH] [-oFILE] [-a[PATH]] [-L[PATH|PKG]] [-PPKG] [-Q PKG [DIR]] [-tTARGET] [-optc OPTION] [-ddump-PASS] [MODULENAME..|FILE]"+usage = "Usage: mhs [-h|?] [--help] [--version] [--numeric-version] [-v] [-q] [-l] [-s] [-r] [-C[R|W]] [-XCPP] [-DDEF] [-IPATH] [-T] [-z] [-b64] [-iPATH] [-oFILE] [-a[PATH]] [-L[FILE|PKG]] [-PPKG] [-Q PKG [DIR]] [-pFILE] [-tTARGET] [-optc OPTION] [-optl OPTION] [-ddump-PASS] [MODULENAME..|FILE]"  longUsage :: String longUsage = usage ++ "\nOptions:\n" ++ details@@ -82,6 +88,7 @@       \-l                 Show every time a module is loaded\n\       \-s                 Show compilation speed in lines/s\n\       \-r                 Run directly\n\+      \-c                 Do not generate executable\n\       \-CR                Read compilation cache\n\       \-CW                Write compilation cache\n\       \-C                 Read and write compilation cache\n\@@ -89,7 +96,8 @@       \-Dxxx              Pass -Dxxx to cpphs\n\       \-Ixxx              Pass -Ixxx to cpphs\n\       \-T                 Generate dynamic function usage statistics\n\-      \-z                 Compress combinator code generated in the .c file\n\+      \-z                 Compress the combinator code\n\+      \-b64               Base64 encode the combinator code\n\       \-iPATH             Add PATH to module search path\n\       \-oFILE             Output to FILE\n\       \                   If FILE ends in .comb produce a combinator file\n\@@ -97,15 +105,18 @@       \                   Otherwise compile the combinators together with the runtime system to produce a regular executable\n\       \-a                 Clear package search path\n\       \-aPATH             Add PATH to package search path\n\-      \-LPKG              List all modules of package PKG\n\+      \-L[FILE|PKG]       List all modules of a package\n\       \-PPKG              Build package PKG\n\       \-Q PKG [DIR]       Install package PKG\n\+      \-pFILE             Pre-load package\n\       \-tTARGET           Select target\n\-      \                   Distributed targets: default, emscripten\n\+      \                   Distributed targets: default, emscripten, windows, tcc, environment\n\       \                   Targets can be defined in targets.conf\n\       \-optc OPTION       Options for the C compiler\n\+      \-optl OPTION       Options passed by mhs to the C compiler for the linker\n\+      \--stdin            Use stdin in interactive system\n\       \-ddump-PASS        Debug, print AST after PASS\n\-      \                   Possible passes: parse, derive, typecheck, desugar, toplevel, combinator, all\n\+      \                   Possible passes: preproc, parse, derive, typecheck, desugar, toplevel, combinator, linked, all\n\       \"  decodeArgs :: Flags -> [String] -> [String] -> (Flags, [String], [String])@@ -118,17 +129,21 @@     "-r"        -> decodeArgs f{runIt = True} mdls args     "-l"        -> decodeArgs f{loading = True} mdls args     "-s"        -> decodeArgs f{speed = True} mdls args+    "-c"        -> decodeArgs f{noLink = True} mdls args     "-CR"       -> decodeArgs f{readCache = True} mdls args     "-CW"       -> decodeArgs f{writeCache = True} mdls args     "-C"        -> decodeArgs f{readCache = True, writeCache = True} mdls args     "-T"        -> decodeArgs f{useTicks = True} mdls args     "-XCPP"     -> decodeArgs f{doCPP = True} mdls args     "-z"        -> decodeArgs f{compress = True} mdls args+    "-b64"      -> decodeArgs f{base64 = True} mdls args     "-Q"        -> decodeArgs f{installPkg = True} mdls args     "-o" | s : args' <- args                 -> decodeArgs f{output = s} mdls args'     "-optc" | s : args' <- args                 -> decodeArgs f{cArgs = cArgs f ++ [s]} mdls args'+    "-optl" | s : args' <- args+                -> decodeArgs f{lArgs = lArgs f ++ [s]} mdls args'     '-':'i':[]  -> decodeArgs f{paths = []} mdls args     '-':'i':s   -> decodeArgs f{paths = paths f ++ [s]} mdls args     '-':'o':s   -> decodeArgs f{output = s} mdls args@@ -139,9 +154,11 @@     '-':'a':[]  -> decodeArgs f{pkgPath = []} mdls args     '-':'a':s   -> decodeArgs f{pkgPath = pkgPath f ++ [s]} mdls args     '-':'L':s   -> decodeArgs f{listPkg = Just s} mdls args+    '-':'p':s   -> decodeArgs f{preload = preload f ++ [s]} mdls args     '-':'d':'d':'u':'m':'p':'-':r | Just d <- lookup r dumpFlagTable ->                    decodeArgs f{dumpFlags = d : dumpFlags f} mdls args-    '-':_       -> error $ "Unknown flag: " ++ arg ++ "\n" ++ usage+    "--stdin"   -> decodeArgs f{useStdin = True} mdls args+    '-':_       -> mhsError $ "Unknown flag: " ++ arg ++ "\n" ++ usage     _ | arg `hasTheExtension` ".c" || arg `hasTheExtension` ".o" || arg `hasTheExtension` ".a"                 -> decodeArgs f{cArgs = cArgs f ++ [arg]} mdls args       | otherwise@@ -160,40 +177,35 @@        case parseTargets tgFilePath tgFile of          Left e -> do            putStrLn $ "Cannot parse " ++ tgFilePath-           when (verbose flags > 0) $+           when (verbosityGT flags 0) $              putStrLn e            return []          Right tgs -> do-           when (verbose flags > 0) $+           when (verbosityGT flags 0) $              putStrLn $ "Read targets file. Possible targets: " ++ show                [tg | Target tg _ <- tgs]            return tgs  readTarget :: Flags -> FilePath -> IO TTarget readTarget flags dir = do-  targets  <- readTargets flags dir-  compiler <- lookupEnv "CC"-  ccflags  <- lookupEnv "MHSCCFLAGS"-  conf     <- lookupEnv "MHSCONF"-  let dConf = "unix-" ++ show _wordSize-  case findTarget (target flags) targets of-    Nothing -> do-      when (verbose flags > 0) $-        putStrLn $ unwords ["Could not find", target flags, "in file"]-      return TTarget { tName    = "default"-                     , tCC      = fromMaybe "cc" compiler-                     , tCCFlags = fromMaybe "" ccflags-                     , tConf    = fromMaybe dConf conf-                     }-    Just (Target n cs) -> do-      when (verbose flags > 0) $-        putStrLn $ "Found target: " ++ show cs-      return TTarget { tName    = n-                     , tCC      = fromMaybe "cc"  $ compiler <|> lookup "cc"      cs-                     , tCCFlags = fromMaybe ""    $ ccflags  <|> lookup "ccflags" cs-                     , tConf    = fromMaybe dConf $ conf     <|> lookup "conf"    cs-                     }-+  targets <- readTargets flags dir+  (n, cs) <-+    case findTarget (target flags) targets of+      Nothing -> do+        when (verbosityGT flags 0) $+          putStrLn $ unwords ["Warning: could not find", target flags, "in file"]+        return ("default", [])+      Just (Target n cs) -> do+        when (verbosityGT flags 0) $+          putStrLn $ "Found target: " ++ show cs+        return (n, cs)+  return TTarget { tName    = n+                 , tCC      = fromMaybe "cc"   $ lookup "cc"      cs+                 , tCCFlags = fromMaybe ""     $ lookup "ccflags" cs+                 , tCCLibs  = fromMaybe ""     $ lookup "cclibs"  cs+                 , tConf    = fromMaybe "unix" $ lookup "conf"    cs+                 , tOut     = fromMaybe "-o"   $ lookup "cout"    cs+                 }  mainBuildPkg :: Flags -> String -> [String] -> IO () mainBuildPkg flags namever amns = do@@ -208,6 +220,7 @@       pkg = Package { pkgName = mkIdent name                     , pkgVersion = ver                     , pkgCompiler = mhsVersion+                    , pkgOptl = lArgs flags                     , pkgExported = exported                     , pkgOther = other                     , pkgTables = getCacheTables cash@@ -226,37 +239,63 @@   case span (\ c -> isDigit c || c == '.') (reverse s) of     (rver, '-':rname) | not (null is)  -> (reverse rname, makeVersion is)       where is = readVersion (reverse rver)-    _ -> error $ "package name not of the form name-version:" ++ show s+    _ -> mhsError $ "package name not of the form name-version:" ++ show s   where readVersion = map readInt . words . map (\ c -> if c == '.' then ' ' else c) -mainListPkg :: Flags -> FilePath -> IO ()-mainListPkg flags "" = mainListPackages flags-mainListPkg flags pkg = do-  ok <- doesFileExist pkg+-- Take a file name of a package, or just a package name,+-- return the full name of the package file.+-- It's an error if no package can be found.+findAPackage :: Flags -> FilePath -> IO FilePath+findAPackage flags pkgnm = do+  ok <- doesFileExist pkgnm   if ok then-    mainListPkg' flags pkg+    return pkgnm    else do-    mres <- openFilePath (pkgPath flags) (packageDir </> pkg <.> packageSuffix)-    case mres of-      Nothing -> error $ "Cannot find " ++ pkg-      Just (pfn, hdl) -> do-        hClose hdl-        mainListPkg' flags pfn+    dirpkgs <- findAllPackages flags+    case [ pdir </> pkg <.> packageSuffix | (pdir, pkgs) <- dirpkgs, pkg <- pkgs, pkgnm `isPrefixOf` pkg ] of+      [] -> mhsError $ "Package not found: " ++ show pkgnm+      [s] -> return s+      ss -> mhsError $ "Package not is ambigous: " ++ show (pkgnm, ss) -mainListPkg' :: Flags -> FilePath -> IO ()-mainListPkg' _flags pkgfn = do+mainListPkg :: Flags -> FilePath -> IO ()+mainListPkg flags "" = mainListPackages flags+mainListPkg flags pkgnm = do+  pkgfn <- findAPackage flags pkgnm   pkg <- readSerialized pkgfn   putStrLn $ "name: " ++ showIdent (pkgName pkg)   putStrLn $ "version: " ++ showVersion (pkgVersion pkg)   putStrLn $ "compiler: mhs-" ++ pkgCompiler pkg   putStrLn $ "depends: " ++ unwords (map (\ (i, v) -> showIdent i ++ "-" ++ showVersion v) (pkgDepends pkg))+  putStrLn $ "linker opts: " ++ unwords (pkgOptl pkg) -  let list = mapM_ (putStrLn . ("  " ++) . showIdent . tModuleName)+  let oneMdl tmdl = do+        putStrLn $ "  " ++ showIdent (tModuleName tmdl)+        when (verbosityGT flags 0) $+          printExperted tmdl+        when (verbosityGT flags 1) $+          printDefinitions tmdl   putStrLn "exposed-modules:"-  list (pkgExported pkg)+  mapM_ oneMdl (pkgExported pkg)   putStrLn "other-modules:"-  list (pkgOther pkg)+  mapM_ oneMdl (pkgOther pkg) +printExperted :: TModule a -> IO ()+printExperted tmdl = do+  putStrLn "  values:"+  mapM_ (putStrLn . ("    " ++) . showValueExport) (tValueExps tmdl)+  putStrLn "  types:"+  mapM_ printTypeExport (tTypeExps tmdl)++printTypeExport :: TypeExport -> IO ()+printTypeExport te = do+  putStrLn $ "    " ++ showTypeExport te+  putStrLn $ unlines $ map ("      " ++) (showTypeExportAssocs te)++printDefinitions :: TModule [(Ident, a)]-> IO ()+printDefinitions tmdl = do+  putStrLn "  top level definitions"+  putStrLn $ unwords (map (showIdent . fst) $ tBindingsOf tmdl)+ mainCompile :: Flags -> Ident -> IO () mainCompile flags mn = do   t0 <- getTimeMilli@@ -269,22 +308,26 @@   t1 <- getTimeMilli   let     mainName = qualIdent rmn (mkIdent "main")-    cmdl = (mainName, allDefs)-    (numOutDefs, outData) = toStringCMdl cmdl+    cmdl = (allDefs, if noLink flags then Lit (LInt 0) else Var mainName)+    (forExps, outCMdl@(outDefs, _)) = renumberCMdl cmdl+    outData = toStringCMdl outCMdl+    numOutDefs = length outData     numDefs = length allDefs   when (verbosityGT flags 0) $     putStrLn $ "top level defns:      " ++ padLeft 6 (show numOutDefs) ++ " (unpruned " ++ show numDefs ++ ")"-  dumpIf flags Dtoplevel $-    mapM_ (\ (i, e) -> putStrLn $ showIdent i ++ " = " ++ toStringP e "") allDefs+  let printLDefs = mapM_ (\ (i, e) -> putStrLn $ showIdent i ++ " = " ++ toStringP e "")+  dumpIf flags Dlinked $ do+    putStrLn "linked:"; printLDefs (removeUnused cmdl)+  dumpIf flags Dtoplevel $ do+    putStrLn "toplevel:"; printLDefs allDefs   if runIt flags then do-    unless compiledWithMhs $ do-      error "The -r flag currently only works with mhs"-    let-      prg = translateAndRun cmdl---    putStrLn "Run:"---    writeSerialized "ser.comb" prg-    prg---    putStrLn "done"+    if compiledWithMhs then do+      let prg = translateAndRun cmdl+      prg+     else if compiledWithGhc then+      withMhsContext $ \ ctx -> do+        run ctx outData+      else mhsError "The -r flag currently only works with mhs and ghc"    else do     seq (length outData) (return ())     t2 <- getTimeMilli@@ -296,29 +339,41 @@       locs <- sum . map (length . lines) <$> mapM readFile fns       putStrLn $ show (locs * 1000 `div` (t2 - t0)) ++ " lines/s" -    let cCode = makeCArray flags outData ++ makeFFI flags allDefs+    let (cFFI, hFFI) = makeFFI flags forExps outDefs+        cCode = "#include \"mhsffi.h\"\n" ++ makeCArray flags outData ++ cFFI +    let outFile = output flags+    -- Generate stub file for 'foreign export'+    unless (null forExps) $ do+      let stubName = takeDirectory outFile </> dropExtension (showIdent mn) ++ "_stub.h"+      when (verbosityGT flags 0) $+        putStrLn $ "generate stub: " ++ stubName+      writeFile stubName hFFI     -- 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 outFile `hasTheExtension` ".comb" then-      writeFile outFile outData+    if outFile `hasTheExtension` ".comb" then do+      h <- openBinaryFile outFile WriteMode+      h' <- if base64 flags then do addBase64 h else return h+      h'' <- if compress flags then do hPutChar h' 'z'; addLZ77 h' else return h'+      hPutStr h'' outData+      hClose h''      else if outFile `hasTheExtension` ".c" then       writeFile outFile cCode      else do        (fn, h) <- openTmpFile "mhsc.c"-       let ppkgs = map fst $ getPathPkgs cash+       let ppkgs = getPathPkgs cash        hPutStr h cCode        hClose h        mainCompileC flags ppkgs fn        removeFile fn -mainCompileC :: Flags -> [FilePath] -> FilePath -> IO ()-mainCompileC flags ppkgs infile = do+mainCompileC :: Flags -> [(FilePath, Package)] -> FilePath -> IO ()+mainCompileC flags pkgs infile = do+  let ppkgs  = map fst pkgs+      poptls = filter (not . null . pkgOptl) $ map snd pkgs   ct1 <- getTimeMilli-  mcc <- lookupEnv "MHSCC"   let dir = mhsdir flags       incDirs = map (convertToInclude "include") ppkgs       cDirs   = map (convertToInclude "cbits") ppkgs@@ -329,25 +384,31 @@   let incs = unwords $ map ("-I" ++) incDirs'       defs = "-D__MHS__"       cpps = concatMap (\ a -> "'" ++ a ++ "' ") (cppArgs flags)  -- Use all CPP args from the command line-  TTarget _ compiler ccflags conf <- readTarget flags dir-  extra <- fromMaybe "" <$> lookupEnv "MHSEXTRACCFLAGS"-  let dcc = compiler ++ " -w -Wall -O3 -I" ++ dir ++ "/src/runtime " ++-                        ccflags ++ " " ++-                        incs ++ " " ++-                        defs ++ " " ++-                        extra ++ " " ++-                        cpps ++-                        dir ++ "/src/runtime/eval-" ++ conf ++ ".c " ++-                        unwords (cArgs flags) ++-                        unwords (map (++ "/*.c") cDirs') ++-                        " $IN -lm -o $OUT"-      cc = fromMaybe dcc mcc-      cmd = substString "$IN" infile $ substString "$OUT" outFile cc+      rtdir = dir ++ "/src/runtime"+  tgt <- readTarget flags dir+  let optls = concatMap pkgOptl poptls -- optl from pkgs+      cmd = unwords $ [tCC tgt,+                       tCCFlags tgt,+                       "-I" ++ rtdir,+                       "-I" ++ rtdir </> tConf tgt,+                       incs,+                       defs,+                       cpps] +++                       cArgs flags +++                       lArgs flags +++                       optls +++                       map (++ "/*.c") cDirs' +++                      [ rtdir </> "main.c" | not (noLink flags) ] +++                      [ rtdir </> "eval.c",+                        infile,+                        tCCLibs tgt,+                        tOut tgt ++ outFile+                      ]   when (verbosityGT flags 0) $     putStrLn $ "Execute: " ++ show cmd   ec <- system cmd   when (ec /= ExitSuccess) $-    error $ "command failed: " ++ cmd+    mhsError $ "command failed: " ++ cmd   ct2 <- getTimeMilli   when (verbosityGT flags 0) $     putStrLn $ "C compilation         " ++ padLeft 6 (show (ct2-ct1)) ++ "ms"@@ -371,21 +432,30 @@   mapM_ mk (pkgExported pkg) mainInstallPackage flags [pkgfn] =   case pkgPath flags of-    [] -> error "pkgPath is empty"+    [] -> mhsError "pkgPath is empty"     frst:_ -> mainInstallPackage flags [pkgfn, frst]-mainInstallPackage _ _ = error usage+mainInstallPackage _ _ = mhsError usage -mainListPackages :: Flags -> IO ()-mainListPackages flags = mapM_ list (pkgPath flags)+findAllPackages :: Flags -> IO [(FilePath, [String])]+findAllPackages flags = concat <$> mapM list (pkgPath flags)   where list dir = do           let pdir = dir </> packageDir           ok <- doesDirectoryExist pdir-          when ok $ do+          if ok then do             files <- getDirectoryContents pdir             let pkgs = [ b | f <- files, Just b <- [stripSuffix packageSuffix f] ]-            putStrLn $ pdir ++ ":"-            mapM_ (\ p -> putStrLn $ "  " ++ p) pkgs+            if null pkgs then+              return []+             else+              return [(pdir, pkgs)]+           else+            return [] +mainListPackages :: Flags -> IO ()+mainListPackages flags = mapM_ one =<< findAllPackages flags+  where one (pdir, pkgs) = do+          putStrLn $ pdir ++ ":"+          mapM_ (\ p -> putStrLn $ "  " ++ p) pkgs  -- Convert something like --   .../.mcabal/mhs-0.10.3.0/packages/base-0.10.3.0.pkg
src/MicroHs/MakeCArray.hs view
@@ -25,9 +25,9 @@ makeCArray' :: String -> String makeCArray' file =   let chunks = chunkify 20 file-  in  unlines $ ["static unsigned char data[] = {"] +++  in  unlines $ ["static const unsigned char data[] = {"] ++                 map showChunk chunks ++                 ["};",-                 "unsigned char *combexpr = data;",-                 "int combexprlen = " ++ show (length file) ++ ";"+                 "const unsigned char *combexpr = data;",+                 "const int combexprlen = " ++ show (length file) ++ ";"                 ]
src/MicroHs/Names.hs view
@@ -1,7 +1,8 @@ -- Copyright 2025 Lennart Augustsson -- See LICENSE file for full license.-module MicroHs.Names where+module MicroHs.Names(module MicroHs.Names) where import qualified Prelude(); import MHSPrelude+import MicroHs.Expr import MicroHs.Ident  -- Identifiers known by the compiler.@@ -28,16 +29,31 @@ identInt :: Ident identInt = mkIdentB nameInt +nameInt64 :: String+nameInt64 = "Primitives.Int64"+identInt64 :: Ident+identInt64 = mkIdentB nameInt64+ nameWord :: String nameWord = "Primitives.Word" identWord :: Ident identWord = mkIdentB nameWord -nameFloatW :: String-nameFloatW = "Primitives.FloatW"-identFloatW :: Ident-identFloatW = mkIdentB nameFloatW+nameWord64 :: String+nameWord64 = "Primitives.Word64"+identWord64 :: Ident+identWord64 = mkIdentB nameWord64 +nameFloat :: String+nameFloat = "Primitives.Float"+identFloat :: Ident+identFloat = mkIdentB nameFloat++nameDouble :: String+nameDouble = "Primitives.Double"+identDouble :: Ident+identDouble = mkIdentB nameDouble+ nameChar :: String nameChar = "Primitives.Char" identChar :: Ident@@ -84,6 +100,11 @@ nameKnownSymbol :: String nameKnownSymbol = "Data.TypeLits.KnownSymbol" +nameDataTypeableTypeable :: String+nameDataTypeableTypeable = "Data.Typeable.Typeable"+identDataTypeableTypeable :: Ident+identDataTypeableTypeable = mkIdentB nameDataTypeableTypeable+ nameCoercible :: String nameCoercible = "Data.Coerce.Coercible" @@ -115,6 +136,32 @@  identFunPtr :: Ident identFunPtr = mkIdentB "Primitives.FunPtr"++identStablePtr :: Ident+identStablePtr = mkIdentB "Foreign.StablePtr.StablePtr"++identNil :: Ident+identNil = mkIdent $ listPrefix ++ "[]"++identCons :: Ident+identCons = mkIdent $ listPrefix ++ ":"++-----++conCons :: Expr+conCons = ECon $ ConData conTyInfoList identCons []++conNil :: Expr+conNil = ECon $ ConData conTyInfoList identNil []++conTyInfoList :: ConTyInfo+conTyInfoList = [(identNil, 0), (identCons, 2)]++tupleCon :: SLoc -> Int -> Expr+tupleCon loc n =+  let+    c = tupleConstr loc n+  in ECon $ ConData [(c, n)] c []  ----- 
src/MicroHs/Package.hs view
@@ -30,6 +30,7 @@   pkgName      :: IdentPackage,                    -- package name   pkgVersion   :: Version,                         -- package version   pkgCompiler  :: String,                          -- compiler version that created the package+  pkgOptl      :: [String],                        -- linker options passed by mhs to the c compiler   pkgExported  :: [TModule [LDef]],                -- exported modules   pkgOther     :: [TModule [LDef]],                -- non-exported modules   pkgTables    :: GlobTables,                      -- global tables@@ -38,7 +39,7 @@   -- deriving (Show)  instance NFData Package where-  rnf (Package a b c d e f g) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq` rnf f `seq` rnf g+  rnf (Package a b c d e f g h) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq` rnf f `seq` rnf g `seq` rnf h  -- Fully evaluate a package forcePackage :: Package -> Package
src/MicroHs/Parse.hs view
@@ -31,7 +31,7 @@             P a -> FilePath -> String -> a parseDie p fn file =   case parse p fn file of-    Left msg -> error msg+    Left msg -> mhsError msg     Right a -> a  parse :: forall a . (Show a) =>@@ -98,7 +98,7 @@     is _ = Nothing   satisfyM "UIdent" is --- Upper case, unqualified, identifier+-- Upper case, unqualified identifier pUIdent :: P Ident pUIdent =       pUIdentA@@ -174,7 +174,7 @@             LT -> case compare s "infixr" of                     EQ -> True                     LT -> s == "infix" || s == "infixr"-                    GT -> s == "instance" || s == "let" || s == "module"+                    GT -> s == "instance" || s == "let" || s == "mdo" || s == "module"             GT -> case compare s "then" of                     EQ -> True                     LT -> s == "of" || s == "pattern"@@ -202,8 +202,12 @@ pOper = pQSymOper <|> (pSpec '`' *> pQIdent <* pSpec '`')  pUOper :: P Ident-pUOper = pUQSymOper <|> (pSpec '`' *> pUQIdent <* pSpec '`')+pUOper = pUQSymOper <|> (pSpec '`' *> pUQIdentA <* pSpec '`') +-- constructor operator+pConstrOper :: P Ident+pConstrOper = pUSymOper <|> (pSpec '`' *> pUIdentA <* pSpec '`')+ pQSymOper :: P Ident pQSymOper = do   let@@ -226,7 +230,7 @@ pUQSymOper = guardM pQSymOper isUOper  isUOper :: Ident -> Bool-isUOper = (== ':') . headIdent+isUOper = (== ':') . headIdent . unQualIdent  pUSymOper :: P Ident pUSymOper = guardM pSymOper isUOper@@ -257,9 +261,11 @@ pUQIdentSym :: P Ident pUQIdentSym = pUQIdent <|> pParens pUQSymOper +-- Lower case, maybe qualified, identifier or symbol pLQIdentSym :: P Ident pLQIdentSym = pLQIdent <|> pParens pLQSymOperArr +-- Lower case, unqualified, identifier or symbol pLIdentSym :: P Ident pLIdentSym = pLIdent <|> pParens pLSymOper @@ -343,20 +349,22 @@ pDef =       pBind        -- Fcn, Sign, PatBind, Infix   <|> uncurry Data <$> (pKeyword "data"     *> pData) <*> pDerivings-  <|> Newtype      <$> (pKeyword "newtype"  *> pLHS) <*> (pSpec '=' *> (Constr [] [] <$> pUIdentSym <*> pField)) <*> pDerivings+  <|> Newtype      <$> (pKeyword "newtype"  *> pLHS) <*> (pSpec '=' *> (Constr [] [] <$> pUIdentSym <*> pure False <*> pField)) <*> pDerivings   <|> Type         <$> (pKeyword "type"     *> pLHS) <*> (pSpec '=' *> pType)   <|> Import       <$> (pKeyword "import"   *> pImportSpec)-  <|> ForImp       <$> (pKeyword "foreign"  *> pKeyword "import" *> (pKeyword "ccall" <|> pKeyword "capi")-                        *> optional (pKeyword "unsafe") *> optional pString) <*> pLIdent <*> (dcolon *> pType)+  <|> ForImp       <$> (pKeyword "foreign"  *> pKeyword "import" *> pCallConv)+                        <*> (optional pSafety *> optional pString) <*> pLIdent <*> (dcolon *> pType)+  <|> ForExp       <$> (pKeyword "foreign"  *> pKeyword "export" *> pCallConv)+                        <*> optional pString <*> pFExpr <*> (dcolon *> pType)   <|> Class        <$> (pKeyword "class"    *> pContext) <*> pLHS <*> pFunDeps     <*> pWhere pClsBind-  <|> Instance     <$> (pKeyword "instance" *> pType) <*> pWhere pInstBind+  <|> Instance <$> (pKeyword "instance" *> pType) <*> pWhere pInstBind <*> (pWhere pInstBind <|> pure [])   <|> Default      <$> (pKeyword "default"  *> optional clsSym) <*> pParens (sepBy pType (pSpec ','))   <|> KindSign     <$> (pKeyword "type"     *> pTypeIdentSym) <*> (dcolon *> pKind)   <|> mkPattern    <$> (pKeyword "pattern"  *> pPatSyn)   <|> Sign         <$> (pKeyword "pattern"  *> sepBy1 pUIdentSym (pSpec ',') <* dcolon) <*> pType   <|> StandDeriving<$> (pKeyword "deriving" *> pStrat) <*> pure 0 <*> (pKeyword "instance" *> pType)   <|> noop         <$  (pKeyword "type"     <* pKeyword "role" <* pTypeIdentSym <*-                                               (pKeyword "nominal" <|> pKeyword "phantom" <|> pKeyword "representational"))+                                               some (pKeyword "nominal" <|> pKeyword "phantom" <|> pKeyword "representational"))   where     pFunDeps = (pSpec '|' *> sepBy1 pFunDep (pSpec ',')) <|> pure []     pFunDep = (,) <$> some pLIdent <*> (pSRArrow *> some pLIdent)@@ -367,9 +375,15 @@     mkPattern (lhs, pat, meqn) = Pattern lhs pat meqn     noop = Infix (AssocLeft, 0) []        -- harmless definition -    pStrat = (DerVia <$> (pKeyword "via" *> pAType)) <|> pSimpleStrat+    pStrat = (DerVia <$> (pKeyword "via" *> pType)) <|> pSimpleStrat +    pFExpr = EVar <$> (pLQIdentSym <|> pUQIdentSym) +    pSafety = pKeyword "unsafe" <|> pKeyword "safe" <|> pKeyword "interruptible"++pCallConv :: P CallConv+pCallConv = (Cccall <$ pKeyword "ccall") <|> (Ccapi <$ pKeyword "capi") <|> (Cjavascript <$ pKeyword "javascript")+ pPatSyn :: P (LHS, EPat, Maybe [Eqn]) pPatSyn = do   lhs@(i, vs) <- pLHS@@ -395,6 +409,7 @@ isExp (ETuple es) = all isExp es isExp (EApp e1 e2) = isExp e1 && isExp e2 isExp (ELit _ _) = True+isExp (EParen e) = isExp e isExp _ = False  pData :: P (LHS, [Constr])@@ -419,7 +434,8 @@   dcolon   es <- pForall   ctx <- pContext-  args <- many (pSTypeApp <* pSymbol "->")+  let pGType = pStrictP $ pOperators pOper pTypeArg+  args <- many (pGType <* pSymbol "->")   res <- pType   pure (cn, es, ctx, args, res) @@ -431,17 +447,18 @@         case zipWithM mtch vks ts of           -- Result type is just type variables, so use it as is           Just sub | not (anySame (map fst sub))-            -> Constr es'' ctx  cnm (Left stys')+            -> Constr es'' ctx'' cnm False (Left stys')                         where stys' = map (second $ subst sub) stys+                              ctx'' = map (subst sub) ctx                               es'' = if null es then kind (freeTyVars (map snd stys) \\ map fst sub) else es-          _ -> Constr es'  ctx' cnm (Left stys)+          _ -> Constr es'  ctx' cnm False (Left stys)       where es' = if null es then kind (freeTyVars (rty : map snd stys)) else es             ctx' = zipWith (\ (IdKind i _) t -> eq (EVar i) t) vks ts ++ ctx             eq t1 t2 = EApp (EApp (EVar (mkIdentSLoc (E.getSLoc t1) "~")) t1) t2             mtch (IdKind i _) (EVar i') | not (isConIdent i') = Just (i', EVar i)             mtch _ _ = Nothing             kind = map (\ i -> IdKind i (EVar dummyIdent))-    _ -> errorMessage (E.getSLoc rty) $ "Bad GADT result type" ++ show (rty, tnm, vks)+    _ -> errorMessage (E.getSLoc rty) $ "Bad GADT result type " ++ show (rty, tnm, vks)  pDerivings :: P [Deriving] pDerivings = many pDeriving@@ -452,7 +469,7 @@   where pDer = map ((,) 0) <$>                    (    pParens (sepBy pType (pSpec ','))                     <|> ((:[]) <$> pAType) )-        pVia = DerVia <$> (pKeyword "via" *> pAType)+        pVia = DerVia <$> (pKeyword "via" *> pType)  pSimpleStrat :: P DerStrategy pSimpleStrat = (DerStock <$ pKeyword "stock") <|> (DerNewtype <$ pKeyword "newtype")@@ -474,8 +491,8 @@ pSLArrow = pSymbol "<-" <|> pSymbol "\x2190"  pConstr :: P Constr-pConstr = ((\ vs ct t1 c t2 -> Constr vs ct c (Left [t1, t2])) <$> pForall <*> pContext <*> pSTypeApp <*> pUSymOper <*> pSTypeApp)-      <|> (Constr <$> pForall <*> pContext <*> pUIdentSym <*> pFields)+pConstr = ((\ vs ct t1 c t2 -> Constr vs ct c True (Left [t1, t2])) <$> pForall <*> pContext <*> pSTypeApp <*> pConstrOper <*> pSTypeApp)+      <|> (Constr <$> pForall <*> pContext <*> pUIdentSym <*> pure False <*> pFields)   pFields :: P (Either [SType] [(Ident, SType)])@@ -485,9 +502,9 @@  -- XXX This is a mess. pSAType :: P (Bool, EType)-pSAType = (,) <$> pStrict <*> pAType+pSAType = pStrictP pAType pSType :: P (Bool, EType)-pSType  = (,) <$> pStrict <*> pType+pSType  = pStrictP pType pSTypeApp :: P (Bool, EType) pSTypeApp  = do   s <- pStrict@@ -495,6 +512,8 @@   pure (s, t) pStrict :: P Bool pStrict = (True <$ pSpec '!') <|> pure False+pStrictP :: P a -> P (Bool, a)+pStrictP p = (,) <$> pStrict <*> p  pLHS :: P LHS pLHS = (,) <$> pTypeIdentSym <*> many pIdKind@@ -545,13 +564,7 @@ -- Including '->' in pExprOp interacts poorly with '->' -- in lambda and 'case'. pType :: P EType-pType =-    do-      vs <- pForall'-      q <- (QExpl <$ pSymbol ".") <|> (QReqd <$ pSymbol "->")-      EForall q vs <$> pTypeOp-  <|>-    pTypeOp+pType = pTypeOp  pForall' :: P [IdKind] pForall' = forallKW *> some pIdKind@@ -567,7 +580,13 @@ pTypeOper = pOper <|> (mkIdent "->" <$ pSRArrow) <|> (mkIdent "=>" <$ pDRArrow)  pTypeArg :: P EType-pTypeArg = pTypeApp+pTypeArg =+    do+      vs <- pForall'+      q <- (QExpl <$ pSymbol ".") <|> (QReqd <$ pSymbol "->")+      EForall q vs <$> pType+  <|>+    pTypeApp  pTypeApp :: P EType pTypeApp = do@@ -582,6 +601,9 @@   <|> pLit   <|> (eTuple <$> (pSpec '(' *> sepBy pType (pSpec ',') <* pSpec ')'))   <|> (EListish . LList . (:[]) <$> (pSpec '[' *> pType <* pSpec ']'))  -- Unlike expressions, only allow a single element.+  <|> (uTupleTAp <$> (pSpec 'L' *> sepBy  pType (pSpec ',') <* pSpec 'R'))+  <|> (uSumTAp <$> (pSpec 'L' *> sepBy1 pType (pSpec '|') <* pSpec 'R'))+  <|> (uSumT <$> getSLoc <*> (succ . length <$> (pSpec 'L' *> many (pSpec '|') <* pSpec 'R')))  ------------- -- Patterns@@ -605,9 +627,22 @@   <|> (ELazy True  <$> (pSpec '~' *> pAPat))   <|> (ELazy False <$> (pSpec '!' *> pAPat))   <|> (EOr <$> (pSpec '(' *> sepBy1 pPat (pSpec ';') <* pSpec ')'))  -- if there is a single pattern it will be matched by the tuple case+  <|> (uTuple <$> (pSpec 'L' *> sepBy pPat (pSpec ',') <* pSpec 'R'))+  <|> pUSummand pPat   where evar v Nothing = EVar v         evar v (Just upd) = EUpdate (EVar v) upd +pUSummand :: P Expr -> P Expr+pUSummand p = do+  pSpec 'L'+  l <- length <$> many (pSpec '|')+  e <- p+  r <- length <$> many (pSpec '|')+  pSpec 'R'+  let n = l + r+  guard (n > 0)+  pure $ uSummand (n+1) l e+ pPat :: P EPat pPat = pPatOp   -- This is where view patterns belong, but it's too slow@@ -696,6 +731,7 @@ pStmt =       (SBind <$> (pPat <* pSLArrow) <*> pExpr)   <|> (sLet  <$> (pKeyword "let" *> pBlock pBind)) <*> optional (pKeyword "in" *> pExpr)+  <|> (SRec  <$> (pKeyword "rec" *> pBlock pStmt))   <|> (SThen <$> pExpr)   where sLet b Nothing  = SLet b         sLet b (Just i) = SThen (ELet b i)@@ -740,10 +776,19 @@  pDo :: P Expr pDo = do-  q <- (Just <$> pQualDo) <|> (Nothing <$ pKeyword "do")+  (q, rec) <- ((\ i -> (Just i, False)) <$> pQualDo) <|> ((Nothing, False) <$ pKeyword "do") <|> ((Nothing, True) <$ pKeyword "mdo")   ss <- pBlock pStmt   guard (not (null ss))-  pure (EDo q ss)+  if rec then+    case last ss of+      SThen e ->+        let l = E.getSLoc e+            x = EVar $ mkIdentSLoc l "$mdo"+            pur = EVar (mkIdentSLoc l "B@.return")+        in  pure $ EDo q [SRec (init ss ++ [SBind x e]), SThen (EApp pur x)]+      _ -> fail "mdo"+   else+    pure (EDo q ss)  pIf :: P Expr pIf = EIf <$> (pKeyword "if" *> pExpr) <*>@@ -781,7 +826,7 @@ pUpdate = pSpec '{' *> sepBy pEField (pSpec ',') <* pSpec '}'   where     pEField = do-      fs <- (:) <$> pLIdentSym <*> many pSelect+      fs <- (:) . unQualIdent <$> pLQIdentSym <*> many pSelect       EField fs <$> (pSpec '=' *> pExpr) <|> pure (EFieldPun fs)      <|>       (EFieldWild <$ pSymbol "..")@@ -801,6 +846,8 @@   <|> (ESelect <$> (pSpec '(' *> some pSelect <* pSpec ')'))   <|> (ELit noSLoc . LPrim <$> (pKeyword "_primitive" *> pString))   <|> (ETypeArg <$> (pSpec '@' *> pAType))+  <|> (uTuple <$> (pSpec 'L' *> sepBy pExpr (pSpec ',') <* pSpec 'R'))+  <|> pUSummand pExpr   -- This weirdly slows down parsing   -- <?> "aexpr" @@ -873,6 +920,32 @@   <|> Sign        <$> (sepBy1 pLIdentSym (pSpec ',') <* dcolon) <*> pType  -------------++-- Unboxed sum type with n alternatives+uSumT :: SLoc -> Int -> EType+uSumT l n = EVar (mkIdentSLoc l $ "B@.USum" ++ show n)++-- Unboxed sum type with arguments+uSumTAp :: [EType] -> EType+uSumTAp ts = eApps (uSumT (E.getSLoc ts) (length ts)) ts++-- Summand i of an n-ary "unboxed" alternative+uSummand :: Int -> Int -> Expr -> Expr+uSummand n i e = EApp (EVar (mkIdentSLoc (E.getSLoc e) ("B@.USum" ++ show n ++ "_" ++ show i))) e++-- Unboxed tuple type with n alternatives+uTupleT :: SLoc -> Int -> Expr+uTupleT l n = EVar (mkIdentSLoc l $ "B@.UProd" ++ show n)++-- Unboxed tuple type+uTupleTAp :: [EType] -> EType+uTupleTAp ts = eApps (uTupleT (E.getSLoc ts) (length ts)) ts++-- Unboxed tuple+uTuple :: [Expr] -> Expr+uTuple = uTupleTAp   -- same name as the type++----------  eTuple :: [Expr] -> Expr eTuple [e] = EParen e
src/MicroHs/StateIO.hs view
@@ -10,6 +10,7 @@   ) where import qualified Prelude(); import MHSPrelude import Control.Applicative+import Control.Exception import Control.Monad import Data.Functor hiding(unzip) @@ -64,3 +65,10 @@ liftIO io = S $ \ s -> do   a <- io   return (a, s)++trySIO :: StateIO s a -> StateIO s (Either SomeException a)+trySIO (S io) = S $ \ s -> do+  r <- try (io s)+  case r of+    Left e -> return (Left e, s)+    Right (a, s') -> return (Right a, s')
src/MicroHs/SymTab.hs view
@@ -3,6 +3,7 @@   SymTab,   stEmpty,   stLookup,+  stLookupGlbUnqMany,   stFromList,   stInsertGlbU,   stInsertGlbQ,@@ -12,12 +13,12 @@   stKeysGlbU,   stInsertLcl,   mapMSymTab,+  getLocals,   ) where import qualified Prelude(); import MHSPrelude --import Data.Char import Control.Applicative import Data.List-import GHC.Stack import MicroHs.Builtin(builtinMdl) import MicroHs.Expr(Expr(..), EType, conIdent) import MicroHs.Ident(Ident, showIdent, unIdent, mkIdentSLoc, slocIdent, isUpperX)@@ -75,6 +76,9 @@     ("UGlobals:" : map (("  " ++) . show) (M.toList ug)) ++     ("QGlobals:" : map (("  " ++) . show) (M.toList qg)) +getLocals :: SymTab -> [Ident]+getLocals s = map fst (_lcl s)+ mapMSymTab :: forall m . Monad m => (Entry -> m Entry) -> SymTab -> m SymTab mapMSymTab f (SymTab l ug qg) = do   l' <- mapM (\ (i, a) -> f a >>= \ a' -> return (i, a')) l@@ -84,6 +88,9 @@  stEmpty :: SymTab stEmpty = SymTab [] M.empty M.empty++stLookupGlbUnqMany :: Ident -> SymTab -> Maybe [Entry]+stLookupGlbUnqMany i (SymTab _ ug _) = M.lookup i ug  stLookup :: String -> Ident -> SymTab -> Either String Entry stLookup msg i (SymTab l ug qg) =
src/MicroHs/TCMonad.hs view
@@ -5,7 +5,6 @@   ) where import qualified Prelude(); import MHSPrelude import Data.Functor.Identity-import GHC.Stack import Control.Applicative import Control.Monad.Fail import Data.Functor@@ -50,6 +49,14 @@   let s' = unsafePerformIO $ do putStrLn msg; return s   seq s' (put s') +-- Run the action, but don't update the state+noEffect :: TC s a -> TC s a+noEffect tca = do+  s <- get+  a <- tca+  put s+  return a+ -----------------------------------------------  data TypeExport = TypeExport@@ -281,7 +288,7 @@ tCon = EVar  tVarK :: IdKind -> EType-tVarK (IdKind i _) = EVar i+tVarK = EVar . idKindIdent  tApp :: EType -> EType -> EType tApp = EApp@@ -289,6 +296,7 @@ tApps :: Ident -> [EType] -> EType tApps i ts = eApps (tCon i) ts +infixr `tArrow` tArrow :: EType -> EType -> EType tArrow a r = tApp (tApp (tConI builtinLoc nameArrow) a) r 
+ src/MicroHs/TCMonad.hs-boot view
@@ -0,0 +1,2 @@+module MicroHs.TCMonad where+data TCState
src/MicroHs/TargetConfig.hs view
@@ -27,7 +27,9 @@   { tName    :: String   , tCC      :: String   , tCCFlags :: String+  , tCCLibs  :: String   , tConf    :: String+  , tOut     :: String  -- flag to set output file   }  findTarget :: String -> [Target] -> Maybe Target
src/MicroHs/Translate.hs view
@@ -2,7 +2,11 @@ -- See LICENSE file for full license. {-# OPTIONS_GHC -Wno-unused-imports #-} module MicroHs.Translate(-  translate, translateAndRun+  translate,+  TranslateMap,+  translateMap,+  translateWithMap,+  translateAndRun   ) where import qualified Prelude(); import MHSPrelude import Data.ByteString.Internal(ByteString)@@ -18,30 +22,46 @@ import MicroHs.Ident import qualified MicroHs.IdentMap as M -translateAndRun :: (Ident, [LDef]) -> IO ()+translateAndRun :: ([LDef], Exp) -> IO () translateAndRun defs = do-  let prog = unsafeCoerce $ translate defs+  let prog = unsafeCoerce (translate defs)   prog -translate :: (Ident, [LDef]) -> AnyType-translate (mainName, ds) =-  let-    look n = fromMaybe (error $ "translate: not found " ++ showIdent n) $ M.lookup n mp-    mp = M.fromList [(n, trans look d) | (n, d) <- ds ]-  in look mainName+type TranslateMap = M.Map AnyType +trLookup :: TranslateMap -> Ident -> AnyType+trLookup mp n = fromMaybe (errorMessage (getSLoc n) $ "translate: not found " ++ showIdent n) $ M.lookup n mp++translateMap :: [LDef] -> TranslateMap+translateMap ds =+  let mp = M.fromList [(n, translateExp mp d) | (n, d) <- ds ]+  in  mp++translateExp :: TranslateMap -> Exp -> AnyType+translateExp mp e = trans (trLookup mp) e++translateWithMap :: TranslateMap -> ([LDef], Exp) -> AnyType+translateWithMap mp (ds, e) =+  let mp' = foldr (\ (i, d) -> M.insert i (translateExp mp' d)) mp ds+  in  translateExp mp' e++translate :: ([LDef], Exp) -> AnyType+translate (ds, e) = translateExp (translateMap ds) e+ trans :: (Ident -> AnyType) -> Exp -> AnyType 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 (LInt64 i) -> unsafeCoerce i     Lit (LDouble i) -> unsafeCoerce i+    Lit (LFloat i) -> unsafeCoerce i     Lit (LStr s) -> trans r (encodeString s)     Lit (LBStr s) -> unsafeCoerce (Data.String.fromString s :: ByteString)     Lit (LPrim p) -> fromMaybe (error $ "trans: no primop " ++ show p) $ lookup p primTable     Lit (LInteger i) -> trans r (encodeInteger i)-    Lit (LForImp s _) -> trans r (App (Lit (LPrim "dynsym")) (Lit (LStr s)))+    Lit (LForImp _ s _) -> trans r (App (Lit (LPrim "dynsym")) (Lit (LStr s)))     _ -> error $ "trans: impossible: " ++ show ae  -- Use linear search in this table.@@ -110,13 +130,22 @@   ("f>", _primitive "f>"),   ("f>=", _primitive "f>="),   ("fneg", _primitive "fneg"),-  ("fshow", _primitive "fshow"),-  ("fread", _primitive "fread"),   ("itof", _primitive "itof"),+  ("Itof", _primitive "Itof"),+  ("d+", _primitive "d+"),+  ("d-", _primitive "d-"),+  ("d*", _primitive "d*"),+  ("d/", _primitive "d/"),+  ("d==", _primitive "d=="),+  ("d/=", _primitive "d/="),+  ("d<", _primitive "d<"),+  ("d<=", _primitive "d<="),+  ("d>", _primitive "d>"),+  ("d>=", _primitive "d>="),+  ("dneg", _primitive "dneg"),+  ("itod", _primitive "itod"),+  ("Itod", _primitive "Itod"),   ("seq", _primitive "seq"),-  ("sequal", _primitive "sequal"),-  ("equal", _primitive "equal"),-  ("scmp", _primitive "scmp"),   ("icmp", _primitive "icmp"),   ("ucmp", _primitive "ucmp"),   ("rnf", _primitive "rnf"),@@ -132,6 +161,7 @@   ("IO.getArgRef", _primitive "IO.getArgRef"),   ("IO.performIO", _primitive "IO.performIO"),   ("IO.gc", _primitive "IO.gc"),+  ("IO.stats", _primitive "IO.stats"),   ("raise", _primitive "raise"),   ("catch", _primitive "catch"),   ("dynsym", _primitive "dynsym"),@@ -141,12 +171,16 @@   ("toInt", _primitive "toInt"),   ("toPtr", _primitive "toPtr"),   ("toDbl", _primitive "toDbl"),+  ("toFlt", _primitive "toFlt"),+  ("fromDbl", _primitive "fromDbl"),+  ("fromFlt", _primitive "fromFlt"),   ("toFunPtr", _primitive "toFunPtr"),   ("A.alloc", _primitive "A.alloc"),   ("A.copy", _primitive "A.copy"),   ("A.size", _primitive "A.size"),   ("A.read", _primitive "A.read"),   ("A.write", _primitive "A.write"),+  ("A.trunc", _primitive "A.trunc"),   ("A.==", _primitive "A.=="),   ("bs++", _primitive "bs++"),   ("bs++.", _primitive "bs++."),@@ -163,6 +197,7 @@   ("bslength", _primitive "bslength"),   ("bssubstr", _primitive "bssubstr"),   ("bsindex", _primitive "bsindex"),+  ("bswrite", _primitive "bswrite"),   ("fromUTF8", _primitive "fromUTF8"),   ("toUTF8", _primitive "toUTF8"),   ("headUTF8", _primitive "headUTF8"),@@ -187,5 +222,50 @@   ("IO.tryreadmvar", _primitive "IO.tryreadmvar"),   ("IO.threaddelay", _primitive "IO.threaddelay"),   ("IO.threadstatus", _primitive "IO.threadstatus"),-  ("isint", _primitive "isint")+  ("isint", _primitive "isint"),+  ("SPnew", _primitive "SPnew"),+  ("SPderef", _primitive "SPderef"),+  ("SPfree", _primitive "SPfree"),++  ("I+", _primitive "I+"),+  ("I-", _primitive "I-"),+  ("I*", _primitive "I*"),+  ("Iquot", _primitive "Iquot"),+  ("Irem", _primitive "Irem"),+  ("Iuquot", _primitive "Iuquot"),+  ("Iurem", _primitive "Iurem"),+  ("Ineg", _primitive "Ineg"),+  ("Iand", _primitive "Iand"),+  ("Ior", _primitive "Ior"),+  ("Ixor", _primitive "Ixor"),+  ("Ishl", _primitive "Ishl"),+  ("Ishr", _primitive "Ishr"),+  ("Iashr", _primitive "Iashr"),+  ("Iinv", _primitive "Iinv"),+  ("Isubtract", _primitive "Isubtract"),+  ("Ipopcount", _primitive "Ipopcount"),+  ("Iclz", _primitive "Iclz"),+  ("Ictz", _primitive "Ictz"),+  ("I==", _primitive "I=="),+  ("I/=", _primitive "I/="),+  ("I<", _primitive "I<"),+  ("I<=", _primitive "I<="),+  ("I>", _primitive "I>"),+  ("I>=", _primitive "I>="),+  ("Iicmp", _primitive "Iicmp"),+  ("Iu<", _primitive "Iu<"),+  ("Iu<=", _primitive "Iu<="),+  ("Iu>", _primitive "Iu>"),+  ("Iu>=", _primitive "Iu>="),+  ("Iucmp", _primitive "Iucmp"),+  ("itoI", _primitive "itoI"),+  ("Itoi", _primitive "Itoi"),+  ("utoU", _primitive "utoU"),+  ("Utou", _primitive "Utou"),+  ("Wknew", _primitive "Wknew"),+  ("Wknewfin", _primitive "Wknewfin"),+  ("Wkderef", _primitive "Wkderef"),+  ("Wkfinal", _primitive "Wkfinal"),+  ("IO.getmaskingstate", _primitive "IO.getmaskingstate"),+  ("IO.setmaskingstate", _primitive "IO.setmaskingstate")   ]
src/MicroHs/TypeCheck.hs view
@@ -14,3530 +14,3978 @@   ValueExport(..), TypeExport(..),   Symbols,   isInstId,-  ) where-import qualified Prelude(); import MHSPrelude-import Control.Applicative-import Control.Monad-import Data.Char-import Data.Function-import Data.List-import Data.Maybe-import MicroHs.Builtin-import MicroHs.Deriving-import MicroHs.Expr-import MicroHs.Fixity-import MicroHs.Flags-import MicroHs.Graph-import MicroHs.Ident-import qualified MicroHs.IdentMap as M-import qualified MicroHs.IntMap as IM-import MicroHs.List-import MicroHs.Names-import MicroHs.Parse(dotDotIdent)-import MicroHs.SymTab-import MicroHs.TCMonad-import GHC.Stack-import Debug.Trace----primitiveKinds :: [String]---primitiveKinds = [nameType, nameConstraint, nameSymbol, nameNat]--maxTuple :: Int-maxTuple = 15---------------------------- Certain data structures persist during the entire compilation--- session.  The information is needed beyond the scope where it was defined.-data GlobTables = GlobTables {-  gSynTable   :: SynTable,        -- type synonyms are needed for expansion-  gDataTable  :: DataTable,       -- data/newtype definitions-  gClassTable :: ClassTable,      -- classes are needed for superclass expansion etc-  gInstInfo   :: InstTable        -- instances are implicitely global-  }--instance NFData GlobTables where-  rnf (GlobTables a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d--emptyGlobTables :: GlobTables-emptyGlobTables = GlobTables { gSynTable = M.empty, gDataTable = M.empty, gClassTable = M.empty, gInstInfo = M.empty }--mergeGlobTables :: GlobTables -> GlobTables -> GlobTables-mergeGlobTables g1 g2 =-  GlobTables { gSynTable = M.merge (gSynTable g1) (gSynTable g2),-               gDataTable = M.merge (gDataTable g1) (gDataTable g2),-               gClassTable = M.merge (gClassTable g1) (gClassTable g2),-               gInstInfo = M.mergeWith mergeInstInfo (gInstInfo g1) (gInstInfo g2) }--type Symbols = (SymTab, SymTab)--data TModule a = TModule {-  tModuleName :: IdentModule,     -- module names-  tFixDefs    :: [FixDef],        -- all fixities, exported or not-  tTypeExps   :: [TypeExport],    -- exported types-  tValueExps  :: [ValueExport],   -- exported values (including from T(..))-  tDefaults   :: Defaults,        -- exported defaults-  tBindingsOf :: a                -- bindings-  }---  deriving (Show)--instance NFData a => NFData (TModule a) where-  rnf (TModule a b c d e f) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq` rnf f--setBindings :: TModule b -> a -> TModule a-setBindings (TModule x y z w v _) a = TModule x y z w v a--type FixDef = (Ident, Fixity)--type Sigma = EType-type Rho   = EType--typeCheck :: Flags -> GlobTables -> ImpType -> [(ImportSpec, TModule a)] -> EModule -> (TModule [EDef], GlobTables, Symbols)-typeCheck flags globs impt aimps (EModule mn exps defs) =---  trace (unlines $ map (showTModuleExps . snd) aimps) $-  let-    imps = map filterImports aimps-    tc = mkTCState mn globs imps-  in case tcRun (tcDefs flags impt defs) tc of-       (tds, tcs) ->-         let-           thisMdl = (mn, mkTModule impt tds tcs)-           impMdls = [(fromMaybe m mm, tm) | (ImportSpec _ _ m mm _, tm) <- imps]-           impMap = M.fromList [(i, m) | (i, m) <- thisMdl : impMdls]-           (texps, vexps) =-             unzip $ map (getTVExps impMap (typeTable tcs) (valueTable tcs) (assocTable tcs)) exps-           fexps = map tFixDefs (M.elems impMap)-           sexps = synTable tcs-           dexps = dataTable tcs-           iexps = instTable tcs-           ctbl  = classTable tcs-           dflts = M.fromList $ filter ((`elem` ds) . fst) $ M.toList $ defaults tcs-                 where ds = [ tyQIdent $ expLookup ti (typeTable tcs) | ExpDefault ti <- exps ]-         in  ( tModule mn (nubBy ((==) `on` fst) (concat fexps)) (concat texps) (concat vexps) dflts tds-             , GlobTables { gSynTable = sexps, gDataTable = dexps, gClassTable = ctbl, gInstInfo = iexps }-             , (typeTable tcs, valueTable tcs)-             )---- A hack to force evaluation of errors.--- This should be redone to all happen in the T monad.-tModule :: IdentModule -> [FixDef] -> [TypeExport] -> [ValueExport] -> Defaults -> [EDef] ->-           TModule [EDef]-tModule mn fs ts vs ds bs =---  trace ("tmodule " ++ showIdent mn ++ ":\n" ++ show vs) $-  tseq ts `seq` vseq vs `seq` ds `seq` TModule mn fs ts vs ds bs-  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 vs ds a) =-  let-    keep x xs = elem x xs /= hide-    ivs  = [ i | ImpValue i <- is ]-    vs'  = filter (\ (ValueExport i _) -> keep i ivs) vs ++-           if hide then []-           else [ ve | TypeExport _ _ ves <- ts, ve@(ValueExport i _) <- ves, i `elem` ivs ]-    aits = [ i | ImpTypeAll i <- is ]         -- all T(..) imports-    its  = [ i | ImpTypeSome i _ <- is ] ++ aits-    -- XXX This isn't quite right, hiding T() should hide T, but not the constructors-    ts' =-      if hide then-        let ok xs (ValueExport i _) = i `notElem` ivs && i `notElem` xs in-        [ TypeExport i e (filter (ok []) ves) | TypeExport i e ves <- ts, i `notElem` its ] ++-        [ TypeExport i e (filter (ok xs) ves) | TypeExport i e ves <- ts, ImpTypeSome i' xs <- is, i == i' ]-      else-        let ok xs (ValueExport i _) = i `elem` ivs || i `elem` xs || isDefaultMethodId i in-        [ TypeExport i e                 ves  | TypeExport i e ves <- ts, i `elem` aits ] ++-        [ TypeExport i e (filter (ok xs) ves) | TypeExport i e ves <- ts, ImpTypeSome i' xs <- is, i == i' ]-    msg = "not exported"-    allVs = map (\ (ValueExport i _) -> i) vs ++-            concatMap (\ (TypeExport _ _ xvs) -> map (\ (ValueExport i _) -> i) xvs) ts-    allTs = map (\ (TypeExport i _ _) -> i) ts-  in-    (if hide then-       id -- don't complain about missing hidden identifiers; we use it for compatibility-     else-       checkBad msg (ivs \\ allVs) .-       checkBad msg (its \\ allTs))-    --trace (show (ts, vs)) $-    (imp, TModule mn fx ts' vs' ds a)--checkBad :: forall a . String -> [Ident] -> a -> a-checkBad _ [] a = a-checkBad msg (i:_) _ =-  errorMessage (getSLoc i) $ msg ++ ": " ++ showIdent i---- Type and value exports-getTVExps :: forall a . M.Map (TModule a) -> TypeTable -> ValueTable -> AssocTable -> ExportItem ->-             ([TypeExport], [ValueExport])-getTVExps impMap _ _ _ (ExpModule m) =-  case M.lookup m impMap of-    Just (TModule _ _ te ve _ _) -> (te, ve)-    _ -> errorMessage (getSLoc m) $ "undefined module: " ++ showIdent m-getTVExps _ tys vals ast (ExpTypeSome ti is) =-  let e = expLookup ti tys-      assc = getAssocs vals ast $ tyQIdent e   -- all associated values-      ves = concatMap one is-      one i | i == dotDotIdent = assc          -- '..' means all associated values-            | otherwise =-              case filter (\ (ValueExport i' _) -> i == i') assc of-                ee : _ -> [ee]                 -- Pick the assocaited value if it exists-                [] -> [ValueExport (unQualIdent i) $ expLookup i vals]-                                               -- otherwise, just look up a pattern synonym.-                                               -- This might accidentally pick up a constructor from-                                               -- another type, but it doesn't really matter.-  in ([TypeExport (unQualIdent ti) e ves], [])--getTVExps _ _ vals _ (ExpValue i) = ([], [ValueExport (unQualIdent i) (expLookup i vals)])-getTVExps _ _ _ _ (ExpDefault _) = ([], [])--expLookup :: Ident -> SymTab -> 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---- 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 . HasCallStack => ImpType -> [EDef] -> TCState -> TModule a-mkTModule impt tds tcs =-  let-    mn = moduleName tcs-    tt = typeTable  tcs-    at = assocTable tcs-    vt = valueTable tcs--    -- Find the Entry for a type.-    tentry i =-      case stLookup "" (qualIdent mn i) tt of-        Right e -> e-        _       -> impossible-    ventry i t =-      let qi = qualIdent mn i in-      case stLookup "" qi vt of-        Right e -> e-        _       -> Entry (EVar qi) t  -- XXX A hack for boot modules--    -- Find all value Entry for names associated with a type.-    assoc i = case impt of-                ImpBoot -> []  -- XXX For boot files the tables are not set up correctly.-                _ -> getAssocs vt at (qualIdent mn i)--    -- All top level values possible to export.-    ves = [ ValueExport i (ventry i t') | Sign is t <- tds, let t' = expandSyn' st t, i <- is ]-      where st = synTable tcs--    -- 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 fixity declaration.-    fes = [ (qualIdent mn i, fx) | Infix fx is <- tds, i <- is ]--    -- All defaults-    des = defaults tcs--  in  TModule mn fes tes ves des impossible---- Find all value Entry for names associated with a type.--- XXX join stLookup code with tentry-getAssocs :: (HasCallStack) => ValueTable -> AssocTable -> Ident -> [ValueExport]-getAssocs _vt at ai = fromMaybe [] $ M.lookup ai at--mkTCState :: IdentModule -> GlobTables -> [(ImportSpec, TModule a)] -> TCState-mkTCState mdlName globs mdls =-  let-    allValues :: ValueTable-    allValues =-      let-        usyms (ImportSpec _ qual _ _ _, TModule _ _ tes ves _ _) =-          if qual then [] else-          [ (i, [e]) | ValueExport i e    <- ves, not (isInstId i)  ] ++-          [ (i, [e]) | TypeExport  _ _ cs <- tes, ValueExport i e <- cs, not (isDefaultMethodId i) ]-        qsyms (ImportSpec _ _ _ mas _, TModule mn _ tes ves _ _) =-          let m = fromMaybe mn mas in-          [ (v, [e]) | ValueExport i e    <- ves,                        let { v = qualIdent    m i } ] ++-          [ (v, [e]) | TypeExport  _ _ cs <- tes, ValueExport i e <- cs, let { v = qualIdentD e m i } ] ++-          [ (v, [Entry (EVar v) t]) | (i, ClassInfo _ _ t _ _) <- M.toList (gClassTable globs), let { v = mkClassConstructor i } ]-        -- Default methods are always entered with their qualified original name.-        qualIdentD (Entry e _) m i | not (isDefaultMethodId i) = qualIdent m i-                                   | otherwise =-                                     case e of-                                       EVar qi -> qi-                                       _ -> undefined-      in  stFromList (concatMap usyms mdls) (concatMap qsyms mdls)-    allTypes :: TypeTable-    allTypes =-      let-        usyms (ImportSpec _ qual _ _ _, TModule _ _ tes _ _ _) =-          if qual then [] else [ (i, [e]) | TypeExport i e _ <- tes ]-        qsyms (ImportSpec _ _ _ mas _, TModule mn _ tes _ _ _) =-          let m = fromMaybe mn mas in-          [ (qualIdent m i, [e]) | TypeExport i e _ <- tes ]-      in stFromList (concatMap usyms mdls) (concatMap qsyms mdls)--    allFixes :: FixTable-    allFixes = M.fromList (concatMap (tFixDefs . snd) mdls)-    allAssocs :: AssocTable-    allAssocs =-      let assocs (_, TModule _ _ tes _ _ _) = [ (tyQIdent e, cs) | TypeExport _ e cs <- tes ]-      in  M.fromList $ concatMap assocs mdls--    dflts = foldr (mergeDefaults . tDefaults . snd) M.empty mdls--  in TC { moduleName = mdlName,-          unique = 1,-          fixTable = addPrimFixs allFixes,-          typeTable = foldr (uncurry stInsertGlbA) allTypes primTypes,-          synTable = gSynTable globs,-          dataTable = gDataTable globs,-          valueTable = foldr (uncurry stInsertGlbA) allValues primValues,-          assocTable = allAssocs,-          uvarSubst = IM.empty,-          tcMode = TCExpr,-          classTable = gClassTable globs,-          ctxTables = (gInstInfo globs, [], [], []),-          constraints = [],-          defaults = dflts-        }--mergeDefaults :: Defaults -> Defaults -> Defaults-mergeDefaults ds = foldr (uncurry $ M.insertWith mrg) ds . M.toList-  where mrg :: [EType] -> [EType] -> [EType]-        mrg ts ts' | not (any (\ t -> not (elemBy eqEType t ts)) ts') = ts-                   | not (any (\ t -> not (elemBy eqEType t ts')) ts) = ts'-                   | otherwise = []--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@(EVar i1) (EVar i2)-      | i1 == i2  = e1-      | otherwise = errorMessage (getSLoc i1) $ "Multiple instances: " ++ showSLoc (getSLoc i2)-    mrg e1 _e2 = e1 -- XXX improve this-    l = unionBy eqInstDict l1 l2-  in  InstInfo m l fds---- 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'---- Identifier should only be seen with it's qualified name.-isInstId :: Ident -> Bool-isInstId i = (instPrefix ++ uniqIdentSep) `isPrefixOf` unIdent i--mkInstId :: SLoc -> EType -> Ident-mkInstId loc ct = mkIdentSLoc loc $ instPrefix ++ uniqIdentSep ++ clsTy-  where clsTy = map (\ c -> if isSpace c then '@' else c) $ showExprRaw ct-------------------------------- 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-  otcm <- gets tcMode-  vt <- gets valueTable-  tt <- gets typeTable-  putValueTable tt            -- use type table as value table-  let-    tcm = succ otcm-    next = case tcm of { TCType -> primKindTable; TCKind -> primSortTable; _ -> undefined }-  putTypeTable next           -- use kind/sort table as type table-  putTCMode tcm-  a <- ta-  tt' <- gets valueTable-  putValueTable vt-  putTypeTable tt'-  putTCMode otcm-  return a--addAssocTable :: Ident -> [ValueExport] -> T ()-addAssocTable i ids = modify $ \ ts -> ts { assocTable = M.insert i ids (assocTable ts) }--addClassTable :: Ident -> ClassInfo -> T ()-addClassTable i x = modify $ \ ts -> ts { classTable = M.insert i x (classTable ts) }--addInstTable :: [InstDictC] -> T ()-addInstTable ics = do---  tcTrace $ "addInstTable: " ++ show ics-  let-    -- Change type variable to unique unification variables.-    -- These unification variables will never leak, but as an extra caution-    -- we use negative numbers..-    freshSubst u iks =-      zipWith (\ ik j -> (idKindIdent ik, EUVar j)) iks [u ..]--    mkInstInfo :: InstDictC -> T (Ident, InstInfo)-    mkInstInfo (e, iks, ctx, ct, fds) = do-      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, ii)] fds)-          where ii u =-                  let ctx' = map (subst s) ctx-                      ts'  = map (subst s) ts-                      s    = freshSubst u iks-                  in  (ctx', ts')-  iis <- mapM mkInstInfo ics-  it <- gets instTable-  putInstTable $ foldr (uncurry $ M.insertWith mergeInstInfo) it iis---- Generate a dictionary for the constraint.--- Reuse old dictionaries if possible.-newDict :: SLoc -> EConstraint -> T Expr-newDict loc ctx = do-  ctx' <- derefUVar ctx-  cs <- gets constraints-  -- Check if there's already an identical constraint.-  case find (\ (_, c) -> eqEType c ctx') cs of-    Just (i, _) -> do---      traceM ("newDict reuse: " ++ show (i, ctx'))-      return (EVar i)-    _ -> do-      i <- newDictIdent loc---      traceM ("newDict: " ++ show (i, ctx', length cs))-      addConstraint i ctx'-      return (EVar i)--addConstraint :: Ident -> EConstraint -> T ()-addConstraint d ctx = do---  tcTrace $ "addConstraint: " ++ showIdent d ++ " :: " ++ showEType ctx-  modify $ \ ts -> ts{ constraints = (d, ctx) : constraints ts }--withDicts :: forall a . HasCallStack => [(Ident, EConstraint)] -> T a -> T a-withDicts ds ta = do---  tcTrace $ "+++ withDicts enter " ++ show ds-  ct <- gets ctxTables-  mapM_ addDict ds-  a <- ta-  putCtxTables ct---  tcTrace $ "--- withDicts leave " ++ show ds-  return a--withDict :: forall a . HasCallStack => Ident -> EConstraint -> T a -> T a-withDict i c ta = do---  tcTrace $ "+++ withDict enter " ++ show (i, c)-  ct <- gets ctxTables-  addDict (i, c)-  a <- ta-  putCtxTables ct---  tcTrace $ "--- withDict leave " ++ show (i, c)-  return a--addDict :: HasCallStack => (Ident, EConstraint) -> T ()-addDict (i, c) = do-  c' <- derefUVar c-  if null (metaTvs [c']) then-    addInstDict i c'-   else-    -- With constraint variables we might get unification variables.-    -- We stash them away in hope that we will learn more later.-    addMetaDict i c'--addInstDict :: HasCallStack => Ident -> EConstraint -> T ()-addInstDict di c = do-  ics <- expandDict (EVar di) c-  -- Type equalities are handled differently.-  let addeq [] = return []-      addeq ((_, _, _, EApp (EApp (EVar eq) t1) t2, _):is) | eq == identTypeEq = do addEqDict t1 t2; addeq is-      addeq (i:is) = (i :) <$> addeq is-  ics' <- addeq ics-  addInstTable ics'-  addArgDict di c--addEqDict :: EType -> EType -> T ()-addEqDict t1 t2 = do-  is <- gets typeEqTable---  tcTrace ("withEqDict: " ++ show (is, (t1,t2), (addTypeEq t1 t2 is)))-  putTypeEqTable (addTypeEq t1 t2 is)--addMetaDict :: HasCallStack => Ident -> EConstraint -> T ()-addMetaDict i c = do-  ms <- gets metaTable-  putMetaTable ((i,c) : ms)--addArgDict :: HasCallStack => Ident -> EConstraint -> T ()-addArgDict i c = do-  ads <- gets argDicts-  putArgDicts ((i,c) : ads)----stdDefaults :: [EType]---stdDefaults = [EVar identInteger, EVar identFloatW, EApp (EVar identList) (EVar identChar)]--addPrimFixs :: FixTable -> FixTable-addPrimFixs =-  M.insert (mkIdent "Primitives.->") (AssocRight, -1) .-  M.insert (mkIdent "Primitives.=>") (AssocRight, -2)---- r for 'realm', suggested by ChatGPT-rSort :: ESort-rSort = EVar (mkIdent "Primitives.Sort")--sKindKindKind :: EKind-sKindKindKind = sArrow sKind (sArrow sKind sKind)--kTypeTypeS :: EType-kTypeTypeS = kArrow kType kType--kTypeTypeTypeS :: EType-kTypeTypeTypeS = kArrow kType $ kArrow kType kType---- E.g.---  Kind :: Sort-primSortTable :: KindTable-primSortTable =-  let-    entry i s = Entry (EVar (mkIdentB i)) s-    qsorts = [-       -- The kinds are wired in (for now)-       (mkIdentB nameKind,       [entry nameKind rSort])-       ]-  in stFromList (map (first unQualIdent) qsorts) qsorts---- E.g.---  Type       :: Kind---  Constraint :: Kind---  (->)       :: Kind -> Kind -> Kind-primKindTable :: KindTable-primKindTable =-  let-    entry i k = Entry (EVar (mkIdentB i)) k-    qkinds = [-       -- The kinds are wired in (for now)-       (mkIdentB nameType,       [entry nameType sKind]),-       (mkIdentB nameConstraint, [entry nameConstraint sKind]),-       (mkIdentB nameSymbol,     [entry nameSymbol sKind]),-       (mkIdentB nameNat,        [entry nameNat sKind]),-       (identArrow,              [entry nameArrow sKindKindKind])-       ]-  in stFromList (map (first unQualIdent) qkinds) qkinds---- E.g.---  Bool  :: Type---  Int   :: Type---  (->)  :: Type -> Type -> Type---  (=>)  :: forall k . Constraint -> k -> k---  Maybe :: Type -> Type-primTypes :: [(Ident, [Entry])]-primTypes =-  let-    entry i = Entry (EVar i)-    k = mkIdent "k"-    kv = EVar k-    kk = IdKind k sKind-    -- Tuples are polykinded since they need to handle both Type and Constraint-    -- (,) :: forall k . k -> k -> k-    -- etc.-    tuple n =-      let-        i = tupleConstr builtinLoc n-      in  (i, [entry i $ EForall QExpl [kk] $ foldr kArrow kv (replicate n kv)])-    -- (=>) :: forall k . Constraint -> k -> k-    kImplies = EForall QExpl [kk] $ kConstraint `kArrow` (kv `kArrow` kv)-    -- (~) :: forall k . k -> k -> Constraint-    kTypeEqual = EForall QExpl [kk] $ kv `kArrow` (kv `kArrow` kConstraint)-  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 identArrow    kTypeTypeTypeS]),-       (mkIdentB "=>",           [entry identImplies  kImplies]),-       (mkIdentB "~",            [entry identTypeEq   kTypeEqual]),-       -- Primitives.hs uses the type [], and it's annoying to fix that.-       -- XXX should not be needed-       (identList,               [entry identList     kTypeTypeS]),-       (mkIdentB "\x2192",       [entry identArrow    kTypeTypeTypeS]),  -- ->-       (mkIdentB "\x21d2",       [entry identImplies  kImplies])         -- =>-      ] ++-      map tuple (0 : enumFromTo 2 maxTuple)---- E.g.---  True :: Bool---  (&&) :: Bool -> Bool---  Just :: forall a . a -> Maybe a---  ,    :: forall a b . a -> b -> (a,b)-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 QExpl vks $ EForall QExpl [] $ foldr tArrow r ts ])-  in  map tuple (0 : enumFromTo 2 maxTuple)--kArrow :: EKind -> EKind -> EKind-kArrow = tArrow--sArrow :: ESort -> ESort -> ESort-sArrow = tArrow--setUVar :: TRef -> EType -> T ()-setUVar i t = modify $ \ ts -> ts{ uvarSubst = IM.insert i t (uvarSubst ts) }--getUVar :: Int -> T (Maybe EType)-getUVar i = gets (IM.lookup i . uvarSubst)--munify :: HasCallStack =>-          SLoc -> Expected -> EType -> T ()-munify loc (Infer r) b = tSetRefType loc r b-munify loc (Check a) b = unify loc a b---- Synonyms are expanded after kind checking.--- There should be no synonyms in any of the symbol tables (except synTable).-expandSyn :: HasCallStack =>-             EType -> T EType---expandSyn at | trace ("expandSyn: " ++ show at) False = undefined-expandSyn at = do-  syns <- gets synTable-  let-    rt = expandSyn' syns at-    -- Check that there are no unexpanded synonyms left-    chk (EApp f a) = do chk f; chk a-    chk (EVar i) =-      case M.lookup i syns of-        Nothing -> return ()-        _ -> tcError (getSLoc i) "bad synonym use"-    chk (EUVar _) = return ()-    chk (EForall _ _ t) = chk t-    chk (ELit _ _) = return ()-    chk _ = impossible-  chk rt-  return rt---- Expand with the given synonym table.-expandSyn' :: HasCallStack =>-              SynTable -> EType -> EType-expandSyn' syns = esyn-  where-    esyn = syn []-    -- Expand synonyms that have enough arguments-    syn ts t =-      case t of-        EApp f a -> syn (esyn a : ts) f-        EVar i ->-          case M.lookup i syns of-            Nothing -> eApps t ts-            Just (EForall _ vks tt) ->-              let is = map idKindIdent vks-                  s = zip is ts-                  lis = length is-                  lts = length ts-              in  if lis > lts then-                    eApps t ts-                  else-                    -- Too few arguments, just leave it alone-                    syn (drop lis ts) (subst s tt)-            Just _ -> impossible-        EUVar _ -> eApps t ts-        ESign a _ -> syn ts a   -- Throw away signatures, they don't affect unification-        EForall b iks tt | null ts -> EForall b iks (esyn tt)-        ELit _ (LStr _) -> t-        ELit _ (LInteger _) -> t-        _ -> impossibleShow t---mapEType :: (EType -> EType) -> EType -> EType-mapEType fn = rec-  where-    rec (EApp f a) = EApp (rec f) (rec a)-    rec (ESign t k) = ESign (rec t) k-    rec (EForall b iks t) = EForall b iks (rec t)-    rec t = fn t--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 b iks t -> EForall b <$> iks' <*> derefUVar t-      where iks' = mapM (\ (IdKind i k) -> IdKind i <$> derefUVar k) iks-    ELit _ (LStr _) -> return at-    ELit _ (LInteger _) -> return at-    _ -> impossible--tcErrorTK :: HasCallStack =>-             SLoc -> String -> T ()-tcErrorTK loc msg = do-  tcm <- gets tcMode-  tcError loc $ msgTCMode' tcm ++ " error: " ++ msg---- For error messages-msgTCMode :: TCMode -> String-msgTCMode TCExpr = "value"-msgTCMode TCType = "type"-msgTCMode TCKind = "kind"-msgTCMode TCSort = "sort"--msgTCMode' :: TCMode -> String-msgTCMode' TCExpr = "type"-msgTCMode' TCType = "kind"-msgTCMode' TCKind = "sort"-msgTCMode' TCSort = "realm"--unify :: HasCallStack =>-         SLoc -> EType -> EType -> T ()-unify loc a b = unifyR loc a b--unifyR :: HasCallStack =>-          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 loc t1@(EUVar r1) t2@(EUVar r2) | r1 < r2   = unifyVar loc r2 t1   -- always make higher-                                       | r1 > r2   = unifyVar loc r1 t2   --   TRefs point to lower-                                       | otherwise = 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-    -- Defer to constraint solver.-    -- XXX needs changing if we have kind equalities.-    TCExpr -> addEqConstraint loc t1 t2-    _      -> tcErrorTK loc $ "cannot unify " ++ showExpr t1 ++ " and " ++ showExpr t2--unifyVar :: HasCallStack =>-            SLoc -> TRef -> EType -> T ()-unifyVar loc r t = do-  mt <- getUVar r---  tcTrace $ "unifyVar: " ++ show (r,t)-  case mt of-    Nothing -> unifyUnboundVar loc r t-    Just t' -> unify loc t' t--unifyUnboundVar :: HasCallStack =>-                   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 r1 `elem` vs then-    tcErrorTK loc $ "cyclic " ++ showExpr (EUVar r1) ++ " = " ++ showExpr t2-   else-    setUVar r1 t2---- Reset unification map-tcReset :: T ()-tcReset = modify $ \ ts -> ts{ uvarSubst = IM.empty }--newUVar :: T EType-newUVar = EUVar <$> newUniq--newIdent :: SLoc -> String -> T Ident-newIdent loc s = do-  u <- newUniq-  return $ mkIdentSLoc loc $ s ++ uniqIdentSep ++ show u--tLookup :: HasCallStack =>-           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-{--      tcm <- gets tcMode-      tcTrace ("TCMode=" ++ show tcm)-      tcTrace ("Value table:\n" ++ show env)-      tenv <- gets typeTable-      tcTrace ("Type table:\n" ++ show tenv)--}-      tcError (getSLoc i) e--tLookupV :: HasCallStack =>-           Ident -> T (Expr, EType)-tLookupV i = do-  tcm <- gets tcMode-  tLookup (msgTCMode tcm) i--tInst :: HasCallStack => Expr -> EType -> T (Expr, EType)---tInst ae t | trace ("tInst: " ++ show (ae, t)) False = undefined-tInst ae (EForall _ vks t) = do-  t' <- tInstForall vks t-  tInst ae t'-tInst ae at | Just (ctx, t) <- getImplies at = do-  --tcTrace $ "tInst: addConstraint: " ++ show ae ++ ", " ++ show d ++ " :: " ++ show ctx-{--  if eqExpr ae eCannotHappen then-    -- XXX Gruesome hack.  This avoids adding constraints in cases like-    --  (C a => a) -> T `subsCheck` b-    undefined-    --tInst ae t-   else do--}-    d <- newDict (getSLoc ae) ctx-    tInst (EApp ae d) t-tInst ae at = return (ae, at)---- Instantiate a function, but delay generating the dictionaries.--- When generating the dictionaries here (like tInst) there--- is no type information; just a type variable.--- By delaying the dictionary generation we gain more--- type information, and can avoid let binding dictionaries by---  * finding an already bound dictionary for the same constraint---  * solving the constraint early-tInstDelay :: HasCallStack => EType -> T ([EConstraint], EType)---tInstDelay  t | trace ("tInstDelay: " ++ show (ae, t)) False = undefined-tInstDelay = inst []-  where-    inst cs (EForall _ vks t) = do-      t' <- tInstForall vks t-      inst cs t'-    inst cs at | Just (ctx, t) <- getImplies at =-      inst (ctx:cs) t-    inst cs at = return (reverse cs, at)--tInstForall :: [IdKind] -> EType -> T EType-tInstForall vks t =-  if null vks then-    return t-  else do-    let vs = map idKindIdent vks-    us <- mapM (const newUVar) vks-    return (subst (zip vs us) t)--tInst' :: EType -> T EType-tInst' (EForall _ vks t) = tInstForall vks t-tInst' t = return t--extValE :: HasCallStack =>-           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 :: HasCallStack =>-              Ident -> EType -> Expr -> T ()-extValETop i t e = do-  mn <- gets moduleName-  venv <- gets valueTable-  t' <- expandSyn t                 -- expand type synonyms before entering the symbol table---  when (show i == "mkTyCon") $ traceM (show "extValETop " ++ show (i, t, t'))-  let qi = qualIdent mn i-      venv'  = stInsertGlbQ qi [Entry e t'] venv-      venv'' = stInsertGlbU  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 :: HasCallStack =>-              Ident -> EType -> T ()-extValQTop i t = do-  mn <- gets moduleName-  extValETop i t (EVar (qualIdent mn i))--extVal :: HasCallStack =>-          Ident -> EType -> T ()-extVal i t = extValE i t $ EVar i--extVals :: HasCallStack =>-           [(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 -> [IdKind] -> EType -> T ()-extSyn i iks t = do-  -- Eta reduce type synonyms.-  -- E.g. 'type T a = Maybe a' could be 'type T = Maybe'.-  case etaReduce iks t of-    (iks', t') -> do-      senv <- gets synTable-      putSynTable (M.insert i (EForall QExpl iks' t') senv)--extData :: Ident -> EDef -> T ()-extData i d = do-  denv <- gets dataTable-  putDataTable (M.insert i d denv)--extFix :: Ident -> Fixity -> T ()-extFix i fx = modify $ \ ts -> ts{ fixTable = M.insert i fx (fixTable ts) }--withExtVal :: forall a . HasCallStack =>-              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 . HasCallStack =>-               [(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 :: HasCallStack => Flags -> ImpType -> [EDef] -> T [EDef]-tcDefs flags impt ds = do---  tcTrace ("tcDefs 1:\n" ++ showEDefs ds)-  -- First, add infix declarations so the operators can be resolved-  mapM_ tcAddInfix ds-  dst <- tcDefsType ds---  tcTrace ("tcDefs 2:\n" ++ showEDefs dst)-  mapM_ addTypeAndData dst-  dste <- tcExpandClassInst impt dst-  dumpIf flags Dderive $-    tcTrace' $ "expanded:\n" ++ showEDefs dste---  tcTrace ("tcDefs 3:\n" ++ showEDefs dste)-  case impt of-    ImpNormal -> do-      setDefault dste-      dste' <- tcDefsValue dste-      mapM_ addAssocs dste'-      return dste'-    ImpBoot ->-      return dste--setDefault :: [EDef] -> T ()-setDefault defs = do-  tys <- gets typeTable-  ds <- sequence [ do { ts' <- mapM expandSyn ts; return (tyQIdent $ expLookup c tys, ts') }-                 | Default (Just c) ts <- defs ]-  dflts <- gets defaults-  let dflts' = foldr (uncurry M.insert) dflts ds---  traceM $ "Active defaults " ++ show (M.toList dflts')-  putDefaults dflts'--tcAddInfix :: EDef -> T ()-tcAddInfix (Infix fx is) = do-  mn <- gets moduleName-  mapM_ (\ i -> extFix (qualIdent mn i) fx) is-tcAddInfix _ = return ()---- Kind check type definitions-tcDefsType :: HasCallStack => [EDef] -> T [EDef]-tcDefsType ds = withTypeTable $ do-  kindSigs <- getKindSigns ds-  mapM_ (addTypeKind kindSigs) ds              -- Add the kind of each type to the environment-  dst <- mapM tcDefType ds                     -- Kind check all top level type expressions---  vars <- gets uvarSubst---  tcTrace $ show vars-  vt <- gets valueTable-  let ent (Entry i k) = Entry i <$> zonk k-      zonk k = mapEType def <$> (derefUVar k >>= expandSyn)-        where def (EUVar _) = kType    -- default kind variables to Type-              def t = t-      derefClass (Class ctx (n, vks) ct ms) = do-        vks' <- mapM (\ (IdKind i k) -> IdKind i <$> zonk k) vks---        traceM("derefClass: " ++ show (n, vks, vks'))-        pure (Class ctx (n, vks') ct ms)-      derefClass d = pure d-  vt' <- mapMSymTab ent vt-  putValueTable vt'-  mapM derefClass dst    -- make class definition LHSs have correct kinds---  tcTrace $ "tcDefType value table:\n" ++ show vt'---- Get all kind signatures, and do sort checking of them.-getKindSigns :: HasCallStack => [EDef] -> T (M.Map EKind)-getKindSigns ds = do-  let iks = [ (i, k) | KindSign i k <- ds ]-      kind (i, k) = (,) i <$> tcKind (Check sKind) k-  multCheck (map fst iks)-  iks' <- mapM kind iks-  return $ M.fromList iks'---- Expand class and instance definitions (must be done after type synonym processing).-tcExpandClassInst :: ImpType -> [EDef] -> T [EDef]-tcExpandClassInst impt dst = do-  dsf <- withTypeTable $ do-    dsc <- concat <$> mapM (expandClass impt) dst       -- Expand all class definitions-    concat <$> mapM expandField dsc                     -- Add HasField instances-  mapM_ addValueTypeClass dsf                           -- Add methods, needed while deriving-  dsd <- concat <$> mapM doDeriving dsf                 -- Add derived instances-  concat <$> mapM expandInst dsd                        -- Expand all instance definitions---- Check&rename the given kinds, also insert the type variables in the symbol table.-withVks :: forall a . HasCallStack => [IdKind] -> ([IdKind] -> T a) -> T a-withVks vks fun = assertTCMode (>=TCType) $ do-  tcm <- gets tcMode-  let-    expect = case tcm of { TCType -> sKind; TCKind -> rSort; _ -> undefined }-    loop r [] = fun (reverse r)-    loop r (IdKind i mk : iks) = do-      -- When we have 'forall k (a :: k) . t' the k is a kind.-      -- Instead we have have to write 'forall (k :: Kind) (a :: k) . t' and then-      -- we have to guess that k needs sort checking.-      -- This doesn't work if there is not exactly 'Kind' (e.g., 'Primitives.Kind')-      -- This sucks.-      if tcm == TCType && guessIsKind mk then do-        s <- withTypeTable $ withTypeTable $ tcExpr (Check rSort) mk-        let ik = IdKind i s-        withExtTyps [ik] $ loop (ik : r) iks-      else do-        k' <- case mk of-                EVar d | d == dummyIdent -> newUVar-                _                        -> withTypeTable $ tcExpr (Check expect) mk   -- bump to next level-        withExtVal i k' $ loop (IdKind i k' : r) iks-  loop [] vks--guessIsKind :: EType -> Bool-guessIsKind (EVar i)                      = i == mkIdent "Kind"-guessIsKind t =-  case getArrow t of-    Just (f, a) -> guessIsKind f || guessIsKind a-    _           -> False---- Add symbol a table entry (with kind) for each top level typeish definition.--- If there is a kind signature, use it.  If not, use a kind variable.-addTypeKind :: M.Map EKind -> EDef -> T ()-addTypeKind kdefs adef = do-  let-    addDef (i, _) = do-      k <- maybe newUVar return $ M.lookup i kdefs-      extValQTop i k--  case adef of-    Data    lhs _ _ -> addDef lhs-    Newtype lhs _ _ -> addDef lhs-    Type    lhs _   -> addDef lhs-    Class _ lhs _ _ -> addDef lhs-    _               -> return ()---- Add symbols associated with a type.-addAssocs :: HasCallStack => EDef -> T ()-addAssocs adef = do-  mn <- gets moduleName-  let-    addAssoc ti is = do-      vt <- gets valueTable-      let val i =-            case stLookup "" i vt of-              Right e -> ValueExport i e-              _       -> impossibleShow i-      addAssocTable (qualIdent mn ti) (map val is)--    assocData (Constr _ _ c (Left _)) = [c]-    assocData (Constr _ _ c (Right its)) = c : map fst its--  case adef of-    Data    (i, _) cs _ | not (isMatchDataTypeName i)-                        -> addAssoc i (nub $ concatMap assocData cs)-    Newtype (i, _) c  _ -> addAssoc i (assocData c)-    Class _ (i, _) _ ms -> addAssoc i [ x | Sign ns _ <- ms, m <- ns, x <- [m, mkDefaultMethodId m] ]-    _                   -> return ()---- Add type synonyms to the synonym table, and data/newtype to the data table.-addTypeAndData :: EDef -> T ()-addTypeAndData adef = do-  mn <- gets moduleName-  case adef of-    Type    (i, vs) t  -> extSyn  (qualIdent mn i) vs t-    Data    (i, _) _ _ -> extData (qualIdent mn i) adef-    Newtype (i, _) _ _ -> extData (qualIdent mn i) adef-    _                  -> return ()---- Do kind checking of all typeish definitions.-tcDefType :: HasCallStack => EDef -> T EDef-tcDefType def = do-  case def of-    Data    lhs cs ds      -> withLHS lhs $ \ lhs' -> cm kType       <$> (Data    lhs'  <$> mapM tcConstr cs <*> mapM (tcDeriving lhs') ds)-    Newtype lhs c  ds      -> withLHS lhs $ \ lhs' -> cm kType       <$> (Newtype lhs'  <$> tcConstr c       <*> mapM (tcDeriving lhs') ds)-    Type    lhs t          -> withLHS lhs $ \ lhs' -> first              (Type    lhs') <$> tInferTypeT t-    Class   ctx lhs fds ms -> withLHS lhs $ \ lhs' -> cm kConstraint <$> (Class         <$> tcCtx ctx <*> return lhs' <*> mapM tcFD fds <*> mapM tcMethod ms)-    Sign      is t         ->                                            Sign      is   <$> tCheckTypeTImpl QImpl kType t-    ForImp ie i t          ->                                            ForImp ie i    <$> tCheckTypeTImpl QImpl kType t-    Instance ct m          ->                                            Instance       <$> tCheckTypeTImpl QExpl kConstraint ct <*> return m-    Default mc ts          ->                                            Default (Just c) <$> mapM (tcDefault c) ts-                                                                           where c = fromMaybe num mc--- We cant't do this now, because the classTable has not been fully populated yet.--- Instead, we do it in the deriving stage.---    StandDeriving st _ ct  ->                                            tcStand st ct-    _                      -> return def- where-   cm = flip (,)-   tcMethod (Sign    is t) = Sign    is <$> (tCheckTypeTImpl QImpl kType t >>= expandSyn)-   tcMethod (DfltSign i t) = DfltSign i <$> (tCheckTypeTImpl QImpl kType t >>= expandSyn)-   tcMethod m              = return m-   tcFD (is, os) = (,) <$> mapM tcV is <*> mapM tcV os-     where tcV i = do { _ <- tLookup "fundep" i; return i }-   num = mkBuiltin noSLoc "Num"-   tcDefault c t = do-     EApp _ t' <- tCheckTypeT kConstraint (EApp (EVar c) t)-     return t'---- A standalone deriving has a regular instance head.--- If it has a via clause, the via type has to have the same kind--- as the type in the instance head.-tcStand :: DerStrategy -> EConstraint -> T EDef-tcStand st ct = do-     ct' <- tCheckTypeTImpl QExpl kConstraint ct-     -- We need the kind of the type in the instance head.-     -- It's needed for the number of arguments to "eta reduce",-     -- and also for kind checking the via type.-     -- So find the kind of the last argument to the class-     (vks, kty) <- do-       let (cvks, _ctx, cty) = splitContext ct'-           cls = fst $ getApp cty-       ctbl <- gets classTable-       case M.lookup cls ctbl of-         Just (ClassInfo vks@(_:_) _ _ _ _) -> case last vks of IdKind _ k -> return (cvks, k)-         _ -> tcError (getSLoc ct) $ "not a class " ++ showIdent cls-     let narg = length $ fst $ getArrows kty-     st' <--       case st of-         DerVia t -> DerVia <$> withExtVals (map (\ (IdKind i k) -> (i, k)) vks)-                       (tCheckTypeT kty t)   -- make sure the via type has the same kind-         _ -> return st-     pure $ StandDeriving st' narg ct'---- The type variables vks are already in scope when we get here.-tcDeriving :: LHS -> Deriving -> T Deriving-tcDeriving (tyId, vks) (Deriving strat cs) = do-  let tcDerive (_, c) = do-        let loc = getSLoc c-        -- The kind of c has to be of the form (k1 -> ... kn -> Type) -> Constraint-        -- Check that it is.-        k <- newUVar-        --traceM $ "tcDerive 1: " ++ show c-        c' <- tCheckTypeTImpl QExpl (k `kArrow` kConstraint) c-        --traceM $ "tcDerive 2: " ++ show c-        (ks, _) <- getArrows <$> derefUVar k  -- get [k1,...,kn] and final kind-        -- Checking that the final kind is Type happens with the tc call below.-        let r = length ks                      -- number of args consumed by c-            m = length vks                     -- number of args given to the data type-            i = m - r                          -- keep this many-            ty = tApps tyId (map (EVar . idKindIdent) (take i vks))-        when (i < 0) $-          tcError loc "Bad deriving"-        -- The generated instance has the form 'instance ... => c ty'.-        -- Check that this has kind Constraint.-        -- Also check that any via type also fulfills this.-        let tc t = do _ <- tCheckTypeTImpl QExpl kConstraint (tApp c t); return ()-        tc ty-        case strat of-          DerVia v -> tc v  -- XXX should this allow implicit quantification?-          _        -> return ()-        return (r, c')--  cs' <- mapM tcDerive cs-  -- Ignore the kind here, it's checked for each derived type-  strat' <- case strat of-              DerVia t -> DerVia . fst <$> tInferTypeT t-              _        -> return strat-  return $ Deriving strat' cs'--withLHS :: forall a . HasCallStack => LHS -> (LHS -> T (a, EKind)) -> T a-withLHS (i, vks) ta = do-  (_, ki) <- tLookupV i-  withVks vks $ \ vks' -> do-    (a, kr) <- ta (i, vks')-    let kapp = foldr (kArrow . (\ (IdKind _ k) -> k)) kr vks'-    -- XXX polykinded definitions don't work properly-    _ <- subsCheckRho (getSLoc i) eCannotHappen ki kapp-    return a--tcCtx :: HasCallStack => [EConstraint] -> T [EConstraint]-tcCtx = mapM (tCheckTypeT kConstraint)--tcConstr :: HasCallStack => Constr -> T Constr-tcConstr (Constr iks ct c ets) =-  assertTCMode (==TCType) $-  withVks iks $ \ iks' ->-    Constr iks' <$> tcCtx ct <*> pure c <*>-      case ets of-        Left  x -> Left  <$> mapM (\ (s,t)     ->        (,)s <$> tcTypeT (Check kType) t) x-        Right x -> Right <$> mapM (\ (i,(s,t)) -> (,)i . (,)s <$> tcTypeT (Check kType) t) x---- 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.-expandClass :: ImpType -> EDef -> T [EDef]-expandClass impt dcls@(Class _ctx (iCls, vks) _fds ms) = do-  mn <- gets moduleName-  let-      meths = [ b | b@(Sign _ _) <- ms ]-      mdflts = [ (i, eqns) | Fcn i eqns <- ms ]-      dflttys = [ (i, t) | DfltSign i t <- ms ]-      tCtx = tApps (qualIdent mn iCls) (map (EVar . idKindIdent) vks)-      mkDflt (Sign is t) = concatMap method is-        where method methId = [ Sign [iDflt] $ EForall QExpl vks $ tCtx `tImplies` ty, def $ lookup methId mdflts ]-                where ty = fromMaybe t $ lookup methId dflttys-                      def Nothing = Fcn iDflt $ etaExp ty noDflt-                      def (Just eqns) = Fcn iDflt eqns-                      iDflt = mkDefaultMethodId methId-                      noDflt = mkExn (getSLoc methId) (unIdent methId) "noMethodError"-      mkDflt _ = impossible-      -- The type checker cannot handle something like-      --   foo :: ((forall a . a -> Int) -> Int) -> Int-      --   foo = undefined-      -- but the eta expanded version is acceptable, so we eta expand-      -- default methods.-      -- XXX This isn't really enough for complicated nested quantifiers.-      etaExp t e =-        let n = length $ fst $ getArrows $ (\ (_,_,x)->x) $ splitContext t-            vs = replicate n (EVar dummyIdent)-        in  [Eqn vs $ simpleAlts e]-      dDflts = case impt of-                 ImpNormal -> concatMap mkDflt meths-                 ImpBoot   -> []-  return $ dcls : dDflts-expandClass _ d = return [d]--simpleEqn :: Expr -> [Eqn]-simpleEqn e = [Eqn [] $ simpleAlts e]--simpleAlts :: Expr -> EAlts-simpleAlts e = EAlts [([], e)] []---- Keep the list empty if there are no fundeps-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---- Turn (unqualified) class and method names into a default method name-mkDefaultMethodId :: Ident -> Ident-mkDefaultMethodId meth = addIdentSuffix meth defaultSuffix--isDefaultMethodId :: Ident -> Bool-isDefaultMethodId i = defaultSuffix `isSuffixOf` unIdent i--defaultSuffix :: String-defaultSuffix = uniqIdentSep ++ "dflt"---- Split something of the form---  forall vs . ctx => t--- into (vs, ctx, t)-splitContext :: EConstraint -> ([IdKind], [EConstraint], EConstraint)-splitContext (EForall _ iks t) =-  case splitContext t of-    (iks', ctx, ct) -> (iks ++ iks', ctx, ct)-splitContext act =-  case getImplies act of-    Just (ctx, ct) ->-      case splitContext ct of-        (iks, ctxs, ct') -> (iks, ctx : ctxs, ct')-    _ -> ([], [], act)---- expandInst runs when all kind checking has been done, but no value checking.--- So any generated type expressions must be kind correct and fully qualified,--- whereas value expressions do not.-expandInst :: EDef -> T [EDef]-expandInst dinst@(Instance act bs) = do-  (vks, ctx, cc) <- splitContext <$> expandSyn act-  let loc = getSLoc act-      qiCls = getAppCon cc-      iInst = mkInstId loc cc---  tcTrace ("expandInst " ++ show iInst)---  (e, _) <- tLookupV iCls-  ct <- gets classTable---  let qiCls = getAppCon e-  (ClassInfo _ supers _ mits fds) <--    case M.lookup qiCls ct of-      Nothing -> tcError loc $ "not a class " ++ showIdent qiCls-      Just x -> return x-  let signs = [ (i, t) | Sign is t <- bs, i <- is ]-      addSign i e = maybe e (ESign e) $ lookup i signs-      clsMdl = qualOf qiCls                   -- get class's module name-      ies = [(i, addSign i $ ELam loc qs) | Fcn i qs <- bs]-      meth (i, _) = fromMaybe (ELam loc $ simpleEqn $ EVar $ setSLocIdent loc $ mkDefaultMethodId $ qualIdent clsMdl i) $ lookup i ies-      meths = map meth mits-      sups = map (const (EVar $ mkIdentSLoc loc dictPrefixDollar)) supers-      args = sups ++ meths-      instBind (Fcn i _) = isJust $ lookup i mits-      instBind (Sign is _) = all (\ i -> isJust $ lookup i mits) is-      instBind _ = False-  case filter (not . instBind) bs of-    [] -> return ()-    b:_ -> tcError (getSLoc b) "superflous instance binding"--  let body = eEqns [] $ eApps (EVar $ mkClassConstructor qiCls) args-      bind = Fcn iInst body-      sign = Sign [iInst] $ eForall vks $ addConstraints ctx cc-  addInstTable [(EVar iInst, vks, ctx, cc, fds)]-  return [dinst, sign, bind]--expandInst d = return [d]-------------------------tcDefsValue :: HasCallStack => [EDef] -> T [EDef]-tcDefsValue defs = do---  tcTrace $ "tcDefsValue: ------------ start"-  -- Gather up all type signatures, and put them in the environment.-  -- Definitions with no type signature will be missing.-  mapM_ addValueType defs-  let smap = M.fromList $ [ (i, ()) | Sign is _ <- defs, i <- is ]-      -- Split Fcn into those without and with type signatures-      unsigned = filter noSign defs-        where noSign (Fcn i _) = hasNoSign i-              noSign (Pattern (i, _) _ _) = hasNoSign i-              noSign (PatBind p _) = any hasNoSign (patVars p)-              noSign _ = False-              hasNoSign i = isNothing $ M.lookup i smap-      -- split the unsigned defs into strongly connected components-      sccs = stronglyConnComp $ map node unsigned-        where node d@(Fcn i e)             = (d, i,                tr $ allVarsEqns e)-              node d@(Pattern (i, _) p me) = (d, i,                tr $ allVarsPat p $ maybe [] allVarsEqns me)-              node d@(PatBind p e)         = (d, head $ patVars p, tr $ allVarsExpr e)  -- use the first bound var as the key-              node _ = undefined-              tr x | null sub = x  -- do nothing when there are no PatBinds-                   | otherwise = map (\ i -> fromMaybe i $ lookup i sub) x-              -- Map all (bound) identifiers in a PatBind into the first (bound) identifier-              sub = [ (d, i) | PatBind p _ <- unsigned, i:ds <- [patVars p], d <- ds ]-      tcSCC (AcyclicSCC d@Pattern{}) = tcPatSyn d-      tcSCC (AcyclicSCC d) = tInferDefs smap [d]-      tcSCC (CyclicSCC ds) = tInferDefs smap ds-  --traceM $ "tcDefsValue: unsigned=" ++ show unsigned-  -- type infer and enter each SCC in the symbol table-  -- return inferred Sign-  signDefs <- mapM tcSCC sccs-  defs' <- concat <$> mapM expandPatSyn defs---  traceM $ "tcDefsValue: ------------ expandPatSyn"---  traceM $ showEDefs defs'---  tcTrace $ "tcDefsValue: ------------ check"-  --  type check all definitions (the inferred ones will be rechecked)-  chksym-  defs'' <- mapM (\ d -> do { tcReset; tcDefValue d}) defs'-  let defs''' = concat signDefs ++ defs''---  traceM $ "tcDefsValue: ------------ done"---  traceM $ showEDefs defs'''-  pure defs'''---- Infer a type for a strongly connected component of definitions.--- Enter the deduced types into the global symbol table and return--- signatures with the deduced types.-tInferDefs :: M.Map () -> [EDef] -> T [EDef]-tInferDefs smap fcns = do---  traceM "tInferDefs"-  tcReset-  -- Invent type variables for the definitions-  xts <--       let f (Fcn i _)            = do t <- newUVar; pure [(i, t)]-           f (Pattern (i, _) _ _) = do t <- newUVar; pure [(i, t)]-           f (PatBind p _)        = concat <$> mapM g (patVars p)-           f _                    = impossible-           -- Only add type variables for those variables that don't have a signature-           g i = case M.lookup i smap of-                   Nothing -> do t <- newUVar; pure [(i, t)]-                   _       -> pure []-       in  concat <$> mapM f fcns-  --tcTrace $ "tInferDefs: " ++ show (map fst xts)-  -- Temporarily extend the local environment with the type variables-  withExtVals xts $ do-    -- Infer types for all the Fcns, ignore the new bodies.-    -- The bodies will be re-typecked in tcDefsValues.-    let tc (Fcn _ eqns) (_, t)   = do tcEqns False t eqns; return ()-        tc (Pattern (i,_) _ _) _ = tcError (getSLoc i) "Cannot infer recursive pattern synonym types"-        tc (PatBind p e)       _ = do tcPatBind PatBind p e; return ()-        tc _ _ = impossible-    zipWithM_ tc fcns xts-  -- Get the unsolved constraints-  ctx <- getUnsolved-  -- For each definition, quantify over the free meta variables, and include-  -- context mentioning them.-  let genTop :: (Ident, EType) -> T EDef-      genTop (i, t) = do-        t' <- derefUVar t-        let vs = metaTvs [t']-            ctx' = filter (\ c -> not (null (vs `intersect` metaTvs [c]))) ctx-            t'' = addConstraints ctx' t'-            vs' = metaTvs [t'']-        t''' <- quantify vs' t''-        --tcTrace $ "tInferDefs: " ++ showIdent i ++ " :: " ++ showEType t'''-        extValQTop i t'''-        return $ Sign [i] t'''-  mapM genTop xts--getUnsolved :: T [EConstraint]-getUnsolved = do-  _ <- solveConstraints-  ctx <- gets (map snd . constraints)-  ctx' <- mapM derefUVar ctx-  putConstraints []-  return $ nubBy eqEType ctx'--addValueType :: EDef -> T ()-addValueType adef = do-  mn <- gets moduleName-  -- tcTrace ("addValueType: " ++ showEDefs [adef])-  let addConFields _     (Constr _ _ _ (Left _)) = return ()-      addConFields tycon (Constr _ _ _ (Right fs)) = mapM_ addField fs-        where addField (fld, _) = do-                (fe, fty) <- tLookup "???" $ mkGetName tycon fld-                extValETop fld fty fe-  case adef of-    Sign is@(i:_) t | isConIdent i -> do-      -- pattern synonym-      t' <- canonPatSynType t-      mapM_ (addPatSyn t') is-    Sign is t ->-      -- regular synonym-      mapM_ (\ i -> extValQTop i t) is-    Data (tycon, 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 = tApps (qualIdent mn tycon) (map tVarK vks)-        addCon (Constr evks ectx c ets) = do-          let ts = either id (map snd) ets-              cty = EForall QExpl vks $ EForall QExpl evks $ addConstraints ectx $ foldr (tArrow . snd) tret ts-              fs = either (const []) (map fst) ets-          extValETop c cty (ECon $ ConData cti (qualIdent mn c) fs)-      mapM_ addCon cs-      mapM_ (addConFields tycon) cs-    Newtype (tycon, vks) con@(Constr _ _ c ets) _ -> do-      let-        t = snd $ head $ either id (map snd) ets-        tret = tApps (qualIdent mn tycon) (map tVarK vks)-        fs = either (const []) (map fst) ets-      extValETop c (EForall QExpl vks $ EForall QExpl [] $ tArrow t tret) (ECon $ ConNew (qualIdent mn c) fs)-      addConFields tycon con-    ForImp _ i t -> extValQTop i t-    Class ctx (i, vks) fds ms -> addValueClass ctx i vks fds ms-    _ -> return ()---- Add methods to symbol table-addValueTypeClass :: EDef -> T ()-addValueTypeClass (Class ctx (i, vks) fds ms) = addValueClass ctx i vks fds ms-addValueTypeClass _ = return ()---- Add a pattern synonym to the symbol table.-addPatSyn :: EType -> Ident -> T ()-addPatSyn at i = do-  mn <- gets moduleName-  let (_, _, _, _, t) = splitPatSynType at-      n = length $ fst $ getArrows t-      qi = qualIdent mn i-      qip = mkPatSynMatch qi-      mtch = (EVar qip, mkPatSynMatchType qip at)-  extValETop i at $ ECon $ ConSyn qi n mtch---- Add mathods to the value table.-addValueClass :: [EConstraint] -> Ident -> [IdKind] -> [FunDep] -> [EBind] -> T ()-addValueClass ctx iCls vks fds ms = do-  mn <- gets moduleName-  let methIdTys = [ (i, t) | Sign is t <- ms, i <- is ]-      supTys = ctx  -- XXX should do some checking-      targs = supTys ++ map snd methIdTys-      qiCls = qualIdent mn iCls-      tret = tApps qiCls (map tVarK vks)-      cti = [ (qualIdent mn iCon, length targs) ]-      iCon = mkClassConstructor iCls-      iConTy = EForall QExpl vks $ foldr tArrow tret targs-      tvs = map (EVar . idKindIdent) vks-      methIdTys' = map (\ (i, t) -> (i, EForall QExpl vks $ tApps qiCls tvs `tImplies` t)) methIdTys-      addMethod (i, t) = extValETop i t (EVar $ qualIdent mn i)-  extValETop iCon iConTy (ECon $ ConData cti (qualIdent mn iCon) [])-  mapM_ addMethod methIdTys'-  -- Update class table, now with actual constructor type.---  traceM $ "addValueClass " ++ show (iCls, vks)-  -- expand all type synonyms before entering the table-  info <- ClassInfo vks <$>-                    mapM expandSyn ctx <*>-                    expandSyn iConTy <*>-                    mapM (\ (i, t) -> (,) i <$> expandSyn t) methIdTys' <*>-                    return (mkIFunDeps (map idKindIdent vks) fds)-  addClassTable qiCls info--mkClassConstructor :: Ident -> Ident-mkClassConstructor i = addIdentSuffix i "$C"--tcDefValue :: HasCallStack =>-              EDef -> T EDef-tcDefValue adef =-  assertTCMode (==TCExpr) $-  case adef of-    Fcn i eqns -> do-      (_, t) <- tLookup "type signature" i---      when (isConIdent i) $ do---        tcTrace $ "tcDefValue: patsyn\n" ++ show i ++ " :: " ++ show t---        tcTrace $ "tcDefValue:\n" ++ showEDefs [adef]---      tcTrace $ "tcDefValue: ------- start " ++ showIdent i---      tcTrace $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr t---      tcTrace $ "tcDefValue: " ++ showEDefs [adef]-      teqns <- tcEqns True t eqns---      tcTrace ("tcDefValue: after\n" ++ showEDefs [adef, Fcn i teqns])---      cs <- gets constraints---      tcTrace $ "tcDefValue: constraints: " ++ show cs-      checkConstraints-      mn <- gets moduleName---      tcTrace $ "tcDefValue: " ++ showIdent i ++ " done"-      return $ Fcn (qualIdent' mn i) teqns-    PatBind p e -> tcPatBind PatBind p e-    ForImp ie i t -> do-      mn <- gets moduleName-      t' <- expandSyn t-      return (ForImp ie (qualIdent' mn i) t')-    Pattern{} -> impossible-    _ -> return adef--qualIdent' :: IdentModule -> Ident -> Ident-qualIdent' mn i | isInstId i = i-                | otherwise  = qualIdent mn i---- This is only used during inference.--- When doing type checking the actual Pattern definition will have been--- removed by expandPatSyn.--- The important thing here is the call to addPatSyn-tcPatSyn :: EDef -> T [EDef]-tcPatSyn (Pattern (ip, vks) p me) = do---  traceM $ "tcPatSyn: enter " ++ show (ip, vks, p, me)-  let step [] t = tcPat (Check t) p-      step (ik:iks) t = do-        (ti, tr) <- unArrow (getSLoc ik) t-        withExtVal (idKindIdent ik) ti $ step iks tr-  pty <- newUVar   -- invent a type-  (sks, dicts, _p) <- step vks pty-  let ctx2 = map snd dicts---  traceM $ "tcPatSyn: pat " ++ show (sks, ctx2)-  case me of Nothing -> pure (); Just e -> void $ tcEqns False pty e-  ctx1 <- getUnsolved---  traceM $ "tcPatSyn: ctx " ++ show ctx1-  ty0 <- addConstraints ctx2 <$> derefUVar pty-  let ctx1' = deleteFirstsBy eqEType ctx1 ctx2   -- remove provided from required-      (sks', sub) = tyVarSubst sks ty0           -- turn skolems-      ty1 = subst sub ty0                        --    into rigid tyvars-  ty2 <- quantify (metaTvs [ty1]) (addConstraints ctx1' ty1)-  let (vs, ty3) = unForall ty2-      ty4 = eForall' QImpl (sks' ++ vs) ty3      -- add the skolems tyvars-  ty5 <- canonPatSynType ty4---  traceM $ "tcPatSyn: tys " ++ show (ty0, ty1, ty2, ty3, ty4, ty5)-  addPatSyn ty5 ip---  traceM ("tcPatSyn: after " ++ show (ip, ty5))-  return [ Sign [ip] ty3 ]-tcPatSyn _ = impossible---- Add implicit forall-addForall :: QForm -> EType -> T EType-addForall _ t@EForall{} = return t-addForall expl t = do-  bvs <- stKeysLcl <$> gets valueTable         -- bound outside-  let fvs = freeTyVars [t]                     -- free variables in t-      -- these are free, and need quantification.  eDummy indicates missing kind-      iks = map (\ i -> IdKind i eDummy) (fvs \\ bvs)-  --when (not (null iks)) $ tcTrace ("addForall: " ++ show (t, eForall iks t))-  return $ eForall' expl iks t---- Add implicit forall and kind check, in type mode-tCheckTypeTImpl :: HasCallStack => QForm -> EType -> EType -> T EType-tCheckTypeTImpl expl tchk t = tCheckTypeT tchk =<< addForall expl t---- Check type in type mode-tCheckTypeT :: HasCallStack => EType -> EType -> T EType-tCheckTypeT = tCheck tcTypeT---- Infer type in type mode-tInferTypeT :: HasCallStack => EType -> T (EType, EKind)-tInferTypeT t = tInfer tcTypeT t---- Kind check a type while already in type checking mode-tcTypeT :: HasCallStack =>-           Expected -> EType -> T EType-tcTypeT mk t = assertTCMode (==TCType) $ tcExpr mk (dsType t)---- Kind check a type while in value checking mode-tcType :: HasCallStack =>-          Expected -> EType -> T EType-tcType mk = assertTCMode (==TCExpr) . withTypeTable . tcTypeT mk---- Sort check a kind while already in sort checking mode-tcKindT :: HasCallStack =>-           Expected -> EKind -> T EKind-tcKindT mk t =---  trace ("tcKindT: " ++ show (mk, t)) $-  assertTCMode (==TCKind) $ tcExpr mk t---- Sort check a kind while in type checking mode-tcKind :: HasCallStack =>-          Expected -> EKind -> T EKind-tcKind mk = assertTCMode (==TCType) . withTypeTable . tcKindT mk---- 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 simply given.-data Expected = Infer TRef | Check EType---  deriving(Show)--instance Show Expected where-  show (Infer r) = "(Infer " ++ show r ++ ")"-  show (Check t) = "(Check " ++ show t ++ ")"--tInfer :: forall a b . HasCallStack =>-          (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 :: HasCallStack =>-              Expr -> T (Typed Expr)-tInferExpr = tInfer tcExpr--tCheckExpr :: HasCallStack =>-              EType -> Expr -> T Expr-tCheckExpr t e | Just (ctx, t') <- getImplies t = do---  tcTrace $ "tCheckExpr: " ++ show (e, ctx, t')-  xt <- expandSyn t-  unless (eqEType t xt) undefined-  d <- newADictIdent (getSLoc e)-  e' <- withDict d ctx $ tCheckExprAndSolve t' e-  return $ eLam [EVar d] e'--tCheckExpr t e = tCheck tcExpr t e--tGetRefType :: HasCallStack =>-               TRef -> T EType-tGetRefType ref = do-  m <- gets uvarSubst-  case IM.lookup ref m of-    Nothing -> return (EUVar ref)-    Just t  -> return t---- Set the type for an Infer-tSetRefType :: HasCallStack =>-               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--tcExpr :: HasCallStack =>-          Expected -> Expr -> T Expr-tcExpr mt ae = tcExprR mt ae {-do-  tcTrace ("tcExpr enter: mt=" ++ show mt ++ " ae=" ++ showExpr ae)-  r <- tcExprR mt ae-  tcTrace ("tcExpr exit: " ++ showExpr r)-  return r -}-tcExprR :: HasCallStack =>-           Expected -> Expr -> T Expr-tcExprR mt ae =-  let { loc = getSLoc ae } in---  trace ("tcExprR " ++ show (ae, mt)) $-  case ae of-    EVar i | isIdent dictPrefixDollar i -> do-             -- Magic variable that just becomes the dictionary-             d <- newIdent (getSLoc i) dictPrefixDollar-             case mt of-               Infer _ -> impossible-               Check t -> addConstraint d t-             return (EVar d)--           | isDummyIdent i -> tcError loc "_ cannot be used as a variable"-           | 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---             tcTrace $ "EVar: " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t' ++ " mt=" ++ show mt-             instSigma loc e t' mt-    EQVar e t ->  -- already resolved, just instantiate-             instSigma loc e t mt--    EApp _ _ -> tcExprAp mt ae []--    EOper e ies -> tcOper e ies >>= tcExpr mt-    ELam _ qs -> tcExprLam mt loc qs-    ELit _ lit -> do-      tcm <- gets tcMode-      case tcm of-        TCType ->-          case lit of-            LStr _ -> instSigma loc (ELit loc lit) (tConI loc nameSymbol) mt-            LInteger _ -> instSigma loc (ELit loc lit) (tConI loc nameNat) mt-            _      -> impossible-        TCExpr -> do-          let getExpected (Infer _) = pure Nothing-              getExpected (Check t) = Just <$> derefUVar t-          case lit 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 (EVar v) | v == identInt     -> tcLit  mt loc (LInt (fromInteger i))-                              | v == identWord    -> tcLit' mt loc (LInt (fromInteger i)) (tConI loc nameWord)-                              | v == identFloatW  -> tcLit  mt loc (LDouble (fromInteger i))-                              | v == identInteger -> tcLit  mt loc lit-                _ -> do-                  (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromInteger"))-                  (_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 (EVar v) | v == mkIdent nameFloatW -> tcLit mt loc (LDouble (fromRational r))-                _ -> do-                  (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromRational"))-                  (_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-            -- This implements OverloadedStrings.  It causes a small slowdown (2%)-            LStr s -> do-              mex <- getExpected mt-              case mex of-                Just (EApp (EVar lst) (EVar c))-                 | lst == identList && c == identChar -> tcLit mt loc lit-                Just (EVar bs)-                 | bs == identByteString -> tcLit mt loc (LBStr s)-                _ -> do-                  (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromString"))-                  (_at, rt) <- unArrow loc ft-                  -- We don't need to check that _at is String, it's part of the fromString type.-                  --tcTrace ("LStr " ++ show (loc, r))-                  instSigma loc (EApp f ae) rt mt-            -- Not LInteger, LRat, LStr-            _ -> tcLit mt loc lit-        _ -> impossible-    ECase a arms -> do-      -- XXX should look more like EIf-      (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 ->-      case unTuple mt of-        Just ts | length ts == length es -> do-          ees <- zipWithM tCheckExpr ts es-          return (ETuple ees)-        _ -> do-          (ees, tes) <- mapAndUnzipM tInferExpr es-          let-            n = length es-            ttup = tApps (tupleConstr loc n) tes-          munify loc mt ttup-          return (ETuple ees)-    EParen e -> tcExpr mt e-    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-              nofail <- failureFree p-              let-                ibind = mkBuiltin loc ">>="-                sbind = maybe ibind (\ mn -> qualIdent mn ibind) mmn-                x = eVarI loc "$b"-                patAlt = [(p, simpleAlts $ EDo mmn ss)]-                failMsg s = EApp (EVar (mkBuiltin loc "fail")) (ELit loc (LStr s))-                failAlt =-                  if nofail then []-                  else [(eDummy, simpleAlts $ failMsg "bind")]-              tcExpr mt (EApp (EApp (EVar sbind) a)-                              (eLam [x] (ECase x (patAlt ++ failAlt))))-            SThen a -> do-              let-                ithen = mkBuiltin loc ">>"-                sthen = maybe ithen (\ mn -> qualIdent mn ithen) mmn-              tcExpr mt (EApp (EApp (EVar sthen) a) (EDo mmn ss))--            SLet bs ->-              tcExpr mt (ELet bs (EDo mmn ss))--    ESectL e i -> tcLSect e i >>= tcExpr mt-    ESectR i e -> tcRSect i e >>= tcExpr mt-    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'')--    -- Translate (if | a1; | a2 ...) into-    --           (case [] of _ | a1; | a2 ...)-    EMultiIf a ->-      case a of-        EAlts [([], e)] [] -> tcExpr mt e-        _                  -> tcExpr mt $ ECase (EListish (LList [])) [(EVar (mkIdent "_"), a)]--    EListish (LList es) ->-      case unList mt of-        Just t -> do-          es' <- mapM (tCheckExpr t) es-          return (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-{--      -- As a hack, translate 'e :: T' to 'let s$999 :: T; s$999 = e in s$999'-      -- This will ensure that dictinaries are inserted in the right place.-      i <- newIdent (getSLoc e) "s"-      tcExpr mt $ ELet [Sign [i] t, Fcn i $ eEqns [] e] (EVar i)--}-      -- XXX wrong for kind signatures-      t' <- withTypeTable $ tCheckTypeTImpl QImpl kType t >>= expandSyn-      case splitContext t' of-        -- No context, handle this without a 'let' to avoid bloat.-        ([], [], _) -> do-          e' <- instSigma loc e t' mt-          tCheckExpr t' e'-        _ -> do-          -- We have a forall/context.  As a hack, translate 'e :: T' to-          -- let s$999 :: T; s$999 = e in s$999-          -- This will ensure that dictinaries are inserted in the right place.-          -- XXX Maybe it would be better to have this as part of the code above?-          -- Or maybe do this rewrite all the time?-          i <- newIdent (getSLoc e) "s"-          let et = ELet [Sign [i] t, Fcn i $ eEqns [] e] (EVar i)-          tcExpr mt et--    -- Only happens in type&kind checking mode.-    EForall b vks t ->---      assertTCMode (==TCType) $-      withVks vks $ \ vks' -> do-        tt <- tcExpr mt t-        derefUVar (EForall b vks' tt)-    EUpdate e flds -> do-      ises <- concat <$> mapM (dsEField e) flds-      me <- dsUpdate unsetField e ises-      case me of-        Just e' -> tcExpr mt e'-        Nothing -> tcExpr mt $ foldr eSetFields e ises-    ESelect is -> do-        let x = eVarI loc "$x"-        tcExpr mt $ eLam [x] $ foldl (\ e i -> EApp (eGetField i) e) x is-    ETypeArg _ ->-        tcError loc "Bad type application"-    _ -> error $ "tcExpr: cannot handle: " ++ show (getSLoc ae) ++ " " ++ show ae-      -- impossible--tcExprAp :: HasCallStack =>-            Expected -> Expr -> [Expr] -> T Expr---tcExprAp _ ae args | trace ("tcExprAp: " ++ show (ae, args)) False = undefined-tcExprAp mt ae args = do-  case ae of-    EApp f a -> tcExprAp mt f (a : args)-    EParen f -> tcExprAp mt f args-    EOper e ies -> tcOper e ies >>= \ eop -> tcExprAp mt eop args-    EVar i | isIdent dictPrefixDollar i -> impossibleShow ae-           | isDummyIdent i -> impossibleShow ae-           | otherwise -> do-             -- Type checking an expression (or type)-             (fn, t) <- tLookupV i---             traceM ("tcExprAp " ++ show (fn, t))-             -- 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---             tcTrace $ "exExprAp: EVar " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t' ++ " mt=" ++ show mt-             case fn of-               EVar ii | ii == mkIdent "Data.Function.$", f:as <- args -> tcExprAp mt f as-               _ -> tcExprApFn mt fn t' args-    EQVar f t ->  -- already resolved-      tcExprApFn mt f t args-    _ -> do-      (f, t) <- tInferExpr ae-      tcExprApFn mt f t args--tcExprApFn :: HasCallStack =>-              Expected -> Expr -> EType -> [Expr] -> T Expr---tcExprApFn mt fn fnt args | trace ("tcExprApFn: " ++ show (fn, fnt, args, mt)) False = undefined-tcExprApFn mt fn (EForall q (IdKind i k:iks) ft) (arg : args) | Just t <- qarg q arg = do-  t' <- if t `eqEType` EVar dummyIdent-        then newUVar-        else tcType (Check k) t >>= expandSyn-  tcExprApFn mt fn (subst [(i, t')] $ eForall' q iks ft) args- where qarg QReqd t            = Just t-       qarg _     (ETypeArg t) = Just t-       qarg _     _            = Nothing-tcExprApFn mt fn atfn aargs = do---  traceM $ "tcExprApFn: " ++ show (mt, fn, tfn, aargs)---  xx <- gets ctxTables---  traceM $ "tcExprApFn: ctxTables=" ++ show xx-  let loc = getSLoc fn-  (ctxs, tfn') <- tInstDelay atfn---  traceM $ "tcExprApFn: (fn', tfn') = " ++ show (fn', tfn')-  let loop ats     [] ft = final ats ft-      loop ats as@(_:_) (EForall _ vks ft) = do-        ft' <- tInstForall vks ft-        loop ats as ft'-      loop ats (a:as) ft = do-        (at, rt) <- unArrow loc ft-        loop ((a, at):ats) as rt--      final aats rt = do--        -- We want to do the unification of rt ant mt before checking the argument to-        -- have more type information.  See tests/Eq1.hs.-        -- But instSigma may transform the input expression, so we have to be careful.-        let etmp = EUVar ugly-            ugly = -1::Int-        etmp' <- instSigma loc etmp rt mt--        args <- mapM (uncurry checkSigma) (reverse aats)-        dicts <- mapM (newDict loc) ctxs-        let res = foldl EApp fn (dicts ++ args)---        traceM (show res)----        cc <- gets constraints---        traceM $ "tcExprApFn: constraints=" ++ show cc--        case etmp' of-          EUVar _ -> return res   -- instSigma did nothing, this is the common case-          _ -> return $ substEUVar [(ugly, res)] etmp'--        instSigma loc res rt mt--  loop [] aargs tfn'---- Is a pattern failure free?-failureFree :: EPat -> T Bool-failureFree p@(EVar _) = failureFreeAp [] p-failureFree p@(EApp _ _) = failureFreeAp [] p-failureFree (ETuple ps) = and <$> mapM failureFree ps-failureFree (ESign p _) = failureFree p-failureFree (EAt _ p) = failureFree p-failureFree (ELazy True _) = return True-failureFree (ELazy False p) = failureFree p-failureFree (EViewPat _ p) = failureFree p-failureFree (EParen p) = failureFree p-failureFree _ = return False--failureFreeAp :: [Bool] -> EPat -> T Bool-failureFreeAp bs (EApp f a) = do-  b <- failureFree a-  failureFreeAp (b:bs) f-failureFreeAp bs (EVar v) | not (isConIdent v) = return True-                          | otherwise = do-                              (con, _) <- tLookupV v-                              return $ case con of-                                ECon (ConNew _ _) -> and bs-                                ECon (ConData [_] _ _) -> and bs  -- single constructor-                                _ -> False-failureFreeAp bs (ESign p _) = failureFreeAp bs p-failureFreeAp _ _ = return False  -- bad pattern, just ignore--eSetFields :: EField -> Expr -> Expr-eSetFields (EField is e) r =-  let loc = getSLoc is-      eCompose = EVar $ mkBuiltin loc "composeSet"-      has = map eHasField $ init is-      set1 = eSetField (last is)-      set = foldr (EApp . EApp eCompose) set1 has-  in  EApp (EApp set r) e-eSetFields _ _ = impossible--eHasField :: Ident -> Expr-eHasField i = EApp (EVar ihas) (eProxy i)-  where ihas = mkBuiltin (getSLoc i) "hasField"--eSetField :: Ident -> Expr-eSetField i = EApp (EVar iset) (eProxy i)-  where iset = mkBuiltin (getSLoc i) "setField"--eGetField :: Ident -> Expr-eGetField i = EApp (EVar iget) (eProxy i)-  where iget = mkBuiltin (getSLoc i) "getField"--eProxy :: Ident -> Expr-eProxy i = ESign proxy (EApp proxy (ELit loc (LStr (unIdent i))))-  where proxy = EVar $ mkBuiltin loc "Proxy"-        loc = getSLoc i--dsEFieldsBind :: EBind -> T EBind-dsEFieldsBind (PatBind p e) = PatBind <$> dsEFields p <*> return e-dsEFieldsBind b = return b--dsEField :: Expr -> EField -> T [EField]-dsEField _ e@(EField _ _) = return [e]-dsEField _ (EFieldPun is) = return [EField is $ EVar (last is)]-dsEField e EFieldWild = do-  (e', _) <- tInferExpr e-  case e' of-    ECon c -> return [ EField [f] (EVar f) | f <- conFields c ]-    _ -> tcError (getSLoc e) "record wildcard not allowed"---- Patterns need to expand EFieldWild before type checking-dsEFields :: EPat -> T EPat-dsEFields apat =-  case apat of-    EVar _ -> return apat-    EApp p1 p2 -> EApp <$> dsEFields p1 <*> dsEFields p2-    EOper p1 ips -> EOper <$> dsEFields p1 <*> mapM (\ (i, p2) -> (,) i <$> dsEFields p2) ips-    ELit _ _ -> return apat-    ETuple ps -> ETuple <$> mapM dsEFields ps-    EListish (LList ps) -> EListish . LList <$> mapM dsEFields ps-    ESign p t -> ESign <$> dsEFields p <*> pure t-    EAt i p -> EAt i <$> dsEFields p-    EViewPat e p -> EViewPat e <$> dsEFields p-    ELazy z p -> ELazy z <$> dsEFields p-    ECon _ -> return apat-    EUpdate c fs -> EUpdate c . concat <$> mapM (dsEField c) fs-    EParen p -> dsEFields p-    ENegApp _ -> return apat-    EOr ps -> EOr <$> mapM dsEFields ps-    _ -> error $ "dsEFields " ++ show apat--unsetField :: Ident -> Expr-unsetField i = mkExn (getSLoc i) (unIdent i) "recConError"--dsUpdate :: (Ident -> Expr) -> Expr -> [EField] -> T (Maybe Expr)-dsUpdate unset e flds = do-  (e', _) <- tInferExpr e-  case e' of-    ECon c -> do-      let ises = map unEField flds-          fs = conFields c-          ies = map (first head) ises-          is = map fst ies-          as = map field fs-          field i = fromMaybe (unset i) $ lookup i ies-      case filter ((> 1) . length . fst) ises of-        (i:_, _):_ -> tcError (getSLoc i) "Nested fields not allowed"-        _ -> return ()-      case is \\ fs of-        vs@(v:_) -> tcError (getSLoc v) $ "extra field(s) " ++ unwords (map unIdent vs)-        _ -> return ()-      return $ Just $ eApps e as-    _ -> return Nothing--enum :: SLoc -> String -> [Expr] -> Expr-enum loc f = eApps (EVar (mkBuiltin loc ("enum" ++ f)))--tcLit :: HasCallStack => Expected -> SLoc -> Lit -> T Expr-tcLit mt loc l@(LPrim _) = newUVar >>= tcLit' mt loc l-tcLit mt loc l@(LExn  _) = 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 nameFloatW-          LChar _    -> tConI loc nameChar-          LStr _     -> tApp (tList loc) (tConI loc nameChar)-          LBStr _    -> tConI loc nameByteString-          _          -> 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 :: HasCallStack =>-          Expr -> [(Ident, Expr)] -> T Expr-tcOper ae aies = do-  fixs <- gets fixTable-  let-    opfix :: (Ident, Expr) -> T ((Expr, Fixity), Expr)-    opfix (i, e) = do-      (ei, _) <- tLookupV i-      let fx = getFixity fixs (getAppCon ei)-      return ((EVar i, fx), e)--  ites <- mapM opfix aies-  case resolveFixity ae ites of-    Left (loc, err) -> tcError loc err-    Right e -> return e--tcLSect :: Expr -> Ident -> T Expr-tcLSect (EOper e ies) op = do-  let x = eVarI loc "$x"-      loc = getSLoc op-  e' <- tcOper e (ies ++ [(op, x)])-  case e' of-    EApp f x' | x' `eqExpr` x -> return f-    _                   -> tcError loc "Bad section fixity"-tcLSect e op =-  return (EApp (EVar op) e)--tcRSect :: Ident -> Expr -> T Expr-tcRSect op (EOper e ies) = do-  let x = eVarI loc "$x"-      loc = getSLoc op-  e' <- tcOper x ((op, e):ies)-  case e' of-    EApp (EApp _ x') _ | x `eqExpr` x' -> return (eLam [x] e')-    _                            -> tcError loc "Bad section fixity"-tcRSect op e = do-  let x = eVarI (getSLoc op) "$x"-  return (eLam [x] (EApp (EApp (EVar op) x) e))--unArrow :: HasCallStack =>-           SLoc -> EType -> T (EType, EType)---unArrow _ t | trace ("unArrow: " ++ show t) False = undefined-unArrow loc (EForall _ iks t) = do-  -- Found forall in a co-variant position.-  -- Make new unique tyvars in case of clashes.-  -- XXX Is this correct?-  (_, t') <- shallowSkolemise iks t-  unArrow loc t'-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)--unTuple :: Expected -> Maybe [EType]-unTuple (Infer _) = Nothing-unTuple (Check t) = loop [] t-  where loop ts (EApp f a) = loop (a:ts) f-        loop ts (EVar i) | Just n <- getTupleConstr i, length ts == n = Just ts-        loop _ _ = Nothing--unList :: Expected -> Maybe EType-unList (Check (EApp (EVar i) t)) | i == identList = Just t-unList _ = Nothing--getFixity :: FixTable -> Ident -> Fixity-getFixity fixs i = fromMaybe (AssocLeft, 9) $ M.lookup i fixs--newADictIdent :: SLoc -> T Ident-newADictIdent loc = newIdent loc adictPrefix--newDictIdent :: SLoc -> T Ident-newDictIdent loc = newIdent loc dictPrefix--tcExprLam :: HasCallStack => Expected -> SLoc -> [Eqn] -> T Expr-tcExprLam mt loc qs = do-  t <- tGetExpType mt-  ELam loc <$> tcEqns False t qs--tcEqns :: HasCallStack => Bool -> EType -> [Eqn] -> T [Eqn]-tcEqns top t eqns = tcEqns' top t [] eqns--tcEqns' :: HasCallStack => Bool -> EType -> [IdKind] -> [Eqn] -> T [Eqn]---tcEqns _ t eqns | trace ("tcEqns: " ++ showEBind (Fcn dummyIdent eqns) ++ " :: " ++ show t) False = undefined-tcEqns' top (EForall QExpl iks t) reqd eqns = withExtTyps iks $ tcEqns' top t reqd eqns-tcEqns' top (EForall QImpl   _ t) reqd eqns =                   tcEqns' top t reqd eqns-tcEqns' top (EForall QReqd iks t) reqd eqns =                   tcEqns' top t (reqd ++ iks) eqns-tcEqns' top t reqd eqns | Just (ctx, t') <- getImplies t = do-  let loc = getSLoc eqns-  d <- newADictIdent loc-  f <- newIdent loc "fcnD"-  withDict d ctx $ do-    eqns' <- tcEqns' top t' reqd eqns-    let eqn =-          case eqns' of-            [Eqn [] alts] -> Eqn [EVar d] alts-            _             -> Eqn [EVar d] $ EAlts [([], EVar f)] [Fcn f eqns']-    return [eqn]-tcEqns' top t reqd eqns = do-  let loc = getSLoc eqns-  f <- newIdent loc "fcnS"-  (eqns', ds) <- solveAndDefault top $ mapM (tcEqn t reqd) eqns---  tcTrace $ "tcEqns done: " ++ showEBind (Fcn dummyIdent eqns')-  case ds of-    [] -> return eqns'-    _  -> do-      let-        bs = eBinds ds-        eqn = Eqn [] $ EAlts [([], EVar f)] (bs ++ [Fcn f eqns'])-      return [eqn]--tcEqn :: HasCallStack => EType -> [IdKind] -> Eqn -> T Eqn---tcEqn t eqn | trace ("tcEqn: " ++ show eqn ++ " :: " ++ show t) False = undefined-tcEqn t (IdKind a k : iks) eqn@(Eqn ps alts) =-  case ps of-    EVar i : ps' -> withExtTyps [IdKind i k] $ do-      addEqDict (EVar a) (EVar i)     -- This bound type variable is actually equal to the one in the signature-      tcEqn t iks (Eqn ps' alts)-    _ -> tcError (getSLoc eqn) "Bad required type argument"-tcEqn t [] (Eqn ps alts) =-  tcPats t ps $ \ t' ps' -> do---      tcTrace $ "tcEqn " ++ show ps ++ " ---> " ++ show ps'-    alts' <- tcAlts t' alts-    return (Eqn ps' alts')---- Only used above-tcPats :: HasCallStack =>-          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 :: HasCallStack => EType -> EAlts -> T EAlts-tcAlts t (EAlts alts bs) =---  trace ("tcAlts: bs in " ++ showEBinds bs) $-  tcBinds bs $ \ bs' -> do---    tcTrace ("tcAlts: bs out " ++ showEBinds bbs)-    alts' <- mapM (tcAlt t) alts-    return (EAlts alts' bs')--tcAlt :: HasCallStack => 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 :: HasCallStack => 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 = [Fcn i $ simpleEqn e | (i, e) <- ds]--instPatSigma :: HasCallStack =>-                 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 :: HasCallStack =>-              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 (`elem` esc_tvs) skol_tvs-  unless (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 app ta = do---  tcTrace $ "tCheckPatC: " ++ show app ++ " :: " ++ show t-  app' <- dsEFields app-  let vs = patVars app'-  multCheck vs-  env <- mapM (\ v -> (,) v <$> newUVar) vs-  withExtVals env $ do-    (_sks, ds, pp) <- tCheckPat t app'---    tcTrace ("tCheckPatC: " ++ show pp)---    xt <- derefUVar t---    tcTrace ("tCheckPatC ds=" ++ show ds ++ "t=" ++ show xt)-    -- 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-      lit = tcPat mt (EViewPat (EApp (EVar (mkBuiltin loc "==")) ae) (eTrue loc))-      isNeg (EVar i) = i == mkBuiltin loc "negate"-      isNeg _ = False-  in-  case ae of-    EVar i | isDummyIdent i -> do-               -- _ can be anything, so just ignore it-               _ <- tGetExpType mt-               return ([], [], ae)-           | not (isConIdent i) -> do-               -- All pattern variables are in the environment as-               -- type references.  Assign the reference the given type.-               ext <- tGetExpType mt-               (p, t) <- tLookupV i-               unify loc t ext-               return ([], [], p)-           | otherwise -> tcPatAp mt [] ae-    EQVar _ _ -> tcPatAp mt [] ae-    EApp f _-           | isNeg f   -> lit            -- if it's (negate e) it must have been a negative literal-           | otherwise -> tcPatAp mt [] ae--    EOper e ies -> do e' <- tcOper e ies; tcPat mt e'--    ETuple es -> do-      let-        n = length es-      (xs, tes) <- mapAndUnzipM 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)--    EParen e -> tcPat mt e--    EListish (LList es) -> do-      te <- newUVar-      munify loc mt (tApp (tList loc) te)-      xs <- mapM (tCheckPat te) es-      case unzip3 xs of-        (sks, ds, es') -> return (concat sks, concat ds, EListish (LList es'))--    ELit _ _ -> lit--    ESign e t -> do-      t' <- tcType (Check kType) t >>= expandSyn-      instPatSigma loc t' mt-      tCheckPat t' e--    EAt i p -> do-      (_, ti) <- tLookupV i-      (sk, d, p') <- tcPat mt p-      tt <- tGetExpType mt-      case ti of-        EUVar r -> tSetRefType loc r tt-        _ -> impossible-      return (sk, d, EAt i p')--    EViewPat e p -> do-      (e', ter) <--        case mt of-          Infer _ -> do-            (e', te) <- tInferExpr e-            (tea, ter) <- unArrow loc te-            munify loc mt tea-            return (e', ter)-          Check tea -> do-            ter <- newUVar-            e' <- tCheckExpr (tea `tArrow` ter) e-            return (e', ter)-      (sk, d, p') <- tcPat (Check ter) p-      return (sk, d, EViewPat e' p')--    ELazy z p -> do-      (sk, d, p') <- tcPat mt p-      return (sk, d, ELazy z p')--    -- Allow C{} syntax even for non-records-    EUpdate p [] -> do-      (p', _) <- tInferExpr p-      case p' of-        ECon c -> tcPat mt $ eApps p (replicate (conArity c) eDummy)-        _      -> impossible-    EUpdate p isps -> do-      me <- dsUpdate (const eDummy) p isps-      case me of-        Just p' -> tcPat mt p'-        Nothing -> impossible--    EOr ps -> do-      let orFun = ELam noSLoc $ [ eEqn [p] true | p <- ps] ++ [ eEqn [eDummy] (eFalse loc) ]-          true = eTrue loc-      tcPat mt $ EViewPat orFun true--    _ -> error $ "tcPat: not handled " ++ show (getSLoc ae) ++ " " ++ show ae---- The expected type is for (eApps afn (reverse args))-tcPatAp :: HasCallStack =>-           Expected -> [EPat] -> EPat -> T EPatRet---tcPatAp mt args afn | trace ("tcPatAp: " ++ show (mt, args, afn)) False = undefined-tcPatAp mt args afn =-  case afn of-    EVar i | isConIdent i -> do-      (con, xpt) <- tLookupV i-      tcPatApCon mt args con xpt--    EQVar con xpt -> tcPatApCon mt args con xpt--    EApp f a -> tcPatAp mt (a:args) f--    EParen e -> tcPatAp mt args e--    _ -> tcError (getSLoc afn) ("Bad pattern " ++ show afn)--tcPatApCon :: Expected -> [EPat] -> EPat -> EType -> T EPatRet-tcPatApCon mt args con xpt = do-  let loc = getSLoc con-      nargs = length args-      checkArity ary | nargs < ary = tcError loc "too few arguments"-                     | nargs > ary = tcError loc "too many arguments"-                     | otherwise   = return ()-  case con of-    -- Pattern synonym-    ECon (ConSyn qi n (e, t)) -> do-      checkArity n-      let (_, yes, _) = mkMatchDataTypeConstr (mkPatSynMatch qi) xpt-          vp = EViewPat (EQVar e t) (eApps yes args)-      --traceM ("patsyn " ++ show vp)-      tcPat mt vp--    -- Regular constructor-    _ -> do-      case xpt of-         -- Sanity check-         EForall _ _ EForall{} -> return ()-         _ -> impossibleShow con-      EForall _ avs apt <- tInst' xpt--      (sks, spt) <- shallowSkolemise avs apt-      (df, pf, pt) <--        case getImplies spt of-          Nothing -> return ([], con, apt)-          Just (ctx, pt') -> do-            di <- newADictIdent loc-            return ([(di, ctx)], EApp con (EVar di), pt')--      let ary = arity pf-            where arity (ECon c) = conArity c-                  arity (EApp f _) = arity f - 1  -- deal with dictionary added above-                  arity e = impossibleShow e-      checkArity ary--      let step [] t r = return (t, r)-          step (a:as) t (sk, d, f) = do-            (at, rt) <- unArrow loc t-            (ska, da, a') <- tCheckPat at a-            step as rt (ska ++ sk, da ++ d, EApp f a')-      (tt, (skr, dr, pr)) <- step args pt (sks, df, pf)--      pp <- case mt of-              Check ext -> subsCheck loc pr ext tt-              Infer r   -> do { tSetRefType loc r tt; return pr }-      return (skr, dr, pp)--eTrue :: SLoc -> Expr-eTrue l = EVar $ mkBuiltin l "True"--eFalse :: SLoc -> Expr-eFalse l = EVar $ mkBuiltin l "False"--multCheck :: [Ident] -> T ()-multCheck vs =-  when (anySame vs) $ do-    let v = head vs-    tcError (getSLoc v) $ "Multiply defined: " ++ showIdent v--tcBinds :: HasCallStack =>-           [EBind] -> ([EBind] -> T a) -> T a-tcBinds xbs ta = withFixes [ (i, fx) | Infix fx is <- xbs, i <- is ] $ do-  xbs' <- mapM dsEFieldsBind xbs-  let-    tmap = M.fromList [ (i, t) | Sign is t <- xbs', i <- is ]-    xs = getBindsVars xbs'-  multCheck xs-  xts <- mapM (tcBindVarT tmap) xs-  withExtVals xts $ do-    nbs <- mapM tcBind xbs'-    ta nbs---- Temporarily extend the fixity table-withFixes :: [FixDef] -> T a -> T a-withFixes [] ta = ta-withFixes fixs ta = do-  oft <- gets fixTable-  modify $ \ st -> st{ fixTable = foldr (uncurry M.insert) oft fixs }-  a <- ta-  modify $ \ st -> st{ fixTable = oft }-  return a--tcBindVarT :: HasCallStack => 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 $ tCheckTypeTImpl QImpl kType t >>= expandSyn-      return (x, tt)--tcBind :: EBind -> T EBind-tcBind abind =-  case abind of-    Fcn i eqns -> do-      (_, tt) <- tLookupV i-      teqns <- tcEqns False tt eqns-      return $ Fcn i teqns-    PatBind p a -> tcPatBind PatBind p a-    _ -> return abind--tcPatBind :: (EPat -> Expr -> a) -> EPat -> Expr -> T a-tcPatBind con 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 $ con ep ea----- 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)-    EParen t -> dsType t-    ESign t k -> ESign (dsType t) k-    EForall b iks t -> EForall b iks (dsType t)-    ELit _ (LStr _) -> at-    ELit _ (LInteger _) -> at-    EQVar _ _ -> at-    _ -> impossibleShow at--tListI :: SLoc -> Ident-tListI loc = mkIdentSLoc loc nameList--tList :: SLoc -> EType-tList = tCon . tListI--tBool :: SLoc -> EType-tBool loc = tConI loc $ boolPrefix ++ "Bool"--showTModule :: forall a . (a -> String) -> TModule a -> String-showTModule sh amdl = "Tmodule " ++ showIdent (tModuleName amdl) ++ "\n" ++ sh (tBindingsOf amdl) ++ "\n"---------------------------------------------------------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)--tyVarSubst :: [a] -> EType -> ([IdKind], [(a, EType)])-tyVarSubst tvs ty =-  let usedVars = allVarsExpr ty -- Avoid used type variables-      newVars = take (length tvs) (allBinders \\ usedVars)-      newVarsK = map (\ i -> IdKind i noKind) newVars-      noKind = eDummy-  in  (newVarsK, zipWith (\ tv n -> (tv, EVar n)) tvs newVars)---- Quantify over the specified type variables.--- The type should be zonked.-quantify :: [TRef] -> Rho -> T Sigma-quantify [] ty = return ty-quantify tvs ty = do-  let (newVarsK, sub) = tyVarSubst tvs ty-  osubst <- gets uvarSubst-  mapM_ (uncurry setUVar) sub-  ty' <- derefUVar ty-  putUvarSubst osubst  -- reset the setUVar we did above-  return (EForall QImpl newVarsK ty')---- 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 :: HasCallStack =>-             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))--metaTvs :: [EType] -> [TRef]--- Get the MetaTvs from a type; no duplicates in result-metaTvs tys = foldr go [] tys-  where-    go (EUVar tv) acc-      | tv `elem` 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 (ELit _ _) acc = acc-    go _ _ = impossible--{--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 :: HasCallStack =>-              Expr -> Sigma -> T Expr-checkSigma expr sigma = do-  (skol_tvs, rho) <- skolemise sigma---  sigma' <- derefUVar sigma---  tcTrace $ "**** checkSigma: " ++ show expr ++ " :: " ++ show sigma ++ " = " ++ show sigma' ++ " " ++ show skol_tvs-  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 (`elem` esc_tvs) skol_tvs-    unless (null bad_tvs) $-      tcErrorTK (getSLoc expr) $ "not polymorphic enough: " ++ unwords (map showIdent bad_tvs)-    return expr'--subsCheckRho :: HasCallStack =>-                SLoc -> Expr -> Sigma -> Rho -> T Expr---subsCheckRho _ e1 t1 t2 | trace ("subsCheckRho: " ++ show e1 ++ " :: " ++ show t1 ++ " = " ++ show t2) False = undefined--- XXX Is this even right?  It's not part of the paper.-subsCheckRho loc exp1 (EForall _ vs1 t1) (EForall _ vs2 t2) | length vs1 == length vs2 = do-  let sub = [(v1, EVar v2) | (IdKind v1 _, IdKind v2 _) <- zip vs1 vs2]-  unify loc (subst sub t1) t2-  return exp1-subsCheckRho loc exp1 sigma1@EForall{} rho2 = do -- Rule SPEC-  (exp1', rho1) <- tInst exp1 sigma1-  subsCheckRho loc exp1' rho1 rho2-subsCheckRho loc exp1 arho1 rho2 | Just _ <- getImplies arho1 = do-  (exp1', rho1) <- tInst exp1 arho1-  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---  tcTrace $ "subsCheckRho: MONO " ++ show (tau1, tau2)-  unify loc tau1 tau2 -- Revert to ordinary unification-  return exp1--subsCheckFun :: HasCallStack =>-                SLoc -> Expr -> Sigma -> Rho -> Sigma -> Rho -> T Expr-subsCheckFun loc e1 a1 r1 a2 r2 = do-  _ <- subsCheck loc eCannotHappen a2 a1   -- XXX-  subsCheckRho loc e1 r1 r2--instSigma :: HasCallStack =>-             SLoc -> Expr -> Sigma -> Expected -> T Expr-instSigma loc e1 t1 (Check t2) = do-  --tcTrace ("instSigma: Check e1=" ++ show e1 ++ " t1=" ++ showEType t1 ++ " t2=" ++ showEType t2)-  subsCheckRho loc e1 t1 t2-instSigma loc e1 t1 (Infer r) = do-  --tcTrace ("instSigma: Infer e1=" ++ show e1 ++ " t1=" ++ showEType t1 ++ " r=" ++ show r)-  (e1', t1') <- tInst e1 t1-  --tcTrace ("instSigma: Infer " ++ showEType t1 ++ " ==> " ++ showEType t1')-  tSetRefType loc r t1'-  return e1'--eCannotHappen :: Expr-eCannotHappen = --undefined-                EVar $ mkIdent "cannot-happen"-------------- Pattern synonyms look like---   pattern P :: forall a1...an . ctxr => forall b1...bm . ctxp => t1 -> ... -> ti -> t---   pattern P x1...xi <- p where P = e--- (this type is the canonicalized type, generated by canonPatSynType).--- The synonym is translated into a builder, a matcher and a type.--- Each synonym use is replaced by a simple view pattern.------ The builder is simple.  It gets the same name and type as the pattern synonym,--- and the definition is the one provided in the definition.---   P :: forall a1...an . ctxr => forall b1...bm . ctxp => t1 -> ... ti -> t---   P = e------ The matcher needs to account for possible existentials so we get a data type--- for the match result that can have existentials.---   data P%T a1...an = forall b1...bm . ctxp => M t1 ... ti---                    | N------ The matcher itself has the required part of the synonym type, whereas--- the provided part is in the data type.  The matcher simply matches on the given pattern.---   P% :: forall a1...an . ctxr => t -> P%T a1...an---   P% p = M x1...xi---   P% _ = N--- So when the synonym P matches the matcher P% will return the M constructor--- of the P%T type, and then N constructor when there is no match.------ Each use of the pattern synonym---   P p1...pi--- is replaced by---   (P% -> M p1...pi)------ The data type, P%T, is not entered into any symbol tables.--- The matcher, P%, is in the symbol table, but is not part of the exported symbols.--- The transformed expression simply carries enough information about the types--- (using EQVar).  The exported ECon for P has this information.-----emptyCtx :: EConstraint-emptyCtx = EVar $ tupleConstr noSLoc 0--isEmptyCtx :: EConstraint -> Bool-isEmptyCtx (EVar i) = i == tupleConstr noSLoc 0-isEmptyCtx _ = False---- Expand a pattern synonym into the builder and matcher definitions.--- Removes that actual pattern definition-expandPatSyn :: EDef -> T [EDef]-expandPatSyn (Pattern (i, vks) p me) = do-  (_, t) <- tLookup "type signature" i-  (im, qim) <- addPatSynMatch i t-  let (ddata, yes, no) = mkMatchDataTypeConstr qim t-      mexp = fmap (Fcn i) me-      pat = Fcn im [ eEqn [p] match-                   , eEqn [eDummy] no]-      match = eApps yes (map (EVar . idKindIdent) vks)-      dname = case ddata of Data (n, _) _ _ -> n; _ -> impossible-  kvar <- newUVar    -- We don't care about the kind-  withTypeTable $ extValQTop dname kvar-  pure $ maybeToList mexp ++ [pat, ddata]-expandPatSyn d = pure [d]---- Add the matcher for a pattern synonym to the symbol table.--- Return the added identifier.-addPatSynMatch :: Ident -> EType -> T (Ident, Ident)-addPatSynMatch i at = do-  mn <- gets moduleName-  let ip = mkPatSynMatch i-      qip = qualIdent mn ip-  extValETop ip (mkPatSynMatchType qip at) (EVar qip)-  return (ip, qip)--mkPatSynMatchType :: Ident -> EType -> EType-mkPatSynMatchType qip at =-  let (vks1, ctx1, _vks2, _ctx2, ty) = splitPatSynType at-      (_ats, rt) = getArrows ty-      pstycon = mkMatchDataTypeName qip-  in  eForall vks1 $ etImplies ctx1 $ rt `tArrow` tApps pstycon (map (EVar . idKindIdent) vks1)---- Given the (qualified) name of a synonym and its type generate:--- match-constructor, nomatch-constructor-mkMatchDataTypeConstr :: HasCallStack => Ident -> EType -> (EDef, Expr, Expr)-mkMatchDataTypeConstr qi at =-  let (vks1, _ctx1, vks2, ctx2, ty) = splitPatSynType at-      (ats, _rt) = getArrows ty-      n = length ats-      mi = addIdentSuffix qi "M"-      ni = addIdentSuffix qi "N"-      cti = [ (mi, n + if isEmptyCtx ctx2 then 0 else 1), (ni, 0) ]-      conm = ConData cti mi []-      conn = ConData cti ni []-      tycon = mkMatchDataTypeName qi-      tr = tApps tycon $ map (EVar . idKindIdent) vks1-      tn = EForall QExpl vks1 $ EForall QExpl [] tr-      tm = EForall QExpl vks1 $ EForall QExpl vks2 $ etImplies ctx2 $ foldr tArrow tr ats--      ddata = Data lhs [cm, cn] []-            where lhs = (unQualIdent tycon, vks1)-                  cm = Constr vks2 (if isEmptyCtx ctx2 then [] else [ctx2]) (unQualIdent mi) (Left $ map ((,) False) ats)-                  cn = Constr []   []                                       (unQualIdent ni) (Left [])--  in  -- trace ("M :: " ++ show tm ++ ",  N :: " ++ show tn) $-      -- trace (showEDefs [ddata]) $-      (ddata, EQVar (ECon conm) tm, EQVar (ECon conn) tn)--mkPatSynMatch :: Ident -> Ident-mkPatSynMatch i = addIdentSuffix i "%"--mkMatchDataTypeName :: Ident -> Ident-mkMatchDataTypeName i = addIdentSuffix i "T"--isMatchDataTypeName :: Ident -> Bool-isMatchDataTypeName = isSuffixOf "%T" . unIdent---- A pattern synonym always has a type of the form---  forall vs1 . ctx1 => forall vs2 . ctx2 => ty---         required             provided--- The input has forall inserted, but the implicit forall--- may be in the wrong place.-canonPatSynType :: EType -> T EType-canonPatSynType at = do-  let mkTyp rVks rCtx pVks pCtx ty =-        EForall QExpl rVks $ tImplies rCtx $-        EForall QExpl pVks $ tImplies pCtx ty-      getImplies' :: EType -> (EConstraint, EType)-      getImplies' ty = fromMaybe (emptyCtx, ty) $ getImplies ty--  case at of-    EForall QImpl vks t0 -> do-      -- Implicit forall, the xs need to be split between required and provided.-      let (reqCtx, t1) = getImplies' t0-          (proCtx, t2) = getImplies' t1-          proVs = freeTyVars [proCtx]-          (proVks, reqVks) = partition ((`elem` proVs) . idKindIdent) vks---      traceM "%%% implicit"-      pure $ mkTyp reqVks reqCtx proVks proCtx t2--    EForall _ reqVks t0 -> do   -- QExpl/QReqd-      -- Explicit forall-      let (reqCtx, t1) = getImplies' t0-          (proVks, t2) = unForall t1-          (proCtx, t3) = getImplies' t2---      traceM "%%% explicit"-      pure $ mkTyp reqVks reqCtx proVks proCtx t3--    ty -> do-      -- No forall at all.  XXX doesn't work with nullary classes---      traceM "%%% none"-      pure $ mkTyp [] emptyCtx [] emptyCtx ty--splitPatSynType :: EType -> ([IdKind], EConstraint, [IdKind], EConstraint, EType)-splitPatSynType (EForall _ vks1 t0)-  | Just  (ctx1, EForall _ vks2 t1) <- getImplies t0-  , Just  (ctx2, ty) <- getImplies t1-  = (vks1, ctx1, vks2, ctx2, ty)-splitPatSynType t = impossibleShow t----------- Given a dictionary of a (constraint type), split it up---  * components of a tupled constraint---  * superclasses of a constraint-expandDict :: HasCallStack => Expr -> EConstraint -> T [InstDictC]-expandDict edict ct = expandDict' [] [] edict ct--expandDict' :: HasCallStack => [IdKind] -> [EConstraint] -> Expr -> EConstraint -> T [InstDictC]-expandDict' avks actx edict acc = do-  let-    (bvks, bctx, cc) = splitContext acc-    (iCls, args) = getApp cc-    vks = avks ++ bvks-    ctx = actx ++ bctx-  case getTupleConstr iCls of-    Just _ -> do-      concat <$> mapM (\ (i, a) -> expandDict' vks ctx (mkTupleSel i (length args) `EApp` edict) a) (zip [0..] args)-    Nothing -> do-      ct <- gets classTable-      case M.lookup iCls ct of-        Nothing -> do-          -- if iCls is a variable it's not in the class table, otherwise it's an error-          when (isConIdent iCls) $-            --impossible-            -- XXX it seems we can get here, e.g., Control.Monad.Fail without Applicative import-            impossibleShow (acc, iCls)-          return [(edict, vks, ctx, cc, [])]-        Just (ClassInfo iks sups _ _ fds) -> do-          let-            vs = map idKindIdent iks-            sub = zip vs args-            sups' = map (subst sub) sups-          insts <- concat <$> mapM (\ (i, sup) -> expandDict' vks ctx (EVar (mkSuperSel iCls i) `EApp` edict) sup) (zip [1 ..] sups')-          return $ (edict, vks, ctx, cc, fds) : insts--mkSuperSel :: HasCallStack =>-              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---  traceM $ "solveLocalConstraints: " ++ show (cs, ds, un)-  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---  tcTrace $ "solveAndDefault: meta=" ++ show vs-  -- XXX may have to iterate this with fundeps-  ds' <- concat <$> mapM defaultOneTyVar vs-  return (a, ds ++ ds')--defaultOneTyVar :: TRef -> T [Solved]-defaultOneTyVar tv = do---  traceM $ "defaultOneTyVar: " ++ show tv-  old <- get             -- get entire old state-  let cvs = nub [ c | (_, EApp (EVar c) (EUVar tv')) <- constraints old, tv == tv' ]  -- all C v constraints---  traceM $ "defaultOneTyVar: cvs = " ++ show cvs-  dvs <- getSuperClasses cvs                            -- add superclasses---  traceM $ "defaultOneTyVar: dvs = " ++ show dvs-  let oneCls c | Just ts <- M.lookup c (defaults old) =-        take 1 $ filter (\ t -> all (\ cc -> soluble cc t) cvs) ts-               | otherwise = []-      soluble c t = fst $ flip tcRun old $ do-        putConstraints [(dummyIdent, EApp (EVar c) t)]  -- Use current (C T) constraint-        _ <- solveConstraints                           -- and solve.-        cs <- gets constraints-        return $ null cs                                -- No constraints left?-      tys = nubBy eqEType $ concatMap oneCls dvs---  traceM $ "defaultOneTyVar: " ++ show (tv, tys)-  case tys of-    [ty] -> do            -- There is a single type solving everything-      setUVar tv ty-      solveConstraints-    _ -> return []        -- Nothing solved---- The transitive closure of super-classes.--- XXX Somewhat duplicated with expandDict-getSuperClasses :: [Ident] -> T [Ident]-getSuperClasses ais = do-  ct <- gets classTable-  let loop done [] = done-      loop done (i:is) | i `elem` done = loop done is-                       | otherwise = i :-        case M.lookup i ct of-          Nothing -> error $ "getSuperClasses: " ++ show i-          Just (ClassInfo _ supers _ _ _) ->-            loop done (concatMap flatten supers ++ is)-      flatten a =-        case getApp a of-          (c, ts) ->-            case getTupleConstr c of-              Nothing -> [c]-              Just _ -> concatMap flatten ts-  return $ loop [] ais----{--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 10000) (tApps (mkIdent "_") ts))--showInstDef :: InstDef -> String-showInstDef (cls, InstInfo m ds _) = "instDef " ++ show cls ++ ": "-            ++ show (M.toList m) ++ ", " ++ showListS showInstDict ds--showMatch :: (Expr, [EConstraint]) -> String-showMatch (e, ts) = show e ++ " " ++ show ts--showConstraint :: (Ident, EConstraint) -> String-showConstraint (i, t) = show i ++ " :: " ++ show t--}--type Goal = (Ident, EType)     -- What we want to solve-type UGoal = Goal              -- Unsolved goal-type Soln = (Ident, Expr)      -- Solution, i.e., binding of a dictionary-type Improve = (SLoc, EType, EType)  -- Unify to get an improvement substitution---- Solve as many constraints as possible.--- Return bindings for the dictionary witnesses.-solveConstraints :: T [Soln]-solveConstraints = do-  cs <- gets constraints-  if null cs then-    return []-   else do-    addMetaDicts---    tcTrace "------------------------------------------\nsolveConstraints"-    eqs <- gets typeEqTable-    cs' <- mapM (\ (i,t) -> do { t' <- derefUVar t; return (i, normTypeEq eqs t') }) cs---    tcTrace ("constraints:\n" ++ unlines (map showConstraint cs'))-    (unsolved, solved, improves) <- solveMany cs' [] [] []-    putConstraints unsolved---    tcTrace ("solved:\n"   ++ unlines [ showIdent i ++ " = "  ++ showExpr  e | (i, e) <- solved ])---    tcTrace ("unsolved:\n" ++ unlines [ showIdent i ++ " :: " ++ showEType t | (i, t) <- unsolved ])-    if null improves then-      return solved-     else do-      -- We have improving substitutions.-      -- Do the unifications, and try to solve more.-      mapM_ (\ (l, a, b) -> unify l a b) improves-      (++ solved) <$> solveConstraints---- A solver get a location, class&types (i.e. (C t1 ... tn)),--- and, if successful, returns a dictionary expression and new goals.-type SolveOne = SLoc -> Ident -> [EType] -> T (Maybe (Expr, [Goal], [Improve]))---- Table of constraint solvers.--- The predicate gets the class name and picks a solver.--- There must always by at least one solver that matches-solvers :: [(Ident -> Bool, SolveOne)]-solvers =-  [ (isJust . getTupleConstr,      solveTuple)        -- handle tuple constraints, i.e. (C1 t1, C2 t2, ...)-  , ((== mkIdent nameTypeEq),      solveTypeEq)       -- handle equality constraints, i.e. (t1 ~ t2)-  , ((== mkIdent nameKnownNat),    solveKnownNat)     -- KnownNat 123 constraints-  , ((== mkIdent nameKnownSymbol), solveKnownSymbol)  -- KnownSymbol "abc" constraints-  , ((== mkIdent nameCoercible),   solveCoercible)    -- Coercible a b constraints-  , (const True,                   solveInst)         -- handle constraints with instances-  ]---- Examine each goal, either solve it (possibly producing new goals) or let it remain unsolved.-solveMany :: [Goal] -> [UGoal] -> [Soln] -> [Improve] -> T ([UGoal], [Soln], [Improve])-solveMany [] uns sol imp = return (uns, sol, imp)--- Need to handle ct of the form C => T, and forall a . T-solveMany (cns@(di, ct) : cnss) uns sol imp = do---  tcTrace ("trying " ++ showEType ct)-  let loc = getSLoc di-      (iCls, cts) = getApp ct-      solver = head [ s | (p, s) <- solvers, p iCls ]-  ads <- gets argDicts-  -- Check if we have an exact match among the arguments dictionaries.-  -- This is important to find tupled dictionaries in recursive calls.-  case [ ai | (ai, act) <- ads, ct `eqEType` act ] of-    ai : _ -> do-      --tcTrace $ "solve with arg " ++ show ct-      solveMany cnss uns ((di, EVar ai) : sol) imp-    [] -> do-      msol <- solver loc iCls cts-      case msol of-        Nothing           -> solveMany        cnss  (cns : uns)            sol         imp-        Just (de, gs, is) -> solveMany (gs ++ cnss)        uns ((di, de) : sol) (is ++ imp)--solveInst :: SolveOne-solveInst loc iCls cts = do-  it <- gets instTable---  tcTrace ("instances:\n" ++ unlines (map showInstDef (M.toList it)))-  -- XXX The solveGen&co functions are not in the T monad.-  -- But we sometimes need to instantiate type variable, so we use the-  -- hack to pass dowwn a starting uniq.-  -- This ought to be fixed, but is will be less efficient.-  uniq <- do ts <- get; let { u = unique ts }; put ts{ unique = u+100 }; return u   -- make room for many UVars-  case M.lookup iCls it of-    Nothing -> return Nothing   -- no instances, so no chance-    Just (InstInfo atomMap insts fds) -> do-      -- tcTrace $ "solveInst: " ++ showIdent iCls ++ " atomMap size=" ++ show (M.size atomMap)-      case cts of-        [EVar i] -> do-          case M.lookup i atomMap of-            -- If the goal is just (C T) and there is an instance, the solution is simple-            Just e  -> return $ Just (e, [], [])-            -- Not found, but there might be a generic instance-            Nothing -> solveGen uniq (M.null atomMap) fds insts loc iCls cts-        _           -> solveGen uniq (M.null atomMap) fds insts loc iCls cts---- When matching constraint (C _a) against an instance of the form--- instance (C b) then we don't want to match if the--- _a is later instantiated and it turns out we should--- have matched a (C T) instead.-solveGen :: TRef -> Bool -> [IFunDep] -> [InstDict] -> SolveOne-solveGen uniq noAtoms fds insts loc iCls cts = do---  tcTrace ("solveGen: " ++ show (iCls, cts))---  tcTrace ("solveGen: insts=" ++ show insts)-  let matches = getBestMatches $ findMatches uniq noAtoms loc fds insts cts---  tcTrace ("solveGen: matches allMatches =" ++ showListS show (findMatches uniq noAtoms loc fds insts cts))---  tcTrace ("solveGen: matches bestMatches=" ++ showListS showMatch matches)-  case matches of-    []              -> return Nothing-    [(de, ctx, is)] ->-      if null ctx then-        return $ Just (de, [], is)-      else do-        d <- newDictIdent loc---        tcTrace ("constraint " ++ showIdent di ++ " :: " ++ showEType ct ++ "\n" ++---                "   turns into " ++ showIdent d ++ " :: " ++ showEType (tupleConstraints ctx) ++ ", " ++---                showIdent di ++ " = " ++ showExpr (EApp de (EVar d)))-        return $ Just (EApp de (EVar d), [(d, tupleConstraints ctx)], is)-    _ -> tcError loc $ "Multiple constraint solutions for: " ++ showEType (tApps iCls cts)---                     ++ show (map fst matches)---- Split a tupled contraint into its parts.--- XXX should look for a direct (tupled) dictionary-solveTuple :: SolveOne-solveTuple loc _iCls cts = do-  goals <- mapM (\ c -> do { d <- newDictIdent loc; return (d, c) }) cts-  return $ Just (ETuple (map (EVar . fst) goals), goals, [])--solveTypeEq :: SolveOne--- If either type is a unification variable, just do the unification.-solveTypeEq loc _iCls [t1, t2] | isEUVar t1 || isEUVar t2 = return $ Just (ETuple [], [], [(loc, t1, t2)])-                               | otherwise = do-  eqs <- gets typeEqTable-  --tcTrace ("solveTypeEq eqs=" ++ show eqs)-  case solveEq eqs t1 t2 of-    Nothing -> return Nothing-    Just tts -> do-      let mkEq (u1, u2) = do-            i <- newDictIdent loc-            return (i, mkEqType loc u1 u2)-      ncs <- mapM mkEq tts-      return $ Just (ETuple [], ncs, [])-solveTypeEq _ _ _ = impossible--solveCoercible :: HasCallStack => SolveOne-solveCoercible loc iCls [t1, t2] = do-  st <- gets synTable-  extNewtypeSyns        -- pretend newtypes are type synonyms-  t1' <- expandSyn t1-  t2' <- expandSyn t2-  putSynTable st-  -- walk over the types in parallel,-  -- and generate new Coercible constraints when not equal.---  traceM $ "solveCoercible: " ++ showExprRaw t1' ++ " and " ++ showExprRaw t2'-  case genCoerce t1' t2' of-    Nothing -> solveInstCoercible loc iCls t1 t2  -- look for a dict argument-    Just [(u1, u2)] | u1 `eqEType` t1 && u2 `eqEType` t2 -> solveInstCoercible loc iCls t1 t2  -- look for a dict argument-    Just tts -> do-      let mkCo (u1, u2) = do-            i <- newDictIdent loc-            return (i, mkCoercible loc u1 u2)-      ncs <- mapM mkCo tts-      return $ Just (ETuple [], ncs, [])-solveCoercible _ _ _ = impossible--genCoerce :: EType -> EType -> Maybe [(EType, EType)]-genCoerce t1 t2 | eqEType t1 t2 = Just []-genCoerce t1@(EUVar _) t2 = Just [(t1, t2)]-genCoerce t1@(EVar _)  t2 = Just [(t1, t2)]-genCoerce t1 t2@(EUVar _) = Just [(t1, t2)]-genCoerce t1 t2@(EVar _)  = Just [(t1, t2)]-genCoerce (EApp f1 a1) (EApp f2 a2) = (++) <$> genCoerce f1 f2 <*> genCoerce a1 a2-genCoerce _ _ = Nothing--solveInstCoercible :: SLoc -> Ident -> EType -> EType -> T (Maybe (Expr, [Goal], [Improve]))-solveInstCoercible loc iCls t1 t2 = do-  msol <- solveInst loc iCls [t1, t2]-  case msol of-    Nothing -> solveInst loc iCls [t2, t1]-    Just _ -> pure msol---- Pretend newtypes are type synonyms.--- XXX It's rather inefficient to do this over and over.-extNewtypeSyns :: T ()-extNewtypeSyns = do-  dt <- gets dataTable-  let ext (qi, Newtype (_, vs) (Constr _ _ _c et) _) = do-          -- XXX We should check that the constructor name (_c) is visible.-          -- But this is tricky since we don't know under what qualified name it-          -- it should be visible.-          let t = either (snd . head) (snd . snd . head) et---          traceM $ "extNewtypeSyns: " ++ showIdent qi ++ show vs ++ " = " ++ showExprRaw t-          extSyn qi vs t  -- extend synonym table-      ext _ = return ()-  mapM_ ext $ M.toList dt---isEUVar :: EType -> Bool-isEUVar (EUVar _) = True-isEUVar _ = False--solveKnownNat :: SolveOne-solveKnownNat loc iCls [e@(ELit _ (LInteger _))] = mkConstDict loc iCls e-solveKnownNat loc iCls ts = solveInst loc iCls ts  -- look for a dict argument--solveKnownSymbol :: SolveOne-solveKnownSymbol loc iCls [e@(ELit _ (LStr _))] = mkConstDict loc iCls e-solveKnownSymbol loc iCls ts = solveInst loc iCls ts  -- look for a dict argument--mkConstDict :: SLoc -> Ident -> Expr -> T (Maybe (Expr, [Goal], [Improve]))-mkConstDict loc iCls e = do-  let res = EApp (EVar $ mkClassConstructor iCls) fcn-      fcn = EApp (ELit loc (LPrim "K")) e                -- constant function-  return $ Just (res, [], [])--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 :: TRef -> Bool -> SLoc -> [IFunDep] -> [InstDict] -> [EType] -> [(Int, (Expr, [EConstraint], [Improve]))]-findMatches _ False _ _ _ [EUVar _] = []-findMatches uniq _ loc fds ds its =- let rrr =-       [ (length s, (de, map (substEUVar s) ctx, imp))-       | (de, ctxts) <- ds-       , let (ctx, ts) = ctxts uniq-       , Just (s, imp) <- [matchTypes loc ts its fds]-       ]- in --trace ("findMatches: " ++ showListS showInstDict ds ++ "; " ++ show its ++ "; " ++ show fds ++ "; " ++ show rrr)-    rrr---- Do substitution for EUVar.--- XXX similar to derefUVar-substEUVar :: TySubst -> EType -> EType-substEUVar [] t = t-substEUVar _ t@(EVar _) = t-substEUVar _ t@(ELit _ _) = 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 b iks t) = EForall b iks (substEUVar s t)-substEUVar _ _ = impossible---- Length of lists match, because of kind correctness.--- fds is a non-empty list.-matchTypes :: SLoc -> [EType] -> [EType] -> [IFunDep] -> Maybe (TySubst, [Improve])-matchTypes _ ats ats' [] = do-  -- Simple special case when there are no fundeps.-  let loop r (t:ts) (t':ts') = matchType r t t' >>= \ r' -> loop r' ts ts'-      loop r _ _ = pure r-  s <- loop [] ats ats'-  pure (s, [])-matchTypes loc ts ts' fds = asum $ map (matchTypesFD loc ts ts') fds--matchTypesFD :: SLoc -> [EType] -> [EType] -> IFunDep -> Maybe (TySubst, [Improve])---matchTypesFD _ ts ts' io | trace ("matchTypesFD: " ++ show (ts, ts', io)) False = undefined-matchTypesFD loc ts ts' (ins, outs) = do-  let matchFD :: Bool -> EType -> EType -> Maybe TySubst-      matchFD True  = \ _ _ -> Just []     -- if it's an output, don't match-      matchFD False = matchType []          -- match types for non-outputs-  tms <- sequence $ zipWith3 matchFD outs ts ts'-  tm  <- combineTySubsts tms               -- combine all substitutions-  is  <- combineTySubsts [ s | (True, s) <- zip ins tms]  -- subst from input FDs-  let imp = [ (loc, substEUVar is t, t') | (True, t, t') <- zip3 outs ts ts' ]  -- improvements-  pure (tm, imp)---- Match two types, instantiate variables in the first type.-matchType :: TySubst -> EType -> EType -> Maybe TySubst-matchType = match-  where-    match r (EVar i)   (EVar i')   | i == i' = pure r-    match r (ELit _ l) (ELit _ l') | l == l' = pure r-    match r (EApp f a) (EApp f' a') = do-      r' <- match r f f'-      match r' a a'---    match _ _ (EUVar _) = Nothing-    match r (EUVar i) t' =-      -- For a variable, check that any previous match is the same.-      case lookup i r of-        Just t  -> match r t t'-        Nothing -> pure ((i, t') : r)-    match _ _ _ = Nothing---- XXX This shouldn't be this complicated.-combineTySubsts :: [TySubst] -> Maybe TySubst-combineTySubsts = combs []-  where-    combs r [] = Just r-    combs r (s:ss) = do { r' <- comb r s; combs r' ss }-    comb :: TySubst -> TySubst -> Maybe TySubst-    comb r [] = Just r-    comb r ((v, t):s) = do { r' <- comb1 v t r; comb r' s }-    comb1 v t r =-      case lookup v r of-        Nothing -> Just ((v, t) : r)-        Just t' -> matchType [] t' t---- Get the best matches.  These are the matches with the smallest substitution.--- Always prefer arguments rather than global instances.-getBestMatches :: [(Int, (Expr, [EConstraint], [Improve]))] -> [(Expr, [EConstraint], [Improve])]-getBestMatches [] = []-getBestMatches ams =-  let isDictArg (EVar i) = (adictPrefix ++ uniqIdentSep) `isPrefixOf` unIdent i-      isDictArg _ = True-      (args, insts) = partition (\ (_, (ei, _, _)) -> isDictArg ei) ams-      pick ms =-        let b = minimum (map fst ms)         -- minimum substitution size-        in  [ ec | (s, ec) <- ms, s == b ]   -- pick out the smallest-  in  if null args then pick insts else pick args---- Check that there are no unsolved constraints.-checkConstraints :: HasCallStack => T ()-checkConstraints = do-  cs <- gets constraints-  case cs of-    [] -> return ()-    (i, t) : _ -> do-      t' <- derefUVar t---      is <- gets instTable---      tcTrace $ "Cannot satisfy constraint: " ++ unlines (map (\ (i, ii) -> show i ++ ":\n" ++ showInstInfo ii) (M.toList is))-      tcError (getSLoc i) $ "Cannot satisfy constraint: " ++ show t'-                            ++ "\n     fully qualified: " ++ showExprRaw t'---- Add a type equality constraint.-addEqConstraint :: SLoc -> EType -> EType -> T ()-addEqConstraint loc t1 t2 = do-  d <- newDictIdent loc-  addConstraint d (mkEqType loc t1 t2)---- Possibly solve a type equality.--- Just normalize both types and compare.-solveEq :: TypeEqTable -> EType -> EType -> Maybe [(EType, EType)]---solveEq eqs t1 t2 | trace ("solveEq: " ++ show (t1,t2) ++ show eqs) False = undefined-solveEq eqs t1 t2 | normTypeEq eqs t1 `eqEType` normTypeEq eqs t2 = Just []-                  | otherwise =-  case (t1, t2) of-    (EApp f1 a1, EApp f2 a2) -> Just [(f1, f2), (a1, a2)]-    _                        -> Nothing---- Add the equality t1~t2.--- Type equalities are saved as a rewrite system where all the rules--- have the form---   v -> rhs--- where v is a type variable (rigid or skolem), and the rhs contains--- only type constructors and type variables that are not the LHS of any rule.--- To find out if two types are equal according to the known equalites,--- we just normalize both type using the rewrite rules (which is just a substitution).--- When we get TypeFamilies the LHS has to be a type expression as well.--- And then rewrite rules can probably be obtained with Knuth-Bendix completion--- of the equalities.--- Note: there should be no meta variables in t1 and t2.--- XXX This guaranteed by how it's called, but I'm not sure it always works properly.-addTypeEq :: EType -> EType -> TypeEqTable -> TypeEqTable-addTypeEq t1 t2 aeqs =-  let deref (EVar i) | Just t <- lookup i aeqs = t-      deref (ESign t _) = t-      deref t = t-      t1' = deref t1-      t2' = deref t2-      isVar = not . isConIdent-  in  case (t1', t2') of-        (EVar i1, EVar i2) | isVar i1 && isVar i2 ->-               if i1 < i2 then (i2, t1') : aeqs  -- always point smaller to bigger-          else if i1 > i2 then (i1, t2') : aeqs-          else                             aeqs-        (EVar i1, _) | isVar i1 -> (i1, t2') : aeqs-        (_, EVar i2) | isVar i2 -> (i2, t1') : aeqs-        (EApp f1 a1, EApp f2 a2) -> addTypeEq f1 f2 (addTypeEq a1 a2 aeqs)-        _ | t1' `eqEType` t2 -> aeqs-        _ -> errorMessage (getSLoc t1) $ "inconsistent type equality " ++ showEType t1' ++ " ~ " ++ showEType t2'---- Normalize a type with the known type equalties.--- For now, it's just substitution.-normTypeEq :: TypeEqTable -> EType -> EType-normTypeEq = subst--------------------------- Try adding all dictionaries that used to have meta variables.-addMetaDicts :: T ()-addMetaDicts = do-  ms <- gets metaTable-  putMetaTable []-  mapM_ addDict ms  -- Try adding them--------------------------------{--showSymTab :: SymTab -> 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--}--doDeriving :: EDef -> T [EDef]-doDeriving def@(Data    lhs cs ds)    = (def:) . concat <$> mapM (deriveDer False lhs  cs) ds-doDeriving def@(Newtype lhs  c ds)    = (def:) . concat <$> mapM (deriveDer True  lhs [c]) ds-doDeriving (StandDeriving as _ act) = do-  -- The StandDeriving has not been typechecked yet, so do it now.-  def@(StandDeriving s n ct) <- withTypeTable $ tcStand as act-  (def:) <$> standaloneDeriving s n ct-doDeriving def                        = return [def]--deriveDer :: Bool -> LHS -> [Constr] -> Deriving -> T [EDef]-deriveDer newt lhs cs (Deriving strat ds) = concat <$> mapM (deriveStrat Nothing newt lhs cs strat) ds--standaloneDeriving :: DerStrategy -> Int -> EConstraint -> T [EDef]-standaloneDeriving str narg act = do-  let (_vks, _ctx, cc) = splitContext act---  traceM ("standaloneDeriving 1 " ++ show (_vks, _ctx, cc))-  (cls, ts, tname) <--    case getAppM cc of-      Just (c, ts@(_:_)) | Just (n, _) <- getAppM (last ts) -> return (c, init ts, n)-      _ -> tcError (getSLoc act) "malformed standalone deriving"---  traceM ("standaloneDeriving 2 " ++ show (act, cls, tname))-  dtable <- gets dataTable-  (lhs, newt, cs) <--    case M.lookup tname dtable of-      Just (Newtype l  c _) -> return (l, True,  [c])-      Just (Data    l xs _) -> return (l, False, xs)-      _ -> tcError (getSLoc act) ("not data/newtype " ++ showIdent tname)-  -- We want 'instance ctx => cls ty'-  deriveStrat (Just act) newt lhs cs str (narg, tApps cls ts)--chksym :: T ()-chksym = return ()---  vt <- gets valueTable+  showValueExport, showTypeExport, showTypeExportAssocs,+  ) where+import qualified Prelude(); import MHSPrelude+import Control.Applicative+import Control.Monad+import Data.Char+import Data.Function+import Data.List+import Data.Maybe+import MicroHs.Builtin+import MicroHs.Deriving+import MicroHs.Expr+import MicroHs.Fixity+import MicroHs.Flags+import MicroHs.Graph+import MicroHs.Ident+import qualified MicroHs.IdentMap as M+import qualified MicroHs.IntMap as IM+import MicroHs.List+import MicroHs.Names+import MicroHs.Parse(dotDotIdent)+import MicroHs.SymTab+import MicroHs.TCMonad+import Debug.Trace++--primitiveKinds :: [String]+--primitiveKinds = [nameType, nameConstraint, nameSymbol, nameNat]++maxTuple :: Int+maxTuple = 15++deriveClassTypeable :: Bool+deriveClassTypeable = True++----------------------++-- Certain data structures persist during the entire compilation+-- session.  The information is needed beyond the scope where it was defined.+data GlobTables = GlobTables {+  gSynTable   :: SynTable,        -- type synonyms are needed for expansion+  gDataTable  :: DataTable,       -- data/newtype definitions+  gClassTable :: ClassTable,      -- classes are needed for superclass expansion etc+  gInstInfo   :: InstTable        -- instances are implicitely global+  }++instance NFData GlobTables where+  rnf (GlobTables a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d++emptyGlobTables :: GlobTables+emptyGlobTables = GlobTables { gSynTable = M.empty, gDataTable = M.fromList dataTuples, gClassTable = M.empty, gInstInfo = M.empty }+  -- XXX Could fill the initial symbol table from this+  where dataTuples :: [(Ident, EDef)]+        dataTuples = [ (con, Data (con, map (\ v -> IdKind v eDummy) vs) [Constr [] [] con False (Left $ map (\v-> (False, EVar v)) vs)] [])+                     | n <- 0:[2..15]+                     , let con = tupleConstr noSLoc n+                     , let vs = map (mkIdent . ("a" ++) . show) [1 .. n] ]++mergeGlobTables :: GlobTables -> GlobTables -> GlobTables+mergeGlobTables g1 g2 =+  GlobTables { gSynTable = M.merge (gSynTable g1) (gSynTable g2),+               gDataTable = M.merge (gDataTable g1) (gDataTable g2),+               gClassTable = M.merge (gClassTable g1) (gClassTable g2),+               gInstInfo = M.mergeWith mergeInstInfo (gInstInfo g1) (gInstInfo g2) }++type Symbols = (SymTab, SymTab)++data TModule a = TModule {+  tModuleName :: IdentModule,     -- module names+  tFixDefs    :: [FixDef],        -- all fixities, exported or not+  tTypeExps   :: [TypeExport],    -- exported types+  tValueExps  :: [ValueExport],   -- exported values (including from T(..))+  tDefaults   :: Defaults,        -- exported defaults+  tBindingsOf :: a                -- bindings+  }+--  deriving (Show)++instance NFData a => NFData (TModule a) where+  rnf (TModule a b c d e f) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e `seq` rnf f++setBindings :: TModule b -> a -> TModule a+setBindings (TModule x y z w v _) a = TModule x y z w v a++type FixDef = (Ident, Fixity)++type Sigma = EType+type Rho   = EType++typeCheck :: Flags -> GlobTables -> ImpType -> [(ImportSpec, TModule a)] -> EModule -> (TModule [EDef], GlobTables, Symbols, TCState)+typeCheck flags globs impt aimps (EModule mn exps defs) =+--  trace (unlines $ map (showTModuleExps . snd) aimps) $+  let+    imps = map filterImports aimps+    tc =+      case defs of+        SetTCState tcs : _ -> tcs  -- hack to set the saved TCState+        _ -> mkTCState mn globs imps+  in case tcRun (tcDefs flags impt defs) tc of+       (tds, tcs) ->+         let+           thisMdl = (mn, mkTModule tds tcs)+           impMdls = [(fromMaybe m mm, tm) | (ImportSpec _ _ m mm _, tm) <- imps]+           allMdls = thisMdl : impMdls+           (texps, vexps) =+             unzip $ map (getTVExps impMap (typeTable tcs) (valueTable tcs) (assocTable tcs)) exps+             where impMap = M.fromListWith (++) [(i, [m]) | (i, m) <- allMdls]+           fexps = map (tFixDefs . snd) allMdls+           sexps = synTable tcs+           dexps = dataTable tcs+           iexps = instTable tcs+           ctbl  = classTable tcs+           dflts = M.fromList $ filter ((`elem` ds) . fst) $ M.toList $ defaults tcs+                 where ds = [ tyQIdent $ expLookup ti (typeTable tcs) | ExpDefault ti <- exps ]+         in  ( tModule mn (nubBy ((==) `on` fst) (concat fexps)) (concat texps) (concat vexps) dflts tds+             , GlobTables { gSynTable = sexps, gDataTable = dexps, gClassTable = ctbl, gInstInfo = iexps }+             , (typeTable tcs, valueTable tcs)+             , tcs+             )++-- A hack to force evaluation of errors.+-- This should be redone to all happen in the T monad.+tModule :: IdentModule -> [FixDef] -> [TypeExport] -> [ValueExport] -> Defaults -> [EDef] ->+           TModule [EDef]+tModule mn fs ts vs ds bs =+--  trace ("tmodule " ++ showIdent mn ++ ":\n" ++ show vs) $+  tseq ts `seq` vseq vs `seq` ds `seq` TModule mn fs ts vs ds bs+  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 vs ds a) =+  let+    keep x xs = elem x xs /= hide+    ivs  = [ i | ImpValue i <- is ]+    vs'  = filter (\ (ValueExport i _) -> keep i ivs) vs +++           if hide then []+           else [ ve | TypeExport _ _ ves <- ts, ve@(ValueExport i _) <- ves, i `elem` ivs ]+    aits = [ i | ImpTypeAll i <- is ]         -- all T(..) imports+    its  = [ i | ImpTypeSome i _ <- is ] ++ aits+    -- Hide the type name, but not all it's parts.+    -- Processing the TypeExport to extract the constructors/fields/methods/defaultmethods+    -- is done later in mkTCState, so we can't remove the export.+    -- To hide it we use a hack: make the identifier inaccessible by prepending a ' '.+    mkTypeExport _ _ [] = []  -- no parts left, just throw away.+    mkTypeExport i e ves = [TypeExport (hideIdent i) e ves] -- hide the type name, keep the associated values+    ts' =+      if hide then+        let ok xs (ValueExport i _) = i `notElem` ivs && i `notElem` xs in+        [ TypeExport i e (filter (ok []) ves) | TypeExport i e ves <- ts, i `notElem` its ] ++   -- no hiding of these types, but maybe fields+        [ r | TypeExport i e ves <- ts, ImpTypeSome i' xs <- is, i == i', r <- mkTypeExport i e (filter (ok xs) ves) ]+      else+        let ok xs (ValueExport i _) = i `elem` ivs || i `elem` xs || isDefaultMethodId i in+        [ TypeExport i e                 ves  | TypeExport i e ves <- ts, i `elem` aits ] +++        [ TypeExport i e (filter (ok xs) ves) | TypeExport i e ves <- ts, ImpTypeSome i' xs <- is, i == i' ]+    allVs = map (\ (ValueExport i _) -> i) vs +++            concatMap (\ (TypeExport _ _ xvs) -> map (\ (ValueExport i _) -> i) xvs) ts+    allTs = map (\ (TypeExport i _ _) -> i) ts+  in+    (if hide then+       id -- don't complain about missing hidden identifiers; we use it for compatibility+     else+       checkBad (ivs \\ allVs) .+       checkBad (its \\ allTs))+    (imp, TModule mn fx ts' vs' ds a)++checkBad :: forall a . [Ident] -> a -> a+checkBad [] a = a+checkBad (i:_) _ =+  errorMessage (getSLoc i) $ "not exported: " ++ showIdent i++-- Type and value exports+getTVExps :: forall a . M.Map [TModule a] -> TypeTable -> ValueTable -> AssocTable -> ExportItem ->+             ([TypeExport], [ValueExport])+getTVExps impMap _ _ _ (ExpModule m) =+  -- Export all modules with name m+  case M.lookup m impMap of+    Just ms ->+      case unzip [ (te, ve) | TModule _ _ te ve _ _ <- ms ] of+        (tes, ves) -> (concat tes, concat ves)+    _ -> errorMessage (getSLoc m) $ "undefined module: " ++ showIdent m+getTVExps _ tys vals ast (ExpTypeSome ti is) =+  let e = expLookup ti tys+      assc = getAssocs vals ast $ tyQIdent e   -- all associated values+      ves = concatMap one is+      one i | i == dotDotIdent = assc          -- '..' means all associated values+            | otherwise =+              case filter (\ (ValueExport i' _) -> i == i' || isDefaultMethodOfId i i') assc of+                es@(_:_) -> es                 -- Pick the assocaited value if it exists+                [] -> [ValueExport (unQualIdent i) $ expLookup i vals]+                                               -- otherwise, just look up a pattern synonym.+                                               -- This might accidentally pick up a constructor from+                                               -- another type, but it doesn't really matter.+  in ([TypeExport (unQualIdent ti) e ves], [])++getTVExps _ _ vals _ (ExpValue i) = ([], [ValueExport (unQualIdent i) (expLookup i vals)])+getTVExps _ _ _ _ (ExpDefault _) = ([], [])++expLookup :: Ident -> SymTab -> 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++-- 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 . HasCallStack => [EDef] -> TCState -> TModule a+mkTModule tds tcs =+  let+    mn = moduleName tcs+    tt = typeTable  tcs+    at = assocTable tcs+    vt = valueTable tcs++    -- Find the Entry for a type.+    tentry i =+      case stLookup "" (qualIdent mn i) tt of+        Right e -> e+        _       -> impossible+    ventry i t =+      let qi = qualIdent mn i in+      case stLookup "" qi vt of+        Right e -> e+        _       -> Entry (EVar qi) t  -- XXX A hack for boot modules++    -- 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 (ventry i t') | Sign is t <- tds, let t' = expandSyn' st t, i <- is ] +++          [ ValueExport i (ventry i t') | ForImp _ _ qi t <- tds, let t' = expandSyn' st t, let i = unQualIdent qi ]+      where st = synTable tcs++    -- 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 fixity declaration.+    fes = [ (qualIdent mn i, fx) | Infix fx is <- tds, i <- is ]++    -- All defaults+    des = defaults tcs++  in  TModule mn fes tes ves des impossible++-- Find all value Entry for names associated with a type.+-- XXX join stLookup code with tentry+getAssocs :: (HasCallStack) => ValueTable -> AssocTable -> Ident -> [ValueExport]+getAssocs _vt at ai = fromMaybe [] $ M.lookup ai at++mkTCState :: IdentModule -> GlobTables -> [(ImportSpec, TModule a)] -> TCState+mkTCState mdlName globs mdls =+  let+    allValues :: ValueTable+    allValues =+      let+        usyms (ImportSpec _ qual _ _ _, TModule _ _ tes ves _ _) =+          if qual then [] else+          [ (i, [e]) | ValueExport i e    <- ves, not (isInstId i)  ] +++          [ (i, [e]) | TypeExport  _ _ cs <- tes, ValueExport i e <- cs, not (isDefaultMethodId i) ]+        qsyms (ImportSpec _ _ _ mas _, TModule mn _ tes ves _ _) =+          let m = fromMaybe mn mas in+          [ (v, [e]) | ValueExport i e    <- ves,                        let { v = qualIdent    m i } ] +++          [ (v, [e]) | TypeExport  _ _ cs <- tes, ValueExport i e <- cs, let { v = qualIdentD e m i } ] +++          [ (v, [Entry (EVar v) t]) | (i, ClassInfo _ _ t _ _) <- M.toList (gClassTable globs), let { v = mkClassConstructor i } ]+        -- Default methods are always entered with their qualified original name.+        qualIdentD (Entry e _) m i | not (isDefaultMethodId i) = qualIdent m i+                                   | otherwise =+                                     case e of+                                       EVar qi -> qi+                                       _ -> undefined+      in stFromList (concatMap usyms mdls) (concatMap qsyms mdls)+    allTypes :: TypeTable+    allTypes =+      let+        usyms (ImportSpec _ qual _ _ _, TModule _ _ tes _ _ _) =+          if qual then [] else [ (i, [e]) | TypeExport i e _ <- tes, not (isHiddenIdent i) ]+        qsyms (ImportSpec _ _ _ mas _, TModule mn _ tes _ _ _) =+          let m = fromMaybe mn mas in+          [ (qualIdent m i, [e]) | TypeExport i e _ <- tes, not (isHiddenIdent i) ]+      in stFromList (concatMap usyms mdls) (concatMap qsyms mdls)++    allFixes :: FixTable+    allFixes = M.fromList (concatMap (tFixDefs . snd) mdls)+    allAssocs :: AssocTable+    allAssocs =+      let assocs (_, TModule _ _ tes _ _ _) = [ (tyQIdent e, cs) | TypeExport _ e cs <- tes ]+          eqVE (ValueExport _ (Entry e1 _)) (ValueExport _ (Entry e2 _)) = eqEType e1 e2+      in  M.fromListWith (unionBy eqVE) $ concatMap assocs mdls++    dflts = foldr (mergeDefaults . tDefaults . snd) M.empty mdls++  in TC { moduleName = mdlName,+          unique = 1,+          fixTable = addPrimFixs allFixes,+          typeTable = foldr (uncurry stInsertGlbA) allTypes primTypes,+          synTable = gSynTable globs,+          dataTable = gDataTable globs,+          valueTable = foldr (uncurry stInsertGlbA) allValues primValues,+          assocTable = allAssocs,+          uvarSubst = IM.empty,+          tcMode = TCExpr,+          classTable = gClassTable globs,+          ctxTables = (gInstInfo globs, [], [], []),+          constraints = [],+          defaults = dflts+        }++mergeDefaults :: Defaults -> Defaults -> Defaults+mergeDefaults ds = foldr (uncurry $ M.insertWith mrg) ds . M.toList+  where mrg :: [EType] -> [EType] -> [EType]+        mrg ts ts' | not (any (\ t -> not (elemBy eqEType t ts)) ts') = ts+                   | not (any (\ t -> not (elemBy eqEType t ts')) ts) = ts'+                   | otherwise = []++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@(EVar i1) (EVar i2)+      | i1 == i2  = e1+      | otherwise = errorMessage (getSLoc i1) $ "Multiple instances: " ++ showSLoc (getSLoc i2)+    mrg e1 _e2 = e1 -- XXX improve this+    l = unionBy eqInstDict l1 l2+  in  InstInfo m l fds++-- 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'++-- Identifier should only be seen with it's qualified name.+isInstId :: Ident -> Bool+isInstId i = (instPrefix ++ uniqIdentSep) `isPrefixOf` unIdent i++mkInstId :: SLoc -> EType -> Ident+mkInstId loc ct = mkIdentSLoc loc $ instPrefix ++ uniqIdentSep ++ clsTy+  where clsTy = map (\ c -> if isSpace c then '@' else c) $ showExprRaw ct++--------------------------++-- 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+  otcm <- gets tcMode+  vt <- gets valueTable+  tt <- gets typeTable+  putValueTable tt            -- use type table as value table+  let+    tcm = succ otcm+    next = case tcm of { TCType -> primKindTable; TCKind -> primSortTable; _ -> undefined }+  putTypeTable next           -- use kind/sort table as type table+  putTCMode tcm+  a <- ta+  tt' <- gets valueTable+  putValueTable vt+  putTypeTable tt'+  putTCMode otcm+  return a++addAssocTable :: Ident -> [ValueExport] -> T ()+addAssocTable i ids = modify $ \ ts -> ts { assocTable = M.insert i ids (assocTable ts) }++addClassTable :: Ident -> ClassInfo -> T ()+addClassTable i x = modify $ \ ts -> ts { classTable = M.insert i x (classTable ts) }++addInstTable :: [InstDictC] -> T ()+addInstTable ics = do+--  tcTrace $ "addInstTable: " ++ show ics+  let+    -- Change type variable to unique unification variables.+    -- These unification variables will never leak, but as an extra caution+    -- we use negative numbers..+    freshSubst u iks =+      zipWith (\ ik j -> (idKindIdent ik, EUVar j)) iks [u ..]++    mkInstInfo :: InstDictC -> T (Ident, InstInfo)+    mkInstInfo (e, iks, ctx, ct, fds) = do+      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, ii)] fds)+          where ii u =+                  let ctx' = map (subst s) ctx+                      ts'  = map (subst s) ts+                      s    = freshSubst u iks+                  in  (ctx', ts')+  iis <- mapM mkInstInfo ics+  it <- gets instTable+  putInstTable $ foldr (uncurry $ M.insertWith mergeInstInfo) it iis++-- Generate a dictionary for the constraint.+-- Reuse old dictionaries if possible.+newDict :: SLoc -> EConstraint -> T Expr+newDict loc ctx = do+  ctx' <- derefUVar ctx+  cs <- gets constraints+  -- Check if there's already an identical constraint.+  case find (\ (_, c) -> eqEType c ctx') cs of+    Just (i, _) -> do+--      traceM ("newDict reuse: " ++ show (i, ctx'))+      return (EVar i)+    _ -> do+      i <- newDictIdent loc+--      traceM ("newDict: " ++ show (i, ctx', length cs))+      addConstraint i ctx'+      return (EVar i)++addConstraint :: Ident -> EConstraint -> T ()+addConstraint d ctx = do+--  tcTrace $ "addConstraint: " ++ showIdent d ++ " :: " ++ showEType ctx+  modify $ \ ts -> ts{ constraints = (d, ctx) : constraints ts }++withDicts :: forall a . HasCallStack => [(Ident, EConstraint)] -> T a -> T a+withDicts ds ta = do+--  tcTrace $ "+++ withDicts enter " ++ show ds+  ct <- gets ctxTables+  mapM_ addDict ds+  a <- ta+  putCtxTables ct+--  tcTrace $ "--- withDicts leave " ++ show ds+  return a++withDict :: forall a . HasCallStack => Ident -> EConstraint -> T a -> T a+withDict i c ta = do+--  tcTrace $ "+++ withDict enter " ++ show (i, c)+  ct <- gets ctxTables+  addDict (i, c)+  a <- ta+  putCtxTables ct+--  tcTrace $ "--- withDict leave " ++ show (i, c)+  return a++addDict :: HasCallStack => (Ident, EConstraint) -> T ()+addDict (i, c) = do+  c' <- derefUVar c+  if null (metaTvs [c']) then+    addInstDict i c'+   else+    -- With constraint variables we might get unification variables.+    -- We stash them away in hope that we will learn more later.+    addMetaDict i c'++addInstDict :: HasCallStack => Ident -> EConstraint -> T ()+addInstDict di c = do+  ics <- expandDict (EVar di) c+  -- Type equalities are handled differently.+  let addeq [] = return []+      addeq ((_, _, _, EApp (EApp (EVar eq) t1) t2, _):is) | eq == identTypeEq = do addEqDict t1 t2; addeq is+      addeq (i:is) = (i :) <$> addeq is+  ics' <- addeq ics+  addInstTable ics'+  addArgDict di c++addEqDict :: EType -> EType -> T ()+addEqDict t1 t2 = do+  is <- gets typeEqTable+--  tcTrace ("withEqDict: " ++ show (is, (t1,t2), (addTypeEq t1 t2 is)))+  putTypeEqTable (addTypeEq t1 t2 is)++addMetaDict :: HasCallStack => Ident -> EConstraint -> T ()+addMetaDict i c = do+  ms <- gets metaTable+  putMetaTable ((i,c) : ms)++addArgDict :: HasCallStack => Ident -> EConstraint -> T ()+addArgDict i c = do+  ads <- gets argDicts+  putArgDicts ((i,c) : ads)++addPrimFixs :: FixTable -> FixTable+addPrimFixs =+  M.insert (mkIdent "Primitives.->") (AssocRight, -1) .+  M.insert (mkIdent "Primitives.=>") (AssocRight, -2)++-- r for 'realm', suggested by ChatGPT+rSort :: ESort+rSort = EVar (mkIdent "Primitives.Sort")++sKindKindKind :: EKind+sKindKindKind = sArrow sKind (sArrow sKind sKind)++kTypeTypeS :: EType+kTypeTypeS = kArrow kType kType++kTypeTypeTypeS :: EType+kTypeTypeTypeS = kArrow kType $ kArrow kType kType++-- E.g.+--  Kind :: Sort+primSortTable :: KindTable+primSortTable =+  let+    entry i s = Entry (EVar (mkIdentB i)) s+    qsorts = [+       -- The kinds are wired in (for now)+       (mkIdentB nameKind,       [entry nameKind rSort])+       ]+  in stFromList (map (first unQualIdent) qsorts) qsorts++-- E.g.+--  Type       :: Kind+--  Constraint :: Kind+--  (->)       :: Kind -> Kind -> Kind+primKindTable :: KindTable+primKindTable =+  let+    entry i k = Entry (EVar (mkIdentB i)) k+    qkinds = [+       -- The kinds are wired in (for now)+       (mkIdentB nameType,       [entry nameType sKind]),+       (mkIdentB nameConstraint, [entry nameConstraint sKind]),+       (mkIdentB nameSymbol,     [entry nameSymbol sKind]),+       (mkIdentB nameNat,        [entry nameNat sKind]),+       (identArrow,              [entry nameArrow sKindKindKind])+       ]+  in stFromList (map (first unQualIdent) qkinds) qkinds++-- E.g.+--  Bool  :: Type+--  Int   :: Type+--  (->)  :: Type -> Type -> Type+--  (=>)  :: forall k . Constraint -> k -> k+--  Maybe :: Type -> Type+primTypes :: [(Ident, [Entry])]+primTypes =+  let+    entry i = Entry (EVar i)+    k = mkIdent "k"+    kv = EVar k+    kk = IdKind k sKind+    -- Tuples are polykinded since they need to handle both Type and Constraint+    -- (,) :: forall k . k -> k -> k+    -- etc.+    tuple n =+      let+        i = tupleConstr builtinLoc n+      in  (i, [entry i $ EForall QExpl [kk] $ foldr kArrow kv (replicate n kv)])+    -- (=>) :: forall k . Constraint -> k -> k+    kImplies = EForall QExpl [kk] $ kConstraint `kArrow` (kv `kArrow` kv)+    -- (~) :: forall k . k -> k -> Constraint+    kTypeEqual = EForall QExpl [kk] $ kv `kArrow` (kv `kArrow` kConstraint)+  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 identArrow    kTypeTypeTypeS]),+       (mkIdentB "=>",           [entry identImplies  kImplies]),+       (mkIdentB "~",            [entry identTypeEq   kTypeEqual]),+       -- Primitives.hs uses the type [], and it's annoying to fix that.+       -- XXX should not be needed+       (identList,               [entry identList     kTypeTypeS]),+       (mkIdentB "[]",           [entry identList     kTypeTypeS]),+       (mkIdentB "\x2192",       [entry identArrow    kTypeTypeTypeS]),  -- ->+       (mkIdentB "\x21d2",       [entry identImplies  kImplies])         -- =>+      ] +++      map tuple (0 : enumFromTo 2 maxTuple)++-- E.g.+--  True :: Bool+--  (&&) :: Bool -> Bool+--  Just :: forall a . a -> Maybe a+--  ,    :: forall a b . a -> b -> (a,b)+primValues :: [(Ident, [Entry])]+primValues =+  let+    idk i = IdKind (mkIdent ("a" ++ show (i::Int))) kType+    tuple n =+      let+        c = tupleConstr builtinLoc n+        vks = [idk i | i <- enumFromTo 1 n]+        ts = map tVarK vks+        r = tApps c ts+      in  (c, [Entry (ECon $ ConData [(c, n)] c []) $ EForall QExpl vks $ EForall QExpl [] $ foldr tArrow r ts ])+    tyCons = EForall QExpl [ka] $ EForall QExpl [] $ a `tArrow` la `tArrow` la+    tyNil = EForall QExpl [ka] $ EForall QExpl [] la+    ka = idk 1+    a = tVarK ka+    la = tApp (EVar identList) a+  in  [(mkIdentB ":",  [Entry conCons tyCons])+      ,(mkIdentB "[]", [Entry conNil  tyNil])] +++      map tuple (0 : enumFromTo 2 maxTuple)++kArrow :: EKind -> EKind -> EKind+kArrow = tArrow++sArrow :: ESort -> ESort -> ESort+sArrow = tArrow++setUVar :: TRef -> EType -> T ()+setUVar r1 (EUVar r2) | r1 <= r2 = error "setUVar"+setUVar i t = modify $ \ ts -> ts{ uvarSubst = IM.insert i t (uvarSubst ts) }++getUVar :: Int -> T (Maybe EType)+getUVar i = gets (IM.lookup i . uvarSubst)++munify :: HasCallStack =>+          SLoc -> Expected -> EType -> T ()+munify loc (Infer r) b = tSetRefType loc r b+munify loc (Check a) b = unify loc a b++-- Synonyms are expanded after kind checking.+-- There should be no synonyms in any of the symbol tables (except synTable).+expandSyn :: HasCallStack =>+             EType -> T EType+--expandSyn at | trace ("expandSyn: " ++ show at) False = undefined+expandSyn at = do+  syns <- gets synTable+  let+    rt = expandSyn' syns at+    -- Check that there are no unexpanded synonyms left+    chk (EApp f a) = do chk f; chk a+    chk (EVar i) =+      case M.lookup i syns of+        Nothing -> return ()+        _ -> tcError (getSLoc i) $ "bad synonym use: " ++ show i ++ " in " ++ show at+    chk (EUVar _) = return ()+    chk (EForall _ _ t) = chk t+    chk (ELit _ _) = return ()+    chk _ = impossible+  chk rt+  return rt++expandSynNoChk :: HasCallStack =>+                  EType -> T EType+expandSynNoChk t = do+  syns <- gets synTable+  return $ expandSyn' syns t++-- Expand with the given synonym table.+expandSyn' :: HasCallStack =>+              SynTable -> EType -> EType+expandSyn' syns = esyn+  where+    esyn = syn []+    -- Expand synonyms that have enough arguments+    syn ts t =+      case t of+        EApp f a -> syn (esyn a : ts) f+        EVar i ->+          case M.lookup i syns of+            Nothing -> eApps t ts+            Just (EForall _ vks tt) ->+              let is = map idKindIdent vks+                  s = zip is ts+                  lis = length is+                  lts = length ts+              in  if lis > lts then+                    eApps t ts+                  else+                    -- Too few arguments, just leave it alone+                    syn (drop lis ts) (subst s tt)+            Just _ -> impossible+        EUVar _ -> eApps t ts+        ESign a _ -> syn ts a   -- Throw away signatures, they don't affect unification+        EForall b iks tt | null ts -> EForall b iks (esyn tt)+        ELit _ (LStr _) -> t+        ELit _ (LInteger _) -> t+        _ -> impossibleShow t+++mapEType :: (EType -> EType) -> EType -> EType+mapEType fn = rec+  where+    rec (EApp f a) = EApp (rec f) (rec a)+    rec (ESign t k) = ESign (rec t) k+    rec (EForall b iks t) = EForall b iks (rec t)+    rec t = fn t++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 b iks t -> EForall b <$> iks' <*> derefUVar t+      where iks' = mapM (\ (IdKind i k) -> IdKind i <$> derefUVar k) iks+    ELit _ (LStr _) -> return at+    ELit _ (LInteger _) -> return at+    _ -> impossible++tcErrorTK :: HasCallStack =>+             SLoc -> String -> T ()+tcErrorTK loc msg = do+  tcm <- gets tcMode+  tcError loc $ msgTCMode' tcm ++ " error: " ++ msg++-- For error messages+msgTCMode :: TCMode -> String+msgTCMode TCExpr = "value"+msgTCMode TCType = "type"+msgTCMode TCKind = "kind"+msgTCMode TCSort = "sort"++msgTCMode' :: TCMode -> String+msgTCMode' TCExpr = "type"+msgTCMode' TCType = "kind"+msgTCMode' TCKind = "sort"+msgTCMode' TCSort = "realm"++unify :: HasCallStack =>+         SLoc -> EType -> EType -> T ()+unify loc a b = unifyR loc a b++unifyR :: HasCallStack =>+          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 loc t1@(EUVar r1) t2@(EUVar r2) | r1 < r2   = unifyVar loc r2 t1   -- always make higher+                                       | r1 > r2   = unifyVar loc r1 t2   --   TRefs point to lower+                                       | otherwise = 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+    -- Defer to constraint solver.+    -- XXX needs changing if we have kind equalities.+    TCExpr -> addEqConstraint loc t1 t2+    _      -> tcErrorTK loc $ "cannot unify " ++ showExpr t1 ++ " and " ++ showExpr t2++unifyVar :: HasCallStack =>+            SLoc -> TRef -> EType -> T ()+unifyVar loc r t = do+  mt <- getUVar r+--  tcTrace $ "unifyVar: " ++ show (r,t)+  case mt of+    Nothing -> unifyUnboundVar loc r t+    Just t' -> unify loc t' t++-- Unify an unbount tyvar r1 with the type at2+unifyUnboundVar :: HasCallStack =>+                   SLoc -> TRef -> EType -> T ()+unifyUnboundVar loc r1 at2@(EUVar r2) = do+  -- We know r1 /= r2+  mt2 <- getUVar r2+  case mt2 of+    Nothing ->+      -- Both are tyvars.  Always point later tyvars towards earlier ones.+      -- There generaliation step in tcBindGrp relies on this.+      if r1 > r2 then+        setUVar r1 at2+      else+        setUVar r2 (EUVar r1)+    Just t2 -> unify loc (EUVar r1) t2+unifyUnboundVar loc r1 t2 = do+  vs <- getMetaTyVars [t2]+  if r1 `elem` vs then+    tcErrorTK loc $ "cyclic " ++ showExpr (EUVar r1) ++ " = " ++ showExpr t2+   else+    setUVar r1 t2++-- Reset unification map+tcReset :: T ()+tcReset = modify $ \ ts -> ts{ uvarSubst = IM.empty }++newUVar :: T EType+newUVar = EUVar <$> newUniq++newIdent :: SLoc -> String -> T Ident+newIdent loc s = do+  u <- newUniq+  return $ mkIdentSLoc loc $ s ++ uniqIdentSep ++ show u++tLookup :: HasCallStack =>+           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+{-+      tcm <- gets tcMode+      tcTrace ("TCMode=" ++ show tcm)+      tcTrace ("Value table:\n" ++ show env)+      tenv <- gets typeTable+      tcTrace ("Type table:\n" ++ show tenv)+-}+      tcError (getSLoc i) e++tLookupV :: HasCallStack =>+           Ident -> T (Expr, EType)+tLookupV i = do+  tcm <- gets tcMode+  tLookup (msgTCMode tcm) i++tInst :: HasCallStack => Expr -> EType -> T (Expr, EType)+--tInst ae t | trace ("tInst: " ++ show (ae, t)) False = undefined+tInst ae (EForall _ vks t) = do+  t' <- tInstForall vks t+  tInst ae t'+tInst ae at | Just (ctx, t) <- getImplies at = do+  --tcTrace $ "tInst: addConstraint: " ++ show ae ++ ", " ++ show d ++ " :: " ++ show ctx+{-+  if eqExpr ae eCannotHappen then+    -- XXX Gruesome hack.  This avoids adding constraints in cases like+    --  (C a => a) -> T `subsCheck` b+    undefined+    --tInst ae t+   else do+-}+    d <- newDict (getSLoc ae) ctx+    tInst (EApp ae d) t+tInst ae at = return (ae, at)++tInstForall :: [IdKind] -> EType -> T EType+tInstForall vks t =+  if null vks then+    return t+  else do+    let vs = map idKindIdent vks+    us <- mapM (const newUVar) vks+    return (subst (zip vs us) t)++tInst' :: EType -> T EType+tInst' (EForall _ vks t) = tInstForall vks t+tInst' t = return t++extValE :: HasCallStack =>+           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 :: HasCallStack =>+              Ident -> EType -> Expr -> T ()+extValETop i t e = do+  mn <- gets moduleName+  venv <- gets valueTable+  t' <- expandSyn t                 -- expand type synonyms before entering the symbol table+--  when (show i == "mkTyCon") $ traceM (show "extValETop " ++ show (i, t, t'))+  let qi = qualIdent mn i+      venv'  = stInsertGlbQ qi [Entry e t'] venv+      venv'' = stInsertGlbU  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 :: HasCallStack =>+              Ident -> EType -> T ()+extValQTop i t = do+  mn <- gets moduleName+  extValETop i t (EVar (qualIdent mn i))++extVal :: HasCallStack =>+          Ident -> EType -> T ()+extVal i t = extValE i t $ EVar i++extVals :: HasCallStack =>+           [(Ident, EType)] -> T ()+extVals = mapM_ (uncurry extVal)++extTyp :: Ident -> EKind -> T ()+extTyp i k = extTypE i k (EVar i)++extTypE :: Ident -> EKind -> EType -> T ()+extTypE i k t = do+  tenv <- gets typeTable+  putTypeTable (stInsertLcl i (Entry t k) tenv)++extTyps :: [(Ident, EType)] -> T ()+extTyps = mapM_ (uncurry extTyp)++extSyn :: Ident -> [IdKind] -> EType -> T ()+extSyn i iks t = do+  -- Eta reduce type synonyms.+  -- E.g. 'type T a = Maybe a' could be 'type T = Maybe'.+  case etaReduce iks t of+    (iks', t') -> do+      senv <- gets synTable+      putSynTable (M.insert i (EForall QExpl iks' t') senv)++extData :: Ident -> EDef -> T ()+extData i d = do+  denv <- gets dataTable+  putDataTable (M.insert i d denv)++extFix :: Ident -> Fixity -> T ()+extFix i fx = modify $ \ ts -> ts{ fixTable = M.insert i fx (fixTable ts) }++withExtVal :: forall a . HasCallStack =>+              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 . HasCallStack =>+               [(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 = [ (v, k) | IdKind v k <- iks, not (isDummyIdent v) ]+  venv <- gets typeTable+  extTyps env+  a <- ta+  putTypeTable venv+  return a++tcDefs :: HasCallStack => Flags -> ImpType -> [EDef] -> T [EDef]+tcDefs flags impt ds = do+  case impt of+    ImpNormal -> pure ()+    ImpBoot ->+      case filter (not . bootExportable) ds of+        d : _ -> tcError (getSLoc d) "not allowed in -boot"+        _ -> pure ()++--  tcTrace ("tcDefs 1:\n" ++ showEDefs ds)+  -- First, add infix declarations so the operators can be resolved+  mapM_ tcAddInfix ds                                 -- collect fixity declarations+  dst <- tcDefsType ds                                -- kind check type definitions+--  tcTrace ("tcDefs 2:\n" ++ showEDefs dst)+  mapM_ addTypeAndData dst                            -- add typedefinitions to the symbol table+  dste <- tcExpandClassInst impt dst                  -- expand class&instance, do deriving+  dumpIf flags Dderive $+    tcTrace' $ "expanded:\n" ++ showEDefs dste+--  tcTrace ("tcDefs 3:\n" ++ showEDefs dste)+  setDefault dste                                     -- set current defaults+  dste' <- tcDefsValue dste                           -- type check all value definitions+  mapM_ addAssocs dste'++  case impt of+    ImpNormal -> do+      return dste'+    ImpBoot ->+      -- remove value definitions+      return $ filter bootExportable dste'++bootExportable :: EDef -> Bool+bootExportable (Fcn _ _) = False+bootExportable (PatBind _ _) = False+bootExportable (Instance _ ms bs) = null ms && null bs+bootExportable StandDeriving{} = False+bootExportable _ = True++setDefault :: [EDef] -> T ()+setDefault defs = do+  tys <- gets typeTable+  ds <- sequence [ do { ts' <- mapM expandSyn ts; return (tyQIdent $ expLookup c tys, ts') }+                 | Default (Just c) ts <- defs ]+  dflts <- gets defaults+  let dflts' = foldr (uncurry M.insert) dflts ds+--  traceM $ "Active defaults " ++ show (M.toList dflts')+  putDefaults dflts'++tcAddInfix :: EDef -> T ()+tcAddInfix (Infix fx is) = do+  mn <- gets moduleName+  mapM_ (\ i -> extFix (qualIdent mn i) fx) is+tcAddInfix _ = return ()++-- Kind check type definitions+tcDefsType :: HasCallStack => [EDef] -> T [EDef]+tcDefsType ds = withTypeTable $ do+  kindSigs <- getKindSigns ds+  mapM_ (addTypeKind kindSigs) ds              -- Add the kind of each type to the environment+  dst <- mapM tcDefType ds                     -- Kind check all top level type expressions+--  vars <- gets uvarSubst+--  tcTrace $ show vars+  vt <- gets valueTable+  let ent (Entry i k) = Entry i <$> zonk k+      zonk k = mapEType def <$> (derefUVar k >>= expandSyn)+        where def (EUVar _) = kType    -- default kind variables to Type+              def t = t+      derefClass (Class ctx (n, vks) ct ms) = do+        vks' <- mapM (\ (IdKind i k) -> IdKind i <$> zonk k) vks+--        traceM("derefClass: " ++ show (n, vks, vks'))+        pure (Class ctx (n, vks') ct ms)+      derefClass d = pure d+  vt' <- mapMSymTab ent vt+  putValueTable vt'+  mapM derefClass dst    -- make class definition LHSs have correct kinds+--  tcTrace $ "tcDefType value table:\n" ++ show vt'++-- Get all kind signatures, and do sort checking of them.+getKindSigns :: HasCallStack => [EDef] -> T (M.Map EKind)+getKindSigns ds = do+  let iks = [ (i, k) | KindSign i k <- ds ]+      kind (i, k) = (,) i <$> tcKind (Check sKind) k+  multCheck (map fst iks)+  iks' <- mapM kind iks+  return $ M.fromList iks'++-- Expand class and instance definitions (must be done after type synonym processing).+tcExpandClassInst :: ImpType -> [EDef] -> T [EDef]+tcExpandClassInst impt dst = do+  dsf <- withTypeTable $ do+    dsc <- concat <$> mapM expandClass dst              -- Expand all class definitions+    concat <$> mapM expandField dsc                     -- Add HasField instances+  mapM_ addValueTypeClass dsf                           -- Add methods, needed while deriving+  dsd <-+    case impt of+      ImpBoot -> return dsf+      ImpNormal -> concat <$> mapM doDeriving dsf       -- Add derived instances+  concat <$> mapM expandInst dsd                        -- Expand all instance definitions++-- Check&rename the given kinds, also insert the type variables in the symbol table.+withVks :: forall a . HasCallStack => [IdKind] -> ([IdKind] -> T a) -> T a+withVks vks fun = assertTCMode (>=TCType) $ do+  tcm <- gets tcMode+  let+    expect = case tcm of { TCType -> sKind; TCKind -> rSort; _ -> undefined }+    loop r [] = fun (reverse r)+    loop r (IdKind i mk : iks) = do+      -- When we have 'forall k (a :: k) . t' the k is a kind.+      -- Instead we have have to write 'forall (k :: Kind) (a :: k) . t' and then+      -- we have to guess that k needs sort checking.+      -- This doesn't work if there is not exactly 'Kind' (e.g., 'Primitives.Kind')+      -- This sucks.+      if tcm == TCType && guessIsKind mk then do+        s <- withTypeTable $ withTypeTable $ tcExpr (Check rSort) mk+        let ik = IdKind i s+        withExtTyps [ik] $ loop (ik : r) iks+      else do+        k' <- case mk of+                EVar d | d == dummyIdent -> newUVar+                _                        -> withTypeTable $ tcExpr (Check expect) mk   -- bump to next level+        withExtVal i k' $ loop (IdKind i k' : r) iks+  loop [] vks++guessIsKind :: EType -> Bool+guessIsKind (EVar i)                      = i == mkIdent "Kind"+guessIsKind t =+  case getArrow t of+    Just (f, a) -> guessIsKind f || guessIsKind a+    _           -> False++-- Add symbol a table entry (with kind) for each top level typeish definition.+-- If there is a kind signature, use it.  If not, use a kind variable.+addTypeKind :: M.Map EKind -> EDef -> T ()+addTypeKind kdefs adef = do+  let+    addDef (i, _) = do+      k <- maybe newUVar return $ M.lookup i kdefs+      extValQTop i k++  case adef of+    Data    lhs _ _ -> addDef lhs+    Newtype lhs _ _ -> addDef lhs+    Type    lhs _   -> addDef lhs+    Class _ lhs _ _ -> addDef lhs+    _               -> return ()++-- Add symbols associated with a type.+addAssocs :: HasCallStack => EDef -> T ()+addAssocs adef = do+  mn <- gets moduleName+  let+    addAssoc ti is = do+      vt <- gets valueTable+      let val i =+            case stLookup "" i vt of+              Right e -> [ValueExport i e]+              _       -> []  -- fields with existential type have no selector+      addAssocTable (qualIdent mn ti) (concatMap val is)++    assocData (Constr _ _ c _ (Left _)) = [c]+    assocData (Constr _ _ c _ (Right its)) = c : map fst its++  case adef of+    Data    (i, _) cs _ | not (isMatchDataTypeName i)+                        -> addAssoc i (nub $ concatMap assocData cs)+    Newtype (i, _) c  _ -> addAssoc i (assocData c)+    Class _ (i, _) _ ms -> addAssoc i [ x | Sign ns _ <- ms, m <- ns, x <- [m, mkDefaultMethodId m] ]+    _                   -> return ()++-- Add type synonyms to the synonym table, and data/newtype to the data table.+addTypeAndData :: EDef -> T ()+addTypeAndData adef = do+  mn <- gets moduleName+  case adef of+    Type    (i, vs) t  -> extSyn  (qualIdent mn i) vs t+    Data    (i, _) _ _ -> extData (qualIdent mn i) adef+    Newtype (i, _) _ _ -> extData (qualIdent mn i) adef+    _                  -> return ()++-- Do kind checking of all typeish definitions.+tcDefType :: HasCallStack => EDef -> T EDef+tcDefType def = do+  case def of+    Data    lhs cs ds      -> withLHS lhs $ \ lhs' -> cm kType       <$> (Data    lhs'  <$> mapM tcConstr cs <*> mapM (tcDeriving lhs') ds)+    Newtype lhs c  ds      -> withLHS lhs $ \ lhs' -> cm kType       <$> (Newtype lhs'  <$> tcConstr c       <*> mapM (tcDeriving lhs') ds)+    Type    lhs t          -> withLHS lhs $ \ lhs' -> first              (Type    lhs') <$> tInferTypeT t+    Class   ctx lhs fds ms -> withLHS lhs $ \ lhs' -> cm kConstraint <$> (Class         <$> tcCtx ctx <*> return lhs' <*> mapM tcFD fds <*> mapM tcMethod ms)+    Sign      is t         ->                                            Sign      is   <$> tCheckTypeTImpl QImpl kType t+    ForImp cc ie i t       ->                                            ForImp cc ie i <$> tCheckTypeTImpl QImpl kType t+    Instance ct m e        ->                                            Instance       <$> tCheckTypeTImpl QExpl kConstraint ct <*> return m <*> return e+    Default mc ts          ->                                            Default (Just c) <$> mapM (tcDefault c) ts+                                                                           where c = fromMaybe num mc+-- We cant't do this now, because the classTable has not been fully populated yet.+-- Instead, we do it in the deriving stage.+--    StandDeriving st _ ct  ->                                            tcStand st ct+    _                      -> return def+ where+   cm = flip (,)+   tcMethod (Sign    is t) = Sign    is <$> (tCheckTypeTImpl QImpl kType t >>= expandSyn)+   tcMethod (DfltSign i t) = DfltSign i <$> (tCheckTypeTImpl QImpl kType t >>= expandSyn)+   tcMethod m              = return m+   tcFD (is, os) = (,) <$> mapM tcV is <*> mapM tcV os+     where tcV i = do { _ <- tLookup "fundep" i; return i }+   num = mkBuiltin noSLoc "Num"+   tcDefault c t = do+     EApp _ t' <- tCheckTypeT kConstraint (EApp (EVar c) t)+     return t'++-- A standalone deriving has a regular instance head.+-- If it has a via clause, the via type has to have the same kind+-- as the type in the instance head.+tcStand :: DerStrategy -> EConstraint -> T EDef+tcStand st ct = do+     ct' <- tCheckTypeTImpl QExpl kConstraint ct+     -- We need the kind of the type in the instance head.+     -- It's needed for the number of arguments to "eta reduce",+     -- and also for kind checking the via type.+     -- So find the kind of the last argument to the class+     (vks, kty) <- do+       let (cvks, _ctx, cty) = splitContext ct'+           cls = fst $ getApp cty+       ctbl <- gets classTable+       case M.lookup cls ctbl of+         Just (ClassInfo vks@(_:_) _ _ _ _) -> case last vks of IdKind _ k -> return (cvks, k)+         _ -> tcError (getSLoc ct) $ "not a class " ++ showIdent cls+     let narg = length $ fst $ getArrows kty+     st' <-+       case st of+         DerVia t -> DerVia <$> withExtVals (map (\ (IdKind i k) -> (i, k)) vks)+                       (tCheckTypeT kty t)   -- make sure the via type has the same kind+         _ -> return st+     pure $ StandDeriving st' narg ct'++-- The type variables vks are already in scope when we get here.+tcDeriving :: LHS -> Deriving -> T Deriving+tcDeriving (tyId, vks) (Deriving strat cs) = do+  let tcDerive (_, c) = do+        let loc = getSLoc c+        -- The kind of c has to be of the form (k1 -> ... kn -> Type) -> Constraint+        -- Check that it is.+        k <- newUVar+        --traceM $ "tcDerive 1: " ++ show c+        c' <- tCheckTypeTImpl QExpl (k `kArrow` kConstraint) c+        --traceM $ "tcDerive 2: " ++ show c+        (ks, _) <- getArrows <$> derefUVar k  -- get [k1,...,kn] and final kind+        -- Checking that the final kind is Type happens with the tc call below.+        let r = length ks                      -- number of args consumed by c+            m = length vks                     -- number of args given to the data type+            i = m - r                          -- keep this many+            ty = tApps tyId (map (EVar . idKindIdent) (take i vks))+        when (i < 0) $+          tcError loc "Bad deriving"+        -- The generated instance has the form 'instance ... => c ty'.+        -- Check that this has kind Constraint.+        -- Also check that any via type also fulfills this.+        let tc t = do _ <- tCheckTypeTImpl QExpl kConstraint (tApp c t); return ()+        tc ty+        case strat of+          DerVia v -> tc v  -- XXX should this allow implicit quantification?+          _        -> return ()+        return (r, c')++  cs' <- mapM tcDerive cs+  -- Ignore the kind here, it's checked for each derived type+  strat' <- case strat of+              DerVia t -> DerVia . fst <$> tInferTypeT t+              _        -> return strat+  return $ Deriving strat' cs'++withLHS :: forall a . HasCallStack => LHS -> (LHS -> T (a, EKind)) -> T a+withLHS (i, vks) ta = do+  (_, ki) <- tLookupV i+  withVks vks $ \ vks' -> do+    (a, kr) <- ta (i, vks')+    let kapp = foldr (kArrow . (\ (IdKind _ k) -> k)) kr vks'+    -- XXX polykinded definitions don't work properly+    _ <- subsCheckRho (getSLoc i) eCannotHappen ki kapp+    return a++tcCtx :: HasCallStack => [EConstraint] -> T [EConstraint]+tcCtx = mapM (tCheckTypeT kConstraint)++tcConstr :: HasCallStack => Constr -> T Constr+tcConstr (Constr iks ct c inf ets) =+  assertTCMode (==TCType) $+  withVks iks $ \ iks' ->+    Constr iks' <$> tcCtx ct <*> pure c <*> pure inf <*>+      case ets of+        Left  x -> Left  <$> mapM (\ (s,t)     ->        (,)s <$> tcTypeT (Check kType) t) x+        Right x -> Right <$> mapM (\ (i,(s,t)) -> (,)i . (,)s <$> tcTypeT (Check kType) t) x++-- 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.+expandClass :: EDef -> T [EDef]+expandClass dcls@(Class _ctx (iCls, vks) _fds ms) = do+  mn <- gets moduleName+  let+      meths = [ b | b@(Sign _ _) <- ms ]+      mdflts = [ (i, eqns) | Fcn i eqns <- ms ]+      dflttys = [ (i, t) | DfltSign i t <- ms ]+      tCtx = tApps (qualIdent mn iCls) (map (EVar . idKindIdent) vks)+      mkDflt (Sign is t) = concatMap method is+        where method methId = [ Sign [iDflt] $ EForall QExpl vks $ tCtx `tImplies` ty, def $ lookup methId mdflts ]+                where ty = fromMaybe t $ lookup methId dflttys+                      def Nothing = Fcn iDflt $ etaExp ty noDflt+                      def (Just eqns) = Fcn iDflt eqns+                      iDflt = mkDefaultMethodId methId+                      noDflt = mkExn (getSLoc methId) (unIdent methId) "noMethodError"+      mkDflt _ = impossible+      -- The type checker cannot handle something like+      --   foo :: ((forall a . a -> Int) -> Int) -> Int+      --   foo = undefined+      -- but the eta expanded version is acceptable, so we eta expand+      -- default methods.+      -- XXX This isn't really enough for complicated nested quantifiers.+      etaExp t e =+        let n = countArrows t+            vs = replicate n (EVar dummyIdent)+        in  [Eqn vs $ simpleAlts e]+      dDflts = concatMap mkDflt meths+  return $ dcls : dDflts+expandClass d = return [d]++-- Ignoring initial quantifiers and context, how many arrows does the type have?+countArrows :: EType -> Int+countArrows (EForall _ _ t) = countArrows t+countArrows t | Just (_, t') <- getImplies t = countArrows t'+              | otherwise = length . fst . getArrows $ t++simpleEqn :: Expr -> [Eqn]+simpleEqn e = [Eqn [] $ simpleAlts e]++simpleAlts :: Expr -> EAlts+simpleAlts e = EAlts [([], e)] []++-- Due to the way fundeps are resolved we need to canonicalize the them.+-- If there are fundeps 'a->b, c->d' we needs to add their combination 'a c -> b d'.+-- Furthermore, we need to take the transitive closure.  So of we have 'a -> b, b -> c'+-- we need to have 'a -> b c, b -> c'.+-- This uses very slow algorithms, but given the size of fundeps that doesn't matter.+mkIFunDeps :: [Ident] -> [FunDep] -> [IFunDep]+mkIFunDeps vs afds =+  let fdss :: [[FunDep]]+      fdss = filter (not . null) $ subsequences $ closure $ map normal afds  -- all possible non-empty combinations+      fds :: [FunDep]+      fds = nub $ filter (not . null . snd) $+            map (\ xs -> let (iss, oss) = unzip xs in red (conc iss) (conc oss)) fdss+      conc :: [[Ident]] -> [Ident]+      conc = nub . sort . concat+      red :: [Ident] -> [Ident] -> ([Ident], [Ident])+      red is os = (is, os \\ is)  -- don't repeat an input in the output+      normal :: FunDep -> FunDep  -- avoid duplications and input variables among the outputs+      normal (is, os) = (is', nub os \\ is') where is' = nub is+      closure :: [FunDep] -> [FunDep]+      closure cfds =+        let cfds' = closeStep cfds+            closeStep = map addTrans+            addTrans (is, os) = (is, (xs \\ is) ++ os)+              where xs = nub $ concatMap trans cfds+                    trans (tis, tos) | null (tis \\ os) = tos \\ os  -- all inputs included in the output, so add these+                                     | otherwise = []+        in  if cfds == cfds' then cfds else closure cfds'+  in  --trace ("mkIFunDeps " ++ show (afds, fds)) $+      map (\ (is, os) -> (map (`elem` is) vs, map (`elem` os) vs)) fds++-- Turn (unqualified) class and method names into a default method name+mkDefaultMethodId :: Ident -> Ident+mkDefaultMethodId meth = addIdentSuffix meth defaultSuffix++isDefaultMethodId :: Ident -> Bool+isDefaultMethodId i = defaultSuffix `isSuffixOf` unIdent i++-- Is the second ident the default method of the first+isDefaultMethodOfId :: Ident -> Ident -> Bool+isDefaultMethodOfId i di =+  maybe False (\ s -> unIdent i == s) $+    stripSuffix defaultSuffix (unIdent di)++defaultSuffix :: String+defaultSuffix = uniqIdentSep ++ "dflt"++-- Split something of the form+--  forall vs . ctx => t+-- into (vs, ctx, t)+splitContext :: EConstraint -> ([IdKind], [EConstraint], EConstraint)+splitContext (EForall _ iks t) =+  case splitContext t of+    (iks', ctx, ct) -> (iks ++ iks', ctx, ct)+splitContext act =+  case getImplies act of+    Just (ctx, ct) ->+      case splitContext ct of+        (iks, ctxs, ct') -> (iks, ctx : ctxs, ct')+    _ -> ([], [], act)++-- expandInst runs when all kind checking has been done, but no value checking.+-- So any generated type expressions must be kind correct and fully qualified,+-- whereas value expressions do not.+expandInst :: EDef -> T [EDef]+expandInst dinst@(Instance act bs extra) = do+  (vks, ctx, cc) <- splitContext <$> expandSyn act+  let loc = getSLoc act+      qiCls = getAppCon cc+      iInst = mkInstId loc cc+--  tcTrace ("expandInst " ++ show iInst)+--  (e, _) <- tLookupV iCls+  ct <- gets classTable+--  let qiCls = getAppCon e+  (ClassInfo _ supers _ mits fds) <-+    case M.lookup qiCls ct of+      Nothing -> tcError loc $ "not a class " ++ showIdent qiCls+      Just x -> return x+  let signs = [ (i, t) | Sign is t <- bs, i <- is ]+      addSign i e = maybe e (ESign e) $ lookup i signs+      clsMdl = qualOf qiCls                   -- get class's module name+      ies = [(i, addSign i $ ELam loc qs) | Fcn i qs <- bs]+      meth (i, t) = fromMaybe (mkDefault i t) $ lookup i ies+      meths = map meth mits+      sups = map (const (EVar $ mkIdentSLoc loc dictPrefixDollar)) supers+      args = sups ++ meths+      instBind (Fcn i _) = isJust $ lookup i mits+      instBind (Sign is _) = all (\ i -> isJust $ lookup i mits) is+      instBind _ = False+      -- When the method type has nested quantifiers the type checker cannot handle+      --  m = mDflt+      -- so we eta expand the definition t+      --  m $1 ... = mDflt $1 ...+      mkDefault i t = ELam loc [Eqn vs $ simpleAlts $ eApps (EVar dfltId) vs]+        where dfltId = setSLocIdent loc $ mkDefaultMethodId $ qualIdent clsMdl i+              vs = [EVar $ mkIdentSLoc loc $ "$" ++ show k | k <- [0 .. countArrows t - 1] ]+  case filter (not . instBind) bs of+    [] -> return ()+    b:_ -> tcError (getSLoc b) "superflous instance binding"++  let body = eEqns [] $ eLetB extra $ eApps (EVar $ mkClassConstructor qiCls) args+      bind = Fcn iInst body+      sign = Sign [iInst] $ eForall vks $ addConstraints ctx cc+  addInstTable [(EVar iInst, vks, ctx, cc, fds)]+  return [dinst, sign, bind]++expandInst d = return [d]++---------------------++tcDefsValue :: HasCallStack => [EDef] -> T [EDef]+tcDefsValue adefs = do+--  tcTrace $ "tcDefsValue: ------------ start"+  -- Gather up all type signatures, and put them in the environment.+  -- Definitions with no type signature will be missing.+  mapM_ addValueType adefs+  defs <- concat<$> mapM (dsPatBind <=< dsEFieldsBind) adefs+  let sccs = fst $ sccDefs defs+      tcSCC (AcyclicSCC d@Pattern{}) = tcPatSyn d+      tcSCC (AcyclicSCC d) = tInferDefs [d]+      tcSCC (CyclicSCC ds) = tInferDefs ds+  --traceM $ "tcDefsValue: unsigned=" ++ show unsigned+  -- type infer and enter each SCC in the symbol table+  -- return inferred Sign+  signDefs <- mapM tcSCC sccs+  defs' <- concat <$> mapM expandPatSyn defs+--  traceM $ "tcDefsValue: ------------ expandPatSyn"+--  traceM $ showEDefs defs'+--  tcTrace $ "tcDefsValue: ------------ check"+  --  type check all definitions (the inferred ones will be rechecked)+  defs'' <- mapM (\ d -> do { tcReset; tcDefValue d}) defs'+  let defs''' = concat signDefs ++ defs''+--  traceM $ "tcDefsValue: ------------ done"+--  traceM $ showEDefs defs'''+  pure defs'''++-- Find definitions without a type signature and split them+-- into strongly connected components.+-- Also return definitions with signatures.+sccDefs :: [EDef] -> ([SCC EDef], [EDef])+sccDefs defs =+  let smap = M.fromList $ [ (i, ()) | Sign is _ <- defs, i <- is ]+      -- Split Fcn into those without and with type signatures+      (unsigns, signs) = partition noSign defs+        where noSign (Fcn i _) = hasNoSign i+              noSign (Pattern (i, _) _ _) = hasNoSign i+              noSign (PatBind _ _) = impossible+              noSign _ = False+              hasNoSign i = isNothing $ M.lookup i smap+      -- split the unsigned defs into strongly connected components+      sccs = stronglyConnComp $ map node unsigns+        where node d@(Fcn i e)             = (d, i, allVarsEqns e)  -- XXX should really be allFreeVars+              node d@(Pattern (i, _) p me) = (d, i, allVarsPat p $ maybe [] allVarsEqns me)+              node _ = undefined+  in  (sccs, signs)++-- Infer a type for a strongly connected component of definitions.+-- Enter the deduced types into the global symbol table and return+-- signatures with the deduced types.+tInferDefs :: [EDef] -> T [EDef]+tInferDefs fcns = do+--  traceM "tInferDefs"+  tcReset+  -- Invent type variables for the definitions+  xts <-+       let f (Fcn i _)            = do t <- newUVar; pure [(i, t)]+           f (Pattern (i, _) _ _) = do t <- newUVar; pure [(i, t)]+           f _                    = impossible+       in  concat <$> mapM f fcns+  --tcTrace $ "tInferDefs: " ++ show (map fst xts)+  -- Temporarily extend the local environment with the type variables+  withExtVals xts $ do+    -- Infer types for all the Fcns, ignore the new bodies.+    -- The bodies will be re-typecked in tcDefsValues.+    let tc (Fcn _ eqns) (_, t)   = do tcEqns False t eqns; return ()+        tc (Pattern (i,_) _ _) _ = tcError (getSLoc i) "Cannot infer recursive pattern synonym types"+        tc _ _ = impossible+    zipWithM_ tc fcns xts+  -- Get the unsolved constraints+  ctx <- getUnsolved+  -- For each definition, quantify over the free meta variables, and include+  -- context mentioning them.+  let genTop :: (Ident, EType) -> T EDef+      genTop (i, t) = do+        t' <- derefUVar t+        let vs = metaTvs [t']+            ctx' = filter (\ c -> not (null (vs `intersect` metaTvs [c]))) ctx+            t'' = addConstraints ctx' t'+            vs' = metaTvs [t'']+        t''' <- quantify vs' t''+        --tcTrace $ "tInferDefs: " ++ showIdent i ++ " :: " ++ showEType t'''+        extValQTop i t'''+        return $ Sign [i] t'''+  mapM genTop xts++getUnsolved :: T [EConstraint]+getUnsolved = do+  _ <- solveConstraints+  ctx <- gets (map snd . constraints)+  ctx' <- mapM derefUVar ctx+  putConstraints []+  return $ nubBy eqEType ctx'++addValueType :: EDef -> T ()+addValueType adef = do+  mn <- gets moduleName+  -- tcTrace ("addValueType: " ++ showEDefs [adef])+  let addConFields _     (Constr _ _ _ _ (Left _)) = return ()+      addConFields tycon (Constr evks _ _ _ (Right fs)) = mapM_ addField fs+        where evs = map idKindIdent evks+              -- Don't add fields with existentials+              addField (fld, (_, ty)) | null (freeTyVars [ty] `intersect` evs) = do+                (fe, fty) <- tLookup "addValueType?" $ mkGetName tycon fld+                extValETop fld fty fe+              addField _ = return ()+      +  case adef of+    Sign is@(i:_) t | isConIdent i -> do+      -- pattern signature+      t' <- canonPatSynType t+      mapM_ (addPatSyn t') is+    Sign is t ->+      -- regular signature+      mapM_ (\ i -> extValQTop i t) is+    Data (tycon, vks) cs _ -> do+      multCheck [ c | Constr _ _ c _ _ <- cs ]+      let+        cti = [ (qualIdent mn c, either length length ets + if null ctx then 0 else 1) | Constr _ ctx c _ ets <- cs ]+        tret = tApps (qualIdent mn tycon) (map tVarK vks)+        addCon (Constr evks ectx c _ ets) = do+          let ts = either id (map snd) ets+              cty = EForall QExpl vks $ EForall QExpl evks $ addConstraints ectx $ foldr (tArrow . snd) tret ts+              fs = either (const []) (map fst) ets+          extValETop c cty (ECon $ ConData cti (qualIdent mn c) fs)+      mapM_ addCon cs+      mapM_ (addConFields tycon) cs+    Newtype (tycon, vks) con@(Constr _ _ c _ ets) _ -> do+      let+        t = snd $ head $ either id (map snd) ets+        tret = tApps (qualIdent mn tycon) (map tVarK vks)+        fs = either (const []) (map fst) ets+      extValETop c (EForall QExpl vks $ EForall QExpl [] $ tArrow t tret) (ECon $ ConNew (qualIdent mn c) fs)+      addConFields tycon con+    ForImp _ _ i t -> extValQTop i t+    Class ctx (i, vks) fds ms -> addValueClass ctx i vks fds ms+    _ -> return ()++-- Add methods to symbol table+addValueTypeClass :: EDef -> T ()+addValueTypeClass (Class ctx (i, vks) fds ms) = addValueClass ctx i vks fds ms+addValueTypeClass _ = return ()++-- Add a pattern synonym to the symbol table.+addPatSyn :: EType -> Ident -> T ()+addPatSyn at i = do+  mn <- gets moduleName+  let (_, _, _, _, t) = splitPatSynType at+      n = length $ fst $ getArrows t+      qi = qualIdent mn i+      qip = mkPatSynMatch qi+      mtch = (EVar qip, mkPatSynMatchType qip at)+  extValETop i at $ ECon $ ConSyn qi n mtch++-- Add mathods to the value table.+addValueClass :: [EConstraint] -> Ident -> [IdKind] -> [FunDep] -> [EBind] -> T ()+addValueClass ctx iCls vks fds ms = do+  mn <- gets moduleName+  let methIdTys = [ (i, t) | Sign is t <- ms, i <- is ]+      supTys = ctx  -- XXX should do some checking+      targs = supTys ++ map snd methIdTys+      qiCls = qualIdent mn iCls+      tret = tApps qiCls (map tVarK vks)+      cti = [ (qualIdent mn iCon, length targs) ]+      iCon = mkClassConstructor iCls+      iConTy = EForall QExpl vks $ foldr tArrow tret targs+      tvs = map (EVar . idKindIdent) vks+      methIdTys' = map (\ (i, t) -> (i, EForall QExpl vks $ tApps qiCls tvs `tImplies` t)) methIdTys+      addMethod (i, t) = extValETop i t (EVar $ qualIdent mn i)+  extValETop iCon iConTy (ECon $ ConData cti (qualIdent mn iCon) [])+  mapM_ addMethod methIdTys'+  -- Update class table, now with actual constructor type.+--  traceM $ "addValueClass " ++ show (iCls, vks)+  -- expand all type synonyms before entering the table+  info <- ClassInfo vks <$>+                    mapM expandSyn ctx <*>+                    expandSyn iConTy <*>+                    mapM (\ (i, t) -> (,) i <$> expandSyn t) methIdTys' <*>+                    return (mkIFunDeps (map idKindIdent vks) fds)+  addClassTable qiCls info++mkClassConstructor :: Ident -> Ident+mkClassConstructor i = addIdentSuffix i "$C"++tcDefValue :: HasCallStack =>+              EDef -> T EDef+tcDefValue adef =+  assertTCMode (==TCExpr) $+  case adef of+    Fcn i eqns -> do+      (_, t) <- tLookup "type signature" i+--      when (isConIdent i) $ do+--        tcTrace $ "tcDefValue: patsyn\n" ++ show i ++ " :: " ++ show t+--        tcTrace $ "tcDefValue:\n" ++ showEDefs [adef]+--      tcTrace $ "tcDefValue: ------- start " ++ showIdent i+--      tcTrace $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr t+--      tcTrace $ "tcDefValue: " ++ showEDefs [adef]+      teqns <- tcEqns True t eqns+--      tcTrace ("tcDefValue: after\n" ++ showEDefs [adef, Fcn i teqns])+--      cs <- gets constraints+--      tcTrace $ "tcDefValue: constraints: " ++ show cs+      checkConstraints+      mn <- gets moduleName+--      tcTrace $ "tcDefValue: " ++ showIdent i ++ " done"+      return $ Fcn (qualIdent' mn i) teqns+    ForImp cc ie i t -> do+      mn <- gets moduleName+      t' <- withNewtypeAsSyns (expandSyn t)+      pure $ ForImp cc ie (qualIdent' mn i) t'+    -- Check that a foreign export match the declaration type.+    -- In most cases the types will be the same, but the declaration can be overloaded+    -- so we need to ensure that it is compatible with the export definition.+    ForExp cc ms e t -> do+      ((e', t'), ds) <- solveAndDefault True $ tInferExpr (ESign e t)+      t'' <- withNewtypeAsSyns (expandSyn t')+      let e'' = eLetB (eBinds ds) e'+      pure $ ForExp cc (Just $ fromMaybe (show e) ms) e'' t''+    Pattern{} -> impossible+    _ -> return adef++qualIdent' :: IdentModule -> Ident -> Ident+qualIdent' mn i | isInstId i = i+                | otherwise  = qualIdent mn i++-- This is only used during inference.+-- When doing type checking the actual Pattern definition will have been+-- removed by expandPatSyn.+-- The important thing here is the call to addPatSyn+tcPatSyn :: EDef -> T [EDef]+tcPatSyn (Pattern (ip, vks) p me) = do+--  traceM $ "tcPatSyn: enter " ++ show (ip, vks, p, me)+  let step [] t = tcPat (Check t) p+      step (ik:iks) t = do+        (ti, tr) <- unArrow (getSLoc ik) t+        withExtVal (idKindIdent ik) ti $ step iks tr+  pty <- newUVar   -- invent a type+  (sks, dicts, _p) <- step vks pty+  let ctx2 = map snd dicts+--  traceM $ "tcPatSyn: pat " ++ show (sks, ctx2)+  case me of Nothing -> pure (); Just e -> void $ tcEqns False pty e+  ctx1 <- getUnsolved+--  traceM $ "tcPatSyn: ctx " ++ show ctx1+  ty0 <- addConstraints ctx2 <$> derefUVar pty+  let ctx1' = deleteFirstsBy eqEType ctx1 ctx2   -- remove provided from required+      (sks', sub) = tyVarSubst sks ty0           -- turn skolems+      ty1 = subst sub ty0                        --    into rigid tyvars+  ty2 <- quantify (metaTvs [ty1]) (addConstraints ctx1' ty1)+  let (vs, ty3) = unForall ty2+      ty4 = eForall' QImpl (sks' ++ vs) ty3      -- add the skolems tyvars+  ty5 <- canonPatSynType ty4+--  traceM $ "tcPatSyn: tys " ++ show (ty0, ty1, ty2, ty3, ty4, ty5)+  addPatSyn ty5 ip+--  traceM ("tcPatSyn: after " ++ show (ip, ty5))+  return [ Sign [ip] ty3 ]+tcPatSyn _ = impossible++-- Add implicit forall+addForall :: QForm -> EType -> T EType+addForall _ t@EForall{} = return t+addForall expl t = do+  bvs <- stKeysLcl <$> gets valueTable         -- bound outside+  let fvs = freeTyVars [t]                     -- free variables in t+      -- these are free, and need quantification.  eDummy indicates missing kind+      iks = map (\ i -> IdKind i eDummy) (fvs \\ bvs)+  --when (not (null iks)) $ tcTrace ("addForall: " ++ show (t, eForall iks t))+  return $ eForall' expl iks t++-- Add implicit forall and kind check, in type mode+tCheckTypeTImpl :: HasCallStack => QForm -> EType -> EType -> T EType+tCheckTypeTImpl expl tchk t = tCheckTypeT tchk =<< addForall expl t++-- Check type in type mode+tCheckTypeT :: HasCallStack => EType -> EType -> T EType+tCheckTypeT = tCheck tcTypeT++-- Infer type in type mode+tInferTypeT :: HasCallStack => EType -> T (EType, EKind)+tInferTypeT t = tInfer tcTypeT t++-- Kind check a type while already in type checking mode+tcTypeT :: HasCallStack =>+           Expected -> EType -> T EType+tcTypeT mk t = assertTCMode (==TCType) $ tcExpr mk (dsType t)++-- Kind check a type while in value checking mode+tcType :: HasCallStack =>+          Expected -> EType -> T EType+tcType mk = assertTCMode (==TCExpr) . withTypeTable . tcTypeT mk++-- Sort check a kind while already in sort checking mode+tcKindT :: HasCallStack =>+           Expected -> EKind -> T EKind+tcKindT mk t =+--  trace ("tcKindT: " ++ show (mk, t)) $+  assertTCMode (==TCKind) $ tcExpr mk t++-- Sort check a kind while in type checking mode+tcKind :: HasCallStack =>+          Expected -> EKind -> T EKind+tcKind mk = assertTCMode (==TCType) . withTypeTable . tcKindT mk++-- 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 simply given.+data Expected = Infer TRef | Check EType+--  deriving(Show)++instance Show Expected where+  show (Infer r) = "(Infer " ++ show r ++ ")"+  show (Check t) = "(Check " ++ show t ++ ")"++tInfer :: forall a b . HasCallStack =>+          (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 :: HasCallStack =>+              Expr -> T (Typed Expr)+tInferExpr = tInfer tcExpr++tCheckExpr :: HasCallStack =>+              EType -> Expr -> T Expr+tCheckExpr t e | Just (ctx, t') <- getImplies t = do+--  tcTrace $ "tCheckExpr: " ++ show (e, ctx, t')+  xt <- expandSyn t+  unless (eqEType t xt) undefined+  d <- newADictIdent (getSLoc e)+  e' <- withDict d ctx $ tCheckExprAndSolve t' e+  return $ eLam [EVar d] e'++tCheckExpr t e = tCheck tcExpr t e++tGetRefType :: HasCallStack =>+               TRef -> T EType+tGetRefType ref = do+  m <- gets uvarSubst+  case IM.lookup ref m of+    Nothing -> return (EUVar ref)+    Just t  -> return t++-- Set the type for an Infer+tSetRefType :: HasCallStack =>+               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++tcExpr :: HasCallStack =>+          Expected -> Expr -> T Expr+tcExpr mt ae = tcExprR mt ae {-do+  tcTrace ("tcExpr enter: mt=" ++ show mt ++ " ae=" ++ showExpr ae)+  r <- tcExprR mt ae+  tcTrace ("tcExpr exit: " ++ showExpr r)+  return r -}+tcExprR :: HasCallStack =>+           Expected -> Expr -> T Expr+tcExprR mt ae =+  let { loc = getSLoc ae } in+--  trace ("tcExprR " ++ show (ae, mt)) $+  case ae of+    EVar i | isIdent dictPrefixDollar i -> do+             -- Magic variable that just becomes the dictionary+             d <- newIdent (getSLoc i) dictPrefixDollar+             case mt of+               Infer _ -> impossible+               Check t -> addConstraint d t+             return (EVar d)++           | isDummyIdent i -> tcError loc "_ cannot be used as a variable"+           | 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+--             tcTrace $ "EVar: " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t' ++ " mt=" ++ show mt+             instSigma loc e t' mt+    EQVar e t ->  -- already resolved, just instantiate+             instSigma loc e t mt++    EApp f e ->+      case f of+        -- If we have parsed a e.lbl as a record select,+        -- but it turns out that the lbl is not a label,+        -- then we rejig the expression into function compositions,+        -- i.e., e . lbl.+        ESelect is@(lbl:_) -> do+          b <- isLabel lbl+          if b then+            tcExprAp mt ae []+           else+            --trace ("convert to . " ++ show (f, e)) $+            tcExpr mt (EOper e $ map (\ i -> (mkIdentSLoc (getSLoc i) ".", EVar i)) is)+        _ -> tcExprAp mt ae []++    EOper e ies -> tcOper e ies >>= tcExpr mt+    ELam _ qs -> tcExprLam mt loc qs+    ELit _ lit -> do+      tcm <- gets tcMode+      case tcm of+        TCType ->+          case lit of+            LStr _ -> instSigma loc (ELit loc lit) (tConI loc nameSymbol) mt+            LInteger _ -> instSigma loc (ELit loc lit) (tConI loc nameNat) mt+            _      -> impossible+        TCExpr -> do+          let getExpected (Infer _) = pure Nothing+              getExpected (Check t) = Just <$> derefUVar t+          case lit 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 (EVar v) | v == identInt     -> tcLit  mt loc (LInt    (fromInteger i))+                              | v == identInt64   -> tcLit  mt loc (LInt64  (fromInteger i))+                              | v == identWord    -> tcLit' mt loc (LInt    (fromInteger i)) (tConI loc nameWord)+                              | v == identWord64  -> tcLit' mt loc (LInt64  (fromInteger i)) (tConI loc nameWord64)+                              | v == identDouble  -> tcLit  mt loc (LDouble (fromInteger i))+                              | v == identFloat   -> tcLit  mt loc (LFloat  (fromInteger i))+                              | v == identInteger -> tcLit  mt loc lit+                _ -> do+                  (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromInteger"))+                  (_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 (EVar v) | v == mkIdent nameDouble -> tcLit mt loc (LDouble (fromRational r))+                              | v == mkIdent nameFloat  -> tcLit mt loc (LFloat (fromRational r))+                _ -> do+                  (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromRational"))+                  (_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+            -- This implements OverloadedStrings.  It causes a small slowdown (2%)+            LStr s -> do+              mex <- getExpected mt+              case mex of+                Just (EApp (EVar lst) (EVar c))+                 | lst == identList && c == identChar -> tcLit mt loc lit+                Just (EVar bs)+                 | bs == identByteString -> tcLit mt loc (LBStr s)+                _ -> do+                  (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromString"))+                  (_at, rt) <- unArrow loc ft+                  -- We don't need to check that _at is String, it's part of the fromString type.+                  --tcTrace ("LStr " ++ show (loc, r))+                  instSigma loc (EApp f ae) rt mt+            -- Not LInteger, LRat, LStr+            _ -> tcLit mt loc lit+        _ -> impossible+    ECase a arms -> do+      -- XXX should look more like EIf+      (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 ->+      case unTuple mt of+        Just ts | length ts == length es -> do+          ees <- zipWithM tCheckExpr ts es+          return (ETuple ees)+        _ -> do+          (ees, tes) <- mapAndUnzipM tInferExpr es+          let+            n = length es+            ttup = tApps (tupleConstr loc n) tes+          munify loc mt ttup+          return (ETuple ees)+    EParen e -> tcExpr mt e+    EDo mmn ass -> do+      case ass of+        [] -> impossible+        [as] ->+          case as of+            SThen a -> tcExpr mt a+            s -> tcError (getSLoc s) "bad final do statement"+        as : ss -> do+          let mkQual name = maybe (mkBuiltin loc name) (\mn -> qualIdent mn (mkIdentSLoc loc name)) mmn+          case as of+            SBind p a -> do+              nofail <- failureFree p+              let+                sbind = mkQual ">>="+                x = eVarI loc "$b"+                patAlt = [(p, simpleAlts $ EDo mmn ss)]+                failMsg s = EApp (EVar (mkQual "fail")) (ELit loc (LStr s))+                failAlt =+                  if nofail then []+                  else [(eDummy, simpleAlts $ failMsg "bind")]+              tcExpr mt (EApp (EApp (EVar sbind) a)+                              (eLam [x] (ECase x (patAlt ++ failAlt))))+            SThen a -> do+              let sthen = mkQual ">>"+              tcExpr mt (EApp (EApp (EVar sthen) a) (EDo mmn ss))++            SLet bs ->+              tcExpr mt (ELet bs (EDo mmn ss))++            SRec xs -> tcExpr mt $ EDo mmn (dsSRec mmn (mkQual "_mfix") (mkQual "return") xs : ss)++    ESectL e i -> tcLSect e i >>= tcExpr mt+    ESectR i e -> tcRSect i e >>= tcExpr mt+    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'')++    -- Translate (if | a1; | a2 ...) into+    --           (case [] of _ | a1; | a2 ...)+    EMultiIf a ->+      case a of+        EAlts [([], e)] [] -> tcExpr mt e+        _                  -> tcExpr mt $ ECase (EListish (LList [])) [(EVar (mkIdent "_"), a)]++    EListish (LList es) ->+      case unList mt of+        Just t -> do+          es' <- mapM (tCheckExpr t) es+          return (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+                SRec _ ->+                  tcError (getSLoc as) "rec not allowed"+      (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 (enumCall loc "From" [e])+    EListish (LFromTo     e1 e2)    -> tcExpr mt (enumCall loc "FromTo" [e1, e2])+    EListish (LFromThen   e1 e2)    -> tcExpr mt (enumCall loc "FromThen" [e1,e2])+    EListish (LFromThenTo e1 e2 e3) -> tcExpr mt (enumCall loc "FromThenTo" [e1,e2,e3])+    ESign e t -> do+{-+      -- As a hack, translate 'e :: T' to 'let s$999 :: T; s$999 = e in s$999'+      -- This will ensure that dictinaries are inserted in the right place.+      i <- newIdent (getSLoc e) "s"+      tcExpr mt $ ELet [Sign [i] t, Fcn i $ eEqns [] e] (EVar i)+-}+      -- XXX wrong for kind signatures+      t' <- withTypeTable $ tCheckTypeTImpl QImpl kType t >>= expandSyn+      case splitContext t' of+        -- No context, handle this without a 'let' to avoid bloat.+        ([], [], _) -> do+          e' <- instSigma loc e t' mt+          tCheckExpr t' e'+        _ -> do+          -- We have a forall/context.  As a hack, translate 'e :: T' to+          -- let s$999 :: T; s$999 = e in s$999+          -- This will ensure that dictinaries are inserted in the right place.+          -- XXX Maybe it would be better to have this as part of the code above?+          -- Or maybe do this rewrite all the time?+          i <- newIdent (getSLoc e) "s"+          let et = ELet [Sign [i] t, Fcn i $ eEqns [] e] (EVar i)+          tcExpr mt et++    -- Only happens in type&kind checking mode.+    EForall b vks t ->+--      assertTCMode (==TCType) $+      withVks vks $ \ vks' -> do+        tt <- tcExpr mt t+        derefUVar (EForall b vks' tt)+    EUpdate e flds -> do+      ises <- concat <$> mapM (dsEField flds e) flds+      mc <- getExprCon e+      case mc of+        Nothing -> do+          let ies = [ (i, e') | EField [i] e' <- ises ]+          if length ies == length ises then do   -- all updates are non-nested+            useCase <- needDsCase mt (map fst ies) e+            -- traceM ("useCase " ++ show (ae, useCase))+            case useCase of+              Nothing -> tcExpr mt $ foldr eSetFields e ises+              Just cs -> tcExpr mt $ dsUpdateCase cs e ies+           else+            tcExpr mt $ foldr eSetFields e ises+        Just c  -> tcExpr mt =<< dsRecCon unsetField c e ises+          +    ESelect is -> do+        let x = eVarI loc "$x"+        tcExpr mt $ eLam [x] $ foldl (\ e i -> EApp (eGetField i) e) x is+    ETypeArg _ ->+        tcError loc "Bad type application"+    _ -> error $ "tcExpr: cannot handle: " ++ show (getSLoc ae) ++ " " ++ show ae+      -- impossible++-- We need to use a case expression to do record updated if+--  * any field has existential type+--  * any field has universal type+--  * the type is polymorphic (i.e., potentially a polymorphic update)+-- This is partly guesswork.  We try:+--  * expected type known and "bad"+--  * type of scrutinee is "bad"+--  * the updated labels are not unique and all construct a "bad" type+needDsCase :: Expected -> [Ident] -> Expr -> T (Maybe [Constr])+needDsCase ex lbls ae =+  case ex of+    Infer _ -> need ae+    Check t -> liftA2 (<|>) (needT t) (need ae)+  where+    need :: Expr -> T (Maybe [Constr])+    need e = liftA2 (<|>)+               ((needT . snd) =<< noEffect (tInferExpr e))   -- try figuring out the type+               (asum <$> mapM needL lbls)+    -- Does the type need a case ?+    needT :: EType -> T (Maybe [Constr])+    needT at = do+      t <- expandSyn at+      case getAppM t of+        Nothing -> return Nothing+        Just (i, ts) -> do+          dt <- gets dataTable+          case M.lookup i dt of+            Just (Data _ cs _)   -> return $ if not (null ts) || any needC cs then Just cs  else Nothing+            Just (Newtype _ c _) -> return $ if not (null ts) ||     needC c  then Just [c] else Nothing+            _ -> return Nothing        -- we don't know which type it is+    -- Does a constructor need a case?+    needC :: Constr -> Bool+    needC (Constr _ _ _ _ (Left _)) = False+    needC (Constr vs _ _ _ (Right fs)) = not (null vs) || any (isForall . snd . snd) fs+      where isForall (EForall _ _ _) = True+            isForall _ = False+    needL :: Ident -> T (Maybe [Constr])+    needL lbl = do+      vt <- gets valueTable+      case stLookupGlbUnqMany lbl vt of+        -- check the return type of an unambiguous label+        Just [Entry _ t] | (t':_, _) <- getArrows (dropForallContext t) -> needT t'+        _ -> return Nothing++-- Do a record update using case.+dsUpdateCase :: [Constr] -> Expr -> [(Ident, Expr)] -> Expr+dsUpdateCase cs e ies = chkUsed $ ECase e $ map mkArm cs+  where+    loc = getSLoc e+    mkArm (Constr _ _ _ _ (Left _)) = (x, oneAlt x) where x = EVar $ mkIdentSLoc loc "x"+    mkArm (Constr _ _ c _ (Right fs)) = (eApps (EVar c) xs, oneAlt $ eApps (EVar c) (zipWith fld xs fs))+      where xs = [ EVar $ mkIdentSLoc loc $ "x$" ++ show i | i <- [1..length fs] ]+            fld x (i, _) = fromMaybe x $ lookup i ies+    chkUsed a = case map fst ies \\ [ f | Constr _ _ _ _ (Right fs) <- cs, (f, _) <- fs ] of+                  [] -> a+                  f:_ -> errorMessage loc $ "Unknown field " ++ show f++dsSRec :: Maybe Ident -> Ident -> Ident -> [EStmt] -> EStmt+dsSRec mmn imfix iret ss =+  let vs = ETuple $ map EVar $ concatMap getStmtBound ss+  in  SBind vs $ eAppI imfix $ eLam [ELazy True vs] $ EDo mmn (ss ++ [SThen $ eAppI iret vs])++-- A heuristic to decide if an identifier is a record label.+-- If the name is in the symbol table and has function type, we say no.+isLabel :: Ident -> T Bool+isLabel i = do+  env <- gets valueTable+  case stLookup "" i env of+    Left _ -> return True+    Right (Entry (EVar g) t) ->+      return $ isInfixOf "get$." (unIdent g) || countArrows t == 0+    Right _ -> undefined -- return True++tcExprAp :: HasCallStack =>+            Expected -> Expr -> [Expr] -> T Expr+--tcExprAp _ ae args | trace ("tcExprAp: " ++ show (ae, args)) False = undefined+tcExprAp mt ae args = do+  case ae of+    EApp f a -> tcExprAp mt f (a : args)+    EParen f -> tcExprAp mt f args+    EOper e ies -> tcOper e ies >>= \ eop -> tcExprAp mt eop args+    EVar i | isIdent dictPrefixDollar i -> impossibleShow ae+           | isDummyIdent i -> impossibleShow ae+           | otherwise -> do+             -- Type checking an expression (or type)+             (fn, t) <- tLookupV i+--             traceM ("tcExprAp " ++ show (fn, t))+             -- 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+--             tcTrace $ "exExprAp: EVar " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t' ++ " mt=" ++ show mt+             case fn of+               EVar ii | ii == mkIdent "Data.Function.$", f:as <- args -> tcExprAp mt f as+               _ -> tcExprApFn mt fn t' args+    EQVar f t ->  -- already resolved+      tcExprApFn mt f t args+    _ -> do+      (f, t) <- tInferExpr ae+      tcExprApFn mt f t args++data AnArg = ArgExpr Expr EType | ArgCtx EConstraint+  deriving Show++-- Instantiate a function, but delay generating the dictionaries.+-- When generating the dictionaries here (like tInst) there+-- is no type information; just a type variable.+-- By delaying the dictionary generation we gain more+-- type information, and can avoid let binding dictionaries by+--  * finding an already bound dictionary for the same constraint+--  * solving the constraint early+tcExprApFn :: HasCallStack =>+              Expected -> Expr -> EType -> [Expr] -> T Expr+--tcExprApFn mt fn fnt args | trace ("tcExprApFn: " ++ show (fn, fnt, args, mt)) False = undefined+tcExprApFn mt fn atfn aargs = do+  -- traceM $ "tcExprApFn: " ++ show (getSLoc aargs, mt, fn, atfn, aargs)+--  xx <- gets ctxTables+--  traceM $ "tcExprApFn: ctxTables=" ++ show xx+  let loc = getSLoc fn+--  (ctxs, tfn') <- tInstDelay atfn+--  traceM $ "tcExprApFn: (fn', tfn') = " ++ show (fn', tfn')+  let -- loop _ats aas ft | trace ("loop: " ++ show (aas, ft)) False = undefined+      loop ats [] ft = final (reverse ats) ft+      loop ats aas@(a:as) aft = do+        case nextArg aft of+          AReqd (IdKind i k) ft -> useType i k a ft+          AForall _ (IdKind i k:iks) ft | ETypeArg t <- a -> do+            -- traceM ("AForall " ++ show (i, t))+            useType i k t (EForall QExpl iks ft)+          AForall _ iks ft -> do+            ft' <- tInstForall iks ft+            loop ats aas ft'+          AConstaint ctx ft ->+            loop (ArgCtx ctx : ats) aas ft+          ARet -> do+            (at, rt) <- unArrow loc aft+            --traceM ("ARet " ++ show (at, rt))+            loop (ArgExpr a at : ats) as rt+        where useType i k t ft = do+                t' <- if t `eqEType` EVar dummyIdent+                      then newUVar+                      else tcType (Check k) t >>= expandSyn+                -- traceM ("useType: " ++ show (i, t', (subst [(i, t')] ft)))+                loop ats as (subst [(i, t')] ft)++      final :: [AnArg] -> EType -> T Expr+      final aats rt = do+{-+        rt' <- derefUVar rt+        mt' <- case mt of Check ttt -> Check <$> derefUVar ttt+                          _ -> return mt+        traceM $ "final: " ++ show (loc, aats, rt', mt')+-}+        -- We want to do the unification of rt ant mt before checking the argument to+        -- have more type information.  See tests/Eq1.hs.+        -- But instSigma may transform the input expression, so we have to be careful.+        let etmp = EUVar ugly+            ugly = -1::Int+        etmp' <- instSigma loc etmp rt mt++        let arg (ArgExpr e t) = do+              --t' <- derefUVar t+              --traceM ("final: checkSigma: " ++ show (e, t'))+              checkSigma e t+            arg (ArgCtx ctx) = newDict loc ctx+        args <- mapM arg aats+        let res = foldl EApp fn args+--        traceM (show res)++--        cc <- gets constraints+--        traceM $ "tcExprApFn: constraints=" ++ show cc++        case etmp' of+          EUVar _ -> return res   -- instSigma did nothing, this is the common case+          _ -> return $ substEUVar [(ugly, res)] etmp'+++  loop [] aargs atfn++-- Is a pattern failure free?+failureFree :: EPat -> T Bool+failureFree p@(EVar _) = failureFreeAp [] p+failureFree p@(EApp _ _) = failureFreeAp [] p+failureFree (ETuple ps) = and <$> mapM failureFree ps+failureFree (ESign p _) = failureFree p+failureFree (EAt _ p) = failureFree p+failureFree (ELazy True _) = return True+failureFree (ELazy False p) = failureFree p+failureFree (EViewPat _ p) = failureFree p+failureFree (EParen p) = failureFree p+failureFree _ = return False++failureFreeAp :: [Bool] -> EPat -> T Bool+failureFreeAp bs (EApp f a) = do+  b <- failureFree a+  failureFreeAp (b:bs) f+failureFreeAp bs (EVar v) | not (isConIdent v) = return True+                          | otherwise = do+                              (con, _) <- tLookupV v+                              return $ case con of+                                ECon (ConNew _ _) -> and bs+                                ECon (ConData [_] _ _) -> and bs  -- single constructor+                                _ -> False+failureFreeAp bs (ESign p _) = failureFreeAp bs p+failureFreeAp _ _ = return False  -- bad pattern, just ignore++eSetFields :: EField -> Expr -> Expr+eSetFields (EField is e) r =+  let loc = getSLoc is+      eCompose = EVar $ mkBuiltin loc "composeSet"+      has = map eHasField $ init is+      set1 = eSetField (last is)+      set = foldr (EApp . EApp eCompose) set1 has+  in  EApp (EApp set r) e+eSetFields _ _ = impossible++eHasField :: Ident -> Expr+eHasField i = EApp (EVar ihas) (eProxy i)+  where ihas = mkBuiltin (getSLoc i) "hasField"++eSetField :: Ident -> Expr+eSetField i = EApp (EVar iset) (eProxy i)+  where iset = mkBuiltin (getSLoc i) "setField"++eGetField :: Ident -> Expr+eGetField i = EApp (EVar iget) (eProxy i)+  where iget = mkBuiltin (getSLoc i) "getField"++eProxy :: Ident -> Expr+eProxy i = ESign proxy (EApp proxy (ELit loc (LStr (unIdent i))))+  where proxy = EVar $ mkBuiltin loc "Proxy"+        loc = getSLoc i++-- Turn+--   p = e+-- into (x1..xn are the variables in p)+--   tmp = e+--   x1 = case tmp of p -> x1+--   ...+--   xn = case tmp of p -> xn+-- Take care with bindings like x@p = e and turn them into+--   x = e+--   x1 = case x of p -> x1+--   ...+-- Extra weird, x@y@p+--   x = y+--   y = e+--   ...+dsPatBind :: EBind -> T [EBind]+dsPatBind (PatBind p e) = do+  let (xs, p') = getAts p+  (v, ys) <- case xs of+               [] -> do v <- newIdent (getSLoc e) patBindPrefix; return (v, [])+               v:vs -> return (v, vs)+  let de = fcn v e+      dy = map (\ y -> fcn y (EVar v)) ys+      ds = [ fcn i (ECase (EVar v) [(p', oneAlt $ EVar i)]) | i <- patVars p' ]+      fcn i b = Fcn i (eEqns [] b)+  return $ de : dy ++ ds+dsPatBind b = return [b]++patBindPrefix :: String+patBindPrefix = "pb"++{-+isPatBindVar :: Ident -> Bool+isPatBindVar = isPrefixOf (patBindPrefix ++ uniqIdentSep) . unIdent+-}++getAts :: EPat -> ([Ident], EPat)+getAts (EAt x p) = (x:xs, p') where (xs, p') = getAts p+getAts p = ([], p)++dsEFieldsBind :: EBind -> T EBind+dsEFieldsBind (PatBind p e) = PatBind <$> dsEFields p <*> return e+dsEFieldsBind b = return b++dsEField :: [EField] -> Expr -> EField -> T [EField]+dsEField _ _ e@(EField _ _) = return [e]+dsEField _ _ (EFieldPun is) = return [EField is $ EVar (last is)]+dsEField flds e EFieldWild = do+  let loc = getSLoc e+      ids = concatMap f flds  -- fields already present+            where f (EField [i] _) = [i]+                  f (EFieldPun [i]) = [i]+                  f _ = []+  mc <- getExprCon e+  case mc of+    Just c -> return [ EField [f'] (EVar f') | f <- conFields c, f `notElem` ids, let f' = setSLocIdent loc f ]+    _ -> tcError (getSLoc e) "record wildcard not allowed"++-- Patterns need to expand EFieldWild before type checking+dsEFields :: EPat -> T EPat+dsEFields apat =+  case apat of+    EVar _ -> return apat+    EApp p1 p2 -> EApp <$> dsEFields p1 <*> dsEFields p2+    EOper p1 ips -> EOper <$> dsEFields p1 <*> mapM (\ (i, p2) -> (,) i <$> dsEFields p2) ips+    ELit _ _ -> return apat+    ETuple ps -> ETuple <$> mapM dsEFields ps+    EListish (LList ps) -> EListish . LList <$> mapM dsEFields ps+    ESign p t -> ESign <$> dsEFields p <*> pure t+    EAt i p -> EAt i <$> dsEFields p+    EViewPat e p -> EViewPat e <$> dsEFields p+    ELazy z p -> ELazy z <$> dsEFields p+    ECon _ -> return apat+    EUpdate c fs -> EUpdate c . concat <$> mapM (dsEField fs c) fs+    EParen p -> dsEFields p+    ENegApp _ -> return apat+    EOr ps -> EOr <$> mapM dsEFields ps+    _ -> error $ "dsEFields " ++ show apat++unsetField :: Ident -> Expr+unsetField i = mkExn (getSLoc i) (unIdent i) "recConError"++-- Record construction, turn named fields into positional+dsRecCon :: (Ident -> Expr) -> Con -> Expr -> [EField] -> T Expr+dsRecCon unset c e flds = do+  let ises = map unEField flds+      fs = conFields c+      ies = map (first head) ises+      is = map fst ies+      as = map field fs+      field i = fromMaybe (unset i) $ lookup i ies+  case filter ((> 1) . length . fst) ises of+    (i:_, _):_ -> tcError (getSLoc i) "Nested fields not allowed"+    _ -> return ()+  case is \\ fs of+    vs@(v:_) -> tcError (getSLoc v) $ "extra field(s) " ++ unwords (map unIdent vs)+    _ -> return ()+  return $ eApps e as++-- Get the possible ECon from e.+getExprCon :: Expr -> T (Maybe Con)+getExprCon (EVar i) = do+  (e', _) <- tLookupV i+  case e' of+    ECon c -> return (Just c)+    _      -> return Nothing+getExprCon _ = return Nothing++enumCall :: SLoc -> String -> [Expr] -> Expr+enumCall loc f = eApps (EVar (mkBuiltin loc ("enum" ++ f)))++tcLit :: HasCallStack => Expected -> SLoc -> Lit -> T Expr+tcLit mt loc l@(LPrim _) = newUVar >>= tcLit' mt loc l+tcLit mt loc l@(LExn  _) = newUVar >>= tcLit' mt loc l+tcLit mt loc l = do+  let t =+        case l of+          LInt _     -> tConI loc nameInt+          LInt64 _   -> tConI loc nameInt64+          LInteger _ -> tConI loc nameInteger+          LDouble _  -> tConI loc nameDouble+          LFloat _   -> tConI loc nameFloat+          LChar _    -> tConI loc nameChar+          LStr _     -> tApp (tList loc) (tConI loc nameChar)+          LBStr _    -> tConI loc nameByteString+          _          -> 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 :: HasCallStack =>+          Expr -> [(Ident, Expr)] -> T Expr+tcOper ae aies = do+  fixs <- gets fixTable+  let+    opfix :: (Ident, Expr) -> T ((Expr, Fixity), Expr)+    opfix (i, e) = do+      (ei, _) <- tLookupV i+      let fx = getFixity fixs (getAppCon ei)+      return ((EVar i, fx), e)++  ites <- mapM opfix aies+  case resolveFixity ae ites of+    Left (loc, err) -> tcError loc err+    Right e -> return e++tcLSect :: Expr -> Ident -> T Expr+tcLSect (EOper e ies) op = do+  let x = eVarI loc "$x"+      loc = getSLoc op+  e' <- tcOper e (ies ++ [(op, x)])+  case e' of+    EApp f x' | x' `eqExpr` x -> return f+    _                   -> tcError loc "Bad section fixity"+tcLSect e op =+  return (EApp (EVar op) e)++tcRSect :: Ident -> Expr -> T Expr+tcRSect op (EOper e ies) = do+  let x = eVarI loc "$x"+      loc = getSLoc op+  e' <- tcOper x ((op, e):ies)+  case e' of+    EApp (EApp _ x') _ | x `eqExpr` x' -> return (eLam [x] e')+    _                            -> tcError loc "Bad section fixity"+tcRSect op e = do+  let x = eVarI (getSLoc op) "$x"+  return (eLam [x] (EApp (EApp (EVar op) x) e))++unArrow :: HasCallStack =>+           SLoc -> EType -> T (EType, EType)+--unArrow _ t | trace ("unArrow: " ++ show t) False = undefined+unArrow loc (EForall _ iks t) = do+  -- Found forall in a co-variant position.+  -- Make new unique tyvars in case of clashes.+  -- XXX Is this correct?+  (_, t') <- shallowSkolemise iks t+  unArrow loc t'+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)++unTuple :: Expected -> Maybe [EType]+unTuple (Infer _) = Nothing+unTuple (Check t) = getExprTuple t++unList :: Expected -> Maybe EType+unList (Check (EApp (EVar i) t)) | i == identList = Just t+unList _ = Nothing++getFixity :: FixTable -> Ident -> Fixity+getFixity fixs i = fromMaybe defaultFixity $ M.lookup i fixs++newADictIdent :: SLoc -> T Ident+newADictIdent loc = newIdent loc adictPrefix++newDictIdent :: SLoc -> T Ident+newDictIdent loc = newIdent loc dictPrefix++data Arg+  = AReqd         IdKind      EType       -- forall ->+  | AForall QForm [IdKind]    EType       -- forall .+  | AConstaint    EConstraint EType       -- =>+  | ARet                                  -- none of the above+--  deriving Show++nextArg :: EType -> Arg+nextArg (EForall _ []  t)                  = nextArg t+nextArg (EForall QReqd (ik:iks) t)         = AReqd ik (EForall QReqd iks t)+nextArg (EForall q     iks      t)         = AForall q iks t+nextArg t | Just (ctx, t') <- getImplies t = AConstaint ctx t'+          | otherwise                      = ARet++tcExprLam :: HasCallStack => Expected -> SLoc -> [Eqn] -> T Expr+tcExprLam mt loc qs = do+  t <- tGetExpType mt+  ELam loc <$> tcEqns False t qs++tcEqns :: HasCallStack => Bool -> EType -> [Eqn] -> T [Eqn]+tcEqns top t eqns = tcEqns' top t eqns++tcEqns' :: HasCallStack => Bool -> EType -> [Eqn] -> T [Eqn]+tcEqns' top at eqns =+  case at of+    EForall QExpl iks t -> withExtTyps iks $ tcEqns' top t eqns+    EForall QImpl   _ t ->                   tcEqns' top t eqns+    _ | Just (ctx, t') <- getImplies at -> do+      let loc = getSLoc eqns+      d <- newADictIdent 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)] [Fcn f eqns']+        return [eqn]+    _ -> do+      let loc = getSLoc eqns+      f <- newIdent loc "fcnS"+      (eqns', ds) <- solveAndDefault top $ mapM (tcEqn at) eqns+--  tcTrace $ "tcEqns done: " ++ showEBind (Fcn dummyIdent eqns')+      case ds of+        [] -> return eqns'+        _  -> do+          let+            bs = eBinds ds+            eqn = Eqn [] $ EAlts [([], EVar f)] (bs ++ [Fcn f eqns'])+          return [eqn]++tcEqn :: HasCallStack => EType -> Eqn -> T Eqn+--tcEqn t eqn | trace ("tcEqn: " ++ show eqn ++ " :: " ++ show t) False = undefined+tcEqn t (Eqn ps alts) =+  tcPats t ps $ \ t' ps' -> do+--      tcTrace $ "tcEqn " ++ show ps ++ " ---> " ++ show ps'+    alts' <- tcAlts t' alts+    return (Eqn ps' alts')++-- Only used above+tcPats :: HasCallStack =>+          EType -> [EPat] -> (EType -> [EPat] -> T Eqn) -> T Eqn+--tcPats t [] ta = ta t []+tcPats at pps ta =+  case nextArg at of+--    aa | trace ("tcPats: " ++ show (at, pps, aa)) False -> undefined+    AForall QExpl iks t  -> withExtTyps iks $ tcPats t pps ta+    AForall _     _    _ -> impossible   -- no nested implicit foralls+    AReqd (IdKind a k) t ->+      case pps of+        EVar i : ps -> withExtTyps [IdKind i k] $ do+          unless (isDummyIdent i) $+            addEqDict (EVar a) (EVar i)     -- This bound type variable is actually equal to the one in the signature+          tcPats t ps ta+        _ -> tcError (getSLoc pps) "Bad required type argument"+    AConstaint ctx t -> do+      d <- newADictIdent (getSLoc pps)+      withDict d ctx $ do -- XXX should we solve here?+        (eqn, ds) <- solveLocalConstraints $ tcPats t pps $ \ t' ps' -> ta t' (EVar d : ps')+        case ds of+          [] -> return eqn+          _  -> return $ addSolved ds eqn+    ARet | p:ps <- pps -> do+      (tp, tr) <- unArrow (getSLoc p) at+      -- tCheckPatC dicts used in tcAlt solve+      tCheckPatC tp p $ \ p' -> tcPats tr ps $ \ t' ps' -> ta t' (p' : ps')+         | otherwise -> ta at []   -- base case, no more arguments, explicit or implicit+++tcAlts :: HasCallStack => EType -> EAlts -> T EAlts+tcAlts t (EAlts alts bs) =+--  trace ("tcAlts: bs in " ++ showEBinds bs) $+  tcBinds bs $ \ bs' -> do+--    tcTrace ("tcAlts: bs out " ++ showEBinds bbs)+    alts' <- mapM (tcAlt t) alts+    return (EAlts alts' bs')++tcAlt :: HasCallStack => 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+  --traceM ("tcGuard: " ++ show p ++ " <- " ++ show e)+  ((e', tt), bs) <- solveLocalConstraints $ tInferExpr e+  let e'' = eLetB (eBinds bs) 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')+tcGuard (SRec ss) _ = tcError (getSLoc ss) "rec not allowed"++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 :: HasCallStack => 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 = [Fcn i $ simpleEqn e | (i, e) <- ds]++addSolved :: [Solved] -> Eqn -> Eqn+addSolved ies (Eqn ps (EAlts as bs)) = Eqn ps (EAlts as (eBinds ies ++ bs))++instPatSigma :: HasCallStack =>+                 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 :: HasCallStack =>+              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 (`elem` esc_tvs) skol_tvs+  unless (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 app ta = do+--  tcTrace $ "tCheckPatC: " ++ show app ++ " :: " ++ show t+  app' <- dsEFields app+  let vs = patVars app'+  multCheck vs+  env <- mapM (\ v -> (,) v <$> newUVar) vs+  withExtVals env $ do+    (_sks, ds, pp) <- tCheckPat t app'+--    tcTrace ("tCheckPatC: " ++ show pp)+--    xt <- derefUVar t+--    tcTrace ("tCheckPatC ds=" ++ show ds ++ "t=" ++ show xt)+    -- 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+      lit = tcPat mt (EViewPat (EApp (EVar (mkBuiltin loc "==")) ae) (eTrue loc))+      isNeg (EVar i) = i == mkBuiltin loc "negate"+      isNeg _ = False+  in+  case ae of+    EVar i | isDummyIdent i -> do+               -- _ can be anything, so just ignore it+               _ <- tGetExpType mt+               return ([], [], ae)+           | not (isConIdent i) -> do+               -- All pattern variables are in the environment as+               -- type references.  Assign the reference the given type.+               ext <- tGetExpType mt+               (p, t) <- tLookupV i+               unify loc t ext+               return ([], [], p)+           | otherwise -> tcPatAp mt [] ae+    EQVar _ _ -> tcPatAp mt [] ae+    EApp f _+           | isNeg f   -> lit            -- if it's (negate e) it must have been a negative literal+           | otherwise -> tcPatAp mt [] ae++    EOper e ies -> do e' <- tcOper e ies; tcPat mt e'++    ETuple es -> do+      let+        n = length es+      (xs, tes) <- mapAndUnzipM 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)++    EParen e -> tcPat mt e++    EListish (LList es) -> do+      te <- newUVar+      munify loc mt (tApp (tList loc) te)+      xs <- mapM (tCheckPat te) es+      case unzip3 xs of+        (sks, ds, es') -> return (concat sks, concat ds, EListish (LList es'))++    ELit _ _ -> lit++    ESign e t -> do+      typs <- gets typeTable+      let vs = freeTyVars [t] \\ getLocals typs+      mapM_ (\ v -> do kv <- newUVar; tv <- newUVar; extTypE v kv tv) vs+      t' <- tcType (Check kType) t >>= expandSyn+      instPatSigma loc t' mt+      tCheckPat t' e++    EAt i p -> do+      (_, ti) <- tLookupV i+      (sk, d, p') <- tcPat mt p+      munify loc mt ti+      return (sk, d, EAt i p')++    EViewPat e p -> do+      (e', ter) <-+        case mt of+          Infer _ -> do+            (e', te) <- tInferExpr e+            (tea, ter) <- unArrow loc te+            munify loc mt tea+            return (e', ter)+          Check tea -> do+            ter <- newUVar+            e' <- tCheckExpr (tea `tArrow` ter) e+            return (e', ter)+      (sk, d, p') <- tcPat (Check ter) p+      return (sk, d, EViewPat e' p')++    ELazy z p -> do+      (sk, d, p') <- tcPat mt p+      return (sk, d, ELazy z p')++    -- Allow C{} syntax even for non-records+    EUpdate p [] -> do+      (p', _) <- noEffect $ tInferExpr p+      let unApp n (EApp f _) = unApp (n+1) f  -- The constructor may have existential type, so strip the dictionaries.+          unApp n e = (n, e)+      case unApp 0 p' of+        (n, ECon c) -> tcPat mt $ eApps p (replicate (conArity c - n) eDummy)+        _      -> impossible+    EUpdate p isps -> do+      c <- fromMaybe impossible <$> getExprCon p+      tcPat mt =<< dsRecCon (const eDummy) c p isps++    EOr ps -> do+      let orFun = ELam noSLoc $ [ eEqn [p] true | p <- ps] ++ [ eEqn [eDummy] (eFalse loc) ]+          true = eTrue loc+      tcPat mt $ EViewPat orFun true++    _ -> error $ "tcPat: not handled " ++ show (getSLoc ae) ++ " " ++ show ae++-- The expected type is for (eApps afn (reverse args))+tcPatAp :: HasCallStack =>+           Expected -> [EPat] -> EPat -> T EPatRet+--tcPatAp mt args afn | trace ("tcPatAp: " ++ show (mt, args, afn)) False = undefined+tcPatAp mt args afn =+  case afn of+    EVar i | isConIdent i -> do+      (con, xpt) <- tLookupV i+      tcPatApCon mt args con xpt++    EQVar con xpt -> tcPatApCon mt args con xpt++    EApp f a -> tcPatAp mt (a:args) f++    EParen e -> tcPatAp mt args e++    _ -> tcError (getSLoc afn) ("Bad pattern " ++ show afn)++tcPatApCon :: Expected -> [EPat] -> EPat -> EType -> T EPatRet+tcPatApCon mt args con xpt = do+  let loc = getSLoc con+      nargs = length args+      checkArity ary | nargs < ary = tcError loc "too few arguments"+                     | nargs > ary = tcError loc "too many arguments"+                     | otherwise   = return ()+  case con of+    -- Pattern synonym+    ECon (ConSyn qi n (e, t)) -> do+      checkArity n+      let (_, yes, _) = mkMatchDataTypeConstr (mkPatSynMatch qi) xpt+          vp = EViewPat (EQVar e t) (eApps yes args)+      --traceM ("patsyn " ++ show vp)+      tcPat mt vp++    -- Regular constructor+    _ -> do+      case xpt of+         -- Sanity check+         EForall _ _ EForall{} -> return ()+         _ -> impossibleShow con+      EForall _ avs apt <- tInst' xpt++      (sks, spt) <- shallowSkolemise avs apt+      (df, pf, pt) <-+        case getImplies spt of+          Nothing -> return ([], con, apt)+          Just (ctx, pt') -> do+            di <- newADictIdent loc+            return ([(di, ctx)], EApp con (EVar di), pt')++      let ary = arity pf+            where arity (ECon c) = conArity c+                  arity (EApp f _) = arity f - 1  -- deal with dictionary added above+                  arity e = impossibleShow e+      checkArity ary++      let step [] t r = return (t, r)+          step (a:as) t (sk, d, f) = do+            (at, rt) <- unArrow loc t+            (ska, da, a') <- tCheckPat at a+            step as rt (ska ++ sk, da ++ d, EApp f a')+      (tt, (skr, dr, pr)) <- step args pt (sks, df, pf)++      pp <- case mt of+              Check ext -> subsCheck loc pr ext tt+              Infer r   -> do { tSetRefType loc r tt; return pr }+      return (skr, dr, pp)++eTrue :: SLoc -> Expr+eTrue l = EVar $ mkBuiltin l "True"++eFalse :: SLoc -> Expr+eFalse l = EVar $ mkBuiltin l "False"++multCheck :: [Ident] -> T ()+multCheck vs =+  when (anySame vs) $ do+    let v = head vs+    tcError (getSLoc v) $ "Multiply defined: " ++ showIdent v++tcBinds :: HasCallStack =>+           [EBind] -> ([EBind] -> T a) -> T a+tcBinds axbs ta =+  withFixes [ (i, fx) | Infix fx is <- axbs, i <- is ] $ do+  xbs <- concat <$> mapM (dsPatBind <=< dsEFieldsBind) axbs+  let+    getSign (Sign is t) = do+      tt <- withTypeTable $ tCheckTypeTImpl QImpl kType t >>= expandSyn+      return [(is, tt)]+    getSign _ = return []+  -- find and check all type signatures+  istss <- mapM getSign xbs+  multCheck $ getBindsVars xbs+  let (sccs, signs) = sccDefs xbs+  withExtVals [ (i, t) | ists <- istss, (is, t) <- ists, i <- is ] $ do+    nbss <- mapM tcBindGrp sccs  -- Check a group of bindings, and extend symbol table+    nbs <- mapM tcBind signs     -- All types known, so check the bidings with signatures.+    ta (concat (nbs : nbss))++tcBindGrp :: SCC EBind -> T [EBind]+tcBindGrp (AcyclicSCC d) = tcBindGrp' [d]+tcBindGrp (CyclicSCC ds) = tcBindGrp' ds++tcBindGrp' :: [EBind] -> T [EBind]+tcBindGrp' bs = do+--  traceM $ "tcBindGrp start: " ++ show (getSLoc bs, bs)+  let def (Fcn i _) = do t <- newUVar; return (i, t)+      def d = impossibleShow d+  xts <- mapM def bs                    -- add temporary types+  oldState <- get+  extVals xts                           -- Extend the symbol table with the temporary types.+                                        -- These will be removed by the 'withExtVals' in 'tcBinds'+  bs' <- mapM tcBind bs                 -- type check bindings+  -- The contorted nested ifs are for efficiency.+  --   first test for monomorphism restriction (cheap),+  --   next test if there are any new type variables in the return type (a little more expensive),+  --   finally test for type variables in the environment (expensive).+  if not (all isSynFcn bs') then        -- monomorphism restriction, also ensures pattern bindings are not polymorphic+    return bs'+   else do+    fvs <- getMetaTyVars (map snd xts)  -- all unification variables used in return type+    let u = unique oldState             -- first of the new type variables+        qvs = filter (>= u) fvs         -- variables introduced for the group that can be quantified+--    traceM $ "tcBindGrp: " ++ show (bs', ts', qvs)+    if null qvs then                    -- no variables to generalize+      return bs'+     else do+      let envts = getEnvTypes' oldState -- types in scope outside the group+      envvs <- getMetaTyVars envts      -- all unification variables in the environment+      let qvs' = qvs \\ envvs+      if null qvs' then                 -- no variables to generalize+        return bs'+       else do+       -- Generalize+       cs  <- gets constraints+       cs' <- mapM (derefUVar . snd) cs+       let multiParam ct = length (snd (getApp ct)) /= 1+       if any multiParam cs' then       -- temporary workaround for +         return bs'+        else do+        -- find constraints involving the local tyvars+        let ctx = nubBy eqEType $+                  filter (\ c -> not $ null $ intersect qvs' (metaTvs [c])) cs'+--        traceM $ "tcBindGrp: u=" ++ show u ++ " xts=" ++ show xts ++ " ts'=" ++ show ts' ++ " cs'=" ++ show cs'+--        sub <- gets uvarSubst+--        traceM $ "  subst=" ++ show (IM.toList sub)+        -- Compute actual type signatures.+        -- Pattern bindings are treated specially.  A binding+        --   let (x, y) = foo z+        -- is translated to+        --   let pb$1 = foo z+        --       x = case pb$1 of (x, y) -> x+        --       y = case pb$1 of (x, y) -> y+        -- It's importand that pb$1 is only evaluated once, so+        -- we treat it as a mononorphic binding.+        let one (i, t) = do+              t' <- (generalizeType (getSLoc i) qvs' . addConstraints ctx) =<< derefUVar t+--              traceM $ "tcBindGrp generalize " ++ show (i, t')+              return (i, t')+        rxts <- mapM one xts+--        traceM $ "tcBindGrp done: txts=" ++ show rxts+--        traceM $ "tcBindGrp done: bs'=" ++ show bs'+        if null ctx then do+          -- There are no added constraints, so the results from tcBind are correct+--          traceM $ "tcBindGrp return"+          extVals rxts                        -- add correct types to the symbol table+          return bs'+         else do+          -- There are constraints, so we need to re-typecheck for dictionary insertion.+          -- First reset to state before type checking the group.+--          traceM $ "tcBindGrp redo"+          put oldState                        -- reset state, with old constraints+          extVals rxts                        -- add correct types to the symbol table+          mapM tcBind bs                      -- and type check again++-- Is this syntactically a function?+isSynFcn :: EBind -> Bool+isSynFcn (Fcn _ (Eqn (_:_) _ : _)) = True+isSynFcn _ = False++generalizeType :: SLoc -> [TRef] -> EType -> T EType+generalizeType loc vs t = noEffect $ do           -- ignore the setUVar done in here+  let is = map (\ v -> mkIdentSLoc loc ('a':show v)) (metaTvs [t] `intersect` vs)+  zipWithM_ (\ v i -> setUVar v (EVar i)) vs is   -- make real type variables+  t' <- derefUVar t                               -- and substitute those+  return $ eForall' QImpl (map (`IdKind` EVar dummyIdent) is) t'++-- Temporarily extend the fixity table+withFixes :: [FixDef] -> T a -> T a+withFixes [] ta = ta+withFixes fixs ta = do+  oft <- gets fixTable+  modify $ \ st -> st{ fixTable = foldr (uncurry M.insert) oft fixs }+  a <- ta+  modify $ \ st -> st{ fixTable = oft }+  return a++tcBind :: EBind -> T EBind+tcBind abind =+  case abind of+    Fcn i eqns -> do+      (_, tt) <- tLookupV i+      teqns <- tcEqns False tt eqns+      return $ Fcn i teqns+    _ -> 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)+    EParen t -> dsType t+    ESign t k -> ESign (dsType t) k+    EForall b iks t -> EForall b iks (dsType t)+    ELit _ (LStr _) -> at+    ELit _ (LInteger _) -> at+    EQVar _ _ -> at+    _ -> impossibleShow at++tListI :: SLoc -> Ident+tListI loc = mkIdentSLoc loc nameList++tList :: SLoc -> EType+tList = tCon . tListI++tBool :: SLoc -> EType+tBool loc = tConI loc $ boolPrefix ++ "Bool"++showTModule :: forall a . (a -> String) -> TModule a -> String+showTModule sh amdl = "Tmodule " ++ showIdent (tModuleName amdl) ++ "\n" ++ sh (tBindingsOf amdl) ++ "\n"++-----------------------------------------------------++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 getEnvTypes'++getEnvTypes' :: TCState -> [EType]+getEnvTypes' = map entryType . stElemsLcl . valueTable++tyVarSubst :: [a] -> EType -> ([IdKind], [(a, EType)])+tyVarSubst tvs ty =+  let usedVars = allVarsExpr ty -- Avoid used type variables+      newVars = take (length tvs) (allBinders \\ usedVars)+      newVarsK = map (\ i -> IdKind i noKind) newVars+      noKind = eDummy+  in  (newVarsK, zipWith (\ tv n -> (tv, EVar n)) tvs newVars)++-- Quantify over the specified type variables.+-- The type should be zonked.+quantify :: [TRef] -> Rho -> T Sigma+quantify [] ty = return ty+quantify tvs ty = do+  let (newVarsK, sub) = tyVarSubst tvs ty+  osubst <- gets uvarSubst+  mapM_ (uncurry setUVar) sub+  ty' <- derefUVar ty+  putUvarSubst osubst  -- reset the setUVar we did above+  return (EForall QImpl newVarsK ty')++-- 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 :: HasCallStack =>+             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))++metaTvs :: [EType] -> [TRef]+-- Get the MetaTvs from a type; no duplicates in result+metaTvs tys = foldr go [] tys+  where+    go (EUVar tv) acc+      | tv `elem` 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 (ELit _ _) acc = acc+    go _ _ = impossible++{-+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 :: HasCallStack =>+              Expr -> Sigma -> T Expr+checkSigma expr sigma = do+  (skol_tvs, rho) <- skolemise sigma+--  sigma' <- derefUVar sigma+--  tcTrace $ "**** checkSigma: " ++ show expr ++ " :: " ++ show sigma ++ " = " ++ show sigma' ++ " " ++ show skol_tvs+  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 (`elem` esc_tvs) skol_tvs+    unless (null bad_tvs) $+      tcErrorTK (getSLoc expr) $ "not polymorphic enough: " ++ unwords (map showIdent bad_tvs)+    return expr'++subsCheckRho :: HasCallStack =>+                SLoc -> Expr -> Sigma -> Rho -> T Expr+--subsCheckRho _ e1 t1 t2 | trace ("subsCheckRho: " ++ show e1 ++ " :: " ++ show t1 ++ " = " ++ show t2) False = undefined+-- XXX Is this even right?  It's not part of the paper.+subsCheckRho loc exp1 (EForall _ vs1 t1) (EForall _ vs2 t2) | length vs1 == length vs2 = do+  let sub = [(v1, EVar v2) | (IdKind v1 _, IdKind v2 _) <- zip vs1 vs2]+  unify loc (subst sub t1) t2+  return exp1+subsCheckRho loc exp1 sigma1@EForall{} rho2 = do -- Rule SPEC+  (exp1', rho1) <- tInst exp1 sigma1+  subsCheckRho loc exp1' rho1 rho2+subsCheckRho loc exp1 arho1 rho2 | Just _ <- getImplies arho1 = do+  (exp1', rho1) <- tInst exp1 arho1+  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+--  tcTrace $ "subsCheckRho: MONO " ++ show (tau1, tau2)+  unify loc tau1 tau2 -- Revert to ordinary unification+  return exp1++subsCheckFun :: HasCallStack =>+                SLoc -> Expr -> Sigma -> Rho -> Sigma -> Rho -> T Expr+subsCheckFun loc e1 a1 r1 a2 r2 = do+  _ <- subsCheck loc eCannotHappen a2 a1   -- XXX+  subsCheckRho loc e1 r1 r2++instSigma :: HasCallStack =>+             SLoc -> Expr -> Sigma -> Expected -> T Expr+instSigma loc e1 t1 (Check t2) = do+  --tcTrace ("instSigma: Check e1=" ++ show e1 ++ " t1=" ++ showEType t1 ++ " t2=" ++ showEType t2)+  subsCheckRho loc e1 t1 t2+instSigma loc e1 t1 (Infer r) = do+  --tcTrace ("instSigma: Infer e1=" ++ show e1 ++ " t1=" ++ showEType t1 ++ " r=" ++ show r)+  (e1', t1') <- tInst e1 t1+  --tcTrace ("instSigma: Infer " ++ showEType t1 ++ " ==> " ++ showEType t1')+  tSetRefType loc r t1'+  return e1'++eCannotHappen :: Expr+eCannotHappen = --undefined+                EVar $ mkIdent "cannot-happen"++-----++--+-- Pattern synonyms look like+--   pattern P :: forall a1...an . ctxr => forall b1...bm . ctxp => t1 -> ... -> ti -> t+--   pattern P x1...xi <- p where P = e+-- (this type is the canonicalized type, generated by canonPatSynType).+-- The synonym is translated into a builder, a matcher and a type.+-- Each synonym use is replaced by a simple view pattern.+--+-- The builder is simple.  It gets the same name and type as the pattern synonym,+-- and the definition is the one provided in the definition.+--   P :: forall a1...an . ctxr => forall b1...bm . ctxp => t1 -> ... ti -> t+--   P = e+--+-- The matcher needs to account for possible existentials so we get a data type+-- for the match result that can have existentials.+--   data P%T a1...an = forall b1...bm . ctxp => M t1 ... ti+--                    | N+--+-- The matcher itself has the required part of the synonym type, whereas+-- the provided part is in the data type.  The matcher simply matches on the given pattern.+--   P% :: forall a1...an . ctxr => t -> P%T a1...an+--   P% p = M x1...xi+--   P% _ = N+-- So when the synonym P matches the matcher P% will return the M constructor+-- of the P%T type, and then N constructor when there is no match.+--+-- Each use of the pattern synonym+--   P p1...pi+-- is replaced by+--   (P% -> M p1...pi)+--+-- The data type, P%T, is not entered into any symbol tables.+-- The matcher, P%, is in the symbol table, but is not part of the exported symbols.+-- The transformed expression simply carries enough information about the types+-- (using EQVar).  The exported ECon for P has this information.+--++emptyCtx :: EConstraint+emptyCtx = EVar $ tupleConstr noSLoc 0++isEmptyCtx :: EConstraint -> Bool+isEmptyCtx (EVar i) = i == tupleConstr noSLoc 0+isEmptyCtx _ = False++-- Expand a pattern synonym into the builder and matcher definitions.+-- Removes that actual pattern definition+expandPatSyn :: EDef -> T [EDef]+expandPatSyn (Pattern (i, vks) p me) = do+  (_, t) <- tLookup "type signature" i+  (im, qim) <- addPatSynMatch i t+  let (ddata, yes, no) = mkMatchDataTypeConstr qim t+      mexp = fmap (Fcn i) me+      pat = Fcn im [ eEqn [p] match+                   , eEqn [eDummy] no]+      match = eApps yes (map (EVar . idKindIdent) vks)+      dname = case ddata of Data (n, _) _ _ -> n; _ -> impossible+  kvar <- newUVar    -- We don't care about the kind+  withTypeTable $ extValQTop dname kvar+  pure $ maybeToList mexp ++ [pat, ddata]+expandPatSyn d = pure [d]++-- Add the matcher for a pattern synonym to the symbol table.+-- Return the added identifier.+addPatSynMatch :: Ident -> EType -> T (Ident, Ident)+addPatSynMatch i at = do+  mn <- gets moduleName+  let ip = mkPatSynMatch i+      qip = qualIdent mn ip+  extValETop ip (mkPatSynMatchType qip at) (EVar qip)+  return (ip, qip)++mkPatSynMatchType :: Ident -> EType -> EType+mkPatSynMatchType qip at =+  let (vks1, ctx1, _vks2, _ctx2, ty) = splitPatSynType at+      (_ats, rt) = getArrows ty+      pstycon = mkMatchDataTypeName qip+  in  eForall vks1 $ etImplies ctx1 $ rt `tArrow` tApps pstycon (map (EVar . idKindIdent) vks1)++-- Given the (qualified) name of a synonym and its type generate:+-- match-constructor, nomatch-constructor+mkMatchDataTypeConstr :: HasCallStack => Ident -> EType -> (EDef, Expr, Expr)+mkMatchDataTypeConstr qi at =+  let (vks1, _ctx1, vks2, ctx2, ty) = splitPatSynType at+      (ats, _rt) = getArrows ty+      n = length ats+      mi = addIdentSuffix qi "M"+      ni = addIdentSuffix qi "N"+      cti = [ (mi, n + if isEmptyCtx ctx2 then 0 else 1), (ni, 0) ]+      conm = ConData cti mi []+      conn = ConData cti ni []+      tycon = mkMatchDataTypeName qi+      tr = tApps tycon $ map (EVar . idKindIdent) vks1+      tn = EForall QExpl vks1 $ EForall QExpl [] tr+      tm = EForall QExpl vks1 $ EForall QExpl vks2 $ etImplies ctx2 $ foldr tArrow tr ats++      ddata = Data lhs [cm, cn] []+            where lhs = (unQualIdent tycon, vks1)+                  cm = Constr vks2 (if isEmptyCtx ctx2 then [] else [ctx2]) (unQualIdent mi) False (Left $ map ((,) False) ats)+                  cn = Constr []   []                                       (unQualIdent ni) False (Left [])++  in  -- trace ("M :: " ++ show tm ++ ",  N :: " ++ show tn) $+      -- trace (showEDefs [ddata]) $+      (ddata, EQVar (ECon conm) tm, EQVar (ECon conn) tn)++mkPatSynMatch :: Ident -> Ident+mkPatSynMatch i = addIdentSuffix i "%"++mkMatchDataTypeName :: Ident -> Ident+mkMatchDataTypeName i = addIdentSuffix i "T"++isMatchDataTypeName :: Ident -> Bool+isMatchDataTypeName = isSuffixOf "%T" . unIdent++-- A pattern synonym always has a type of the form+--  forall vs1 . ctx1 => forall vs2 . ctx2 => ty+--         required             provided+-- The input has forall inserted, but the implicit forall+-- may be in the wrong place.+canonPatSynType :: EType -> T EType+canonPatSynType at = do+  let mkTyp rVks rCtx pVks pCtx ty =+        EForall QExpl rVks $ tImplies rCtx $+        EForall QExpl pVks $ tImplies pCtx ty+      getImplies' :: EType -> (EConstraint, EType)+      getImplies' ty = fromMaybe (emptyCtx, ty) $ getImplies ty++  case at of+    EForall QImpl vks t0 -> do+      -- Implicit forall, the xs need to be split between required and provided.+      let (reqCtx, t1) = getImplies' t0+          (proCtx, t2) = getImplies' t1+          proVs = freeTyVars [proCtx]+          (proVks, reqVks) = partition ((`elem` proVs) . idKindIdent) vks+--      traceM "%%% implicit"+      pure $ mkTyp reqVks reqCtx proVks proCtx t2++    EForall _ reqVks t0 -> do   -- QExpl/QReqd+      -- Explicit forall+      let (reqCtx, t1) = getImplies' t0+          (proVks, t2) = unForall t1+          (proCtx, t3) = getImplies' t2+--      traceM "%%% explicit"+      pure $ mkTyp reqVks reqCtx proVks proCtx t3++    ty -> do+      -- No forall at all.  XXX doesn't work with nullary classes+--      traceM "%%% none"+      pure $ mkTyp [] emptyCtx [] emptyCtx ty++splitPatSynType :: EType -> ([IdKind], EConstraint, [IdKind], EConstraint, EType)+splitPatSynType (EForall _ vks1 t0)+  | Just  (ctx1, EForall _ vks2 t1) <- getImplies t0+  , Just  (ctx2, ty) <- getImplies t1+  = (vks1, ctx1, vks2, ctx2, ty)+splitPatSynType t = impossibleShow t++-----++-- Given a dictionary of a (constraint type), split it up+--  * components of a tupled constraint+--  * superclasses of a constraint+expandDict :: HasCallStack => Expr -> EConstraint -> T [InstDictC]+expandDict edict ct = expandDict' [] [] edict ct++expandDict' :: HasCallStack => [IdKind] -> [EConstraint] -> Expr -> EConstraint -> T [InstDictC]+expandDict' avks actx edict acc = do+  let+    (bvks, bctx, cc) = splitContext acc+    (iCls, args) = getApp cc+    vks = avks ++ bvks+    ctx = actx ++ bctx+  case getTupleConstr iCls of+    Just _ -> do+      concat <$> mapM (\ (i, a) -> expandDict' vks ctx (mkTupleSel i (length args) `EApp` edict) a) (zip [0..] args)+    Nothing -> do+      ct <- gets classTable+      case M.lookup iCls ct of+        Nothing -> do+          -- if iCls is a variable it's not in the class table, otherwise it's an error+          when (isConIdent iCls) $+            --impossible+            -- XXX it seems we can get here, e.g., Control.Monad.Fail without Applicative import+            impossibleShow (acc, iCls)+          return [(edict, vks, ctx, cc, [])]+        Just (ClassInfo iks sups _ _ fds) -> do+          let+            vs = map idKindIdent iks+            sub = zip vs args+            sups' = map (subst sub) sups+          insts <- concat <$> mapM (\ (i, sup) -> expandDict' vks ctx (EVar (mkSuperSel iCls i) `EApp` edict) sup) (zip [1 ..] sups')+          return $ (edict, vks, ctx, cc, fds) : insts++mkSuperSel :: HasCallStack =>+              Ident -> Int -> Ident+mkSuperSel c i = addIdentSuffix c ("$super" ++ show i)++---------------------------------++type Solved = (Ident, Expr)++-- XXX+-- solveLocalConstraints is wrong; it tries to solve before everything is known.+-- Example:+--  class MArray a m where+--    op1 :: m a+--    op2 :: a -> m ()+--  +--  foo :: forall a m . (Monad m, MArray a m) => m a+--  foo = do+--    aa <- op1+--    let f :: forall mm . (MArray a mm) => mm ()+--        f = op2 aa+--    return aa+-- When solving for f we don't know yet aa has type a (it's a unification variable).+-- So it cannot be solved yet.++-- 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+--  traceM $ "solveLocalConstraints: " ++ show (cs, ds, un)+  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+--  tcTrace $ "solveAndDefault: meta=" ++ show vs+  -- XXX may have to iterate this with fundeps+  ds' <- concat <$> mapM defaultOneTyVar vs+  return (a, ds ++ ds')++defaultOneTyVar :: TRef -> T [Solved]+defaultOneTyVar tv = do+--  traceM $ "defaultOneTyVar: " ++ show tv+  old <- get             -- get entire old state+  let cvs = nub [ c | (_, EApp (EVar c) (EUVar tv')) <- constraints old, tv == tv' ]  -- all C v constraints+--  traceM $ "defaultOneTyVar: cvs = " ++ show cvs+  dvs <- getSuperClasses cvs                            -- add superclasses+--  traceM $ "defaultOneTyVar: dvs = " ++ show dvs+  let oneCls c | Just ts <- M.lookup c (defaults old) =+        take 1 $ filter (\ t -> all (\ cc -> soluble cc t) cvs) ts+               | otherwise = []+      soluble c t = fst $ flip tcRun old $ do+        putConstraints [(dummyIdent, EApp (EVar c) t)]  -- Use current (C T) constraint+        _ <- solveConstraints                           -- and solve.+        cs <- gets constraints+        return $ null cs                                -- No constraints left?+      tys = nubBy eqEType $ concatMap oneCls dvs+--  traceM $ "defaultOneTyVar: " ++ show (tv, tys)+  case tys of+    [ty] -> do            -- There is a single type solving everything+      setUVar tv ty+      solveConstraints+    _ -> return []        -- Nothing solved++-- The transitive closure of super-classes.+-- XXX Somewhat duplicated with expandDict+getSuperClasses :: [Ident] -> T [Ident]+getSuperClasses ais = do+  ct <- gets classTable+  let loop done [] = done+      loop done (i:is) | i `elem` done = loop done is+                       | otherwise = i :+        case M.lookup i ct of+          Nothing -> error $ "getSuperClasses: " ++ show i+          Just (ClassInfo _ supers _ _ _) ->+            loop done (concatMap flatten supers ++ is)+      flatten a =+        case getApp a of+          (c, ts) ->+            case getTupleConstr c of+              Nothing -> [c]+              Just _ -> concatMap flatten ts+  return $ loop [] ais++++{-+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 10000) (tApps (mkIdent "_") ts))++showInstDef :: InstDef -> String+showInstDef (cls, InstInfo m ds _) = "instDef " ++ show cls ++ ": "+            ++ show (M.toList m) ++ ", " ++ showListS showInstDict ds++showMatch :: (Expr, [EConstraint]) -> String+showMatch (e, ts) = show e ++ " " ++ show ts++showConstraint :: (Ident, EConstraint) -> String+showConstraint (i, t) = show i ++ " :: " ++ show t+-}++type Goal = (Ident, EType)     -- What we want to solve+type UGoal = Goal              -- Unsolved goal+type Soln = (Ident, Expr)      -- Solution, i.e., binding of a dictionary+type Improve = (SLoc, EType, EType)  -- Unify to get an improvement substitution++-- Solve as many constraints as possible.+-- Return bindings for the dictionary witnesses.+solveConstraints :: T [Soln]+solveConstraints = do+  cs <- gets constraints+  if null cs then+    return []+   else do+    addMetaDicts+--    tcTrace "------------------------------------------\nsolveConstraints"+    eqs <- gets typeEqTable+    cs' <- mapM (\ (i,t) -> do { t' <- derefUVar t; return (i, normTypeEq eqs t') }) cs+--    tcTrace ("constraints:\n" ++ unlines (map showConstraint cs'))+    (unsolved, solved, improves) <- solveMany cs' [] [] []+    putConstraints unsolved+--    tcTrace ("solved:\n"   ++ unlines [ showIdent i ++ " = "  ++ showExpr  e | (i, e) <- solved ])+--    tcTrace ("unsolved:\n" ++ unlines [ showIdent i ++ " :: " ++ showEType t | (i, t) <- unsolved ])+    if null improves then+      return solved+     else do+      -- We have improving substitutions.+      -- Do the unifications, and try to solve more.+      mapM_ (\ (l, a, b) -> unify l a b) improves+      (++ solved) <$> solveConstraints++-- A solver get a location, class&types (i.e. (C t1 ... tn)),+-- and, if successful, returns a dictionary expression and new goals.+type SolveOne = SLoc -> Ident -> [EType] -> T (Maybe (Expr, [Goal], [Improve]))++-- Table of constraint solvers.+-- The predicate gets the class name and picks a solver.+-- There must always by at least one solver that matches+solvers :: [(Ident -> Bool, SolveOne)]+solvers =+  [ (isJust . getTupleConstr,      solveTuple)        -- handle tuple constraints, i.e. (C1 t1, C2 t2, ...)+  , ((== mkIdent nameTypeEq),      solveTypeEq)       -- handle equality constraints, i.e. (t1 ~ t2)+  , ((== mkIdent nameKnownNat),    solveKnownNat)     -- KnownNat 123 constraints+  , ((== mkIdent nameKnownSymbol), solveKnownSymbol)  -- KnownSymbol "abc" constraints+  , ((== mkIdent nameCoercible),   solveCoercible)    -- Coercible a b constraints+  , (const True,                   solveInst)         -- handle constraints with instances+  ]++-- Examine each goal, either solve it (possibly producing new goals) or let it remain unsolved.+solveMany :: [Goal] -> [UGoal] -> [(EType, Soln)] -> [Improve] -> T ([UGoal], [Soln], [Improve])+solveMany [] uns sol imp = return (uns, map snd sol, imp)+solveMany ((di, ct) : cnss) uns sol imp | Just (_, (dd, _)) <- find (eqEType ct . fst) sol =+  solveMany cnss uns ((ct, (di, EVar dd)) : sol) imp+-- Need to handle ct of the form C => T, and forall a . T+solveMany (cns@(di, ct) : cnss) uns sol imp = do+  -- tcTrace ("solveMany: trying " ++ showEType ct)+  let loc = getSLoc di+      (iCls, cts) = getApp ct+      solver = head [ s | (p, s) <- solvers, p iCls ]+  ads <- gets argDicts+  -- Check if we have an exact match among the arguments dictionaries.+  -- This is important to find tupled dictionaries in recursive calls.+  case [ ai | (ai, act) <- ads, ct `eqEType` act ] of+    ai : _ -> do+      --tcTrace $ "solve with arg " ++ show ct+      solveMany cnss uns ((ct, (di, EVar ai)) : sol) imp+    [] -> do+      msol <- solver loc iCls cts+      --tcTrace ("solveMany msol=" ++ show msol)+      case msol of+        Nothing           -> solveMany        cnss  (cns : uns)                  sol         imp+        Just (de, gs, is) -> solveMany (gs ++ cnss)        uns ((ct, (di, de)) : sol) (is ++ imp)++solveInst :: SolveOne+solveInst loc iCls cts = do+  it <- gets instTable+--  tcTrace ("instances:\n" ++ unlines (map showInstDef (M.toList it)))+  -- XXX The solveGen&co functions are not in the T monad.+  -- But we sometimes need to instantiate type variable, so we use the+  -- hack to pass dowwn a starting uniq.+  -- This ought to be fixed, but is will be less efficient.+  uniq <- do ts <- get; let { u = unique ts }; put ts{ unique = u+100 }; return u   -- make room for many UVars+  case M.lookup iCls it of+    Nothing -> return Nothing   -- no instances, so no chance+    Just (InstInfo atomMap insts fds) -> do+      -- tcTrace $ "solveInst: " ++ showIdent iCls ++ " atomMap size=" ++ show (M.size atomMap)+      case cts of+        [EVar i] -> do+          case M.lookup i atomMap of+            -- If the goal is just (C T) and there is an instance, the solution is simple+            Just e  -> return $ Just (e, [], [])+            -- Not found, but there might be a generic instance+            Nothing -> solveGen uniq (M.null atomMap) fds insts loc iCls cts+        _           -> solveGen uniq (M.null atomMap) fds insts loc iCls cts++-- When matching constraint (C _a) against an instance of the form+-- instance (C b) then we don't want to match if the+-- _a is later instantiated and it turns out we should+-- have matched a (C T) instead.+solveGen :: TRef -> Bool -> [IFunDep] -> [InstDict] -> SolveOne+solveGen uniq noAtoms fds insts loc iCls cts = do+--  tcTrace ("solveGen: " ++ show (iCls, cts))+--  tcTrace ("solveGen: insts=" ++ show insts)+  let matches = getBestMatches $ findMatches uniq noAtoms loc fds insts cts+--  tcTrace ("solveGen: matches allMatches =" ++ showListS show (findMatches uniq noAtoms loc fds insts cts))+--  tcTrace ("solveGen: matches bestMatches=" ++ showListS showMatch matches)+  case matches of+    []              -> return Nothing+    [(de, ctx, is)] ->+      if null ctx then+        return $ Just (de, [], is)+      else do+        d <- newDictIdent loc+--        tcTrace ("constraint " ++ showIdent di ++ " :: " ++ showEType ct ++ "\n" +++--                "   turns into " ++ showIdent d ++ " :: " ++ showEType (tupleConstraints ctx) ++ ", " +++--                showIdent di ++ " = " ++ showExpr (EApp de (EVar d)))+        return $ Just (EApp de (EVar d), [(d, tupleConstraints ctx)], is)+    _ -> tcError loc $ "Multiple constraint solutions for: " ++ showEType (tApps iCls cts)+--                     ++ show (map fst matches)++-- Split a tupled contraint into its parts.+-- XXX should look for a direct (tupled) dictionary+solveTuple :: SolveOne+solveTuple loc _iCls cts = do+  goals <- mapM (\ c -> do { d <- newDictIdent loc; return (d, c) }) cts+  return $ Just (ETuple (map (EVar . fst) goals), goals, [])++solveTypeEq :: SolveOne+-- If either type is a unification variable, just do the unification.+solveTypeEq loc _iCls [t1, t2] | isEUVar t1 || isEUVar t2 = return $ Just (ETuple [], [], [(loc, t1, t2)])+                               | otherwise = do+  eqs <- gets typeEqTable+  --tcTrace ("solveTypeEq eqs=" ++ show eqs)+  case solveEq eqs t1 t2 of+    Nothing -> return Nothing+    Just tts -> do+      let mkEq (u1, u2) = do+            i <- newDictIdent loc+            return (i, mkEqType loc u1 u2)+      ncs <- mapM mkEq tts+      return $ Just (ETuple [], ncs, [])+solveTypeEq _ _ _ = impossible++solveCoercible :: HasCallStack => SolveOne+solveCoercible loc iCls [t1, t2] = do+  -- pretend newtypes are type synonyms+  (t1', t2') <- withNewtypeAsSyns $+    (,) <$> expandSynNoChk t1 <*> expandSynNoChk t2+  -- walk over the types in parallel,+  -- and generate new Coercible constraints when not equal.+--  traceM $ "solveCoercible: " ++ showExprRaw t1' ++ " and " ++ showExprRaw t2'+  case genCoerce t1' t2' of+    Nothing -> solveInstCoercible loc iCls t1 t2  -- look for a dict argument+    Just [(u1, u2)] | u1 `eqEType` t1 && u2 `eqEType` t2 -> solveInstCoercible loc iCls t1 t2  -- look for a dict argument+    Just tts -> do+      let mkCo (u1, u2) = do+            i <- newDictIdent loc+            return (i, mkCoercible loc u1 u2)+      ncs <- mapM mkCo tts+      return $ Just (ETuple [], ncs, [])+solveCoercible _ _ _ = impossible++genCoerce :: EType -> EType -> Maybe [(EType, EType)]+genCoerce t1 t2 | eqEType t1 t2 = Just []+genCoerce t1@(EUVar _) t2 = Just [(t1, t2)]+genCoerce t1@(EVar _)  t2 = Just [(t1, t2)]+genCoerce t1 t2@(EUVar _) = Just [(t1, t2)]+genCoerce t1 t2@(EVar _)  = Just [(t1, t2)]+genCoerce (EApp f1 a1) (EApp f2 a2) = (++) <$> genCoerce f1 f2 <*> genCoerce a1 a2+genCoerce _ _ = Nothing++solveInstCoercible :: SLoc -> Ident -> EType -> EType -> T (Maybe (Expr, [Goal], [Improve]))+solveInstCoercible loc iCls t1 t2 = do+{- XXX Should use the reflexive, symmetric, transitive closure for Coercible.+   XXX It's enough to do the transitive part for anything involving type variable.+   XXX See Data.Type.Coercion.trans for a failing example.+  it <- gets instTable+  case M.lookup iCls it of+    Nothing -> pure ()+    Just (InstInfo _ ds _) -> traceM ("solveInstCoercible: " ++ show [ f 0 | (_, f) <- ds ])+-}++  msol <- solveInst loc iCls [t1, t2]+  case msol of+    Nothing -> solveInst loc iCls [t2, t1]+    Just _ -> pure msol++-- Pretend newtypes are type synonyms.+-- XXX It's rather inefficient to do this over and over.+-- XXX Cannot handle recursive newtypes+withNewtypeAsSyns :: T a -> T a+withNewtypeAsSyns act = do+  st <- gets synTable  -- get old syntable+  -- Copy newtypes to syn table+  dt <- gets dataTable+  let ext (qi, Newtype (_, vs) (Constr _ _ _c _ et) _) = do+          -- XXX We should check that the constructor name (_c) is visible.+          -- But this is tricky since we don't know under what qualified name it+          -- it could be visible.+          let t = either (snd . head) (snd . snd . head) et+--          traceM $ "extNewtypeSyns: " ++ showIdent qi ++ show vs ++ " = " ++ showExprRaw t+          when (qi `elem` allVarsExpr t) $+            tcError (getSLoc qi) $ "Cannot handle recursive newtype: " ++ show qi+          extSyn qi vs t  -- extend synonym table+      ext _ = return ()+  mapM_ ext $ M.toList dt++  a <- act+  putSynTable st  -- put back old syntable+  pure a++isEUVar :: EType -> Bool+isEUVar (EUVar _) = True+isEUVar _ = False++solveKnownNat :: SolveOne+solveKnownNat loc iCls [e@(ELit _ (LInteger _))] = mkConstDict loc iCls e+solveKnownNat loc iCls ts = solveInst loc iCls ts  -- look for a dict argument++solveKnownSymbol :: SolveOne+solveKnownSymbol loc iCls [e@(ELit _ (LStr _))] = mkConstDict loc iCls e+solveKnownSymbol loc iCls ts = solveInst loc iCls ts  -- look for a dict argument++mkConstDict :: SLoc -> Ident -> Expr -> T (Maybe (Expr, [Goal], [Improve]))+mkConstDict loc iCls e = do+  let res = EApp (EVar $ mkClassConstructor iCls) fcn+      fcn = EApp (ELit loc (LPrim "K")) e                -- constant function+  return $ Just (res, [], [])++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 :: TRef -> Bool -> SLoc -> [IFunDep] -> [InstDict] -> [EType] -> [(Int, (Expr, [EConstraint], [Improve]))]+findMatches _ False _ _ _ [EUVar _] = []+findMatches uniq _ loc fds ds its =+ let rrr =+       [ (length s, (de, map (substEUVar s) ctx, imp))+       | (de, ctxts) <- ds+       , let (ctx, ts) = ctxts uniq+       , Just (s, imp) <- [matchTypes loc ts its fds]+       ]+ in --trace ("findMatches: " ++ showListS showInstDict ds ++ "; " ++ show its ++ "; " ++ show fds ++ "; " ++ show rrr)+    rrr++-- Do substitution for EUVar.+-- XXX similar to derefUVar+substEUVar :: TySubst -> EType -> EType+substEUVar [] t = t+substEUVar _ t@(EVar _) = t+substEUVar _ t@(ELit _ _) = 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 b iks t) = EForall b iks (substEUVar s t)+substEUVar _ _ = impossible++-- Length of lists match, because of kind correctness.+-- fds is a non-empty list.+matchTypes :: SLoc -> [EType] -> [EType] -> [IFunDep] -> Maybe (TySubst, [Improve])+matchTypes _ ats ats' [] = do+  -- Simple special case when there are no fundeps.+  let loop r (t:ts) (t':ts') = matchType r t t' >>= \ r' -> loop r' ts ts'+      loop r _ _ = pure r+  s <- loop [] ats ats'+  pure (s, [])+matchTypes loc ts ts' fds = asum $ map (matchTypesFD loc ts ts') fds++matchTypesFD :: SLoc -> [EType] -> [EType] -> IFunDep -> Maybe (TySubst, [Improve])+--matchTypesFD _ ts ts' io | trace ("matchTypesFD: " ++ show (ts, ts', io)) False = undefined+matchTypesFD loc ts ts' (ins, outs) = do+  let matchFD :: Bool -> EType -> EType -> Maybe TySubst+      matchFD True  = \ _ _ -> Just []     -- if it's an output, don't match+      matchFD False = matchType []          -- match types for non-outputs+  tms <- sequence $ zipWith3 matchFD outs ts ts'+  tm  <- combineTySubsts tms               -- combine all substitutions+  is  <- combineTySubsts [ s | (True, s) <- zip ins tms]  -- subst from input FDs+  let imp = [ (loc, substEUVar is t, t') | (True, t, t') <- zip3 outs ts ts' ]  -- improvements+  pure (tm, imp)++-- Match two types, instantiate variables in the first type.+matchType :: TySubst -> EType -> EType -> Maybe TySubst+matchType = match+  where+    match r (EVar i)   (EVar i')   | i == i' = pure r+    match r (ELit _ l) (ELit _ l') | l == l' = pure r+    match r (EApp f a) (EApp f' a') = do+      r' <- match r f f'+      match r' a a'+--    match _ _ (EUVar _) = Nothing+    match r (EUVar i) t' =+      -- For a variable, check that any previous match is the same.+      case lookup i r of+        Just t  -> match r t t'+        Nothing -> pure ((i, t') : r)+    match _ _ _ = Nothing++-- XXX This shouldn't be this complicated.+combineTySubsts :: [TySubst] -> Maybe TySubst+combineTySubsts = combs []+  where+    combs r [] = Just r+    combs r (s:ss) = do { r' <- comb r s; combs r' ss }+    comb :: TySubst -> TySubst -> Maybe TySubst+    comb r [] = Just r+    comb r ((v, t):s) = do { r' <- comb1 v t r; comb r' s }+    comb1 v t r =+      case lookup v r of+        Nothing -> Just ((v, t) : r)+        Just t' -> matchType [] t' t++-- Get the best matches.  These are the matches with the smallest substitution.+-- Always prefer arguments rather than global instances.+getBestMatches :: [(Int, (Expr, [EConstraint], [Improve]))] -> [(Expr, [EConstraint], [Improve])]+getBestMatches [] = []+getBestMatches ams =+  let isDictArg (EVar i) = (adictPrefix ++ uniqIdentSep) `isPrefixOf` unIdent i+      isDictArg _ = True+      (args, insts) = partition (\ (_, (ei, _, _)) -> isDictArg ei) ams+      pick ms =+        let b = minimum (map fst ms)         -- minimum substitution size+        in  [ ec | (s, ec) <- ms, s == b ]   -- pick out the smallest+  in  if null args then pick insts else pick args++-- Check that there are no unsolved constraints.+checkConstraints :: HasCallStack => T ()+checkConstraints = do+  cs <- gets constraints+  case cs of+    [] -> return ()+    (i, t) : _ -> do+      t' <- derefUVar t+--      is <- gets instTable+--      tcTrace $ "Cannot satisfy constraint: " ++ unlines (map (\ (i, ii) -> show i ++ ":\n" ++ showInstInfo ii) (M.toList is))+      tcError (getSLoc i) $ "Cannot satisfy constraint: " ++ show t'+                            ++ "\n     fully qualified: " ++ showExprRaw t'++-- Add a type equality constraint.+addEqConstraint :: SLoc -> EType -> EType -> T ()+addEqConstraint loc t1 t2 = do+  d <- newDictIdent loc+  addConstraint d (mkEqType loc t1 t2)++-- Possibly solve a type equality.+-- Just normalize both types and compare.+solveEq :: TypeEqTable -> EType -> EType -> Maybe [(EType, EType)]+--solveEq eqs t1 t2 | trace ("solveEq: " ++ show (t1,t2) ++ show eqs) False = undefined+solveEq eqs t1 t2 | normTypeEq eqs t1 `eqEType` normTypeEq eqs t2 = Just []+                  | otherwise =+  case (t1, t2) of+    (EApp f1 a1, EApp f2 a2) -> Just [(f1, f2), (a1, a2)]+    _                        -> Nothing++-- Add the equality t1~t2.+-- Type equalities are saved as a rewrite system where all the rules+-- have the form+--   v -> rhs+-- where v is a type variable (rigid or skolem), and the rhs contains+-- only type constructors and type variables that are not the LHS of any rule.+-- To find out if two types are equal according to the known equalites,+-- we just normalize both type using the rewrite rules (which is just a substitution).+-- When we get TypeFamilies the LHS has to be a type expression as well.+-- And then rewrite rules can probably be obtained with Knuth-Bendix completion+-- of the equalities.+-- Note: there should be no meta variables in t1 and t2.+-- XXX This guaranteed by how it's called, but I'm not sure it always works properly.+addTypeEq :: EType -> EType -> TypeEqTable -> TypeEqTable+addTypeEq t1 t2 aeqs =+  let deref (EVar i) | Just t <- lookup i aeqs = t+      deref (ESign t _) = t+      deref t = t+      t1' = deref t1+      t2' = deref t2+      isVar = not . isConIdent+      addEq i t its = (i, t) : map (second $ subst [(i, t)]) its+{-+      chkTypeEqs :: TypeEqTable -> TypeEqTable+      chkTypeEqs xeqs =+        let rhsVars = nub $ filter isVar $ concatMap (allVarsExpr . snd) xeqs+            lhsVars = map fst xeqs+        in  if null (intersect lhsVars rhsVars) then xeqs+            else error $ "addTypeEq: " ++ show ((t1, t1'), (t2, t2'), (lhsVars, rhsVars), xeqs, aeqs)+-}+  in  -- chkTypeEqs $+      case (t1', t2') of+        (EVar i1, EVar i2) | isVar i1 && isVar i2 ->+               if i1 < i2 then addEq i2 t1' aeqs  -- always point smaller to bigger+          else if i1 > i2 then addEq i1 t2' aeqs+          else                             aeqs+        (EVar i1, _) | isVar i1 -> addEq i1 t2' aeqs+        (_, EVar i2) | isVar i2 -> addEq i2 t1' aeqs+        (EApp f1 a1, EApp f2 a2) -> addTypeEq f1 f2 (addTypeEq a1 a2 aeqs)+        _ | t1' `eqEType` t2 -> aeqs+        _ -> errorMessage (getSLoc t1) $ "inconsistent type equality " ++ showEType t1' ++ " ~ " ++ showEType t2'++-- Normalize a type with the known type equalties.+-- For now, it's just substitution.+normTypeEq :: TypeEqTable -> EType -> EType+normTypeEq = subst++---------------------++-- Try adding all dictionaries that used to have meta variables.+addMetaDicts :: T ()+addMetaDicts = do+  ms <- gets metaTable+  putMetaTable []+  mapM_ addDict ms  -- Try adding them++-----------------------------++showValueExport :: ValueExport -> String+showValueExport (ValueExport i (Entry qi t)) =+  showIdent i ++ " = " ++ showExprRaw qi ++ " :: " ++ showEType t++showTypeExport :: TypeExport -> String+showTypeExport (TypeExport i (Entry qi t) _) =+  showIdent i ++ " = " ++ showExprRaw qi ++ " :: " ++ showEType t+    -- ++ " assoc=" ++ showListS showValueExport vs++showTypeExportAssocs :: TypeExport -> [String]+showTypeExportAssocs (TypeExport _ _ vs) = map showValueExport vs++{-+showSymTab :: SymTab -> 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)++showIdentClassInfo :: (Ident, ClassInfo) -> String+showIdentClassInfo (i, (_vks, _ctx, cc, ms)) =+  showIdent i ++ " :: " ++ showEType cc +++    " has " ++ showListS showIdent ms+-}++doDeriving :: EDef -> T [EDef]+doDeriving def@(Data    lhs cs ds)    = (def:) . concat <$> mapM (deriveDer False lhs  cs) (addTypeable (getSLoc lhs) ds)+doDeriving def@(Newtype lhs  c ds)    = (def:) . concat <$> mapM (deriveDer True  lhs [c]) (addTypeable (getSLoc lhs) ds)+doDeriving (StandDeriving as _ act)   = do+  -- The StandDeriving has not been typechecked yet, so do it now.+  def@(StandDeriving s n ct) <- withTypeTable $ tcStand as act+  (def:) <$> standaloneDeriving s n ct+doDeriving def@(Class _ (n, _) _ _) | unIdent n /= "~" && deriveClassTypeable = do  -- "~" is a special class, don't touch it+  -- classes need to be Typeable+  mn <- gets moduleName+  return [def, mkTypeableInst mn n]+doDeriving def                        = return [def]++{-+addTypeable' :: SLoc -> [Deriving] -> [Deriving]+addTypeable' loc ds =+  let ds' = addTypeable loc ds+  in  trace ("addTypeable: " ++ show (ds, ds')) ds'+-}+-- Add Data.Typeable to the derivings.+-- Also skip all derivings (including Typeable) if it is says 'deriving ()'+addTypeable :: SLoc -> [Deriving] -> [Deriving]+addTypeable _ dss | doNotDerive dss = []+addTypeable loc dss = Deriving DerNone [(0, EVar $ mkIdentSLoc loc nameDataTypeableTypeable)] : map (\ (Deriving strat ds) -> Deriving strat (filter (not . isDT) ds)) dss+  where isDT (_, EVar dt) = dt == identDataTypeableTypeable+        isDT _ = False++deriveDer :: Bool -> LHS -> [Constr] -> Deriving -> T [EDef]+deriveDer newt lhs cs (Deriving strat ds) = concat <$> mapM (deriveStrat Nothing newt lhs cs strat) ds++standaloneDeriving :: DerStrategy -> Int -> EConstraint -> T [EDef]+standaloneDeriving str narg act = do+  let (_vks, _ctx, cc) = splitContext act+--  traceM ("standaloneDeriving 1 " ++ show (_vks, _ctx, cc))+  (cls, ts, tname) <-+    case getAppM cc of+      Just (c, ts@(_:_)) | Just (n, _) <- getAppM (last ts) -> return (c, init ts, n)+      _ -> tcError (getSLoc act) "malformed standalone deriving"+--  traceM ("standaloneDeriving 2 " ++ show (act, cls, tname))+  dtable <- gets dataTable+  (lhs, newt, cs) <-+    case M.lookup tname dtable of+      Just (Newtype l  c _) -> return (l, True,  [c])+      Just (Data    l xs _) -> return (l, False, xs)+      _ -> tcError (getSLoc act) ("not data/newtype " ++ showIdent tname)+  -- We want 'instance ctx => cls ty'+  deriveStrat (Just (act, tname)) newt lhs cs str (narg, tApps cls ts)
+ src/runtime/HsFFI.h view
@@ -0,0 +1,119 @@+#include <inttypes.h>+#include <limits.h>+#include <float.h>+#include <unistd.h>+#include <string.h>++typedef char          HsChar;+typedef	intptr_t       HsInt;+typedef int8_t         HsInt8;+typedef int16_t        HsInt16;+typedef int32_t        HsInt32;+typedef int64_t        HsInt64;+typedef uint8_t        HsWord8;+typedef uint16_t       HsWord16;+typedef uint32_t       HsWord32;+typedef uint64_t       HsWord64;+typedef float          HsFloat;+typedef double         HsDouble;+typedef int            HsBool;+typedef void *         HsPtr;+typedef void           (*HsFunPtr)(void);+typedef	void * 	       StablePtr;++#define HS_CHAR_MIN	CHAR_MIN+#define HS_CHAR_MAX	CHAR_MAX+#define HS_INT_MIN	INT_MIN+#define HS_INT_MAX      INT_MAX+#define HS_INT8_MIN     INT8_MIN+#define HS_INT8_MAX     INT8_MAX+#define HS_INT16_MIN    INT16_MIN+#define HS_INT16_MAX    INT16_MAX+#define HS_INT32_MIN    INT32_MIN+#define HS_INT32_MAX    INT32_MAX+#define HS_INT64_MIN    INT64_MIN+#define HS_INT64_MAX    INT64_MAX+#define HS_WORD8_MAX    UINT8_MAX+#define HS_WORD16_MAX   UINT16_MAX+#define HS_WORD32_MAX   UINT32_MAX+#define HS_WORD64_MAX   UINT64_MAX++#define HS_FLOAT_RADIX	     FLT_RADIX+#define HS_FLOAT_ROUND	     ?????+#define HS_FLOAT_EPSILON     FLT_EPSILON+#define HS_DOUBLE_EPSILON    DBL_EPSILON+#define HS_FLOAT_DIG	     FLT_DIG+#define HS_DOUBLE_DIG	     DBL_DIG+#define HS_FLOAT_MANT_DIG    FLT_MANT_DIG+#define HS_DOUBLE_MANT_DIG   DBL_MAN_DIG+#define HS_FLOAT_MIN	     FLT_MIN+#define HS_DOUBLE_MIN	     DBL_MIN+#define HS_FLOAT_MIN_EXP     FLT_MIN_EXP+#define HS_DOUBLE_MIN_EXP    DBL_MIN_EXP+#define HS_FLOAT_MIN_10_EXP  FLT_MIN_10_EXP+#define HS_DOUBLE_MIN_10_EXP DBL_MIN_10_EXP+#define HS_FLOAT_MAX	     FLT_MAX+#define HS_DOUBLE_MAX	     DBL_MAX+#define HS_FLOAT_MAX_EXP     FLT_MAX_EXP+#define HS_DOUBLE_MAX_EXP    DBL_MAX_EXP+#define HS_FLOAT_MAX_10_EXP  FLT_MAX_10_EXP+#define HS_DOUBLE_MAX_10_EXP DBL_MAX_10_EXP+#define HS_BOOL_FALSE	     0+#define HS_BOOL_TRUE	     1++/*+void hs_init     (int *argc, char **argv[]);  +void hs_exit     (void);  +void hs_set_argv (int argc, char *argv[]);  + +void hs_perform_gc (void);  + +void hs_free_stable_ptr (HsStablePtr sp);  +void hs_free_fun_ptr    (HsFunPtr fp);+*/+/* Using prototypes and defining these in eval.c causes linker problems+ * for the MicroHs library.+ * Use this temporary fix.+ */++/*******************************/+/* HsFFI.h API */+++static void ERR(const char *msg)+{+  (void)write(2, msg, strlen(msg));+  _exit(1);+}++static void hs_init(int *argc, char **argv[])+{+  extern int mhs_main(int argc, char **argv);+  (void)mhs_main(*argc, *argv);+}++static void hs_exit(void)+{+  _exit(0);+}++static void hs_set_argv(int argc, char *argv[])+{+  ERR("hs_set_argv not implemented");+}+ +static void hs_perform_gc(void)+{+  extern void gc(void);+  gc();+}++void xhs_free_stable_ptr(void *sp)+{+  /* XXX need to change representation of stablepointers */+}++void hs_free_fun_ptr(HsFunPtr fp)+{+  ERR("hs_free_fun_ptr not implemented");+}
src/runtime/bfile.c view
@@ -6,6 +6,7 @@  * The streams are typically bytes.  *  *  FILE   source/sink for stdio FILE handles+ *  FD     source/sink for file descriptors  *  buf    source/sink where the read/write uses a memory buffer.  *  *  lz77   transducer for LZ77 compression@@ -20,6 +21,13 @@  *  utf8   transducer for UTF8 encoding  *         put - encodes a Unicode code point (int) to bytes  *         get - decodes a Unicode code point+ *  buf    transducer that just buffers+ *         It will convert multiple putb() into writeb(),+ *         and use a single readb() instead of multiple getb().+ *         The buffer size is set on creation.+ *  crlf   transducer that turns LF into CRLF+ *         put - turn LF into CR,LF+ *         get - turn CR,LF into LF  */  /**** Buffers for collecting data. */@@ -204,7 +212,30 @@   } } +#if NEED_INT64 void+putnegb64(int64_t n, BFILE *p)+{+  int c = '0' - n % 10;+  if (n <= -10) {+    putnegb64(n / 10, p);+  }+  putb(c, p);+}++void+putdecb64(int64_t n, BFILE *p)+{+  if (n < 0) {+    putb('-', p);+    putnegb64(n, p);+  } else {+    putnegb64(-n, p);+  }+}+#endif  /* NEED_INT64 */++void putint32(value_t n, BFILE *p) {   putb(n % 256, p); n /= 256;@@ -224,109 +255,111 @@ }  /***************** BFILE from/to memory buffer *******************/-struct BFILE_buffer {+struct BFILE_mem {   BFILE    mets;   struct bfbuffer bf; };  int-getb_buf(BFILE *bp)+getb_mem(BFILE *bp) {-  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;-  CHECKBFILE(bp, getb_buf);+  struct BFILE_mem *p = (struct BFILE_mem *)bp;+  CHECKBFILE(bp, getb_mem);    return bfbuffer_get(&p->bf); }  void-putb_buf(int c, BFILE *bp)+putb_mem(int c, BFILE *bp) {-  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;-  CHECKBFILE(bp, getb_buf);+  struct BFILE_mem *p = (struct BFILE_mem *)bp;+  CHECKBFILE(bp, getb_mem);    bfbuffer_snoc(&p->bf, c); }  void-ungetb_buf(int c, BFILE *bp)+ungetb_mem(int c, BFILE *bp) {-  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;-  CHECKBFILE(bp, getb_buf);+  struct BFILE_mem *p = (struct BFILE_mem *)bp;+  CHECKBFILE(bp, getb_mem);   if (p->bf.pos == 0)     ERR("ungetb");-  p->bf.buf[--p->bf.pos] = (uint8_t)c;+  p->bf.pos--;+  if (p->bf.buf[p->bf.pos] != (uint8_t)c)+    ERR("ungetb"); }  void-closeb_rd_buf(BFILE *bp)+closeb_rd_mem(BFILE *bp) {-  CHECKBFILE(bp, getb_buf);+  CHECKBFILE(bp, getb_mem);   FREE(bp); }  void-closeb_wr_buf(BFILE *bp)+closeb_wr_mem(BFILE *bp) {-  CHECKBFILE(bp, getb_buf);+  CHECKBFILE(bp, getb_mem);   FREE(bp); }  void-flushb_buf(BFILE *bp)+flushb_mem(BFILE *bp) {-  CHECKBFILE(bp, getb_buf);+  CHECKBFILE(bp, getb_mem); }  size_t-readb_buf(uint8_t *buf, size_t size, BFILE *bp)+readb_mem(uint8_t *buf, size_t size, BFILE *bp) {-  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;-  CHECKBFILE(bp, getb_buf);+  struct BFILE_mem *p = (struct BFILE_mem *)bp;+  CHECKBFILE(bp, getb_mem);    return bfbuffer_read(&p->bf, buf, size); }  size_t-writeb_buf(const uint8_t *str, size_t size, BFILE *bp)+writeb_mem(const uint8_t *str, size_t size, BFILE *bp) {-  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;-  CHECKBFILE(bp, getb_buf);+  struct BFILE_mem *p = (struct BFILE_mem *)bp;+  CHECKBFILE(bp, getb_mem);    return bfbuffer_write(&p->bf, str, size); }  struct BFILE*-openb_rd_buf(uint8_t *buf, size_t len)+openb_rd_mem(const uint8_t *buf, size_t len) {-  struct BFILE_buffer *p = MALLOC(sizeof(struct BFILE_buffer));+  struct BFILE_mem *p = MALLOC(sizeof(struct BFILE_mem));   if (!p)     memerr();-  p->mets.getb = getb_buf;-  p->mets.ungetb = ungetb_buf;+  p->mets.getb = getb_mem;+  p->mets.ungetb = ungetb_mem;   p->mets.putb = 0;   p->mets.flushb = 0;-  p->mets.closeb = closeb_rd_buf;-  p->mets.readb = readb_buf;+  p->mets.closeb = closeb_rd_mem;+  p->mets.readb = readb_mem;   p->mets.writeb = 0;   p->bf.size = len;   p->bf.pos = 0;-  p->bf.buf = buf;+  p->bf.buf = (uint8_t *)buf;   return (struct BFILE*)p; }  struct BFILE*-openb_wr_buf(void)+openb_wr_mem(void) {-  struct BFILE_buffer *p = MALLOC(sizeof(struct BFILE_buffer));+  struct BFILE_mem *p = MALLOC(sizeof(struct BFILE_mem));   if (!p)     memerr();-  p->mets.getb = getb_buf;      /* Just to make CHECKFILE happy */+  p->mets.getb = getb_mem;      /* Just to make CHECKFILE happy */   p->mets.ungetb = 0;-  p->mets.putb = putb_buf;-  p->mets.flushb = flushb_buf;-  p->mets.closeb = closeb_wr_buf;+  p->mets.putb = putb_mem;+  p->mets.flushb = flushb_mem;+  p->mets.closeb = closeb_wr_mem;   p->mets.readb = 0;-  p->mets.writeb = writeb_buf;+  p->mets.writeb = writeb_mem;   bfbuffer_init(&p->bf, 1000);   return (struct BFILE*)p; }@@ -335,14 +368,14 @@  * Get the buffer used by writing.  * This should be the last operation before closing,  * since the buffer can move when writing.- * The caller of openb_wr_buf() and get_buf() owns+ * The caller of openb_wr_mem() and get_mem() owns  * the memory and must free it.  */ void-get_buf(struct BFILE *bp, uint8_t **bufp, size_t *lenp)+get_mem(struct BFILE *bp, uint8_t **bufp, size_t *lenp) {-  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;-  CHECKBFILE(bp, getb_buf);+  struct BFILE_mem *p = (struct BFILE_mem *)bp;+  CHECKBFILE(bp, getb_mem);   *bufp = p->bf.buf;   *lenp = p->bf.pos; }@@ -438,6 +471,107 @@ #endif  +#if WANT_FD+/***************** BFILE via file descriptor *******************/+struct BFILE_fd {+  BFILE    mets;+  int      unget;+  int      fd;+};++int+getb_fd(BFILE *bp)+{+  struct BFILE_fd *p = (struct BFILE_fd *)bp;+  CHECKBFILE(bp, getb_fd);+  uint8_t c;+  if (p->unget >= 0) {+    c = p->unget;+    p->unget = -1;+  } else {+    if (read(p->fd, &c, 1) != 1)+      return -1;+  }+  return c;+}++void+ungetb_fd(int c, BFILE *bp)+{+  struct BFILE_fd *p = (struct BFILE_fd *)bp;+  CHECKBFILE(bp, getb_fd);+  p->unget = c;+}++void+putb_fd(int c, BFILE *bp)+{+  struct BFILE_fd *p = (struct BFILE_fd *)bp;+  CHECKBFILE(bp, getb_fd);+  uint8_t u = c;+  if (write(p->fd, &u, 1) <= 0)+    ERR("putb_fd");+}++void+flushb_fd(BFILE *bp)+{+  CHECKBFILE(bp, getb_fd);+}++void+closeb_fd(BFILE *bp)+{+  struct BFILE_fd *p = (struct BFILE_fd *)bp;+  CHECKBFILE(bp, getb_fd);+  close(p->fd);+  FREE(p);+}++void+freeb_fd(BFILE *bp)+{+  struct BFILE_fd *p = (struct BFILE_fd *)bp;+  CHECKBFILE(bp, getb_fd);+  FREE(p);+}++size_t+readb_fd(uint8_t *buf, size_t size, BFILE *bp)+{+  struct BFILE_fd *p = (struct BFILE_fd *)bp;+  CHECKBFILE(bp, getb_fd);+  return read(p->fd, buf, size);+}++size_t+writeb_fd(const uint8_t *str, size_t size, BFILE *bp)+{+  struct BFILE_fd *p = (struct BFILE_fd *)bp;+  CHECKBFILE(bp, getb_fd);+  return write(p->fd, str, size);+}++BFILE *+add_fd(int fd)+{+  struct BFILE_fd *p = MALLOC(sizeof (struct BFILE_fd));+  if (!p)+    memerr();+  p->mets.getb   = getb_fd;+  p->mets.ungetb = ungetb_fd;+  p->mets.putb   = putb_fd;+  p->mets.flushb = flushb_fd;+  p->mets.closeb = closeb_fd;+  p->mets.readb  = readb_fd;+  p->mets.writeb = writeb_fd;+  p->fd = fd;+  p->unget = -1;+  return (BFILE*)p;+}+#endif++ #if WANT_LZ77 /***************** BFILE via simple LZ77 decompression *******************/ struct BFILE_lz77 {@@ -1037,6 +1171,7 @@  /***************** BFILE with UTF8 encode/decode *******************/ +#if WANT_UTF8 struct BFILE_utf8 {   BFILE    mets;   BFILE    *bfile;@@ -1067,7 +1202,8 @@     return -1;   if ((c1 & 0xe0) == 0xc0) {     int c = ((c1 & 0x1f) << 6) | (c2 & 0x3f);-    if (c < 0x80) ERR("getb_utf8: overlong encoding");+    /* accept overlong encoding of 0, modified UTF-8 uses that */+    if (0 < c && c < 0x80) ERR("getb_utf8: overlong encoding");     return c;   }   c3 = getb(p->bfile);@@ -1087,6 +1223,7 @@     return c;   }   ERR("getb_utf8");+  NOTREACHED; }  void@@ -1106,7 +1243,7 @@   CHECKBFILE(bp, getb_utf8);   if (c < 0)     ERR("putb_utf8: < 0");-  if (c < 0x80) {+  if (0 < c && c < 0x80) {      /* modified UTF-8 avoids 0 */     putb(c, p->bfile);     return;   }@@ -1150,40 +1287,480 @@   FREE(p); } -size_t-readb_utf8(uint8_t *buf, size_t size, BFILE *bp)+BFILE *+add_utf8(BFILE *file) {-  struct BFILE_utf8 *p = (struct BFILE_utf8 *)bp;-  CHECKBFILE(bp, getb_utf8);+  struct BFILE_utf8 *p = MALLOC(sizeof(struct BFILE_utf8)); -  return readb(buf, size, p->bfile);+  if (!p)+    memerr();+  p->mets.getb = getb_utf8;+  p->mets.ungetb = ungetb_utf8;+  p->mets.putb = putb_utf8;+  p->mets.flushb = flushb_utf8;+  p->mets.closeb = closeb_utf8;+  p->mets.readb = 0;+  p->mets.writeb = 0;+  p->bfile = file;+  p->unget = -1;++  return (BFILE*)p; }+#endif  /* WANT_UTF8 */ -size_t-writeb_utf8(const uint8_t *str, size_t size, BFILE *bp)+/***************** BFILE that just buffers *******************/++#if WANT_BUF+struct BFILE_buf {+  BFILE    mets;+  BFILE    *bfile;+  int      unget;+  size_t   size;+  size_t   cur;+  size_t   pos;+  int      linebuf;+  int      read;+  uint8_t *buf;+};++int+getb_buf(BFILE *bp) {-  struct BFILE_utf8 *p = (struct BFILE_utf8 *)bp;-  CHECKBFILE(bp, getb_utf8);+  struct BFILE_buf *p = (struct BFILE_buf*)bp;+  CHECKBFILE(bp, getb_buf);+  p->read = 1;+  if (p->unget >= 0) {+    int c = p->unget;+    p->unget = -1;+    return c;+  }+  if (p->size == 0) {+    return getb(p->bfile);+  }+  if (p->pos >= p->cur) {+    int r = readb(p->buf, p->size, p->bfile);+    if (r <= 0)+      return -1;+    p->cur = r;+    p->pos = 0;+  }+  return p->buf[p->pos++];  +} -  return writeb(str, size, p->bfile);+void+ungetb_buf(int c, BFILE *bp)+{+  struct BFILE_buf *p = (struct BFILE_buf*)bp;+  CHECKBFILE(bp, getb_buf);+  if (p->unget >= 0)+    ERR("ungetb_buf");+  p->unget = c; } +void+putb_buf(int c, BFILE *bp)+{+  struct BFILE_buf *p = (struct BFILE_buf *)bp;+  CHECKBFILE(bp, getb_buf);+  if (p->size == 0) {+    putb(c, p->bfile);+  }+  if (p->pos >= p->size) {+    int r = writeb(p->buf, p->size, p->bfile);+    if (r != p->size)+      ERR("putb_buf");+    p->pos = 0;+  }+  p->buf[p->pos++] = c;+  if (p->linebuf && c == '\n') {+    writeb(p->buf, p->pos, p->bfile);+    p->pos = 0;+  }+}++void+flushb_buf(BFILE *bp)+{+  struct BFILE_buf *p = (struct BFILE_buf*)bp;+  CHECKBFILE(bp, getb_buf);++  if (!p->read) {+    (void)writeb(p->buf, p->pos, p->bfile);+    p->pos = 0;+  }++  flushb(p->bfile);+}++void+closeb_buf(BFILE *bp)+{+  struct BFILE_buf *p = (struct BFILE_buf*)bp;+  CHECKBFILE(bp, getb_buf);++  if (!p->read)+    flushb(bp);++  closeb(p->bfile);+  FREE(p);+}++/* bufsize==0 no buffering, bufsize<0 linebuffered, bufsize>0 regular */ BFILE *-add_utf8(BFILE *file)+add_buf(BFILE *file, int bufsize) {-  struct BFILE_utf8 *p = MALLOC(sizeof(struct BFILE_utf8));+  struct BFILE_buf *p = MALLOC(sizeof(struct BFILE_buf));    if (!p)     memerr();-  p->mets.getb = getb_utf8;-  p->mets.ungetb = ungetb_utf8;-  p->mets.putb = putb_utf8;-  p->mets.flushb = flushb_utf8;-  p->mets.closeb = closeb_utf8;-  p->mets.readb = readb_utf8;-  p->mets.writeb = writeb_utf8;+  p->mets.getb = getb_buf;+  p->mets.ungetb = ungetb_buf;+  p->mets.putb = putb_buf;+  p->mets.flushb = flushb_buf;+  p->mets.closeb = closeb_buf;+  p->mets.readb = 0;+  p->mets.writeb = 0;   p->bfile = file;   p->unget = -1;+  p->pos = 0;+  p->cur = 0;+  p->read = 0;+  if (bufsize < 0) {+    p->size = -bufsize;+    p->linebuf = 1;+  } else {+    p->size = bufsize;+    p->linebuf = 0;+  }+  if (p->size) {+    p->buf = MALLOC(p->size);+    if (!p->buf)+      memerr();+  } else {+    p->buf = 0;+  }+  return (BFILE*)p;+}+#endif  /* WANT_BUF */ +/***************** BFILE that adds CR *******************/++#if WANT_CRLF+struct BFILE_crlf {+  BFILE    mets;+  BFILE    *bfile;+};++int+getb_crlf(BFILE *bp)+{+  struct BFILE_crlf *p = (struct BFILE_crlf*)bp;+  CHECKBFILE(bp, getb_crlf);++  int c = getb(p->bfile);+  if (c != '\r')+    return c;+  int d = getb(p->bfile);+  if (d == '\n')+    return d;+  if (d >= 0)+    ungetb(d, p->bfile);+  return c;+}++void+ungetb_crlf(int c, BFILE *bp)+{+  struct BFILE_crlf *p = (struct BFILE_crlf*)bp;+  CHECKBFILE(bp, getb_crlf);+  ungetb(c, p->bfile);+}++void+putb_crlf(int c, BFILE *bp)+{+  struct BFILE_crlf *p = (struct BFILE_crlf *)bp;+  CHECKBFILE(bp, getb_crlf);+  if (c == '\n')+    putb('\r', p->bfile);+  putb(c, p->bfile);+}++void+flushb_crlf(BFILE *bp)+{+  struct BFILE_crlf *p = (struct BFILE_crlf*)bp;+  CHECKBFILE(bp, getb_crlf);++  flushb(p->bfile);+}++void+closeb_crlf(BFILE *bp)+{+  struct BFILE_crlf *p = (struct BFILE_crlf*)bp;+  CHECKBFILE(bp, getb_crlf);++  closeb(p->bfile);+  FREE(p);+}++BFILE *+add_crlf(BFILE *file)+{+  struct BFILE_crlf *p = MALLOC(sizeof(struct BFILE_crlf));++  if (!p)+    memerr();+  p->mets.getb = getb_crlf;+  p->mets.ungetb = ungetb_crlf;+  p->mets.putb = putb_crlf;+  p->mets.flushb = flushb_crlf;+  p->mets.closeb = closeb_crlf;+  p->mets.readb = 0;+  p->mets.writeb = 0;+  p->bfile = file;   return (BFILE*)p; }+#endif  /* WANT_CRLF */++#if WANT_BASE64+/***************** Base64 encode/decode *******************/++struct BFILE_b64 {+  BFILE mets;+  BFILE *bfile;          /* underlying BFILE */+  int read;              /* 1 = decoder, 0 = encoder */++  /* encoder state */+  uint8_t encbuf[3];     /* collect up to 3 bytes */+  int encpos;            /* how many bytes in encbuf (0..3) */+  size_t linelen;        /* 0 = no wrap; otherwise wrap column (e.g., 76) */+  size_t outcol;         /* current column count for wrapping */++  /* decoder state */+  int unget;+  uint8_t outbuf[3];+  int outpos, outlen;+};++static int+getb_b64(BFILE *bp) {+  struct BFILE_b64 *p = (struct BFILE_b64*)bp;+  CHECKBFILE(bp, getb_b64);++  if (!p->read)+    ERR("getb_b64: not in read mode");++  if (p->unget >= 0) {+    int c = p->unget;+    p->unget = -1;+    return c;+  }+  if (p->outpos < p->outlen)+    return p->outbuf[p->outpos++];++  /* need to decode the next quartet */+  int v[4], got = 0;+  for (;;) {+    int c = getb(p->bfile);+    if (c < 0) {+      if (got == 0)+        return -1; /* EOF cleanly */+      ERR("base64: truncated input");+    }++    int k;+    if ((unsigned)(c - 'A') <= 25) k = c - 'A';+    else if ((unsigned)(c - 'a') <= 25) k = c - 'a' + 26;+    else if ((unsigned)(c - '0') <= 9) k = c - '0' + 52;+    else if (c == '+') k = 62;+    else if (c == '/') k = 63;+    else if (c == '=') k = -3;+    else if (c == ' ' || c == '\t' || c == '\n' || c == '\r') k = -2;+    else k = -1;++    if (k == -2)+      continue;        /* skip whitespace */+    if (k >= 0 || k == -3) {+      v[got++] = k;+      if (got == 4)+        break;+    } else {+      ERR("base64: invalid character");+    }+  }++  /* convert quartet -> bytes */+  if (v[0] < 0 || v[1] < 0)+    ERR("base64: bad padding");+  uint32_t triple = ((uint32_t)v[0] << 18) | ((uint32_t)v[1] << 12);+  if (v[2] == -3) {+    p->outbuf[0] = (triple >> 16) & 0xff;+    p->outlen = 1;+  } else {+    triple |= ((uint32_t)v[2] << 6);+    if (v[3] == -3) {+      p->outbuf[0] = (triple >> 16) & 0xff;+      p->outbuf[1] = (triple >> 8) & 0xff;+      p->outlen = 2;+    } else {+      triple |= (uint32_t)v[3];+      p->outbuf[0] = (triple >> 16) & 0xff;+      p->outbuf[1] = (triple >> 8) & 0xff;+      p->outbuf[2] = triple & 0xff;+      p->outlen = 3;+    }+  }+  p->outpos = 0;+  return p->outbuf[p->outpos++];+}++static void+ungetb_b64(int c, BFILE *bp) {+  struct BFILE_b64 *p = (struct BFILE_b64*)bp;+  CHECKBFILE(bp, getb_b64);+  if (!p->read)+    ERR("ungetb_b64: not in read mode");+  if (p->unget >= 0)+    ERR("ungetb_b64: double unget");+  p->unget = c;+}++static const char b64_alphabet[] =+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";+#define B64_PAD 64               /* index into b64_alphabet */++/* emit one 4-char Base64 quad to the underlying file, with optional wrapping */+static INLINE void+b64_put_quad(int a, int b, int c, int d, struct BFILE_b64 *p) {+  if (p->linelen && p->outcol + 4 > p->linelen) {+    putb('\n', p->bfile);+    p->outcol = 0;+  }+  putb(b64_alphabet[a], p->bfile);+  putb(b64_alphabet[b], p->bfile);+  putb(b64_alphabet[c], p->bfile);+  putb(b64_alphabet[d], p->bfile);+  p->outcol += 4;+}++static void+putb_b64(int byte, BFILE *bp) {+  struct BFILE_b64 *p = (struct BFILE_b64*)bp;+  CHECKBFILE(bp, getb_b64);+  if (p->read)+    ERR("putb_b64: not in write mode");++  p->encbuf[p->encpos++] = byte;++  if (p->encpos == 3) {+    uint32_t x = ((uint32_t)p->encbuf[0] << 16) |+                 ((uint32_t)p->encbuf[1] << 8)  |+                 ((uint32_t)p->encbuf[2]);+    b64_put_quad((x >> 18) & 0x3f,+                 (x >> 12) & 0x3f,+                 (x >> 6)  & 0x3f,+                 x         & 0x3f,+                 p);+    p->encpos = 0;+  }+}++static void+flushb_b64(BFILE *bp) {+  struct BFILE_b64 *p = (struct BFILE_b64*)bp;+  CHECKBFILE(bp, getb_b64);++  if (p->read)+    return;++  /* finalize any pending tail (1 or 2 bytes) with padding */+  if (p->encpos == 1) {+    uint32_t x = ((uint32_t)p->encbuf[0]) << 16;+    b64_put_quad((x >> 18) & 0x3f,+                 (x >> 12) & 0x3f,+                 B64_PAD,+                 B64_PAD,+                 p);+    p->encpos = 0;+  } else if (p->encpos == 2) {+    uint32_t x = ((uint32_t)p->encbuf[0] << 16) |+                 ((uint32_t)p->encbuf[1] << 8);+    b64_put_quad((x >> 18) & 0x3f,+                 (x >> 12) & 0x3f,+                 (x >> 6)  & 0x3f,+                 B64_PAD,+                 p);+    p->encpos = 0;+  }++  flushb(p->bfile);+}++static void+closeb_b64(BFILE *bp) {+  struct BFILE_b64 *p = (struct BFILE_b64*)bp;+  CHECKBFILE(bp, getb_b64);++  if (!p->read) {+    flushb_b64(bp);       /* emits tail + flushes */+    if (p->linelen && p->outcol) {+      /* newline-terminate the final line if wrapping was enabled */+      putb('\n', p->bfile);+    }+  }++  closeb(p->bfile);+  FREE(p);+}++BFILE *+add_base64_encoder(BFILE *file) {+  struct BFILE_b64 *p = MALLOC(sizeof(struct BFILE_b64));+  if (!p)+    memerr();+  memset(p, 0, sizeof *p);+  p->mets.getb   = getb_b64;+  p->mets.ungetb = 0;+  p->mets.putb   = putb_b64;+  p->mets.flushb = flushb_b64;+  p->mets.closeb = closeb_b64;+  p->mets.readb  = 0;+  p->mets.writeb = 0;++  p->bfile  = file;+  p->read   = 0;+  p->encpos = 0;+  p->linelen = 76;+  p->outcol  = 0;++  p->unget = -1;+  p->outpos = 0;+  p->outlen = 0;++  return (BFILE*)p;+}++BFILE *+add_base64_decoder(BFILE *file) {+  struct BFILE_b64 *p = MALLOC(sizeof(struct BFILE_b64));+  if (!p)+    memerr();+  memset(p, 0, sizeof *p);+  p->mets.getb   = getb_b64;+  p->mets.ungetb = ungetb_b64;+  p->mets.putb   = 0;+  p->mets.flushb = flushb_b64;+  p->mets.closeb = closeb_b64;+  p->mets.readb  = 0;+  p->mets.writeb = 0;+  p->bfile = file;+  p->read = 1;+  p->unget = -1;+  p->outpos = 0;+  p->outlen = 0;+  return (BFILE*)p;+}++#endif  /* WANT_BASE64 */
+ src/runtime/c64/config.h view
@@ -0,0 +1,84 @@+/*+ * 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++/*+ * Include MD5 checksumming code+ */+#define WANT_MD5 0++/*+ * Include profiling code+ */+#define WANT_TICK 0++/*+ * Process argc, argv+ */+#define WANT_ARGS 0++/*+ * Number of bits in a word.  Only 32 and 64 are supported.+ */+//#define WORD_SIZE 16++/*+ * 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 INTTABLE 0              /* use fixed table of small INT nodes */+#define SANITY   0              /* do some sanity checks */+#define STACKOVL 1              /* check for stack overflow */++#define INLINE+#define NORETURN
+ src/runtime/c64/extra.c view
src/runtime/comb.c view
@@ -1,3 +1,4 @@ unsigned char *combexpr = 0; int combexprlen = 0; struct ffi_entry *xffi_table = 0;+struct ffe_entry *xffe_table = 0;
− src/runtime/config-c64.h
@@ -1,84 +0,0 @@-/*- * 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--/*- * Include MD5 checksumming code- */-#define WANT_MD5 0--/*- * Include profiling code- */-#define WANT_TICK 0--/*- * Process argc, argv- */-#define WANT_ARGS 0--/*- * Number of bits in a word.  Only 32 and 64 are supported.- */-//#define WORD_SIZE 16--/*- * 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 INTTABLE 0              /* use fixed table of small INT nodes */-#define SANITY   0              /* do some sanity checks */-#define STACKOVL 1              /* check for stack overflow */--#define INLINE-#define NORETURN
− src/runtime/config-esp32.h
@@ -1,88 +0,0 @@-/*- * 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 1--/*- * Include <math.h>- * Without this, exp,sin, etc are not available.- */-#define WANT_MATH 0--/*- * Include MD5 checksumming code- */-#define WANT_MD5 0--/*- * Include profiling code- */-#define WANT_TICK 0--/*- * Process argc, argv- */-#define WANT_ARGS 0--/*- * Number of bits in a word.  Only 32 and 64 are supported.- */-//#define WORD_SIZE 32--/*- * 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--/*- * 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 INTTABLE 1              /* use fixed table of small INT nodes */-#define SANITY   1              /* do some sanity checks */-#define STACKOVL 1              /* check for stack overflow */--#define HEAP_CELLS 4000-#define STACK_SIZE 500--#define MAIN void app_main(void)--#define INITIALIZATION
− src/runtime/config-micro-64.h
@@ -1,81 +0,0 @@-/*- * 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--/*- * Include MD5 checksumming code- */-#define WANT_MD5 0--/*- * Include profiling code- */-#define WANT_TICK 0--/*- * Process argc, argv- */-#define WANT_ARGS 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 INTTABLE 0              /* 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
@@ -1,78 +0,0 @@-/*- * 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--/*- * Include MD5 checksumming code- */-#define WANT_MD5 1--/*- * Include profiling code- */-#define WANT_TICK 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 returns 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--#define POPCOUNT __builtin_popcountll--#include <inttypes.h>--static inline uint64_t clz(uint64_t x) {-  if (x == 0) return 64;-  return __builtin_clzll(x);-}-#define CLZ clz--static inline uint64_t ctz(uint64_t x) {-  if (x == 0) return 64;-  return __builtin_ctzll(x);-}-#define CTZ ctz--/*- * 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 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-stm32f4.h
@@ -1,148 +0,0 @@-/*- * 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 1--/*- * Include <math.h>- * Without this, exp,sin, etc are not available.- */-#define WANT_MATH 0--/*- * Include MD5 checksumming code- */-#define WANT_MD5 0--/*- * Include profiling code- */-#define WANT_TICK 0--/*- * Process argc, argv- */-#define WANT_ARGS 0--/*- * Number of bits in a word.  Only 32 and 64 are supported.- */-//#define WORD_SIZE 32--/*- * 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--/*- * 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 INTTABLE 1              /* use fixed table of small INT nodes */-#define SANITY   1              /* do some sanity checks */-#define STACKOVL 1              /* check for stack overflow */--#define HEAP_CELLS 4000-#define STACK_SIZE 500--#include "stm32f4xx.h"--#define INITIALIZATION-void-main_setup(void)-{-  RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // Enable the clock of port D of the GPIO-	-  GPIOD->MODER |= GPIO_MODER_MODER12_0; // Green LED, set pin 12 as output-  GPIOD->MODER |= GPIO_MODER_MODER13_0; // Orange LED, set pin 13 as output-  GPIOD->MODER |= GPIO_MODER_MODER14_0; // Red LED, set pin 14 as output-  GPIOD->MODER |= GPIO_MODER_MODER15_0; // Blue LED, set pin 15 as output-}--void-set_led(int led, int on)-{-  GPIOD->BSRR = 1 << (12 + led + (on ? 0 : 16));-}--#pragma push-#pragma O0-void-busy_wait(volatile uint32_t cnt) {-  while(cnt--)-    _nop_();-}-#pragma pop--/* Instead of exit()ing, flash the green LED on exit code 0 else the red */-void-myexit(int n)-{-  set_led(0, 0);-  set_led(1, 0);-  set_led(2, 0);-  set_led(3, 0);-  int led = n ? 2 : 0;-  for(;;) {-    set_led(led, 1);-    busy_wait(1000000);-    set_led(led, 0);-    busy_wait(1000000);-  }-}-#define EXIT myexit--int-ffs(uintptr_t x)-{-  if (!x)-    return 0;-  x &= -x;                      /* keep lowest bit */-  int i = __CLZ(x);             /* count leading 0s */-  return 32 - i;                /* 31 leading zeros should return 1 */-}-#define FFS ffs--#define CLZ __CLZ--#define FFI_EXTRA \-  { "set_led",   (funptr_t)set_led,   FFI_IIV }, \-  { "busy_wait", (funptr_t)busy_wait, FFI_IV },
− src/runtime/config-unix-32.h
@@ -1,10 +0,0 @@-#include "config-unix-64.h"--//#undef WORD_SIZE-//#define WORD_SIZE 32--#undef FFS-#if _POSIX_VERSION >= 200112L-#define FFS ffs-#endif-
− src/runtime/config-unix-64.h
@@ -1,238 +0,0 @@-/* Copyright 2023 Lennart Augustsson- * See LICENSE file for full license.- */--/*- * 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,sqrt etc will not be available.- */-#define WANT_MATH 1--/*- * Include MD5 checksumming code- */-#define WANT_MD5 1--/*- * Include profiling code- */-#define WANT_TICK 1--/*- * Include directory manipulation- */-#define WANT_DIR 1--/*- * Include time_t type- */-#define WANT_TIME 1--/*- * Number of bits in a word.  Only 32 and 64 are supported.- * WORD_SIZE set in mhsffi.h- */-//#define WORD_SIZE 64--/*- * Find First Set- * This macro should be defined.- * It returns the number of the least significant bit that is set.- * Numberings starts from 1.  If no bit is set, it should return 0.- */-#if defined(__gnu_linux__) || defined(__APPLE__) || defined(__FreeBSD__)-/* Only some platforms have 64 bit ffsl function directly. */-#define FFS ffsl-#elif defined(__has_builtin)--#if __has_builtin(__builtin__ffsl)-#define FFS __builtin_ffsl-#endif--#endif--/*- * This is the character used for comma-separation in printf.- * Defaults to "'".- */-/* #define PCOMMA "'" */--#include <inttypes.h>-#include <termios.h>-#include <sys/types.h>-#include <unistd.h>-#include <string.h>-#include <stdlib.h>-#include <fcntl.h>-#include <errno.h>-#if WANT_STDIO-#include <stdio.h>-#endif  /* WANT_STDIO */--/*- * 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 defined(USE_SYSTEM_RAW)--  /* For, e.g., execution with WASM in node the ioctl() doesn't seem to work */-  system("stty raw");-  r = read(0, &c, 1);-  system("stty -raw");--#else  /* USE_SYSTEM_RAW */--  if (tcgetattr(0, &old)) {-#if WANT_STDIO-    fprintf(stderr, "tcgetattr failed: errno=%d\n", errno);-#endif  /* WANT_STDIO */-    return -1;-  }-  new = old;-  new.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP-                   | INLCR | IGNCR | ICRNL | IXON);-  new.c_oflag &= ~OPOST;-  new.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);-  new.c_cflag &= ~(CSIZE | PARENB);-  new.c_cflag |= CS8;-  if (tcsetattr(0, TCSANOW, &new)) {-#if WANT_STDIO-    fprintf(stderr, "tcsetattr 1 failed: errno=%d\n", errno);-#endif  /* WANT_STDIO */-    return -1;-  }-  r = read(0, &c, 1);-  if (tcsetattr(0, TCSANOW, &old)) {-#if WANT_STDIO-    fprintf(stderr, "tcsetattr 2 failed: errno=%d\n", errno);-#endif  /* WANT_STDIO */-    return -1;-  }--#endif  /* USE_SYSTEM_RAW */--  if (r == 1)-    return c;-  else {-#if WANT_STDIO-    fprintf(stderr, "read failed: errno=%d\n", errno);-#endif  /* WANT_STDIO */-    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>-uintptr_t-gettimemilli(void)-{-  struct timeval tv;-  (void)gettimeofday(&tv, NULL);-  return (uintptr_t)(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");-  const size_t PID_DIGITS = 10;-  if (!tmp)-    tmp = "/tmp";-  char *s = malloc(strlen(tmp) + 1 + strlen(pre) + PID_DIGITS + strlen(suf) + 1);-  /* This might loop forever.  See if I care. :) */-  for(;;) {-    strcpy(s, tmp);-    strcat(s, "/");-    strcat(s, pre);-    /* Insert PID_DIGITS digits of the PID */-    char *p = s + strlen(s) + PID_DIGITS;-    *p-- = 0;-    for(int i = 0; i < PID_DIGITS; 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--/*- * Define CLOCK_INIT is there is a ticking clock.- * CLOCK_INIT will be called for initializing the clock- */-/* On Unix we just use gettimeofday() to get the clock,- * so no initialization is needed.- */-#define CLOCK_INIT() do { } while(0)-/* CLOCK_T is the type of the clock values. */-#define CLOCK_T int64_t       /* large enough for 290Myears */-/* CLOCK_GET returns the current clock in microseconds. */-#define CLOCK_GET clock_get-/* CLOCK_SLEEP sleeps some number of microseconds */-#define CLOCK_SLEEP usleep-CLOCK_T CLOCK_GET(void)-{-  struct timeval tv;-  (void)gettimeofday(&tv, 0);   /* this is very fast, about 16ns on an M4 MacMini */-  return (uint64_t)(tv.tv_sec * 1000000 + tv.tv_usec);-}--/*- * We want a signal handler for SIGINT.- */-#define WANT_SIGINT 1--/*- * 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 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
@@ -1,144 +0,0 @@-/*- * 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--/*- * Include MD5 checksumming code- */-#define WANT_MD5 1--/*- * Include profiling code- */-#define WANT_TICK 1--/*- * Number of bits in a word.  Only 32 and 64 are supported.- */-//#define WORD_SIZE 64--/*- * This is Windows- */-#define ISWINDOWS 1--#include <inttypes.h>--/*- * Find First Set- * This macro must be defined.- * It returns 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;-}-#define FFS ffs--#if defined(_M_X64)-#define POPCOUNT __popcnt64-#elif defined(_M_IX86)-#define POPCOUNT __popcnt-#endif--static inline uint64_t clz(uint64_t x) {-  unsigned long count;-  if (_BitScanReverse64(&count, x)) {-    return 63 - (uint64_t)count;-  } else {-    return 64;-  }-}-#define CLZ clz--static inline uint64_t ctz(uint64_t x) {-  unsigned long count;-  if (_BitScanForward64(&count, x)) {-    return (uint64_t)count;-  } else {-    return 64;-  }-}-#define CTZ ctz--/*- * 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 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.h
@@ -1,11 +0,0 @@-#ifndef CONFIG_H-#define CONFIG_H--/*- * In here are items that can be configured, but that does not depend on the platform.- */--#define HEAP_CELLS 50000000-#define STACK_SIZE 100000--#endif // CONFIG_H
+ src/runtime/esp32/config.h view
@@ -0,0 +1,88 @@+/*+ * 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 1++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 0++/*+ * Include MD5 checksumming code+ */+#define WANT_MD5 0++/*+ * Include profiling code+ */+#define WANT_TICK 0++/*+ * Process argc, argv+ */+#define WANT_ARGS 0++/*+ * Number of bits in a word.  Only 32 and 64 are supported.+ */+//#define WORD_SIZE 32++/*+ * 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++/*+ * 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 INTTABLE 1              /* use fixed table of small INT nodes */+#define SANITY   1              /* do some sanity checks */+#define STACKOVL 1              /* check for stack overflow */++#define HEAP_CELLS 4000+#define STACK_SIZE 500++#define MAIN void app_main(void)++#define INITIALIZATION
+ src/runtime/esp32/extra.c view
− src/runtime/eval-c64.c
@@ -1,6 +0,0 @@-/* Copyright 2023 Lennart Augustsson- * See LICENSE file for full license.- */-#include "config-c64.h"--#include "eval.c"
− src/runtime/eval-esp32.c
@@ -1,6 +0,0 @@-/* Copyright 2023 Lennart Augustsson- * See LICENSE file for full license.- */-#include "config-esp32.h"--#include "eval.c"
− src/runtime/eval-micro-64.c
@@ -1,6 +0,0 @@-/* Copyright 2023 Lennart Augustsson- * See LICENSE file for full license.- */-#include "config-micro-64.h"--#include "eval.c"
− src/runtime/eval-mingw-64.c
@@ -1,6 +0,0 @@-/* Copyright 2023 Lennart Augustsson- * See LICENSE file for full license.- */-#include "config-mingw-64.h"--#include "eval.c"
− src/runtime/eval-stm32f4.c
@@ -1,6 +0,0 @@-/* Copyright 2023 Lennart Augustsson- * See LICENSE file for full license.- */-#include "config-stm32f4.h"--#include "eval.c"
− src/runtime/eval-unix-32.c
@@ -1,6 +0,0 @@-/* Copyright 2023 Lennart Augustsson- * See LICENSE file for full license.- */-#include "config-unix-32.h"--#include "eval.c"
− src/runtime/eval-unix-64.c
@@ -1,6 +0,0 @@-/* Copyright 2023 Lennart Augustsson- * See LICENSE file for full license.- */-#include "config-unix-64.h"--#include "eval.c"
− src/runtime/eval-windows-64.c
@@ -1,6 +0,0 @@-/* Copyright 2023 Lennart Augustsson- * See LICENSE file for full license.- */-#include "config-windows-64.h"--#include "eval.c"
src/runtime/eval.c view
@@ -1,5966 +1,7287 @@ /* Copyright 2023,2024,2025 Lennart Augustsson  * See LICENSE file for full license.  */-#if !defined(WANT_GMP)-#define WANT_GMP 0-#endif--#include <inttypes.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 */-#if WANT_DIR-#include <dirent.h>-#include <unistd.h>-#include <sys/stat.h>-#include <sys/types.h>-#endif  /* WANT_DIR */-#if WANT_TIME-#include <time.h>-#endif-#if WANT_GMP-#include <gmp.h>-#endif-#if WANT_SIGINT-#include <signal.h>-#endif--#if WANT_MD5-#include "md5.h"-#endif--#if !defined(WANT_LZ77)-#define WANT_LZ77 1-#endif--#if !defined(WANT_RLE)-#define WANT_RLE 1-#endif--#if !defined(WANT_BWT)-#define WANT_BWT 1-#endif--#if WANT_LZ77-size_t lz77d(uint8_t *src, size_t srclen, uint8_t **bufp);-size_t lz77c(uint8_t *src, size_t srclen, uint8_t **bufp);-#endif--#if defined(__GNUC__) && __GNUC__ >= 14 && defined(__aarch64__)-#define REGISTER(dcl, reg) register dcl asm(#reg)-#else-#define REGISTER(dcl, reg) dcl-#endif--#include "mhsffi.h"-struct ffi_entry ffi_table[];-int num_ffi;-#define FFI_IX(i) ((i) < num_ffi ? ffi_table[i] : xffi_table[i - num_ffi])--//#include "config.h"--#if WANT_STDIO-#define THREAD_DEBUG 1-#else-#define THREAD_DEBUG 0-#endif--#define VERSION "v8.0\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 */--typedef uintptr_t counter_t;    /* Statistics counter, can be smaller since overflow doesn't matter */-#define PRIcounter PRIuPTR-typedef uintptr_t bits_t;       /* One word of bits */--#if !defined(MALLOC)-#define MALLOC malloc-#endif--#if !defined(REALLOC)-#define REALLOC realloc-#endif--#if !defined(CALLOC)-#define CALLOC calloc-#endif--#if !defined(FREE)-#define FREE free-#endif--#if !defined(EXIT)-#define EXIT exit-#endif--#if !defined(PRINT)-#define PRINT printf-#endif--#if !defined(MAIN)-#define MAIN int main(int argc, char **argv)-#endif--#if !defined(PCOMMA)-#define PCOMMA "'"-#endif  /* !defined(PCOMMA) */--#if !defined(GETRAW)-int GETRAW(void) { return -1; }-#endif  /* !defined(getraw) */--#if !defined(GETTIMEMILLI)-value_t GETTIMEMILLI(void) { return 0; }-#endif  /* !define(GETTIMEMILLI) */--#if !defined(INLINE)-#define INLINE inline-#endif  /* !define(INLINE) */--#if !defined(NORETURN)-/*#define NORETURN [[noreturn]]*/-#define NORETURN _Noreturn-#endif /* !defined(NORETURN) */--NORETURN void memerr(void);--void *-mmalloc(size_t s)-{-  void *p = MALLOC(s);-  if (!p)-    memerr();-  return p;-}--void *-mrealloc(void *q, size_t s)-{-  void *p = REALLOC(q, s);-  if (!p)-    memerr();-  return p;-}--void *-mcalloc(size_t n, size_t s)-{-  void *p = CALLOC(n, s);-  if (!p)-    memerr();-  return p;-}--#if !defined(TMPNAME)-/* This is a really bad implementation, since it doesn't check for anything. */-char* TMPNAME(const char* pre, const char* post) {-  char *s = mmalloc(strlen(pre) + 3 + strlen(post) + 1);-  strcpy(s, pre);-  strcat(s, "TMP");-  strcat(s, post);-  return s;-}-#endif--#if !defined(FFS)-/* This is pretty bad, could use deBruijn multiplication instead. */-int-FFS(bits_t x)-{-  int i;-  if (!x)-    return 0;-  for(i = 1; !(x & 1); x >>= 1, i++)-    ;-  return i;-}-#endif  /* !defined(FFS) */--#if defined(__has_builtin)--#if __has_builtin(__builtin_popcountl)-#define BUILTIN_POPCOUNT-#endif--#endif--#if !defined(POPCOUNT)-uvalue_t POPCOUNT(uvalue_t x) {-#if defined(BUILTIN_POPCOUNT)-  return __builtin_popcountl(x);-#else-  uvalue_t count = 0;-  while (x) {-    x = x & (x - 1); // clear lowest 1 bit-    count += 1;-  }-  return count;-#endif-}-#endif--#if defined(__GNUC__)-#define BUILTIN_CLZ-#elif defined(__clang__)--#if __has_builtin(__builtin_clzl)-#define BUILTIN_CLZ-#endif--#endif---#if !defined(CLZ)-uvalue_t CLZ(uvalue_t x) {-#if defined(BUILTIN_CLZ)-  if (x == 0) return WORD_SIZE;-  return __builtin_clzl(x);-#else-  value_t count = WORD_SIZE;-  while (x) {-    x = x >> 1;-    count -= 1;-  }-  return count;-#endif-}-#endif--#if defined(__has_builtin)--#if __has_builtin(__builtin_ctzl)-#define BUILTIN_CTZ-#endif--#endif---#if !defined(CTZ)-uvalue_t CTZ(uvalue_t x) {-  if (x == 0) return WORD_SIZE;-#if defined(BUILTIN_CLZ)-  return __builtin_ctzl(x);-#else-  uvalue_t count = 0;-  while ((x & 1) == 0) {-    x = x >> 1;-    count += 1;-  }-  return count;-#endif-}-#endif--#if !defined(WANT_ARGS)-#define WANT_ARGS 1-#endif--#if !defined(COUNT)-#define COUNT(n) ++(n)-#endif--value_t-iswindows(void)-{-#if defined(ISWINDOWS)-  return 1;-#else-  return 0;-#endif-}--/***************************************/--/* Keep permanent nodes for LOW_INT <= i < HIGH_INT */-#define LOW_INT (-10)-#define HIGH_INT 256--#if !defined(HEAP_CELLS)-#define HEAP_CELLS 50000000-#endif--#if !defined(STACK_SIZE)-#define STACK_SIZE 100000-#endif--#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_FUNPTR, T_FORPTR, T_BADDYN, T_ARR, T_THID, T_MVAR,-                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_J,-                T_K2, T_K3, T_K4, T_CCB,-                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_POPCOUNT, T_CLZ, T_CTZ,-                T_EQ, T_NE, T_LT, T_LE, T_GT, T_GE, T_ULT, T_ULE, T_UGT, T_UGE, T_ICMP, T_UCMP,-                T_FPADD, T_FP2P, T_FPNEW, T_FPFIN, // T_FPSTR,-                T_FP2BS, T_BS2FP,-                T_TOPTR, T_TOINT, T_TODBL, T_TOFUNPTR,-                T_BININT2, T_BININT1, T_UNINT1,-                T_BINDBL2, T_BINDBL1, T_UNDBL1,-                T_BINBS2, T_BINBS1,-                T_ISINT,-#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_ARR_ALLOC, T_ARR_COPY, T_ARR_SIZE, T_ARR_READ, T_ARR_WRITE, T_ARR_EQ,-                T_RAISE, T_SEQ, T_EQUAL, T_COMPARE, T_RNF,-                T_TICK,-                T_IO_BIND, T_IO_THEN, T_IO_RETURN,-                T_IO_SERIALIZE, T_IO_DESERIALIZE,-                T_IO_GETARGREF,-                T_IO_PERFORMIO, T_IO_PRINT, T_CATCH, T_CATCHR,-                T_IO_CCALL, T_IO_GC, T_DYNSYM,-                T_IO_FORK, T_IO_THID, T_THNUM, T_IO_THROWTO, T_IO_YIELD,-                T_IO_NEWMVAR,-                T_IO_TAKEMVAR, T_IO_PUTMVAR, T_IO_READMVAR,-                T_IO_TRYTAKEMVAR, T_IO_TRYPUTMVAR, T_IO_TRYREADMVAR,-                T_IO_THREADDELAY, T_IO_THREADSTATUS,-                T_IO_GETMASKINGSTATE, T_IO_SETMASKINGSTATE,-                T_NEWCASTRINGLEN, T_PACKCSTRING, T_PACKCSTRINGLEN,-                T_BSAPPEND, T_BSEQ, T_BSNE, T_BSLT, T_BSLE, T_BSGT, T_BSGE, T_BSCMP,-                T_BSPACK, T_BSUNPACK, T_BSREPLICATE, T_BSLENGTH, T_BSSUBSTR, T_BSINDEX,-                T_BSFROMUTF8, T_BSTOUTF8, T_BSHEADUTF8, T_BSTAILUTF8,-                T_BSAPPENDDOT,-                T_IO_PP,           /* for debugging */-                T_IO_STDIN, T_IO_STDOUT, T_IO_STDERR,-                T_LAST_TAG,-};-/* Most entries are initialized from the primops table. */-static const char* tag_names[T_LAST_TAG+1] =-  { "FREE", "IND", "AP", "INT", "DBL", "PTR", "FUNPTR", "FORPTR", "BADDYN", "ARR", "THID", "MVAR" };--struct ioarray;-struct bytestring;-struct forptr;-struct mthread;-struct mvar;--typedef struct node {-  union {-    struct node *uufun;-    intptr_t     uuifun;-    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;-    flt_t           uufloatvalue;-    const char     *uucstring;-    void           *uuptr;-    HsFunPtr        uufunptr;-    struct ioarray *uuarray;-    struct forptr  *uuforptr;      /* foreign pointers and byte arrays */-    struct mthread *uuthread;-    struct mvar    *uumvar;-  } uarg;-} node;-#define BIT_TAG   1-#define BIT_IND   2-#define BIT_NOTAP (BIT_TAG | BIT_IND)-#define TAG_SHIFT 2--typedef struct node* NODEPTR;-#define NIL 0-#define HEAPREF(i) &cells[(i)]-#define GETTAG(p) ((p)->ufun.uutag & BIT_NOTAP ? ( (p)->ufun.uutag & BIT_IND ? T_IND : (int)((p)->ufun.uutag >> TAG_SHIFT) ) : T_AP)-#define SETTAG(p,t) do { if (t != T_AP) { if (t == T_IND) { (p)->ufun.uutag = BIT_IND; } else { (p)->ufun.uutag = ((t) << TAG_SHIFT) | BIT_TAG; } } } while(0)-#define GETVALUE(p) (p)->uarg.uuvalue-#define GETDBLVALUE(p) (p)->uarg.uufloatvalue-#define SETVALUE(p,v) (p)->uarg.uuvalue = v-#define SETDBLVALUE(p,v) (p)->uarg.uufloatvalue = v-#define FUN(p) (p)->ufun.uufun-#define ARG(p) (p)->uarg.uuarg-#define CSTR(p) (p)->uarg.uucstring-#define PTR(p) (p)->uarg.uuptr-#define FUNPTR(p) (p)->uarg.uufunptr-#define FORPTR(p) (p)->uarg.uuforptr-#define BSTR(p) (p)->uarg.uuforptr->payload-#define ARR(p) (p)->uarg.uuarray-#define THR(p) (p)->uarg.uuthread-#define MVAR(p) (p)->uarg.uumvar-#define ISINDIR(p) ((p)->ufun.uuifun & BIT_IND)-#define GETINDIR(p) ((struct node*) ((p)->ufun.uuifun & ~BIT_IND))-#define SETINDIR(p,q) do { (p)->ufun.uuifun = (intptr_t)(q) | BIT_IND; } while(0)-#define NODE_SIZE sizeof(node)-#define ALLOC_HEAP(n) do { cells = mmalloc(n * sizeof(node)); } while(0)-#define LABEL(n) ((heapoffs_t)((n) - cells))-node *cells;                 /* All cells */--/*- * byte arrays- */-struct bytestring {-  size_t size;-  void *string;-};--/*- * Arrays are allocated with malloc()/free().- * During GC they are marked, and all elements in the array are- * recursively marked.- * At the end of the the mark phase there is a scan of all- * arrays, and the unmarked ones are freed.- */-struct ioarray {-  struct ioarray *next;         /* all ioarrays are linked together */-  int permanent;                /* this array should never be GC-ed */-  size_t marked;                /* marked during GC */-  size_t size;                  /* number of elements in the array */-  NODEPTR array[1];             /* actual size may be bigger */-};-struct ioarray *array_root = 0; /* root of all allocated arrays, linked by next */--enum fptype {-  FP_FORPTR = 0,                /* a regular foreign pointer to unknown memory */-  FP_BSTR,                      /* a bytestring */-  FP_MPZ,                       /* a GMP MPZ pointer */-};--/*- * A Haskell ForeignPtr has a normal pointer, and a finalizer- * function that is to be called when there are no more references- * to the ForeignPtr.- * A complication is that using plusForeignPtr creates a new- * ForeignPtr that must share the same finalizer.- * There is one struct forptr for each ForeignPtr.  It has pointer- * to the actual data, and to a struct final which is shared between- * all ForeignPtrs that have been created with plusForeignPtr.- * During GC the used bit is set for any references to the forptr.- * The scan phase will traverse the struct final chain and run- * the finalizer, and free associated structs.- */-struct final {-  struct final  *next;      /* the next finalizer */-  HsFunPtr       final;     /* function to call to release resource */-  void          *arg;       /* argument to final when called */-  size_t         size;      /* size of memory, if known, otherwise NOSIZE */-#define NOSIZE ~0           /* used as the size in payload for actual foreign pointers */-  struct forptr *back;      /* back pointer to the first forptr */-  short          marked;    /* mark bit for GC */-  enum fptype    fptype;    /* what kind of foreign pointer */-};--/*- * Foreign pointers are also used to represent bytestrings.- * The difference between a foreign pointer and a bytestring- * is that we can serialize the latter.- * The size field is non-zero only for bytestrings.- */-struct forptr {-  struct forptr *next;       /* the next ForeignPtr that shares the same finalizer */-  struct final  *finalizer;  /* the finalizer for this ForeignPtr */-  struct bytestring payload; /* the actual pointer to allocated data, and maybe a size */-  //  char          *desc;-};-struct final *final_root = 0;   /* root of all allocated foreign pointers, linked by next */--//REGISTER(counter_t num_reductions,r19);-counter_t num_reductions = 0;-counter_t num_alloc = 0;-counter_t num_gc = 0;-counter_t num_yield = 0;-counter_t num_resched = 0;-counter_t num_thread_reap = 0;-counter_t num_mvar_alloc = 0;-counter_t num_mvar_free = 0;-uintptr_t gc_mark_time = 0;-uintptr_t gc_scan_time = 0;-uintptr_t run_time = 0;--#define MAIN_THREAD 1-uvalue_t num_thread_create = MAIN_THREAD;--#define MAXSTACKDEPTH 0-#if MAXSTACKDEPTH-stackptr_t max_stack_depth = 0;-counter_t max_c_stack = 0;-counter_t cur_c_stack = 0;-#define MAXSTACK if (stack_ptr > max_stack_depth) max_stack_depth = stack_ptr-#else-#define MAXSTACK-#endif--NODEPTR *topnode;-NODEPTR atptr;--REGISTER(NODEPTR *stack,r20);-REGISTER(stackptr_t stack_ptr,r21);-#if STACKOVL-#define PUSH(x) do { if (stack_ptr >= stack_size-2) stackerr(); stack[++stack_ptr] = (x); MAXSTACK; } while(0)-#else  /* STACKOVL */-#define PUSH(x) do {                                            stack[++stack_ptr] = (x); MAXSTACK; } while(0)-#endif  /* STACKOVL */-#define TOP(n) stack[stack_ptr - (n)]-#define POP(n) stack_ptr -= (n)-#define POPTOP() stack[stack_ptr--]-#define GCCHECK(n) gc_check((n))-#define CLEARSTK() do { stack_ptr = -1; } while(0)-#define GCCHECKSAVE(p, n) do { PUSH(p); GCCHECK(n); (p) = TOP(0); POP(1); } while(0)--heapoffs_t heap_size;       /* number of heap cells */-heapoffs_t heap_start;      /* first location in heap that needs GC */-REGISTER(stackptr_t stack_size,r22);      /* number of stack slots */--counter_t num_marked;-counter_t max_num_marked = 0;-counter_t num_free;-counter_t num_arr_alloc;-counter_t num_arr_free;-counter_t num_fin_alloc;-counter_t num_fin_free;-counter_t num_bs_alloc;-counter_t num_bs_alloc_max;-counter_t num_bs_free;-counter_t num_bs_bytes;-counter_t num_bs_inuse;-counter_t num_bs_inuse_max;--#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;--int want_gc_red = 0;--NORETURN void-memerr(void)-{-  ERR("Out of memory");-  EXIT(1);-}--NORETURN-void-stackerr(void)-{-  ERR("stack overflow");-  EXIT(1);-}--/***************************************/--#include "bfile.c"--/***************************************/--struct ioarray*-arr_alloc(size_t sz, NODEPTR e)-{-  struct ioarray *arr = mmalloc(sizeof(struct ioarray) + (sz-1) * sizeof(NODEPTR));-  size_t i;--  arr->next = array_root;-  array_root = arr;-  arr->marked = 0;-  arr->permanent = 0;-  arr->size = sz;-  for(i = 0; i < sz; i++)-    arr->array[i] = e;-  //PRINT("arr_alloc(%d, %p) = %p\n", (int)sz, e, arr);-  num_arr_alloc++;-  return arr;-}--struct ioarray*-arr_copy(struct ioarray *oarr)-{-  size_t sz = oarr->size;-  struct ioarray *arr = mmalloc(sizeof(struct ioarray) + (sz-1) * sizeof(NODEPTR));--  arr->next = array_root;-  array_root = arr;-  arr->marked = 0;-  arr->permanent = 0;-  arr->size = sz;-  memcpy(arr->array, oarr->array, sz * sizeof(NODEPTR));-  num_arr_alloc++;-  return arr;-}--/*****************************************************************************/--#if WANT_TICK-struct tick_entry {-  struct bytestring tick_name;-  counter_t tick_count;-} *tick_table = 0;-size_t tick_table_size;-size_t tick_index;--/* Allocate a new tick table entry and return the index. */-size_t-add_tick_table(struct bytestring name)-{-  if (!tick_table) {-    tick_table_size = 100;-    tick_table = mmalloc(tick_table_size * sizeof(struct tick_entry));-    tick_index = 0;-  }-  if (tick_index >= tick_table_size) {-    tick_table_size *= 2;-    tick_table = mrealloc(tick_table, tick_table_size * sizeof(struct tick_entry));-  }-  tick_table[tick_index].tick_name = name;-  tick_table[tick_index].tick_count = 0;-  return tick_index++;-}--/* Called with the tick index. */-static inline void-dotick(value_t i)-{-  tick_table[i].tick_count++;-}--void-dump_tick_table(FILE *f)-{-  if (!tick_table) {-    fprintf(f, "Tick table empty\n");-    return;-  }-  for (size_t i = 0; i < tick_index; i++) {-    counter_t n = tick_table[i].tick_count;-    if (n)-      fprintf(f, "%-60s %10"PRIcounter"\n", (char *)tick_table[i].tick_name.string, n);-  }-}-#endif--enum th_sched { mt_main, mt_resched, mt_raise };-/* The two enums below are known by the Haskell code.  Do not change order */-enum th_state { ts_runnable, ts_wait_mvar, ts_wait_time, ts_finished, ts_died };-enum mask_state { mask_unmasked, mask_interruptible, mask_uninterruptible };--/***************** HANDLER *****************/--struct handler {-  jmp_buf         hdl_buf;      /* env storage */-  struct handler *hdl_old;      /* old handler */-  NODEPTR         hdl_exn;      /* used temporarily to pass the exception value */-} *cur_handler = 0;--/***************** THREAD ******************/--struct mthread {-  enum th_state   mt_state;      /* thread state */-  enum mask_state mt_mask;       /* making state. */-  struct mthread *mt_next;       /* all threads linked together */-  struct mthread *mt_queue;      /* runq/waitq link */-  counter_t       mt_slice;      /* reduction steps until yielding */-  counter_t       mt_num_slices; /* number of slices so far */-  NODEPTR         mt_root;       /* root of the graph to reduce */-  struct mvar    *mt_exn;        /* possible thrown exception */-  NODEPTR         mt_mval;       /* filled after waiting for take/read */-  int             mt_mark;       /* marked as accessible */-  uvalue_t        mt_id;         /* thread number, thread 1 is the main thread */-#if defined(CLOCK_INIT)-  CLOCK_T         mt_at;         /* time to wake up when in threadDelay */-#endif-};-struct mthread  *all_threads = 0;   /* all threads */--struct mqueue {-  struct mthread *mq_head;-  struct mthread *mq_tail;-};-struct mqueue runq = { 0, 0 };;-struct mqueue timeq = { 0, 0 };--struct mvar {-  struct mvar    *mv_next;      /* all mvars linked together */-  NODEPTR         mv_data;      /* contents of the mvar, or NIL when empty */-  struct mqueue   mv_takeput;   /* queue of threads waiting for take or put, single wakeup */-  struct mqueue   mv_read;      /* queue of threads waiting for read, multiple wakeup */-  int             mv_mark;      /* marked as accessible */-};-struct mvar      *all_mvars = 0;   /* all mvars */--jmp_buf          sched;             /* jump here to yield */-counter_t        slice = 100000;    /* normal time slice;-                                     * on an M4 Mac this is about 0.3ms */-//REGISTER(counter_t glob_slice,r23);-REGISTER(int glob_slice,r23);--NODEPTR          the_exn;       /* Used to propagate the exception for longjmp(sched, mt_raise) */--/* The order of these must be kept in sync with Control.Exception.Internal.rtsExn */-enum rts_exn { exn_stackoverflow, exn_heapoverflow, exn_threadkilled, exn_userinterrupt, exn_dividebyzero };--NORETURN void raise_exn(NODEPTR exn);-struct mvar* new_mvar(void);-NODEPTR take_mvar(int try, struct mvar *mv);-NORETURN void die_exn(NODEPTR exn);-void thread_intr(struct mthread *mt);-int put_mvar(int try, struct mvar *mv, NODEPTR v);-NODEPTR mkInt(value_t i);-NODEPTR mkFlt(flt_t d);-NODEPTR mkPtr(void* p);-struct mthread* new_thread(NODEPTR root);-void gc(void);-void async_throwto(struct mthread*, NODEPTR);--#if WANT_STDIO-void pp(FILE*, NODEPTR);-#endif--/* Needed during reduction */-NODEPTR intTable[HIGH_INT - LOW_INT];-NODEPTR combK, combTrue, combUnit, combCons, combPair;-NODEPTR combCC, combZ, combIOBIND, combIORETURN, combIOTHEN, combB, combC, combBB;-NODEPTR combSETMASKINGSTATE;-NODEPTR combLT, combEQ, combGT;-NODEPTR combShowExn, combU, combK2, combK3;-NODEPTR combBININT1, combBININT2, combUNINT1;-NODEPTR combBINDBL1, combBINDBL2, combUNDBL1;-NODEPTR combBINBS1, combBINBS2;-NODEPTR comb_stdin, comb_stdout, comb_stderr;-NODEPTR combJust;-NODEPTR combTHROWTO;-NODEPTR combPairUnit;-NODEPTR combWorld;-NODEPTR combCATCHR;-#define combFalse combK-#define combNothing combK--#if WANT_ARGS-/* This single element array hold a list of the program arguments. */-struct ioarray *argarray;-#endif  /* WANT_ARGS */--int verbose = 0;-int gcbell = 0;---#if WANT_SIGINT-volatile int has_sigint = 0;-void-handle_sigint(int s)-{-  has_sigint = 1;-}-#endif--/* 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)-    PRINT("gc_check: %d\n", (int)k);-#endif-  gc();-}--/* Add the thread to the tail of runq */-void-add_q_tail(struct mqueue *q, struct mthread *mt)-{-  if (!q->mq_head) {-    /* q is empty, so mt goes first */-    q->mq_head = mt;-  } else {-    /* link mt to the end of the runq */-    q->mq_tail->mt_queue = mt;-  }-  q->mq_tail = mt;               /* mt is now last */-  mt->mt_queue = 0;           /* mt is last, so no next */-}--void-add_runq_tail(struct mthread *mt)-{-  mt->mt_state = ts_runnable;-  add_q_tail(&runq, mt);-}--struct mthread*-remove_q_head(struct mqueue *q)-{-  struct mthread *mt = q->mq_head; /* front thread */-  if (!mt)-    return 0;-  q->mq_head = mt->mt_queue;       /* skip to next thread */-  if (!q->mq_head)-    q->mq_tail = 0;                /* q is now empty */-  return mt;-}--int-find_and_unlink(struct mqueue *mq, struct mthread *mt)-{-  struct mthread **mtp;-  -  for(mtp = &mq->mq_head; *mtp && *mtp != mt; mtp = &(*mtp)->mt_queue)-    ;-  if (!*mtp)-    return 0;                   /* not found */-  *mtp = mt->mt_queue;          /* unlink */-  if (*mtp)-    return 1;                   /* the unlinked thread was not the tail */-  if (mq->mq_head) {-    for (mt = mq->mq_head; mt->mt_queue; mt = mt->mt_queue)-      ;                         /* find the last element */-    mq->mq_tail = mt;-  } else {-    /* q is empty */-    mq->mq_tail = 0;-  }-  return 1;-}--/* This is a yucky hack */-int doing_rnf = 0;              /* REMOVE */-#if THREAD_DEBUG-const int thread_trace = 0;-#endif  /* THREAD_DEBUG */--/* clean up temporary globals to prepare for rescheduling */-void-cleanup(struct mthread *mt, enum th_state ts)-{-  /* We are going to reschedule, so clean up thread state:-   *  stack pointer-   *  error handlers-   */-#if THREAD_DEBUG-  if (thread_trace)-    printf("cleanup: %d state=%d\n", (int)mt->mt_id, ts);-#endif  /* THREAD_DEBUG */-  mt->mt_slice = stack_ptr;   /* we need stack_ptr reductions to just reach where we left off */-  mt->mt_state = ts;-  CLEARSTK();                 /* reset stack */-  doing_rnf = 0;-  /* free all error handlers */-  for (struct handler *h = cur_handler; h; ) {-    struct handler *n = h;-    h = h->hdl_old;-    free(n);-  }-  cur_handler = 0;-}--/* reschedule, does not return */-NORETURN void-resched(struct mthread *mt, enum th_state ts)-{-  cleanup(mt, ts);-  longjmp(sched, mt_resched);-}--#if THREAD_DEBUG-void-dump_q(const char *s, struct mqueue q)-{-  printf("%s=[", s);-  for(struct mthread *mt = q.mq_head; mt; mt = mt->mt_queue) {-    printf("%d ", (int)mt->mt_id);-  }-  printf("]\n");-}-#endif  /* THREAD_DEBUG */--/* Check if its time to wake up some threads waiting for a time. */-void-check_timeq(void)-{-#if defined(CLOCK_INIT)-  CLOCK_T now = CLOCK_GET();-  while (timeq.mq_head && timeq.mq_head->mt_at <= now) {-    struct mthread *mt = remove_q_head(&timeq);-    add_runq_tail(mt);-    mt->mt_at = -1;             /* indicate that the delay has expired */-#if THREAD_DEBUG-    if (thread_trace)-      printf("check_timeq: %d done\n", (int)mt->mt_id);-#endif  /* THREAD_DEBUG */-  }-#endif-}--void-throwto(struct mthread *mt, NODEPTR exn)-{-#if THREAD_DEBUG-  if (thread_trace) {-    printf("throwto: id=%d\n", (int)mt->mt_id);-  }-#endif  /* THREAD_DEBUG */-  thread_intr(mt);-  if (mt->mt_state != ts_died && mt->mt_state != ts_finished) {-#if THREAD_DEBUG-    if (thread_trace) {-      printf("throwto: id=%d put_mvar exn\n", (int)mt->mt_id);-    }-#endif  /* THREAD_DEBUG */-    (void)put_mvar(0, mt->mt_exn, exn); /* never returns if it blocks */-  }-}--void-check_thrown(void)-{-  if (runq.mq_head->mt_exn->mv_data == NIL)-    return;            /* no thrown exception */-  if (runq.mq_head->mt_mask != mask_unmasked)-    return;            /* interrupts are masked, so don't throw */-  /* the current thread has an async exception */-#if THREAD_DEBUG-  if (thread_trace)-    printf("check_thrown: exn for %d\n", (int)runq.mq_head->mt_id);-#endif  /* THREAD_DEBUG */-  NODEPTR exn = take_mvar(0, runq.mq_head->mt_exn); /* get the exception */-  raise_exn(exn);-}--void-check_sigint(void)-{-#if WANT_SIGINT-  if (has_sigint) {-    /* We have a signal, so send an async exception  to the main thread */-    has_sigint = 0;-    for(struct mthread *mt= all_threads; mt; mt = mt->mt_next) {-      if (mt->mt_id == MAIN_THREAD) {-#if THREAD_DEBUG-        if (thread_trace)-          printf("sending signal to main\n");-#endif  /* THREAD_DEBUG */-        async_throwto(mt, mkInt(exn_userinterrupt));-        break;-      }-    }-  }-#endif-}--/* Used to detect calls to error while we are already in a call to error. */-int in_raise = 0;--/* Inlining makes very little difference */-/*static INLINE*/ void-yield(void)-{-  if (in_raise)                 /* don't context switch when we are dying */-    return;-  //printf("yield stk=%d\n", (int)stack_ptr);-  //pp(stdout, runq.mt_root);-  COUNT(num_yield);-  runq.mq_head->mt_num_slices++;-  // XXX should check mt_thrown here-  -  if (timeq.mq_head)-    check_timeq();-  check_thrown();-  check_sigint();-  // printf("yield %p %d\n", runq, (int)stack_ptr);-  /* if there is nothing after in the runq then there is no need to reschedule */-  if (!runq.mq_head->mt_queue) {-#if THREAD_DEBUG-    if (thread_trace) {-      printf("yield: %d no other threads\n", (int)runq.mq_head->mt_id);-      dump_q("runq", runq);-    }-#endif  /* THREAD_DEBUG */-    glob_slice = slice;-    num_reductions += glob_slice-1;-    return;-  }--  /* Unlink from runq */-  struct mthread *mt = remove_q_head(&runq);-  /* link into back of runq */-  add_runq_tail(mt);-#if THREAD_DEBUG-  if (thread_trace) {-    printf("yield: resched %d\n", (int)mt->mt_id);-    dump_q("runq", runq);-  }-#endif  /* THREAD_DEBUG */-  resched(mt, ts_runnable);-}--struct mthread*-new_thread(NODEPTR root)-{-  struct mthread *mt = mmalloc(sizeof(struct mthread));--#if THREAD_DEBUG-  if (thread_trace) {-    printf("new_thread: mt=%p root=%p\n", mt, root);-  }-#endif  /* THREAD_DEBUG */-  mt->mt_mask = mask_unmasked;-  mt->mt_root = root;-  mt->mt_exn = new_mvar();-  mt->mt_mval = NIL;-  mt->mt_slice = 0;-  mt->mt_mark = 0;-  mt->mt_num_slices = 0;-  mt->mt_id = num_thread_create++;-#if defined(CLOCK_INIT)-  mt->mt_at = 0;                /* delay has not expired */-#endif--  /* add to all_threads */-  mt->mt_next = all_threads;-  all_threads = mt;--  /* add to tail of runq */-  add_runq_tail(mt);            /* sets runnable */-#if THREAD_DEBUG-  if (thread_trace) {-    printf("new_thread: add %d to runq tail\n", (int)mt->mt_id);-    dump_q("runq", runq);-  }-#endif  /* THREAD_DEBUG */-  return mt;-}--struct mvar*-new_mvar(void)-{-  COUNT(num_mvar_alloc);-  struct mvar *mv = mmalloc(sizeof(struct mvar));--  mv->mv_data = NIL;-  mv->mv_takeput.mq_head = 0;-  mv->mv_takeput.mq_tail = 0;-  mv->mv_read.mq_head = 0;-  mv->mv_read.mq_tail = 0;--  /* add to all_mvars */-  mv->mv_next = all_mvars;-  mv->mv_mark = 0;-  all_mvars = mv;-  -#if THREAD_DEBUG-  if (thread_trace)-    printf("new_mvar: mvar=%p\n", mv);-#endif  /* THREAD_DEBUG */-  return mv;-}--NODEPTR-take_mvar(int try, struct mvar *mv)-{-#if THREAD_DEBUG-  if (thread_trace) {-    printf("take_mvar: mvar=%p\n", mv);-    dump_q("takeput", mv->mv_takeput);-  }-#endif  /* THREAD_DEBUG */-  NODEPTR n;-  if ((n = runq.mq_head->mt_mval) != NIL) {-#if THREAD_DEBUG-    if (thread_trace)-      printf("take_mvar: mvar=%p got data %d\n", mv, (int)runq.mq_head->mt_id);-#endif  /* THREAD_DEBUG */-    /* We have after waking up */-    runq.mq_head->mt_mval = NIL;-    return n;                   /* returned the stashed data */-  }-  if ((n = mv->mv_data) != NIL) {-#if THREAD_DEBUG-    if (thread_trace)-      printf("take_mvar: mvar=%p full\n", mv);-#endif  /* THREAD_DEBUG */-    /* mvar is full */-    mv->mv_data = NIL;           /* now empty */-    /* move all threads waiting to put to the runq */-    for (struct mthread *mt = mv->mv_takeput.mq_head; mt; ) {-#if THREAD_DEBUG-      if (thread_trace) {-        printf("take_mvar: mvar=%p wake %d\n", mv, (int)mt->mt_id);-      }-#endif  /* THREAD_DEBUG */-      struct mthread *nt = mt->mt_queue;-      add_runq_tail(mt);-#if THREAD_DEBUG-      if (thread_trace) {-        dump_q("runq", runq);-      }-#endif  /* THREAD_DEBUG */-      mt = nt;-    }-#if THREAD_DEBUG-    if (thread_trace) {-      printf("take_mvar: mvar=%p return %p\n", mv, n);-    }-#endif  /* THREAD_DEBUG */-    return n;                   /* return the data */-  } else {-#if THREAD_DEBUG-    if (thread_trace)-      printf("take_mvar: mvar=%p empty\n", mv);-#endif  /* THREAD_DEBUG */-    /* mvar is empty */-    if (try)-      return NIL;-    struct mthread *mt = remove_q_head(&runq);-    add_q_tail(&mv->mv_takeput, mt);-#if THREAD_DEBUG-    if (thread_trace) {-      printf("take_mvar: mvar=%p suspend %d\n", mv, (int)mt->mt_id);-      dump_q("runq", runq);-      dump_q("takeput", mv->mv_takeput);-    }-#endif  /* THREAD_DEBUG */-    /* Unlink from runq */-    resched(mt, ts_wait_mvar);    /* never returns */-  }-}--NODEPTR-read_mvar(int try, struct mvar *mv)-{-  NODEPTR n;-  if ((n = runq.mq_head->mt_mval) != NIL) {-    /* We have after waking up */-    runq.mq_head->mt_mval = NIL;-    return n;                   /* returned the stashed data */-  }-  if ((n = mv->mv_data) != NIL) {-    /* mvar is full */-    return n;                   /* return the data */-  } else {-    /* mvar is empty */-    if (try)-      return NIL;-#if THREAD_DEBUG-    if (thread_trace) {-      printf("read_mvar: suspend %d\n", (int)runq.mq_head->mt_id);-      dump_q("runq", runq);-    }-#endif  /* THREAD_DEBUG */-    struct mthread *mt = remove_q_head(&runq);-    add_q_tail(&mv->mv_read, mt);-    resched(mt, ts_wait_mvar);                /* never returns */-  }-}--int-put_mvar(int try, struct mvar *mv, NODEPTR v)-{-#if THREAD_DEBUG-  if (thread_trace) {-    printf("put_mvar: mvar=%p\n", mv);-    dump_q("takeput", mv->mv_takeput);-    dump_q("read", mv->mv_read);-  }-#endif  /* THREAD_DEBUG */-  if (mv->mv_data != NIL) {-#if THREAD_DEBUG-    if (thread_trace)-      printf("put_mvar: mvar=%p full\n", mv);-#endif  /* THREAD_DEBUG */-    /* mvar is full */-    if (try)-      return 0;-    struct mthread *mt = remove_q_head(&runq);-    add_q_tail(&mv->mv_takeput, mt); /* put on mvar queue */-#if THREAD_DEBUG-    if (thread_trace) {-      printf("put_mvar: suspend %d\n", (int)mt->mt_id);-      dump_q("runq", runq);-      dump_q("takeput", mv->mv_takeput);-    }-#endif  /* THREAD_DEBUG */-    resched(mt, ts_wait_mvar);                  /* never returns */-  } else {-#if THREAD_DEBUG-    if (thread_trace)-      printf("put_mvar: mvar=%p empty\n", mv);-#endif  /* THREAD_DEBUG */-    /* mvar is empty */-    if (mv->mv_takeput.mq_head || mv->mv_read.mq_head) {-      /* one or more threads are waiting */-      struct mthread *mt;-      if (mv->mv_takeput.mq_head) {-        /* wake up one 'take' */-        mt = remove_q_head(&mv->mv_takeput);-#if THREAD_DEBUG-        if (thread_trace)-          printf("put_mvar: wake-1 %d\n", (int)mt->mt_id);-#endif  /* THREAD_DEBUG */-        add_runq_tail(mt);             /* and schedule for execution later */-        mt->mt_mval = v;-      }-      for (mt = mv->mv_read.mq_head; mt; ) { /* XXX use q primitives */-#if THREAD_DEBUG-        if (thread_trace)-          printf("put_mvar: wake-N %d\n", (int)mt->mt_id);-#endif  /* THREAD_DEBUG */-        mt->mt_mval = v;               /* value for restarted read */-        mt = mt->mt_queue;             /* next waiter */-        add_runq_tail(mt);             /* and schedule for execution later */-      }-#if THREAD_DEBUG-      if (thread_trace)-        dump_q("runq", runq);-#endif  /* THREAD_DEBUG */-      /* return to caller */-    } else {-#if THREAD_DEBUG-      if (thread_trace) {-        printf("put_mvar: mvar=%p no waiters\n", mv);-      }-#endif  /* THREAD_DEBUG */-      /* no threads waiting, so store the value */-      mv->mv_data = v;-      /* return to caller */-    }-  }-  return 1;-}--NORETURN void-thread_delay(uvalue_t usecs)-{-#if !defined(CLOCK_INIT)-  ERR("thread_delay: no clock");-#else-  /* XXX should check if there is already a throw exn */-  struct mthread *mt = remove_q_head(&runq);-  mt->mt_at = CLOCK_GET() + usecs; /* wakeup time */-#if THREAD_DEBUG-  if (thread_trace)-    printf("thread_delay: id=%d usecs=%ld\n", (int)mt->mt_id, (long)usecs);-#endif  /* THREAD_DEBUG */-  /* insert in delayq which is kept sorted in time order */-  struct mthread **tq;-  for (tq = &timeq.mq_head; *tq; tq = &(*tq)->mt_queue) {-    if (mt->mt_at <= (*tq)->mt_at)-      break;-  }-  mt->mt_queue = *tq;           /* forward link */-  *tq = mt;                     /* and put mt in place */-  if (!mt->mt_queue)            /* no forward link */-    timeq.mq_tail = mt;-  resched(mt, ts_wait_time);-#endif  -}--/* Pause execution if something might still happen */-void-pause_exec(void)-{-#if defined(CLOCK_INIT)-  if (timeq.mq_head) {-    struct mthread *mt;-    while (!runq.mq_head && (mt = timeq.mq_head)) {-      /* We are waiting for a delay to expire, so sleep a while */-      CLOCK_T dly = mt->mt_at - CLOCK_GET();-      if (dly > 0) {-        /* usleep() can be unreliable, so sleep shorter than the delay */-        dly /= 4;-        if (dly < 50) dly = 50;-        CLOCK_SLEEP((useconds_t)dly);-      }-      check_timeq();-    }-  } else {-    ERR("deadlock");            /* XXX throw async to main thread */-  }-#else  /* CLOCK_INIT */-  ERR("no clock");-#endif  /* CLOCK_INIT */-}--/* Interrupt a sleeping thread in a throwTo/threadDelay */-void-thread_intr(struct mthread *mt)-{-#if THREAD_DEBUG-  if (thread_trace)-    printf("thread_intr: id=%d state=%d\n", (int)mt->mt_id, mt->mt_state);-#endif  /* THREAD_DEBUG */-  switch(mt->mt_state) {-  case ts_runnable:-    break;                      /* already on runq */-  case ts_wait_mvar:-    if (mt->mt_mask == mask_uninterruptible) /* uninterruptible */-      break;-    /* we don't know which mvar we are waiting on, so look at all of them */-    /* XXX should add a pointer in mthread to the mvar */-    for (struct mvar *mv = all_mvars; mv; mv = mv->mv_next) {-      if (find_and_unlink(&mv->mv_takeput, mt))-          goto found;-      if (find_and_unlink(&mv->mv_read, mt))-          goto found;-    }-    ERR("thread_intr: mvar");-  found:-#if defined(CLOCK_INIT)-    mt->mt_at = -1;             /* don't wait again */-#endif-    add_runq_tail(mt);-    break;-  case ts_wait_time:-#if THREAD_DEBUG-    if (thread_trace) {-      printf("thread_intr: ts_wait_time mask=%d\n", (int)mt->mt_mask);-    }-#endif  /* THREAD_DEBUG */-    if (mt->mt_mask == mask_uninterruptible) /* uninterruptible */-      break;-    /* find thread in timeq */-    if (!find_and_unlink(&timeq, mt))-      ERR("thread_intr: timeq");-    /* XXX should adjust mq_tail */-    add_runq_tail(mt);-    break;-  case ts_finished:-  case ts_died:-    (void)take_mvar(0, mt->mt_exn); /* ignore exception */-    break;-  default:-    ERR("thread_intr");-  }-#if THREAD_DEBUG-  if (thread_trace) {-    printf("thread_intr: done\n");-    dump_q("runq", runq);-  }-#endif  /* THREAD_DEBUG */-}--NORETURN void-raise_exn(NODEPTR exn)-{-  if (cur_handler) {-    /* Pass the exception to the handler */-    cur_handler->hdl_exn = exn;-    longjmp(cur_handler->hdl_buf, 1);-  } else {-    /* No exception handler, jump to the scheduler */-    the_exn = exn;-    longjmp(sched, mt_raise);-  }-}--NORETURN void-raise_rts(enum rts_exn exn) {-  raise_exn(mkInt(exn));-}--/***************** GC ******************/--/* 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));-}--/* Set FREE bit to 1, used to undo marking in GC */-static INLINE void mark_unused(NODEPTR n)-{-  heapoffs_t i = LABEL(n);-#if SANITY-  if (i < heap_start)-    ERR("Unmarking invalid heap address.");-  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;-}--static INLINE NODEPTR-alloc_node(enum node_tag t)-{-  heapoffs_t i = next_scan_index / BITS_PER_WORD;-  int k;                        /* will contain bit pos + 1 */-  heapoffs_t pos;-  NODEPTR n;-  heapoffs_t word;--  /* This can happen if we run out of memory when parsing. */-  if (num_free <= 0)-    ERR("alloc_node");--  for(;;) {-    word = free_map[i];-    if (word)-      break;-    i++;-#if SANITY-    if (i >= free_map_nwords) {-#if 0-      fprintf(stderr, "wordsize=%u, num_free=%u next_scan_index=%u i=%u free_map_nwords=%u\n", (uint)BITS_PER_WORD,-              (uint)num_free, (uint)next_scan_index, (uint)i, (uint)free_map_nwords);-#endif-      ERR("alloc_node: free_map");-    }-#endif-  }-  k = FFS(word);-  pos = i * BITS_PER_WORD + k - 1; /* first free node */-  n = HEAPREF(pos);-  // mark_used(n); // equivalent to:-  free_map[i] = word & (word-1);-  next_scan_index = pos;--  SETTAG(n, t);-  COUNT(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;-}--NODEPTR evali(NODEPTR n);--void-start_exec(NODEPTR root)-{-  struct mthread *mt;--  new_thread(new_ap(root, combWorld)); /* main thread */--  switch(setjmp(sched)) {-  case mt_main:-    break;-  case mt_resched:-    COUNT(num_resched);-    break;-  case mt_raise:-    /* We have an uncaught exception.-     * If it's the main thread, this kills the program.-     * Otherwise, it just kills the thread.-     */-    mt = remove_q_head(&runq);-    if (mt->mt_id == MAIN_THREAD) {-      die_exn(the_exn);-    } else {-#if THREAD_DEBUG-      if (thread_trace) {-        printf("start_exec: mt=%p id=%d died from exn\n", mt, (int)mt->mt_id);-      }-#endif  /* THREAD_DEBUG */-      mt->mt_state = ts_died;-      mt->mt_root = NIL;-    }-  }-#if THREAD_DEBUG-  if (thread_trace) {-    printf("start_exec:\n");-    dump_q("runq", runq);-  }-#endif  /* THREAD_DEBUG */-  for(;;) {-    if (!runq.mq_head)-      pause_exec();-    mt = runq.mq_head;          /* front thread */-    if (!mt)                    /* this should never happen */-      ERR("no threads");--    glob_slice = mt->mt_slice + slice;-#if THREAD_DEBUG-    if (thread_trace)-      printf("start_exec: start %d, slice=%d\n", (int)mt->mt_id, (int)glob_slice);-#endif  /* THREAD_DEBUG */-    num_reductions += glob_slice-1;-    (void)evali(mt->mt_root);         /* run it */-    num_reductions -= glob_slice;-    /* when evali() returns the thread is done */-    (void)remove_q_head(&runq);                      /* remove front thread */--#if THREAD_DEBUG-    if (thread_trace) {-      printf("start_exec: mt=%p id=%d finished\n", mt, (int)mt->mt_id);-    }-#endif  /* THREAD_DEBUG */-    mt->mt_state = ts_finished;-    mt->mt_root = NIL;-    /* XXX mt_mval, mt_thrown */--    if (mt->mt_id == MAIN_THREAD)-      return;                   /* when the main thread dies it's all over */-  }-}--/* 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 {-  const char *name;-  const enum node_tag tag;-  const enum node_tag flipped;        /* What should (C op) reduce to? defaults to T_FREE */-  NODEPTR node;-} primops[] = {-  /* combinators */-  /* sorted by frequency in a typical program */-  { "B", T_B },-  { "O", T_O },-  { "K", T_K, T_A },-  { "C'", T_CC },-  { "C", T_C },-  { "A", T_A, T_K },-  { "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 },-  /*  { "J", T_J },*/-  { "K2", T_K2 },-  { "K3", T_K3 },-  { "K4", T_K4 },-  { "C'B", T_CCB },-/* primops */-  { "+", T_ADD, T_ADD },-  { "-", T_SUB, T_SUBR },-  { "*", T_MUL, T_MUL },-  { "quot", T_QUOT },-  { "rem", T_REM },-  { "uquot", T_UQUOT },-  { "urem", T_UREM },-  { "subtract", T_SUBR, T_SUB },-  { "neg", T_NEG },-  { "and", T_AND, T_AND },-  { "or", T_OR, T_OR },-  { "xor", T_XOR, T_XOR },-  { "inv", T_INV },-  { "shl", T_SHL },-  { "shr", T_SHR },-  { "ashr", T_ASHR },-  { "popcount", T_POPCOUNT },-  { "clz", T_CLZ },-  { "ctz", T_CTZ },-#if WANT_FLOAT-  { "f+" , T_FADD, T_FADD},-  { "f-" , T_FSUB },-  { "f*" , T_FMUL, T_FMUL},-  { "f/", T_FDIV},-  { "fneg", T_FNEG},-  { "itof", T_ITOF},-  { "f==", T_FEQ, T_FEQ},-  { "f/=", T_FNE, T_FNE},-  { "f<", T_FLT, T_FGT},-  { "f<=", T_FLE, T_FGE},-  { "f>", T_FGT, T_FLT},-  { "f>=", T_FGE, T_FLE},-  { "fshow", T_FSHOW},-  { "fread", T_FREAD},-#endif  /* WANT_FLOAT */--  { "bs++", T_BSAPPEND },-  { "bs++.", T_BSAPPENDDOT },-  { "bs==", T_BSEQ, T_BSEQ },-  { "bs/=", T_BSNE, T_BSNE },-  { "bs<", T_BSLT, T_BSGT },-  { "bs<=", T_BSLE, T_BSGE  },-  { "bs>", T_BSGT, T_BSLT },-  { "bs>=", T_BSGE, T_BSLE  },-  { "bscmp", T_BSCMP },-  { "bspack", T_BSPACK },-  { "bsunpack", T_BSUNPACK },-  { "bsreplicate", T_BSREPLICATE },-  { "bslength", T_BSLENGTH },-  { "bssubstr", T_BSSUBSTR },-  { "bsindex", T_BSINDEX },--  { "ord", T_I },-  { "chr", T_I },-  { "==", T_EQ, T_EQ },-  { "/=", T_NE, T_NE },-  { "<", T_LT, T_GT },-  { "u<", T_ULT, T_UGT },-  { "u<=", T_ULE, T_UGE },-  { "u>", T_UGT, T_ULT },-  { "u>=", T_UGE, T_ULE },-  { "<=", T_LE, T_GE },-  { ">", T_GT, T_LT },-  { ">=", T_GE, T_LE },-  { "fp+", T_FPADD },-  { "fp2p", T_FP2P },-  { "fpnew", T_FPNEW },-  { "fpfin", T_FPFIN },-  //  { "fpstr", T_FPSTR },-  { "fp2bs", T_FP2BS },-  { "bs2fp", T_BS2FP },-  { "seq", T_SEQ },-  { "equal", T_EQUAL, T_EQUAL },-  { "sequal", T_EQUAL, T_EQUAL },-  { "compare", T_COMPARE },-  { "scmp", T_COMPARE },-  { "icmp", T_ICMP },-  { "ucmp", T_UCMP },-  { "rnf", T_RNF },-  { "fromUTF8", T_BSFROMUTF8 },-  { "toUTF8", T_BSTOUTF8 },-  { "headUTF8", T_BSHEADUTF8 },-  { "tailUTF8", T_BSTAILUTF8 },-  /* 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.getArgRef", T_IO_GETARGREF },-  { "IO.performIO", T_IO_PERFORMIO },-  { "IO.gc", T_IO_GC },-  { "IO.pp", T_IO_PP },-  { "raise", T_RAISE },-  { "catch", T_CATCH },-  { "catchr", T_CATCHR },-  { "A.alloc", T_ARR_ALLOC },-  { "A.copy", T_ARR_COPY },-  { "A.size", T_ARR_SIZE },-  { "A.read", T_ARR_READ },-  { "A.write", T_ARR_WRITE },-  { "A.==", T_ARR_EQ },-  { "dynsym", T_DYNSYM },-  { "IO.fork", T_IO_FORK },-  { "IO.thid", T_IO_THID },-  { "thnum", T_THNUM },-  { "IO.throwto", T_IO_THROWTO },-  { "IO.yield", T_IO_YIELD },-  { "IO.newmvar", T_IO_NEWMVAR },-  { "IO.takemvar", T_IO_TAKEMVAR },-  { "IO.putmvar", T_IO_PUTMVAR },-  { "IO.readmvar", T_IO_READMVAR },-  { "IO.trytakemvar", T_IO_TRYTAKEMVAR },-  { "IO.tryputmvar", T_IO_TRYPUTMVAR },-  { "IO.tryreadmvar", T_IO_TRYREADMVAR },-  { "IO.threaddelay", T_IO_THREADDELAY },-  { "IO.threadstatus", T_IO_THREADSTATUS },-  { "IO.getmaskingstate", T_IO_GETMASKINGSTATE },-  { "IO.setmaskingstate", T_IO_SETMASKINGSTATE },-  { "newCAStringLen", T_NEWCASTRINGLEN },-  { "packCString", T_PACKCSTRING },-  { "packCStringLen", T_PACKCSTRINGLEN },-  { "toPtr", T_TOPTR },-  { "toInt", T_TOINT },-  { "toDbl", T_TODBL },-  { "toFunPtr", T_TOFUNPTR },-  { "IO.ccall", T_IO_CCALL },-  { "isint", T_ISINT },-  { "binint2", T_BININT2 },-  { "binint1", T_BININT1 },-  { "bindbl2", T_BINDBL2 },-  { "bindbl1", T_BINDBL1 },-  { "binbs2", T_BINBS2 },-  { "binbs1", T_BINBS1 },-  { "unint1", T_UNINT1 },-  { "undbl1", T_UNDBL1 },-};--#if GCRED-enum node_tag flip_ops[T_LAST_TAG+1];-#endif--#if WANT_STDIO-/* Create a dummy foreign pointer for the standard stdio handles. */-/* These handles are never gc():d. */-void-mk_std(NODEPTR n, FILE *f)-{-  struct final *fin = mcalloc(1, sizeof(struct final));-  struct forptr *fp = mcalloc(1, sizeof(struct forptr));-  BFILE *bf = add_utf8(add_FILE(f));-  SETTAG(n, T_FORPTR);-  FORPTR(n) = fp;-  fin->arg = bf;-  fin->back = fp;-  fp->payload.string = bf;-  fp->finalizer = fin;-}-#endif--void-init_nodes(void)-{-  enum node_tag t;-  size_t j;-  NODEPTR n;--  ALLOC_HEAP(heap_size);-  free_map_nwords = (heap_size + BITS_PER_WORD - 1) / BITS_PER_WORD; /* bytes needed for free map */-  free_map = mmalloc(free_map_nwords * sizeof(bits_t));--  /* Set up permanent nodes */-  heap_start = 0;-  for(t = T_FREE; t <= T_LAST_TAG; t++) {-    NODEPTR n = HEAPREF(heap_start++);-    SETTAG(n, t);-    switch (t) {-    case T_K: combK = n; break;-    case T_A: combTrue = n; break;-    case T_I: combUnit = n; break;-    case T_O: combCons = n; break;-    case T_P: combPair = n; break;-    case T_CC: combCC = n; break;-    case T_BB: combBB = n; break;-    case T_B: combB = n; break;-    case T_C: combC = n; break;-    case T_Z: combZ = n; break;-    case T_U: combU = n; break;-    case T_K2: combK2 = n; break;-    case T_K3: combK3 = n; break;-    case T_IO_BIND: combIOBIND = n; break;-    case T_IO_THEN: combIOTHEN = n; break;-    case T_IO_RETURN: combIORETURN = n; break;-    case T_IO_SETMASKINGSTATE: combSETMASKINGSTATE = n; break;-    case T_BININT1: combBININT1 = n; break;-    case T_BININT2: combBININT2 = n; break;-    case T_UNINT1: combUNINT1 = n; break;-    case T_BINDBL1: combBINDBL1 = n; break;-    case T_BINDBL2: combBINDBL2 = n; break;-    case T_UNDBL1: combUNDBL1 = n; break;-    case T_BINBS1: combBINBS1 = n; break;-    case T_BINBS2: combBINBS2 = n; break;-    case T_IO_THROWTO: combTHROWTO = n; break;-    case T_CATCHR: combCATCHR = n; break;-#if WANT_STDIO-    case T_IO_STDIN:  comb_stdin  = n; mk_std(n, stdin);  break;-    case T_IO_STDOUT: comb_stdout = n; mk_std(n, stdout); break;-    case T_IO_STDERR: comb_stderr = n; mk_std(n, stderr); break;-#endif-    default:-      break;-    }-    for (j = sizeof primops / sizeof primops[0]; j-- > 0; ) {-      if (primops[j].tag == t) {-        primops[j].node = n;-      }-      tag_names[primops[j].tag] = primops[j].name;-    }-  }--#if GCRED-  for (j = 0; j < sizeof primops / sizeof primops[0]; j++) {-    flip_ops[primops[j].tag] = primops[j].flipped;-  }-#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 { n = HEAPREF(heap_start++); SETTAG(n, T_AP); FUN(n) = (f); ARG(n) = (a); (c) = n;} while(0)-#define MKINT(c, i) do { n = HEAPREF(heap_start++); SETTAG(n, T_INT); SETVALUE(n, i); (c) = n; } while(0)-  NEWAP(combLT, combZ,     combFalse);  /* Z B */-  NEWAP(combEQ, combFalse, combFalse);  /* K K */-  NEWAP(combGT, combFalse, combTrue);   /* K A */-  {-    /* The displaySomeException compiles to (U (U (K2 A))) */-    NODEPTR x;-    NEWAP(x, combK2, combTrue);        /* (K2 A) */-    NEWAP(x, combU, x);                /* (U (K2 A)) */-    NEWAP(combShowExn, combU, x);      /* (U (U (K2 A))) */-  }-  NEWAP(combJust, combZ, combU);       /* (Z U) */-  MKINT(combWorld, 99999);-  NEWAP(combPairUnit, combPair, combUnit);-#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-counter_t red_a, red_k, red_i, red_int, red_flip, red_bi, red_bxi, red_ccbi, red_cc, red_cci, red_ccbbcp;-#endif-counter_t red_bb, red_k4, red_k3, red_k2, red_ccb, red_z, red_r;--//counter_t mark_depth;-//counter_t max_mark_depth = 0;--void mark(NODEPTR *np);-void mark_mvar(struct mvar *mv);--/* Throwing, e.g., a UserInterrupt exception to the main thread- * it can happen from any thread (the one that happens to poll).- * Throwing an exception can block, so we can't throw it from- * the current thread.  Instead, we spawn a new thread, whose- * only job it is to throw the exception.- */-void-async_throwto(struct mthread *mt, NODEPTR exn)-{-  GCCHECK(4);-  NODEPTR thid = alloc_node(T_THID);-  THR(thid) = mt;-  NODEPTR root = new_ap(new_ap(new_ap(combTHROWTO, thid), exn), combWorld);-  (void)new_thread(root);       /* spawn and put on runq */-}--void-mark_thread(struct mthread *mt)-{-  if (mt->mt_mark)-    return;                     /* already marked */-  mt->mt_mark = 1;-  if (mt->mt_root != NIL)-    mark(&mt->mt_root);-  mark_mvar(mt->mt_exn);         -  if (mt->mt_mval != NIL)-    mark(&mt->mt_mval);-}--void-mark_mvar(struct mvar *mv)-{-  if (mv->mv_mark)-    return;-  mv->mv_mark = 1;-  if (mv->mv_data != NIL)-    mark(&mv->mv_data);-  for (struct mthread *mt = mv->mv_takeput.mq_head; mt; mt = mt->mt_next)-    mark_thread(mt);-  for (struct mthread *mt = mv->mv_read.mq_head; mt; mt = mt->mt_next)-    mark_thread(mt);-}-  -/* Follow indirections */-static INLINE NODEPTR-indir(NODEPTR *np)-{-  NODEPTR n = *np;-  while (GETTAG(n) == T_IND)-    n = GETINDIR(n);-  *np = n;-  return n;-}--/* Mark all used nodes reachable from *np, updating *np. */-void-mark(NODEPTR *np)-{-  stackptr_t stk = stack_ptr;-  NODEPTR n;-  NODEPTR *to_push = 0;         /* silence warning by initializing */-#if GCRED-  value_t val;-#endif-  enum node_tag tag;--  //  mark_depth++;-  //  if (mark_depth % 10000 == 0)-  //    PRINT("mark depth %"PRIcounter"\n", mark_depth);-  top:-  n = *np;-  tag = GETTAG(n);-  if (tag == T_IND) {-#if SANITY-    int loop = 0;-    /* Skip indirections, and redirect start pointer */-    while ((tag = GETTAG(n)) == T_IND) {-      //      PRINT("*"); fflush(stdout);-      n = GETINDIR(n);-      if (loop++ > 10000000) {-        //PRINT("%p %p %p\n", n, GETINDIR(n), GETINDIR(GETINDIR(n)));-        ERR("IND loop");-      }-    }-    //    if (loop)-    //      PRINT("\n");-#else  /* SANITY */-    while ((tag = GETTAG(n)) == T_IND) {-      n = GETINDIR(n);-    }-#endif  /* SANITY */-    *np = n;-  }-  if (n < cells || n > cells + heap_size)-    ERR("bad n");-  if (is_marked_used(n)) {-    goto fin;-  }-  num_marked++;-  mark_used(n);-  switch (tag) {-#if GCRED-#define GCREDIND(x) do { NODEPTR nn = (x); mark(&nn); SETINDIR(n, nn); goto fin; } while(0)-   case T_INT:-#if INTTABLE-    if (LOW_INT <= (val = GETVALUE(n)) && val < HIGH_INT) {-      SETINDIR(n, intTable[val - LOW_INT]);-      COUNT(red_int);-      goto top;-    }-    goto fin;-#endif  /* INTTABLE */-   case T_AP:-      if (want_gc_red) {-        NODEPTR fun = indir(&FUN(n));-        NODEPTR arg = indir(&ARG(n));-        enum node_tag funt = GETTAG(fun);-        enum node_tag argt = GETTAG(arg);-        enum node_tag funfunt = funt == T_AP ? GETTAG(indir(&FUN(fun))) : T_FREE;-        enum node_tag funargt = argt == T_AP ? GETTAG(indir(&FUN(arg))) : T_FREE;--        /* This is really only fruitful just after parsing.  It can be removed. */-        if (funfunt == T_A) {-          /* Do the A x y --> y reduction */-          NODEPTR y = ARG(n);-          COUNT(red_a);-          GCREDIND(y);-        }--        if (funfunt == T_K) {-          /* Do the K x y --> x reduction */-          NODEPTR x = ARG(FUN(n));-          COUNT(red_k);-          GCREDIND(x);-        }--        if (funt == T_I) {-          /* Do the I x --> x reduction */-          NODEPTR x = ARG(n);-          COUNT(red_i);-          GCREDIND(x);-        }--        if(funt == T_CC && argt == T_I) { -          /* C' I --> C */-          SETTAG(n, T_C);-          COUNT(red_cci);-          goto top;-        }--        if(funt == T_CCB && argt == T_AP) {-          NODEPTR funarg = indir(&FUN(arg));-          NODEPTR argarg = indir(&ARG(arg));-          if (GETTAG(argarg) == T_P && GETTAG(funarg) == T_AP) {-            if (GETTAG(indir(&FUN(funarg))) == T_B && GETTAG(indir(&ARG(funarg))) == T_C) { -              /* C'B ((B C) P) --> C */-              SETTAG(n, T_C);-              COUNT(red_ccbbcp);-              goto top;-            }-          }-        }--        if(funt == T_B && argt == T_I) { -          /* B I --> I */-          SETTAG(n, T_I);-          COUNT(red_bi);-          goto top;-        }--        if(funfunt == T_B && argt == T_I) { -          /* B x I --> x */-          NODEPTR x = ARG(FUN(n));-          COUNT(red_bxi);-          GCREDIND(x);-        }--        if(funfunt == T_CCB && argt == T_I) { -          /* C'B x I --> x */-          NODEPTR x = ARG(FUN(n));-          COUNT(red_ccbi);-          GCREDIND(x);-        }--        if(funt == T_C && funargt == T_C) { -          /* C (C x) --> x */-          NODEPTR x = ARG(ARG(n));-          COUNT(red_cc);-          GCREDIND(x);-        }--#if 0-        /* Very rare */-        if (funt == T_S && funargt == T_K) {-          /* S (K x) --> B x */-          printf("SK"); fflush(stdout);-        }-#endif--#if 0-        /* Fairly frequent, but needs allocation */-        if (funfunt == T_B && funargt == T_K) {-          /* B x (K y) --> K x y */-          printf("BxK\n");-        }-#endif--#if 1-        if (funt == T_C) {-          enum node_tag tf;-          if ((tf = flip_ops[argt])) {-            /* Do the C op --> flip_op reduction */-            // PRINT("%s -> %s\n", tag_names[tt], tag_names[tf]);-            COUNT(red_flip);-            GCREDIND(HEAPREF(tf));-          }-        }-#endif-      }-#else   /* GCRED */-   case T_AP:-#endif  /* GCRED */-    /* Avoid tail recursion */-    np = &FUN(n);-    to_push = &ARG(n);-    break;-   case T_ARR:-    {-      struct ioarray *arr = ARR(n);--      // arr->marked records marking progress through arr.-      if (arr->marked >= arr->size) {-        goto fin;-      }-      // We unmark the array as a whole and push it as long-      // as there's more entries to scan.-      mark_unused(n);-      num_marked--;-      to_push = np;-      np = &arr->array[arr->marked++];-      break;-    }--   case T_FORPTR:-     FORPTR(n)->finalizer->marked = 1;-     goto fin;--   case T_THID:-     mark_thread(THR(n));-     break;--   case T_MVAR:-     mark_mvar(MVAR(n));-     break;--   default:-     goto fin;-  }--  if (!is_marked_used(*to_push)) {-    //  mark_depth++;-    PUSH((NODEPTR)to_push);-  }-  goto top;- fin:-  //  if (mark_depth > max_mark_depth) {-  //    max_mark_depth = mark_depth;-  //  }-  //  mark_depth--;-  if (stack_ptr > stk) {-    np = (NODEPTR *)POPTOP();-    goto top;-  }-  return;-}--/* Perform a garbage collection:-   - Mark nodes from the stack-   - Mark permanent arrays-   - Mark threads that have a root-   - Scan and free arrays-   - Scan and free foreign pointers and run finalizers-   - Scan and free threads-   - Scan and free mvars-*/-void-gc(void)-{-  stackptr_t i;--  num_gc++;-  num_marked = 0;-#if WANT_STDIO-  if (verbose > 1)-    PRINT("gc mark\n");-#endif-  gc_mark_time -= GETTIMEMILLI();-  mark_all_free();-  /* Mark everything reachable from the stack */-  for (i = 0; i <= stack_ptr; i++)-    mark(&stack[i]);--  /* Mark everything reachable from permanent array nodes */-  for (struct ioarray *arr = array_root; arr; arr = arr->next) {-    if (arr->permanent) {-      for (i = 0; i < arr->size; i++)-        mark(&arr->array[i]);-    }-  }--  /* Mark everything reachable from the threads.-   * Note, zombie threads have no root so they are not marked.-   */-  for (struct mthread *mt = all_threads; mt; mt = mt->mt_next) {-    if (mt->mt_root != NIL)-      mark_thread(mt);-  }--  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");--  gc_scan_time -= GETTIMEMILLI();-  /* Free unused arrays */-  for (struct ioarray **arrp = &array_root; *arrp; ) {-    struct ioarray *arr = *arrp;-    if (arr->marked || arr->permanent) {-      arr->marked = 0;-      arrp = &arr->next;-    } else {-      *arrp = arr->next;        /* unlink */-      num_arr_free++;-      FREE(arr);                /* and FREE */-    }-  }--  /* Run finalizers on unused foreign pointers. */-  for (struct final **finp = &final_root; *finp; ) {-    struct final *fin = *finp;-    if (fin->marked) {-      fin->marked = 0;-      finp = &fin->next;-    } else {-      /* Unused, run finalizer and free all associated memory */-      if (fin->size == NOSIZE) {-        num_fin_free++;-      } else {-        num_bs_free++;-        num_bs_inuse -= fin->size;-        if (num_bs_alloc - num_bs_free > num_bs_alloc_max)-          num_bs_alloc_max = num_bs_alloc - num_bs_free;-      }-      void (*f)(void *) = (void (*)(void *))fin->final;-      //printf("forptr free fin=%p, f=%p", fin, f);-      //fflush(stdout);-      if (f) {-        //printf("finalizer fin=%p final=%p\n", fin, f);-        (*f)(fin->arg);-      }-      for (struct forptr *p = fin->back; p; ) {-        struct forptr *q = p->next;-        //printf("free fp=%p\n", p);-        //printf(" p=%p desc=%s", p, p->desc ? p->desc : "NONE");-        //fflush(stdout);-        FREE(p);-        //memset(p, 0x55, sizeof *p);-        p = q;-      }-      //printf("\n");-      *finp = fin->next;-      //printf("free fin=%p\n", fin);-      FREE(fin);-      //memset(fin, 0x77, sizeof *fin);-    }-  }--  /* Remove unreferenced zombie threads */-  for (struct mthread **mtp = &all_threads; *mtp; ) {-    struct mthread *mt = *mtp;-    if ((mt->mt_state == ts_died || mt->mt_state == ts_finished) && !mt->mt_mark) {-      COUNT(num_thread_reap);-      *mtp = mt->mt_next;-      free(mt);-    } else {-      mt->mt_mark = 0;-      mtp = &mt->mt_next;-    }-  }-  -  /* Remove unreferences mvars */-  for (struct mvar **mvp = &all_mvars; *mvp; ) {-    struct mvar *mv = *mvp;-    if (!mv->mv_mark) {-      COUNT(num_mvar_free);-      *mvp = mv->mv_next;-      free(mv);-    } else {-      mv->mv_mark = 0;-      mvp = &mv->mv_next;-    }-  }--  gc_scan_time += GETTIMEMILLI();--#if WANT_STDIO-  if (verbose > 1) {-    PRINT("gc done, %"PRIcounter" free\n", num_free);-    /*PRINT(" GC reductions A=%"PRIcounter", K=%"PRIcounter", I=%"PRIcounter", int=%"PRIcounter" flip=%"PRIcounter"\n",-      red_a, red_k, red_i, red_int, red_flip);*/-  }-  if (gcbell) {-    fputc('\007', stderr);      /* ring the bell */-    fflush(stderr);-  }-#endif  /* !WANT_STDIO */--#if 0-  /* For debugging only: mark all free cells */-  for(int n = 0; n < heap_size; n++) {-    NODEPTR p = HEAPREF(n);-    if (!is_marked_used(p)) {-      SETTAG(p, T_FREE);-    }-  }-#endif-}--static INLINE-value_t-peekWord(value_t *p)-{-  return *p;-}--static INLINE-void-pokeWord(value_t *p, value_t w)-{-  *p = w;-}--static INLINE-void *-peekPtr(void **p)-{-  return *p;-}--static INLINE-void-pokePtr(void **p, void *w)-{-  *p = w;-}--static INLINE-uvalue_t-peek_uint8(uint8_t *p)-{-  return *p;-}--static INLINE-void-poke_uint8(uint8_t *p, value_t w)-{-  *p = (uint8_t)w;-}--static INLINE-uvalue_t-peek_uint16(uint16_t *p)-{-  return *p;-}--static INLINE-void-poke_uint16(uint16_t *p, value_t w)-{-  *p = (uint16_t)w;-}--#if WORD_SIZE >= 32-static INLINE-uvalue_t-peek_uint32(uint32_t *p)-{-  return *p;-}--static INLINE-void-poke_uint32(uint32_t *p, value_t w)-{-  *p = (uint32_t)w;-}-#endif  /* WORD_SIZE >= 32 */--#if WORD_SIZE >= 64-static INLINE-uvalue_t-peek_uint64(uint64_t *p)-{-  return *p;-}--static INLINE-void-poke_uint64(uint64_t *p, value_t w)-{-  *p = (uint64_t)w;-}-#endif  /* WORD_SIZE >= 64 */--static INLINE-value_t-peek_int8(int8_t *p)-{-  return *p;-}--static INLINE-void-poke_int8(int8_t *p, value_t w)-{-  *p = (int8_t)w;-}--static INLINE-value_t-peek_int16(int16_t *p)-{-  return *p;-}--static INLINE-void-poke_int16(int16_t *p, value_t w)-{-  *p = (int16_t)w;-}--#if WORD_SIZE >= 32-static INLINE-value_t-peek_int32(int32_t *p)-{-  return *p;-}--static INLINE-void-poke_int32(int32_t *p, value_t w)-{-  *p = (int32_t)w;-}-#endif  /* WORD_SIZE >= 32 */--#if WORD_SIZE >= 64-static INLINE-value_t-peek_int64(int64_t *p)-{-  return *p;-}--static INLINE-void-poke_int64(int64_t *p, value_t w)-{-  *p = (int64_t)w;-}-#endif  /* WORD_SIZE >= 64 */--static INLINE-value_t-peek_int(int *p)-{-  return *p;-}--static INLINE-void-poke_int(int *p, value_t w)-{-  *p = (int)w;-}--static INLINE-value_t-peek_uint(unsigned int *p)-{-  return *p;-}--static INLINE-void-poke_uint(unsigned int *p, value_t w)-{-  *p = (unsigned int)w;-}--static INLINE-value_t-peek_short(short *p)-{-  return *p;-}--static INLINE-void-poke_short(short *p, value_t w)-{-  *p = (short)w;-}--static INLINE-value_t-peek_ushort(unsigned short *p)-{-  return *p;-}--static INLINE-void-poke_ushort(unsigned short *p, value_t w)-{-  *p = (unsigned short)w;-}--static INLINE-value_t-peek_long(long *p)-{-  return *p;-}--static INLINE-void-poke_long(long *p, value_t w)-{-  *p = (long)w;-}--static INLINE-value_t-peek_ulong(unsigned long *p)-{-  return *p;-}--static INLINE-void-poke_ulong(unsigned long *p, value_t w)-{-  *p = (unsigned long)w;-}--static INLINE-value_t-peek_llong(long long *p)-{-  return *p;-}--static INLINE-void-poke_llong(long long *p, value_t w)-{-  *p = (long long)w;-}--static INLINE-value_t-peek_ullong(unsigned long long *p)-{-  return *p;-}--static INLINE-void-poke_ullong(unsigned long long *p, value_t w)-{-  *p = (unsigned long long)w;-}--#if WANT_FLOAT-static INLINE-flt_t-peek_flt(flt_t *p)-{-  return *p;-}--static INLINE-void-poke_flt(flt_t *p, flt_t w)-{-  *p = w;-}-#endif  /* WANT_FLOAT */--/* Look up an FFI function by name */-value_t-lookupFFIname(const char *name)-{-  size_t i;--  for(i = 0; ffi_table[i].ffi_name; i++)-    if (strcmp(ffi_table[i].ffi_name, name) == 0)-      return (value_t)i;-  if (xffi_table) {-    for(i = 0; xffi_table[i].ffi_name; i++)-      if (strcmp(xffi_table[i].ffi_name, name) == 0)-        return (value_t)(i + num_ffi);-  }-  return -1;-}--NODEPTR-ffiNode(const char *buf)-{-  NODEPTR r;-  value_t i = lookupFFIname(buf);-  char *fun;--  if (i < 0) {-    /* lookup failed, generate a node that will dynamically generate an error */-    r = alloc_node(T_BADDYN);-    fun = mmalloc(strlen(buf) + 1);-    strcpy(fun, buf);-    CSTR(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 = getb(f);-  if (c == d) {-    return 1;-  } else {-    ungetb(d, f);-    return 0;-  }-}--/* Get a non-terminating character.  ' ' and '\n' terminates a token. */-int-getNT(BFILE *f)-{-  int c;--  c = getb(f);-  if (c == ' ' || c == '\n') {-    return 0;-  } else {-    return c;-  }-}--value_t-parse_int(BFILE *f)-{-  // Parse using uvalue_t, which wraps on overflow.-  uvalue_t i = 0;-  int neg = 1;-  int c = getb(f);-  if (c == '-') {-    neg = -1;-    c = getb(f);-  }-  for(;;) {-    i = i * 10 + (c - '0');-    c = getb(f);-    if (c < '0' || c > '9') {-      ungetb(c, f);-      break;-    }-  }-  // Multiply by neg without triggering undefined behavior.-  return (value_t)(((uvalue_t)neg) * i);-}--#if WANT_FLOAT-flt_t-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);-}-#endif--struct forptr *mkForPtr(struct bytestring bs);-NODEPTR mkFunPtr(HsFunPtr p);--/* Create a forptr that has a free() finalizer. */-struct forptr *-mkForPtrFree(struct bytestring str)-{-  struct forptr *fp = mkForPtr(str);         /* Create a foreign pointer */-  fp->finalizer->final = (HsFunPtr)FREE;     /* and set the finalizer to just free it */-  return fp;-}--NODEPTR-mkStrNode(struct bytestring str)-{-  NODEPTR n = alloc_node(T_FORPTR);-  struct forptr *fp = mkForPtrFree(str);-  FORPTR(n) = fp;-  fp->finalizer->fptype = FP_BSTR;-  //printf("mkForPtr n=%p fp=%p %d %s payload.string=%p\n", n, fp, (int)FORPTR(n)->payload.size, (char*)FORPTR(n)->payload.string, FORPTR(n)->payload.string);-  return n;-}--/* 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 i;--  for(i = (int)label; ; i++) {-    i %= shared_table_size;-    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. */-  }-}--/* The memory allocated here is never freed.- * This could be fixed by using a forptr and a- * finalizer for read UTF-8 strings.- * Fix this if there is a lot of deserialization.- */-struct bytestring-parse_string(BFILE *f)-{-  struct bytestring bs;-  size_t sz = 20;-  uint8_t *buffer = mmalloc(sz);-  size_t i;-  int c;--  for(i = 0;;) {-    c = getb(f);-    if (c == '"')-      break;-    if (i >= sz - 1) {-      sz *= 2;-      buffer = mrealloc(buffer, sz);-    }-#if 0-    if (c == '\\') {-      buffer[i++] = (uint8_t)parse_int(f);-      if (!gobble(f, '&'))-        ERR("parse string");-    } else {-      buffer[i++] = c;-    }-#else-    /* See src/MicroHs/ExpPrint.hs for how strings are encoded. */-    switch (c) {-    case '\\':-      c = getb(f);-      if (c == '?')-        c = 0x7f;-      else if (c == '_')-        c = 0xff;-      break;-    case '^':-      c = getb(f);-      if (c < 0x40)-        c &= 0x1f;-      else-        c = (c & 0x1f) | 0x80;-      break;-    case '|':-      c = getb(f);-      c |= 0x80;-      break;-    default:-      /* Unencoded */-      ;-    }-    buffer[i++] = c;-#endif-  }-  buffer[i] = 0;                /* add a trailing 0 in case we need a C string */-  buffer = mrealloc(buffer, i + 1);--  bs.size = i;-  bs.string = buffer;-  //printf("parse_string %d %s\n", (int)bs.size, (char*)bs.string);-  return bs;-}--struct forptr *new_mpz(void);--NODEPTR-parse(BFILE *f)-{-  stackptr_t stk = stack_ptr;-  NODEPTR r, x, y;-  NODEPTR *nodep;-  heapoffs_t l;-  value_t i;-  int c;-  size_t j;-  char buf[80];                 /* store names of primitives. */--  for(;;) {-    c = getb(f);-    if (c < 0) ERR("parse EOF");-    switch (c) {-    case ' ':-    case '\n':-      continue;-    }-    if (num_free < 3)-      ERR("out of heap reading code");-    GCCHECK(1);-    switch(c) {-    case '@':-      x = TOP(0);-      y = TOP(1);-      POP(2);-      PUSH(new_ap(y, x));-      break;-    case '}':-      x = TOP(0);-      POP(1);-      if (stack_ptr != stk)-        ERR("parse: stack");-      return x;-#if WANT_GMP-    case '%':-      {-        struct bytestring bs = parse_string(f); /* get all the digits, terminated by " */-        struct forptr *fp = new_mpz();          /* a new mpz */-        mpz_ptr op = fp->payload.string;        /* get actual pointer */-        mpz_set_str(op, bs.string, 10);         /* convert to an mpz */-        free(bs.string);-        r = alloc_node(T_FORPTR);-        FORPTR(r) = fp;-        PUSH(r);-        break;-      }-#endif-    case '&':-#if WANT_FLOAT-      r = mkFlt(parse_double(f));-#else-      while (getNT(f))          /* skip the float constant */-        ;-      r = alloc_node(T_DBL);-      SETVALUE(r, 0);-#endif-      PUSH(r);-      break;-    case '#':-      i = parse_int(f);-      r = mkInt(i);-      PUSH(r);-      break;-    case '[':-      {-        size_t sz;-        struct ioarray *arr;-        size_t i;-        sz = (size_t)parse_int(f);-        if (!gobble(f, ']')) ERR("parse arr 1");-        arr = arr_alloc(sz, NIL);-        for (i = 0; i < sz; i++) {-          arr->array[i] = TOP(sz - i - 1);-        }-        r = alloc_node(T_ARR);-        ARR(r) = arr;-        POP(sz);-        PUSH(r);-        break;-      }-    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_FREE);-        SETINDIR(*nodep, NIL);-      }-      PUSH(*nodep);-      break;-    case ':':-      /* Define a shared expression: :label e */-      l = parse_int(f);  /* The label */-      if (!gobble(f, ' ')) ERR("parse ' '");-      nodep = find_label(l);-      x = TOP(0);-      if (*nodep == NIL) {-        /* not referenced yet, so add a direct reference */-        *nodep = x;-      } else {-        /* Sanity check */-        if (GETTAG(*nodep) != T_IND || GETINDIR(*nodep) != NIL) ERR("shared != NIL");-        SETINDIR(*nodep, x);-      }-      break;-    case '"':-      /* Everything up to the next " is a string.-       * Special characters are encoded as \NNN&,-       * where NNN is the decimal value of the character */-      PUSH(mkStrNode(parse_string(f)));-      break;-#if WANT_TICK-    case '!':-      if (!gobble(f, '"'))-        ERR("parse !");-      i = add_tick_table(parse_string(f));-      r = alloc_node(T_TICK);-      SETVALUE(r, (value_t)i);-      PUSH(r);-      break;-#endif-    case '^':-      /* An FFI name */-      for (j = 0; (buf[j] = getNT(f)); j++)-        ;-      r = ffiNode(buf);-      PUSH(r);-      break;-    case ';':-      /* <name is a C function pointer to name */-      for (j = 0; (buf[j] = getNT(f)); j++)-        ;-      if (strcmp(buf, "0") == 0) {-        PUSH(mkFunPtr((HsFunPtr)0));-      } else if (strcmp(buf, "closeb") == 0) {-        PUSH(mkFunPtr((HsFunPtr)closeb));-      } else {-        ERR1("unknown funptr '%s'", buf);-      }-      break;-    default:-      buf[0] = c;-      /* A primitive, keep getting char's until end */-      for (j = 1; (buf[j] = getNT(f)); j++)-        ;-      /* Look up the primop and use the preallocated node. */-      for (j = 0; j < sizeof primops / sizeof primops[0]; j++) {-        if (strcmp(primops[j].name, buf) == 0) {-          r = primops[j].node;-          goto found;-        }-      }-      ERR1("no primop %s", buf);-    found:-      PUSH(r);-      break;-    }-  }-}--void-checkversion(BFILE *f)-{-  char *p = VERSION;-  int c;--  while ((c = *p++)) {-    if (c != getb(f))-      ERR("version mismatch");-  }-  (void)gobble(f, '\r');                 /* allow extra CR */-}--/* Parse a file */-NODEPTR-parse_top(BFILE *f)-{-  heapoffs_t numLabels, i;-  NODEPTR n;-  checkversion(f);-  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 = mmalloc(shared_table_size * sizeof(struct shared_entry));-  for(i = 0; i < shared_table_size; i++)-    shared_table[i].node = NIL;-  n = parse(f);-  FREE(shared_table);-  return n;-}--#if WANT_STDIO-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 */-  BFILE *p = add_FILE(f);-  NODEPTR n = parse_top(p);-  *psize = ftell(f);-  closeb(p);-  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- */-struct print_bits {-  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;-}--size_t strNodes(size_t len);-NODEPTR mkStringC(char *str);--#if WANT_STDIO-#if WORD_SIZE == 64-#define CONVDBL "%.16g"-#elif WORD_SIZE == 32-#define CONVDBL "%.8g"-#endif-void-convdbl(char *str, flt_t x)-{-  /* Using 16 decimals will lose some precision.-   * 17 would keep the precision, but it frequently looks very ugly.-   */-  (void)snprintf(str, 25, CONVDBL, x);-  if (strcmp(str, "nan") != 0 && strcmp(str, "-nan") != 0 &&-      strcmp(str, "inf") != 0 && strcmp(str, "-inf") != 0 &&-      !strchr(str, '.') && !strchr(str, 'e') && !strchr(str, 'E')) {-    /* There is no decimal point and no exponent, so add a decimal point */-    strcat(str, ".0");-  }-}--NODEPTR-dblToString(flt_t x)-{-  char str[30];-  convdbl(str, x);-  // turn it into a mhs string-  GCCHECK(strNodes(strlen(str)));-  return mkStringC(str);-}--void-putdblb(flt_t x, BFILE *p)-{-  char str[30];-  convdbl(str, x);-  putsb(str, p);-}--void printrec(BFILE *f, struct print_bits *pb, NODEPTR n, int prefix);--/* Mark all reachable nodes, when a marked node is reached, mark it as shared. */-void-find_sharing(struct print_bits *pb, NODEPTR n)-{- top:-  while (GETTAG(n) == T_IND) {-    n = GETINDIR(n);-  }-  if (n < cells || n >= cells + heap_size) abort();-  //PRINT("find_sharing %p %llu ", n, LABEL(n));-  tag_t tag = GETTAG(n);-  if (tag == T_AP || tag == T_ARR || tag == T_FORPTR) {-    if (test_bit(pb->shared_bits, n)) {-      /* Alread marked as shared */-      //PRINT("shared\n");-      ;-    } else if (test_bit(pb->marked_bits, n)) {-      /* Already marked, so now mark as shared */-      //PRINT("marked\n");-      set_bit(pb->shared_bits, n);-      num_shared++;-    } else {-      /* Mark as visited, and recurse */-      //PRINT("unmarked\n");-      set_bit(pb->marked_bits, n);-      switch(tag) {-      case T_AP:-        find_sharing(pb, FUN(n));-        n = ARG(n);-        goto top;-      case T_ARR:-        for(size_t i = 0; i < ARR(n)->size; i++) {-          find_sharing(pb, ARR(n)->array[i]);-        }-        break;-      default:-        break;-      }-    }-  } else {-    /* Not an sharable node, so do nothing */-    //PRINT("not T_AP\n");-    ;-  }-}--void-print_string(BFILE *f, struct bytestring bs)-{-  uint8_t *str = bs.string;-  putb('"', f);-  for (size_t i = 0; i < bs.size; i++) {-    int c = str[i];-#if 0-    if (c == '"' || c == '\\' || c < ' ' || c > '~') {-      putb('\\', f);-      putdecb(c, f);-      putb('&', f);-    } else {-      putb(c, f);-    }-#else-    if (c < 0 || c > 0xff)-      ERR("print_string");-    if (c < 0x20) {-      putb('^', f); putb(c + 0x20, f);-    } else if (c == '"' || c == '^' || c == '|' || c == '\\') {-      putb('\\', f); putb(c, f);-    } else if (c < 0x7f) {-      putb(c, f);-    } else if (c == 0x7f) {-      putb('\\', f); putb('?', f);-    } else if (c < 0xa0) {-      putb('^', f); putb(c - 0x80 + 0x40, f);-    } else if (c < 0xff) {-      putb('|', f); putb(c - 0x80, f);-    } else {                    /* must be< c == 0xff */-      putb('\\', f); putb('_', f);-    }-#endif-  }-  putb('"', f);-}--/*- * Recursively print an expression.- * This assumes that the shared nodes has been marked as such.- * The prefix flag is used to get a readable dump.- */-void-printrec(BFILE *f, struct print_bits *pb, NODEPTR n, int prefix)-{-  int share = 0;-  enum node_tag tag;-  char prbuf[30];--  while (GETTAG(n) == T_IND) {-    /*putb('*', f);*/-    n = GETINDIR(n);-  }--  if (test_bit(pb->shared_bits, n)) {-    /* The node is shared */-    if (test_bit(pb->marked_bits, n)) {-      /* Not yet printed, so emit a label */-      if (prefix) {-        putb(':', f);-        putdecb((value_t)LABEL(n), f);-        putb(' ', f);-      } else {-        share = 1;-      }-      clear_bit(pb->marked_bits, n);  /* mark as printed */-    } else {-      /* This node has already been printed, so just use a reference. */-      putb('_', f);-      putdecb((value_t)LABEL(n), f);-      if (!prefix)-        putb(' ', f);-      return;-    }-  }--  //if (n == atptr) putb('@', f);-  tag = GETTAG(n);-  switch (tag) {-  case T_AP:-    if (prefix) {-      putb('(', f);-      printrec(f, pb, FUN(n), prefix);-      putb(' ', f);-      printrec(f, pb, ARG(n), prefix);-      putb(')', f);-    } else {-      printrec(f, pb, FUN(n), prefix);-      printrec(f, pb, ARG(n), prefix);-      putb('@', f);-    }-    break;-  case T_INT: putb('#', f); putdecb(GETVALUE(n), f); break;-  case T_DBL: putb('&', f); putdblb(GETDBLVALUE(n), f); break;-  case T_ARR:-    if (prefix) {-      /* Arrays serialize as '[sz] e_1 ... e_sz' */-      putb('[', f);-      putdecb((value_t)ARR(n)->size, f);-      putb(']', f);-      for(size_t i = 0; i < ARR(n)->size; i++) {-        putb(' ', f);-        printrec(f, pb, ARR(n)->array[i], prefix);-      }-    } else {-      /* Arrays serialize as 'e_1 ... e_sz [sz]' */-      for(size_t i = 0; i < ARR(n)->size; i++) {-        printrec(f, pb, ARR(n)->array[i], prefix);-      }-      putb('[', f);-      putdecb((value_t)ARR(n)->size, f);-      putb(']', f);-    }-    break;-  case T_PTR:-    if (prefix) {-      snprintf(prbuf, sizeof prbuf, "PTR<%p>",PTR(n));-      putsb(prbuf, f);-    } else {-      ERR("Cannot serialize pointers");-    }-    break;-  case T_FUNPTR:-    /* There are a few function pointers that happen without user FFI.-     * We need to be able to serialize these.-     * XXX Make a table if we need more.-     */-    if (FUNPTR(n) == 0) {-      putsb(";0 ", f);-    } else if (FUNPTR(n) == (HsFunPtr)closeb) {-      putsb(";closeb ", f);-    } else if (prefix) {-      snprintf(prbuf, sizeof prbuf, "FUNPTR<%p>",FUNPTR(n));-      putsb(prbuf, f);-    } else {-      ERR1("Cannot serialize function pointers %p", FUNPTR(n));-    }-    break;-  case T_THID:-    if (prefix) {-      snprintf(prbuf, sizeof prbuf, "FUNPTR<%d>",(int)THR(n)->mt_id);-    } else {-      ERR("cannot serialize ThreadId yet");-    }-  case T_FORPTR:-    if (n == comb_stdin)-      putsb("IO.stdin", f);-    else if (n == comb_stdout)-      putsb("IO.stdout", f);-    else if (n == comb_stderr)-      putsb("IO.stderr", f);-#if WANT_GMP-    else if (FORPTR(n)->finalizer->fptype == FP_MPZ) {-      /* Serialize as %99999" */-      mpz_ptr op = FORPTR(n)->payload.string; /* get the mpz */-      int sz = mpz_sizeinbase(op, 10);        /* maximum length */-      char *s = mmalloc(sz + 2);-      (void)mpz_get_str(s, 10, op);           /* convert to a string */-      putsb("%", f);-      putsb(s, f);-      putsb("\"", f);                         /* so we can use parse_string */-      free(s);-    }-#endif  /* WANT_GMP */-    else if (FORPTR(n)->finalizer->fptype == FP_BSTR) {-      print_string(f, FORPTR(n)->payload);-    } else if (prefix) {-      snprintf(prbuf, sizeof prbuf, "FORPTR<%p>",FORPTR(n));-      putsb(prbuf, f);-    } else {-      ERR("Cannot serialize foreign pointers");-    }-    break;-  case T_IO_CCALL: putb('^', f); putsb(FFI_IX(GETVALUE(n)).ffi_name, f); break;-  case T_BADDYN: putb('^', f); putsb(CSTR(n), f); break;-  case T_TICK:-    putb('!', f);-    print_string(f, tick_table[GETVALUE(n)].tick_name);-    break;-  default:-    if (0 <= tag && tag <= T_LAST_TAG)-      if (tag_names[tag])-        putsb(tag_names[tag], f);-      else {-        snprintf(prbuf, sizeof prbuf, "TAG=%d", (int)tag);-        putsb(prbuf, f);-      }-    else {-      snprintf(prbuf, sizeof prbuf, "BADTAG(%d)", (int)tag);-      putsb(prbuf, f);-    }-    break;-  }-  if (!prefix) {-    if (GETTAG(n) != T_AP)-      putb(' ', f);-    if (share) {-      putb(':', f);-      putdecb((value_t)LABEL(n), f);-      putb(' ', f);-    }-  }-}--/* Serialize a graph to file. */-void-printb(BFILE *f, NODEPTR n, int header)-{-  struct print_bits pb;-  num_shared = 0;-  pb.marked_bits = mcalloc(free_map_nwords, sizeof(bits_t));-  pb.shared_bits = mcalloc(free_map_nwords, sizeof(bits_t));-  find_sharing(&pb, n);-  if (header) {-    putsb(VERSION, f);-    putdecb(num_shared, f);-    putb('\n', f);-  }-  printrec(f, &pb, n, !header);-  if (header) {-    putb('}', f);-  }-  FREE(pb.marked_bits);-  FREE(pb.shared_bits);-}--/* Show a graph. */-void-pps(NODEPTR n)-{-  pp(stdout, n);-}--void-pp(FILE *f, NODEPTR n)-{-  BFILE *bf = add_FILE(f);-  printb(bf, n, 0);-  putb('\n', bf);-  freeb_file(bf);-}--#if 0-void-ppmsg(const char *msg, NODEPTR n)-{-  printf("%s", msg);-  pp(stdout, n);-  printf("\n");-}--void-dump(const char *msg, NODEPTR at)-{-  atptr = at;-  printf("dump: %s\n", msg);-  pp(stdout, *topnode);-}-#endif--#else  /* WANT_STDIO */-NODEPTR-dblToString(flt_t x)-{-  return mkStringC("no dblToString");-}--#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-mkFlt(flt_t 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;-}--NODEPTR-mkFunPtr(void (*p)(void))-{-  NODEPTR n;-  n = alloc_node(T_FUNPTR);-  FUNPTR(n) = p;-  return n;-}--struct forptr*-mkForPtr(struct bytestring bs)-{-  struct final *fin = mcalloc(1, sizeof(struct final));-  struct forptr *fp = mcalloc(1, sizeof(struct forptr));-  if (bs.size == NOSIZE) {-    num_fin_alloc++;-  } else {-    num_bs_alloc++;-    num_bs_inuse += bs.size;-    num_bs_bytes += bs.size;-    if (num_bs_inuse > num_bs_inuse_max)-      num_bs_inuse_max = num_bs_inuse;-  }-  //printf("mkForPtr p=%p fin=%p fp=%p\n", p, fin, fp);-  fin->next = final_root;-  final_root = fin;-  fin->final = 0;-  fin->arg = bs.string;-  fin->size = bs.size;          /* The size is not really needed */-  fin->back = fp;-  fin->marked = 0;-  fp->next = 0;-  fp->payload = bs;-  fp->finalizer = fin;-  //  fp->desc = 0;-  return fp;-}--struct forptr*-mkForPtrP(void *p)-{-  struct bytestring bs = { NOSIZE, p };-  return mkForPtr(bs);-}--struct forptr*-addForPtr(struct forptr *ofp, int s)-{-  struct forptr *fp = mmalloc(sizeof(struct forptr));-  struct final *fin = ofp->finalizer;--  fp->next = ofp;-  fin->back = fp;-  if (ofp->payload.size != NOSIZE)-    fp->payload.size = ofp->payload.size - s;-  fp->payload.string = (uint8_t*)ofp->payload.string + s;-  fp->finalizer = fin;-  return fp;-}--struct forptr*-bssubstr(struct forptr *fp, value_t offs, value_t len)-{-  struct forptr *res = addForPtr(fp, offs);-  res->payload.size = len;-  return res;-}--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.- * Does NOT do UTF decoding.- */-NODEPTR-mkString(struct bytestring bs)-{-  NODEPTR n, nc;-  size_t i;-  const unsigned char *str = bs.string; /* no sign bits, please */--  n = mkNil();-  for(i = bs.size; i > 0; i--) {-    nc = mkInt(str[i-1]);-    n = mkCons(nc, n);-  }-  return n;-}--NODEPTR-mkStringC(char *str)-{-  struct bytestring bs = { strlen(str), str };-  return mkString(bs);-}--NODEPTR-mkStringU(struct bytestring bs)-{-  BFILE *ubuf = add_utf8(openb_rd_buf(bs.string, bs.size));-  NODEPTR n, *np, nc;--  //printf("mkStringU %d %s\n", (int)bs.size, (char*)bs.string);--  n = mkNil();-  np = &n;-  for(;;) {-    int c = getb(ubuf);-    if (c < 0)-      break;-    nc = mkInt(c);-    *np = mkCons(nc, *np);-    np = &ARG(*np);-  }-  closeb(ubuf);-  return n;-}--NODEPTR-bsunpack(struct bytestring bs)-{-  NODEPTR n, *np, nc;-  size_t i;--  n = mkNil();-  np = &n;-  for(i = 0; i < bs.size; i++) {-    nc = mkInt(((uint8_t *)bs.string)[i]);-    *np = mkCons(nc, *np);-    np = &ARG(*np);-  }-  return n;-}--/* XXX This should somehow be merged with other utf8 decoders */-value_t-headutf8(struct bytestring bs, void **ret)-{-  uint8_t *p = bs.string;-  if (bs.size == 0)-    ERR("headUTF8 0");-  int c1 = *p++;-  if ((c1 & 0x80) == 0) {-    if (ret)-      *ret = p;-    return c1;-  }-  if (bs.size == 1)-    ERR("headUTF8 1");-  int c2 = *p++;-  if ((c1 & 0xe0) == 0xc0) {-    if (ret)-      *ret = p;-    return ((c1 & 0x1f) << 6) | (c2 & 0x3f);-  }-  if (bs.size == 2)-    ERR("headUTF8 2");-  int c3 = *p++;-  if ((c1 & 0xf0) == 0xe0) {-    if (ret)-      *ret = p;-    return ((c1 & 0x0f) << 12) | ((c2 & 0x3f) << 6) | (c3 & 0x3f);-  }-  if (bs.size == 3)-    ERR("headUTF8 3");-  int c4 = *p++;-  if ((c1 & 0xf8) == 0xf0) {-    if (ret)-      *ret = p;-    return ((c1 & 0x07) << 18) | ((c2 & 0x3f) << 12) | ((c3 & 0x3f) << 6) | (c4 & 0x3f);-  }-  ERR("headUTF8 4");-}--/* 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 Flt_T */-static INLINE flt_t-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 to a T_FUNPTR */-HsFunPtr-evalfunptr(NODEPTR n)-{-  n = evali(n);-#if SANITY-  if (GETTAG(n) != T_FUNPTR) {-    ERR1("evalfunptr, bad tag %d", GETTAG(n));-  }-#endif-  return FUNPTR(n);-}--/* Evaluate to a T_FORPTR */-struct forptr *-evalforptr(NODEPTR n)-{-  n = evali(n);-#if SANITY-  if (GETTAG(n) != T_FORPTR) {-    ERR1("evalforptr, bad tag %d", GETTAG(n));-  }-#endif-  return FORPTR(n);-}--/* Evaluate to a bytestring */-struct forptr *-evalbstr(NODEPTR n)-{-  n = evali(n);-#if SANITY-  if (GETTAG(n) != T_FORPTR || FORPTR(n)->finalizer->fptype != FP_BSTR) {-    ERR1("evalbstr, bad tag %d", GETTAG(n));-  }-#endif-  return FORPTR(n);-}--/* Evaluate to a T_THID */-struct mthread *-evalthid(NODEPTR n)-{-  n = evali(n);-#if SANITY-  if (GETTAG(n) != T_THID) {-    ERR1("evalthid, bad tag %d", GETTAG(n));-  }-#endif-  return THR(n);-}--/* Evaluate to a T_MVAR */-struct mvar *-evalmvar(NODEPTR n)-{-  n = evali(n);-#if SANITY-  if (GETTAG(n) != T_MVAR) {-    ERR1("evalmvar, bad tag %d", GETTAG(n));-  }-#endif-  return MVAR(n);-}--/* Evaluate a string, returns a newly allocated buffer.- * XXX this is cheating, should use continuations.- * XXX the malloc()ed string is leaked if we yield in here.- * Caller is responsible to free().- * Does UTF-8 encoding.- */-struct bytestring-evalstring(NODEPTR n)-{-  size_t sz = 100;-  char *buf = mmalloc(sz);-  size_t offs;-  uvalue_t c;-  NODEPTR x;-  struct bytestring bs;--  for (offs = 0;;) {-    if (offs >= sz - 4) {-      sz *= 2;-      buf = mrealloc(buf, sz);-    }-    PUSH(n);                    /* protect the list from GC */-    n = evali(n);-    POP(1);-    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 */-      PUSH(n);                  /* protect from GC */-      c = evalint(ARG(x));-      n = POPTOP();-      if ((c & 0x1ff800) == 0xd800) {-        // c is a surrogate-        c = 0xfffd; // replacement character-      }-      if (c < 0x80) {-        buf[offs++] = (char)c;-      } else if (c < 0x800) {-        buf[offs++] = ((c >> 6 )       ) | 0xc0;-        buf[offs++] = ((c      ) & 0x3f) | 0x80;-      } else if (c < 0x10000) {-        buf[offs++] = ((c >> 12)       ) | 0xe0;-        buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;-        buf[offs++] = ((c      ) & 0x3f) | 0x80;-      } else if (c < 0x110000) {-        buf[offs++] = ((c >> 18)       ) | 0xf0;-        buf[offs++] = ((c >> 12) & 0x3f) | 0x80;-        buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;-        buf[offs++] = ((c      ) & 0x3f) | 0x80;-      } else {-	ERR("invalid char");-      }-      n = ARG(n);-    } else {-      ERR("evalstring not Nil/Cons");-    }-  }-  buf[offs] = 0;                /* in case we use it as a C string */-  bs.size = offs;-  bs.string = buf;-  return bs;-}--/* Does not do UTF-8 encoding */-struct bytestring-evalbytestring(NODEPTR n)-{-  size_t sz = 100;-  uint8_t *buf = mmalloc(sz);-  size_t offs;-  uvalue_t c;-  NODEPTR x;-  struct bytestring bs;--  for (offs = 0;;) {-    if (offs >= sz - 1) {-      sz *= 2;-      buf = mrealloc(buf, sz);-    }-    PUSH(n);                    /* protect list from GC */-    n = evali(n);-    POP(1);-    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 */-      PUSH(n);                  /* protect from GC */-      c = evalint(ARG(x));-      n = POPTOP();-      buf[offs++] = c;-      n = ARG(n);-    } else {-      //pp(stdout, n);-      ERR("evalbytestring not Nil/Cons");-    }-  }-  buf[offs] = 0;                /* in case we use it as a C string */-  bs.size = offs;-  bs.string = buf;-  return bs;-}--struct bytestring-bsreplicate(size_t size, uint8_t value)-{-  struct bytestring bs;-  bs.size = size;-  bs.string = mmalloc(size);-  memset(bs.string, value, size);-  return bs;-}--struct bytestring-bsappend(struct bytestring p, struct bytestring q)-{-  struct bytestring r;-  r.size = p.size + q.size;-  r.string = mmalloc(r.size);-  memcpy(r.string, p.string, p.size);-  memcpy((uint8_t *)r.string + p.size, q.string, q.size);-  return r;-}--struct bytestring-bsappenddot(struct bytestring p, struct bytestring q)-{-  struct bytestring r;-  r.size = p.size + q.size + 1;-  r.string = mmalloc(r.size);-  memcpy(r.string, p.string, p.size);-  memcpy((uint8_t *)r.string + p.size, ".", 1);-  memcpy((uint8_t *)r.string + p.size + 1, q.string, q.size);-  return r;-}--/*- * Compare bytestrings.- * We can't use memcmp() directly for two reasons:- *  - the two strings can have different lengths- *  - the return value is only guaranteed to be ==0 or !=0- */-int-bscompare(struct bytestring bsp, struct bytestring bsq)-{-  uint8_t *p = bsp.string;-  uint8_t *q = bsq.string;-  size_t len = bsp.size < bsq.size ? bsp.size : bsq.size;-  while (len--) {-    int r = (int)*p++ - (int)*q++;-    if (r) {-      /* Unequal bytes found. */-      if (r < 0)-        return -1;-      if (r > 0)-        return 1;-      return 0;-    }-  }-  /* Got to the end of the shorter string. */-  /* The shorter string is considered smaller. */-  if (bsp.size < bsq.size)-    return -1;-  if (bsp.size > bsq.size)-    return 1;-  return 0;-}--/* Compares anything, but really only works well on strings.- * if p < q  return -1- * if p > q  return 1- * if p == q return 0- *- * As we compare we update the argument pointers with any- * progress we make, in case we are interruped and resume from the top.- *- * XXX This is a rather dodgy comparison, since we are comparing- * functions, and the same data type could plausibly get different- * functions in the Scott encoding.- * But we only use it for lists, and it seems to work fine.- */-int-compare(NODEPTR cmp)-{-  stackptr_t stk = stack_ptr;-#define CRET(x) do { stack_ptr = stk; return (x); } while(0)-  value_t x, y;-  flt_t xd, yd;-  void *f, *g;-  void (*ff)(void), (*fg)(void);-  NODEPTR p, q;-  NODEPTR *ap, *aq;-  enum node_tag ptag, qtag;-  int r;--  /* Since FUN(cmp) can be shared, allocate a copy for it. */-  GCCHECK(1);-  FUN(cmp) = new_ap(FUN(FUN(cmp)), ARG(FUN(cmp)));-  aq = &ARG(cmp);-  ap = &ARG(FUN(cmp));--  PUSH(*ap);-  PUSH(*aq);-  for(;;) {-    if (stk == stack_ptr)-      return 0;-    q = evali(TOP(0));-    p = evali(TOP(1));-    POP(2);-    if (stk == stack_ptr) {-      /* We have made some progress, save this in the compare node. */-      *ap = p;-      *aq = q;-    }--    ptag = GETTAG(p);-    qtag = GETTAG(q);-    if (ptag != qtag) {-      /* Hack to make Nil < Cons */-      if (ptag == T_K && qtag == T_AP)-        CRET(-1);-      if (ptag == T_AP && qtag == T_K)-        CRET(1);-      CRET(ptag < qtag ? -1 : 1);-    }-    switch (ptag) {-    case T_AP:-      PUSH(ARG(p));             /* compare arg part later */-      PUSH(ARG(q));-      PUSH(FUN(p));             /* compare fun part now */-      PUSH(FUN(q));-      break;-    case T_INT:-    case T_IO_CCALL:-    case T_THID:-      x = GETVALUE(p);-      y = GETVALUE(q);-      if (x < y)-        CRET(-1);-      if (x > y)-        CRET(1);-      break;-    case T_DBL:-      xd = GETDBLVALUE(p);-      yd = GETDBLVALUE(q);-      if (xd < yd)-        CRET(-1);-      if (xd > yd)-        CRET(1);-      break;-    case T_PTR:-      f = PTR(p);-      g = PTR(q);-      if (f < g)-        CRET(-1);-      if (f > g)-        CRET(1);-      break;-    case T_FUNPTR:-      ff = FUNPTR(p);-      fg = FUNPTR(q);-      if ((intptr_t)ff < (intptr_t)fg)-        CRET(-1);-      if ((intptr_t)ff > (intptr_t)fg)-        CRET(1);-      break;-    case T_FORPTR:-      {-      struct forptr *fp = FORPTR(p);-      struct forptr *fq = FORPTR(q);-#if WANT_GMP-      if (fp->finalizer->fptype == FP_MPZ && fq->finalizer->fptype == FP_MPZ) {-        int i = mpz_cmp(fp->payload.string, fq->payload.string);-        if (i < 0)-          CRET(-1);-        if (i > 0)-          CRET(1);-      } else-#endif-      if (fp->finalizer->fptype == FP_BSTR && fq->finalizer->fptype == FP_BSTR) {-        r = bscompare(BSTR(p), BSTR(q));-        if (r)-          CRET(r);-      } else {-        f = fp->payload.string;-        g = fq->payload.string;-        if (f < g)-          CRET(-1);-        if (f > g)-          CRET(1);-      }-      }-      break;-    case T_ARR:-      if (ARR(p) < ARR(q))-        CRET(-1);-      if (ARR(p) > ARR(q))-        CRET(1);-      break;-    default:-      break;-    }-  }-#undef CRET-}--void-rnf_rec(bits_t *done, NODEPTR n)-{- top:-  if (test_bit(done, n))-    return;-  set_bit(done, n);-  n = evali(n);-  if (GETTAG(n) == T_AP) {-    PUSH(ARG(n));               /* protect from GC */-    rnf_rec(done, FUN(n));-    n = POPTOP();-    goto top;-  }-}--void-rnf(value_t noerr, NODEPTR n)-{-  /* Mark visited nodes to avoid getting stuck in loops. */-  bits_t *done = mcalloc(free_map_nwords, sizeof(bits_t));-  if (doing_rnf)-    ERR("recursive rnf()");-  doing_rnf = (int)noerr;-  rnf_rec(done, n);-  doing_rnf = 0;-  FREE(done);-}--/* Evaluate a node, returns when the node is in WHNF. */-NODEPTR-evali(NODEPTR an)-{-  NODEPTR n = an;-  stackptr_t stk = stack_ptr;-  NODEPTR x, y, z, w;-  value_t xi, yi, r;-  struct forptr *xfp;-#if WANT_FLOAT-  flt_t xd, rd;-#endif  /* WANT_FLOAT */-  char *msg;-  heapoffs_t l;-  enum node_tag tag;-  struct ioarray *arr;-  struct bytestring xbs, ybs, rbs;-#if WANT_STDIO-  void *bfile;-  int hdr;-#endif  /* WANT_STDIO */--#if MAXSTACKDEPTH-  counter_t old_cur_c_stack = cur_c_stack;-  if (++cur_c_stack > max_c_stack)-    max_c_stack = cur_c_stack;-#endif--/* Reset stack pointer and return. */-#define RET do { goto ret; } while(0)-#define HASNARGS(n) (stack_ptr - stk >= (n))-/* Check that there are at least n arguments, return if not. */-#define CHECK(n) do { if (!HASNARGS(n)) RET; } while(0)--#define SETIND(n, x) SETINDIR(n, x)-#define GOIND(x) do { NODEPTR _x = (x); SETIND(n, _x); n = _x; goto top; } while(0)-#define GOAP(f,a) do { FUN(n) = (f); ARG(n) = (a); goto ap; } while(0)-#define GOAP2(f,a,b) do { FUN(n) = new_ap((f), (a)); ARG(n) = (b); goto ap2; } while(0)-#define GOPAIR(a) do { FUN(n) = new_ap(combPair, (a)); goto ap; } while(0)-#define GOPAIRUNIT do { FUN(n) = combPairUnit; 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)-#define CHKARG5 do { CHECK(5); POP(5); n = TOP(-1); /*v = ARG(n);*/ w = ARG(TOP(-2)); z = ARG(TOP(-3)); y = ARG(TOP(-4)); x = ARG(TOP(-5)); } while(0)-/* Non-popping versions */-#define CHKARG1NP do { CHECK(1); n = TOP(0);                                               x = ARG(n);      } while(0)-#define CHKARG2NP do { CHECK(2); n = TOP(1);                              y = ARG(n);      x = ARG(TOP(0)); } while(0)-#define CHKARG3NP do { CHECK(3); n = TOP(2);             z = ARG(n);      y = ARG(TOP(1)); x = ARG(TOP(0)); } while(0)-#define CHKARG4NP do { CHECK(4); n = TOP(3); w = ARG(n); z = ARG(TOP(2)); y = ARG(TOP(1)); x = ARG(TOP(0)); } 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 SETPTR(n,r)    do { SETTAG((n), T_PTR); PTR(n) = (r); } while(0)-#define SETFUNPTR(n,r) do { SETTAG((n), T_FUNPTR); FUNPTR(n) = (r); } while(0)-#define SETFORPTR(n,r) do { SETTAG((n), T_FORPTR); FORPTR(n) = (r); } while(0)-#define SETBSTR(n,r)   do { SETTAG((n), T_FORPTR); FORPTR(n) = (r); FORPTR(n)->finalizer->fptype = FP_BSTR; } while(0)-#define OPINT1(e)      do { CHECK(1); xi = evalint(ARG(TOP(0)));                            e; POP(1); n = TOP(-1); } while(0);-#define OPPTR2(e)      do { CHECK(2); xp = evalptr(ARG(TOP(0))); yp = evalptr(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);-#define CMPP(op)       do { OPPTR2(r = xp op yp); GOIND(r ? combTrue : combFalse); } while(0)-- top:-  /*pp(stdout, an);*/-  if (--glob_slice <= 0)-    yield();-  l = LABEL(n);-  if (l < T_IO_STDIN) {-    /* The node is one of the permanent nodes; the address offset is the tag */-    tag = l;-  } else {-    /* Heap allocated node */-    if (ISINDIR(n)) {-      /* Follow indirections */-      NODEPTR on = n;-      do {-        n = GETINDIR(n);-      } while(ISINDIR(n));-      SETINDIR(on, n);          /* and short-circuit them */-    }-    tag = GETTAG(n);-  }-  //COUNT(num_reductions);-  //printf("%s %d\n", tag_names[tag], (int)stack_ptr);-  //if (stack_ptr < -1)-  //  ERR("stack_ptr");-  switch (tag) {-  ap2:         PUSH(n); n = FUN(n);-  ap:-  case T_AP:   PUSH(n);-    n = FUN(n); goto top;--  case T_INT:    RET;-  case T_DBL:    RET;-  case T_PTR:    RET;-  case T_FUNPTR: RET;-  case T_FORPTR: RET;-  case T_ARR:    RET;-  case T_THID:   RET;-  case T_MVAR:   RET;-  case T_BADDYN: ERR1("FFI unknown %s", CSTR(n));--  /*-   * Some of these reductions, (e.g., Z x y = K (x y)) are there to avoid-   * that increase in arity that some "optimizations" in Abstract.hs-   * stop reductions from happening.  This can be important for "full laziness".-   * In practice, these reductions almost never happen, but there they are anyway. :)-   */-  case T_S:    GCCHECK(2); CHKARG3; GOAP2(x, z, new_ap(y, z));                            /* S x y z = x z (y z) */-  case T_SS:   GCCHECK(3); CHKARG4; GOAP2(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:   if (!HASNARGS(4)) {-               GCCHECK(1); CHKARG2; COUNT(red_bb); GOAP(combB, new_ap(x, y)); } else {    /* B' x y = B (x y) */-               GCCHECK(2); CHKARG4; GOAP2(x, y, new_ap(z, w)); }                          /* B' x y z w = x y (z w) */-  case T_Z:    if (!HASNARGS(3)) {-               GCCHECK(1); CHKARG2; COUNT(red_z); GOAP(combK, new_ap(x, y)); } else {     /* Z x y = K (x y) */-                           CHKARG3; GOAP(x, y); }                                         /* Z x y z = x y */-//case T_J:                CHKARG3; GOAP(z, x);                                           /* J x y z = z x */-  t_c:-  case T_C:    GCCHECK(1); CHKARG3; GOAP2(x, z, y);                                       /* C x y z = x z y */-  case T_CC:   GCCHECK(2); CHKARG4; GOAP2(x, new_ap(y, w), z);                            /* C' x y z w = x (y w) z */-  t_p:-  case T_P:    GCCHECK(1); CHKARG3; GOAP2(z, x, y);                                       /* P x y z = z x y */-  case T_R:    if(!HASNARGS(3)) {-               GCCHECK(1); CHKARG2; COUNT(red_r); GOAP2(combC, y, x); } else {            /* R x y = C y x */-               GCCHECK(1); CHKARG3; GOAP2(y, z, x); }                                     /* R x y z = y z x */-  case T_O:    GCCHECK(1); CHKARG4; GOAP2(w, x, y);                                       /* O x y z w = w x y */-  case T_K2:   if (!HASNARGS(3)) {-                           CHKARG2; COUNT(red_k2); GOAP(combK, x); } else {               /* K2 x y = K x */-                           CHKARG3; GOIND(x); }                                           /* K2 x y z = *x */-  case T_K3:   if (!HASNARGS(4)) {-                           CHKARG2; COUNT(red_k3); GOAP(combK2, x); } else {              /* K3 x y = K2 x */-                           CHKARG4; GOIND(x); }                                           /* K3 x y z w = *x */-  case T_K4:   if (!HASNARGS(5)) {-                           CHKARG2; COUNT(red_k4); GOAP(combK3, x); } else {              /* K4 x y = K3 x */-                           CHKARG5; GOIND(x); }                                           /* K4 x y z w v = *x */-  case T_CCB:  if (!HASNARGS(4)) {-               GCCHECK(2); CHKARG3; COUNT(red_ccb); GOAP2(combB, new_ap(x, z), y);} else{ /* C'B x y z = B (x z) y */-               GCCHECK(2); CHKARG4; GOAP2(x, z, new_ap(y, w)); }                          /* C'B x y z w = x z (y w) */--    /*-     * Strict primitives require evaluating the arguments before we can proceed.-     * The easiest way to do this is to just recursively call evali() for each argument.-     * The drawback of this is that it uses a lot of C stack.  (E.g., recompiling MicroHs-     * uses a stack depth of 1800).-     * Instead we use the following scheme:-     *  When we find a strict binary (int) primitive we push T_BININT2,-     *  set n=second argument.-     *  Continue evaluation of n.-     *  When n is finally evaluated and we are about to return we check if the stack top is T_BININT2.-     *  If so, change the stack top to T_BININT1,-     *  set n=first argument.-     *  Continue evaluation of n.-     *  When n is finally evaluated and we are about to return we check if the stack top is T_BININT1.-     *  If so, we know that both arguments are now evaluated, and we perform the strict operation.-     *-     * On my desktop machine this is about 3% slower, on my laptop (Apple M1) it is about 3% faster.-     *-     * Pictorially for BININT-     *  Before the code below:-     *  -----     *  | --------> @-     *  ----       / \-     *  | ------> @   y-     *  ----     / \-     *  n ----> ADD x-     *-     * After-     *  -----     *  | --------> @-     *  ----       / \-     *  | ------> @   y-     *  ----     / \-     *  | ->BI2 ADD x-     *  ----        ^-     *  n ----------|-     *-     *  x becomes an INT, stack is not empty, BININT2 found on top-     *  -----     *  | --------> @-     *  ----       / \-     *  | ------> @   y-     *  ----     / \-     *  | ->BI2 ADD INT-     *  ----        ^-     *  n ----------|-     *-     *  After-     *  -----     *  | --------> @-     *  ----       / \-     *  | ------> @   y-     *  ----     / \    \-     *  | ->BI1 ADD INT  |-     *  ----             |-     *  n ---------------|-     *-     *  y becomes an INT, stack is not empty, BININT1 found on top-     *  do arithmetic-     *  -----     *  | --------> @-     *  ----       / \-     *  | ------> @   INT-     *  ----     / \    \-     *  | ->BI1 ADD INT  |-     *  ----             |-     *  n ---------------|-     *-     *  -----     *  n -------> INT(x+y)-     */-  case T_ADD:-  case T_SUB:-  case T_MUL:-  case T_QUOT:-  case T_REM:-  case T_SUBR:-  case T_UQUOT:-  case T_UREM:-  case T_AND:-  case T_OR:-  case T_XOR:-  case T_SHL:-  case T_SHR:-  case T_ASHR:-  case T_EQ:-  case T_NE:-  case T_LT:-  case T_LE:-  case T_GT:-  case T_GE:-  case T_ICMP:-  case T_ULT:-  case T_ULE:-  case T_UGT:-  case T_UGE:-  case T_UCMP:-    CHECK(2);-    n = ARG(TOP(1));-    if (GETTAG(n) == T_INT) {-      n = ARG(TOP(0));-      PUSH(combBININT1);-      if (GETTAG(n) == T_INT)-        goto binint1;-    } else {-      PUSH(combBININT2);-    }-    goto top;-  case T_NEG:-  case T_INV:-  case T_POPCOUNT:-  case T_CLZ:-  case T_CTZ:-    CHECK(1);-    n = ARG(TOP(0));-    PUSH(combUNINT1);-    goto top;--#if WANT_FLOAT-  case T_FADD:-  case T_FSUB:-  case T_FMUL:-  case T_FDIV:-  case T_FEQ:-  case T_FNE:-  case T_FLT:-  case T_FLE:-  case T_FGT:-  case T_FGE:-    CHECK(2);-    n = ARG(TOP(1));-    PUSH(combBINDBL2);-    goto top;-  case T_FNEG:-    CHECK(1);-    n = ARG(TOP(0));-    PUSH(combUNDBL1);-    goto top;--  case T_ITOF: OPINT1(rd = (flt_t)xi); SETDBL(n, rd); RET;-  case T_FREAD:-    CHECK(1);-    msg = evalstring(ARG(TOP(0))).string;-#if WORD_SIZE == 64-    xd = strtod(msg, NULL);-#elif WORD_SIZE == 32-    xd = strtof(msg, NULL);-#else  /* WORD_SIZE */-#error Unknown WORD_SIZE-#endif  /* WORD_SIZE */-    FREE(msg);-    POP(1);-    n = TOP(-1);-    SETDBL(n, xd);-    RET;--  case T_FSHOW:-    CHECK(1);-    xd = evaldbl(ARG(TOP(0)));-    POP(1);-    n = TOP(-1);-    GOIND(dblToString(xd));-#endif  /* WANT_FLOAT */--  case T_ISINT:-    CHECK(1);-    x = evali(ARG(TOP(0)));-    POP(1);-    n = TOP(-1);-    SETINT(n, GETTAG(x) == T_INT ? GETVALUE(x) : -1);-    RET;--  case T_BSAPPEND:-  case T_BSAPPENDDOT:-  case T_BSEQ:-  case T_BSNE:-  case T_BSLT:-  case T_BSLE:-  case T_BSGT:-  case T_BSGE:-  case T_BSCMP:-    CHECK(2);-    n = ARG(TOP(1));-    PUSH(combBINBS2);-    goto top;--  /* Retag a word sized value, keeping the value bits */-#define CONV(t) do { CHECK(1); x = evali(ARG(TOP(0))); n = POPTOP(); SETTAG(n, t); SETVALUE(n, GETVALUE(x)); RET; } while(0)-  case T_TODBL: CONV(T_DBL);-  case T_TOINT: CONV(T_INT);-  case T_TOPTR: CONV(T_PTR);-  case T_TOFUNPTR: CONV(T_FUNPTR);-#undef CONV--  case T_FPADD: CHECK(2); xfp = evalforptr(ARG(TOP(0))); yi = evalint(ARG(TOP(1))); POP(2); n = TOP(-1); SETFORPTR(n, addForPtr(xfp, yi)); RET;-  case T_FP2P:-    CHECK(1);-    xfp = evalforptr(ARG(TOP(0)));-    POP(1);-    n = TOP(-1);-    SETPTR(n, xfp->payload.string);-    RET;--  case T_FP2BS:-    CHECK(2);-    xfp = evalforptr(ARG(TOP(0)));-    xi = evalint(ARG(TOP(1)));-    POP(2);-    n = TOP(-1);-    xfp->payload.size = xi;-    SETBSTR(n, xfp);-    RET;--  case T_BS2FP:-    CHECK(1);-    xfp = evalbstr(ARG(TOP(0)));-    POP(1);-    n = TOP(-1);-    SETFORPTR(n, xfp);-    RET;--  case T_ARR_EQ:-    {-      CHECK(2);-      x = evali(ARG(TOP(0)));-      arr = ARR(x);-      y = evali(ARG(TOP(1)));-      POP(2);-      n = TOP(-1);-      GOIND(arr == ARR(y) ? combTrue : combFalse);-    }--  case T_BSTOUTF8:-    {-      CHECK(1);-      n = ARG(TOP(0));-      /* Zap the pointer to the list so it can be GC:ed.-       * The actual list is protected from GC by evalbytestring().-       */-      // ARG(TOP(0)) = combK;-      struct bytestring bs = evalstring(n);-      POP(1);-      n = TOP(-1);-      SETBSTR(n, mkForPtrFree(bs));-      RET;-    }--  case T_BSHEADUTF8:-    CHECK(1);-    xfp = evalbstr(ARG(TOP(0)));-    POP(1);-    n = TOP(-1);-    SETINT(n, headutf8(xfp->payload, (void**)0));-    RET;--  case T_BSTAILUTF8:-    CHECK(1);-    xfp = evalbstr(ARG(TOP(0)));-    POP(1);-    n = TOP(-1);-    { void *out;-      (void)headutf8(xfp->payload, &out);           /* skip one UTF8 character */-      xi = (char*)out - (char*)xfp->payload.string; /* offset */-      yi = xfp->payload.size - xi;                  /* remaining length */-      SETBSTR(n, bssubstr(xfp, xi, yi));            /* make a substring */-    }-    RET;--  case T_BSFROMUTF8:-    if (doing_rnf) RET;-    CHECK(1);--    xfp = evalbstr(ARG(TOP(0)));-    GCCHECK(strNodes(xfp->payload.size));-    POP(1);-    n = TOP(-1);-    //printf("T_FROMUTF8 x = %p fp=%p payload.string=%p\n", x, x->uarg.uuforptr, x->uarg.uuforptr->payload.string);-    GOIND(mkStringU(xfp->payload));--  case T_BSUNPACK:-    if (doing_rnf) RET;-    CHECK(1);-    struct forptr *xfp = evalbstr(ARG(TOP(0)));-    GCCHECK(strNodes(xfp->payload.size));-    POP(1);-    n = TOP(-1);-    GOIND(bsunpack(xfp->payload));--  case T_BSPACK:-    CHECK(1);-    n = ARG(TOP(0));-    /* Zap the pointer to the list so it can be GC:ed.-     * The actual list is protected from GC by evalbytestring().-     */-    ARG(TOP(0)) = combK;-    struct bytestring rbs = evalbytestring(n);-    POP(1);-    n = TOP(-1);-    SETBSTR(n, mkForPtrFree(rbs));-    RET;--  case T_BSREPLICATE:-    CHECK(2);-    xi = evalint(ARG(TOP(0)));-    yi = evalint(ARG(TOP(1)));-    POP(2);-    n = TOP(-1);-    SETBSTR(n, mkForPtrFree(bsreplicate(xi, yi)));-    RET;--  case T_BSLENGTH:-    CHECK(1);-    xfp = evalbstr(ARG(TOP(0)));-    POP(1);-    n = TOP(-1);-    SETINT(n, xfp->payload.size);-    RET;--  case T_BSSUBSTR:-    CHECK(3);-    xfp = evalbstr(ARG(TOP(0)));-    xi = evalint(ARG(TOP(1)));-    yi = evalint(ARG(TOP(2)));-    POP(3);-    n = TOP(-1);-    SETBSTR(n, bssubstr(xfp, xi, yi));-    RET;--  case T_BSINDEX:-    CHECK(2);-    xfp = evalbstr(ARG(TOP(0)));-    xi = evalint(ARG(TOP(1)));-    POP(2);-    n = TOP(-1);-    SETINT(n, ((uint8_t *)xfp->payload.string)[xi]);-    RET;--  case T_RAISE:-    if (doing_rnf) RET;-    CHKARG1;-    raise_exn(x);               /* never returns */-    --  case T_SEQ:  CHECK(2); evali(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(TOP(1)); POP(2); n = TOP(-1); GOIND(r==0 ? combTrue : combFalse);-  case T_COMPARE:-    CHECK(2); r = compare(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:-    GCCHECK(2);-    if (doing_rnf) RET;-    CHKARG1;-    /* Conjure up a new world and evaluate the io with that world, finally selecting the result */-    /* PERFORMIO io  -->  io World K */-    GOAP2(x, combWorld, combK);--  case T_IO_BIND:-    goto t_c;-  case T_IO_RETURN:-    goto t_p;-  case T_IO_THEN:-    GCCHECK(2); CHKARG2; GOAP2(combIOBIND, x, new_ap(combK, y));-#if WANT_STDIO-  case T_IO_PP:-    CHKARG2;-    pp(stderr, x);-    GOPAIRUNIT;-  case T_IO_PRINT:-    hdr = 0;-    goto ser;-  case T_IO_SERIALIZE:-    hdr = 1;-  ser:-#if 0-    gc();                     /* DUBIOUS: do a GC to get possible GC reductions */-#endif-    CHKARG3NP;-    bfile = (struct BFILE*)evalptr(x);-    printb(bfile, evali(y), hdr);-    putb('\n', bfile);-    POP(3);-    GOPAIRUNIT;-  case T_IO_DESERIALIZE:-    CHKARG2NP;-    bfile = (struct BFILE*)evalptr(x);-    gc();                     /* make sure we have room.  GC during parse is dodgy. */-    x = parse_top(bfile);-    POP(2);-    GOPAIR(x);                /* allocates a cell, but we did a GC above */-#endif-#if WANT_ARGS-  case T_IO_GETARGREF:-    GCCHECK(2);-    CHKARG1;-    x = alloc_node(T_ARR);-    ARR(x) = argarray;-    GOPAIR(x);-#endif-  case T_IO_CCALL:-    {-      GCCHECK(1);                 /* room for placeholder */-      int a = (int)GETVALUE(n);   /* function number */-      int arity = FFI_IX(a).ffi_arity;-      CHECK(arity);-      funptr_t f = FFI_IX(a).ffi_fun;-      PUSH(mkFlt(0.0));           /* placeholder for result, protected from GC */-      int k = f(stk);             /* call FFI function, return number of arguments */-      if (k != arity) {-#if WANT_STDIO-        fprintf(stderr, "ccall arity %s %d!=%d\n", FFI_IX(a).ffi_name, arity, k);-#endif-        ERR("ccall arity");     /* temporary sanity check */-      }-      GCCHECK(1);                 /* room for pair */-      x = POPTOP();               /* pop actual result */-      POP(arity);                 /* pop the pushed arguments */-      if (stack_ptr < 0)-        ERR("CCALL POP");-      n = POPTOP();               /* node to update */-      GOPAIR(x);                  /* and this is the result */-    }--  case T_NEWCASTRINGLEN:-    {-      CHKARG2NP;                /* set x,y,n */-      struct bytestring bs = evalbytestring(x);-      GCCHECK(5);-      NODEPTR cs = alloc_node(T_PTR);-      PTR(cs) = bs.string;-      NODEPTR res = new_ap(new_ap(combPair, cs), mkInt(bs.size));-      POP(2);-      GOPAIR(res);-    }-  case T_PACKCSTRING:-    {-      CHKARG2NP;                  /* sets x, y, n */-      char *cstr = evalptr(x);-      size_t size = strlen(cstr);-      char *str = mmalloc(size);-      memcpy(str, cstr, size);-      struct bytestring bs = { size, str };-      NODEPTR res = mkStrNode(bs);-      GCCHECKSAVE(res, 1);-      POP(2);-      GOPAIR(res);-    }-  case T_PACKCSTRINGLEN:-    {-      CHKARG3NP;                /* sets x,y,z,n */-      char *cstr = evalptr(x);-      size_t size = evalint(y);-      char *str = mmalloc(size);-      memcpy(str, cstr, size);-      struct bytestring bs = { size, str };-      NODEPTR res = mkStrNode(bs);-      POP(3);-      GCCHECKSAVE(res, 1);-      GOPAIR(res);-    }--  case T_ARR_ALLOC:-    {-      CHKARG3NP;                /* sets x,y,z,n */-      size_t size = evalint(x);-      struct ioarray *arr = arr_alloc(size, y);-      GCCHECK(2);-      NODEPTR res = alloc_node(T_ARR);-      ARR(res) = arr;-      POP(3);-      GOPAIR(res);-    }-  case T_ARR_COPY:-    {-      CHKARG2NP;-      NODEPTR a = evali(x);-      if (GETTAG(a) != T_ARR)-        ERR("T_ARR_COPY tag");-      struct ioarray *arr = arr_copy(ARR(a));-      GCCHECK(2);-      NODEPTR res = alloc_node(T_ARR);-      ARR(res) = arr;-      POP(2);-      GOPAIR(res);-    }-  case T_ARR_SIZE:-    {-      CHKARG2NP;-      NODEPTR a = evali(x);-      if (GETTAG(a) != T_ARR)-        ERR("bad ARR tag");-      GCCHECK(2);-      NODEPTR res = mkInt(ARR(a)->size);-      POP(2);-      GOPAIR(res);-    }-  case T_ARR_READ:-    {-      CHKARG3NP;                /* sets x,y,n */-      size_t i = evalint(y);-      NODEPTR a = evali(x);-      if (GETTAG(a) != T_ARR)-        ERR("bad ARR tag");-      if (i >= ARR(a)->size)-        ERR("ARR_READ");-      GCCHECK(1);-      NODEPTR res = ARR(a)->array[i];-      POP(3);-      GOPAIR(res);-    }-  case T_ARR_WRITE:-    {-      CHKARG4NP;                /* sets x,y,z,n */-      size_t i = evalint(y);-      NODEPTR a = evali(x);-      if (GETTAG(a) != T_ARR)-        ERR("bad ARR tag");-      if (i >= ARR(a)->size) {-        ERR("ARR_WRITE");-      }-      ARR(a)->array[i] = z;-      POP(4);-      GOPAIRUNIT;-      }--  case T_FPNEW:-    {-      CHKARG2NP;-      //printf("T_FPNEW\n");-      void *xp = evalptr(x);-      //printf("T_FPNEW xp=%p\n", xp);-      GCCHECK(2);-      NODEPTR res = alloc_node(T_FORPTR);-      SETFORPTR(res, mkForPtrP(xp));-      POP(2);-      GOPAIR(res);-    }-  case T_FPFIN:-    {-      CHKARG3NP;-      //printf("T_FPFIN\n");-      struct forptr *xfp = evalforptr(y);-      //printf("T_FPFIN xfp=%p\n", xfp);-      HsFunPtr xp = evalfunptr(x);-      //printf("T_FPFIN yp=%p\n", yp);-      xfp->finalizer->final = xp;-      POP(3);-      GOPAIRUNIT;-    }-  case T_IO_GC:-    //printf("gc()\n");-    CHKARG1;-    gc();-    GOPAIRUNIT;--  case T_IO_FORK:-    {-      GCCHECK(3);-      CHKARG2;                /* set x=io, y=ST, n */-      struct mthread *mt = new_thread(new_ap(x, y)); /* copy the world */-      mt->mt_mask = runq.mq_head->mt_mask; /* inherit masking state */-      NODEPTR res = alloc_node(T_THID);-      THR(res) = mt;-      GOPAIR(res);-    }--  case T_IO_THID:-    {-      GCCHECK(2);-      CHKARG1;-      NODEPTR res = alloc_node(T_THID);-      THR(res) = runq.mq_head;            /* head of the run queue is the current thread */-      GOPAIR(res);-    }-  case T_IO_THROWTO:-    {-      CHKARG3NP;                /* x=this, y=exn, z=ST */-      struct mthread *mt = evalthid(x);-      throwto(mt, y);-      POP(3);-      GOPAIRUNIT;-    }-  case T_IO_YIELD:-    CHKARG1;-    yield();-    GOPAIRUNIT;--  case T_IO_NEWMVAR:-    {-      GCCHECK(2);-      CHKARG1;-      struct mvar *mv = new_mvar();-      NODEPTR res = alloc_node(T_MVAR);-      MVAR(res) = mv;-      GOPAIR(res);-    }-  case T_IO_TAKEMVAR:-    {-      CHKARG2NP;             /* set x=mvar, y=ST */-      check_thrown();        /* check if we have a thrown exception */-      NODEPTR res = take_mvar(0, evalmvar(x));         /* never returns if it blocks */-      GCCHECKSAVE(res, 1);-      POP(2);-      GOPAIR(res);-    }-  case T_IO_READMVAR:-    {-      CHKARG2NP;-      check_thrown();           /* check if we have a thrown exception */-      NODEPTR res = read_mvar(0, evalmvar(x));         /* never returns if it blocks */-      GCCHECKSAVE(res, 1);-      POP(2);-      GOPAIR(res);-    }-  case T_IO_PUTMVAR:-    {-      CHKARG3NP;             /* set x=mvar, y=value, z=ST */-      check_thrown();        /* check if we have a thrown exception */-      (void)put_mvar(0, evalmvar(x), y); /* never returns if it blocks */-      POP(3);-      GOPAIRUNIT;-    }-  case T_IO_TRYTAKEMVAR:-    {-      CHKARG2NP;-      NODEPTR res = take_mvar(1, evalmvar(x));-      GCCHECKSAVE(res, 2);-      if (res != NIL)-        res = new_ap(combJust, res);-      else-        res = combNothing;-      POP(2);-      GOPAIR(res);-    }-  case T_IO_TRYREADMVAR:-    {-      CHKARG2NP;-      NODEPTR res = read_mvar(1, evalmvar(x));-      if (res != NIL) {-        GCCHECKSAVE(res, 2);-        res = new_ap(combJust, res);-      } else {-        res = combNothing;-      }-      POP(2);-      GOPAIR(res);-    }-  case T_IO_TRYPUTMVAR:-    {-      CHKARG3NP;-      NODEPTR res = put_mvar(1, evalmvar(x), y) ? combTrue : combFalse;-      GCCHECKSAVE(res, 1);-      POP(3);-      GOPAIR(res);-    }-  case T_IO_THREADDELAY:-    {-      CHKARG2NP;-#if defined(CLOCK_INIT)-      check_thrown();           /* check if we have a thrown exception */-      if (runq.mq_head->mt_at == -1) {-        /* delay has already expired, so just return */-        runq.mq_head->mt_at = 0;-        POP(2);-        GOPAIRUNIT;-      } else {-        thread_delay(evalint(x)); /* never returns */-      }-#else-      ERR("threadDelay: no clock");-#endif-    }-  case T_IO_THREADSTATUS:-    {-      CHKARG2NP;-      struct mthread *mt = evalthid(x);-      GCCHECK(2);-      POP(2);-      GOPAIR(mkInt(mt->mt_state));-    }-  case T_IO_GETMASKINGSTATE:-    CHKARG1;                    /* x = ST */-    GOPAIR(mkInt(runq.mq_head->mt_mask));--  case T_IO_SETMASKINGSTATE:-    CHKARG2;                    /* x = level, y = ST */-    runq.mq_head->mt_mask = evalint(x);-    GOPAIRUNIT;--  case T_CATCH:-    /* CATCH x y z --> CATCHR (x z) y z */-    GCCHECK(3);-    CHKARG3;                    /* x=io, y=hdl, z=ST */-    GOAP(new_ap(new_ap(combCATCHR, new_ap(x, z)), y), z);-  case T_CATCHR:-    {-      CHKARG3NP;                /* x = (io st), y = hdl, z = st, n = (CATCHR (io st)) h */-      struct handler *h = mmalloc(sizeof *h);-      h->hdl_old = cur_handler;-      cur_handler = h;-      stackptr_t ostack = stack_ptr;;    /* old stack pointer */-      enum mask_state omask = runq.mq_head->mt_mask;     /* old mask */-      if (setjmp(h->hdl_buf)) {-        /* An exception occurred: */-        stack_ptr = ostack;-        runq.mq_head->mt_mask = mask_interruptible; /* evaluate with mask */-        NODEPTR exn = h->hdl_exn;       /* exception value */-        cur_handler = h->hdl_old;       /* reset handler */-        FREE(h);-        GCCHECK(8);-        POP(3);-        /*-         * Run:-         *  hdl exn `primBind` \ r ->-         *  primSetMaskingState omask `primThen`-         *  primReturn r-         * i.e.,-         *  primBind (hdl exn) (B' primThen (primSetMaskingState omask) primReturn)-         */-        NODEPTR p = new_ap(combIOBIND, new_ap(y, exn));-        NODEPTR q = new_ap(new_ap(new_ap(combBB, combIOTHEN), new_ap(combSETMASKINGSTATE, mkInt(omask))), combIORETURN);-        GOAP2(p, q, z);-      } else {-        /* Normal execution: */-        x = evali(x);             /* execute first argument */-        /* No exception occurred */-        cur_handler = h->hdl_old; /* restore old handler */-        FREE(h);-        POP(3);-        GOIND(x);-      }-    }--  case T_THNUM:-    {-    CHECK(1);-    struct mthread *mt = evalthid(ARG(TOP(0)));-    POP(1);-    n = TOP(-1);-    SETINT(n, (uvalue_t)mt->mt_id);-    RET;-    }--  case T_DYNSYM:-    /* A dynamic FFI lookup */-    CHECK(1);-    msg = evalstring(ARG(TOP(0))).string;-    GCCHECK(1);-    x = ffiNode(msg);-    FREE(msg);-    POP(1);-    n = TOP(-1);-    GOIND(x);--#if WANT_TICK-  case T_TICK:-    xi = GETVALUE(n);-    CHKARG1;-    dotick(xi);-    GOIND(x);-#endif--  default:-    ERR1("eval tag %s", tag_names[GETTAG(n)]);-  }--- ret:-  if (stack_ptr != stk) {-    // In this case, n was an AP that got pushed and potentially-    // updated.-    uvalue_t xu, yu, ru;-#if WANT_FLOAT-    flt_t xd, yd, rd;-#endif  /* WANT_FLOAT */-    NODEPTR p;--    tag = GETTAG(TOP(0));-    switch (tag) {-    case T_BININT2:-      n = ARG(TOP(1));-      TOP(0) = combBININT1;-      goto top;--    case T_BININT1:-      /* First argument */-#if SANITY-      if (GETTAG(n) != T_INT)-        ERR("BININT 0");-#endif  /* SANITY */-    binint1:-      xu = (uvalue_t)GETVALUE(n);-      /* Second argument */-      y = ARG(TOP(2));-      while (GETTAG(y) == T_IND)-        y = GETINDIR(y);-#if SANITY-      if (GETTAG(y) != T_INT)-        ERR("BININT 1");-#endif  /* SANITY */-      yu = (uvalue_t)GETVALUE(y);-      p = FUN(TOP(1));-      POP(3);-      n = TOP(-1);-    binint:-      switch (GETTAG(p)) {-      case T_IND:   p = GETINDIR(p); goto binint;-      case T_ADD:   ru = xu + yu; break;-      case T_SUB:   ru = xu - yu; break;-      case T_MUL:   ru = xu * yu; break;-      case T_SUBR:  ru = yu - xu; break;-      case T_QUOT:  if (yu == 0)-                      raise_rts(exn_dividebyzero);-                    else-                      ru = (uvalue_t)((value_t)xu / (value_t)yu);-                    break;-      case T_REM:   if (yu == 0)-                      raise_rts(exn_dividebyzero);-                    else-                      ru = (uvalue_t)((value_t)xu % (value_t)yu);-                    break;-      case T_UQUOT: if (yu == 0)-                      raise_rts(exn_dividebyzero);-                    else-                      ru = xu / yu;-                    break;-      case T_UREM:  if (yu == 0)-                      raise_rts(exn_dividebyzero);-                    else-                      ru = xu % yu;-                    break;-      case T_AND:   ru = xu & yu; break;-      case T_OR:    ru = xu | yu; break;-      case T_XOR:   ru = xu ^ yu; break;-      case T_SHL:   ru = xu << yu; break;-      case T_SHR:   ru = xu >> yu; break;-      case T_ASHR:  ru = (uvalue_t)((value_t)xu >> yu); break;--      case T_EQ:    GOIND(xu == yu ? combTrue : combFalse);-      case T_NE:    GOIND(xu != yu ? combTrue : combFalse);-      case T_ULT:   GOIND(xu <  yu ? combTrue : combFalse);-      case T_ULE:   GOIND(xu <= yu ? combTrue : combFalse);-      case T_UGT:   GOIND(xu >  yu ? combTrue : combFalse);-      case T_UGE:   GOIND(xu >= yu ? combTrue : combFalse);-      case T_UCMP:  GOIND(xu <  yu ? combLT   : xu > yu ? combGT : combEQ);-      case T_LT:    GOIND((value_t)xu <  (value_t)yu ? combTrue : combFalse);-      case T_LE:    GOIND((value_t)xu <= (value_t)yu ? combTrue : combFalse);-      case T_GT:    GOIND((value_t)xu >  (value_t)yu ? combTrue : combFalse);-      case T_GE:    GOIND((value_t)xu >= (value_t)yu ? combTrue : combFalse);-      case T_ICMP:  GOIND((value_t)xu <  (value_t)yu ? combLT   : (value_t)xu > (value_t)yu ? combGT : combEQ);--      default:-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));-        ERR("BININT");-      }-      SETINT(n, (value_t)ru);-      goto ret;--    case T_UNINT1:-      /* The argument */-#if SANITY-      if (GETTAG(n) != T_INT)-        ERR("UNINT 0");-#endif-      xu = (uvalue_t)GETVALUE(n);-      p = FUN(TOP(1));-      POP(2);-      n = TOP(-1);-    unint:-      switch (GETTAG(p)) {-      case T_IND:      p = GETINDIR(p); goto unint;-      case T_NEG:      ru = -xu; break;-      case T_INV:      ru = ~xu; break;-      case T_POPCOUNT: ru = POPCOUNT(xu); break;-      case T_CLZ:      ru = CLZ(xu); break;-      case T_CTZ:      ru = CTZ(xu); break;-      default:-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));-        ERR("UNINT");-      }-      SETINT(n, (value_t)ru);-      goto ret;--#if WANT_FLOAT-    case T_BINDBL2:-      n = ARG(TOP(1));-      TOP(0) = combBINDBL1;-      goto top;--    case T_BINDBL1:-      /* First argument */-#if SANITY-      if (GETTAG(n) != T_DBL)-        ERR("BINDBL 0");-#endif  /* SANITY */-      xd = GETDBLVALUE(n);-      /* Second argument */-      y = ARG(TOP(2));-      while (GETTAG(y) == T_IND)-        y = GETINDIR(y);-#if SANITY-      if (GETTAG(y) != T_DBL)-        ERR("BINDBL 1");-#endif  /* SANITY */-      yd = GETDBLVALUE(y);-      p = FUN(TOP(1));-      POP(3);-      n = TOP(-1);-    bindbl:-      switch (GETTAG(p)) {-      case T_IND:   p = GETINDIR(p); goto bindbl;-      case T_FADD:  rd = xd + yd; break;-      case T_FSUB:  rd = xd - yd; break;-      case T_FMUL:  rd = xd * yd; break;-      case T_FDIV:  rd = xd / yd; break;--      case T_FEQ:   GOIND(xd == yd ? combTrue : combFalse);-      case T_FNE:   GOIND(xd != yd ? combTrue : combFalse);-      case T_FLT:   GOIND(xd <  yd ? combTrue : combFalse);-      case T_FLE:   GOIND(xd <= yd ? combTrue : combFalse);-      case T_FGT:   GOIND(xd >  yd ? combTrue : combFalse);-      case T_FGE:   GOIND(xd >= yd ? combTrue : combFalse);--      default:-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));-        ERR("BINDBL");-      }-      SETDBL(n, rd);-      goto ret;--    case T_UNDBL1:-      /* The argument */-#if SANITY-      if (GETTAG(n) != T_DBL)-        ERR("UNDBL 0");-#endif-      xd = GETDBLVALUE(n);-      p = FUN(TOP(1));-      POP(2);-      n = TOP(-1);-    undbl:-      switch (GETTAG(p)) {-      case T_IND:   p = GETINDIR(p); goto undbl;-      case T_FNEG:  rd = -xd; break;-      default:-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));-        ERR("UNDBL");-      }-      SETDBL(n, rd);-      goto ret;-#endif  /* WANT_FLOAT */--    case T_BINBS2:-      n = ARG(TOP(1));-      TOP(0) = combBINBS1;-      goto top;--    case T_BINBS1:-      /* First argument */-#if SANITY-      if (GETTAG(n) != T_FORPTR || FORPTR(n)->finalizer->fptype != FP_BSTR)-        ERR("BINBS 0");-#endif  /* SANITY */-      xbs = BSTR(n);-      /* Second argument */-      y = ARG(TOP(2));-      while (GETTAG(y) == T_IND)-        y = GETINDIR(y);-#if SANITY-      if (GETTAG(y) != T_FORPTR || FORPTR(y)->finalizer->fptype != FP_BSTR)-        ERR("BINBS 1");-#endif  /* SANITY */-      ybs = BSTR(y);-      p = FUN(TOP(1));-      POP(3);-      n = TOP(-1);-    binbs:-      switch (GETTAG(p)) {-      case T_IND:    p = GETINDIR(p); goto binbs;--      case T_BSAPPEND: rbs = bsappend(xbs, ybs); break;-      case T_BSAPPENDDOT: rbs = bsappenddot(xbs, ybs); break;-      case T_BSEQ:   GOIND(bscompare(xbs, ybs) == 0 ? combTrue : combFalse);-      case T_BSNE:   GOIND(bscompare(xbs, ybs) != 0 ? combTrue : combFalse);-      case T_BSLT:   GOIND(bscompare(xbs, ybs) <  0 ? combTrue : combFalse);-      case T_BSLE:   GOIND(bscompare(xbs, ybs) <= 0 ? combTrue : combFalse);-      case T_BSGT:   GOIND(bscompare(xbs, ybs) >  0 ? combTrue : combFalse);-      case T_BSGE:   GOIND(bscompare(xbs, ybs) >= 0 ? combTrue : combFalse);-      case T_BSCMP:  r = bscompare(xbs, ybs); GOIND(r < 0 ? combLT : r > 0 ? combGT : combEQ);--      default:-        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));-        ERR("BINBS");-      }-      SETBSTR(n, mkForPtrFree(rbs));-      goto ret;--    default:-      stack_ptr = stk;-      n = TOP(-1);-    }-  }-#if MAXSTACKDEPTH-  cur_c_stack = old_cur_c_stack; /* reset rather than counting down, in case of longjump */-#endif-  return n;-}--NORETURN void-die_exn(NODEPTR exn)-{-  /* No handler:-   * First convert the exception to a string by calling displaySomeException.-   * The display function compiles to combShowExn, so we need to build-   * (combShowExn exn) and evaluate it.-   */-  NODEPTR x;-  char *msg;--  if (in_raise) {-    ERR("recursive error");-    EXIT(1);-  }-  in_raise = 1;--  if (GETTAG(exn) == T_INT) {-    /* This is the special hack for RTS generated exception, represented by a T_INT */-    switch(GETVALUE(exn)) {-    case 0: msg = "stack overflow"; break;-    case 1: msg = "heap overflow"; break;-    case 2: msg = "thread killed"; break;-    case 3: msg = "user interrupt"; break;-    case 4: msg = "DivideByZero"; break;-    default: msg = "unknown"; break;-    }-  } else {-    /* just overwrite the top stack element, we don't need it */-    CLEARSTK();-    GCCHECK(1);-    PUSH(new_ap(combShowExn, exn));/* TOP(0) = (combShowExn exn) */-    x = evali(TOP(0));             /* evaluate it */-    msg = evalstring(x).string;    /* and convert to a C string */-    POP(1);-  }-#if WANT_STDIO-  /* A horrible hack until we get proper exceptions */-  if (strcmp(msg, "ExitSuccess") == 0) {-    EXIT(0);-  } else {-    fprintf(stderr, "\nmhs: uncaught exception: %s\n", msg);-    EXIT(1);-  }-#else  /* WANT_STDIO */-  ERR1("mhs error: %s", msg);-#endif  /* WANT_STDIO */-}--#if WANT_ARGS-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;-}-#endif--extern uint8_t *combexpr;-extern int combexprlen;--MAIN-{-  NODEPTR prog;-#if WANT_ARGS-  char *inname = 0;-  char **av;-  char *progname;-  char **gargv;-  int gargc;-  int inrts;-#if WANT_TICK-  int dump_ticks = 0;-#endif-#endif-#if WANT_STDIO-  char *outname = 0;-  size_t file_size = 0;-#endif--#if 0-  /* MINGW doesn't do buffering right */-  setvbuf(stdout, NULL, _IOLBF, BUFSIZ);-  setvbuf(stderr, NULL, _IONBF, BUFSIZ);-#endif--#ifdef INITIALIZATION-  main_setup(); /* Do platform specific start-up. */-#endif--#ifdef CLOCK_INIT-  CLOCK_INIT();-#endif--#if WANT_SIGINT-  (void)signal(SIGINT, handle_sigint);-#endif--  heap_size = HEAP_CELLS;       /* number of heap cells */-  stack_size = STACK_SIZE;      /* number of stack slots */--#if WANT_ARGS-  progname = argv[0];-  argc--, argv++;-  gargv = 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++;-#if WANT_TICK-        else if (strcmp(p, "-T") == 0)-          dump_ticks = 1;-#endif-        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];-        else if (strcmp(p, "-B") == 0)-          gcbell++;-#endif  /* WANT_STDIO */-        else-          ERR("Usage: eval [+RTS [-v] [-B] [-T] [-Hheap-size] [-Kstack-size] [-rFILE] [-oFILE] -RTS] arg ...");-      }-    } else {-      if (strcmp(p, "+RTS") == 0) {-        inrts = 1;-      } else {-        *av++ = p;-      }-    }-  }-  gargc = av - gargv;--  if (inname == 0)-    inname = "out.comb";-#endif--  init_nodes();-  stack = mmalloc(sizeof(NODEPTR) * stack_size);-  CLEARSTK();-  num_reductions = 0;--#if WANT_ARGS-  /* Initialize an IORef (i.e., single element IOArray-   * to contain the list of program arguments.-   * The 0th element is the program name, and the rest-   * are the non RTS arguments.-   */-  {-    NODEPTR n;-    /* No GC checks, the heap is empty. */-    n = mkNil();-    for(int i = gargc-1; i >= 0; i--) {-      n = mkCons(mkStringC(gargv[i]), n);-    }-    n = mkCons(mkStringC(progname), n);-    argarray = arr_alloc(1, n);      /* An IORef contains a single element array */-    argarray->permanent = 1;         /* never GC the arguments, because a T_IO_GETARGREF can reach argarray */-  }-#endif  /* WANT_ARGS */--  if (combexpr) {-    int c;-    BFILE *bf = openb_rd_buf(combexpr, combexprlen);-    c = getb(bf);-    /* Compressed combinators start with a 'Z' or 'z', otherwise 'v' (for version) */-    if (c == 'z') {-      /* add LZ77 compressor transducer */-      bf = add_lz77_decompressor(bf);-    } else {-      /* put it back, we need it */-      ungetb(c, bf);-    }-    prog = parse_top(bf);-    closeb(bf);-#if WANT_STDIO-    file_size = combexprlen;-#endif-  } else {-#if WANT_STDIO-    prog = parse_file(inname, &file_size);-#else-    ERR("no stdio");-#endif-  }--  /* GC unused stuff, nice for -o */-  PUSH(prog);-  want_gc_red = 1;-  gc();-  gc();                         /* this finds some more GC reductions */-  want_gc_red = 0;              /* disabled due to UB */-  prog = POPTOP();--#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);-    struct BFILE *bf = add_FILE(out);-    printb(bf, prog, 1);-    closeb(bf);-    EXIT(0);-  }-  if (verbose > 2) {-    pp(stdout, prog);-  }-#endif-  run_time -= GETTIMEMILLI();--  topnode = &prog;-  start_exec(prog);-  /* Flush standard handles in case there is some BFILE buffering */-  flushb((BFILE*)FORPTR(comb_stdout)->payload.string);-  flushb((BFILE*)FORPTR(comb_stderr)->payload.string);-  gc();                      /* Run finalizers */-  run_time += GETTIMEMILLI();--#if WANT_STDIO-  if (verbose) {-    if (verbose > 1) {-      PRINT("node size=%"PRIheap", heap size bytes=%"PRIheap"\n", (heapoffs_t)NODE_SIZE, heap_size * NODE_SIZE);-    }-    setlocale(LC_NUMERIC, "en_US");  /* Make %' work on platforms that support it */-    PRINT("%"PCOMMA"15"PRIheap" combinator file size\n", (heapoffs_t)file_size);-    PRINT("%"PCOMMA"15"PRIheap" cells at start\n", start_size);-    PRINT("%"PCOMMA"15"PRIheap" cells heap size (%"PCOMMA""PRIheap" bytes)\n", heap_size, heap_size * NODE_SIZE);-    PRINT("%"PCOMMA"15"PRIcounter" cells allocated (%"PCOMMA".1f Mbyte/s)\n", num_alloc, num_alloc * NODE_SIZE / ((double)run_time / 1000) / 1000000);-    PRINT("%"PCOMMA"15"PRIcounter" GCs\n", num_gc);-    PRINT("%"PCOMMA"15"PRIcounter" max cells used\n", max_num_marked);-    PRINT("%"PCOMMA"15"PRIcounter" reductions (%"PCOMMA".1f Mred/s)\n", num_reductions, num_reductions / ((double)run_time / 1000) / 1000000);-    PRINT("%"PCOMMA"15"PRIcounter" yields (%"PCOMMA""PRIcounter" resched)\n", num_yield, num_resched);-    PRINT("%"PCOMMA"15"PRIcounter" array alloc\n", num_arr_alloc);-    PRINT("%"PCOMMA"15"PRIcounter" array free\n", num_arr_free);-    PRINT("%"PCOMMA"15"PRIcounter" foreign alloc\n", num_fin_alloc);-    PRINT("%"PCOMMA"15"PRIcounter" foreign free\n", num_fin_free);-    PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc (max %"PCOMMA""PRIcounter")\n", num_bs_alloc, num_bs_alloc_max);-    PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc bytes (max %"PCOMMA""PRIcounter")\n", num_bs_bytes, num_bs_inuse_max);-    PRINT("%"PCOMMA"15"PRIcounter" bytestring free\n", num_bs_free);-    PRINT("%"PCOMMA"15"PRIcounter" thread create\n", num_thread_create-1);-    PRINT("%"PCOMMA"15"PRIcounter" thread reap\n", num_thread_reap);-#if MAXSTACKDEPTH-    PRINT("%"PCOMMA"15d max stack depth\n", (int)max_stack_depth);-    PRINT("%"PCOMMA"15d max C stack depth\n", (int)max_c_stack);-#endif-    // PRINT("%"PCOMMA"15"PRIcounter" max mark depth\n", max_mark_depth);-    PRINT("%15.2fs total expired time\n", (double)run_time / 1000);-    PRINT("%15.2fs total gc time (%.2f + %.2f)\n",-          (double)(gc_mark_time + gc_scan_time) / 1000,-          (double)gc_mark_time / 1000,-          (double)gc_scan_time / 1000);-#if GCRED-    PRINT(" GC reductions A=%"PRIcounter", K=%"PRIcounter", I=%"PRIcounter", int=%"PRIcounter", flip=%"PRIcounter","-          " BI=%"PRIcounter", BxI=%"PRIcounter", C'BxI=%"PRIcounter", CC=%"PRIcounter", C'I=%"PRIcounter", C'BBCP=%"PRIcounter"\n",-          red_a, red_k, red_i, red_int, red_flip, red_bi, red_bxi, red_ccbi, red_cc, red_cci, red_ccbbcp);-    PRINT(" special reductions B'=%"PRIcounter" K4=%"PRIcounter" K3=%"PRIcounter" K2=%"PRIcounter" C'B=%"PRIcounter", Z=%"PRIcounter", R=%"PRIcounter"\n",-          red_bb, red_k4, red_k3, red_k2, red_ccb, red_z, red_r);-#endif-  }-#endif  /* WANT_STDIO */--#if WANT_TICK-  if (dump_ticks) {-    dump_tick_table(stdout);-  }-#endif--#ifdef TEARDOWN-  main_teardown(); /* do some platform specific teardown */-#endif-  EXIT(0);-}--#if WANT_MD5-#include "md5.c"-#endif  /* WANT_MD5 */--#if WANT_LZ77-#include "lz77.c"-#endif--/*********************/-/* FFI adapters      */--#define MHS_FROM(name, set, type) \-from_t \-name(stackptr_t stk, int n, type x) \-{ \-  NODEPTR r = TOP(0);           /* The pre-allocated cell for the result, */ \-  set(r, x);                    /* Put result in pre-allocated cell. */ \-  return n;                     /* return arity */ \-}-MHS_FROM(mhs_from_FloatW, SETDBL, flt_t);-MHS_FROM(mhs_from_Int, SETINT, value_t);-MHS_FROM(mhs_from_Word, SETINT, uvalue_t);-MHS_FROM(mhs_from_Word8, SETINT, uvalue_t);-MHS_FROM(mhs_from_Ptr, SETPTR, void*);-MHS_FROM(mhs_from_ForPtr, SETFORPTR, struct forptr *);-MHS_FROM(mhs_from_FunPtr, SETFUNPTR, HsFunPtr);-MHS_FROM(mhs_from_CChar, SETINT, char);-MHS_FROM(mhs_from_CSChar, SETINT, signed char);-MHS_FROM(mhs_from_CUChar, SETINT, unsigned char);-MHS_FROM(mhs_from_CShort, SETINT, short);-MHS_FROM(mhs_from_CUShort, SETINT, unsigned short);-MHS_FROM(mhs_from_CInt, SETINT, int);-MHS_FROM(mhs_from_CUInt, SETINT, unsigned int);-MHS_FROM(mhs_from_CLong, SETINT, long);-MHS_FROM(mhs_from_CULong, SETINT, unsigned long);-MHS_FROM(mhs_from_CLLong, SETINT, long long);-MHS_FROM(mhs_from_CULLong, SETINT, unsigned long long);-MHS_FROM(mhs_from_CSize, SETINT, size_t);-#if WANT_TIME-MHS_FROM(mhs_from_CTime, SETINT, time_t);-#endif-// MHS_FROM(mhs_from_CSSize, SETINT, ssize_t);-MHS_FROM(mhs_from_CIntPtr, SETINT, intptr_t);-MHS_FROM(mhs_from_CUIntPtr, SETINT, uintptr_t);-from_t-mhs_from_Unit(stackptr_t stk, int n)-{-  POP(1);                       /* return value cell */-  PUSH(combUnit);               /* push unit instead */-  return n;-}--#define MHS_TO(name, eval, type) \-type name(stackptr_t stk, int n) \-{ \-  return eval(ARG(TOP(n+1)));                /* The stack has a reserved cell on top of the arguments */ \-}-MHS_TO(mhs_to_FloatW, evaldbl, flt_t);-MHS_TO(mhs_to_Int, evalint, value_t);-MHS_TO(mhs_to_Word, evalint, uvalue_t);-MHS_TO(mhs_to_Word8, evalint, uint8_t);-MHS_TO(mhs_to_Ptr, evalptr, void*);-MHS_TO(mhs_to_FunPtr, evalfunptr, HsFunPtr);-MHS_TO(mhs_to_CChar, evalint, char);-MHS_TO(mhs_to_CSChar, evalint, signed char);-MHS_TO(mhs_to_CUChar, evalint, unsigned char);-MHS_TO(mhs_to_CShort, evalint, short);-MHS_TO(mhs_to_CUShort, evalint, unsigned short);-MHS_TO(mhs_to_CInt, evalint, int);-MHS_TO(mhs_to_CUInt, evalint, unsigned int);-MHS_TO(mhs_to_CLong, evalint, long);-MHS_TO(mhs_to_CULong, evalint, unsigned long);-MHS_TO(mhs_to_CLLong, evalint, long long);-MHS_TO(mhs_to_CULLong, evalint, unsigned long long);-MHS_TO(mhs_to_CSize, evalint, size_t);-#if WANT_TIME-MHS_TO(mhs_to_CTime, evalint, time_t);-#endif-// MHS_TO(mhs_to_CSSize, evalint, ssize_t);-MHS_TO(mhs_to_CIntPtr, evalint, intptr_t);-MHS_TO(mhs_to_CUIntPtr, evalint, uintptr_t);---/* The rest of this file was generated by the compiler, with some minor edits with #if. */-from_t mhs_GETRAW(int s) { return  mhs_from_Int(s, 0, GETRAW()); }-from_t mhs_GETTIMEMILLI(int s) { return  mhs_from_Int(s, 0, GETTIMEMILLI()); }-#if WANT_MATH-#if WORD_SIZE == 64-from_t mhs_acos(int s) { return mhs_from_FloatW(s, 1, acos(mhs_to_FloatW(s, 0))); }-from_t mhs_asin(int s) { return mhs_from_FloatW(s, 1, asin(mhs_to_FloatW(s, 0))); }-from_t mhs_atan(int s) { return mhs_from_FloatW(s, 1, atan(mhs_to_FloatW(s, 0))); }-from_t mhs_atan2(int s) { return mhs_from_FloatW(s, 2, atan2(mhs_to_FloatW(s, 0), mhs_to_FloatW(s, 1))); }-from_t mhs_cos(int s) { return mhs_from_FloatW(s, 1, cos(mhs_to_FloatW(s, 0))); }-from_t mhs_exp(int s) { return mhs_from_FloatW(s, 1, exp(mhs_to_FloatW(s, 0))); }-from_t mhs_log(int s) { return mhs_from_FloatW(s, 1, log(mhs_to_FloatW(s, 0))); }-from_t mhs_sin(int s) { return mhs_from_FloatW(s, 1, sin(mhs_to_FloatW(s, 0))); }-from_t mhs_sqrt(int s) { return mhs_from_FloatW(s, 1, sqrt(mhs_to_FloatW(s, 0))); }-from_t mhs_tan(int s) { return mhs_from_FloatW(s, 1, tan(mhs_to_FloatW(s, 0))); }-#elif WORD_SIZE == 32  /* WORD_SIZE */-from_t mhs_acos(int s) { return mhs_from_FloatW(s, 1, acosf(mhs_to_FloatW(s, 0))); }-from_t mhs_asin(int s) { return mhs_from_FloatW(s, 1, asinf(mhs_to_FloatW(s, 0))); }-from_t mhs_atan(int s) { return mhs_from_FloatW(s, 1, atanf(mhs_to_FloatW(s, 0))); }-from_t mhs_atan2(int s) { return mhs_from_FloatW(s, 2, atan2f(mhs_to_FloatW(s, 0), mhs_to_FloatW(s, 1))); }-from_t mhs_cos(int s) { return mhs_from_FloatW(s, 1, cosf(mhs_to_FloatW(s, 0))); }-from_t mhs_exp(int s) { return mhs_from_FloatW(s, 1, expf(mhs_to_FloatW(s, 0))); }-from_t mhs_log(int s) { return mhs_from_FloatW(s, 1, logf(mhs_to_FloatW(s, 0))); }-from_t mhs_sin(int s) { return mhs_from_FloatW(s, 1, sinf(mhs_to_FloatW(s, 0))); }-from_t mhs_sqrt(int s) { return mhs_from_FloatW(s, 1, sqrtf(mhs_to_FloatW(s, 0))); }-from_t mhs_tan(int s) { return mhs_from_FloatW(s, 1, tanf(mhs_to_FloatW(s, 0))); }-#else-#error Unknown WORD_SIZE-#endif  /* WORD_SIZE */-#endif  /* WANT_MATH */--#if WANT_STDIO-from_t mhs_add_FILE(int s) { return mhs_from_Ptr(s, 1, add_FILE(mhs_to_Ptr(s, 0))); }-from_t mhs_add_utf8(int s) { return mhs_from_Ptr(s, 1, add_utf8(mhs_to_Ptr(s, 0))); }-from_t mhs_closeb(int s) { closeb(mhs_to_Ptr(s, 0)); return mhs_from_Unit(s, 1); }-from_t mhs_addr_closeb(int s) { return mhs_from_FunPtr(s, 0, (HsFunPtr)&closeb); }-from_t mhs_flushb(int s) { flushb(mhs_to_Ptr(s, 0)); return mhs_from_Unit(s, 1); }-from_t mhs_fopen(int s) { return mhs_from_Ptr(s, 2, fopen(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }--from_t mhs_getb(int s) { return mhs_from_Int(s, 1, getb(mhs_to_Ptr(s, 0))); }-from_t mhs_putb(int s) { putb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_ungetb(int s) { ungetb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_openwrbuf(int s) { return mhs_from_Ptr(s, 0, openb_wr_buf()); }-from_t mhs_openrdbuf(int s) { return mhs_from_Ptr(s, 2, openb_rd_buf(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }-from_t mhs_getbuf(int s) { get_buf(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2));  return mhs_from_Unit(s, 3); }-from_t mhs_system(int s) { return mhs_from_Int(s, 1, system(mhs_to_Ptr(s, 0))); }-from_t mhs_tmpname(int s) { return mhs_from_Ptr(s, 2, TMPNAME(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }-from_t mhs_unlink(int s) { return mhs_from_Int(s, 1, unlink(mhs_to_Ptr(s, 0))); }-from_t mhs_readb(int s) { return mhs_from_Int(s, 3, readb(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1), mhs_to_Ptr(s, 2))); }-from_t mhs_writeb(int s) { return mhs_from_Int(s, 3, writeb(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1), mhs_to_Ptr(s, 2))); }-from_t mhs_putchar(int s) { putchar(mhs_to_Int(s, 0)); return mhs_from_Unit(s, 1); } /* for debugging */-#endif  /* WANT_STDIO */--#if WANT_MD5-from_t mhs_md5Array(int s) { md5Array(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_md5BFILE(int s) { md5BFILE(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_md5String(int s) { md5String(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }-#endif  /* WANT_MD5 */--#if WANT_LZ77-from_t mhs_add_lz77_compressor(int s) { return mhs_from_Ptr(s, 1, add_lz77_compressor(mhs_to_Ptr(s, 0))); }-from_t mhs_add_lz77_decompressor(int s) { return mhs_from_Ptr(s, 1, add_lz77_decompressor(mhs_to_Ptr(s, 0))); }-from_t mhs_lz77c(int s) { return mhs_from_CSize(s, 3, lz77c(mhs_to_Ptr(s, 0), mhs_to_CSize(s, 1), mhs_to_Ptr(s, 2))); }-#endif  /* WANT_LZ77 */--#if WANT_RLE-from_t mhs_add_rle_compressor(int s) { return mhs_from_Ptr(s, 1, add_rle_compressor(mhs_to_Ptr(s, 0))); }-from_t mhs_add_rle_decompressor(int s) { return mhs_from_Ptr(s, 1, add_rle_decompressor(mhs_to_Ptr(s, 0))); }-#endif  /* WANT_RLE */--#if WANT_BWT-from_t mhs_add_bwt_compressor(int s) { return mhs_from_Ptr(s, 1, add_bwt_compressor(mhs_to_Ptr(s, 0))); }-from_t mhs_add_bwt_decompressor(int s) { return mhs_from_Ptr(s, 1, add_bwt_decompressor(mhs_to_Ptr(s, 0))); }-#endif  /* WANT_BWT */--from_t mhs_calloc(int s) { return mhs_from_Ptr(s, 2, calloc(mhs_to_CSize(s, 0), mhs_to_CSize(s, 1))); }-from_t mhs_free(int s) { free(mhs_to_Ptr(s, 0)); return mhs_from_Unit(s, 1); }-from_t mhs_addr_free(int s) { return mhs_from_FunPtr(s, 0, (HsFunPtr)&FREE); }-from_t mhs_getenv(int s) { return mhs_from_Ptr(s, 1, getenv(mhs_to_Ptr(s, 0))); }-from_t mhs_iswindows(int s) { return mhs_from_Int(s, 0, iswindows()); }-from_t mhs_malloc(int s) { return mhs_from_Ptr(s, 1, MALLOC(mhs_to_CSize(s, 0))); }-from_t mhs_memcpy(int s) { memcpy(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_CSize(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_memmove(int s) { memmove(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_CSize(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_peekPtr(int s) { return mhs_from_Ptr(s, 1, peekPtr(mhs_to_Ptr(s, 0))); }-from_t mhs_peekWord(int s) { return mhs_from_Word(s, 1, peekWord(mhs_to_Ptr(s, 0))); }-from_t mhs_pokePtr(int s) { pokePtr(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_pokeWord(int s) { pokeWord(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }--from_t mhs_peek_uint8(int s) { return mhs_from_Word(s, 1, peek_uint8(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_uint8(int s) { poke_uint8(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_peek_uint16(int s) { return mhs_from_Word(s, 1, peek_uint16(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_uint16(int s) { poke_uint16(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }-#if WORD_SIZE >= 32-from_t mhs_peek_uint32(int s) { return mhs_from_Word(s, 1, peek_uint32(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_uint32(int s) { poke_uint32(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }-#endif  /* WORD_SIZE */-#if WORD_SIZE >= 64-from_t mhs_peek_uint64(int s) { return mhs_from_Word(s, 1, peek_uint64(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_uint64(int s) { poke_uint64(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }-#endif  /* WORD_SIZE */-from_t mhs_peek_uint(int s) { return mhs_from_Word(s, 1, peek_uint(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_uint(int s) { poke_uint(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }--from_t mhs_peek_int8(int s) { return mhs_from_Int(s, 1, peek_int8(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_int8(int s) { poke_int8(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_peek_int16(int s) { return mhs_from_Int(s, 1, peek_int16(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_int16(int s) { poke_int16(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }-#if WORD_SIZE >= 32-from_t mhs_peek_int32(int s) { return mhs_from_Int(s, 1, peek_int32(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_int32(int s) { poke_int32(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }-#endif  /* WORD_SIZE */-#if WORD_SIZE >= 64-from_t mhs_peek_int64(int s) { return mhs_from_Int(s, 1, peek_int64(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_int64(int s) { poke_int64(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }-#endif  /* WORD_SIZE */-from_t mhs_peek_int(int s) { return mhs_from_Int(s, 1, peek_int(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_int(int s) { poke_int(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_peek_llong(int s) { return mhs_from_CLLong(s, 1, peek_llong(mhs_to_Ptr(s, 0))); }-from_t mhs_peek_long(int s) { return mhs_from_CLong(s, 1, peek_long(mhs_to_Ptr(s, 0))); }-from_t mhs_peek_ullong(int s) { return mhs_from_CULLong(s, 1, peek_ullong(mhs_to_Ptr(s, 0))); }-from_t mhs_peek_ulong(int s) { return mhs_from_CULong(s, 1, peek_ulong(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_llong(int s) { poke_llong(mhs_to_Ptr(s, 0), mhs_to_CLLong(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_poke_long(int s) { poke_long(mhs_to_Ptr(s, 0), mhs_to_CLong(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_poke_ullong(int s) { poke_ullong(mhs_to_Ptr(s, 0), mhs_to_CULLong(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_poke_ulong(int s) { poke_ulong(mhs_to_Ptr(s, 0), mhs_to_CULong(s, 1)); return mhs_from_Unit(s, 2); }-#if WANT_FLOAT-from_t mhs_peek_flt(int s) { return mhs_from_FloatW(s, 1, peek_flt(mhs_to_Ptr(s, 0))); }-from_t mhs_poke_flt(int s) { poke_flt(mhs_to_Ptr(s, 0), mhs_to_FloatW(s, 1)); return mhs_from_Unit(s, 2); }-#endif  /* WANT_FLOAT */-from_t mhs_sizeof_int(int s) { return mhs_from_Int(s, 0, sizeof(int)); }-from_t mhs_sizeof_llong(int s) { return mhs_from_Int(s, 0, sizeof(long long)); }-from_t mhs_sizeof_long(int s) { return mhs_from_Int(s, 0, sizeof(long)); }-#if WANT_DIR-from_t mhs_closedir(int s) { return mhs_from_Int(s, 1, closedir(mhs_to_Ptr(s, 0))); }-from_t mhs_opendir(int s) { return mhs_from_Ptr(s, 1, opendir(mhs_to_Ptr(s, 0))); }-from_t mhs_readdir(int s) { return mhs_from_Ptr(s, 1, readdir(mhs_to_Ptr(s, 0))); }-from_t mhs_c_d_name(int s) { return mhs_from_Ptr(s, 1, ((struct dirent *)(mhs_to_Ptr(s, 0)))->d_name); }-from_t mhs_chdir(int s) { return mhs_from_Int(s, 1, chdir(mhs_to_Ptr(s, 0))); }-from_t mhs_mkdir(int s) { return mhs_from_Int(s, 2, mkdir(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }-from_t mhs_getcwd(int s) { return mhs_from_Ptr(s, 2, getcwd(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }-#endif  /* WANT_DIR */--/* Use this to detect if we have (and want) GMP or not. */-from_t mhs_want_gmp(int s) { return mhs_from_Int(s, 0, WANT_GMP); }--#if WANT_GMP-void-free_mpz(void *p)-{-  /*  printf("free_mpz %p\n", p);*/-  mpz_clear(p);                 /* free any extra storage */-  FREE(p);                      /* and free the mpz itself */-}--/* Allocate an initialize a GMP integer */-struct forptr *-new_mpz(void)-{-#if 0-  {-    static int done = 0;-    if (!done) {-      printf("GMP\n");-      done = 1;-    }-  }-#endif-  mpz_ptr p = mmalloc(sizeof(*p));-  mpz_init(p);-  struct forptr *fp = mkForPtrP(p);-  fp->finalizer->final = (HsFunPtr)free_mpz;-  fp->finalizer->fptype = FP_MPZ;-  /*  printf("new_mpz %p %p\n", p, fp); */-  return fp;-}--#if 0-void-print_mpz(mpz_ptr p)-{-  mpz_out_str(stdout, 10, p);-}-#endif--from_t mhs_new_mpz(int s) { mhs_from_ForPtr(s, 0, new_mpz()); }--/* Stubs for GMP functions */-from_t mhs_mpz_abs(int s) { mpz_abs(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_mpz_add(int s) { mpz_add(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_mpz_and(int s) { mpz_and(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_mpz_cmp(int s) { return mhs_from_Int(s, 2, mpz_cmp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }-from_t mhs_mpz_get_d(int s) { return mhs_from_FloatW(s, 1, mpz_get_d(mhs_to_Ptr(s, 0))); }-from_t mhs_mpz_get_si(int s) { return mhs_from_Int(s, 1, mpz_get_si(mhs_to_Ptr(s, 0))); }-from_t mhs_mpz_get_ui(int s) { return mhs_from_Word(s, 1, mpz_get_ui(mhs_to_Ptr(s, 0))); }-from_t mhs_mpz_init_set_si(int s) { mpz_init_set_si(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_mpz_init_set_ui(int s) { mpz_init_set_ui(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_mpz_ior(int s) { mpz_ior(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_mpz_mul(int s) { mpz_mul(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_mpz_mul_2exp(int s) { mpz_mul_2exp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_mpz_neg(int s) { mpz_neg(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }-from_t mhs_mpz_popcount(int s) {-  mpz_ptr a = mhs_to_Ptr(s, 0);-  if (mpz_sgn(a) < 0) {-    mpz_t neg_a;-    mpz_init(neg_a);-    mpz_neg(neg_a, a);-    (void)mhs_from_Int(s, 1, -mpz_popcount(neg_a));-    mpz_clear(neg_a);-  } else {-    (void)mhs_from_Int(s, 1, mpz_popcount(a));-  }-  return 1;-}-from_t mhs_mpz_sub(int s) { mpz_sub(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_mpz_fdiv_q_2exp(int s) { mpz_fdiv_q_2exp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); return mhs_from_Unit(s, 3); }-from_t mhs_mpz_tdiv_qr(int s) { mpz_tdiv_qr(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2), mhs_to_Ptr(s, 3)); return mhs_from_Unit(s, 4); }-from_t mhs_mpz_tstbit(int s) { mhs_from_Int(s, 2, mpz_tstbit(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }-from_t mhs_mpz_xor(int s) { mpz_xor(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }-#endif  /* WANT_GMP */--struct ffi_entry ffi_table[] = {-  { "GETRAW", 0, mhs_GETRAW},-  { "GETTIMEMILLI", 0, mhs_GETTIMEMILLI},-#if WANT_MATH-  { "acos", 1, mhs_acos},-  { "asin", 1, mhs_asin},-  { "atan", 1, mhs_atan},-  { "atan2", 2, mhs_atan2},-  { "cos", 1, mhs_cos},-  { "exp", 1, mhs_exp},-  { "log", 1, mhs_log},-  { "sin", 1, mhs_sin},-  { "sqrt", 1, mhs_sqrt},-  { "tan", 1, mhs_tan},-#endif  /* WANT_MATH */--#if WANT_STDIO-  { "add_FILE", 1, mhs_add_FILE},-  { "add_utf8", 1, mhs_add_utf8},-  { "closeb", 1, mhs_closeb},-  { "&closeb", 0, mhs_addr_closeb},-  { "flushb", 1, mhs_flushb},-  { "fopen", 2, mhs_fopen},-  { "getb", 1, mhs_getb},-  { "putb", 2, mhs_putb},-  { "ungetb", 2, mhs_ungetb},-  { "openb_wr_buf", 0, mhs_openwrbuf},-  { "openb_rd_buf", 2, mhs_openrdbuf},-  { "get_buf", 3, mhs_getbuf},-  { "system", 1, mhs_system},-  { "tmpname", 2, mhs_tmpname},-  { "unlink", 1, mhs_unlink},-  { "readb", 3, mhs_readb},-  { "writeb", 3, mhs_writeb},-  { "putchar", 1, mhs_putchar},-#endif  /* WANT_STDIO */--#if WANT_MD5-  { "md5Array", 3, mhs_md5Array},-  { "md5BFILE", 2, mhs_md5BFILE},-  { "md5String", 2, mhs_md5String},-#endif  /* WANT_MD5 */--#if WANT_LZ77-  { "add_lz77_compressor", 1, mhs_add_lz77_compressor},-  { "add_lz77_decompressor", 1, mhs_add_lz77_decompressor},-  { "lz77c", 3, mhs_lz77c},-#endif  /* WANT_LZ77 */--#if WANT_RLE-  { "add_rle_compressor", 1, mhs_add_rle_compressor},-  { "add_rle_decompressor", 1, mhs_add_rle_decompressor},-#endif  /* WANT_RLE */--#if WANT_BWT-  { "add_bwt_compressor", 1, mhs_add_bwt_compressor},-  { "add_bwt_decompressor", 1, mhs_add_bwt_decompressor},-#endif  /* WANT_RLE */--  { "calloc", 2, mhs_calloc},-  { "free", 1, mhs_free},-  { "&free", 0, mhs_addr_free},-  { "getenv", 1, mhs_getenv},-  { "iswindows", 0, mhs_iswindows},-  { "malloc", 1, mhs_malloc},-  { "memcpy", 3, mhs_memcpy},-  { "memmove", 3, mhs_memmove},-  { "peekPtr", 1, mhs_peekPtr},-  { "peekWord", 1, mhs_peekWord},-  { "pokePtr", 2, mhs_pokePtr},-  { "pokeWord", 2, mhs_pokeWord},--  { "peek_uint8", 1, mhs_peek_uint8},-  { "poke_uint8", 2, mhs_poke_uint8},-  { "peek_uint16", 1, mhs_peek_uint16},-  { "poke_uint16", 2, mhs_poke_uint16},-#if WORD_SIZE >= 32-  { "peek_uint32", 1, mhs_peek_uint32},-  { "poke_uint32", 2, mhs_poke_uint32},-#endif  /* WORD_SIZE >= 32 */-#if WORD_SIZE >= 64-  { "peek_uint64", 1, mhs_peek_uint64},-  { "poke_uint64", 2, mhs_poke_uint64},-#endif  /* WORD_SIZE >= 64 */-  { "peek_uint", 1, mhs_peek_uint},-  { "poke_uint", 2, mhs_poke_uint},--  { "peek_int8", 1, mhs_peek_int8},-  { "poke_int8", 2, mhs_poke_int8},-  { "peek_int16", 1, mhs_peek_int16},-  { "poke_int16", 2, mhs_poke_int16},-#if WORD_SIZE >= 32-  { "peek_int32", 1, mhs_peek_int32},-  { "poke_int32", 2, mhs_poke_int32},-#endif  /* WORD_SIZE >= 32 */-#if WORD_SIZE >= 64-  { "peek_int64", 1, mhs_peek_int64},-  { "poke_int64", 2, mhs_poke_int64},-#endif  /* WORD_SIZE >= 64 */-  { "peek_int", 1, mhs_peek_int},-  { "poke_int", 2, mhs_poke_int},-  { "peek_llong", 1, mhs_peek_llong},-  { "peek_long", 1, mhs_peek_long},-  { "peek_ullong", 1, mhs_peek_ullong},-  { "peek_ulong", 1, mhs_peek_ulong},-  { "poke_llong", 2, mhs_poke_llong},-  { "poke_long", 2, mhs_poke_long},-  { "poke_ullong", 2, mhs_poke_ullong},-  { "poke_ulong", 2, mhs_poke_ulong},-#if WANT_FLOAT-  { "peek_flt", 1, mhs_peek_flt},-  { "poke_flt", 2, mhs_poke_flt},-#endif  /* WANT_FLOAT */-  { "sizeof_int", 0, mhs_sizeof_int},-  { "sizeof_llong", 0, mhs_sizeof_llong},-  { "sizeof_long", 0, mhs_sizeof_long},-#if WANT_DIR-  { "c_d_name", 1, mhs_c_d_name},-  { "closedir", 1, mhs_closedir},-  { "opendir", 1, mhs_opendir},-  { "readdir", 1, mhs_readdir},-  { "chdir", 1, mhs_chdir},-  { "mkdir", 2, mhs_mkdir},-  { "getcwd", 2, mhs_getcwd},-#endif  /* WANT_DIR */-  { "want_gmp", 0, mhs_want_gmp},-#if WANT_GMP-  { "new_mpz", 0, mhs_new_mpz},-  { "mpz_abs", 2, mhs_mpz_abs},-  { "mpz_add", 3, mhs_mpz_add},-  { "mpz_and", 3, mhs_mpz_and},-  { "mpz_cmp", 2, mhs_mpz_cmp},-  { "mpz_get_d", 1, mhs_mpz_get_d},-  { "mpz_get_si", 1, mhs_mpz_get_si},-  { "mpz_get_ui", 1, mhs_mpz_get_ui},-  { "mpz_init_set_si", 2, mhs_mpz_init_set_si},-  { "mpz_init_set_ui", 2, mhs_mpz_init_set_ui},-  { "mpz_ior", 3, mhs_mpz_ior},-  { "mpz_mul", 3, mhs_mpz_mul},-  { "mpz_mul_2exp", 3, mhs_mpz_mul_2exp},-  { "mpz_neg", 2, mhs_mpz_neg},-  { "mpz_popcount", 1, mhs_mpz_popcount},-  { "mpz_sub", 3, mhs_mpz_sub},-  { "mpz_fdiv_q_2exp", 3, mhs_mpz_fdiv_q_2exp},-  { "mpz_tdiv_qr", 4, mhs_mpz_tdiv_qr},-  { "mpz_tstbit", 2, mhs_mpz_tstbit},-  { "mpz_xor", 3, mhs_mpz_xor},-#endif  /* WANT_GMP */+#include "mhsffi.h"  /* this includes config.h */+#include "extra.c"++#if !defined(WANT_GMP)+#define WANT_GMP 0+#endif /* defined(WANT_GMP) */++#include <stdbool.h>+#include <stdlib.h>+#include <string.h>+#include <ctype.h>+#include <setjmp.h>+#if WANT_MATH+#include <math.h>+#endif  /* WANT_MATH */+#if defined(__EMSCRIPTEN__)+#include "emscripten.h"+#endif /* __EMSCRIPTEN__ */+#if WANT_DIR+#include <dirent.h>+#include <unistd.h>+#include <sys/stat.h>+#include <sys/types.h>+#endif  /* WANT_DIR */+#if WANT_TIME+#include <time.h>+#endif+#if WANT_GMP+#include <gmp.h>+#endif+#if WANT_SIGINT+#include <signal.h>+#endif++extern char **environ;          /* should probably be behind some WANT_ */++#if WANT_MD5+#include "md5.h"+#endif++#if !defined(WANT_UTF8)+#define WANT_UTF8 1+#endif++#if !defined(WANT_BUF)+#define WANT_BUF 1+#endif++#if !defined(WANT_CRLF)+#define WANT_CRLF 1+#endif++#if !defined(WANT_BASE64)+#define WANT_BASE64 1+#endif++#if !defined(WANT_LZ77)+#define WANT_LZ77 1+#endif++#if !defined(WANT_RLE)+#define WANT_RLE 1+#endif++#if !defined(WANT_BWT)+#define WANT_BWT 1+#endif++#if !defined(WANT_ERRNO)+#define WANT_ERRNO 0+#else+#include <errno.h>+#endif++#define NEED_INT64 (WANT_INT64 && WORD_SIZE == 32)++#if WANT_LZ77+size_t lz77d(uint8_t *src, size_t srclen, uint8_t **bufp);+size_t lz77c(uint8_t *src, size_t srclen, uint8_t **bufp);+#endif++#if defined(__GNUC__) && __GNUC__ >= 14 && defined(__aarch64__)+#define REGISTER(dcl, reg) register dcl asm(#reg)+#else+#define REGISTER(dcl, reg) dcl+#endif++const struct ffi_entry ffi_table[];+int num_ffi;+#define FFI_IX(i) ((i) < num_ffi ? ffi_table[i] : xffi_table[i - num_ffi])++#if WANT_STDIO+#define THREAD_DEBUG 1+#else+#define THREAD_DEBUG 0+#endif++#define VERSION "v8.3\n"++#define PRIvalue PRIdPTR+#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 uintptr_t counter_t;    /* Statistics counter, can be smaller since overflow doesn't matter */+#define PRIcounter PRIuPTR+typedef uintptr_t bits_t;       /* One word of bits */++#if !defined(WANT_ARGS)+#define WANT_ARGS 1+#endif++#if !defined(MALLOC)+#define MALLOC malloc+#endif++#if !defined(REALLOC)+#define REALLOC realloc+#endif++#if !defined(CALLOC)+#define CALLOC calloc+#endif++#if !defined(FREE)+#define FREE free+#endif++#if !defined(EXIT)+#define EXIT exit+#endif++#if !defined(PRINT)+#define PRINT printf+#endif++#if !defined(PCOMMA)+#define PCOMMA "'"+#endif  /* !defined(PCOMMA) */++#if !defined(GETRAW)+int GETRAW(void) { return -1; }+#endif  /* !defined(GETRAW) */++#if !defined(GETTIMEMILLI)+value_t GETTIMEMILLI(void) { return 0; }+#endif  /* !define(GETTIMEMILLI) */++#if !defined(GETCPUTIME)+void GETCPUTIME(long *sec, long *nsec) { sec = 0; nsec = 0; }+#endif  /* !define(GETCPUTIME) */++#if !defined(INLINE)+#define INLINE inline+#endif  /* !define(INLINE) */++#if !defined(NORETURN)+/*#define NORETURN [[noreturn]]*/+#define NORETURN _Noreturn+#endif /* !defined(NORETURN) */++#if !defined(PACKED)+#if WORD_SIZE == 32+#define PACKED __attribute__((packed))+#else+#define PACKED+#endif  /* WORD_SIZE == 32 */+#endif  /* !defined(PACKED) */++#if !defined(SLICE)+#define SLICE 100000+#endif++NORETURN void memerr(void);++void *+mmalloc(size_t s)+{+  void *p = MALLOC(s);+  if (!p)+    memerr();+  return p;+}++void *+mrealloc(void *q, size_t s)+{+  void *p = REALLOC(q, s);+  if (!p)+    memerr();+  return p;+}++void *+mcalloc(size_t n, size_t s)+{+  void *p = CALLOC(n, s);+  if (!p)+    memerr();+  return p;+}++#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) */++#if !defined(TMPNAME)+/* This is a really bad implementation, since it doesn't check for anything. */+char* TMPNAME(const char* pre, const char* suf) {+  ERR("no TMPNAME");+}+#endif++#if !defined(FFS)+/* This is pretty bad, could use deBruijn multiplication instead. */+int+FFS(bits_t x)+{+  int i;+  if (!x)+    return 0;+  for(i = 1; !(x & 1); x >>= 1, i++)+    ;+  return i;+}+#endif  /* !defined(FFS) */++/***** popcount *****/+#if defined(__has_builtin)++#if __has_builtin(__builtin_popcountl)+#define BUILTIN_POPCOUNT __builtin_popcountl+#endif++#if __has_builtin(__builtin_popcountll)+#define BUILTIN_POPCOUNT64 __builtin_popcountll+#endif++#endif+++#if !defined(POPCOUNT)+uvalue_t POPCOUNT(uvalue_t x) {+#if defined(BUILTIN_POPCOUNT)+  return BUILTIN_POPCOUNT(x);+#else   /* !defined(BUILTIN_POPCOUNT) */+  uvalue_t count = 0;+  while (x) {+    x = x & (x - 1); // clear lowest 1 bit+    count++;+  }+  return count;+#endif   /* !defined(BUILTIN_POPCOUNT) */+}+#endif  /* !defined(POPCOUNT) */++#if !defined(POPCOUNT64)+uvalue_t POPCOUNT64(uint64_t x) {+#if defined(BUILTIN_POPCOUNT64)+  return BUILTIN_POPCOUNT64(x);+#else   /* !defined(BUILTIN_POPCOUNT64) */+  uvalue_t count = 0;+  while (x) {+    x = x & (x - 1); // clear lowest 1 bit+    count++;+  }+  return count;+#endif   /* !defined(BUILTIN_POPCOUNT64) */+}+#endif  /* !defined(POPCOUNT64) */+/***** end popcount *****/++/***** clz *****/+#if defined(__has_builtin)++#if __has_builtin(__builtin_clzl)+#define BUILTIN_CLZ __builtin_clzl+#endif++#if __has_builtin(__builtin_clzll)+#define BUILTIN_CLZ64 __builtin_clzll+#endif++#endif+++#if !defined(CLZ)+uvalue_t CLZ(uvalue_t x) {+#if defined(BUILTIN_CLZ)+  if (x == 0) return WORD_SIZE;+  return BUILTIN_CLZ(x);+#else   /* defined(BUILTIN_CLZ) */+  value_t count = WORD_SIZE;+  while (x) {+    x = x >> 1;+    count--;+  }+  return count;+#endif  /* defined(BUILTIN_CLZ) */+}+#endif  /* !defined(CLZ) */++#if !defined(CLZ64)+uvalue_t CLZ64(uint64_t x) {+#if defined(BUILTIN_CLZ64)+  if (x == 0) return 64;+  return BUILTIN_CLZ64(x);+#else   /* defined(BUILTIN_CLZ64) */+  value_t count = 64;+  while (x) {+    x = x >> 1;+    count--;+  }+  return count;+#endif  /* defined(BUILTIN_CLZ64) */+}+#endif  /* !defined(CLZ64) */+/***** end clz *****/++/***** ctz *****/+#if defined(__has_builtin)++#if __has_builtin(__builtin_ctzl)+#define BUILTIN_CTZ __builtin_ctzl+#endif++#if __has_builtin(__builtin_ctzl)+#define BUILTIN_CTZ64 __builtin_ctzll+#endif++#endif  /* defined(__has_builtin) */+++#if !defined(CTZ)+uvalue_t CTZ(uvalue_t x) {+  if (x == 0) return WORD_SIZE;+#if defined(BUILTIN_CTZ)+  return BUILTIN_CTZ(x);+#else  /* defined(BUILTIN_CTZ) */+  uvalue_t count = 0;+  while ((x & 1) == 0) {+    x = x >> 1;+    count += 1;+  }+  return count;+#endif  /* defined(BUILTIN_CTZ) */+}+#endif  /* !defined(CTZ) */++#if !defined(CTZ64)+uvalue_t CTZ64(uint64_t x) {+  if (x == 0) return 64;+#if defined(BUILTIN_CTZ64)+  return BUILTIN_CTZ64(x);+#else  /* defined(BUILTIN_CTZ64) */+  uvalue_t count = 0;+  while ((x & 1) == 0) {+    x = x >> 1;+    count++;+  }+  return count;+#endif  /* defined(BUILTIN_CTZ64) */+}+#endif  /* !defined(CTZ) */++/***** end ctz *****/++#if !defined(COUNT)+#define COUNT(n) ++(n)+#endif++value_t+iswindows(void)+{+#if defined(ISWINDOWS)+  return 1;+#else+  return 0;+#endif+}++value_t+ismacos(void)+{+#if defined(ISMACOS)+  return 1;+#else+  return 0;+#endif+}++value_t+islinux(void)+{+#if defined(ISLINUX)+  return 1;+#else+  return 0;+#endif+}++/***************************************/++/* Keep permanent nodes for LOW_INT <= i < HIGH_INT */+#define LOW_INT (-10)+#define HIGH_INT 256++#if !defined(HEAP_CELLS)+#define HEAP_CELLS 50000000+#endif++#if !defined(STACK_SIZE)+#define STACK_SIZE 200000+#endif++/* tcc doesn't understand noreturn attribute */+#if defined(__TCC__)+#define NOTREACHED return 0+#else+#define NOTREACHED+#endif++enum node_tag { T_FREE, T_IND, T_AP, T_INT, T_INT64X, T_DBL, T_FLT32, T_PTR, T_FUNPTR, T_FORPTR, T_BADDYN, T_ARR, T_THID, T_MVAR, T_WEAK,+                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_J,+                T_K2, T_K3, T_K4, T_CCB,+                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_POPCOUNT, T_CLZ, T_CTZ,+                T_EQ, T_NE, T_LT, T_LE, T_GT, T_GE, T_ULT, T_ULE, T_UGT, T_UGE, T_ICMP, T_UCMP,+                T_ADD64, T_SUB64, T_MUL64, T_QUOT64, T_REM64, T_SUBR64, T_UQUOT64, T_UREM64, T_NEG64,+                T_AND64, T_OR64, T_XOR64, T_INV64, T_SHL64, T_SHR64, T_ASHR64,+                T_POPCOUNT64, T_CLZ64, T_CTZ64,+                T_EQ64, T_NE64, T_LT64, T_LE64, T_GT64, T_GE64, T_ULT64, T_ULE64, T_UGT64, T_UGE64, T_ICMP64, T_UCMP64,+                T_ITOI64, T_I64TOI, T_UTOU64, T_U64TOU,+                T_FPADD, T_FP2P, T_FPNEW, T_FPFIN,+                T_FP2BS, T_BS2FP,+                T_TOPTR, T_TOINT, T_TODBL, T_TOFLT, T_TOFUNPTR,+                T_FROMDBL, T_FROMFLT,+                T_BININT2, T_BININT1, T_UNINT1,+                T_BININT64_2, T_BININT64_1, T_UNINT64_1,+                T_BINFLT2, T_BINFLT1, T_UNFLT1,+                T_BINDBL2, T_BINDBL1, T_UNDBL1,+                T_BINBS2, T_BINBS1,+                T_ISINT,+                T_FADD, T_FSUB, T_FMUL, T_FDIV, T_FNEG, T_ITOF, T_I64TOF,+                T_FEQ, T_FNE, T_FLT, T_FLE, T_FGT, T_FGE,+                T_DADD, T_DSUB, T_DMUL, T_DDIV, T_DNEG, T_ITOD, T_I64TOD,+                T_DEQ, T_DNE, T_DLT, T_DLE, T_DGT, T_DGE,+                T_ARR_ALLOC, T_ARR_COPY, T_ARR_SIZE, T_ARR_READ, T_ARR_WRITE, T_ARR_TRUNC, T_ARR_EQ,+                T_RAISE, T_SEQ, T_RNF,+                T_TICK,+                T_IO_BIND, T_IO_THEN, T_IO_RETURN,+                T_IO_SERIALIZE, T_IO_DESERIALIZE,+                T_IO_GETARGREF,+                T_IO_PERFORMIO, T_IO_PRINT, T_CATCH, T_CATCHR,+                T_IO_CCALL,+                T_IO_GC, T_IO_STATS,+                T_DYNSYM,+                T_IO_FORK, T_IO_THID, T_THNUM, T_IO_THROWTO, T_IO_YIELD,+                T_IO_NEWMVAR,+                T_IO_TAKEMVAR, T_IO_PUTMVAR, T_IO_READMVAR,+                T_IO_TRYTAKEMVAR, T_IO_TRYPUTMVAR, T_IO_TRYREADMVAR,+                T_IO_THREADDELAY, T_IO_THREADSTATUS,+                T_IO_GETMASKINGSTATE, T_IO_SETMASKINGSTATE,+                T_NEWCASTRINGLEN, T_PACKCSTRING, T_PACKCSTRINGLEN,+                T_BSAPPEND, T_BSEQ, T_BSNE, T_BSLT, T_BSLE, T_BSGT, T_BSGE, T_BSCMP,+                T_BSPACK, T_BSUNPACK, T_BSREPLICATE, T_BSLENGTH, T_BSSUBSTR, T_BSINDEX, T_BSWRITE,+                T_BSFROMUTF8, T_BSTOUTF8, T_BSHEADUTF8, T_BSTAILUTF8,+                T_BSAPPENDDOT, T_BSGRAB,+                T_SPNEW, T_SPDEREF, T_SPFREE,+                T_WKNEWFIN, T_WKNEW, T_WKDEREF, T_WKFINAL,+                T_IO_PP,           /* for debugging */+                T_IO_STDIN, T_IO_STDOUT, T_IO_STDERR,+                T_LAST_TAG,+};++#if WANT_TAGNAMES+/* Most entries are initialized from the primops table. */+static const char* tag_names [T_LAST_TAG+1] =+  { "FREE", "IND", "AP", "INT", "INT64", "DBL", "FLT32", "PTR",+    "FUNPTR", "FORPTR", "BADDYN", "ARR", "THID", "MVAR", "WEAK" };+#define TAGNAME(t) tag_names[t]+#else+#define TAGNAME(t) "?"+#endif++/* On 64 bit platforms there is no special type for Int64 */+#if NEED_INT64+#define T_INT64 T_INT64X+#else+#define T_INT64 T_INT+#endif  /* WORD_SIZE == 64 */++struct ioarray;+struct bytestring;+struct forptr;+struct mthread;+struct mvar;+struct weak_ptr;++typedef struct PACKED node {+  union {+    struct node *uufun;+    intptr_t     uuifun;+    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;+#if WANT_FLOAT32+    flt32_t         uuflt32value;+    uint32_t        uuint32value;+#endif  /* WANT_FLOAT32 */+#if WANT_FLOAT64+    flt64_t         uuflt64value;+#endif  /* WANT_FLOAT32 */+#if WANT_INT64+    int64_t         uuint64value;+#endif  /* WANT_INT64 */+    const char     *uucstring;+    void           *uuptr;+    HsFunPtr        uufunptr;+    struct ioarray *uuarray;+    struct forptr  *uuforptr;      /* foreign pointers and byte arrays */+    struct mthread *uuthread;+    struct mvar    *uumvar;+    struct weak_ptr *uuweak;+  } uarg;+} node;+#define BIT_TAG   1+#define BIT_IND   2+#define BIT_NOTAP (BIT_TAG | BIT_IND)+#define TAG_SHIFT 2++#define NIL 0+#define HEAPREF(i) &cells[(i)]+#define GETTAG(p) ((p)->ufun.uutag & BIT_NOTAP ? ( (p)->ufun.uutag & BIT_IND ? T_IND : (int)((p)->ufun.uutag >> TAG_SHIFT) ) : T_AP)+#define SETTAG(p,t) do { if (t != T_AP) { if (t == T_IND) { (p)->ufun.uutag = BIT_IND; } else { (p)->ufun.uutag = ((t) << TAG_SHIFT) | BIT_TAG; } } } while(0)+#define GETVALUE(p) (p)->uarg.uuvalue+#define GETINT64VALUE(p) (p)->uarg.uuint64value+#define GETINT32VALUE(p) (p)->uarg.uuint32value+#define GETFLTVALUE(p) (p)->uarg.uuflt32value+#define GETDBLVALUE(p) (p)->uarg.uuflt64value+#define SETVALUE(p,v) (p)->uarg.uuvalue = v+#define SETINT64VALUE(p,v) (p)->uarg.uuint64value = v+#define SETINT32VALUE(p,v) (p)->uarg.uuint32value = v+#define SETFLTVALUE(p,v) (p)->uarg.uuflt32value = v+#define SETDBLVALUE(p,v) (p)->uarg.uuflt64value = v+#define FUN(p) (p)->ufun.uufun+#define ARG(p) (p)->uarg.uuarg+#define CSTR(p) (p)->uarg.uucstring+#define PTR(p) (p)->uarg.uuptr+#define FUNPTR(p) (p)->uarg.uufunptr+#define FORPTR(p) (p)->uarg.uuforptr+#define BSTR(p) (p)->uarg.uuforptr->payload+#define ARR(p) (p)->uarg.uuarray+#define THR(p) (p)->uarg.uuthread+#define MVAR(p) (p)->uarg.uumvar+#define ISINDIR(p) ((p)->ufun.uuifun & BIT_IND)+#define WEAK(p) (p)->uarg.uuweak+#define GETINDIR(p) ((struct node*) ((p)->ufun.uuifun & ~BIT_IND))+#define SETINDIR(p,q) do { (p)->ufun.uuifun = (intptr_t)(q) | BIT_IND; } while(0)+#define NODE_SIZE sizeof(node)+#define ALLOC_HEAP(n) do { cells = mmalloc(n * sizeof(node)); } while(0)+#define LABEL(n) ((heapoffs_t)((n) - cells))+node *cells;                 /* All cells */++/*+ * byte arrays+ */+struct bytestring {+  size_t size;+  void *string;+};++/*+ * Arrays are allocated with malloc()/free().+ * During GC they are marked, and all elements in the array are+ * recursively marked.+ * At the end of the the mark phase there is a scan of all+ * arrays, and the unmarked ones are freed.+ */+struct ioarray {+  struct ioarray *next;         /* all ioarrays are linked together */+  bool permanent;               /* this array should never be GC-ed */+  size_t marked;                /* marked during GC */+  size_t size;                  /* number of elements in the array */+  NODEPTR array[1];             /* actual size may be bigger */+};+struct ioarray *array_root = 0; /* root of all allocated arrays, linked by next */++enum fptype {+  FP_FORPTR = 0,                /* a regular foreign pointer to unknown memory */+  FP_BSTR,                      /* a bytestring */+  FP_MPZ,                       /* a GMP MPZ pointer */+};++/*+ * A Haskell ForeignPtr has a normal pointer, and a finalizer+ * function that is to be called when there are no more references+ * to the ForeignPtr.+ * A complication is that using plusForeignPtr creates a new+ * ForeignPtr that must share the same finalizer.+ * There is one struct forptr for each ForeignPtr.  It has pointer+ * to the actual data, and to a struct final which is shared between+ * all ForeignPtrs that have been created with plusForeignPtr.+ * During GC the used bit is set for any references to the forptr.+ * The scan phase will traverse the struct final chain and run+ * the finalizer, and free associated structs.+ */+struct final {+  struct final  *next;      /* the next finalizer */+  HsFunPtr       final;     /* function to call to release resource */+  void          *arg;       /* argument to final when called */+  size_t         size;      /* size of memory, if known, otherwise NOSIZE */+#define NOSIZE ~0           /* used as the size in payload for actual foreign pointers */+  struct forptr *back;      /* back pointer to the first forptr */+  short          marked;    /* mark bit for GC */+  enum fptype    fptype;    /* what kind of foreign pointer */+};++/*+ * Foreign pointers are also used to represent bytestrings.+ * The difference between a foreign pointer and a bytestring+ * is that we can serialize the latter.+ * The size field is non-zero only for bytestrings.+ */+struct forptr {+  struct forptr *next;       /* the next ForeignPtr that shares the same finalizer */+  struct final  *finalizer;  /* the finalizer for this ForeignPtr */+  struct bytestring payload; /* the actual pointer to allocated data, and maybe a size */+  //  char          *desc;+};+struct final *final_root = 0;   /* root of all allocated foreign pointers, linked by next */++//REGISTER(counter_t num_reductions,r19);+counter_t num_reductions = 0;+counter_t num_alloc = 0;+counter_t num_gc = 0;+counter_t num_yield = 0;+counter_t num_resched = 0;+counter_t num_thread_reap = 0;+counter_t num_mvar_alloc = 0;+counter_t num_mvar_free = 0;+counter_t num_stable_alloc = 0;+counter_t num_stable_free = 0;+counter_t num_new_weak = 0;+counter_t num_gc_weak = 0;+uintptr_t gc_mark_time = 0;+uintptr_t gc_scan_time = 0;+uintptr_t run_time = 0;++#define MAIN_THREAD 1+uvalue_t num_thread_create = MAIN_THREAD;++#define MAXSTACKDEPTH 0+#if MAXSTACKDEPTH+stackptr_t max_stack_depth = 0;+counter_t max_c_stack = 0;+counter_t cur_c_stack = 0;+#define MAXSTACK if (stack_ptr > max_stack_depth) max_stack_depth = stack_ptr+#else+#define MAXSTACK+#endif++NODEPTR atptr;++REGISTER(NODEPTR *stack,r20);+REGISTER(stackptr_t stack_ptr,r21);+#if STACKOVL+#define PUSH(x) do { if (stack_ptr >= stack_size-2) stackerr(); stack[++stack_ptr] = (x); MAXSTACK; } while(0)+#else  /* STACKOVL */+#define PUSH(x) do {                                            stack[++stack_ptr] = (x); MAXSTACK; } while(0)+#endif  /* STACKOVL */+#define TOP(n) stack[stack_ptr - (n)]+#define POP(n) stack_ptr -= (n)+#define POPTOP() stack[stack_ptr--]+#define GCCHECK(n) gc_check((n))+#define CLEARSTK() do { stack_ptr = -1; } while(0)+#define GCCHECKSAVE(p, n) do { PUSH(p); GCCHECK(n); (p) = TOP(0); POP(1); } while(0)++heapoffs_t heap_size;       /* number of heap cells */+heapoffs_t heap_start;      /* first location in heap that needs GC */+REGISTER(stackptr_t stack_size,r22);      /* number of stack slots */++counter_t num_marked;+counter_t max_num_marked = 0;+counter_t num_free;+counter_t num_arr_alloc;+counter_t num_arr_free;+counter_t num_fin_alloc;+counter_t num_fin_free;+counter_t num_bs_alloc;+counter_t num_bs_alloc_max;+counter_t num_bs_free;+counter_t num_bs_bytes;+counter_t num_bs_inuse;+counter_t num_bs_inuse_max;++#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;++int want_gc_red = 0;++NORETURN void+memerr(void)+{+  ERR("Out of memory");+}++NORETURN+void+stackerr(void)+{+  ERR("stack overflow");+}++/***************************************/++#include "bfile.c"++/***************************************/++struct ioarray*+arr_alloc(size_t sz, NODEPTR e)+{+  struct ioarray *arr = mmalloc(sizeof(struct ioarray) + (sz-1) * sizeof(NODEPTR));+  size_t i;++  arr->next = array_root;+  array_root = arr;+  arr->marked = 0;+  arr->permanent = false;+  arr->size = sz;+  for(i = 0; i < sz; i++)+    arr->array[i] = e;+  //PRINT("arr_alloc(%d, %p) = %p\n", (int)sz, e, arr);+  num_arr_alloc++;+  return arr;+}++struct ioarray*+arr_copy(struct ioarray *oarr)+{+  size_t sz = oarr->size;+  struct ioarray *arr = mmalloc(sizeof(struct ioarray) + (sz-1) * sizeof(NODEPTR));++  arr->next = array_root;+  array_root = arr;+  arr->marked = 0;+  arr->permanent = false;+  arr->size = sz;+  memcpy(arr->array, oarr->array, sz * sizeof(NODEPTR));+  num_arr_alloc++;+  return arr;+}++/*****************************************************************************/++#if WANT_TICK+struct tick_entry {+  struct bytestring tick_name;+  counter_t tick_count;+} *tick_table = 0;+size_t tick_table_size;+size_t tick_index;++/* Allocate a new tick table entry and return the index. */+size_t+add_tick_table(struct bytestring name)+{+  if (!tick_table) {+    tick_table_size = 100;+    tick_table = mmalloc(tick_table_size * sizeof(struct tick_entry));+    tick_index = 0;+  }+  if (tick_index >= tick_table_size) {+    tick_table_size *= 2;+    tick_table = mrealloc(tick_table, tick_table_size * sizeof(struct tick_entry));+  }+  tick_table[tick_index].tick_name = name;+  tick_table[tick_index].tick_count = 0;+  return tick_index++;+}++/* Called with the tick index. */+static inline void+dotick(value_t i)+{+  tick_table[i].tick_count++;+}++void+dump_tick_table(FILE *f)+{+  if (!tick_table) {+    fprintf(f, "Tick table empty\n");+    return;+  }+  for (size_t i = 0; i < tick_index; i++) {+    counter_t n = tick_table[i].tick_count;+    if (n)+      fprintf(f, "%-60s %10"PRIcounter"\n", (char *)tick_table[i].tick_name.string, n);+  }+}+#endif++enum th_sched { mt_main, mt_resched, mt_raise };+/* The two enums below are known by the Haskell code.  Do not change order */+enum th_state { ts_runnable, ts_wait_mvar, ts_wait_time, ts_finished, ts_died };+enum mask_state { mask_unmasked, mask_interruptible, mask_uninterruptible };++/***************** HANDLER *****************/++struct handler {+  jmp_buf         hdl_buf;      /* env storage */+  struct handler *hdl_old;      /* old handler */+  NODEPTR         hdl_exn;      /* used temporarily to pass the exception value */+} *cur_handler = 0;++/***************** THREAD ******************/++struct mthread {+  enum th_state   mt_state;      /* thread state */+  enum mask_state mt_mask;       /* making state. */+  struct mthread *mt_next;       /* all threads linked together */+  struct mthread *mt_queue;      /* runq/waitq link */+  counter_t       mt_slice;      /* reduction steps until yielding */+  counter_t       mt_num_slices; /* number of slices so far */+  NODEPTR         mt_root;       /* root of the graph to reduce */+  struct mvar    *mt_exn;        /* possible thrown exception */+  NODEPTR         mt_mval;       /* filled after waiting for take/read */+  bool            mt_mark;       /* marked as accessible */+  uvalue_t        mt_id;         /* thread number, thread 1 is the main thread */+#if defined(CLOCK_INIT)+  CLOCK_T         mt_at;         /* time to wake up when in threadDelay */+#endif+};+struct mthread  *all_threads = 0;   /* all threads */++struct mqueue {+  struct mthread *mq_head;+  struct mthread *mq_tail;+};+struct mqueue runq = { 0, 0 };;+struct mqueue timeq = { 0, 0 };++struct mvar {+  struct mvar    *mv_next;      /* all mvars linked together */+  NODEPTR         mv_data;      /* contents of the mvar, or NIL when empty */+  struct mqueue   mv_takeput;   /* queue of threads waiting for take or put, single wakeup */+  struct mqueue   mv_read;      /* queue of threads waiting for read, multiple wakeup */+  bool            mv_mark;      /* marked as accessible */+};+struct mvar      *all_mvars = 0;   /* all mvars */++jmp_buf          sched;             /* jump here to yield */+counter_t        slice = SLICE;     /* normal time slice;+                                     * on an M4 Mac this is about 0.3ms */+//REGISTER(counter_t glob_slice,r23);+REGISTER(int glob_slice,r23);++NODEPTR          the_exn;       /* Used to propagate the exception for longjmp(sched, mt_raise) */++/****** StablePtr ******/++size_t sp_capacity = 4;         /* size of stable pointer table */+NODEPTR *sp_table;              /* stable pointer table */++static void+init_stableptr(void)+{+  sp_table = mmalloc(sp_capacity * sizeof(NODEPTR)); /* stable pointer table, all free */+  for (size_t i = 0; i < sp_capacity; i++)+    sp_table[i] = NIL;+}  ++static uvalue_t+new_stableptr(NODEPTR n)+{+  size_t i;++  COUNT(num_stable_alloc);+  /* Linear search for an empty slot. */+  /* Not ideal, but fine for a small number of StablePtr. */+  for(i = 1; i < sp_capacity; i++) { /* index 0 reserved according to the spec */+    if (sp_table[i] == NIL)+      break;+  }+  if (i == sp_capacity) {+    /* table is full, so double its size */+    sp_capacity *= 2;+    sp_table = mrealloc(sp_table, sp_capacity * sizeof(NODEPTR));+    for(size_t j = i; j < sp_capacity; j++)+      sp_table[j] = NIL;+  }+  sp_table[i] = n;+  return (uvalue_t)i;+}++static NODEPTR+deref_stableptr(uvalue_t sp)+{+  if (sp_table[sp] == NIL || sp >= sp_capacity)+    ERR("deref_stableptr");+  return sp_table[sp];+}++static void+free_stableptr(uvalue_t sp)+{+  if (sp_table[sp] == NIL || sp >= sp_capacity)+    ERR("free_stableptr");+  COUNT(num_stable_free);+  sp_table[sp] = NIL;+}++/* The order of these must be kept in sync with Control.Exception.Internal.rtsExn */+enum rts_exn { exn_stackoverflow, exn_heapoverflow, exn_threadkilled, exn_userinterrupt, exn_dividebyzero, exn_blockedmvar, exn_blockedstm };++NORETURN void raise_exn(NODEPTR exn);+struct mvar* new_mvar(void);+NODEPTR take_mvar(bool try, struct mvar *mv);+NORETURN void die_exn(NODEPTR exn);+void thread_intr(struct mthread *mt);+int put_mvar(bool try, struct mvar *mv, NODEPTR v);+NODEPTR mkInt(value_t i);+NODEPTR mkInt64(int64_t i);+NODEPTR mkFlt32(flt32_t d);+NODEPTR mkFlt64(flt64_t d);+NODEPTR mkPtr(void* p);+struct mthread* new_thread(NODEPTR root);+void gc(void);+void async_throwto(struct mthread*, NODEPTR);++#if WANT_STDIO+void pp(FILE*, NODEPTR);+#endif++/* Needed during reduction */+NODEPTR intTable[HIGH_INT - LOW_INT];+NODEPTR combK, combTrue, combI, combCons, combPair;+NODEPTR combCC, combZ, combIOBIND, combIORETURN, combIOTHEN, combB, combC, combBB;+NODEPTR combSETMASKINGSTATE;+NODEPTR combLT, combEQ, combGT;+NODEPTR combPERFORMIO;+NODEPTR combShowExn, combU, combK2, combK3;+NODEPTR combBININT1, combBININT2, combUNINT1;+NODEPTR combBININT64_1, combBININT64_2, combUNINT64_1;+NODEPTR combBINFLT1, combBINFLT2, combUNFLT1;+NODEPTR combBINDBL1, combBINDBL2, combUNDBL1;+NODEPTR combBINBS1, combBINBS2;+NODEPTR comb_stdin, comb_stdout, comb_stderr;+NODEPTR combJust;+NODEPTR combTHROWTO;+NODEPTR combPairUnit;+NODEPTR combWorld;+NODEPTR combCATCHR;+#define combFalse combK+#define combNothing combK+#define combUnit combI++/*******************************/++#if WANT_ARGS+/* This single element array hold a list of the program arguments. */+struct ioarray *argarray;+#endif  /* WANT_ARGS */++int verbose = 0;+int gcbell = 0;+++#if WANT_SIGINT+volatile bool has_sigint = false;+void+handle_sigint(int s)+{+  has_sigint = true;+}+#endif++/* Check that there are k nodes available, if not then GC. */+INLINE void+gc_check(size_t k)+{+  if (k < num_free)+    return;+#if WANT_STDIO+  if (verbose > 1)+    PRINT("gc_check: %d\n", (int)k);+#endif+  gc();+}++/* Add the thread to the tail of runq */+void+add_q_tail(struct mqueue *q, struct mthread *mt)+{+  if (!q->mq_head) {+    /* q is empty, so mt goes first */+    q->mq_head = mt;+  } else {+    /* link mt to the end of the runq */+    q->mq_tail->mt_queue = mt;+  }+  q->mq_tail = mt;               /* mt is now last */+  mt->mt_queue = 0;           /* mt is last, so no next */+}++void+add_runq_tail(struct mthread *mt)+{+  mt->mt_state = ts_runnable;+  add_q_tail(&runq, mt);+}++struct mthread*+remove_q_head(struct mqueue *q)+{+  struct mthread *mt = q->mq_head; /* front thread */+  if (!mt)+    return 0;+  q->mq_head = mt->mt_queue;       /* skip to next thread */+  if (!q->mq_head)+    q->mq_tail = 0;                /* q is now empty */+  return mt;+}++int+find_and_unlink(struct mqueue *mq, struct mthread *mt)+{+  struct mthread **mtp;+  +  for(mtp = &mq->mq_head; *mtp && *mtp != mt; mtp = &(*mtp)->mt_queue)+    ;+  if (!*mtp)+    return 0;                   /* not found */+  *mtp = mt->mt_queue;          /* unlink */+  if (*mtp)+    return 1;                   /* the unlinked thread was not the tail */+  if (mq->mq_head) {+    for (mt = mq->mq_head; mt->mt_queue; mt = mt->mt_queue)+      ;                         /* find the last element */+    mq->mq_tail = mt;+  } else {+    /* q is empty */+    mq->mq_tail = 0;+  }+  return 1;+}++/* This is a yucky hack */+bool doing_rnf = false;              /* REMOVE */+#if THREAD_DEBUG+const bool thread_trace = false;+#endif  /* THREAD_DEBUG */++/* clean up temporary globals to prepare for rescheduling */+void+cleanup(struct mthread *mt, enum th_state ts)+{+  /* We are going to reschedule, so clean up thread state:+   *  stack pointer+   *  error handlers+   */+#if THREAD_DEBUG+  if (thread_trace)+    printf("cleanup: %d state=%d\n", (int)mt->mt_id, ts);+#endif  /* THREAD_DEBUG */+  mt->mt_slice = stack_ptr;   /* we need stack_ptr reductions to just reach where we left off */+  mt->mt_state = ts;+  CLEARSTK();                 /* reset stack */+  doing_rnf = false;+  /* free all error handlers */+  for (struct handler *h = cur_handler; h; ) {+    struct handler *n = h;+    h = h->hdl_old;+    free(n);+  }+  cur_handler = 0;+}++/* reschedule, does not return */+NORETURN void+resched(struct mthread *mt, enum th_state ts)+{+  cleanup(mt, ts);+  longjmp(sched, mt_resched);+}++#if THREAD_DEBUG+void+dump_q(const char *s, struct mqueue q)+{+  printf("   %s=[", s);+  for(struct mthread *mt = q.mq_head; mt; mt = mt->mt_queue) {+    printf("%d ", (int)mt->mt_id);+  }+  printf("]\n");+}+#endif  /* THREAD_DEBUG */++/* Check if its time to wake up some threads waiting for a time. */+void+check_timeq(void)+{+#if defined(CLOCK_INIT)+  CLOCK_T now = CLOCK_GET();+  while (timeq.mq_head && timeq.mq_head->mt_at <= now) {+    struct mthread *mt = remove_q_head(&timeq);+    add_runq_tail(mt);+    mt->mt_at = -1;             /* indicate that the delay has expired */+#if THREAD_DEBUG+    if (thread_trace)+      printf("check_timeq: %d done\n", (int)mt->mt_id);+#endif  /* THREAD_DEBUG */+  }+#if THREAD_DEBUG+  if (thread_trace) {+    printf("check_timeq: exit\n");+    dump_q("runq", runq);+  }+#endif  /* THREAD_DEBUG */+#endif+}++void+throwto(struct mthread *mt, NODEPTR exn)+{+#if THREAD_DEBUG+  if (thread_trace) {+    printf("throwto: id=%d\n", (int)mt->mt_id);+  }+#endif  /* THREAD_DEBUG */+  thread_intr(mt);+  if (mt->mt_state != ts_died && mt->mt_state != ts_finished) {+#if THREAD_DEBUG+    if (thread_trace) {+      printf("throwto: id=%d put_mvar exn\n", (int)mt->mt_id);+    }+#endif  /* THREAD_DEBUG */+    (void)put_mvar(false, mt->mt_exn, exn); /* never returns if it blocks */+  }+}++void+check_thrown(bool intr)+{+  if (runq.mq_head->mt_exn->mv_data == NIL)+    return;            /* no thrown exception */+  if (runq.mq_head->mt_mask == mask_uninterruptible ||+      (!intr && runq.mq_head->mt_mask == mask_interruptible)) {+    return;            /* interrupts are masked, so don't throw */+  }+  /* the current thread has an async exception */+#if THREAD_DEBUG+  if (thread_trace)+    printf("check_thrown: exn for %d\n", (int)runq.mq_head->mt_id);+#endif  /* THREAD_DEBUG */+  NODEPTR exn = take_mvar(false, runq.mq_head->mt_exn); /* get the exception */+  raise_exn(exn);+}++void+check_sigint(void)+{+#if WANT_SIGINT+  if (has_sigint) {+    /* We have a signal, so send an async exception  to the main thread */+    has_sigint = false;+    for(struct mthread *mt= all_threads; mt; mt = mt->mt_next) {+      if (mt->mt_id == MAIN_THREAD) {+#if THREAD_DEBUG+        if (thread_trace)+          printf("sending signal to main\n");+#endif  /* THREAD_DEBUG */+        async_throwto(mt, mkInt(exn_userinterrupt));+        break;+      }+    }+  }+#endif+}++/* Used to detect calls to error while we are already in a call to error. */+bool in_raise = false;++/* Inlining makes very little difference */+/*static INLINE*/ void+yield(void)+{+  if (in_raise)                 /* don't context switch when we are dying */+    return;+  COUNT(num_yield);+  runq.mq_head->mt_num_slices++;+  // XXX should check mt_thrown here+  +  if (timeq.mq_head)+    check_timeq();+  check_thrown(false);+  check_sigint();+  // printf("yield %p %d\n", runq, (int)stack_ptr);+  /* if there is nothing after in the runq then there is no need to reschedule */+  if (!runq.mq_head->mt_queue) {+#if THREAD_DEBUG+    if (thread_trace) {+      printf("yield: %d no other threads\n", (int)runq.mq_head->mt_id);+      dump_q("runq", runq);+    }+#endif  /* THREAD_DEBUG */+    glob_slice = slice;+    num_reductions += glob_slice-1;+    return;+  }++  /* Unlink from runq */+  struct mthread *mt = remove_q_head(&runq);+  /* link into back of runq */+  add_runq_tail(mt);+#if THREAD_DEBUG+  if (thread_trace) {+    printf("yield: resched %d\n", (int)mt->mt_id);+    dump_q("runq", runq);+  }+#endif  /* THREAD_DEBUG */+  resched(mt, ts_runnable);+}++struct mthread*+new_thread(NODEPTR root)+{+  struct mthread *mt = mmalloc(sizeof(struct mthread));++#if THREAD_DEBUG+  if (thread_trace) {+    printf("new_thread: mt=%p root=%p\n", mt, root);+  }+#endif  /* THREAD_DEBUG */+  mt->mt_mask = mask_unmasked;+  mt->mt_root = root;+  mt->mt_exn = new_mvar();+  mt->mt_mval = NIL;+  mt->mt_slice = 0;+  mt->mt_mark = false;+  mt->mt_num_slices = 0;+  mt->mt_id = num_thread_create++;+#if defined(CLOCK_INIT)+  mt->mt_at = 0;                /* delay has not expired */+#endif++  /* add to all_threads */+  mt->mt_next = all_threads;+  all_threads = mt;++  /* add to tail of runq */+  add_runq_tail(mt);            /* sets runnable */+#if THREAD_DEBUG+  if (thread_trace) {+    printf("new_thread: add %d to runq tail\n", (int)mt->mt_id);+    dump_q("runq", runq);+  }+#endif  /* THREAD_DEBUG */+  return mt;+}++struct mvar*+new_mvar(void)+{+  COUNT(num_mvar_alloc);+  struct mvar *mv = mmalloc(sizeof(struct mvar));++  mv->mv_data = NIL;+  mv->mv_takeput.mq_head = 0;+  mv->mv_takeput.mq_tail = 0;+  mv->mv_read.mq_head = 0;+  mv->mv_read.mq_tail = 0;++  /* add to all_mvars */+  mv->mv_next = all_mvars;+  mv->mv_mark = false;+  all_mvars = mv;+  +#if THREAD_DEBUG+  if (thread_trace)+    printf("new_mvar: mvar=%p\n", mv);+#endif  /* THREAD_DEBUG */+  return mv;+}++NODEPTR+take_mvar(bool try, struct mvar *mv)+{+#if THREAD_DEBUG+  if (thread_trace) {+    printf("take_mvar: start mvar=%p\n", mv);+    dump_q("takeput", mv->mv_takeput);+  }+#endif  /* THREAD_DEBUG */+  NODEPTR n;+  if ((n = runq.mq_head->mt_mval) != NIL) {+#if THREAD_DEBUG+    if (thread_trace)+      printf("take_mvar: end mvar=%p got data %d\n", mv, (int)runq.mq_head->mt_id);+#endif  /* THREAD_DEBUG */+    /* We have no data after waking up */+    runq.mq_head->mt_mval = NIL;+    return n;                   /* returned the stashed data */+  }+  if ((n = mv->mv_data) != NIL) {+#if THREAD_DEBUG+    if (thread_trace)+      printf("take_mvar: mvar=%p full\n", mv);+#endif  /* THREAD_DEBUG */+    /* mvar is full */+    mv->mv_data = NIL;           /* now empty */+    /* move all threads waiting to put to the runq */+    for(;;) {+      struct mthread *mt = remove_q_head(&mv->mv_takeput);+      if (!mt)+        break;+#if THREAD_DEBUG+      if (thread_trace) {+        printf("take_mvar: mvar=%p wake %d\n", mv, (int)mt->mt_id);+      }+#endif  /* THREAD_DEBUG */+      add_runq_tail(mt);+#if THREAD_DEBUG+      if (thread_trace) {+        dump_q("runq", runq);+      }+#endif  /* THREAD_DEBUG */+    }+#if THREAD_DEBUG+    if (thread_trace) {+      printf("take_mvar: end mvar=%p return %p\n", mv, n);+    }+#endif  /* THREAD_DEBUG */+    return n;                   /* return the data */+  } else {+#if THREAD_DEBUG+    if (thread_trace)+      printf("take_mvar: mvar=%p empty\n", mv);+#endif  /* THREAD_DEBUG */+    /* mvar is empty */+    if (try)+      return NIL;+    struct mthread *mt = remove_q_head(&runq);+    add_q_tail(&mv->mv_takeput, mt);+#if THREAD_DEBUG+    if (thread_trace) {+      printf("take_mvar: end mvar=%p suspend %d\n", mv, (int)mt->mt_id);+      dump_q("runq", runq);+      dump_q("takeput", mv->mv_takeput);+    }+#endif  /* THREAD_DEBUG */+    /* Unlink from runq */+    resched(mt, ts_wait_mvar);    /* never returns */+    NOTREACHED;+  }+}++NODEPTR+read_mvar(bool try, struct mvar *mv)+{+  NODEPTR n;+  if ((n = runq.mq_head->mt_mval) != NIL) {+    /* We have no data after waking up */+    runq.mq_head->mt_mval = NIL;+    return n;                   /* returned the stashed data */+  }+  if ((n = mv->mv_data) != NIL) {+    /* mvar is full */+    return n;                   /* return the data */+  } else {+    /* mvar is empty */+    if (try)+      return NIL;+#if THREAD_DEBUG+    if (thread_trace) {+      printf("read_mvar: suspend %d\n", (int)runq.mq_head->mt_id);+      dump_q("runq", runq);+    }+#endif  /* THREAD_DEBUG */+    struct mthread *mt = remove_q_head(&runq);+    add_q_tail(&mv->mv_read, mt);+    resched(mt, ts_wait_mvar);                /* never returns */+    NOTREACHED;+  }+}++int+put_mvar(bool try, struct mvar *mv, NODEPTR v)+{+#if THREAD_DEBUG+  if (thread_trace) {+    printf("put_mvar: mvar=%p\n", mv);+    dump_q("takeput", mv->mv_takeput);+    dump_q("read", mv->mv_read);+  }+#endif  /* THREAD_DEBUG */+  if (mv->mv_data != NIL) {+#if THREAD_DEBUG+    if (thread_trace)+      printf("put_mvar: mvar=%p full\n", mv);+#endif  /* THREAD_DEBUG */+    /* mvar is full */+    if (try)+      return 0;+    struct mthread *mt = remove_q_head(&runq);+    add_q_tail(&mv->mv_takeput, mt); /* put on mvar queue */+#if THREAD_DEBUG+    if (thread_trace) {+      printf("put_mvar: suspend %d\n", (int)mt->mt_id);+      dump_q("runq", runq);+      dump_q("takeput", mv->mv_takeput);+    }+#endif  /* THREAD_DEBUG */+    resched(mt, ts_wait_mvar);                  /* never returns */+  } else {+#if THREAD_DEBUG+    if (thread_trace)+      printf("put_mvar: mvar=%p empty\n", mv);+#endif  /* THREAD_DEBUG */+    /* mvar is empty */+    if (mv->mv_takeput.mq_head || mv->mv_read.mq_head) {+      /* one or more threads are waiting */+      struct mthread *mt;+      if ((mt = remove_q_head(&mv->mv_takeput))) {+        /* wake up one 'take' */+#if THREAD_DEBUG+        if (thread_trace)+          printf("put_mvar: wake-1 %d\n", (int)mt->mt_id);+#endif  /* THREAD_DEBUG */+        add_runq_tail(mt);             /* and schedule for execution later */+        mt->mt_mval = v;+      }+      for(;;) {+        mt = remove_q_head(&mv->mv_takeput);+        if (!mt)+          break;+#if THREAD_DEBUG+        if (thread_trace)+          printf("put_mvar: wake-N %d\n", (int)mt->mt_id);+#endif  /* THREAD_DEBUG */+        mt->mt_mval = v;               /* value for restarted read */+        add_runq_tail(mt);             /* and schedule for execution later */+      }+#if THREAD_DEBUG+      if (thread_trace) {+        printf("put_mvar: end\n");+        dump_q("runq", runq);+      }+#endif  /* THREAD_DEBUG */+      /* return to caller */+    } else {+#if THREAD_DEBUG+      if (thread_trace) {+        printf("put_mvar: mvar=%p no waiters\n", mv);+      }+#endif  /* THREAD_DEBUG */+      /* no threads waiting, so store the value */+      mv->mv_data = v;+      /* return to caller */+    }+  }+  return 1;+}++NORETURN void+thread_delay(uvalue_t usecs)+{+#if !defined(CLOCK_INIT)+  ERR("thread_delay: no clock");+#else+  /* XXX should check if there is already a throw exn */+  struct mthread *mt = remove_q_head(&runq);+  mt->mt_at = CLOCK_GET() + usecs; /* wakeup time */+#if THREAD_DEBUG+  if (thread_trace)+    printf("thread_delay: id=%d usecs=%ld\n", (int)mt->mt_id, (long)usecs);+#endif  /* THREAD_DEBUG */+  /* insert in delayq which is kept sorted in time order */+  struct mthread **tq;+  for (tq = &timeq.mq_head; *tq; tq = &(*tq)->mt_queue) {+    if (mt->mt_at <= (*tq)->mt_at)+      break;+  }+  mt->mt_queue = *tq;           /* forward link */+  *tq = mt;                     /* and put mt in place */+  if (!mt->mt_queue)            /* no forward link */+    timeq.mq_tail = mt;+  resched(mt, ts_wait_time);+#endif  +}++/* Pause execution if something might still happen */+void+pause_exec(void)+{+#if defined(CLOCK_INIT)+  if (timeq.mq_head) {+    struct mthread *mt;+    while (!runq.mq_head && (mt = timeq.mq_head)) {+      /* We are waiting for a delay to expire, so sleep a while */+      CLOCK_T dly = mt->mt_at - CLOCK_GET();+      if (dly > 0) {+        /* usleep() can be unreliable, so sleep shorter than the delay */+        dly /= 4;+        if (dly < 50) dly = 50;+        CLOCK_SLEEP((useconds_t)dly);+      }+      check_timeq();+    }+  } else {+#if THREAD_DEBUG+    if (0) {+      dump_q("runq", runq);+      dump_q("timeq", timeq);+      if (0) {+        for(struct mvar *mv = all_mvars; mv; mv = mv->mv_next) {+          printf("mvar %p, data=%p\n", mv, mv->mv_data);+          dump_q("takeput", mv->mv_takeput);+        }+      }+      for(struct mthread *mt = all_threads; mt; mt = mt->mt_next) {+        if (mt->mt_exn->mv_data != NIL) {+          printf("### bad thread ThreadId#%d mask=%d state=%d\n", (int)mt->mt_id, mt->mt_mask, mt->mt_state);+        }+      }+    }+#endif               /* THREAD_DEBUG */+    ERR("deadlock");            /* XXX throw async to main thread */+  }+#else  /* CLOCK_INIT */+  ERR("no clock");+#endif  /* CLOCK_INIT */+}++/* Interrupt a sleeping thread in a throwTo/threadDelay */+void+thread_intr(struct mthread *mt)+{+#if THREAD_DEBUG+  if (thread_trace)+    printf("thread_intr: id=%d state=%d\n", (int)mt->mt_id, mt->mt_state);+#endif  /* THREAD_DEBUG */+  switch(mt->mt_state) {+  case ts_runnable:+    break;                      /* already on runq */+  case ts_wait_mvar:+    if (mt->mt_mask == mask_uninterruptible) /* uninterruptible */+      break;+    /* we don't know which mvar we are waiting on, so look at all of them */+    /* XXX should add a pointer in mthread to the mvar */+    for (struct mvar *mv = all_mvars; mv; mv = mv->mv_next) {+      if (find_and_unlink(&mv->mv_takeput, mt))+          goto found;+      if (find_and_unlink(&mv->mv_read, mt))+          goto found;+    }+    ERR("thread_intr: mvar");+  found:+#if defined(CLOCK_INIT)+    mt->mt_at = -1;             /* don't wait again */+#endif+    add_runq_tail(mt);+    break;+  case ts_wait_time:+#if THREAD_DEBUG+    if (thread_trace) {+      printf("thread_intr: ts_wait_time mask=%d\n", (int)mt->mt_mask);+    }+#endif  /* THREAD_DEBUG */+    if (mt->mt_mask == mask_uninterruptible) /* uninterruptible */+      break;+    /* find thread in timeq */+    if (!find_and_unlink(&timeq, mt))+      ERR("thread_intr: timeq");+    /* XXX should adjust mq_tail */+    add_runq_tail(mt);+    break;+  case ts_finished:+  case ts_died:+#if THREAD_DEBUG+    if (thread_trace) {+      printf("thread_intr: finished/died\n");+    }+#endif  /* THREAD_DEBUG */+    break;+  default:+    ERR("thread_intr");+  }+#if THREAD_DEBUG+  if (thread_trace) {+    printf("thread_intr: done\n");+    dump_q("runq", runq);+  }+#endif  /* THREAD_DEBUG */+}++NORETURN void+raise_exn(NODEPTR exn)+{+#if THREAD_DEBUG+  if (thread_trace) {+    printf("raise_exn: %p\n", exn);+    dump_q("runq", runq);+  }+#endif  /* THREAD_DEBUG */++  if (cur_handler) {+    /* Pass the exception to the handler */+    cur_handler->hdl_exn = exn;+    longjmp(cur_handler->hdl_buf, 1);+  } else {+    /* No exception handler, jump to the scheduler */+    the_exn = exn;+    longjmp(sched, mt_raise);+  }+}++NORETURN void+raise_rts(enum rts_exn exn) {+  raise_exn(mkInt(exn));+}++/***************** GC ******************/++/* 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));+}++/* Set FREE bit to 1, used to undo marking in GC */+static INLINE void mark_unused(NODEPTR n)+{+  heapoffs_t i = LABEL(n);+#if SANITY+  if (i < heap_start)+    ERR("Unmarking invalid heap address.");+  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;+}++static INLINE NODEPTR+alloc_node(enum node_tag t)+{+  heapoffs_t i = next_scan_index / BITS_PER_WORD;+  int k;                        /* will contain bit pos + 1 */+  heapoffs_t pos;+  NODEPTR n;+  heapoffs_t word;++  /* This can happen if we run out of memory when parsing. */+  if (num_free <= 0)+    ERR("alloc_node");++  for(;;) {+    word = free_map[i];+    if (word)+      break;+    i++;+#if SANITY+    if (i >= free_map_nwords) {+#if 0+      fprintf(stderr, "wordsize=%u, num_free=%u next_scan_index=%u i=%u free_map_nwords=%u\n", (uint)BITS_PER_WORD,+              (uint)num_free, (uint)next_scan_index, (uint)i, (uint)free_map_nwords);+#endif+      ERR("alloc_node: free_map");+    }+#endif+  }+  k = FFS(word);+  pos = i * BITS_PER_WORD + k - 1; /* first free node */+  n = HEAPREF(pos);+  // mark_used(n); // equivalent to:+  free_map[i] = word & (word-1);+  next_scan_index = pos;++  SETTAG(n, t);+  COUNT(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;+}++NODEPTR evali(NODEPTR n);++/* If this is non-0 it means that the threading system is active. */+struct mthread *main_thread = 0;++void+start_exec(NODEPTR root)+{+  struct mthread *mt;++  mt = new_thread(new_ap(root, combWorld)); /* main thread */+  mt->mt_id = MAIN_THREAD;                  /* make it the main thread in case this is foreign export calling */+  main_thread = mt;++  switch(setjmp(sched)) {+  case mt_main:+    break;+  case mt_resched:+    COUNT(num_resched);+    break;+  case mt_raise:+    /* We have an uncaught exception.+     * If it's the main thread, this kills the program.+     * Otherwise, it just kills the thread.+     */+    if (in_raise) {+      ERR("FATAL: exception while trying to die");+      EXIT(1);+    }+    mt = remove_q_head(&runq);+    if (mt->mt_id == MAIN_THREAD) {+      die_exn(the_exn);+    } else {+#if THREAD_DEBUG+      if (thread_trace) {+        printf("start_exec: mt=%p id=%d died from exn\n", mt, (int)mt->mt_id);+      }+#endif  /* THREAD_DEBUG */+      mt->mt_state = ts_died;+      mt->mt_root = NIL;+    }+  }+#if THREAD_DEBUG+  if (thread_trace) {+    printf("start_exec:\n");+    dump_q("runq", runq);+  }+#endif  /* THREAD_DEBUG */+  for(;;) {+    if (!runq.mq_head)+      pause_exec();+    mt = runq.mq_head;          /* front thread */+    if (!mt)                    /* this should never happen */+      ERR("no threads");++    glob_slice = mt->mt_slice + slice;+#if THREAD_DEBUG+    if (thread_trace)+      printf("start_exec: start %d, slice=%d\n", (int)mt->mt_id, (int)glob_slice);+#endif  /* THREAD_DEBUG */+    num_reductions += glob_slice-1;+    (void)evali(mt->mt_root);         /* run it */+    num_reductions -= glob_slice;+    /* when evali() returns the thread is done */+    (void)remove_q_head(&runq);                      /* remove front thread */++#if THREAD_DEBUG+    if (thread_trace) {+      printf("start_exec: mt=%p id=%d finished\n", mt, (int)mt->mt_id);+    }+#endif  /* THREAD_DEBUG */+    mt->mt_state = ts_finished;+    mt->mt_root = NIL;+    /* XXX mt_mval, mt_thrown */++    if (mt->mt_id == MAIN_THREAD) {+      main_thread = 0;+#if THREAD_DEBUG+      if (thread_trace) {+        printf("start_exec: main thread done\n");+      }+#endif  /* THREAD_DEBUG */+      return;                   /* when the main thread dies it's all over */+    }+  }+}++/* 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.+ */+static const+struct {+  const char *name;+  const enum node_tag tag;+  const enum node_tag flipped;        /* What should (C op) reduce to? defaults to T_FREE */+  //  NODEPTR node;+} primops[] = {+  /* combinators */+  /* sorted by frequency in a typical program */+  { "B", T_B },+  { "O", T_O },+  { "K", T_K, T_A },+  { "C'", T_CC },+  { "C", T_C },+  { "A", T_A, T_K },+  { "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 },+  /*  { "J", T_J },*/+  { "K2", T_K2 },+  { "K3", T_K3 },+  { "K4", T_K4 },+  { "C'B", T_CCB },+/* primops */+  { "+", T_ADD, T_ADD },+  { "-", T_SUB, T_SUBR },+  { "*", T_MUL, T_MUL },+  { "quot", T_QUOT },+  { "rem", T_REM },+  { "uquot", T_UQUOT },+  { "urem", T_UREM },+  { "subtract", T_SUBR, T_SUB },+  { "neg", T_NEG },+  { "and", T_AND, T_AND },+  { "or", T_OR, T_OR },+  { "xor", T_XOR, T_XOR },+  { "inv", T_INV },+  { "shl", T_SHL },+  { "shr", T_SHR },+  { "ashr", T_ASHR },+  { "popcount", T_POPCOUNT },+  { "clz", T_CLZ },+  { "ctz", T_CTZ },+#if WANT_FLOAT64+  { "d+" , T_DADD, T_DADD},+  { "d-" , T_DSUB },+  { "d*" , T_DMUL, T_DMUL},+  { "d/", T_DDIV},+  { "dneg", T_DNEG},+  { "itod", T_ITOD},+  { "Itod", T_I64TOD},+  { "d==", T_DEQ, T_DEQ},+  { "d/=", T_DNE, T_DNE},+  { "d<", T_DLT, T_DGT},+  { "d<=", T_DLE, T_DGE},+  { "d>", T_DGT, T_DLT},+  { "d>=", T_DGE, T_DLE},+#endif  /* WANT_FLOAT64 */+#if WANT_FLOAT32+  { "f+" , T_FADD, T_FADD},+  { "f-" , T_FSUB },+  { "f*" , T_FMUL, T_FMUL},+  { "f/", T_FDIV},+  { "fneg", T_FNEG},+  { "Itof", T_I64TOF},+  { "itof", T_ITOF},+  { "f==", T_FEQ, T_FEQ},+  { "f/=", T_FNE, T_FNE},+  { "f<", T_FLT, T_FGT},+  { "f<=", T_FLE, T_FGE},+  { "f>", T_FGT, T_FLT},+  { "f>=", T_FGE, T_FLE},+#endif  /* WANT_FLOAT32 */++  { "bs++", T_BSAPPEND },+  { "bs++.", T_BSAPPENDDOT },+  { "bs==", T_BSEQ, T_BSEQ },+  { "bs/=", T_BSNE, T_BSNE },+  { "bs<", T_BSLT, T_BSGT },+  { "bs<=", T_BSLE, T_BSGE  },+  { "bs>", T_BSGT, T_BSLT },+  { "bs>=", T_BSGE, T_BSLE  },+  { "bscmp", T_BSCMP },+  { "bspack", T_BSPACK },+  { "bsunpack", T_BSUNPACK },+  { "bsreplicate", T_BSREPLICATE },+  { "bslength", T_BSLENGTH },+  { "bssubstr", T_BSSUBSTR },+  { "bsindex", T_BSINDEX },+  { "bswrite", T_BSWRITE },++  { "ord", T_I },+  { "chr", T_I },+  { "==", T_EQ, T_EQ },+  { "/=", T_NE, T_NE },+  { "<", T_LT, T_GT },+  { "u<", T_ULT, T_UGT },+  { "u<=", T_ULE, T_UGE },+  { "u>", T_UGT, T_ULT },+  { "u>=", T_UGE, T_ULE },+  { "<=", T_LE, T_GE },+  { ">", T_GT, T_LT },+  { ">=", T_GE, T_LE },+  { "fp+", T_FPADD },+  { "fp2p", T_FP2P },+  { "fpnew", T_FPNEW },+  { "fpfin", T_FPFIN },+  //  { "fpstr", T_FPSTR },+  { "fp2bs", T_FP2BS },+  { "bs2fp", T_BS2FP },+  { "seq", T_SEQ },+  { "icmp", T_ICMP },+  { "ucmp", T_UCMP },+  { "rnf", T_RNF },+  { "fromUTF8", T_BSFROMUTF8 },+  { "toUTF8", T_BSTOUTF8 },+  { "headUTF8", T_BSHEADUTF8 },+  { "tailUTF8", T_BSTAILUTF8 },+  /* 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.getArgRef", T_IO_GETARGREF },+  { "IO.performIO", T_IO_PERFORMIO },+  { "IO.gc", T_IO_GC },+  { "IO.stats", T_IO_STATS },+  { "IO.pp", T_IO_PP },+  { "raise", T_RAISE },+  { "catch", T_CATCH },+  { "catchr", T_CATCHR },+  { "A.alloc", T_ARR_ALLOC },+  { "A.copy", T_ARR_COPY },+  { "A.size", T_ARR_SIZE },+  { "A.read", T_ARR_READ },+  { "A.write", T_ARR_WRITE },+  { "A.trunc", T_ARR_TRUNC },+  { "A.==", T_ARR_EQ },+  { "dynsym", T_DYNSYM },+  { "IO.fork", T_IO_FORK },+  { "IO.thid", T_IO_THID },+  { "thnum", T_THNUM },+  { "IO.throwto", T_IO_THROWTO },+  { "IO.yield", T_IO_YIELD },+  { "IO.newmvar", T_IO_NEWMVAR },+  { "IO.takemvar", T_IO_TAKEMVAR },+  { "IO.putmvar", T_IO_PUTMVAR },+  { "IO.readmvar", T_IO_READMVAR },+  { "IO.trytakemvar", T_IO_TRYTAKEMVAR },+  { "IO.tryputmvar", T_IO_TRYPUTMVAR },+  { "IO.tryreadmvar", T_IO_TRYREADMVAR },+  { "IO.threaddelay", T_IO_THREADDELAY },+  { "IO.threadstatus", T_IO_THREADSTATUS },+  { "IO.getmaskingstate", T_IO_GETMASKINGSTATE },+  { "IO.setmaskingstate", T_IO_SETMASKINGSTATE },+  { "newCAStringLen", T_NEWCASTRINGLEN },+  { "packCString", T_PACKCSTRING },+  { "packCStringLen", T_PACKCSTRINGLEN },+  { "bsgrab", T_BSGRAB },+  { "toPtr", T_TOPTR },+  { "toInt", T_TOINT },+  { "toDbl", T_TODBL },+  { "toFlt", T_TOFLT },+  { "fromDbl", T_FROMDBL },+  { "fromFlt", T_FROMFLT },+  { "toFunPtr", T_TOFUNPTR },+  { "IO.ccall", T_IO_CCALL },+  { "isint", T_ISINT },+  { "SPnew", T_SPNEW },+  { "SPderef", T_SPDEREF },+  { "SPfree", T_SPFREE },+  { "Wknew", T_WKNEW },+  { "Wknewfin", T_WKNEWFIN },+  { "Wkderef", T_WKDEREF },+  { "Wkfinal", T_WKFINAL },+  { "binint2", T_BININT2 },+  { "binint1", T_BININT1 },+  { "bindbl2", T_BINDBL2 },+  { "bindbl1", T_BINDBL1 },+  { "binbs2", T_BINBS2 },+  { "binbs1", T_BINBS1 },+  { "unint1", T_UNINT1 },+  { "undbl1", T_UNDBL1 },+#if WANT_INT64+#if !NEED_INT64+  { "I+", T_ADD, T_ADD },+  { "I-", T_SUB, T_SUBR },+  { "I*", T_MUL, T_MUL },+  { "Iquot", T_QUOT },+  { "Irem", T_REM },+  { "Iuquot", T_UQUOT },+  { "Iurem", T_UREM },+  { "Isubtract", T_SUBR, T_SUB },+  { "Ineg", T_NEG },+  { "Iand", T_AND, T_AND },+  { "Ior", T_OR, T_OR },+  { "Ixor", T_XOR, T_XOR },+  { "Iinv", T_INV },+  { "Ishl", T_SHL },+  { "Ishr", T_SHR },+  { "Iashr", T_ASHR },+  { "Ipopcount", T_POPCOUNT },+  { "Iclz", T_CLZ },+  { "Ictz", T_CTZ },+  { "I==", T_EQ, T_EQ },+  { "I/=", T_NE, T_NE },+  { "I<", T_LT, T_GT },+  { "Iu<", T_ULT, T_UGT },+  { "Iu<=", T_ULE, T_UGE },+  { "Iu>", T_UGT, T_ULT },+  { "Iu>=", T_UGE, T_ULE },+  { "I<=", T_LE, T_GE },+  { "I>", T_GT, T_LT },+  { "I>=", T_GE, T_LE },+  { "Iicmp", T_ICMP },+  { "Iucmp", T_UCMP },+  { "Itoi", T_I },+  { "itoI", T_I },+  { "Utou", T_I },+  { "utoU", T_I },+#else  /* WORD_SIZE == 64 */+  /* WORD_SIZE == 32 */+  { "I+", T_ADD64, T_ADD64 },+  { "I-", T_SUB64, T_SUBR64 },+  { "I*", T_MUL64, T_MUL64 },+  { "Iquot", T_QUOT64 },+  { "Irem", T_REM64 },+  { "Iuquot", T_UQUOT64 },+  { "Iurem", T_UREM64 },+  { "Isubtract", T_SUBR64, T_SUB64 },+  { "Ineg", T_NEG64 },+  { "Iand", T_AND64, T_AND64 },+  { "Ior", T_OR64, T_OR64 },+  { "Ixor", T_XOR64, T_XOR64 },+  { "Iinv", T_INV64 },+  { "Ishl", T_SHL64 },+  { "Ishr", T_SHR64 },+  { "Iashr", T_ASHR64 },+  { "Ipopcount", T_POPCOUNT64 },+  { "Iclz", T_CLZ64 },+  { "Ictz", T_CTZ64 },+  { "I==", T_EQ64, T_EQ64 },+  { "I/=", T_NE64, T_NE64 },+  { "I<", T_LT64, T_GT64 },+  { "Iu<", T_ULT64, T_UGT64 },+  { "Iu<=", T_ULE64, T_UGE64 },+  { "Iu>", T_UGT64, T_ULT64 },+  { "Iu>=", T_UGE64, T_ULE64 },+  { "I<=", T_LE64, T_GE64 },+  { "I>", T_GT64, T_LT64 },+  { "I>=", T_GE64, T_LE64 },+  { "Iicmp", T_ICMP64 },+  { "Iucmp", T_UCMP64 },+  { "itoI", T_ITOI64 },+  { "Itoi", T_I64TOI },+  { "utoU", T_UTOU64 },+  { "Utou", T_U64TOU },+#endif /* WORD_SIZE == 64 */+#endif  /* WANT_INT64 */+};++#if GCRED+enum node_tag flip_ops[T_LAST_TAG+1];+#endif++#if WANT_STDIO+/* Create a dummy foreign pointer for the standard stdio handles. */+/* These handles are never gc():d. */+void+mk_std(NODEPTR n, FILE *f)+{+  struct final *fin = mcalloc(1, sizeof(struct final));+  struct forptr *fp = mcalloc(1, sizeof(struct forptr));+  BFILE *bf = add_utf8(add_FILE(f));+  SETTAG(n, T_FORPTR);+  FORPTR(n) = fp;+  fin->arg = bf;+  fin->back = fp;+  fp->payload.string = bf;+  fp->finalizer = fin;+}+#endif++void+init_nodes(void)+{+  enum node_tag t;+  size_t j;+  NODEPTR n;++  ALLOC_HEAP(heap_size);+  free_map_nwords = (heap_size + BITS_PER_WORD - 1) / BITS_PER_WORD; /* bytes needed for free map */+  free_map = mmalloc(free_map_nwords * sizeof(bits_t));++  /* Set up permanent nodes */+  heap_start = 0;+  for(t = T_FREE; t <= T_LAST_TAG; t++) {+    NODEPTR n = HEAPREF(heap_start++);+    SETTAG(n, t);+    switch (t) {+    case T_K: combK = n; break;+    case T_A: combTrue = n; break;+    case T_I: combI = n; break;+    case T_O: combCons = n; break;+    case T_P: combPair = n; break;+    case T_CC: combCC = n; break;+    case T_BB: combBB = n; break;+    case T_B: combB = n; break;+    case T_C: combC = n; break;+    case T_Z: combZ = n; break;+    case T_U: combU = n; break;+    case T_K2: combK2 = n; break;+    case T_K3: combK3 = n; break;+    case T_IO_BIND: combIOBIND = n; break;+    case T_IO_THEN: combIOTHEN = n; break;+    case T_IO_RETURN: combIORETURN = n; break;+    case T_IO_SETMASKINGSTATE: combSETMASKINGSTATE = n; break;+    case T_IO_PERFORMIO: combPERFORMIO = n; break;+    case T_BININT1: combBININT1 = n; break;+    case T_BININT2: combBININT2 = n; break;+    case T_UNINT1: combUNINT1 = n; break;+    case T_BININT64_1: combBININT64_1 = n; break;+    case T_BININT64_2: combBININT64_2 = n; break;+    case T_UNINT64_1: combUNINT64_1 = n; break;+    case T_BINDBL1: combBINDBL1 = n; break;+    case T_BINDBL2: combBINDBL2 = n; break;+    case T_UNDBL1: combUNDBL1 = n; break;+    case T_BINFLT1: combBINFLT1 = n; break;+    case T_BINFLT2: combBINFLT2 = n; break;+    case T_UNFLT1: combUNFLT1 = n; break;+    case T_BINBS1: combBINBS1 = n; break;+    case T_BINBS2: combBINBS2 = n; break;+    case T_IO_THROWTO: combTHROWTO = n; break;+    case T_CATCHR: combCATCHR = n; break;+#if WANT_STDIO+    case T_IO_STDIN:  comb_stdin  = n; mk_std(n, stdin);  break;+    case T_IO_STDOUT: comb_stdout = n; mk_std(n, stdout); break;+    case T_IO_STDERR: comb_stderr = n; mk_std(n, stderr); break;+#endif+    default:+      break;+    }+    for (j = sizeof primops / sizeof primops[0]; j-- > 0; ) {+      //      if (primops[j].tag == t) {+      //        primops[j].node = n;+      //      }+#if WANT_TAGNAMES+      tag_names[primops[j].tag] = primops[j].name;+#endif+    }+  }++#if GCRED+  for (j = 0; j < sizeof primops / sizeof primops[0]; j++) {+    flip_ops[primops[j].tag] = primops[j].flipped;+  }+#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 { n = HEAPREF(heap_start++); SETTAG(n, T_AP); FUN(n) = (f); ARG(n) = (a); (c) = n;} while(0)+#define MKINT(c, i) do { n = HEAPREF(heap_start++); SETTAG(n, T_INT); SETVALUE(n, i); (c) = n; } while(0)+  NEWAP(combLT, combZ,     combFalse);  /* Z K */+  NEWAP(combEQ, combFalse, combFalse);  /* K K */+  NEWAP(combGT, combFalse, combTrue);   /* K A */+  {+    /* The displaySomeException compiles to (U (U (K2 A))) */+    NODEPTR x;+    NEWAP(x, combK2, combTrue);        /* (K2 A) */+    NEWAP(x, combU, x);                /* (U (K2 A)) */+    NEWAP(combShowExn, combU, x);      /* (U (U (K2 A))) */+  }+  NEWAP(combJust, combZ, combU);       /* (Z U) */+  MKINT(combWorld, 99999);+  NEWAP(combPairUnit, combPair, combUnit);+#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+counter_t red_a, red_k, red_i, red_int, red_flip, red_bi, red_bxi, red_ccbi, red_cc, red_cci, red_ccbbcp;+#endif+counter_t red_bb, red_k4, red_k3, red_k2, red_ccb, red_z, red_r;++//counter_t mark_depth;+//counter_t max_mark_depth = 0;++void mark(NODEPTR *np);+void mark_mvar(struct mvar *mv);+void mark_thread(struct mthread *mt);++/* Follow indirections */+static INLINE NODEPTR+indir(NODEPTR *np)+{+  NODEPTR n = *np;+  while (GETTAG(n) == T_IND)+    n = GETINDIR(n);+  *np = n;+  return n;+}++/***** weak pointers *****/++struct weak_ptr {+  struct weak_ptr *next;        /* list of all weak pointers. */+  int marked;                   /* seen by GC */+  NODEPTR key;                  /* key, this is the weak pointer */+  NODEPTR value;                /* associated value */+  NODEPTR finalize;             /* maybe finalizer */+};+struct weak_ptr *allweaks;      /* head of all weak pointers */++/* After GC mark phase, deal with weak pointers */+void+sweep_weaks(void)+{+ restart:+  /* all weak pointer records are alive, marked or not */+  for (struct weak_ptr *wp = allweaks; wp; wp = wp->next) {+    if (!wp->value)+      continue;                 /* the weak pointer is already dead */+    (void)indir(&wp->key);+    if (is_marked_used(wp->key)) {+      /* The key is used, so mark the other parts */+      if (!is_marked_used(wp->value) ||+          (wp->finalize != 0 && !is_marked_used(wp->finalize))) {+        /* Not already marked */+        mark(&wp->value);+        if (wp->finalize)+          mark(&wp->finalize);+        /* This marking might have marked other keys, so restart the scan */+        goto restart;+      }+    } else {+      /* The key is not marked, so the weak reference is dead */+      wp->value = 0;+    }+  }++  /* Create finalizers for all weak pointers that just died */+  for (struct weak_ptr *wp = allweaks; wp; wp = wp->next) {+    if (!wp->value && wp->finalize) {+      struct mthread *mt = new_thread(wp->finalize);+      mark_thread(mt);        /* mark it, since overall thread marking has already run */+      wp->finalize = 0;+      wp->key = 0;            /* not needed, but for sanity */+      /* Marking the finalizer does not resurrect keys */+    }+  }++  /* If a weak pointer object is unreferenced and it has been finalized, +   * then it can be garbage collected. */+  for (struct weak_ptr **wpp = &allweaks; *wpp; ) {+    struct weak_ptr *wp = *wpp;+    if (!wp->marked && !wp->value) {+      /* not marked, so unlink and free */+      *wpp = wp->next;+      COUNT(num_gc_weak);+      free(wp);+    } else {+      /* point to the next weak_ptr */+      wpp = &wp->next;+    }+  }+}++NODEPTR+new_weak_ptr(NODEPTR key, NODEPTR value, NODEPTR finalize)+{+  struct weak_ptr *wp = mmalloc(sizeof(struct weak_ptr));+  wp->next = allweaks;+  allweaks = wp;+  wp->marked = 0;+  wp->key = key;+  wp->value = value;+  if (finalize) {+    wp->finalize = new_ap(finalize, combWorld);+  } else {+    wp->finalize = 0;+  }++  COUNT(num_new_weak);+  NODEPTR n = alloc_node(T_WEAK);+  WEAK(n) = wp;+  return n;+}++NODEPTR+deref_weak_ptr(struct weak_ptr *wp)+{+  if (!wp->value)+    return combNothing;+  return new_ap(combJust, wp->value);+}++void+finalize_weak_ptr(struct weak_ptr *wp)+{+  NODEPTR final = wp->finalize;+  if (!final)+    return;+  wp->finalize = 0;+  (void)evali(final);+}++/**********************************************************/++/* Throwing, e.g., a UserInterrupt exception, to the main thread+ * can happen from any thread (the one that happens to poll).+ * Throwing an exception can block, so we can't throw it from+ * the current thread.  Instead, we spawn a new thread, whose+ * only job it is to throw the exception.+ */+void+async_throwto(struct mthread *mt, NODEPTR exn)+{+  GCCHECK(4);+  NODEPTR thid = alloc_node(T_THID);+  THR(thid) = mt;+  NODEPTR root = new_ap(new_ap(new_ap(combTHROWTO, thid), exn), combWorld);+  (void)new_thread(root);       /* spawn and put on runq */+}++void+mark_thread(struct mthread *mt)+{+  if (mt->mt_mark)+    return;                     /* already marked */+  mt->mt_mark = true;+  if (mt->mt_root != NIL)+    mark(&mt->mt_root);+  mark_mvar(mt->mt_exn);         +  if (mt->mt_mval != NIL)+    mark(&mt->mt_mval);+}++void+mark_mvar(struct mvar *mv)+{+  if (mv->mv_mark)+    return;+  mv->mv_mark = true;+  if (mv->mv_data != NIL)+    mark(&mv->mv_data);+  for (struct mthread *mt = mv->mv_takeput.mq_head; mt; mt = mt->mt_next)+    mark_thread(mt);+  for (struct mthread *mt = mv->mv_read.mq_head; mt; mt = mt->mt_next)+    mark_thread(mt);+}+  +/*+ * Only allow GC reductions when the node is not near the top of the stack.+ * The reason is that when GC is triggered we are just starting a reduction+ * and the combinator at the left-bottom of the spine is being reduced.+ * If a GC reduction removes this combinator, then bad things happen.+ */+static int+gc_red_ok(NODEPTR n)+{+  for (stackptr_t s = stack_ptr; s >= 0 && s >= stack_ptr - 5; s--)+    if (n == stack[s])+      return 0;+  return 1;+}++/* Mark all used nodes reachable from *np, updating *np. */+void+mark(NODEPTR *np)+{+  stackptr_t stk = stack_ptr;+  NODEPTR n;+  NODEPTR *to_push = 0;         /* silence warning by initializing */+#if GCRED+  value_t val;+#endif+  enum node_tag tag;++  //  mark_depth++;+  //  if (mark_depth % 10000 == 0)+  //    PRINT("mark depth %"PRIcounter"\n", mark_depth);+  top:+  n = *np;+  tag = GETTAG(n);+  if (tag == T_IND) {+#if SANITY+    int loop = 0;+    /* Skip indirections, and redirect start pointer */+    while ((tag = GETTAG(n)) == T_IND) {+      //      PRINT("*"); fflush(stdout);+      n = GETINDIR(n);+      if (loop++ > 10000000) {+        //PRINT("%p %p %p\n", n, GETINDIR(n), GETINDIR(GETINDIR(n)));+        ERR("IND loop");+      }+    }+    //    if (loop)+    //      PRINT("\n");+#else  /* SANITY */+    while ((tag = GETTAG(n)) == T_IND) {+      n = GETINDIR(n);+    }+#endif  /* SANITY */+    *np = n;+  }+  if (n < cells || n > cells + heap_size)+    ERR("bad n");+  if (is_marked_used(n)) {+    goto fin;+  }+  num_marked++;+  mark_used(n);+  switch (tag) {+#if GCRED+#define GCREDIND(x) do { NODEPTR nn = (x); mark(&nn); SETINDIR(n, nn); goto fin; } while(0)+   case T_INT:+#if INTTABLE+    if (LOW_INT <= (val = GETVALUE(n)) && val < HIGH_INT) {+      SETINDIR(n, intTable[val - LOW_INT]);+      COUNT(red_int);+      goto top;+    }+    goto fin;+#endif  /* INTTABLE */+   case T_AP:+     if (want_gc_red) {+        NODEPTR fun = indir(&FUN(n));+        NODEPTR arg = indir(&ARG(n));+        enum node_tag funt = GETTAG(fun);+        enum node_tag argt = GETTAG(arg);+        enum node_tag funfunt = funt == T_AP ? GETTAG(indir(&FUN(fun))) : T_FREE;+        enum node_tag funargt = argt == T_AP ? GETTAG(indir(&FUN(arg))) : T_FREE;++        /* This is really only fruitful just after parsing.  It can be removed. */+        if (funfunt == T_A && gc_red_ok(n)) {+          /* Do the A x y --> y reduction */+          NODEPTR y = ARG(n);+          COUNT(red_a);+          GCREDIND(y);+        }++        if (funfunt == T_K && gc_red_ok(n)) {+          /* Do the K x y --> x reduction */+          NODEPTR x = ARG(FUN(n));+          COUNT(red_k);+          GCREDIND(x);+        }++        if (funt == T_I && gc_red_ok(n)) {+          /* Do the I x --> x reduction */+          NODEPTR x = ARG(n);+          COUNT(red_i);+          GCREDIND(x);+        }++        if(funt == T_CC && argt == T_I && gc_red_ok(n)) { +          /* C' I --> C */+          SETTAG(n, T_C);+          COUNT(red_cci);+          goto top;+        }++        if(funt == T_CCB && argt == T_AP) {+          NODEPTR funarg = indir(&FUN(arg));+          NODEPTR argarg = indir(&ARG(arg));+          if (GETTAG(argarg) == T_P && GETTAG(funarg) == T_AP) {+            if (GETTAG(indir(&FUN(funarg))) == T_B && GETTAG(indir(&ARG(funarg))) == T_C && gc_red_ok(n)) { +              /* C'B ((B C) P) --> C */+              SETTAG(n, T_C);+              COUNT(red_ccbbcp);+              goto top;+            }+          }+        }++        if(funt == T_B && argt == T_I && gc_red_ok(n)) { +          /* B I --> I */+          SETTAG(n, T_I);+          COUNT(red_bi);+          goto top;+        }++        if(funfunt == T_B && argt == T_I && gc_red_ok(n)) { +          /* B x I --> x */+          NODEPTR x = ARG(FUN(n));+          COUNT(red_bxi);+          GCREDIND(x);+        }++        if(funfunt == T_CCB && argt == T_I && gc_red_ok(n)) { +          /* C'B x I --> x */+          NODEPTR x = ARG(FUN(n));+          COUNT(red_ccbi);+          GCREDIND(x);+        }++        if(funt == T_C && funargt == T_C && gc_red_ok(n)) { +          /* C (C x) --> x */+          NODEPTR x = ARG(ARG(n));+          COUNT(red_cc);+          GCREDIND(x);+        }++#if 0+        /* Very rare */+        if (funt == T_S && funargt == T_K && gc_red_ok(n)) {+          /* S (K x) --> B x */+          printf("SK"); fflush(stdout);+        }+#endif++#if 0+        /* Fairly frequent, but needs allocation */+        if (funfunt == T_B && funargt == T_K) {+          /* B x (K y) --> K x y */+          printf("BxK\n");+        }+#endif++#if 1+        if (funt == T_C && gc_red_ok(n)) {+          enum node_tag tf;+          if ((tf = flip_ops[argt])) {+            /* Do the C op --> flip_op reduction */+            // PRINT("%s -> %s\n", tag_names[tt], tag_names[tf]);+            COUNT(red_flip);+            GCREDIND(HEAPREF(tf));+          }+        }+#endif+      }+#else   /* GCRED */+   case T_AP:+#endif  /* GCRED */+    /* Avoid tail recursion */+    np = &FUN(n);+    to_push = &ARG(n);+    break;+   case T_ARR:+    {+      struct ioarray *arr = ARR(n);++      // arr->marked records marking progress through arr.+      if (arr->marked >= arr->size) {+        goto fin;+      }+      // We unmark the array as a whole and push it as long+      // as there's more entries to scan.+      mark_unused(n);+      num_marked--;+      to_push = np;+      np = &arr->array[arr->marked++];+      break;+    }++   case T_FORPTR:+     FORPTR(n)->finalizer->marked = 1;+     goto fin;++   case T_THID:+     mark_thread(THR(n));+     goto fin;++   case T_MVAR:+     mark_mvar(MVAR(n));+     goto fin;++   case T_WEAK:+     WEAK(n)->marked = 1;+     goto fin;++   default:+     goto fin;+  }++  if (!is_marked_used(*to_push)) {+    //  mark_depth++;+    PUSH((NODEPTR)to_push);+  }+  goto top;+ fin:+  //  if (mark_depth > max_mark_depth) {+  //    max_mark_depth = mark_depth;+  //  }+  //  mark_depth--;+  if (stack_ptr > stk) {+    np = (NODEPTR *)POPTOP();+    goto top;+  }+  return;+}++// stackptr_t gc_tot;++/* Perform a garbage collection:+   - Mark nodes from the stack+   - Mark permanent arrays+   - Mark threads that have a root+   - Scan and free arrays+   - Scan and free foreign pointers and run finalizers+   - Scan and free threads+   - Scan and free mvars+*/+void+gc(void)+{+  stackptr_t i;+  //printf("****** GC ********\n");++  // gc_tot += stack_ptr+1;++  num_gc++;+  num_marked = 0;+#if WANT_STDIO+  if (verbose > 1)+    PRINT("gc mark\n");+#endif+  gc_mark_time -= GETTIMEMILLI();+  mark_all_free();+  /* Mark everything reachable from the stack */+  for (i = 0; i <= stack_ptr; i++)+    mark(&stack[i]);++  /* Mark everything reachable from permanent array nodes */+  for (struct ioarray *arr = array_root; arr; arr = arr->next) {+    if (arr->permanent) {+      for (i = 0; i < arr->size; i++)+        mark(&arr->array[i]);+    }+  }++  /* Mark all FFI exports */+  if (xffe_table) {+    for(struct ffe_entry *f = xffe_table; f->ffe_name; f++) {+      mark((NODEPTR*)&f->ffe_value);+    }+  }++  /* Mark used stable pointers */+  for (size_t i = 0; i < sp_capacity; i++) {+    if (sp_table[i] != NIL)+      mark(&sp_table[i]);+  }++  /* Mark everything reachable from the threads.+   * Note, zombie threads have no root so they are not marked.+   */+  for (struct mthread *mt = all_threads; mt; mt = mt->mt_next) {+    if (mt->mt_root != NIL)+      mark_thread(mt);+  }++  /* check for unmarked weak pointers */+  sweep_weaks();++  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");++  gc_scan_time -= GETTIMEMILLI();+  /* Free unused arrays */+  for (struct ioarray **arrp = &array_root; *arrp; ) {+    struct ioarray *arr = *arrp;+    if (arr->marked || arr->permanent) {+      arr->marked = 0;+      arrp = &arr->next;+    } else {+      *arrp = arr->next;        /* unlink */+      num_arr_free++;+      FREE(arr);                /* and FREE */+    }+  }++  /* Run finalizers on unused foreign pointers. */+  for (struct final **finp = &final_root; *finp; ) {+    struct final *fin = *finp;+    if (fin->marked) {+      fin->marked = 0;+      finp = &fin->next;+    } else {+      /* Unused, run finalizer and free all associated memory */+      if (fin->size == NOSIZE) {+        num_fin_free++;+      } else {+        num_bs_free++;+        num_bs_inuse -= fin->size;+        if (num_bs_alloc - num_bs_free > num_bs_alloc_max)+          num_bs_alloc_max = num_bs_alloc - num_bs_free;+      }+      void (*f)(void *) = (void (*)(void *))fin->final;+      //printf("forptr free fin=%p, f=%p", fin, f);+      //fflush(stdout);+      if (f) {+        //printf("finalizer fin=%p final=%p\n", fin, f);+        (*f)(fin->arg);+      }+      for (struct forptr *p = fin->back; p; ) {+        struct forptr *q = p->next;+        //printf("free fp=%p\n", p);+        //printf(" p=%p desc=%s", p, p->desc ? p->desc : "NONE");+        //fflush(stdout);+        FREE(p);+        //memset(p, 0x55, sizeof *p);+        p = q;+      }+      //printf("\n");+      *finp = fin->next;+      //printf("free fin=%p\n", fin);+      FREE(fin);+      //memset(fin, 0x77, sizeof *fin);+    }+  }++  /* Remove unreferenced zombie threads */+  for (struct mthread **mtp = &all_threads; *mtp; ) {+    struct mthread *mt = *mtp;+    if ((mt->mt_state == ts_died || mt->mt_state == ts_finished) && !mt->mt_mark) {+      COUNT(num_thread_reap);+      *mtp = mt->mt_next;+      free(mt);+    } else {+      mt->mt_mark = false;+      mtp = &mt->mt_next;+    }+  }+  +  /* Remove unreferences mvars */+  for (struct mvar **mvp = &all_mvars; *mvp; ) {+    struct mvar *mv = *mvp;+    if (!mv->mv_mark) {+      COUNT(num_mvar_free);+      *mvp = mv->mv_next;+      free(mv);+    } else {+      mv->mv_mark = false;+      mvp = &mv->mv_next;+    }+  }++  gc_scan_time += GETTIMEMILLI();++#if WANT_STDIO+  if (verbose > 1) {+    PRINT("gc done, %"PRIcounter" free\n", num_free);+    /*PRINT(" GC reductions A=%"PRIcounter", K=%"PRIcounter", I=%"PRIcounter", int=%"PRIcounter" flip=%"PRIcounter"\n",+      red_a, red_k, red_i, red_int, red_flip);*/+  }+  if (gcbell) {+    fputc('\007', stderr);      /* ring the bell */+    fflush(stderr);+  }+#endif  /* !WANT_STDIO */++#if 0+  /* For debugging only: mark all free cells */+  for(int n = 0; n < heap_size; n++) {+    NODEPTR p = HEAPREF(n);+    if (!is_marked_used(p)) {+      SETTAG(p, T_FREE);+    }+  }+#endif+#if 0+  {+    BFILE *err = add_fd(2);+    putsb("GC ", err); putdecb(num_free, err); putsb(" free\r\n", err);+    closeb(err);+  }+#endif+}++static INLINE+value_t+peekWord(value_t *p)+{+  return *p;+}++static INLINE+void+pokeWord(value_t *p, value_t w)+{+  *p = w;+}++static INLINE+void *+peekPtr(void **p)+{+  return *p;+}++static INLINE+void+pokePtr(void **p, void *w)+{+  *p = w;+}++static INLINE+uvalue_t+peek_uint8(uint8_t *p)+{+  return *p;+}++static INLINE+void+poke_uint8(uint8_t *p, value_t w)+{+  *p = (uint8_t)w;+}++static INLINE+uvalue_t+peek_uint16(uint16_t *p)+{+  return *p;+}++static INLINE+void+poke_uint16(uint16_t *p, value_t w)+{+  *p = (uint16_t)w;+}++#if WORD_SIZE >= 32+static INLINE+uvalue_t+peek_uint32(uint32_t *p)+{+  return *p;+}++static INLINE+void+poke_uint32(uint32_t *p, value_t w)+{+  *p = (uint32_t)w;+}+#endif  /* WORD_SIZE >= 32 */++#if WORD_SIZE >= 64+static INLINE+uvalue_t+peek_uint64(uint64_t *p)+{+  return *p;+}++static INLINE+void+poke_uint64(uint64_t *p, value_t w)+{+  *p = (uint64_t)w;+}+#endif  /* WORD_SIZE >= 64 */++static INLINE+value_t+peek_int8(int8_t *p)+{+  return *p;+}++static INLINE+void+poke_int8(int8_t *p, value_t w)+{+  *p = (int8_t)w;+}++static INLINE+value_t+peek_int16(int16_t *p)+{+  return *p;+}++static INLINE+void+poke_int16(int16_t *p, value_t w)+{+  *p = (int16_t)w;+}++#if WORD_SIZE >= 32+static INLINE+value_t+peek_int32(int32_t *p)+{+  return *p;+}++static INLINE+void+poke_int32(int32_t *p, value_t w)+{+  *p = (int32_t)w;+}+#endif  /* WORD_SIZE >= 32 */++#if WORD_SIZE >= 64+static INLINE+value_t+peek_int64(int64_t *p)+{+  return *p;+}++static INLINE+void+poke_int64(int64_t *p, value_t w)+{+  *p = (int64_t)w;+}+#endif  /* WORD_SIZE >= 64 */++static INLINE+value_t+peek_int(int *p)+{+  return *p;+}++static INLINE+void+poke_int(int *p, value_t w)+{+  *p = (int)w;+}++static INLINE+value_t+peek_uint(unsigned int *p)+{+  return *p;+}++static INLINE+void+poke_uint(unsigned int *p, value_t w)+{+  *p = (unsigned int)w;+}++static INLINE+value_t+peek_char(char *p)+{+  return *p;+}++static INLINE+void+poke_char(char *p, value_t w)+{+  *p = (char)w;+}++static INLINE+value_t+peek_schar(signed char *p)+{+  return *p;+}++static INLINE+void+poke_schar(signed char *p, value_t w)+{+  *p = (signed char)w;+}++static INLINE+value_t+peek_uchar(unsigned char *p)+{+  return *p;+}++static INLINE+void+poke_uchar(unsigned char *p, value_t w)+{+  *p = (unsigned char)w;+}++static INLINE+value_t+peek_short(short *p)+{+  return *p;+}++static INLINE+void+poke_short(short *p, value_t w)+{+  *p = (short)w;+}++static INLINE+value_t+peek_ushort(unsigned short *p)+{+  return *p;+}++static INLINE+void+poke_ushort(unsigned short *p, value_t w)+{+  *p = (unsigned short)w;+}++static INLINE+value_t+peek_long(long *p)+{+  return *p;+}++static INLINE+void+poke_long(long *p, value_t w)+{+  *p = (long)w;+}++static INLINE+value_t+peek_ulong(unsigned long *p)+{+  return *p;+}++static INLINE+void+poke_ulong(unsigned long *p, value_t w)+{+  *p = (unsigned long)w;+}++static INLINE+value_t+peek_llong(long long *p)+{+  return *p;+}++static INLINE+void+poke_llong(long long *p, value_t w)+{+  *p = (long long)w;+}++static INLINE+value_t+peek_ullong(unsigned long long *p)+{+  return *p;+}++static INLINE+void+poke_ullong(unsigned long long *p, value_t w)+{+  *p = (unsigned long long)w;+}++static INLINE+value_t+peek_size_t(size_t *p)+{+  return *p;+}++static INLINE+void+poke_size_t(size_t *p, value_t w)+{+  *p = (size_t)w;+}++#if WANT_FLOAT32+static INLINE+flt32_t+peek_flt32(flt32_t *p)+{+  return *p;+}++static INLINE+void+poke_flt32(flt32_t *p, flt32_t w)+{+  *p = w;+}+#endif  /* WANT_FLOAT32 */++#if WANT_FLOAT64+static INLINE+flt64_t+peek_flt64(flt64_t *p)+{+  return *p;+}++static INLINE+void+poke_flt64(flt64_t *p, flt64_t w)+{+  *p = w;+}+#endif  /* WANT_FLOAT64 */++/* Look up an FFI function by name */+value_t+lookupFFIname(const char *name)+{+  size_t i;++  for(i = 0; ffi_table[i].ffi_name; i++)+    if (strcmp(ffi_table[i].ffi_name, name) == 0)+      return (value_t)i;+  if (xffi_table) {+    for(i = 0; xffi_table[i].ffi_name; i++)+      if (strcmp(xffi_table[i].ffi_name, name) == 0)+        return (value_t)(i + num_ffi);+  }+  return -1;+}++NODEPTR+ffiNode(const char *buf)+{+  NODEPTR r;+  value_t i = lookupFFIname(buf);+  char *fun;++  if (i < 0) {+    /* lookup failed, generate a node that will dynamically generate an error */+    r = alloc_node(T_BADDYN);+    fun = mmalloc(strlen(buf) + 1);+    strcpy(fun, buf);+    CSTR(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 = getb(f);+  if (c == d) {+    return 1;+  } else {+    ungetb(d, f);+    return 0;+  }+}++/* Get a non-terminating character.  ' ' and '\n' terminates a token. */+int+getNT(BFILE *f)+{+  int c;++  c = getb(f);+  if (c == ' ' || c == '\n') {+    return 0;+  } else {+    return c;+  }+}++value_t+parse_int(BFILE *f)+{+  // Parse using uvalue_t, which wraps on overflow.+  uvalue_t i = 0;+  uvalue_t neg = 1;+  int c = getb(f);+  if (c == '-') {+    neg = -1;+    c = getb(f);+  }+  for(;;) {+    i = i * 10 + (c - '0');+    c = getb(f);+    if (c < '0' || c > '9') {+      ungetb(c, f);+      break;+    }+  }+  // Multiply by neg without triggering undefined behavior.+  return (value_t)(neg * i);+}++#if NEED_INT64+int64_t+parse_int64(BFILE *f)+{+  // Parse using uint64_t, which wraps on overflow.+  uint64_t i = 0;+  uint64_t neg = 1;+  int c = getb(f);+  if (c == '-') {+    neg = -1;+    c = getb(f);+  }+  for(;;) {+    i = i * 10 + (c - '0');+    c = getb(f);+    if (c < '0' || c > '9') {+      ungetb(c, f);+      break;+    }+  }+  // Multiply by neg without triggering undefined behavior.+  return (int64_t)(neg * i);+}+#endif  /* NEED_INT64 */++struct forptr *mkForPtr(struct bytestring bs);+NODEPTR mkFunPtr(HsFunPtr p);++/* Create a forptr that has a free() finalizer. */+struct forptr *+mkForPtrFree(struct bytestring str)+{+  struct forptr *fp = mkForPtr(str);         /* Create a foreign pointer */+  fp->finalizer->final = (HsFunPtr)FREE;     /* and set the finalizer to just free it */+  return fp;+}++NODEPTR+mkStrNode(struct bytestring str)+{+  NODEPTR n = alloc_node(T_FORPTR);+  struct forptr *fp = mkForPtrFree(str);+  FORPTR(n) = fp;+  fp->finalizer->fptype = FP_BSTR;+  //printf("mkForPtr n=%p fp=%p %d %s payload.string=%p\n", n, fp, (int)FORPTR(n)->payload.size, (char*)FORPTR(n)->payload.string, FORPTR(n)->payload.string);+  return n;+}++/* 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 i;++  for(i = (int)label; ; i++) {+    i %= shared_table_size;+    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. */+  }+}++/* The memory allocated here is never freed.+ * This could be fixed by using a forptr and a+ * finalizer for read UTF-8 strings.+ * Fix this if there is a lot of deserialization.+ */+struct bytestring+parse_string(BFILE *f)+{+  struct bytestring bs;+  size_t sz = 20;+  uint8_t *buffer = mmalloc(sz);+  size_t i;+  int c;++  for(i = 0;;) {+    c = getb(f);+    if (c == '"')+      break;+    if (i >= sz - 1) {+      sz *= 2;+      buffer = mrealloc(buffer, sz);+    }+#if 0+    if (c == '\\') {+      buffer[i++] = (uint8_t)parse_int(f);+      if (!gobble(f, '&'))+        ERR("parse string");+    } else {+      buffer[i++] = c;+    }+#else+    /* See src/MicroHs/ExpPrint.hs for how strings are encoded. */+    switch (c) {+    case '\\':+      c = getb(f);+      if (c == '?')+        c = 0x7f;+      else if (c == '_')+        c = 0xff;+      break;+    case '^':+      c = getb(f);+      if (c < 0x40)+        c &= 0x1f;+      else+        c = (c & 0x1f) | 0x80;+      break;+    case '|':+      c = getb(f);+      c |= 0x80;+      break;+    default:+      /* Unencoded */+      ;+    }+    buffer[i++] = c;+#endif+  }+  buffer[i] = 0;                /* add a trailing 0 in case we need a C string */+  buffer = mrealloc(buffer, i + 1);++  bs.size = i;+  bs.string = buffer;+  //printf("parse_string %d %s\n", (int)bs.size, (char*)bs.string);+  return bs;+}++struct forptr *new_mpz(void);++NODEPTR+parse(BFILE *f)+{+  stackptr_t stk = stack_ptr;+  NODEPTR r, x, y;+  NODEPTR *nodep;+  heapoffs_t l;+  int c;+  size_t j;+  char buf[80];                 /* store names of primitives. */++  for(;;) {+    c = getb(f);+    if (c < 0) ERR("parse EOF");+    switch (c) {+    case ' ':+    case '\n':+      continue;+    }+    if (num_free < 3)+      ERR("out of heap reading code");+    GCCHECK(1);+    switch(c) {+    case '@':+      x = TOP(0);+      y = TOP(1);+      POP(2);+      PUSH(new_ap(y, x));+      break;+    case '}':+      x = TOP(0);+      POP(1);+      if (stack_ptr != stk)+        ERR("parse: stack");+      return x;+#if WANT_GMP+    case '%':+      {+        struct bytestring bs = parse_string(f); /* get all the digits, terminated by " */+        struct forptr *fp = new_mpz();          /* a new mpz */+        mpz_ptr op = fp->payload.string;        /* get actual pointer */+        mpz_set_str(op, bs.string, 10);         /* convert to an mpz */+        free(bs.string);+        r = alloc_node(T_FORPTR);+        FORPTR(r) = fp;+        PUSH(r);+        break;+      }+#endif+    case '&':+      {+        int is32 = gobble(f, '&');+        for (j = 0; (buf[j] = getNT(f)); j++)+          ;+        if (is32) {+#if WANT_FLOAT32+          r = mkFlt32(strtof(buf, NULL));+#else+          r = alloc_node(T_FLT32);+          SETVALUE(r, 0);+#endif+        } else {+#if WANT_FLOAT64+          r = mkFlt64(strtod(buf, NULL));+#else+          r = alloc_node(T_DBL);+          SETVALUE(r, 0);+#endif+        }+        PUSH(r);+        break;+      }+    case '#':+#if NEED_INT64+      if (gobble(f, '#')) {+        r = mkInt64(parse_int64(f));+      } else {+        r = mkInt(parse_int(f));+      }+#else  /* NEED_INT64 */+      gobble(f, '#');+      r = mkInt(parse_int(f));+#endif /* NEED_INT64 */+      PUSH(r);+      break;+    case '[':+      {+        size_t sz;+        struct ioarray *arr;+        size_t i;+        sz = (size_t)parse_int(f);+        if (!gobble(f, ']')) ERR("parse arr 1");+        arr = arr_alloc(sz, NIL);+        for (i = 0; i < sz; i++) {+          arr->array[i] = TOP(sz - i - 1);+        }+        r = alloc_node(T_ARR);+        ARR(r) = arr;+        POP(sz);+        PUSH(r);+        break;+      }+    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_FREE);+        SETINDIR(*nodep, NIL);+      }+      PUSH(*nodep);+      break;+    case ':':+      /* Define a shared expression: :label e */+      l = parse_int(f);  /* The label */+      if (!gobble(f, ' ')) ERR("parse ' '");+      nodep = find_label(l);+      x = TOP(0);+      if (*nodep == NIL) {+        /* not referenced yet, so add a direct reference */+        *nodep = x;+      } else {+        /* Sanity check */+        if (GETTAG(*nodep) != T_IND || GETINDIR(*nodep) != NIL) ERR("shared != NIL");+        SETINDIR(*nodep, x);+      }+      break;+    case '"':+      /* Everything up to the next " is a string.+       * Special characters are encoded as \NNN&,+       * where NNN is the decimal value of the character */+      PUSH(mkStrNode(parse_string(f)));+      break;+#if WANT_TICK+    case '!':+      if (!gobble(f, '"'))+        ERR("parse !");+      r = alloc_node(T_TICK);+      SETVALUE(r, (value_t)add_tick_table(parse_string(f)););+      PUSH(r);+      break;+#endif+    case '^':+      /* An FFI name */+      for (j = 0; (buf[j] = getNT(f)); j++)+        ;+      r = ffiNode(buf);+      PUSH(r);+      break;+    case ';':+      /* <name is a C function pointer to name */+      for (j = 0; (buf[j] = getNT(f)); j++)+        ;+      if (strcmp(buf, "0") == 0) {+        PUSH(mkFunPtr((HsFunPtr)0));+      } else if (strcmp(buf, "closeb") == 0) {+        PUSH(mkFunPtr((HsFunPtr)closeb));+      } else {+        ERR1("unknown funptr '%s'", buf);+      }+      break;+    default:+      buf[0] = c;+      /* A primitive, keep getting char's until end */+      for (j = 1; (buf[j] = getNT(f)); j++)+        ;+      /* Look up the primop and use the preallocated node. */+      for (j = 0; j < sizeof primops / sizeof primops[0]; j++) {+        if (strcmp(primops[j].name, buf) == 0) {+#if 0+          r = primops[j].node;+          if (r != HEAPREF(primops[j].tag))+            printf("bad %s\n", buf);+#else+          r = HEAPREF(primops[j].tag);+#endif+          goto found;+        }+      }+      ERR1("no primop %s", buf);+    found:+      PUSH(r);+      break;+    }+  }+}++void+checkversion(BFILE *f)+{+  char *p = VERSION;+  int c;++  while ((c = *p++)) {+    if (c != getb(f))+      ERR("version mismatch");+  }+  (void)gobble(f, '\r');                 /* allow extra CR */+}++/* Parse a file */+NODEPTR+parse_top(BFILE *f, struct ffe_entry *ffe)+{+  heapoffs_t numLabels, i;+  NODEPTR n;+  checkversion(f);+  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 = mmalloc(shared_table_size * sizeof(struct shared_entry));+  for(i = 0; i < shared_table_size; i++)+    shared_table[i].node = NIL;+  n = parse(f);+  if (ffe) {+    for(struct ffe_entry *f = ffe; f->ffe_name; f++) {+      heapoffs_t l = atoi(f->ffe_name+1); /* the name must be numerical */+      f->ffe_value = *find_label(l);+    }+  }+  FREE(shared_table);+  return n;+}++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+ */+struct print_bits {+  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;+}++size_t strNodes(size_t len);+NODEPTR mkStringC(char *str);++#if WANT_STDIO+void+convdbl(char *str, char *fmt, flt64_t x)+{+  /* Using 16 decimals will lose some precision.+   * 17 would keep the precision, but it frequently looks very ugly.+   */+  (void)snprintf(str, 25, fmt, x);+  if (strcmp(str, "nan") != 0 && strcmp(str, "-nan") != 0 &&+      strcmp(str, "inf") != 0 && strcmp(str, "-inf") != 0 &&+      !strchr(str, '.') && !strchr(str, 'e') && !strchr(str, 'E')) {+    /* There is no decimal point and no exponent, so add a decimal point */+    strcat(str, ".0");+  }+}++void+putdblb(flt64_t x, BFILE *p)+{+  char str[30];+  convdbl(str, "%.16g", x);+  putsb(str, p);+}++void printrec(BFILE *f, struct print_bits *pb, NODEPTR n, bool prefix);++/* Mark all reachable nodes, when a marked node is reached, mark it as shared. */+void+find_sharing(struct print_bits *pb, NODEPTR n)+{+ top:+  while (GETTAG(n) == T_IND) {+    n = GETINDIR(n);+  }+  if (n < cells || n >= cells + heap_size) abort();+  //PRINT("find_sharing %p %llu ", n, LABEL(n));+  tag_t tag = GETTAG(n);+  if (tag == T_AP || tag == T_ARR || tag == T_FORPTR) {+    if (test_bit(pb->shared_bits, n)) {+      /* Alread marked as shared */+      //PRINT("shared\n");+      ;+    } else if (test_bit(pb->marked_bits, n)) {+      /* Already marked, so now mark as shared */+      //PRINT("marked\n");+      set_bit(pb->shared_bits, n);+      num_shared++;+    } else {+      /* Mark as visited, and recurse */+      //PRINT("unmarked\n");+      set_bit(pb->marked_bits, n);+      switch(tag) {+      case T_AP:+        find_sharing(pb, FUN(n));+        n = ARG(n);+        goto top;+      case T_ARR:+        for(size_t i = 0; i < ARR(n)->size; i++) {+          find_sharing(pb, ARR(n)->array[i]);+        }+        break;+      default:+        break;+      }+    }+  } else {+    /* Not an sharable node, so do nothing */+    //PRINT("not T_AP\n");+    ;+  }+}++void+print_string(BFILE *f, struct bytestring bs)+{+  uint8_t *str = bs.string;+  putb('"', f);+  for (size_t i = 0; i < bs.size; i++) {+    int c = str[i];+#if 0+    if (c == '"' || c == '\\' || c < ' ' || c > '~') {+      putb('\\', f);+      putdecb(c, f);+      putb('&', f);+    } else {+      putb(c, f);+    }+#else+    if (c < 0 || c > 0xff)+      ERR("print_string");+    if (c < 0x20) {+      putb('^', f); putb(c + 0x20, f);+    } else if (c == '"' || c == '^' || c == '|' || c == '\\') {+      putb('\\', f); putb(c, f);+    } else if (c < 0x7f) {+      putb(c, f);+    } else if (c == 0x7f) {+      putb('\\', f); putb('?', f);+    } else if (c < 0xa0) {+      putb('^', f); putb(c - 0x80 + 0x40, f);+    } else if (c < 0xff) {+      putb('|', f); putb(c - 0x80, f);+    } else {                    /* must be< c == 0xff */+      putb('\\', f); putb('_', f);+    }+#endif+  }+  putb('"', f);+}++/*+ * Recursively print an expression.+ * This assumes that the shared nodes has been marked as such.+ * The prefix flag is used to get a readable dump.+ */+void+printrec(BFILE *f, struct print_bits *pb, NODEPTR n, bool prefix)+{+  int share = 0;+  enum node_tag tag;+  char prbuf[30];++  while (GETTAG(n) == T_IND) {+    /*putb('*', f);*/+    n = GETINDIR(n);+  }++  if (test_bit(pb->shared_bits, n)) {+    /* The node is shared */+    if (test_bit(pb->marked_bits, n)) {+      /* Not yet printed, so emit a label */+      if (prefix) {+        putb(':', f);+        putdecb((value_t)LABEL(n), f);+        putb(' ', f);+      } else {+        share = 1;+      }+      clear_bit(pb->marked_bits, n);  /* mark as printed */+    } else {+      /* This node has already been printed, so just use a reference. */+      putb('_', f);+      putdecb((value_t)LABEL(n), f);+      if (!prefix)+        putb(' ', f);+      return;+    }+  }++  //if (n == atptr) putb('@', f);+  tag = GETTAG(n);+  switch (tag) {+  case T_AP:+    if (prefix) {+      putb('(', f);+      printrec(f, pb, FUN(n), prefix);+      putb(' ', f);+      printrec(f, pb, ARG(n), prefix);+      putb(')', f);+    } else {+      printrec(f, pb, FUN(n), prefix);+      printrec(f, pb, ARG(n), prefix);+      putb('@', f);+    }+    break;+  case T_INT: putb('#', f); putdecb(GETVALUE(n), f); break;+#if NEED_INT64+  case T_INT64: putb('#', f); putb('#', f); putdecb64(GETINT64VALUE(n), f); break;+#endif  /* NEED_INT64 */+  case T_DBL: putb('&', f); putdblb(GETDBLVALUE(n), f); break;+  case T_FLT32: putb('&', f); putb('&', f); putdblb((double)GETFLTVALUE(n), f); break;+  case T_WEAK: ERR("serialize WEAK unimplemented");+  case T_ARR:+    if (prefix) {+      /* Arrays serialize as '[sz] e_1 ... e_sz' */+      putb('[', f);+      putdecb((value_t)ARR(n)->size, f);+      putb(']', f);+      for(size_t i = 0; i < ARR(n)->size; i++) {+        putb(' ', f);+        printrec(f, pb, ARR(n)->array[i], prefix);+      }+    } else {+      /* Arrays serialize as 'e_1 ... e_sz [sz]' */+      for(size_t i = 0; i < ARR(n)->size; i++) {+        printrec(f, pb, ARR(n)->array[i], prefix);+      }+      putb('[', f);+      putdecb((value_t)ARR(n)->size, f);+      putb(']', f);+    }+    break;+  case T_PTR:+    if (prefix) {+      snprintf(prbuf, sizeof prbuf, "PTR<%p>",PTR(n));+      putsb(prbuf, f);+    } else {+      ERR("Cannot serialize pointers");+    }+    break;+  case T_FUNPTR:+    /* There are a few function pointers that happen without user FFI.+     * We need to be able to serialize these.+     * XXX Make a table if we need more.+     */+    if (FUNPTR(n) == 0) {+      putsb(";0 ", f);+    } else if (FUNPTR(n) == (HsFunPtr)closeb) {+      putsb(";closeb ", f);+    } else if (prefix) {+      snprintf(prbuf, sizeof prbuf, "FUNPTR<%p>", FUNPTR(n));+      putsb(prbuf, f);+    } else {+      ERR("Cannot serialize function pointers");+    }+    break;+  case T_THID:+    if (prefix) {+      snprintf(prbuf, sizeof prbuf, "FUNPTR<%d>",(int)THR(n)->mt_id);+    } else {+      ERR("cannot serialize ThreadId yet");+    }+  case T_FORPTR:+    if (n == comb_stdin)+      putsb("IO.stdin", f);+    else if (n == comb_stdout)+      putsb("IO.stdout", f);+    else if (n == comb_stderr)+      putsb("IO.stderr", f);+#if WANT_GMP+    else if (FORPTR(n)->finalizer->fptype == FP_MPZ) {+      /* Serialize as %99999" */+      mpz_ptr op = FORPTR(n)->payload.string; /* get the mpz */+      int sz = mpz_sizeinbase(op, 10);        /* maximum length */+      char *s = mmalloc(sz + 2);+      (void)mpz_get_str(s, 10, op);           /* convert to a string */+      putsb("%", f);+      putsb(s, f);+      putsb("\"", f);                         /* so we can use parse_string */+      free(s);+    }+#endif  /* WANT_GMP */+    else if (FORPTR(n)->finalizer->fptype == FP_BSTR) {+      print_string(f, FORPTR(n)->payload);+    } else if (prefix) {+      snprintf(prbuf, sizeof prbuf, "FORPTR<%p>",FORPTR(n));+      putsb(prbuf, f);+    } else {+      ERR("Cannot serialize foreign pointers");+    }+    break;+  case T_IO_CCALL: putb('^', f); putsb(FFI_IX(GETVALUE(n)).ffi_name, f); break;+  case T_BADDYN: putb('^', f); putsb(CSTR(n), f); break;+  case T_TICK:+    putb('!', f);+    print_string(f, tick_table[GETVALUE(n)].tick_name);+    break;+  default:+    if (0 <= tag && tag <= T_LAST_TAG)+#if WANT_TICK && WANT_TAGNAMES+      if (tag_names[tag])+        putsb(tag_names[tag], f);+      else+#endif+        {+        snprintf(prbuf, sizeof prbuf, "TAG=%d", (int)tag);+        putsb(prbuf, f);+      }+    else {+      snprintf(prbuf, sizeof prbuf, "BADTAG(%d)", (int)tag);+      putsb(prbuf, f);+    }+    break;+  }+  if (!prefix) {+    if (GETTAG(n) != T_AP)+      putb(' ', f);+    if (share) {+      putb(':', f);+      putdecb((value_t)LABEL(n), f);+      putb(' ', f);+    }+  }+}++/* Serialize a graph to file. */+void+printb(BFILE *f, NODEPTR n, bool header)+{+  struct print_bits pb;+  num_shared = 0;+  pb.marked_bits = mcalloc(free_map_nwords, sizeof(bits_t));+  pb.shared_bits = mcalloc(free_map_nwords, sizeof(bits_t));+  find_sharing(&pb, n);+  if (header) {+    putsb(VERSION, f);+    putdecb(num_shared, f);+    putb('\n', f);+  }+  printrec(f, &pb, n, !header);+  if (header) {+    putb('}', f);+  }+  FREE(pb.marked_bits);+  FREE(pb.shared_bits);+}++/* Show a graph. */+void+pps(NODEPTR n)+{+  pp(stdout, n);+}++void+pp(FILE *f, NODEPTR n)+{+  BFILE *bf = add_FILE(f);+  printb(bf, n, false);+  putb('\n', bf);+  freeb_file(bf);+}++#if 0+NODEPTR *topnode;++void+ppmsg(const char *msg, NODEPTR n)+{+  printf("%s", msg);+  pp(stdout, n);+  printf("\n");+}++void+dump(const char *msg, NODEPTR at)+{+  atptr = at;+  printf("dump: %s\n", msg);+  pp(stdout, *topnode);+}+#endif++#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;+}++#if NEED_INT64+NODEPTR+mkInt64(int64_t i)+{+  NODEPTR n;+  n = alloc_node(T_INT64);+  SETINT64VALUE(n, i);+  return n;+}+#endif++#if WANT_FLOAT32+NODEPTR+mkFlt32(flt32_t d)+{+  NODEPTR n;+  n = alloc_node(T_FLT32);+  SETFLTVALUE(n, d);+  return n;+}+#endif  /* WANT_FLOAT32 */++#if WANT_FLOAT64+NODEPTR+mkFlt64(flt64_t d)+{+  NODEPTR n;+  n = alloc_node(T_DBL);+  SETDBLVALUE(n, d);+  return n;+}+#endif  /* WANT_FLOAT64 */++NODEPTR+mkPtr(void* p)+{+  NODEPTR n;+  n = alloc_node(T_PTR);+  PTR(n) = p;+  return n;+}++NODEPTR+mkFunPtr(void (*p)(void))+{+  NODEPTR n;+  n = alloc_node(T_FUNPTR);+  FUNPTR(n) = p;+  return n;+}++struct forptr*+mkForPtr(struct bytestring bs)+{+  struct final *fin = mcalloc(1, sizeof(struct final));+  struct forptr *fp = mcalloc(1, sizeof(struct forptr));+  if (bs.size == NOSIZE) {+    num_fin_alloc++;+  } else {+    num_bs_alloc++;+    num_bs_inuse += bs.size;+    num_bs_bytes += bs.size;+    if (num_bs_inuse > num_bs_inuse_max)+      num_bs_inuse_max = num_bs_inuse;+  }+  //printf("mkForPtr p=%p fin=%p fp=%p\n", p, fin, fp);+  fin->next = final_root;+  final_root = fin;+  fin->final = 0;+  fin->arg = bs.string;+  fin->size = bs.size;          /* The size is not really needed */+  fin->back = fp;+  fin->marked = 0;+  fp->next = 0;+  fp->payload = bs;+  fp->finalizer = fin;+  //  fp->desc = 0;+  return fp;+}++struct forptr*+mkForPtrP(void *p)+{+  struct bytestring bs = { NOSIZE, p };+  return mkForPtr(bs);+}++struct forptr*+addForPtr(struct forptr *ofp, int s)+{+  struct forptr *fp = mmalloc(sizeof(struct forptr));+  struct final *fin = ofp->finalizer;++  fp->next = ofp;+  fin->back = fp;+  if (ofp->payload.size != NOSIZE)+    fp->payload.size = ofp->payload.size - s;+  fp->payload.string = (uint8_t*)ofp->payload.string + s;+  fp->finalizer = fin;+  return fp;+}++struct forptr*+bssubstr(struct forptr *fp, value_t offs, value_t len)+{+  struct forptr *res = addForPtr(fp, offs);+  res->payload.size = len;+  return res;+}++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.+ * Does NOT do UTF decoding.+ */+NODEPTR+mkString(struct bytestring bs)+{+  NODEPTR n, nc;+  size_t i;+  const unsigned char *str = bs.string; /* no sign bits, please */++  n = mkNil();+  for(i = bs.size; i > 0; i--) {+    nc = mkInt(str[i-1]);+    n = mkCons(nc, n);+  }+  return n;+}++NODEPTR+mkStringC(char *str)+{+  struct bytestring bs = { strlen(str), str };+  return mkString(bs);+}++NODEPTR+mkStringU(struct bytestring bs)+{+  BFILE *ubuf = add_utf8(openb_rd_mem(bs.string, bs.size));+  NODEPTR n, *np, nc;++  //printf("mkStringU %d %s\n", (int)bs.size, (char*)bs.string);++  n = mkNil();+  np = &n;+  for(;;) {+    int c = getb(ubuf);+    if (c < 0)+      break;+    nc = mkInt(c);+    *np = mkCons(nc, *np);+    np = &ARG(*np);+  }+  closeb(ubuf);+  return n;+}++NODEPTR+bsunpack(struct bytestring bs)+{+  NODEPTR n, *np, nc;+  size_t i;++  n = mkNil();+  np = &n;+  for(i = 0; i < bs.size; i++) {+    nc = mkInt(((uint8_t *)bs.string)[i]);+    *np = mkCons(nc, *np);+    np = &ARG(*np);+  }+  return n;+}++/* XXX This should somehow be merged with other utf8 decoders */+/* Decode first character of a string and optionally return the rest of the string. */+/* Handles regular and modified UTF-8. */+value_t+headutf8(struct bytestring bs, void **ret)+{+  uint8_t *p = bs.string;+  if (bs.size == 0)+    ERR("headUTF8 0");+  int c1 = *p++;+  if ((c1 & 0x80) == 0) {+    if (ret)+      *ret = p;+    return c1;+  }+  if (bs.size == 1)+    ERR("headUTF8 1");+  int c2 = *p++;+  if ((c1 & 0xe0) == 0xc0) {+    if (ret)+      *ret = p;+    return ((c1 & 0x1f) << 6) | (c2 & 0x3f);+  }+  if (bs.size == 2)+    ERR("headUTF8 2");+  int c3 = *p++;+  if ((c1 & 0xf0) == 0xe0) {+    if (ret)+      *ret = p;+    return ((c1 & 0x0f) << 12) | ((c2 & 0x3f) << 6) | (c3 & 0x3f);+  }+  if (bs.size == 3)+    ERR("headUTF8 3");+  int c4 = *p++;+  if ((c1 & 0xf8) == 0xf0) {+    if (ret)+      *ret = p;+    return ((c1 & 0x07) << 18) | ((c2 & 0x3f) << 12) | ((c3 & 0x3f) << 6) | (c4 & 0x3f);+  }+  ERR("headUTF8 4");+  NOTREACHED;+}++/* 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 %s", TAGNAME(GETTAG(n)));+  }+#endif+  return GETVALUE(n);+}++#if WANT_FLOAT64+/* Evaluate to a flt64_t */+static INLINE flt64_t+evaldbl(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_DBL) {+    ERR1("evaldbl, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return GETDBLVALUE(n);+}+#endif  /* WANT_FLOAT64 */++#if WANT_FLOAT32+/* Evaluate to a flt32_t */+static INLINE flt32_t+evalflt(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_FLT32) {+    ERR1("evaldbl, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return GETFLTVALUE(n);+}+#endif  /* WANT_FLOAT32 */++/* Evaluate to a T_PTR */+void *+evalptr(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_PTR) {+    ERR1("evalptr, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return PTR(n);+}++/* Evaluate to a T_FUNPTR */+HsFunPtr+evalfunptr(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_FUNPTR) {+    ERR1("evalfunptr, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return FUNPTR(n);+}++/* Evaluate to a T_FORPTR */+struct forptr *+evalforptr(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_FORPTR) {+    ERR1("evalforptr, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return FORPTR(n);+}++/* Evaluate to a bytestring */+struct forptr *+evalbstr(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_FORPTR || FORPTR(n)->finalizer->fptype != FP_BSTR) {+    ERR1("evalbstr, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return FORPTR(n);+}++/* Evaluate to a T_THID */+struct mthread *+evalthid(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_THID) {+    ERR1("evalthid, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return THR(n);+}++/* Evaluate to a T_MVAR */+struct mvar *+evalmvar(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_MVAR) {+    ERR1("evalmvar, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return MVAR(n);+}++/* Evaluate to a T_WEAK */+void *+evalweak(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_WEAK) {+    ERR1("evalweak, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return WEAK(n);+}++/* Evaluate a string, returns a newly allocated buffer.+ * XXX this is cheating, should use continuations.+ * XXX the malloc()ed string is leaked if we yield in here.+ * Caller is responsible to free().+ * Does modified UTF-8 encoding.+ */+struct bytestring+evalstring(NODEPTR n)+{+  size_t sz = 100;+  char *buf = mmalloc(sz);+  size_t offs;+  uvalue_t c;+  NODEPTR x;+  struct bytestring bs;++  for (offs = 0;;) {+    if (offs >= sz - 4) {+      sz *= 2;+      buf = mrealloc(buf, sz);+    }+    PUSH(n);                    /* protect the list from GC */+    n = evali(n);+    POP(1);+    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 */+      PUSH(n);                  /* protect from GC */+      c = evalint(ARG(x));+      n = POPTOP();+      if ((c & 0x1ff800) == 0xd800) {+        // c is a surrogate+        c = 0xfffd; // replacement character+      }+      if (0 < c && c < 0x80) {   /* exclude 0, since this is modified UTF-8 */+        buf[offs++] = (char)c;+      } else if (c < 0x800) {+        /* 0 encodes here, with an over-long representation */+        buf[offs++] = ((c >> 6 )       ) | 0xc0;+        buf[offs++] = ((c      ) & 0x3f) | 0x80;+      } else if (c < 0x10000) {+        buf[offs++] = ((c >> 12)       ) | 0xe0;+        buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;+        buf[offs++] = ((c      ) & 0x3f) | 0x80;+      } else if (c < 0x110000) {+        buf[offs++] = ((c >> 18)       ) | 0xf0;+        buf[offs++] = ((c >> 12) & 0x3f) | 0x80;+        buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;+        buf[offs++] = ((c      ) & 0x3f) | 0x80;+      } else {+	ERR("invalid char");+      }+      n = ARG(n);+    } else {+      ERR("evalstring not Nil/Cons");+    }+  }+  buf[offs] = 0;                /* in case we use it as a C string */+  bs.size = offs;+  bs.string = buf;+  return bs;+}++/* Does not do UTF-8 encoding */+struct bytestring+evalbytestring(NODEPTR n)+{+  size_t sz = 100;+  uint8_t *buf = mmalloc(sz);+  size_t offs;+  uvalue_t c;+  NODEPTR x;+  struct bytestring bs;++  for (offs = 0;;) {+    if (offs >= sz - 1) {+      sz *= 2;+      buf = mrealloc(buf, sz);+    }+    PUSH(n);                    /* protect list from GC */+    n = evali(n);+    POP(1);+    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 */+      PUSH(n);                  /* protect from GC */+      c = evalint(ARG(x));+      n = POPTOP();+      buf[offs++] = c;+      n = ARG(n);+    } else {+      //pp(stdout, n);+      ERR("evalbytestring not Nil/Cons");+    }+  }+  buf[offs] = 0;                /* in case we use it as a C string */+  bs.size = offs;+  bs.string = buf;+  return bs;+}++struct bytestring+bsreplicate(size_t size, uint8_t value)+{+  struct bytestring bs;+  bs.size = size;+  bs.string = mmalloc(size);+  memset(bs.string, value, size);+  return bs;+}++struct bytestring+bsappend(struct bytestring p, struct bytestring q)+{+  struct bytestring r;+  r.size = p.size + q.size;+  r.string = mmalloc(r.size);+  memcpy(r.string, p.string, p.size);+  memcpy((uint8_t *)r.string + p.size, q.string, q.size);+  return r;+}++struct bytestring+bsappenddot(struct bytestring p, struct bytestring q)+{+  struct bytestring r;+  r.size = p.size + q.size + 1;+  r.string = mmalloc(r.size);+  memcpy(r.string, p.string, p.size);+  memcpy((uint8_t *)r.string + p.size, ".", 1);+  memcpy((uint8_t *)r.string + p.size + 1, q.string, q.size);+  return r;+}++/*+ * Compare bytestrings.+ * We can't use memcmp() directly for two reasons:+ *  - the two strings can have different lengths+ *  - the return value is only guaranteed to be ==0 or !=0+ */+int+bscompare(struct bytestring bsp, struct bytestring bsq)+{+  uint8_t *p = bsp.string;+  uint8_t *q = bsq.string;+  size_t len = bsp.size < bsq.size ? bsp.size : bsq.size;+  while (len--) {+    int r = (int)*p++ - (int)*q++;+    if (r) {+      /* Unequal bytes found. */+      if (r < 0)+        return -1;+      if (r > 0)+        return 1;+      return 0;+    }+  }+  /* Got to the end of the shorter string. */+  /* The shorter string is considered smaller. */+  if (bsp.size < bsq.size)+    return -1;+  if (bsp.size > bsq.size)+    return 1;+  return 0;+}++void+rnf_rec(bits_t *done, NODEPTR n)+{+ top:+  if (test_bit(done, n))+    return;+  set_bit(done, n);+  n = evali(n);+  if (GETTAG(n) == T_AP) {+    PUSH(ARG(n));               /* protect from GC */+    rnf_rec(done, FUN(n));+    n = POPTOP();+    goto top;+  }+}++void+rnf(value_t noerr, NODEPTR n)+{+  /* Mark visited nodes to avoid getting stuck in loops. */+  bits_t *done = mcalloc(free_map_nwords, sizeof(bits_t));+  if (doing_rnf)+    ERR("recursive rnf()");+  doing_rnf = (bool)noerr;+  rnf_rec(done, n);+  doing_rnf = false;+  FREE(done);+}++/* Evaluate a node, returns when the node is in WHNF. */+NODEPTR+evali(NODEPTR an)+{+  NODEPTR n = an;+  stackptr_t stk = stack_ptr;+  NODEPTR x, y, z, w;+  value_t xi, yi, r;+  struct forptr *xfp;+  char *msg;+  heapoffs_t l;+  enum node_tag tag;+  struct ioarray *arr;+  struct bytestring xbs, ybs, rbs;+#if WANT_STDIO+  void *bfile;+  int hdr;+#endif  /* WANT_STDIO */++#if MAXSTACKDEPTH+  counter_t old_cur_c_stack = cur_c_stack;+  if (++cur_c_stack > max_c_stack)+    max_c_stack = cur_c_stack;+#endif++/* Reset stack pointer and return. */+#define RET do { goto ret; } while(0)+#define HASNARGS(n) (stack_ptr - stk >= (n))+/* Check that there are at least n arguments, return if not. */+#define CHECK(n) do { if (!HASNARGS(n)) RET; } while(0)++#define SETIND(n, x) SETINDIR(n, x)+#define GOIND(x) do { NODEPTR _x = (x); SETIND(n, _x); n = _x; goto top; } while(0)+#define GOAP(f,a) do { FUN(n) = (f); ARG(n) = (a); goto ap; } while(0)+#define GOAP2(f,a,b) do { FUN(n) = new_ap((f), (a)); ARG(n) = (b); goto ap2; } while(0)+#define GOPAIR(a) do { FUN(n) = new_ap(combPair, (a)); goto ap; } while(0)+#define GOPAIRUNIT do { FUN(n) = combPairUnit; 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)+#define CHKARG5 do { CHECK(5); POP(5); n = TOP(-1); /*v = ARG(n);*/ w = ARG(TOP(-2)); z = ARG(TOP(-3)); y = ARG(TOP(-4)); x = ARG(TOP(-5)); } while(0)+/* Non-popping versions */+#define CHKARG1NP do { CHECK(1); n = TOP(0);                                               x = ARG(n);      } while(0)+#define CHKARG2NP do { CHECK(2); n = TOP(1);                              y = ARG(n);      x = ARG(TOP(0)); } while(0)+#define CHKARG3NP do { CHECK(3); n = TOP(2);             z = ARG(n);      y = ARG(TOP(1)); x = ARG(TOP(0)); } while(0)+#define CHKARG4NP do { CHECK(4); n = TOP(3); w = ARG(n); z = ARG(TOP(2)); y = ARG(TOP(1)); x = ARG(TOP(0)); } 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 SETINT64(n,r)  do { SETTAG((n), T_INT64); SETINT64VALUE((n), (r)); } while(0)+#define SETDBL(n,d)    do { SETTAG((n), T_DBL); SETDBLVALUE((n), (d)); } while(0)+#define SETFLT(n,d)    do { SETTAG((n), T_FLT32); SETFLTVALUE((n), (d)); } while(0)+#define SETPTR(n,r)    do { SETTAG((n), T_PTR); PTR(n) = (r); } while(0)+#define SETFUNPTR(n,r) do { SETTAG((n), T_FUNPTR); FUNPTR(n) = (r); } while(0)+#define SETFORPTR(n,r) do { SETTAG((n), T_FORPTR); FORPTR(n) = (r); } while(0)+#define SETBSTR(n,r)   do { SETTAG((n), T_FORPTR); FORPTR(n) = (r); FORPTR(n)->finalizer->fptype = FP_BSTR; } while(0)+#define OPINT1(e)      do { CHECK(1); xi = evalint(ARG(TOP(0)));                            e; POP(1); n = TOP(-1); } while(0);+#define OPPTR2(e)      do { CHECK(2); xp = evalptr(ARG(TOP(0))); yp = evalptr(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);+#define CMPP(op)       do { OPPTR2(r = xp op yp); GOIND(r ? combTrue : combFalse); } while(0)++ top:+  /*pp(stdout, an);*/+  if (--glob_slice <= 0)+    yield();+  l = LABEL(n);+  if (l < T_IO_STDIN) {+    /* The node is one of the permanent nodes; the address offset is the tag */+    tag = l;+  } else {+    /* Heap allocated node */+    if (ISINDIR(n)) {+      /* Follow indirections */+      NODEPTR on = n;+      do {+        n = GETINDIR(n);+      } while(ISINDIR(n));+      SETINDIR(on, n);          /* and short-circuit them */+    }+    tag = GETTAG(n);+  }+  //printf("%s %d\n", tag_names[tag], (int)stack_ptr);+  //if (stack_ptr < -1)+  //  ERR("stack_ptr");+  switch (tag) {+  ap2:         PUSH(n); n = FUN(n);+  ap:+  case T_AP:   PUSH(n);+    n = FUN(n); goto top;++  case T_INT:    RET;+  case T_DBL:    RET;+#if NEED_INT64+  case T_INT64:  RET;+#endif  /* NEED_INT64 */+  case T_FLT32:  RET;+  case T_PTR:    RET;+  case T_FUNPTR: RET;+  case T_FORPTR: RET;+  case T_ARR:    RET;+  case T_THID:   RET;+  case T_MVAR:   RET;+  case T_WEAK:   RET;+  case T_BADDYN: ERR1("FFI unknown %s", CSTR(n));++  /*+   * Some of these reductions, (e.g., Z x y = K (x y)) are there to avoid+   * that increase in arity that some "optimizations" in Abstract.hs+   * stop reductions from happening.  This can be important for "full laziness".+   * In practice, these reductions almost never happen, but there they are anyway. :)+   */+  case T_S:    GCCHECK(2); CHKARG3; GOAP2(x, z, new_ap(y, z));                            /* S x y z = x z (y z) */+  case T_SS:   GCCHECK(3); CHKARG4; GOAP2(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:   if (!HASNARGS(4)) {+               GCCHECK(1); CHKARG2; COUNT(red_bb); GOAP(combB, new_ap(x, y)); } else {    /* B' x y = B (x y) */+               GCCHECK(2); CHKARG4; GOAP2(x, y, new_ap(z, w)); }                          /* B' x y z w = x y (z w) */+  case T_Z:    if (!HASNARGS(3)) {+               GCCHECK(1); CHKARG2; COUNT(red_z); GOAP(combK, new_ap(x, y)); } else {     /* Z x y = K (x y) */+                           CHKARG3; GOAP(x, y); }                                         /* Z x y z = x y */+//case T_J:                CHKARG3; GOAP(z, x);                                           /* J x y z = z x */+  t_c:+  case T_C:    GCCHECK(1); CHKARG3; GOAP2(x, z, y);                                       /* C x y z = x z y */+  case T_CC:   GCCHECK(2); CHKARG4; GOAP2(x, new_ap(y, w), z);                            /* C' x y z w = x (y w) z */+  t_p:+  case T_P:    GCCHECK(1); CHKARG3; GOAP2(z, x, y);                                       /* P x y z = z x y */+  case T_R:    if(!HASNARGS(3)) {+               GCCHECK(1); CHKARG2; COUNT(red_r); GOAP2(combC, y, x); } else {            /* R x y = C y x */+               GCCHECK(1); CHKARG3; GOAP2(y, z, x); }                                     /* R x y z = y z x */+  case T_O:    GCCHECK(1); CHKARG4; GOAP2(w, x, y);                                       /* O x y z w = w x y */+  case T_K2:   if (!HASNARGS(3)) {+                           CHKARG2; COUNT(red_k2); GOAP(combK, x); } else {               /* K2 x y = K x */+                           CHKARG3; GOIND(x); }                                           /* K2 x y z = *x */+  case T_K3:   if (!HASNARGS(4)) {+                           CHKARG2; COUNT(red_k3); GOAP(combK2, x); } else {              /* K3 x y = K2 x */+                           CHKARG4; GOIND(x); }                                           /* K3 x y z w = *x */+  case T_K4:   if (!HASNARGS(5)) {+                           CHKARG2; COUNT(red_k4); GOAP(combK3, x); } else {              /* K4 x y = K3 x */+                           CHKARG5; GOIND(x); }                                           /* K4 x y z w v = *x */+  case T_CCB:  if (!HASNARGS(4)) {+               GCCHECK(2); CHKARG3; COUNT(red_ccb); GOAP2(combB, new_ap(x, z), y);} else{ /* C'B x y z = B (x z) y */+               GCCHECK(2); CHKARG4; GOAP2(x, z, new_ap(y, w)); }                          /* C'B x y z w = x z (y w) */++    /*+     * Strict primitives require evaluating the arguments before we can proceed.+     * The easiest way to do this is to just recursively call evali() for each argument.+     * The drawback of this is that it uses a lot of C stack.  (E.g., recompiling MicroHs+     * uses a stack depth of 1800).+     * Instead we use the following scheme:+     *  When we find a strict binary (int) primitive we push T_BININT2,+     *  set n=second argument.+     *  Continue evaluation of n.+     *  When n is finally evaluated and we are about to return we check if the stack top is T_BININT2.+     *  If so, change the stack top to T_BININT1,+     *  set n=first argument.+     *  Continue evaluation of n.+     *  When n is finally evaluated and we are about to return we check if the stack top is T_BININT1.+     *  If so, we know that both arguments are now evaluated, and we perform the strict operation.+     *+     * On my desktop machine this is about 3% slower, on my laptop (Apple M1) it is about 3% faster.+     *+     * Pictorially for BININT+     *  Before the code below:+     *  ----+     *  | --------> @+     *  ----       / \+     *  | ------> @   y+     *  ----     / \+     *  n ----> ADD x+     *+     * After+     *  ----+     *  | --------> @+     *  ----       / \+     *  | ------> @   y+     *  ----     / \+     *  | ->BI2 ADD x+     *  ----        ^+     *  n ----------|+     *+     *  x becomes an INT, stack is not empty, BININT2 found on top+     *  ----+     *  | --------> @+     *  ----       / \+     *  | ------> @   y+     *  ----     / \+     *  | ->BI2 ADD INT+     *  ----        ^+     *  n ----------|+     *+     *  After+     *  ----+     *  | --------> @+     *  ----       / \+     *  | ------> @   y+     *  ----     / \    \+     *  | ->BI1 ADD INT  |+     *  ----             |+     *  n ---------------|+     *+     *  y becomes an INT, stack is not empty, BININT1 found on top+     *  do arithmetic+     *  ----+     *  | --------> @+     *  ----       / \+     *  | ------> @   INT+     *  ----     / \    \+     *  | ->BI1 ADD INT  |+     *  ----             |+     *  n ---------------|+     *+     *  ----+     *  n -------> INT(x+y)+     */+  case T_ADD:+  case T_SUB:+  case T_MUL:+  case T_QUOT:+  case T_REM:+  case T_SUBR:+  case T_UQUOT:+  case T_UREM:+  case T_AND:+  case T_OR:+  case T_XOR:+  case T_SHL:+  case T_SHR:+  case T_ASHR:+  case T_EQ:+  case T_NE:+  case T_LT:+  case T_LE:+  case T_GT:+  case T_GE:+  case T_ICMP:+  case T_ULT:+  case T_ULE:+  case T_UGT:+  case T_UGE:+  case T_UCMP:+    CHECK(2);+    n = ARG(TOP(1));+    if (GETTAG(n) == T_INT) {+      n = ARG(TOP(0));+      PUSH(combBININT1);+      if (GETTAG(n) == T_INT)+        goto binint1;+    } else {+      PUSH(combBININT2);+    }+    goto top;+  case T_NEG:+  case T_INV:+  case T_POPCOUNT:+  case T_CLZ:+  case T_CTZ:+    CHECK(1);+    n = ARG(TOP(0));+    PUSH(combUNINT1);+    goto top;++#if WANT_FLOAT32+  case T_FADD:+  case T_FSUB:+  case T_FMUL:+  case T_FDIV:+  case T_FEQ:+  case T_FNE:+  case T_FLT:+  case T_FLE:+  case T_FGT:+  case T_FGE:+    CHECK(2);+    n = ARG(TOP(1));+    PUSH(combBINFLT2);+    goto top;+  case T_FNEG:+    CHECK(1);+    n = ARG(TOP(0));+    PUSH(combUNFLT1);+    goto top;++  case T_I64TOF:+    {+#if WANT_INT64 || WORD_SIZE == 64+    CHECK(1);+    x = evali(ARG(TOP(0)));+#if SANITY+    if (GETTAG(x) != T_INT64)+      ERR("T_INT64 tag");+#endif+    flt32_t rf = (flt32_t)GETINT64VALUE(x);+    POP(1);+    n = TOP(-1);+    SETFLT(n, rf);+    RET;+#else+    ERR("No Int64");+#endif+    }++  case T_ITOF:+    {+    CHECK(1);+    x = evali(ARG(TOP(0)));+#if SANITY+    if (GETTAG(x) != T_INT)+      ERR("T_ITOF tag");+#endif+    flt32_t rf = (flt32_t)GETVALUE(x);+    POP(1);+    n = TOP(-1);+    SETFLT(n, rf);+    RET;+    }++#endif  /* WANT_FLOAT32 */++#if WANT_FLOAT64+  case T_DADD:+  case T_DSUB:+  case T_DMUL:+  case T_DDIV:+  case T_DEQ:+  case T_DNE:+  case T_DLT:+  case T_DLE:+  case T_DGT:+  case T_DGE:+    CHECK(2);+    n = ARG(TOP(1));+    PUSH(combBINDBL2);+    goto top;+  case T_DNEG:+    CHECK(1);+    n = ARG(TOP(0));+    PUSH(combUNDBL1);+    goto top;++#if WANT_INT64 || WORD_SIZE == 64+  case T_I64TOD:+    {+    CHECK(1);+    x = evali(ARG(TOP(0)));+#if SANITY+    if (GETTAG(x) != T_INT64)+      ERR("T_INT64 tag");+#endif+    flt64_t rd = (flt64_t)GETINT64VALUE(x);+    POP(1);+    n = TOP(-1);+    SETDBL(n, rd);+    RET;+    }+#endif++  case T_ITOD:+    {+    CHECK(1);+    x = evali(ARG(TOP(0)));+#if SANITY+    if (GETTAG(x) != T_INT)+      ERR("T_ITOD tag");+#endif+    flt64_t rd = (flt64_t)GETVALUE(x);+    POP(1);+    n = TOP(-1);+    SETDBL(n, rd);+    RET;+    }++#endif  /* WANT_FLOAT64 */++  case T_ISINT:+    CHECK(1);+    x = evali(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETINT(n, GETTAG(x) == T_INT ? GETVALUE(x) : -1);+    RET;++  case T_BSAPPEND:+  case T_BSAPPENDDOT:+  case T_BSEQ:+  case T_BSNE:+  case T_BSLT:+  case T_BSLE:+  case T_BSGT:+  case T_BSGE:+  case T_BSCMP:+    CHECK(2);+    n = ARG(TOP(1));+    PUSH(combBINBS2);+    goto top;++#if NEED_INT64+  case T_ADD64:+  case T_SUB64:+  case T_MUL64:+  case T_QUOT64:+  case T_REM64:+  case T_SUBR64:+  case T_UQUOT64:+  case T_UREM64:+  case T_AND64:+  case T_OR64:+  case T_XOR64:+  case T_SHL64:+  case T_SHR64:+  case T_ASHR64:+  case T_EQ64:+  case T_NE64:+  case T_LT64:+  case T_LE64:+  case T_GT64:+  case T_GE64:+  case T_ICMP64:+  case T_ULT64:+  case T_ULE64:+  case T_UGT64:+  case T_UGE64:+  case T_UCMP64:+    CHECK(2);+    n = ARG(TOP(1));+    if (GETTAG(n) == T_INT64) {+      n = ARG(TOP(0));+      PUSH(combBININT64_1);+      if (GETTAG(n) == T_INT64)+        goto binint64_1;+    } else {+      PUSH(combBININT64_2);+    }+    goto top;+  case T_NEG64:+  case T_INV64:+  case T_POPCOUNT64:+  case T_CLZ64:+  case T_CTZ64:+    CHECK(1);+    n = ARG(TOP(0));+    PUSH(combUNINT64_1);+    goto top;+#endif  /* NEED_INT64 */+++  /* XXX This needs redoing with Int64 */+  /* Retag a word sized value, keeping the value bits */+#define CONV(t, set, get) do { CHECK(1); x = evali(ARG(TOP(0))); n = POPTOP(); SETTAG(n, t); set(n, get(x)); RET; } while(0)+#if WANT_INT64+  case T_TODBL:    CONV(T_DBL,    SETINT64VALUE, GETINT64VALUE); /* raw int64_t -> double */+  case T_FROMDBL:  CONV(T_INT64,  SETINT64VALUE, GETINT64VALUE);+  case T_ITOI64:   CONV(T_INT64,  SETINT64VALUE, GETVALUE);+  case T_UTOU64:   CONV(T_INT64,  SETINT64VALUE, (uint64_t)GETVALUE);+  case T_I64TOI:   CONV(T_INT,    SETVALUE,      GETINT64VALUE);+  case T_U64TOU:   CONV(T_INT,    SETVALUE,      GETINT64VALUE);+#endif+#if WANT_FLOAT32+  case T_TOFLT:    CONV(T_FLT32,  SETINT32VALUE, GETINT32VALUE);+  case T_FROMFLT:  CONV(T_INT,    SETVALUE,      GETINT32VALUE);+#endif+  case T_TOINT:    CONV(T_INT,    SETVALUE,      GETVALUE);+  case T_TOPTR:    CONV(T_PTR,    SETVALUE,      GETVALUE);+  case T_TOFUNPTR: CONV(T_FUNPTR, SETVALUE,      GETVALUE);+#undef CONV++  case T_FPADD: CHECK(2); xfp = evalforptr(ARG(TOP(0))); yi = evalint(ARG(TOP(1))); POP(2); n = TOP(-1); SETFORPTR(n, addForPtr(xfp, yi)); RET;+  case T_FP2P:+    CHECK(1);+    xfp = evalforptr(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETPTR(n, xfp->payload.string);+    RET;++  case T_FP2BS:+    CHECK(2);+    xfp = evalforptr(ARG(TOP(0)));+    xi = evalint(ARG(TOP(1)));+    POP(2);+    n = TOP(-1);+    xfp->payload.size = xi;+    SETBSTR(n, xfp);+    RET;++  case T_BS2FP:+    CHECK(1);+    xfp = evalbstr(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETFORPTR(n, xfp);+    RET;++  case T_ARR_EQ:+    {+      CHECK(2);+      x = evali(ARG(TOP(0)));+      arr = ARR(x);+      y = evali(ARG(TOP(1)));+      POP(2);+      n = TOP(-1);+      GOIND(arr == ARR(y) ? combTrue : combFalse);+    }++  case T_BSTOUTF8:+    {+      CHECK(1);+      n = ARG(TOP(0));+      /* Zap the pointer to the list so it can be GC:ed.+       * The actual list is protected from GC by evalbytestring().+       */+      // ARG(TOP(0)) = combK;+      struct bytestring bs = evalstring(n);+      POP(1);+      n = TOP(-1);+      SETBSTR(n, mkForPtrFree(bs));+      RET;+    }++  case T_BSHEADUTF8:+    CHECK(1);+    xfp = evalbstr(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETINT(n, headutf8(xfp->payload, (void**)0));+    RET;++  case T_BSTAILUTF8:+    CHECK(1);+    xfp = evalbstr(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    { void *out;+      (void)headutf8(xfp->payload, &out);           /* skip one UTF8 character */+      xi = (char*)out - (char*)xfp->payload.string; /* offset */+      yi = xfp->payload.size - xi;                  /* remaining length */+      SETBSTR(n, bssubstr(xfp, xi, yi));            /* make a substring */+    }+    RET;++  case T_BSFROMUTF8:+    if (doing_rnf) RET;+    CHECK(1);++    xfp = evalbstr(ARG(TOP(0)));+    GCCHECK(strNodes(xfp->payload.size));+    POP(1);+    n = TOP(-1);+    //printf("T_FROMUTF8 x = %p fp=%p payload.string=%p\n", x, x->uarg.uuforptr, x->uarg.uuforptr->payload.string);+    GOIND(mkStringU(xfp->payload));++  case T_BSUNPACK:+    if (doing_rnf) RET;+    CHECK(1);+    struct forptr *xfp = evalbstr(ARG(TOP(0)));+    GCCHECK(strNodes(xfp->payload.size));+    POP(1);+    n = TOP(-1);+    GOIND(bsunpack(xfp->payload));++  case T_BSPACK:+    CHECK(1);+    n = ARG(TOP(0));+    /* Zap the pointer to the list so it can be GC:ed.+     * The actual list is protected from GC by evalbytestring().+     */+    ARG(TOP(0)) = combK;+    struct bytestring rbs = evalbytestring(n);+    POP(1);+    n = TOP(-1);+    SETBSTR(n, mkForPtrFree(rbs));+    RET;++  case T_BSREPLICATE:+    CHECK(2);+    xi = evalint(ARG(TOP(0)));+    yi = evalint(ARG(TOP(1)));+    POP(2);+    n = TOP(-1);+    SETBSTR(n, mkForPtrFree(bsreplicate(xi, yi)));+    RET;++  case T_BSLENGTH:+    CHECK(1);+    xfp = evalbstr(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETINT(n, xfp->payload.size);+    RET;++  case T_BSSUBSTR:+    CHECK(3);+    xfp = evalbstr(ARG(TOP(0)));+    xi = evalint(ARG(TOP(1)));+    yi = evalint(ARG(TOP(2)));+    POP(3);+    n = TOP(-1);+    SETBSTR(n, bssubstr(xfp, xi, yi));+    RET;++  case T_BSINDEX:+    CHECK(2);+    xfp = evalbstr(ARG(TOP(0)));+    xi = evalint(ARG(TOP(1)));+    POP(2);+    n = TOP(-1);+    SETINT(n, ((uint8_t *)xfp->payload.string)[xi]);+    RET;++  case T_BSWRITE:+    CHKARG4NP;+    xfp = evalbstr(x);+    xi = evalint(y);+    yi = evalint(z);+    POP(4);+    ((uint8_t *)xfp->payload.string)[xi] = (uint8_t)yi;+    GOPAIRUNIT;++  case T_RAISE:+    if (doing_rnf) RET;+    CHKARG1;+    raise_exn(x);               /* never returns */+    +  case T_SPNEW:+    GCCHECK(1);+    CHKARG2;+    xi = new_stableptr(x);+    GOPAIR(mkInt(xi));+  case T_SPDEREF:+    CHKARG2NP;+    xi = evalint(x);+    POP(2);+    GOPAIR(deref_stableptr(xi));+  case T_SPFREE:+    CHKARG2NP;+    xi = evalint(x);+    free_stableptr(xi);+    POP(2);+    GOPAIRUNIT;++  case T_WKNEW:+    GCCHECK(2);+    CHKARG3;+    GOPAIR(new_weak_ptr(x, y, 0));+  case T_WKNEWFIN:+    GCCHECK(3);+    CHKARG4;+    GOPAIR(new_weak_ptr(x, y, z));+  case T_WKDEREF:+    CHKARG2NP;+    x = deref_weak_ptr(evalweak(x));+    POP(2);+    GOPAIR(x);+  case T_WKFINAL:+    CHKARG2NP;+    finalize_weak_ptr(evalweak(x));+    POP(2);+    GOPAIRUNIT;++  case T_SEQ:  CHECK(2); evali(ARG(TOP(0))); POP(2); n = TOP(-1); y = ARG(n); GOIND(y); /* seq x y = eval(x); y */++  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:+    GCCHECK(2);+    if (doing_rnf) RET;+    CHKARG1;+    /* Conjure up a new world and evaluate the io with that world, finally selecting the result */+    /* PERFORMIO io  -->  io World K */+#if 1+    GOAP2(x, combWorld, combK);+#else+    {+      /* Don't count performio reductions. */+      /* Useful when Debug.Trace.trace should have zero cost */+      NODEPTR p1 = new_ap(x, combWorld);+      NODEPTR p2 = new_ap(p1, combK);+      counter_t s = glob_slice;+      glob_slice = 1000000000;+      NODEPTR p3 = evali(p2);+      glob_slice = s;+      GOIND(p3);+    }+#endif++  case T_IO_BIND:+    goto t_c;+  case T_IO_RETURN:+    goto t_p;+  case T_IO_THEN:+    GCCHECK(2);+    CHKARG2;+    GOAP2(combIOBIND, x, new_ap(combK, y));+#if WANT_STDIO+  case T_IO_PP:+    CHKARG2;+    pp(stderr, x);+    GOPAIRUNIT;+  case T_IO_PRINT:+    hdr = false;+    goto ser;+  case T_IO_SERIALIZE:+    hdr = true;+  ser:+#if 0+    gc();                     /* DUBIOUS: do a GC to get possible GC reductions */+#endif+    CHKARG3NP;+    bfile = (struct BFILE*)evalptr(x);+    printb(bfile, evali(y), hdr);+    putb('\n', bfile);+    POP(3);+    GOPAIRUNIT;+  case T_IO_DESERIALIZE:+    CHKARG2NP;+    bfile = (struct BFILE*)evalptr(x);+    gc();                     /* make sure we have room.  GC during parse is dodgy. */+    x = parse_top(bfile, 0);+    POP(2);+    GOPAIR(x);                /* allocates a cell, but we did a GC above */+#endif+#if WANT_ARGS+  case T_IO_GETARGREF:+    GCCHECK(2);+    CHKARG1;+    x = alloc_node(T_ARR);+    ARR(x) = argarray;+    GOPAIR(x);+#endif+  case T_IO_CCALL:+    {+      GCCHECK(1);                 /* room for placeholder */+      int a = (int)GETVALUE(n);   /* function number */+      //printf("  %s\n", FFI_IX(a).ffi_name);+      int arity = FFI_IX(a).ffi_arity;+      CHECK(arity);+      funptr_t f = FFI_IX(a).ffi_fun;+      PUSH(mkPtr(0));             /* placeholder for result, protected from GC */+      int k = f(stk);             /* call FFI function, return number of arguments */+      if (k != arity) {+#if WANT_STDIO+        fprintf(stderr, "ccall arity %s %d!=%d\n", FFI_IX(a).ffi_name, arity, k);+#endif+        ERR("ccall arity");     /* temporary sanity check */+      }+      GCCHECK(1);                 /* room for pair */+      x = POPTOP();               /* pop actual result */+      POP(arity);                 /* pop the pushed arguments */+      if (stack_ptr < 0)+        ERR("CCALL POP");+      n = POPTOP();               /* node to update */+      GOPAIR(x);                  /* and this is the result */+    }++  case T_NEWCASTRINGLEN:+    {+      CHKARG2NP;                /* set x,y,n */+      struct bytestring bs = evalbytestring(x);+      GCCHECK(5);+      NODEPTR cs = alloc_node(T_PTR);+      PTR(cs) = bs.string;+      NODEPTR res = new_ap(new_ap(combPair, cs), mkInt(bs.size));+      POP(2);+      GOPAIR(res);+    }+  case T_PACKCSTRING:+    {+      CHKARG2NP;                  /* sets x, y, n */+      char *cstr = evalptr(x);+      size_t size = strlen(cstr);+      char *str = mmalloc(size);+      memcpy(str, cstr, size);+      struct bytestring bs = { size, str };+      NODEPTR res = mkStrNode(bs);+      GCCHECKSAVE(res, 1);+      POP(2);+      GOPAIR(res);+    }+  case T_PACKCSTRINGLEN:+    {+      CHKARG3NP;                /* sets x,y,z,n */+      char *cstr = evalptr(x);+      size_t size = evalint(y);+      char *str = mmalloc(size);+      memcpy(str, cstr, size);+      struct bytestring bs = { size, str };+      NODEPTR res = mkStrNode(bs);+      POP(3);+      GCCHECKSAVE(res, 1);+      GOPAIR(res);+    }+  case T_BSGRAB:+    {+      CHKARG2NP;                  /* sets x, y, n */+      char *cstr = evalptr(x);+      size_t size = strlen(cstr);+      struct bytestring bs = { size, cstr };+      NODEPTR res = mkStrNode(bs);+      GCCHECKSAVE(res, 1);+      POP(2);+      GOPAIR(res);+    }++  case T_ARR_ALLOC:+    {+      CHKARG3NP;                /* sets x,y,z,n */+      size_t size = evalint(x);+      struct ioarray *arr = arr_alloc(size, y);+      GCCHECK(2);+      NODEPTR res = alloc_node(T_ARR);+      ARR(res) = arr;+      POP(3);+      GOPAIR(res);+    }+  case T_ARR_COPY:+    {+      CHKARG2NP;+      NODEPTR a = evali(x);+      if (GETTAG(a) != T_ARR)+        ERR("T_ARR_COPY tag");+      struct ioarray *arr = arr_copy(ARR(a));+      GCCHECK(2);+      NODEPTR res = alloc_node(T_ARR);+      ARR(res) = arr;+      POP(2);+      GOPAIR(res);+    }+  case T_ARR_SIZE:+    {+      CHKARG2NP;+      NODEPTR a = evali(x);+      if (GETTAG(a) != T_ARR)+        ERR("bad ARR tag");+      GCCHECK(2);+      NODEPTR res = mkInt(ARR(a)->size);+      POP(2);+      GOPAIR(res);+    }+  case T_ARR_READ:+    {+      CHKARG3NP;                /* sets x,y,n */+      size_t i = evalint(y);+      NODEPTR a = evali(x);+      if (GETTAG(a) != T_ARR)+        ERR("bad ARR tag");+      if (i >= ARR(a)->size)+        ERR("ARR_READ");+      GCCHECK(1);+      NODEPTR res = ARR(a)->array[i];+      POP(3);+      GOPAIR(res);+    }+  case T_ARR_WRITE:+    {+      CHKARG4NP;                /* sets x,y,z,n */+      size_t i = evalint(y);+      NODEPTR a = evali(x);+      if (GETTAG(a) != T_ARR)+        ERR("bad ARR tag");+      if (i >= ARR(a)->size) {+        ERR("ARR_WRITE");+      }+      ARR(a)->array[i] = z;+      POP(4);+      GOPAIRUNIT;+      }++  case T_ARR_TRUNC:+    {+      CHKARG3NP;                /* sets x,y,n */+      size_t i = evalint(y);+      NODEPTR a = evali(x);+      if (GETTAG(a) != T_ARR)+        ERR("bad ARR tag");+      if (i >= ARR(a)->size) {+        ERR("ARR_TRUNC");+      }+      ARR(a)->size = i;+      POP(3);+      GOPAIRUNIT;+      }++  case T_FPNEW:+    {+      CHKARG2NP;+      //printf("T_FPNEW\n");+      void *xp = evalptr(x);+      //printf("T_FPNEW xp=%p\n", xp);+      GCCHECK(2);+      NODEPTR res = alloc_node(T_FORPTR);+      SETFORPTR(res, mkForPtrP(xp));+      POP(2);+      GOPAIR(res);+    }+  case T_FPFIN:+    {+      CHKARG3NP;+      //printf("T_FPFIN\n");+      struct forptr *xfp = evalforptr(y);+      //printf("T_FPFIN xfp=%p\n", xfp);+      HsFunPtr xp = evalfunptr(x);+      //printf("T_FPFIN yp=%p\n", yp);+      xfp->finalizer->final = xp;+      POP(3);+      GOPAIRUNIT;+    }+  case T_IO_GC:+    //printf("gc()\n");+    CHKARG2NP;+    {+      int red = evalint(x);+      int oldred = want_gc_red;+      want_gc_red = red;+      gc();+      want_gc_red = oldred;+    }+    POP(2);+    GOPAIRUNIT;++  case T_IO_STATS:+    {+    GCCHECK(4);+    CHKARG1;+    NODEPTR res = new_ap(new_ap(combPair, mkInt((uvalue_t)num_alloc)), mkInt((uvalue_t)(num_reductions - glob_slice)));+    GOPAIR(res);+    }++  case T_IO_FORK:+    {+      GCCHECK(3);+      CHKARG2;                /* set x=io, y=ST, n */+      struct mthread *mt = new_thread(new_ap(x, y)); /* copy the world */+      mt->mt_mask = runq.mq_head->mt_mask; /* inherit masking state */+      NODEPTR res = alloc_node(T_THID);+      THR(res) = mt;+      GOPAIR(res);+    }++  case T_IO_THID:+    {+      GCCHECK(2);+      CHKARG1;+      NODEPTR res = alloc_node(T_THID);+      THR(res) = runq.mq_head;            /* head of the run queue is the current thread */+      GOPAIR(res);+    }+  case T_IO_THROWTO:+    {+      CHKARG3NP;                /* x=this, y=exn, z=ST */+      check_thrown(true);       /* check if we have a thrown exception */+      struct mthread *mt = evalthid(x);+      throwto(mt, y);+      POP(3);+      GOPAIRUNIT;+    }+  case T_IO_YIELD:+    CHKARG1;+    yield();+    GOPAIRUNIT;++  case T_IO_NEWMVAR:+    {+      GCCHECK(2);+      CHKARG1;+      struct mvar *mv = new_mvar();+      NODEPTR res = alloc_node(T_MVAR);+      MVAR(res) = mv;+      GOPAIR(res);+    }+  case T_IO_TAKEMVAR:+    {+      CHKARG2NP;             /* set x=mvar, y=ST */+      check_thrown(true);    /* check if we have a thrown exception */+      NODEPTR res = take_mvar(false, evalmvar(x));         /* never returns if it blocks */+      GCCHECKSAVE(res, 1);+      POP(2);+      GOPAIR(res);+    }+  case T_IO_READMVAR:+    {+      CHKARG2NP;+      check_thrown(true);    /* check if we have a thrown exception */+      NODEPTR res = read_mvar(false, evalmvar(x));         /* never returns if it blocks */+      GCCHECKSAVE(res, 1);+      POP(2);+      GOPAIR(res);+    }+  case T_IO_PUTMVAR:+    {+      CHKARG3NP;             /* set x=mvar, y=value, z=ST */+      check_thrown(true);    /* check if we have a thrown exception */+      (void)put_mvar(false, evalmvar(x), y); /* never returns if it blocks */+      POP(3);+      GOPAIRUNIT;+    }+  case T_IO_TRYTAKEMVAR:+    {+      CHKARG2NP;+      NODEPTR res = take_mvar(true, evalmvar(x));+      GCCHECKSAVE(res, 2);+      if (res != NIL)+        res = new_ap(combJust, res);+      else+        res = combNothing;+      POP(2);+      GOPAIR(res);+    }+  case T_IO_TRYREADMVAR:+    {+      CHKARG2NP;+      NODEPTR res = read_mvar(true, evalmvar(x));+      if (res != NIL) {+        GCCHECKSAVE(res, 2);+        res = new_ap(combJust, res);+      } else {+        res = combNothing;+      }+      POP(2);+      GOPAIR(res);+    }+  case T_IO_TRYPUTMVAR:+    {+      CHKARG3NP;+      NODEPTR res = put_mvar(true, evalmvar(x), y) ? combTrue : combFalse;+      GCCHECKSAVE(res, 1);+      POP(3);+      GOPAIR(res);+    }+  case T_IO_THREADDELAY:+    {+      CHKARG2NP;+#if defined(CLOCK_INIT)+      check_thrown(true);      /* check if we have a thrown exception */+      if (runq.mq_head->mt_at == -1) {+        /* delay has already expired, so just return */+        runq.mq_head->mt_at = 0;+        POP(2);+        GOPAIRUNIT;+      } else {+        thread_delay(evalint(x)); /* never returns */+      }+#else+      ERR("threadDelay: no clock");+#endif+    }+  case T_IO_THREADSTATUS:+    {+      CHKARG2NP;+      struct mthread *mt = evalthid(x);+      GCCHECK(2);+      POP(2);+      GOPAIR(mkInt(mt->mt_state));+    }+  case T_IO_GETMASKINGSTATE:+    CHKARG1;                    /* x = ST */+    GOPAIR(mkInt(runq.mq_head->mt_mask));++  case T_IO_SETMASKINGSTATE:+    CHKARG2;                    /* x = level, y = ST */+    runq.mq_head->mt_mask = evalint(x);+    GOPAIRUNIT;++  case T_CATCH:+    /* CATCH x y z --> CATCHR (x z) y z */+    GCCHECK(3);+    CHKARG3;                    /* x=io, y=hdl, z=ST */+    GOAP(new_ap(new_ap(combCATCHR, new_ap(x, z)), y), z);+  case T_CATCHR:+    {+      CHKARG3NP;                /* x = (io st), y = hdl, z = st, n = (CATCHR (io st)) h */+      struct handler *h = mmalloc(sizeof *h);+      h->hdl_old = cur_handler;+      cur_handler = h;+      stackptr_t ostack = stack_ptr;;    /* old stack pointer */+      enum mask_state omask = runq.mq_head->mt_mask;     /* old mask */+      if (setjmp(h->hdl_buf)) {+        /* An exception occurred: */+        stack_ptr = ostack;+        runq.mq_head->mt_mask = mask_interruptible; /* evaluate with mask */+        NODEPTR exn = h->hdl_exn;       /* exception value */+        cur_handler = h->hdl_old;       /* reset handler */+        FREE(h);+        GCCHECK(8);+        POP(3);+        /*+         * Run:+         *  hdl exn `primBind` \ r ->+         *  primSetMaskingState omask `primThen`+         *  primReturn r+         * i.e.,+         *  primBind (hdl exn) (B' primThen (primSetMaskingState omask) primReturn)+         */+        NODEPTR p = new_ap(combIOBIND, new_ap(y, exn));+        NODEPTR q = new_ap(new_ap(new_ap(combBB, combIOTHEN), new_ap(combSETMASKINGSTATE, mkInt(omask))), combIORETURN);+        GOAP2(p, q, z);+      } else {+        /* Normal execution: */+        x = evali(x);             /* execute first argument */+        /* No exception occurred */+        cur_handler = h->hdl_old; /* restore old handler */+        FREE(h);+        POP(3);+        GOIND(x);+      }+    }++  case T_THNUM:+    {+    CHECK(1);+    struct mthread *mt = evalthid(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETINT(n, (uvalue_t)mt->mt_id);+    RET;+    }++  case T_DYNSYM:+    /* A dynamic FFI lookup */+    CHECK(1);+    msg = evalstring(ARG(TOP(0))).string;+    GCCHECK(1);+    x = ffiNode(msg);+    FREE(msg);+    POP(1);+    n = TOP(-1);+    GOIND(x);++#if WANT_TICK+  case T_TICK:+    xi = GETVALUE(n);+    CHKARG1;+    dotick(xi);+    GOIND(x);+#endif++  default:+    ERR1("eval tag %s", TAGNAME(GETTAG(n)));+  }+++ ret:+  if (stack_ptr != stk) {+    // In this case, n was an AP that got pushed and potentially+    // updated.+    uvalue_t xu, yu, ru;+#if NEED_INT64+    uint64_t x64u, y64u, r64u;+#endif  /* NEED_INT64 */+#if WANT_FLOAT32+    flt32_t xf, yf, rf;+#endif  /* WANT_FLOAT32 */+#if WANT_FLOAT64+    flt64_t xd, yd, rd;+#endif  /* WANT_FLOAT64 */+    NODEPTR p;++    tag = GETTAG(TOP(0));+    switch (tag) {+    case T_BININT2:+      n = ARG(TOP(1));+      TOP(0) = combBININT1;+      goto top;++    case T_BININT1:+      /* First argument */+#if SANITY+      if (GETTAG(n) != T_INT)+        ERR("BININT 0");+#endif  /* SANITY */+    binint1:+      xu = (uvalue_t)GETVALUE(n);+      /* Second argument */+      y = ARG(TOP(2));+      while (GETTAG(y) == T_IND)+        y = GETINDIR(y);+#if SANITY+      if (GETTAG(y) != T_INT)+        ERR("BININT 1");+#endif  /* SANITY */+      yu = (uvalue_t)GETVALUE(y);+      p = FUN(TOP(1));+      POP(3);+      n = TOP(-1);+    binint:+      switch (GETTAG(p)) {+      case T_IND:   p = GETINDIR(p); goto binint;+      case T_ADD:   ru = xu + yu; break;+      case T_SUB:   ru = xu - yu; break;+      case T_MUL:   ru = xu * yu; break;+      case T_SUBR:  ru = yu - xu; break;+      case T_QUOT:  if (yu == 0)+                      raise_rts(exn_dividebyzero);+                    else+                      ru = (uvalue_t)((value_t)xu / (value_t)yu);+                    break;+      case T_REM:   if (yu == 0)+                      raise_rts(exn_dividebyzero);+                    else+                      ru = (uvalue_t)((value_t)xu % (value_t)yu);+                    break;+      case T_UQUOT: if (yu == 0)+                      raise_rts(exn_dividebyzero);+                    else+                      ru = xu / yu;+                    break;+      case T_UREM:  if (yu == 0)+                      raise_rts(exn_dividebyzero);+                    else+                      ru = xu % yu;+                    break;+      case T_AND:   ru = xu & yu; break;+      case T_OR:    ru = xu | yu; break;+      case T_XOR:   ru = xu ^ yu; break;+      case T_SHL:   ru = xu << yu; break;+      case T_SHR:   ru = xu >> yu; break;+      case T_ASHR:  ru = (uvalue_t)((value_t)xu >> yu); break;++      case T_EQ:    GOIND(xu == yu ? combTrue : combFalse);+      case T_NE:    GOIND(xu != yu ? combTrue : combFalse);+      case T_ULT:   GOIND(xu <  yu ? combTrue : combFalse);+      case T_ULE:   GOIND(xu <= yu ? combTrue : combFalse);+      case T_UGT:   GOIND(xu >  yu ? combTrue : combFalse);+      case T_UGE:   GOIND(xu >= yu ? combTrue : combFalse);+      case T_UCMP:  GOIND(xu <  yu ? combLT   : xu > yu ? combGT : combEQ);+      case T_LT:    GOIND((value_t)xu <  (value_t)yu ? combTrue : combFalse);+      case T_LE:    GOIND((value_t)xu <= (value_t)yu ? combTrue : combFalse);+      case T_GT:    GOIND((value_t)xu >  (value_t)yu ? combTrue : combFalse);+      case T_GE:    GOIND((value_t)xu >= (value_t)yu ? combTrue : combFalse);+      case T_ICMP:  GOIND((value_t)xu <  (value_t)yu ? combLT   : (value_t)xu > (value_t)yu ? combGT : combEQ);++      default:+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));+        ERR("BININT");+      }+      SETINT(n, (value_t)ru);+      goto ret;++    case T_UNINT1:+      /* The argument */+#if SANITY+      if (GETTAG(n) != T_INT)+        ERR("UNINT 0");+#endif+      xu = (uvalue_t)GETVALUE(n);+      p = FUN(TOP(1));+      POP(2);+      n = TOP(-1);+    unint:+      switch (GETTAG(p)) {+      case T_IND:      p = GETINDIR(p); goto unint;+      case T_NEG:      ru = -xu; break;+      case T_INV:      ru = ~xu; break;+      case T_POPCOUNT: ru = POPCOUNT(xu); break;+      case T_CLZ:      ru = CLZ(xu); break;+      case T_CTZ:      ru = CTZ(xu); break;+      default:+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));+        ERR("UNINT");+      }+      SETINT(n, (value_t)ru);+      goto ret;++#if NEED_INT64+    case T_BININT64_2:+      n = ARG(TOP(1));+      TOP(0) = combBININT64_1;+      goto top;++    case T_BININT64_1:+      /* First argument */+#if SANITY+      if (GETTAG(n) != T_INT64)+        ERR("BININT64 0");+#endif  /* SANITY */+    binint64_1:+      x64u = (uint64_t)GETINT64VALUE(n);+      /* Second argument */+      y = ARG(TOP(2));+      while (GETTAG(y) == T_IND)+        y = GETINDIR(y);+      /* The second argument to the shift ops is an int, so use a hack for that */+      if (GETTAG(y) == T_INT64)+        y64u = (uint64_t)GETINT64VALUE(y);+      else if (GETTAG(y) == T_INT)+        yu = (uvalue_t)GETVALUE(y);+      else+        ERR("BININT64 1");+      p = FUN(TOP(1));+      POP(3);+      n = TOP(-1);+    binint64:+      switch (GETTAG(p)) {+      case T_IND:   p = GETINDIR(p); goto binint64;+      case T_ADD64: r64u = x64u + y64u; break;+      case T_SUB64: r64u = x64u - y64u; break;+      case T_MUL64: r64u = x64u * y64u; break;+      case T_SUBR64:r64u = y64u - x64u; break;+      case T_QUOT64:if (y64u == 0)+                      raise_rts(exn_dividebyzero);+                    else+                      r64u = (uint64_t)((int64_t)x64u / (int64_t)y64u);+                    break;+      case T_REM64: if (y64u == 0)+                      raise_rts(exn_dividebyzero);+                    else+                      r64u = (uint64_t)((int64_t)x64u % (int64_t)y64u);+                    break;+      case T_UQUOT64:if (y64u == 0)+                      raise_rts(exn_dividebyzero);+                    else+                      r64u = x64u / y64u;+                    break;+      case T_UREM64:if (y64u == 0)+                      raise_rts(exn_dividebyzero);+                    else+                      r64u = x64u % y64u;+                    break;+      case T_AND64: r64u = x64u & y64u; break;+      case T_OR64:  r64u = x64u | y64u; break;+      case T_XOR64: r64u = x64u ^ y64u; break;+      case T_SHL64: r64u = x64u << yu; break;+      case T_SHR64: r64u = x64u >> yu; break;+      case T_ASHR64:r64u = (uint64_t)((int64_t)x64u >> yu); break;++      case T_EQ64:  GOIND(x64u == y64u ? combTrue : combFalse);+      case T_NE64:  GOIND(x64u != y64u ? combTrue : combFalse);+      case T_ULT64: GOIND(x64u <  y64u ? combTrue : combFalse);+      case T_ULE64: GOIND(x64u <= y64u ? combTrue : combFalse);+      case T_UGT64: GOIND(x64u >  y64u ? combTrue : combFalse);+      case T_UGE64: GOIND(x64u >= y64u ? combTrue : combFalse);+      case T_UCMP64:GOIND(x64u <  y64u ? combLT   : x64u > y64u ? combGT : combEQ);+      case T_LT64:  GOIND((int64_t)x64u <  (int64_t)y64u ? combTrue : combFalse);+      case T_LE64:  GOIND((int64_t)x64u <= (int64_t)y64u ? combTrue : combFalse);+      case T_GT64:  GOIND((int64_t)x64u >  (int64_t)y64u ? combTrue : combFalse);+      case T_GE64:  GOIND((int64_t)x64u >= (int64_t)y64u ? combTrue : combFalse);+      case T_ICMP64:GOIND((int64_t)x64u <  (int64_t)y64u ? combLT   : (int64_t)x64u > (int64_t)y64u ? combGT : combEQ);++      default:+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));+        ERR("BININT64");+      }+      SETINT64(n, (int64_t)r64u);+      goto ret;++    case T_UNINT64_1:+      /* The argument */+#if SANITY+      if (GETTAG(n) != T_INT64)+        ERR("UNINT64 0");+#endif+      x64u = (uint64_t)GETINT64VALUE(n);+      p = FUN(TOP(1));+      POP(2);+      n = TOP(-1);+    unint64:+      switch (GETTAG(p)) {+      case T_IND:        p = GETINDIR(p); goto unint64;+      case T_NEG64:      r64u = -x64u; break;+      case T_INV64:      r64u = ~x64u; break;+      case T_POPCOUNT64: ru = POPCOUNT64(x64u); SETINT(n, (value_t)ru); goto ret;+      case T_CLZ64:      ru = CLZ64(x64u); SETINT(n, (value_t)ru); goto ret;+      case T_CTZ64:      ru = CTZ64(x64u); SETINT(n, (value_t)ru); goto ret;+      default:+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));+        ERR("UNINT64");+      }+      SETINT64(n, (int64_t)r64u);+      goto ret;+#endif  /* NEED_INT64 */++#if WANT_FLOAT32+    case T_BINFLT2:+      n = ARG(TOP(1));+      TOP(0) = combBINFLT1;+      goto top;++    case T_BINFLT1:+      /* First argument */+#if SANITY+      if (GETTAG(n) != T_FLT32)+        ERR("BINDBL 0");+#endif  /* SANITY */+      xf = GETFLTVALUE(n);+      /* Second argument */+      y = ARG(TOP(2));+      while (GETTAG(y) == T_IND)+        y = GETINDIR(y);+#if SANITY+      if (GETTAG(y) != T_FLT32)+        ERR("BINDBL 1");+#endif  /* SANITY */+      yf = GETFLTVALUE(y);+      p = FUN(TOP(1));+      POP(3);+      n = TOP(-1);+    binflt:+      switch (GETTAG(p)) {+      case T_IND:   p = GETINDIR(p); goto binflt;+      case T_FADD:  rf = xf + yf; break;+      case T_FSUB:  rf = xf - yf; break;+      case T_FMUL:  rf = xf * yf; break;+      case T_FDIV:  rf = xf / yf; break;++      case T_FEQ:   GOIND(xf == yf ? combTrue : combFalse);+      case T_FNE:   GOIND(xf != yf ? combTrue : combFalse);+      case T_FLT:   GOIND(xf <  yf ? combTrue : combFalse);+      case T_FLE:   GOIND(xf <= yf ? combTrue : combFalse);+      case T_FGT:   GOIND(xf >  yf ? combTrue : combFalse);+      case T_FGE:   GOIND(xf >= yf ? combTrue : combFalse);++      default:+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));+        ERR("BINFLT");+      }+      SETFLT(n, rf);+      goto ret;++    case T_UNFLT1:+      /* The argument */+#if SANITY+      if (GETTAG(n) != T_FLT32)+        ERR("UNFLT 0");+#endif+      xf = GETFLTVALUE(n);+      p = FUN(TOP(1));+      POP(2);+      n = TOP(-1);+    unflt:+      switch (GETTAG(p)) {+      case T_IND:   p = GETINDIR(p); goto unflt;+      case T_FNEG:  rf = -xf; break;+      default:+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));+        ERR("UNFLT");+      }+      SETFLT(n, rf);+      goto ret;+#endif  /* WANT_FLOAT32 */++#if WANT_FLOAT64+    case T_BINDBL2:+      n = ARG(TOP(1));+      TOP(0) = combBINDBL1;+      goto top;++    case T_BINDBL1:+      /* First argument */+#if SANITY+      if (GETTAG(n) != T_DBL)+        ERR("BINDBL 0");+#endif  /* SANITY */+      xd = GETDBLVALUE(n);+      /* Second argument */+      y = ARG(TOP(2));+      while (GETTAG(y) == T_IND)+        y = GETINDIR(y);+#if SANITY+      if (GETTAG(y) != T_DBL)+        ERR("BINDBL 1");+#endif  /* SANITY */+      yd = GETDBLVALUE(y);+      p = FUN(TOP(1));+      POP(3);+      n = TOP(-1);+    bindbl:+      switch (GETTAG(p)) {+      case T_IND:   p = GETINDIR(p); goto bindbl;+      case T_DADD:  rd = xd + yd; break;+      case T_DSUB:  rd = xd - yd; break;+      case T_DMUL:  rd = xd * yd; break;+      case T_DDIV:  rd = xd / yd; break;++      case T_DEQ:   GOIND(xd == yd ? combTrue : combFalse);+      case T_DNE:   GOIND(xd != yd ? combTrue : combFalse);+      case T_DLT:   GOIND(xd <  yd ? combTrue : combFalse);+      case T_DLE:   GOIND(xd <= yd ? combTrue : combFalse);+      case T_DGT:   GOIND(xd >  yd ? combTrue : combFalse);+      case T_DGE:   GOIND(xd >= yd ? combTrue : combFalse);++      default:+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));+        ERR("BINDBL");+      }+      SETDBL(n, rd);+      goto ret;++    case T_UNDBL1:+      /* The argument */+#if SANITY+      if (GETTAG(n) != T_DBL)+        ERR("UNDBL 0");+#endif+      xd = GETDBLVALUE(n);+      p = FUN(TOP(1));+      POP(2);+      n = TOP(-1);+    undbl:+      switch (GETTAG(p)) {+      case T_IND:   p = GETINDIR(p); goto undbl;+      case T_DNEG:  rd = -xd; break;+      default:+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));+        ERR("UNDBL");+      }+      SETDBL(n, rd);+      goto ret;+#endif  /* WANT_FLOAT64 */++    case T_BINBS2:+      n = ARG(TOP(1));+      TOP(0) = combBINBS1;+      goto top;++    case T_BINBS1:+      /* First argument */+#if SANITY+      if (GETTAG(n) != T_FORPTR || FORPTR(n)->finalizer->fptype != FP_BSTR)+        ERR("BINBS 0");+#endif  /* SANITY */+      xbs = BSTR(n);+      /* Second argument */+      y = ARG(TOP(2));+      while (GETTAG(y) == T_IND)+        y = GETINDIR(y);+#if SANITY+      if (GETTAG(y) != T_FORPTR || FORPTR(y)->finalizer->fptype != FP_BSTR)+        ERR("BINBS 1");+#endif  /* SANITY */+      ybs = BSTR(y);+      p = FUN(TOP(1));+      POP(3);+      n = TOP(-1);+    binbs:+      switch (GETTAG(p)) {+      case T_IND:    p = GETINDIR(p); goto binbs;++      case T_BSAPPEND: rbs = bsappend(xbs, ybs); break;+      case T_BSAPPENDDOT: rbs = bsappenddot(xbs, ybs); break;+      case T_BSEQ:   GOIND(bscompare(xbs, ybs) == 0 ? combTrue : combFalse);+      case T_BSNE:   GOIND(bscompare(xbs, ybs) != 0 ? combTrue : combFalse);+      case T_BSLT:   GOIND(bscompare(xbs, ybs) <  0 ? combTrue : combFalse);+      case T_BSLE:   GOIND(bscompare(xbs, ybs) <= 0 ? combTrue : combFalse);+      case T_BSGT:   GOIND(bscompare(xbs, ybs) >  0 ? combTrue : combFalse);+      case T_BSGE:   GOIND(bscompare(xbs, ybs) >= 0 ? combTrue : combFalse);+      case T_BSCMP:  r = bscompare(xbs, ybs); GOIND(r < 0 ? combLT : r > 0 ? combGT : combEQ);++      default:+        //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));+        ERR("BINBS");+      }+      SETBSTR(n, mkForPtrFree(rbs));+      goto ret;++    default:+      stack_ptr = stk;+      n = TOP(-1);+    }+  }+#if MAXSTACKDEPTH+  cur_c_stack = old_cur_c_stack; /* reset rather than counting down, in case of longjump */+#endif+  return n;+}++static char *progname = "?";++NORETURN void+die_exn(NODEPTR exn)+{+  /* No handler:+   * First convert the exception to a string by calling displaySomeException.+   * The display function compiles to combShowExn, so we need to build+   * (combShowExn exn) and evaluate it.+   */+  NODEPTR x;+  char *msg;++  in_raise = true;++  if (GETTAG(exn) == T_INT) {+    /* This is the special hack for RTS generated exception, represented by a T_INT */+    switch(GETVALUE(exn)) {+    case 0: msg = "stack overflow"; break;+    case 1: msg = "heap overflow"; break;+    case 2: msg = "thread killed"; break;+    case 3: msg = "user interrupt"; break;+    case 4: msg = "DivideByZero"; break;+    case 5: msg = "blocked MVar"; break;+    case 6: msg = "blocked STM"; break;+    default: msg = "unknown"; break;+    }+  } else {+    /* just overwrite the top stack element, we don't need it */+    CLEARSTK();+    GCCHECK(1);+    PUSH(new_ap(combShowExn, exn));/* TOP(0) = (combShowExn exn) */+    x = evali(TOP(0));             /* evaluate it */+    msg = evalstring(x).string;    /* and convert to a C string */+    POP(1);+  }+#if WANT_STDIO+  /* A horrible hack until we get proper exceptions */+  if (strcmp(msg, "ExitSuccess") == 0) {+    EXIT(0);+  } else {+    fprintf(stderr, "\n%s: uncaught exception: %s\n", progname, msg);+    EXIT(1);+  }+#else  /* WANT_STDIO */+  ERR1("mhs error: %s", msg);+#endif  /* WANT_STDIO */+}++#if WANT_ARGS+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;+}+#endif++extern const uint8_t *combexpr;+extern const int combexprlen;++#if WANT_TICK+int dump_ticks = 0;+#endif++NODEPTR+mhs_init_args(+#if WANT_ARGS+              int argc, char **argv,+#endif+#if WANT_STDIO+              char **outnamep,+              size_t *file_sizep+#endif+)+{+  NODEPTR prog;+#if WANT_ARGS+  char *inname = 0;+  char **av;+  char **gargv;+  int gargc;+  int inrts;+#endif++#if 0+  /* MINGW doesn't do buffering right */+  setvbuf(stdout, NULL, _IOLBF, BUFSIZ);+  setvbuf(stderr, NULL, _IONBF, BUFSIZ);+#endif++#ifdef INITIALIZATION+  main_setup(); /* Do platform specific start-up. */+#endif++#ifdef CLOCK_INIT+  CLOCK_INIT();+#endif++#if WANT_SIGINT+  {+    (void)signal(SIGINT, handle_sigint);+    sigset_t set;+    sigemptyset(&set);+    sigaddset(&set, SIGINT);+    sigprocmask(SIG_UNBLOCK, &set, NULL);+  }+#endif++  heap_size = HEAP_CELLS;       /* number of heap cells */+  stack_size = STACK_SIZE;      /* number of stack slots */++#if WANT_ARGS+  progname = argv[0];+  argc--, argv++;+  gargv = 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++;+#if WANT_TICK+        else if (strcmp(p, "-T") == 0)+          dump_ticks = 1;+#endif+        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)+          *outnamep = &p[2];+        else if (strcmp(p, "-B") == 0)+          gcbell++;+#endif  /* WANT_STDIO */+        else+          ERR("Usage: eval [+RTS [-v] [-B] [-T] [-Hheap-size] [-Kstack-size] [-rFILE] [-oFILE] -RTS] arg ...");+      }+    } else {+      if (strcmp(p, "+RTS") == 0) {+        inrts = 1;+      } else {+        *av++ = p;+      }+    }+  }+  gargc = av - gargv;++  if (inname == 0)+    inname = "out.comb";+#endif++  init_nodes();+  stack = mmalloc(sizeof(NODEPTR) * stack_size);+  CLEARSTK();+  init_stableptr();++  num_reductions = 0;++#if WANT_ARGS+  /* Initialize an IORef (i.e., single element IOArray+   * to contain the list of program arguments.+   * The 0th element is the program name, and the rest+   * are the non RTS arguments.+   */+  {+    NODEPTR n;+    /* No GC checks, the heap is empty. */+    n = mkNil();+    for(int i = gargc-1; i >= 0; i--) {+      n = mkCons(mkStringC(gargv[i]), n);+    }+    n = mkCons(mkStringC(progname), n);+    argarray = arr_alloc(1, n);      /* An IORef contains a single element array */+    argarray->permanent = true;         /* never GC the arguments, because a T_IO_GETARGREF can reach argarray */+  }+#endif  /* WANT_ARGS */++  {+    /* Read the combinator code. */+    BFILE *bf;+    if (combexpr) {+      /* The code is in memory, create a memore buffer BFILE */+      bf = openb_rd_mem(combexpr, combexprlen);+#if WANT_STDIO+      *file_sizep = combexprlen;+#endif+    } else {+#if WANT_STDIO+      /* Open a regular file */+      FILE *f = fopen(inname, "r");+      if (!f)+        ERR1("file not found %s", inname);+      fseek(f, 0, SEEK_END);+      *file_sizep = ftell(f);   /* find its size */+      rewind(f);+    +      bf = add_FILE(f);+#else+      ERR("no stdio");+#endif+    }+    int c = getb(bf);+#if WANT_BASE64+    /* Compressed combinators start with a 'z', otherwise 'v' (for version) */+    if (c != 'z' && c != 'v') {+      /* Neither z nor v, assume base64 encoded */+      ungetb(c, bf);+      bf = add_base64_decoder(bf);+      c = getb(bf);+    }+#endif+    if (c == 'z') {+      /* add LZ77 compressor transducer */+      bf = add_lz77_decompressor(bf);+    } else {+      /* put it back, we need it */+      ungetb(c, bf);+    }+    prog = parse_top(bf, xffe_table);+    closeb(bf);+  }++  /* GC unused stuff, nice for -o */+  PUSH(prog);+  want_gc_red = 1;+  gc();+  gc();                         /* this finds some more GC reductions */+  want_gc_red = 0;              /* can be enabled, but it is rarely a win */+  prog = POPTOP();+  return prog;+}  ++void+mhs_init(void)+{+  char *args[2] = { "<mhs_init>", 0 };+  char *outname;+  size_t file_size;+  (void)mhs_init_args(1, args, &outname, &file_size);+}++int+mhs_main(int argc, char **argv)+{+  NODEPTR prog;+  char *outname = 0;+  size_t file_size = 0;+#if WANT_KPERF+  counter_t instrs;+#endif  /* WANT_KPERF */++  prog = mhs_init_args(argc, argv, &outname, &file_size);++#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);+    struct BFILE *bf = add_FILE(out);+    printb(bf, prog, true);+    closeb(bf);+    EXIT(0);+  }+  if (verbose > 2) {+    pp(stdout, prog);+  }+#endif+  run_time -= GETTIMEMILLI();++#if 0+  topnode = &prog;+#endif+#if WANT_KPERF+  if (!start_kperf()) {+    // ERR("kperf init failed");+#if WANT_STDIO+    fprintf(stderr, "start_kperf() failed, ignored\n");+#endif+  }+#endif  /* WANT_KPERF */+  start_exec(prog);+  /* Flush standard handles in case there is some BFILE buffering */+  flushb((BFILE*)FORPTR(comb_stdout)->payload.string);+  flushb((BFILE*)FORPTR(comb_stderr)->payload.string);+  gc();                      /* Run finalizers */+#if WANT_KPERF+  instrs = end_kperf();+#endif  /* WANT_KPERF */+  run_time += GETTIMEMILLI();++#if WANT_STDIO+  if (verbose) {+    if (verbose > 1) {+      PRINT("node size=%"PRIheap", heap size bytes=%"PRIheap"\n", (heapoffs_t)NODE_SIZE, heap_size * NODE_SIZE);+    }+    setlocale(LC_NUMERIC, "en_US");  /* Make %' work on platforms that support it */+    PRINT("%"PCOMMA"15"PRIheap" combinator file size\n", (heapoffs_t)file_size);+    PRINT("%"PCOMMA"15"PRIheap" cells at start\n", start_size);+    PRINT("%"PCOMMA"15"PRIheap" cells heap size (%"PCOMMA""PRIheap" bytes)\n", heap_size, heap_size * NODE_SIZE);+    PRINT("%"PCOMMA"15"PRIcounter" cells allocated (%"PCOMMA".1f Mbyte/s)\n", num_alloc, num_alloc * NODE_SIZE / ((double)run_time / 1000) / 1000000);+    PRINT("%"PCOMMA"15"PRIcounter" GCs\n", num_gc);+    PRINT("%"PCOMMA"15"PRIcounter" max cells used\n", max_num_marked);+    PRINT("%"PCOMMA"15"PRIcounter" reductions (%"PCOMMA".1f Mred/s)\n", num_reductions, num_reductions / ((double)run_time / 1000) / 1000000);+    PRINT("%"PCOMMA"15"PRIcounter" yields (%"PCOMMA""PRIcounter" resched)\n", num_yield, num_resched);+    PRINT("%"PCOMMA"15"PRIcounter" array alloc\n", num_arr_alloc);+    PRINT("%"PCOMMA"15"PRIcounter" array free\n", num_arr_free);+    PRINT("%"PCOMMA"15"PRIcounter" foreign alloc\n", num_fin_alloc);+    PRINT("%"PCOMMA"15"PRIcounter" foreign free\n", num_fin_free);+    PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc (max %"PCOMMA""PRIcounter")\n", num_bs_alloc, num_bs_alloc_max);+    PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc bytes (max %"PCOMMA""PRIcounter")\n", num_bs_bytes, num_bs_inuse_max);+    PRINT("%"PCOMMA"15"PRIcounter" bytestring free\n", num_bs_free);+    PRINT("%"PCOMMA"15"PRIcounter" thread create\n", num_thread_create-1);+    PRINT("%"PCOMMA"15"PRIcounter" thread reap\n", num_thread_reap);+    PRINT("%"PCOMMA"15"PRIcounter" stableptr alloc\n", num_stable_alloc);+    PRINT("%"PCOMMA"15"PRIcounter" stableptr free\n", num_stable_free);+    PRINT("%"PCOMMA"15"PRIcounter" weakptr alloc\n", num_new_weak);+    PRINT("%"PCOMMA"15"PRIcounter" weakptr free\n", num_gc_weak);+#if MAXSTACKDEPTH+    PRINT("%"PCOMMA"15d max stack depth\n", (int)max_stack_depth);+    PRINT("%"PCOMMA"15d max C stack depth\n", (int)max_c_stack);+#endif+    // PRINT("%"PCOMMA"15d avg gc stack depth\n", (int)(gc_tot / num_gc));+    // PRINT("%"PCOMMA"15"PRIcounter" max mark depth\n", max_mark_depth);+    PRINT("%15.2fs total expired time\n", (double)run_time / 1000);+    PRINT("%15.2fs gc expired time = %3.1f%% (%.2fs mark + %.2fs scan)\n",+          (double)(gc_mark_time + gc_scan_time) / 1000,+          (double)(gc_mark_time + gc_scan_time) / (double)run_time * 100,+          (double)gc_mark_time / 1000,+          (double)gc_scan_time / 1000);+#if WANT_KPERF+    if (instrs > 0) {+      PRINT("%"PCOMMA"15"PRIcounter" instructions (%.1f instr/red)\n", instrs, (double)instrs / (double)num_reductions);+    }+#endif  /* WANT_KPERF */+#if GCRED+    PRINT(" GC reductions A=%"PRIcounter", K=%"PRIcounter", I=%"PRIcounter", int=%"PRIcounter", flip=%"PRIcounter","+          " BI=%"PRIcounter", BxI=%"PRIcounter", C'BxI=%"PRIcounter", CC=%"PRIcounter", C'I=%"PRIcounter", C'BBCP=%"PRIcounter"\n",+          red_a, red_k, red_i, red_int, red_flip, red_bi, red_bxi, red_ccbi, red_cc, red_cci, red_ccbbcp);+    PRINT(" special reductions B'=%"PRIcounter" K4=%"PRIcounter" K3=%"PRIcounter" K2=%"PRIcounter" C'B=%"PRIcounter", Z=%"PRIcounter", R=%"PRIcounter"\n",+          red_bb, red_k4, red_k3, red_k2, red_ccb, red_z, red_r);+#endif+  }+#endif  /* WANT_STDIO */++#if WANT_TICK+  if (dump_ticks) {+    dump_tick_table(stdout);+  }+#endif++#ifdef TEARDOWN+  main_teardown(); /* do some platform specific teardown */+#endif+  EXIT(0);+}++#if WANT_MD5+#include "md5.c"+#endif  /* WANT_MD5 */++#if WANT_LZ77+#include "lz77.c"+#endif++/***************************/+/* Foreign export helpers  */++void+ffe_push(NODEPTR n)+{+  PUSH(n);+}++void+ffe_pop(void)+{+  POP(1);+}++/* Allocate a new node (will be overwritten) */+stackptr_t+ffe_alloc(void)+{+  PUSH(alloc_node(T_DBL));+  return stack_ptr;+}++void+ffe_apply(void)+{+  NODEPTR arg = POPTOP();+  NODEPTR fun = POPTOP();+  PUSH(new_ap(fun, arg));+}++/* For stand-alone exported functions this is called with the threading inactive.+ * On the other hand, if a 'foreign import' calls back to a 'foreign export' the+ * threading is alread running.+ */+/* XXX This is not quite right.  The surrounding mhs_to_xxx should be in the thread. */+stackptr_t+ffe_eval(void)+{+  if (main_thread) {+    /* threading active, run on current stack */+    (void)evali(TOP(0));+  } else {+    /* start up the threading to evaluate the node */+    start_exec(TOP(0));+  }+  /* The mhs_to_xxx functions bizarrely return the ARG(TOP(n+1)) value.+   * The wrapper will call with n=-1, so we need to put the result at ARG(TOP(0))+   */+  TOP(0) = new_ap(combI, TOP(0));+  return stack_ptr;+}++stackptr_t+ffe_exec(void)+{+  NODEPTR n = POPTOP();+  PUSH(new_ap(combPERFORMIO, n));+  return ffe_eval();+}++/* apply_sp :: StablePtr (Ptr a -> IO (Ptr b)) -> Ptr a -> IO (Ptr b) */+void *+apply_sp(uvalue_t sp, void *arg)+{+  GCCHECK(3);+  NODEPTR f = deref_stableptr(sp);+  NODEPTR a = alloc_node(T_PTR);+  PTR(a) = arg;+  PUSH(new_ap(combPERFORMIO, new_ap(f, a)));+  void *r = evalptr(TOP(0));+  POP(1);+  return r;+}++/*********************/+/* FFI adapters      */++#define MHS_FROM(name, set, type) \+from_t \+name(stackptr_t stk, int n, type x) \+{ \+  NODEPTR r = TOP(0);           /* The pre-allocated cell for the result, */ \+  set(r, x);                    /* Put result in pre-allocated cell. */ \+  return n;                     /* return arity */ \+}+#if WANT_FLOAT64+MHS_FROM(mhs_from_Double, SETDBL, flt64_t);+#endif+#if WANT_FLOAT32+MHS_FROM(mhs_from_Float, SETFLT, flt32_t);+#endif+MHS_FROM(mhs_from_Int, SETINT, value_t);+MHS_FROM(mhs_from_Word, SETINT, uvalue_t);+MHS_FROM(mhs_from_Word8, SETINT, uvalue_t);+MHS_FROM(mhs_from_Ptr, SETPTR, void*);+MHS_FROM(mhs_from_ForPtr, SETFORPTR, struct forptr *);+MHS_FROM(mhs_from_FunPtr, SETFUNPTR, HsFunPtr);+MHS_FROM(mhs_from_CChar, SETINT, char);+MHS_FROM(mhs_from_CSChar, SETINT, signed char);+MHS_FROM(mhs_from_CUChar, SETINT, unsigned char);+MHS_FROM(mhs_from_CShort, SETINT, short);+MHS_FROM(mhs_from_CUShort, SETINT, unsigned short);+MHS_FROM(mhs_from_CInt, SETINT, int);+MHS_FROM(mhs_from_CUInt, SETINT, unsigned int);+MHS_FROM(mhs_from_CLong, SETINT, long);+MHS_FROM(mhs_from_CULong, SETINT, unsigned long);+MHS_FROM(mhs_from_CLLong, SETINT, long long);+MHS_FROM(mhs_from_CULLong, SETINT, unsigned long long);+MHS_FROM(mhs_from_CSize, SETINT, size_t);+#if WANT_TIME+MHS_FROM(mhs_from_CTime, SETINT, time_t);+#endif+// MHS_FROM(mhs_from_CSSize, SETINT, ssize_t);+MHS_FROM(mhs_from_CIntPtr, SETINT, intptr_t);+MHS_FROM(mhs_from_CUIntPtr, SETINT, uintptr_t);+from_t+mhs_from_Unit(stackptr_t stk, int n)+{+  POP(1);                       /* return value cell */+  PUSH(combUnit);               /* push unit instead */+  return n;+}++#define MHS_TO(name, eval, type) \+type name(stackptr_t stk, int n) \+{ \+  return eval(ARG(TOP(n+1)));                /* The stack has a reserved cell on top of the arguments */ \+}+#if WANT_FLOAT32+MHS_TO(mhs_to_Float, evalflt, flt32_t);+#endif+#if WANT_FLOAT64+MHS_TO(mhs_to_Double, evaldbl, flt64_t);+#endif+MHS_TO(mhs_to_Int, evalint, value_t);+MHS_TO(mhs_to_Word, evalint, uvalue_t);+MHS_TO(mhs_to_Word8, evalint, uint8_t);+MHS_TO(mhs_to_Ptr, evalptr, void*);+MHS_TO(mhs_to_FunPtr, evalfunptr, HsFunPtr);+MHS_TO(mhs_to_CChar, evalint, char);+MHS_TO(mhs_to_CSChar, evalint, signed char);+MHS_TO(mhs_to_CUChar, evalint, unsigned char);+MHS_TO(mhs_to_CShort, evalint, short);+MHS_TO(mhs_to_CUShort, evalint, unsigned short);+MHS_TO(mhs_to_CInt, evalint, int);+MHS_TO(mhs_to_CUInt, evalint, unsigned int);+MHS_TO(mhs_to_CLong, evalint, long);+MHS_TO(mhs_to_CULong, evalint, unsigned long);+MHS_TO(mhs_to_CLLong, evalint, long long);+MHS_TO(mhs_to_CULLong, evalint, unsigned long long);+MHS_TO(mhs_to_CSize, evalint, size_t);+#if WANT_TIME+MHS_TO(mhs_to_CTime, evalint, time_t);+#endif+// MHS_TO(mhs_to_CSSize, evalint, ssize_t);+MHS_TO(mhs_to_CIntPtr, evalint, intptr_t);+MHS_TO(mhs_to_CUIntPtr, evalint, uintptr_t);++/* The rest of this file was generated by the compiler, with some minor edits with #if. */+from_t mhs_GETRAW(int s) { return  mhs_from_Int(s, 0, GETRAW()); }+from_t mhs_GETTIMEMILLI(int s) { return  mhs_from_Int(s, 0, GETTIMEMILLI()); }+#if WANT_MATH+#if WANT_FLOAT64+from_t mhs_acos(int s) { return mhs_from_Double(s, 1, acos(mhs_to_Double(s, 0))); }+from_t mhs_asin(int s) { return mhs_from_Double(s, 1, asin(mhs_to_Double(s, 0))); }+from_t mhs_atan(int s) { return mhs_from_Double(s, 1, atan(mhs_to_Double(s, 0))); }+from_t mhs_atan2(int s) { return mhs_from_Double(s, 2, atan2(mhs_to_Double(s, 0), mhs_to_Double(s, 1))); }+from_t mhs_cos(int s) { return mhs_from_Double(s, 1, cos(mhs_to_Double(s, 0))); }+from_t mhs_exp(int s) { return mhs_from_Double(s, 1, exp(mhs_to_Double(s, 0))); }+from_t mhs_log(int s) { return mhs_from_Double(s, 1, log(mhs_to_Double(s, 0))); }+from_t mhs_sin(int s) { return mhs_from_Double(s, 1, sin(mhs_to_Double(s, 0))); }+from_t mhs_sqrt(int s) { return mhs_from_Double(s, 1, sqrt(mhs_to_Double(s, 0))); }+from_t mhs_tan(int s) { return mhs_from_Double(s, 1, tan(mhs_to_Double(s, 0))); }+from_t mhs_scalbn(int s) { return mhs_from_Double(s, 2, scalbn(mhs_to_Double(s, 0), mhs_to_Int(s, 1))); }+#endif  /* WANT_FLOAT64 */+#if WANT_FLOAT32+from_t mhs_acosf(int s) { return mhs_from_Float(s, 1, acosf(mhs_to_Float(s, 0))); }+from_t mhs_asinf(int s) { return mhs_from_Float(s, 1, asinf(mhs_to_Float(s, 0))); }+from_t mhs_atanf(int s) { return mhs_from_Float(s, 1, atanf(mhs_to_Float(s, 0))); }+from_t mhs_atan2f(int s) { return mhs_from_Float(s, 2, atan2f(mhs_to_Float(s, 0), mhs_to_Float(s, 1))); }+from_t mhs_cosf(int s) { return mhs_from_Float(s, 1, cosf(mhs_to_Float(s, 0))); }+from_t mhs_expf(int s) { return mhs_from_Float(s, 1, expf(mhs_to_Float(s, 0))); }+from_t mhs_logf(int s) { return mhs_from_Float(s, 1, logf(mhs_to_Float(s, 0))); }+from_t mhs_sinf(int s) { return mhs_from_Float(s, 1, sinf(mhs_to_Float(s, 0))); }+from_t mhs_sqrtf(int s) { return mhs_from_Float(s, 1, sqrtf(mhs_to_Float(s, 0))); }+from_t mhs_tanf(int s) { return mhs_from_Float(s, 1, tanf(mhs_to_Float(s, 0))); }+from_t mhs_scalbnf(int s) { return mhs_from_Float(s, 2, scalbnf(mhs_to_Float(s, 0), mhs_to_Int(s, 1))); }+#endif  /* WANT_FLOAT32 */+#endif  /* WANT_MATH */++#if defined(__EMSCRIPTEN__)+from_t mhs_js_debug(int s) { EM_ASM({ console.log(UTF8ToString($0)) }, mhs_to_Ptr(s, 0)); return mhs_from_Unit(s, 1); }+from_t mhs_js_eval_run(int s) { EM_ASM({ eval(UTF8ToString($0)) }, mhs_to_Ptr(s, 0)); return mhs_from_Unit(s, 1); }+from_t mhs_js_eval_call(int s) { return mhs_from_Ptr(s, 1, EM_ASM_PTR({ return stringToNewUTF8(JSON.stringify(eval(UTF8ToString($0)))) }, mhs_to_Ptr(s, 0))); }+from_t mhs_js_set_haskellCallback(int s) { EM_ASM({ _haskellCallback = $0 }, mhs_to_Int(s, 0)); return mhs_from_Unit(s, 1); }+#endif++#if WANT_STDIO+from_t mhs_add_FILE(int s) { return mhs_from_Ptr(s, 1, add_FILE(mhs_to_Ptr(s, 0))); }+from_t mhs_putchar(int s) { putchar(mhs_to_Int(s, 0)); return mhs_from_Unit(s, 1); } /* for debugging */+from_t mhs_fopen(int s) { return mhs_from_Ptr(s, 2, fopen(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }+from_t mhs_system(int s) { return mhs_from_Int(s, 1, system(mhs_to_Ptr(s, 0))); }+from_t mhs_tmpname(int s) { return mhs_from_Ptr(s, 2, TMPNAME(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }+from_t mhs_unlink(int s) { return mhs_from_Int(s, 1, unlink(mhs_to_Ptr(s, 0))); }+#endif  /* WANT_STDIO */+#if WANT_FD+from_t mhs_add_fd(int s) { return mhs_from_Ptr(s, 1, add_fd(mhs_to_Int(s, 0))); }+from_t mhs_open(int s) { return mhs_from_Int(s, 3, open(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1), mhs_to_Int(s, 2))); }+#endif  /* WANT_FD */+#if WANT_BUF+from_t mhs_add_buf(int s) { return mhs_from_Ptr(s, 2, add_buf(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }+#endif  /* WANT_BUF */+#if WANT_CRLF+from_t mhs_add_crlf(int s) { return mhs_from_Ptr(s, 1, add_crlf(mhs_to_Ptr(s, 0))); }+#endif  /* WANT_CRLF */+#if WANT_UTF8+from_t mhs_add_utf8(int s) { return mhs_from_Ptr(s, 1, add_utf8(mhs_to_Ptr(s, 0))); }+#endif  /* WANT_UTF8 */+#if WANT_BASE64+from_t mhs_add_base64_encoder(int s) { return mhs_from_Ptr(s, 1, add_base64_encoder(mhs_to_Ptr(s, 0))); }+from_t mhs_add_base64_decoder(int s) { return mhs_from_Ptr(s, 1, add_base64_decoder(mhs_to_Ptr(s, 0))); }+#endif  /* WANT_BASE64 */+from_t mhs_closeb(int s) { closeb(mhs_to_Ptr(s, 0)); return mhs_from_Unit(s, 1); }+from_t mhs_addr_closeb(int s) { return mhs_from_FunPtr(s, 0, (HsFunPtr)&closeb); }+from_t mhs_flushb(int s) { flushb(mhs_to_Ptr(s, 0)); return mhs_from_Unit(s, 1); }+from_t mhs_getb(int s) { return mhs_from_Int(s, 1, getb(mhs_to_Ptr(s, 0))); }+from_t mhs_putb(int s) { putb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_ungetb(int s) { ungetb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_openwrmem(int s) { return mhs_from_Ptr(s, 0, openb_wr_mem()); }+from_t mhs_openrdmem(int s) { return mhs_from_Ptr(s, 2, openb_rd_mem(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }+from_t mhs_getmem(int s) { get_mem(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2));  return mhs_from_Unit(s, 3); }+from_t mhs_readb(int s) { return mhs_from_Int(s, 3, readb(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1), mhs_to_Ptr(s, 2))); }+from_t mhs_writeb(int s) { return mhs_from_Int(s, 3, writeb(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1), mhs_to_Ptr(s, 2))); }++#if WANT_MD5+from_t mhs_md5Array(int s) { md5Array(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_md5BFILE(int s) { md5BFILE(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_md5String(int s) { md5String(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }+#endif  /* WANT_MD5 */++#if WANT_LZ77+from_t mhs_add_lz77_compressor(int s) { return mhs_from_Ptr(s, 1, add_lz77_compressor(mhs_to_Ptr(s, 0))); }+from_t mhs_add_lz77_decompressor(int s) { return mhs_from_Ptr(s, 1, add_lz77_decompressor(mhs_to_Ptr(s, 0))); }+from_t mhs_lz77c(int s) { return mhs_from_CSize(s, 3, lz77c(mhs_to_Ptr(s, 0), mhs_to_CSize(s, 1), mhs_to_Ptr(s, 2))); }+#endif  /* WANT_LZ77 */++#if WANT_RLE+from_t mhs_add_rle_compressor(int s) { return mhs_from_Ptr(s, 1, add_rle_compressor(mhs_to_Ptr(s, 0))); }+from_t mhs_add_rle_decompressor(int s) { return mhs_from_Ptr(s, 1, add_rle_decompressor(mhs_to_Ptr(s, 0))); }+#endif  /* WANT_RLE */++#if WANT_BWT+from_t mhs_add_bwt_compressor(int s) { return mhs_from_Ptr(s, 1, add_bwt_compressor(mhs_to_Ptr(s, 0))); }+from_t mhs_add_bwt_decompressor(int s) { return mhs_from_Ptr(s, 1, add_bwt_decompressor(mhs_to_Ptr(s, 0))); }+#endif  /* WANT_BWT */++from_t mhs_calloc(int s) { return mhs_from_Ptr(s, 2, calloc(mhs_to_CSize(s, 0), mhs_to_CSize(s, 1))); }+from_t mhs_realloc(int s) { return mhs_from_Ptr(s, 2, realloc(mhs_to_Ptr(s, 0), mhs_to_CSize(s, 1))); }+from_t mhs_free(int s) { free(mhs_to_Ptr(s, 0)); return mhs_from_Unit(s, 1); }+from_t mhs_addr_free(int s) { return mhs_from_FunPtr(s, 0, (HsFunPtr)&FREE); }+from_t mhs_getenv(int s) { return mhs_from_Ptr(s, 1, getenv(mhs_to_Ptr(s, 0))); }+from_t mhs_environ(int s) { return mhs_from_Ptr(s, 0, environ); }+from_t mhs_iswindows(int s) { return mhs_from_Int(s, 0, iswindows()); }+from_t mhs_ismacos(int s) { return mhs_from_Int(s, 0, ismacos()); }+from_t mhs_islinux(int s) { return mhs_from_Int(s, 0, islinux()); }+from_t mhs_malloc(int s) { return mhs_from_Ptr(s, 1, MALLOC(mhs_to_CSize(s, 0))); }+from_t mhs_memcpy(int s) { memcpy(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_CSize(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_strlen(int s) { return mhs_from_CSize(s, 1, strlen(mhs_to_Ptr(s, 0))); }+from_t mhs_strcpy(int s) { strcpy(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_memmove(int s) { memmove(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_CSize(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_peekPtr(int s) { return mhs_from_Ptr(s, 1, peekPtr(mhs_to_Ptr(s, 0))); }+from_t mhs_peekWord(int s) { return mhs_from_Word(s, 1, peekWord(mhs_to_Ptr(s, 0))); }+from_t mhs_pokePtr(int s) { pokePtr(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_pokeWord(int s) { pokeWord(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }++from_t mhs_peek_uint8(int s) { return mhs_from_Word(s, 1, peek_uint8(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_uint8(int s) { poke_uint8(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_uint16(int s) { return mhs_from_Word(s, 1, peek_uint16(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_uint16(int s) { poke_uint16(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }+#if WORD_SIZE >= 32+from_t mhs_peek_uint32(int s) { return mhs_from_Word(s, 1, peek_uint32(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_uint32(int s) { poke_uint32(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }+#endif  /* WORD_SIZE */+#if WORD_SIZE >= 64+from_t mhs_peek_uint64(int s) { return mhs_from_Word(s, 1, peek_uint64(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_uint64(int s) { poke_uint64(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }+#endif  /* WORD_SIZE */++from_t mhs_peek_int8(int s) { return mhs_from_Int(s, 1, peek_int8(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_int8(int s) { poke_int8(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_int16(int s) { return mhs_from_Int(s, 1, peek_int16(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_int16(int s) { poke_int16(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }+#if WORD_SIZE >= 32+from_t mhs_peek_int32(int s) { return mhs_from_Int(s, 1, peek_int32(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_int32(int s) { poke_int32(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }+#endif  /* WORD_SIZE */+#if WORD_SIZE >= 64+from_t mhs_peek_int64(int s) { return mhs_from_Int(s, 1, peek_int64(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_int64(int s) { poke_int64(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }+#endif  /* WORD_SIZE */+from_t mhs_peek_char(int s) { return mhs_from_CChar(s, 1, peek_char(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_char(int s) { poke_char(mhs_to_Ptr(s, 0), mhs_to_CChar(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_schar(int s) { return mhs_from_CSChar(s, 1, peek_schar(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_schar(int s) { poke_schar(mhs_to_Ptr(s, 0), mhs_to_CSChar(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_uchar(int s) { return mhs_from_CUChar(s, 1, peek_uchar(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_uchar(int s) { poke_uchar(mhs_to_Ptr(s, 0), mhs_to_CUChar(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_short(int s) { return mhs_from_CShort(s, 1, peek_short(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_short(int s) { poke_short(mhs_to_Ptr(s, 0), mhs_to_CShort(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_ushort(int s) { return mhs_from_CUShort(s, 1, peek_ushort(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_ushort(int s) { poke_ushort(mhs_to_Ptr(s, 0), mhs_to_CUShort(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_int(int s) { return mhs_from_CInt(s, 1, peek_int(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_int(int s) { poke_int(mhs_to_Ptr(s, 0), mhs_to_CInt(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_uint(int s) { return mhs_from_CUInt(s, 1, peek_uint(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_uint(int s) { poke_uint(mhs_to_Ptr(s, 0), mhs_to_CUInt(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_long(int s) { return mhs_from_CLong(s, 1, peek_long(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_long(int s) { poke_long(mhs_to_Ptr(s, 0), mhs_to_CLong(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_ulong(int s) { return mhs_from_CULong(s, 1, peek_ulong(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_ulong(int s) { poke_ulong(mhs_to_Ptr(s, 0), mhs_to_CULong(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_llong(int s) { return mhs_from_CLLong(s, 1, peek_llong(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_llong(int s) { poke_llong(mhs_to_Ptr(s, 0), mhs_to_CLLong(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_ullong(int s) { return mhs_from_CULLong(s, 1, peek_ullong(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_ullong(int s) { poke_ullong(mhs_to_Ptr(s, 0), mhs_to_CULLong(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_peek_size_t(int s) { return mhs_from_CSize(s, 1, peek_size_t(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_size_t(int s) { poke_size_t(mhs_to_Ptr(s, 0), mhs_to_CSize(s, 1)); return mhs_from_Unit(s, 2); }+#if WANT_FLOAT32+from_t mhs_peek_flt32(int s) { return mhs_from_Float(s, 1, peek_flt32(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_flt32(int s) { poke_flt32(mhs_to_Ptr(s, 0), mhs_to_Float(s, 1)); return mhs_from_Unit(s, 2); }+#endif  /* WANT_FLOAT32 */+#if WANT_FLOAT64+from_t mhs_peek_flt64(int s) { return mhs_from_Double(s, 1, peek_flt64(mhs_to_Ptr(s, 0))); }+from_t mhs_poke_flt64(int s) { poke_flt64(mhs_to_Ptr(s, 0), mhs_to_Double(s, 1)); return mhs_from_Unit(s, 2); }+#endif  /* WANT_FLOAT64 */+from_t mhs_sizeof_char(int s) { return mhs_from_Int(s, 0, sizeof(char)); }+from_t mhs_sizeof_short(int s) { return mhs_from_Int(s, 0, sizeof(short)); }+from_t mhs_sizeof_int(int s) { return mhs_from_Int(s, 0, sizeof(int)); }+from_t mhs_sizeof_llong(int s) { return mhs_from_Int(s, 0, sizeof(long long)); }+from_t mhs_sizeof_long(int s) { return mhs_from_Int(s, 0, sizeof(long)); }+from_t mhs_sizeof_size_t(int s) { return mhs_from_Int(s, 0, sizeof(size_t)); }+#if WANT_DIR+from_t mhs_closedir(int s) { return mhs_from_Int(s, 1, closedir(mhs_to_Ptr(s, 0))); }+from_t mhs_opendir(int s) { return mhs_from_Ptr(s, 1, opendir(mhs_to_Ptr(s, 0))); }+from_t mhs_readdir(int s) { return mhs_from_Ptr(s, 1, readdir(mhs_to_Ptr(s, 0))); }+from_t mhs_c_d_name(int s) { return mhs_from_Ptr(s, 1, ((struct dirent *)(mhs_to_Ptr(s, 0)))->d_name); }+from_t mhs_chdir(int s) { return mhs_from_Int(s, 1, chdir(mhs_to_Ptr(s, 0))); }+from_t mhs_mkdir(int s) { return mhs_from_Int(s, 2, mkdir(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }+from_t mhs_getcwd(int s) { return mhs_from_Ptr(s, 2, getcwd(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }+#endif  /* WANT_DIR */+from_t mhs_getcpu(int s) { GETCPUTIME(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }++/* Use this to detect if we have (and want) GMP or not. */+from_t mhs_want_gmp(int s) { return mhs_from_Int(s, 0, WANT_GMP); }++#if WANT_GMP+void+free_mpz(void *p)+{+  /*  printf("free_mpz %p\n", p);*/+  mpz_clear(p);                 /* free any extra storage */+  FREE(p);                      /* and free the mpz itself */+}++/* Allocate an initialize a GMP integer */+struct forptr *+new_mpz(void)+{+#if 0+  {+    static int done = 0;+    if (!done) {+      printf("GMP\n");+      done = 1;+    }+  }+#endif+  mpz_ptr p = mmalloc(sizeof(*p));+  mpz_init(p);+  struct forptr *fp = mkForPtrP(p);+  fp->finalizer->final = (HsFunPtr)free_mpz;+  fp->finalizer->fptype = FP_MPZ;+  /*  printf("new_mpz %p %p\n", p, fp); */+  return fp;+}++intptr_t+mpz_get_si_(mpz_t op)+{+  intptr_t r = mpz_get_ui(op);+  if (mpz_sgn(op) < 0) {+    r = -r;+  }+  return r;+}++#if 0+void+print_mpz(mpz_ptr p)+{+  mpz_out_str(stdout, 10, p);+}+#endif++#if NEED_INT64+/* GMP lacks 64 bit support on 32 bit platforms */+void+mpz_init_set_si64(mpz_t rop, int64_t op)+{+  if (op >= 0) {+    mpz_init_set_ui64(rop, op);+  } else {+    mpz_init_set_ui64(rop, -op);+    mpz_neg(rop, rop);+  }+}+void+mpz_init_set_ui64(mpz_t rop, uint64_t op)+{+  mpz_init_set_ui(rop, op >> 32);+  mpz_mul_2exp(rop, rop, 32);+  mpz_add_ui(rop, rop, op & 0xffffffff);+}+int64_t+mpz_get_si64(mpz_t op)+{+  mpz_t t;+  mpz_init_set(t, op);+  mpz_tdiv_q_2exp(t, t, 32);+  uint64_t hi = mpz_get_ui(t);+  uint64_t lo = mpz_get_ui(op);+  mpz_clear(t);+  uint64_t r = (hi << 32) | lo;+  if (mpz_sgn(op) < 0) {+    r = -r;+  }+  return r;+}+#endif  /* NEED_INT64 */+#if WORD_SIZE == 64+#define mpz_init_set_ui64 mpz_init_set_ui+#define mpz_init_set_si64 mpz_init_set_si+#define mpz_get_si64 mpz_get_si_+#define mhs_to_Int64 mhs_to_Int+#define mhs_to_Word64 mhs_to_Word+#define mhs_from_Int64 mhs_from_Int+#define mhs_from_Word64 mhs_from_Word+#endif++from_t mhs_new_mpz(int s) { return mhs_from_ForPtr(s, 0, new_mpz()); }++/* Stubs for GMP functions */+from_t mhs_mpz_abs(int s) { mpz_abs(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_mpz_add(int s) { mpz_add(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_mpz_and(int s) { mpz_and(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_mpz_cmp(int s) { return mhs_from_Int(s, 2, mpz_cmp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }+from_t mhs_mpz_get_d(int s) { return mhs_from_Double(s, 1, mpz_get_d(mhs_to_Ptr(s, 0))); }+from_t mhs_mpz_get_f(int s) { return mhs_from_Float(s, 1, (float)mpz_get_d(mhs_to_Ptr(s, 0))); }+from_t mhs_mpz_get_si(int s) { return mhs_from_Int(s, 1, mpz_get_si_(mhs_to_Ptr(s, 0))); }+from_t mhs_mpz_init_set_si(int s) { mpz_init_set_si(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_mpz_init_set_ui(int s) { mpz_init_set_ui(mhs_to_Ptr(s, 0), mhs_to_Word(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_mpz_ior(int s) { mpz_ior(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_mpz_mul(int s) { mpz_mul(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_mpz_mul_2exp(int s) { mpz_mul_2exp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_mpz_neg(int s) { mpz_neg(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_mpz_popcount(int s) {+  mpz_ptr a = mhs_to_Ptr(s, 0);+  from_t r;+  if (mpz_sgn(a) < 0) {+    mpz_t neg_a;+    mpz_init(neg_a);+    mpz_neg(neg_a, a);+    r = mhs_from_Int(s, 1, -mpz_popcount(neg_a));+    mpz_clear(neg_a);+  } else {+    r = mhs_from_Int(s, 1, mpz_popcount(a));+  }+  return r;+}+from_t mhs_mpz_sub(int s) { mpz_sub(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_mpz_fdiv_q_2exp(int s) { mpz_fdiv_q_2exp(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_mpz_tdiv_qr(int s) { mpz_tdiv_qr(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2), mhs_to_Ptr(s, 3)); return mhs_from_Unit(s, 4); }+from_t mhs_mpz_tstbit(int s) { return mhs_from_Int(s, 2, mpz_tstbit(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }+from_t mhs_mpz_xor(int s) { mpz_xor(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); return mhs_from_Unit(s, 3); }+from_t mhs_mpz_init_set_si64(int s) { mpz_init_set_si64(mhs_to_Ptr(s, 0), mhs_to_Int64(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_mpz_init_set_ui64(int s) { mpz_init_set_ui64(mhs_to_Ptr(s, 0), mhs_to_Word64(s, 1)); return mhs_from_Unit(s, 2); }+from_t mhs_mpz_get_si64(int s) { return mhs_from_Int64(s, 1, mpz_get_si64(mhs_to_Ptr(s, 0))); }+from_t mhs_mpz_log2(int s) {+  mpz_ptr a = mhs_to_Ptr(s, 0);+  return mhs_from_Int(s, 1, mpz_sizeinbase(a, 2) - 1);+}+#endif  /* WANT_GMP */+#if WANT_TIME+from_t mhs_gettimeofday(int s) { return mhs_from_Int(s, 2, gettimeofday(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }+#endif+#if WANT_ERRNO+from_t mhs_E2BIG(int s) { return mhs_from_Int(s, 0, E2BIG); }+from_t mhs_EAGAIN(int s) { return mhs_from_Int(s, 0, EAGAIN); }+from_t mhs_EINTR(int s) { return mhs_from_Int(s, 0, EINTR); }+from_t mhs_EINVAL(int s) { return mhs_from_Int(s, 0, EINVAL); }+from_t mhs_EWOULDBLOCK(int s) { return mhs_from_Int(s, 0, EWOULDBLOCK); }+from_t mhs_addr_errno(int s) { return mhs_from_Ptr(s, 0, &errno); }+from_t mhs_strerror_r(int s) { return mhs_from_Int(s, 3, strerror_r(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1), mhs_to_Word(s, 2))); }+#endif++const struct ffi_entry ffi_table[] = {+  { "GETRAW", 0, mhs_GETRAW},+  { "GETTIMEMILLI", 0, mhs_GETTIMEMILLI},+#if WANT_MATH+#if WANT_FLOAT64+  { "acos", 1, mhs_acos},+  { "asin", 1, mhs_asin},+  { "atan", 1, mhs_atan},+  { "atan2", 2, mhs_atan2},+  { "cos", 1, mhs_cos},+  { "exp", 1, mhs_exp},+  { "log", 1, mhs_log},+  { "sin", 1, mhs_sin},+  { "sqrt", 1, mhs_sqrt},+  { "tan", 1, mhs_tan},+  { "scalbn", 2, mhs_scalbn},+  { "poke_flt64", 2, mhs_poke_flt64 },+  { "peek_flt64", 1, mhs_peek_flt64 },+#endif  /* WANT_FLOAT64 */+#if WANT_FLOAT32+  { "acosf", 1, mhs_acosf},+  { "asinf", 1, mhs_asinf},+  { "atanf", 1, mhs_atanf},+  { "atan2f", 2, mhs_atan2f},+  { "cosf", 1, mhs_cosf},+  { "expf", 1, mhs_expf},+  { "logf", 1, mhs_logf},+  { "sinf", 1, mhs_sinf},+  { "sqrtf", 1, mhs_sqrtf},+  { "tanf", 1, mhs_tanf},+  { "scalbnf", 2, mhs_scalbnf},+  { "poke_flt32", 2, mhs_poke_flt32 },+  { "peek_flt32", 1, mhs_peek_flt32 },+#endif  /* WANT_FLOAT32 */+#endif  /* WANT_MATH */++#if defined(__EMSCRIPTEN__)+  { "js_debug", 1, mhs_js_debug},+  { "js_eval_run", 1, mhs_js_eval_run},+  { "js_eval_call", 1, mhs_js_eval_call},+  { "js_set_haskellCallback", 1, mhs_js_set_haskellCallback},+#endif++#if WANT_STDIO+  { "add_FILE", 1, mhs_add_FILE},+  { "putchar", 1, mhs_putchar},+  { "fopen", 2, mhs_fopen},+  { "tmpname", 2, mhs_tmpname},+  { "unlink", 1, mhs_unlink},+  { "system", 1, mhs_system},+#endif  /* WANT_STDIO */+#if WANT_FD+  { "add_fd", 1, mhs_add_fd},+  { "open", 3, mhs_open},+#endif  /* WANT_FD */+#if WANT_BUF+  { "add_buf", 2, mhs_add_buf},+#endif  /* WANT_BUF */+#if WANT_CRLF+  { "add_crlf", 1, mhs_add_crlf},+#endif  /* WANT_CRLF */+#if WANT_UTF8+  { "add_utf8", 1, mhs_add_utf8},+#endif  /* WANT_UTF8 */+#if WANT_BASE64+  { "add_base64_encoder", 1, mhs_add_base64_encoder},+  { "add_base64_decoder", 1, mhs_add_base64_decoder},+#endif  /* WANT_BASE64 */+  { "closeb", 1, mhs_closeb},+  { "&closeb", 0, mhs_addr_closeb},+  { "flushb", 1, mhs_flushb},+  { "getb", 1, mhs_getb},+  { "putb", 2, mhs_putb},+  { "ungetb", 2, mhs_ungetb},+  { "openb_wr_mem", 0, mhs_openwrmem},+  { "openb_rd_mem", 2, mhs_openrdmem},+  { "get_mem", 3, mhs_getmem},+  { "readb", 3, mhs_readb},+  { "writeb", 3, mhs_writeb},++#if WANT_MD5+  { "md5Array", 3, mhs_md5Array},+  { "md5BFILE", 2, mhs_md5BFILE},+  { "md5String", 2, mhs_md5String},+#endif  /* WANT_MD5 */++#if WANT_LZ77+  { "add_lz77_compressor", 1, mhs_add_lz77_compressor},+  { "add_lz77_decompressor", 1, mhs_add_lz77_decompressor},+  { "lz77c", 3, mhs_lz77c},+#endif  /* WANT_LZ77 */++#if WANT_RLE+  { "add_rle_compressor", 1, mhs_add_rle_compressor},+  { "add_rle_decompressor", 1, mhs_add_rle_decompressor},+#endif  /* WANT_RLE */++#if WANT_BWT+  { "add_bwt_compressor", 1, mhs_add_bwt_compressor},+  { "add_bwt_decompressor", 1, mhs_add_bwt_decompressor},+#endif  /* WANT_RLE */++  { "calloc", 2, mhs_calloc},+  { "realloc", 2, mhs_realloc},+  { "free", 1, mhs_free},+  { "&free", 0, mhs_addr_free},+  { "getenv", 1, mhs_getenv},+  { "environ", 0, mhs_environ},+  { "iswindows", 0, mhs_iswindows},+  { "ismacos", 0, mhs_ismacos},+  { "islinux", 0, mhs_islinux},+  { "malloc", 1, mhs_malloc},+  { "memcpy", 3, mhs_memcpy},+  { "memmove", 3, mhs_memmove},+  { "strlen", 1, mhs_strlen},+  { "strcpy", 2, mhs_strcpy},+  { "peekPtr", 1, mhs_peekPtr},+  { "peekWord", 1, mhs_peekWord},+  { "pokePtr", 2, mhs_pokePtr},+  { "pokeWord", 2, mhs_pokeWord},++  { "peek_uint8", 1, mhs_peek_uint8},+  { "poke_uint8", 2, mhs_poke_uint8},+  { "peek_uint16", 1, mhs_peek_uint16},+  { "poke_uint16", 2, mhs_poke_uint16},+#if WORD_SIZE >= 32+  { "peek_uint32", 1, mhs_peek_uint32},+  { "poke_uint32", 2, mhs_poke_uint32},+#endif  /* WORD_SIZE >= 32 */+#if WORD_SIZE >= 64+  { "peek_uint64", 1, mhs_peek_uint64},+  { "poke_uint64", 2, mhs_poke_uint64},+#endif  /* WORD_SIZE >= 64 */+  { "peek_uint", 1, mhs_peek_uint},+  { "poke_uint", 2, mhs_poke_uint},++  { "peek_int8", 1, mhs_peek_int8},+  { "poke_int8", 2, mhs_poke_int8},+  { "peek_int16", 1, mhs_peek_int16},+  { "poke_int16", 2, mhs_poke_int16},+#if WORD_SIZE >= 32+  { "peek_int32", 1, mhs_peek_int32},+  { "poke_int32", 2, mhs_poke_int32},+#endif  /* WORD_SIZE >= 32 */+#if WORD_SIZE >= 64+  { "peek_int64", 1, mhs_peek_int64},+  { "poke_int64", 2, mhs_poke_int64},+#endif  /* WORD_SIZE >= 64 */+  { "peek_int", 1, mhs_peek_int},+  { "poke_int", 2, mhs_poke_int},+  { "peek_llong", 1, mhs_peek_llong},+  { "peek_long", 1, mhs_peek_long},+  { "peek_ullong", 1, mhs_peek_ullong},+  { "peek_ulong", 1, mhs_peek_ulong},+  { "peek_size_t", 1, mhs_peek_size_t},+  { "poke_llong", 2, mhs_poke_llong},+  { "poke_long", 2, mhs_poke_long},+  { "poke_ullong", 2, mhs_poke_ullong},+  { "poke_ulong", 2, mhs_poke_ulong},+  { "poke_size_t", 2, mhs_poke_size_t},+#if WANT_FLOAT+  { "peek_flt", 1, mhs_peek_flt},+  { "poke_flt", 2, mhs_poke_flt},+#endif  /* WANT_FLOAT */+  { "sizeof_char", 0, mhs_sizeof_char},+  { "sizeof_short", 0, mhs_sizeof_short},+  { "sizeof_int", 0, mhs_sizeof_int},+  { "sizeof_llong", 0, mhs_sizeof_llong},+  { "sizeof_long", 0, mhs_sizeof_long},+  { "sizeof_size_t", 0, mhs_sizeof_size_t},+#if WANT_DIR+  { "c_d_name", 1, mhs_c_d_name},+  { "closedir", 1, mhs_closedir},+  { "opendir", 1, mhs_opendir},+  { "readdir", 1, mhs_readdir},+  { "chdir", 1, mhs_chdir},+  { "mkdir", 2, mhs_mkdir},+  { "getcwd", 2, mhs_getcwd},+#endif  /* WANT_DIR */+  { "getcpu", 2, mhs_getcpu},+  { "want_gmp", 0, mhs_want_gmp},+#if WANT_GMP+  { "new_mpz", 0, mhs_new_mpz},+  { "mpz_abs", 2, mhs_mpz_abs},+  { "mpz_add", 3, mhs_mpz_add},+  { "mpz_and", 3, mhs_mpz_and},+  { "mpz_cmp", 2, mhs_mpz_cmp},+  { "mpz_get_d", 1, mhs_mpz_get_d},+  { "mpz_get_si", 1, mhs_mpz_get_si},+  { "mpz_init_set_si", 2, mhs_mpz_init_set_si},+  { "mpz_init_set_ui", 2, mhs_mpz_init_set_ui},+  { "mpz_ior", 3, mhs_mpz_ior},+  { "mpz_mul", 3, mhs_mpz_mul},+  { "mpz_mul_2exp", 3, mhs_mpz_mul_2exp},+  { "mpz_neg", 2, mhs_mpz_neg},+  { "mpz_popcount", 1, mhs_mpz_popcount},+  { "mpz_sub", 3, mhs_mpz_sub},+  { "mpz_fdiv_q_2exp", 3, mhs_mpz_fdiv_q_2exp},+  { "mpz_tdiv_qr", 4, mhs_mpz_tdiv_qr},+  { "mpz_tstbit", 2, mhs_mpz_tstbit},+  { "mpz_xor", 3, mhs_mpz_xor},+  { "mpz_get_f", 1, mhs_mpz_get_f},+  { "mpz_init_set_si64", 2, mhs_mpz_init_set_si64},+  { "mpz_init_set_ui64", 2, mhs_mpz_init_set_ui64},+  { "mpz_get_si64", 1, mhs_mpz_get_si64},+  { "mpz_log2", 1, mhs_mpz_log2},+#endif  /* WANT_GMP */+#if WANT_TIME+  { "gettimeofday", 2, mhs_gettimeofday},+#endif+#if WANT_ERRNO+  { "E2BIG", 0, mhs_E2BIG},+  { "EAGAIN", 0, mhs_EAGAIN},+  { "EINTR", 0, mhs_EINTR},+  { "EINVAL", 0, mhs_EINVAL},+  { "EWOULDBLOCK", 0, mhs_EWOULDBLOCK},+  { "&errno", 0, mhs_addr_errno},+  { "strerror_r", 3, mhs_strerror_r},+#endif   { 0,0 } }; 
+ src/runtime/main.c view
@@ -0,0 +1,7 @@+int mhs_main(int argc, char **argv);++int+main(int argc, char **argv)+{+  return mhs_main(argc, argv);+}
+ src/runtime/mhseval.c view
@@ -0,0 +1,246 @@+#include "mhseval.h"+#include <setjmp.h>+#include <string.h>+#include <stdlib.h>+#include <stdio.h>++// Provide stub implementations for missing symbols before including eval.c+// eval.c expects: extern const uint8_t *combexpr;+const uint8_t *combexpr = NULL;+// eval.c expects: extern const int combexprlen;+const int combexprlen = 0;++#include "eval.c"++// Define the FFI tables after the structs are declared+// These need to match the declarations in mhsffi.h+const struct ffi_entry *xffi_table = 0;+struct ffe_entry *xffe_table = 0;++struct MhsContext {+    jmp_buf error_jmp;+    char error_msg[128];+    int initialized;+    int error_occurred;+};++// Global context pointer for error handling+static struct MhsContext* current_ctx = NULL;++MhsContextPtr mhs_init_context(void) {+    struct MhsContext* ctx = malloc(sizeof(struct MhsContext));+    if (!ctx) return NULL;+    +    memset(ctx, 0, sizeof(struct MhsContext));+    ctx->initialized = 0;+    ctx->error_occurred = 0;+    strncpy(ctx->error_msg, "No error", sizeof(ctx->error_msg) - 1);+    +    // Set up error handling for initialization+    current_ctx = ctx;+    if (setjmp(ctx->error_jmp) != 0) {+        // Error during initialization+        current_ctx = NULL;+        return ctx; // Return context with error state+    }+    +    // Initialize the MicroHs runtime (similar to mhs_init)+    heap_size = HEAP_CELLS;+    stack_size = STACK_SIZE;+    +    init_nodes();+    stack = malloc(sizeof(NODEPTR) * stack_size);+    if (!stack) {+        strncpy(ctx->error_msg, "Failed to allocate stack", sizeof(ctx->error_msg) - 1);+        ctx->error_occurred = 1;+        current_ctx = NULL;+        return ctx;+    }+    +    CLEARSTK();+    init_stableptr();+    +    ctx->initialized = 1;+    current_ctx = NULL;+    return ctx;+}++void mhs_free_context(MhsContextPtr ctx) {+    if (!ctx) return;+    +    // Cleanup MicroHs runtime resources+    if (ctx->initialized) {+        if (stack) {+            free(stack);+            stack = NULL;+        }+        if (cells) {+            free(cells);+            cells = NULL;+        }+        if (free_map) {+            free(free_map);+            free_map = NULL;+        }+        if (sp_table) {+            free(sp_table);+            sp_table = NULL;+        }+    }+    +    free(ctx);+}++// Convert a MicroHs node to a C string representation+static char* node_to_string(NODEPTR node, size_t* len) {+    //if (!node || !len) return "NULL";+    // Open a write buffer+    BFILE * bf = openb_wr_mem();+    if (!bf) return NULL;++    // print the node to the buffer+      printb(bf, node, 0);+      putb('\n', bf);+    +    // Get the buffer contents - fix type mismatch+    uint8_t* result_ptr;+    size_t result_size;+    get_mem(bf, &result_ptr, &result_size);+    +    // Allocate a new buffer and copy the data+    char* result = malloc(result_size + 1);+    if (result) {+        memcpy(result, result_ptr, result_size);+        result[result_size] = '\0';+        *len = result_size;+    }+    +    closeb(bf);+    return result;+}++int mhs_eval_string(MhsContextPtr ctx, const char* expr, size_t len, char** result, size_t* result_len) {+    if (!ctx) return -1;+    if (!ctx->initialized) return -1;+    if (ctx->error_occurred) return -1;+    +    // Set up error handling+    current_ctx = ctx;+    ctx->error_occurred = 0;+    +    if (setjmp(ctx->error_jmp) != 0) {+        // Error occurred during evaluation+        current_ctx = NULL;+        return -1;+    }+    +    // Create a read buffer from the input string+    BFILE *bf = openb_rd_mem((uint8_t*)expr, len);+    if (!bf) {+        strncpy(ctx->error_msg, "Failed to create input buffer", sizeof(ctx->error_msg) - 1);+        ctx->error_occurred = 1;+        current_ctx = NULL;+        return -1;+    }+    +    // Parse the program from the buffer+    NODEPTR prog;+    prog = parse_top(bf, 0);+    closeb(bf);+    +    if (!prog) {+        fprintf(stderr, "Failed to parse expression: %s\n", ctx->error_msg);+        strncpy(ctx->error_msg, "Failed to parse expression", sizeof(ctx->error_msg) - 1);+        ctx->error_occurred = 1;+        current_ctx = NULL;+        return -1;+    }+    +    // Clear stack+    CLEARSTK();+    +    // Evaluate the parsed program+    start_exec(prog);+    // Flush standard handles in case there is some BFILE buffering+    flushb((BFILE*)FORPTR(comb_stdout)->payload.string);+    flushb((BFILE*)FORPTR(comb_stderr)->payload.string);+    gc();      +    NODEPTR eval_result = prog;               +   +    +    // Convert result to string+    *result = node_to_string(eval_result, result_len);+    if (!*result) {+        strncpy(ctx->error_msg, "Failed to convert result to string", sizeof(ctx->error_msg) - 1);+        ctx->error_occurred = 1;+        current_ctx = NULL;+        return -1;+    }+    +    current_ctx = NULL;+    return 0; // Success+}++int mhs_run_string(MhsContextPtr ctx, const char* expr, size_t len) {+    if (!ctx) return -1;+    if (!ctx->initialized) return -1;+    if (ctx->error_occurred) return -1;+    +    // Set up error handling+    current_ctx = ctx;+    ctx->error_occurred = 0;+    +    if (setjmp(ctx->error_jmp) != 0) {+        // Error occurred during evaluation+        current_ctx = NULL;+        return -1;+    }+    +    // Create a read buffer from the input string+    BFILE *bf = openb_rd_mem((uint8_t*)expr, len);+    if (!bf) {+        strncpy(ctx->error_msg, "Failed to create input buffer", sizeof(ctx->error_msg) - 1);+        ctx->error_occurred = 1;+        current_ctx = NULL;+        return -1;+    }+    +    // Parse the program from the buffer+    NODEPTR prog;+    prog = parse_top(bf, 0);+    closeb(bf);+    +    if (!prog) {+        fprintf(stderr, "Failed to parse expression: %s\n", ctx->error_msg);+        strncpy(ctx->error_msg, "Failed to parse expression", sizeof(ctx->error_msg) - 1);+        ctx->error_occurred = 1;+        current_ctx = NULL;+        return -1;+    }+    +    // Clear stack+    CLEARSTK();+    +    // Evaluate the parsed program+    start_exec(prog);+    // Flush standard handles in case there is some BFILE buffering+    flushb((BFILE*)FORPTR(comb_stdout)->payload.string);+    flushb((BFILE*)FORPTR(comb_stderr)->payload.string);+    gc();      +    NODEPTR eval_result = prog;               +   +    current_ctx = NULL;+    return 0; // Success+}+++void mhs_free_result(char* result) {+    if (result) {+        free(result);+    }+}++const char* mhs_get_error(MhsContextPtr ctx) {+    if (!ctx) return "Invalid context";+    return ctx->error_msg;+}
+ src/runtime/mhseval.h view
@@ -0,0 +1,32 @@+#ifndef MHSEVAL_H+#define MHSEVAL_H++#include <stddef.h>+#include <stdint.h>++// Opaque handle for MicroHs evaluation context+typedef struct MhsContext* MhsContextPtr;++// Initialize the MicroHs evaluator+MhsContextPtr mhs_init_context(void);++// Cleanup the context+void mhs_free_context(MhsContextPtr ctx);++// Evaluate a combinator expression from a string+// Returns 0 on success, error code on failure+// The result is returned as a string in 'result' and its length in 'result_len'+int mhs_eval_string(MhsContextPtr ctx, const char* expr, size_t len, char** result, size_t* result_len);++// run a combinator expression from a string without returning a result string.+// This is typically used for running programs with side effects where main has type main :: IO ()+// Returns 0 on success, error code on failure+int mhs_run_string(MhsContextPtr ctx, const char* expr, size_t len);++// Free result string allocated by eval functions+void mhs_free_result(char* result);++// Get last error message+const char* mhs_get_error(MhsContextPtr ctx);++#endif
src/runtime/mhsffi.h view
@@ -1,6 +1,11 @@+#include "config.h"+ #include <inttypes.h> #include <stdlib.h> #include <time.h>+#if WANT_MATH+#include <math.h>+#endif  /* WANT_MATH */  #if INTPTR_MAX == 0x7fff #define WORD_SIZE 16@@ -12,16 +17,14 @@ #error Unknown WORD_SIZE #endif -#if WORD_SIZE == 64-typedef double flt_t;-#elif WORD_SIZE == 32-typedef float flt_t;-#elif WORD_SIZE == 16-typedef uint16_t flt_t;         /* No floats, but we need something */-#else-#error Unknown WORD_SIZE-#endif+typedef double flt64_t;+typedef float flt32_t; +struct node;+typedef intptr_t value_t;       /* Make value the same size as pointers, since they are in a union */+typedef uintptr_t uvalue_t;     /* Make unsigned value the same size as pointers, since they are in a union */+typedef intptr_t stackptr_t;    /* Index into stack */+typedef struct node* NODEPTR; typedef void (*HsFunPtr)(void);  typedef int from_t;@@ -31,10 +34,16 @@   int         ffi_arity;   funptr_t    ffi_fun; };-extern struct ffi_entry *xffi_table;+extern const struct ffi_entry *xffi_table; -from_t mhs_from_Double(intptr_t, int, flt_t);-from_t mhs_from_FloatW(intptr_t, int, flt_t);+struct ffe_entry {+  const char  *ffe_name;+  NODEPTR      ffe_value;+};+extern struct ffe_entry *xffe_table;++from_t mhs_from_Double(intptr_t, int, flt64_t);+from_t mhs_from_Float(intptr_t, int, flt32_t); from_t mhs_from_Int(intptr_t, int, intptr_t); from_t mhs_from_Word(intptr_t, int, uintptr_t); from_t mhs_from_Word8(intptr_t, int, uintptr_t);@@ -58,8 +67,8 @@ from_t mhs_from_CUIntPtr(intptr_t, int, uintptr_t); from_t mhs_from_Unit(intptr_t, int); -flt_t              mhs_to_Double(intptr_t, int);-flt_t              mhs_to_FloatW(intptr_t, int);+flt64_t            mhs_to_Double(intptr_t, int);+flt32_t            mhs_to_Float(intptr_t, int); intptr_t           mhs_to_Int(intptr_t, int); uintptr_t          mhs_to_Word(intptr_t, int); uint8_t            mhs_to_Word8(intptr_t, int);@@ -81,3 +90,13 @@ // ssize_t            mhs_to_CSSize(intptr_t, int); intptr_t           mhs_to_CIntPtr(intptr_t, int); uintptr_t          mhs_to_CUIntPtr(intptr_t, int);++void       ffe_push(NODEPTR);+void       ffe_pop(void);+stackptr_t ffe_alloc(void);+void       ffe_apply(void);+stackptr_t ffe_eval(void);+stackptr_t ffe_exec(void);+void       gc_check(size_t);++void *     apply_sp(uvalue_t, void *);
+ src/runtime/micro/config.h view
@@ -0,0 +1,113 @@+/*+ * 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 file descriptor functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_FD 0++/*+ * Include reading from memory buffer.+ */+#define WANT_MEM 1++/*+ * Include transducer for just buffering.+ */+#define WANT_BUF 0++/*+ * Include transducer to turn CRLF <-> LF.+ */+#define WANT_CRLF 0++/*+ * Include transducer for base64 encoding+ */+#define WANT_BASE64 0++/*+ * Include transducer for UTF8 encoding.+ * Currently not optional.+ */+#define WANT_UTF8 1++/*+ * 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++/*+ * Include MD5 checksumming code+ */+#define WANT_MD5 0++/*+ * Include profiling code+ */+#define WANT_TICK 0++/*+ * Process argc, argv+ */+#define WANT_ARGS 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 INTTABLE 0              /* use fixed table of small INT nodes */+#define SANITY   0              /* do some sanity checks */+#define STACKOVL 0              /* check for stack overflow */
+ src/runtime/micro/extra.c view
+ src/runtime/mingw/config.h view
@@ -0,0 +1,78 @@+/*+ * 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++/*+ * Include MD5 checksumming code+ */+#define WANT_MD5 1++/*+ * Include profiling code+ */+#define WANT_TICK 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 returns 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++#define POPCOUNT __builtin_popcountll++#include <inttypes.h>++static inline uint64_t clz(uint64_t x) {+  if (x == 0) return 64;+  return __builtin_clzll(x);+}+#define CLZ clz++static inline uint64_t ctz(uint64_t x) {+  if (x == 0) return 64;+  return __builtin_ctzll(x);+}+#define CTZ ctz++/*+ * 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 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/mingw/extra.c view
+ src/runtime/stm32f4/config.h view
@@ -0,0 +1,148 @@+/*+ * 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 1++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 0++/*+ * Include MD5 checksumming code+ */+#define WANT_MD5 0++/*+ * Include profiling code+ */+#define WANT_TICK 0++/*+ * Process argc, argv+ */+#define WANT_ARGS 0++/*+ * Number of bits in a word.  Only 32 and 64 are supported.+ */+//#define WORD_SIZE 32++/*+ * 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++/*+ * 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 INTTABLE 1              /* use fixed table of small INT nodes */+#define SANITY   1              /* do some sanity checks */+#define STACKOVL 1              /* check for stack overflow */++#define HEAP_CELLS 4000+#define STACK_SIZE 500++#include "stm32f4xx.h"++#define INITIALIZATION+void+main_setup(void)+{+  RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // Enable the clock of port D of the GPIO+	+  GPIOD->MODER |= GPIO_MODER_MODER12_0; // Green LED, set pin 12 as output+  GPIOD->MODER |= GPIO_MODER_MODER13_0; // Orange LED, set pin 13 as output+  GPIOD->MODER |= GPIO_MODER_MODER14_0; // Red LED, set pin 14 as output+  GPIOD->MODER |= GPIO_MODER_MODER15_0; // Blue LED, set pin 15 as output+}++void+set_led(int led, int on)+{+  GPIOD->BSRR = 1 << (12 + led + (on ? 0 : 16));+}++#pragma push+#pragma O0+void+busy_wait(volatile uint32_t cnt) {+  while(cnt--)+    _nop_();+}+#pragma pop++/* Instead of exit()ing, flash the green LED on exit code 0 else the red */+void+myexit(int n)+{+  set_led(0, 0);+  set_led(1, 0);+  set_led(2, 0);+  set_led(3, 0);+  int led = n ? 2 : 0;+  for(;;) {+    set_led(led, 1);+    busy_wait(1000000);+    set_led(led, 0);+    busy_wait(1000000);+  }+}+#define EXIT myexit++int+ffs(uintptr_t x)+{+  if (!x)+    return 0;+  x &= -x;                      /* keep lowest bit */+  int i = __CLZ(x);             /* count leading 0s */+  return 32 - i;                /* 31 leading zeros should return 1 */+}+#define FFS ffs++#define CLZ __CLZ++#define FFI_EXTRA \+  { "set_led",   (funptr_t)set_led,   FFI_IIV }, \+  { "busy_wait", (funptr_t)busy_wait, FFI_IV },
+ src/runtime/stm32f4/extra.c view
+ src/runtime/unix/config.h view
@@ -0,0 +1,135 @@+/* Copyright 2025 Lennart Augustsson+ * See LICENSE file for full license.+ */++/*+ * 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 file descriptor functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_FD 1++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Float type.+ */+#define WANT_FLOAT32 1++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ * Using this on a 32 bit platform will make cells be 12 bytes instead of 8,+ */+#define WANT_FLOAT64 1++/*+ * Include <math.h>+ * Without this exp,sin,sqrt etc will not be available.+ */+#define WANT_MATH 1++/*+ * Include ops for 64 bit integer arithmetic.+ * Using this on a 32 bit platform will make cells be 12 bytes instead of 8.+ * On 64 bit platforms there is always 64 bit arithmetic.+ */+#define WANT_INT64 1++/*+ * Include MD5 checksumming code+ */+#define WANT_MD5 1++/*+ * Include profiling code+ */+#define WANT_TICK 1++/*+ * Include directory manipulation+ */+#define WANT_DIR 1++/*+ * Include time_t type+ */+#define WANT_TIME 1++/*+ * We want a signal handler for SIGINT.+ */+#define WANT_SIGINT 1++/*+ * Symbolic names for tag when things go wrong.+ */+#define WANT_TAGNAMES 1++/*+ * errno related stuff+ */+#define WANT_ERRNO 1++/*+ * Use CPU counters.+ * Only available on:+ *  - MacOS with M4 CPU+ *  - Linux with supported CPUs (e.g., x86_64)+ */+#define WANT_KPERF 0++/*+ * 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) */+/* #define ERR1(s,a) */++#define GCRED    1              /* do some reductions during GC */+#define INTTABLE 1              /* use fixed table of small INT nodes */+#define SANITY   1              /* do some sanity checks */+#define STACKOVL 1              /* check for stack overflow */++/******** Utility functions ********/++#include <inttypes.h>+#include <termios.h>+#include <sys/types.h>+#include <unistd.h>+#include <string.h>+#include <strings.h>+#include <stdlib.h>+#include <fcntl.h>+#include <errno.h>+#include <time.h>+#include <sys/time.h>+#include <stdio.h>+#include <locale.h>+#include <limits.h>++#if defined(__APPLE__) && defined(__MACH__)   // any Darwin (macOS, iOS, tvOS, watchOS)+  #include <TargetConditionals.h>+  #if TARGET_OS_OSX+    #define ISMACOS 1+  #endif+#endif++#if defined(__linux__)+  #define ISLINUX 1+#endif
+ src/runtime/unix/extra.c view
@@ -0,0 +1,184 @@+/* Copyright 2025 Lennart Augustsson+ * See LICENSE file for full license.+ */++/*+ * Find First Set+ * This macro should be defined.+ * It returns the number of the least significant bit that is set.+ * Numberings starts from 1.  If no bit is set, it should return 0.+ */+#if INTPTR_MAX == 0x7fffffff+/* 32 bit platform */+#if _POSIX_VERSION >= 200112L+#define FFS ffs+#endif  /* _POSIX_VERSION */++#else  /* INTPTR_MAX == 0x7fffffff */+/* 64 bit platform */+#if defined(__gnu_linux__) || defined(__APPLE__) || defined(__FreeBSD__)+/* Only some platforms have 64 bit ffsl function directly. */+#define FFS ffsl++#elif defined(__has_builtin)+#if __has_builtin(__builtin__ffsl)+#define FFS __builtin_ffsl+#endif  /* __has_builtin(__builtin_ffsl) */+#endif  /* if defined(...) */+#endif  /* INTPTR_MAX == 0x7fffffff */++/*+ * 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 defined(USE_SYSTEM_RAW)++  /* For, e.g., execution with WASM in node the ioctl() doesn't seem to work */+  system("stty raw");+  r = read(0, &c, 1);+  system("stty -raw");++#else  /* USE_SYSTEM_RAW */++  if (tcgetattr(0, &old)) {+#if WANT_STDIO+    fprintf(stderr, "tcgetattr failed: errno=%d\n", errno);+#endif  /* WANT_STDIO */+    return -1;+  }+  new = old;+  new.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP+                   | INLCR | IGNCR | ICRNL | IXON);+  new.c_oflag &= ~OPOST;+  new.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);+  new.c_cflag &= ~(CSIZE | PARENB);+  new.c_cflag |= CS8;+  if (tcsetattr(0, TCSANOW, &new)) {+#if WANT_STDIO+    fprintf(stderr, "tcsetattr 1 failed: errno=%d\n", errno);+#endif  /* WANT_STDIO */+    return -1;+  }+  r = read(0, &c, 1);+  if (tcsetattr(0, TCSANOW, &old)) {+#if WANT_STDIO+    fprintf(stderr, "tcsetattr 2 failed: errno=%d\n", errno);+#endif  /* WANT_STDIO */+    return -1;+  }++#endif  /* USE_SYSTEM_RAW */++  if (r == 1)+    return c;+  else {+#if WANT_STDIO+    fprintf(stderr, "read failed: errno=%d\n", errno);+#endif  /* WANT_STDIO */+    return -1;+  }+}+/*+ * Get a raw input character.+ * If undefined, the default always returns -1+ */+#define GETRAW getraw++/*+ * Get time since some epoch in milliseconds.+ */+uintptr_t+gettimemilli(void)+{+  struct timeval tv;+  (void)gettimeofday(&tv, NULL);+  return (uintptr_t)(tv.tv_sec * 1000 + tv.tv_usec / 1000);+}+#define GETTIMEMILLI gettimemilli++/*+ * Create a unique file name.+ */+char*+tmpname(const char* pre, const char* suf)+{+  const char *tmpdir = getenv("TMPDIR");+  if (!tmpdir)+    tmpdir = "/tmp";++  char *path = malloc(PATH_MAX);+  if (!path)+    return 0;+  strncpy(path, tmpdir, PATH_MAX);+  strncat(path, "/", PATH_MAX - strlen(path) - 1);+  strncat(path, pre, PATH_MAX - strlen(path) - 1);+  strncat(path, "XXXXXX", PATH_MAX - strlen(path) - 1);+  strncat(path, suf, PATH_MAX - strlen(path) - 1);+  int fd = mkstemps(path, strlen(suf));+  if (fd < 0)+    return 0;+  close(fd);                    /* XXX Not great */+  return path;+}+#define TMPNAME tmpname++/*+ * Define CLOCK_INIT is there is a ticking clock.+ * CLOCK_INIT will be called for initializing the clock+ */+/* On Unix we just use gettimeofday() to get the clock,+ * so no initialization is needed.+ */+#define CLOCK_INIT() do { } while(0)+/* CLOCK_T is the type of the clock values. */+#define CLOCK_T int64_t       /* large enough for 290Myears */+/* CLOCK_GET returns the current clock in microseconds. */+#define CLOCK_GET clock_get+/* CLOCK_SLEEP sleeps some number of microseconds */+#define CLOCK_SLEEP usleep+CLOCK_T CLOCK_GET(void)+{+  struct timeval tv;+  (void)gettimeofday(&tv, 0);   /* this is very fast, about 16ns on an M4 MacMini */+  return (uint64_t)(tv.tv_sec * 1000000 + tv.tv_usec);+}++void+getcputime(long *sec, long *nsec)+{+#if WANT_TIME+  struct timespec ts;+  +  if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) == 0) {+    *sec = ts.tv_sec;+    *nsec = ts.tv_nsec;+    return;+  }+#endif+  *sec = 0;+  *nsec = 0;+}+#define GETCPUTIME getcputime++#if WANT_KPERF++#if defined(__APPLE__) && defined(__MACH__) && (defined(__aarch64__) || defined(__arm64__))+#include "kperf-macos.c"+#else  /* apple-arm */+#if defined(__linux__) && (defined(__x86_64__) || defined(__amd64__))+#include "kperf-linux.c"+#else  /* linux */+/* No instruction counters */+int start_kperf(void) { return 1; }+uint64_t end_kperf(void) { return 0; }+#endif  /* linux */+#endif  /* apple-arm */++#endif  /* WANT_KPERF */
+ src/runtime/unix/kperf-linux.c view
@@ -0,0 +1,110 @@+// Code from ChatGPT-5+// kperf_inst_stable.c  (Linux version)++#define _GNU_SOURCE+#include <errno.h>+#include <inttypes.h>+#include <linux/perf_event.h>+#define __USE_GNU+#include <sched.h>+#undef __USE_GNU+#include <signal.h>+#include <stdarg.h>+#include <stdbool.h>+#include <stdint.h>+#include <stdio.h>+#include <stdlib.h>+#include <string.h>+#include <sys/ioctl.h>+#include <sys/resource.h>+#include <sys/syscall.h>+#include <sys/types.h>+#include <unistd.h>++// Soft pin to a single CPU to reduce migration noise.+static void pin_to_cpu(int cpu) {+  cpu_set_t set;+  CPU_ZERO(&set);+  CPU_SET(cpu, &set);+  (void)sched_setaffinity(0, sizeof(set), &set); /* ignore error */+}++// Optional: try to bump priority a bit (may require CAP_SYS_NICE; ignore errors).+static void try_bump_priority(void) {+  (void)setpriority(PRIO_PROCESS, 0, -5); /* ignore error */+}++// Open a per-thread perf event for "instructions retired".+static int open_instr_counter(void) {+  struct perf_event_attr attr;+  memset(&attr, 0, sizeof(attr));+  attr.type = PERF_TYPE_HARDWARE;+  attr.size = sizeof(attr);+  attr.config = PERF_COUNT_HW_INSTRUCTIONS;+  attr.disabled = 1;                 // start disabled+  attr.exclude_kernel = 1;           // count only user-space+  attr.exclude_hv = 1;               // exclude hypervisor+  attr.exclude_idle = 1;             // (mostly relevant for system-wide)+  attr.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_TOTAL_TIME_RUNNING;++  // Per-thread mode: pid = 0, cpu = -1, current thread, any CPU+  int fd = (int)syscall(__NR_perf_event_open, &attr, 0, -1, -1, 0);+  if (fd < 0) {+    perror("perf_event_open");+    fprintf(stderr,+      "Hint: you might need: sudo sysctl kernel.perf_event_paranoid=1 (or 0)\n");+  }+  return fd;+}++// Read counter+static uint64_t read_counter(int fd) {+  struct {+    uint64_t value;+    uint64_t time_enabled;+    uint64_t time_running;+  } data;+  ssize_t n = read(fd, &data, sizeof(data));+  if (n != (ssize_t)sizeof(data)) {+    perror("read(perf)");+    return 0;+  }+  return data.value;+}++static int kperf_fd = -1;++// Measure median (over 'reps') of (instructions per call), averaging each rep over N calls.+static int+start_kperf(void) {+  // Stabilizers+  pin_to_cpu(0);+  try_bump_priority();++  int fd = open_instr_counter();+  if (fd < 0)+    return 0;+  if (ioctl(fd, PERF_EVENT_IOC_RESET, 0) != 0)+    perror("ioctl RESET failed");+  if (ioctl(fd, PERF_EVENT_IOC_ENABLE, 0) != 0)+    perror("ioctl ENABLE failed");++  kperf_fd = fd;+  return 1;+}++static uint64_t+end_kperf(void)+{+    if (ioctl(kperf_fd, PERF_EVENT_IOC_DISABLE, 0) != 0)+      perror("ioctl DISABLE failed");++    if (kperf_fd >= 0) {+      uint64_t instr = read_counter(kperf_fd);++      close(kperf_fd);+      return instr;+    } else {+      return 0;+    }+}
+ src/runtime/unix/kperf-macos.c view
@@ -0,0 +1,127 @@+// Code originally from ChatGPT5++#define _DARWIN_C_SOURCE+#include <dlfcn.h>+#include <mach/mach.h>+#include <mach/thread_policy.h>+#include <pthread.h>+#include <stdint.h>+#include <stdio.h>+#include <stdlib.h>+#include <string.h>++// ---- kperf symbols (resolved at runtime) ----+typedef int  (*kpc_set_counting_t)(uint32_t classes);+typedef int  (*kpc_set_thread_counting_t)(uint32_t classes);+typedef uint32_t  (*kpc_get_counter_count_t)(uint32_t classes);+typedef int  (*kpc_get_thread_counters_t)(uint32_t tid, uint32_t buf_count, uint64_t *buf);+typedef int  (*kpc_force_all_ctrs_set_t)(int val);+typedef int  (*kpc_force_all_ctrs_get_t)(int *val);++static kpc_set_counting_t          kpc_set_counting;+static kpc_set_thread_counting_t   kpc_set_thread_counting;+static kpc_get_counter_count_t     kpc_get_counter_count;+static kpc_get_thread_counters_t   kpc_get_thread_counters;+static kpc_force_all_ctrs_set_t    kpc_force_all_ctrs_set;+static kpc_force_all_ctrs_get_t    kpc_force_all_ctrs_get;++enum { KPC_CLASS_FIXED = 0 };+#define KPC_CLASS_FIXED_MASK (1u << KPC_CLASS_FIXED)++static int load_kperf(void) {+  const char *path = "/System/Library/PrivateFrameworks/kperf.framework/kperf";+  void *h = dlopen(path, RTLD_LAZY);+  if (!h) { fprintf(stderr, "dlopen: %s\n", dlerror()); return -1; }+  #define RESOLVE(sym) do { *(void**)(&sym) = dlsym(h, #sym); if (!(sym)) { fprintf(stderr, "dlsym(%s) failed\n", #sym); return -1; } } while (0)+  RESOLVE(kpc_set_counting);+  RESOLVE(kpc_set_thread_counting);+  RESOLVE(kpc_get_counter_count);+  RESOLVE(kpc_get_thread_counters);+  RESOLVE(kpc_force_all_ctrs_set);+  RESOLVE(kpc_force_all_ctrs_get);+  #undef RESOLVE+  return 0;+}++// ---- Stabilizers ----++// Prefer P-cores by raising QoS (no hard pinning to P/E on macOS).+static void prefer_interactive_qos(void) {+  // If available on your SDK:+  pthread_set_qos_class_self_np(QOS_CLASS_USER_INTERACTIVE, 0);+  // Portable fallback: raise priority slightly (optional); QoS is better when available.+}++// Keep the thread on a single core (soft affinity tag).+static void set_thread_affinity(int tag) {+  thread_affinity_policy_data_t pol = { tag };+  thread_policy_set(mach_thread_self(), THREAD_AFFINITY_POLICY,+                    (thread_policy_t)&pol, THREAD_AFFINITY_POLICY_COUNT);+}++// Read current thread's fixed counters into buf; returns count or 0 on error.+static uint32_t read_fixed(uint64_t *buf, uint32_t buf_len) {+  uint32_t need = kpc_get_counter_count(KPC_CLASS_FIXED_MASK);+  if (need == 0 || need > buf_len) return 0;+  if (kpc_get_thread_counters(0 /* this thread */, need, buf) != 0) return 0;+  return need;+}++#define MAXC 16+static uint64_t start_counters[MAXC];+static int kperf_ok = 0;++// Return instructions retired for running fn(arg) once, averaged over N iterations,+// repeated 'reps' times; returns the median per-call instruction count.+int+start_kperf(void) {+  if (load_kperf() != 0)+    return 0;++  // Acquire PMU if needed (often requires root)+  int blessed = 0;+  if (kpc_force_all_ctrs_get(&blessed) != 0)+    return 0;+  if (!blessed && kpc_force_all_ctrs_set(1) != 0)+    return 0;++  // Enable only FIXED counters (we'll read index 1 = instructions).+  if (kpc_set_counting(KPC_CLASS_FIXED_MASK) != 0)+    return 0;+  if (kpc_set_thread_counting(KPC_CLASS_FIXED_MASK) != 0)+    return 0;++  // Stabilize execution+  prefer_interactive_qos();+  set_thread_affinity(1);++  uint32_t n0 = read_fixed(start_counters, MAXC);+  if (n0 < 2) {+    fprintf(stderr, "Fixed counters < 2; instructions not available?\n");+    return 0;+  }+  kperf_ok = 1;+  return 1;+}++/* return number of instructions */+uint64_t+end_kperf(void)+{+  if (!kperf_ok)+    return 0;+  uint64_t end_counters[MAXC];+  uint32_t n0 = read_fixed(end_counters, MAXC);+  if (n0 < 2) {+    fprintf(stderr, "Fixed counters < 2; instructions not available?\n");+    return 0;+  }++  kpc_set_thread_counting(0);+  kpc_set_counting(0);+  kpc_force_all_ctrs_set(0);++  // On Apple silicon, fixed[1] is instructions retired.+  uint64_t instr = end_counters[1] - start_counters[1];+  return instr;+}
+ src/runtime/windows/config.h view
@@ -0,0 +1,82 @@+/* Copyright 2025 Lennart Augustsson+ * See LICENSE file for full license.+ */++/*+ * 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 Float type.+ */+#define WANT_FLOAT32 1++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ * Using this on a 32 bit platform will make cells be 12 bytes instead of 8,+ */+#define WANT_FLOAT64 1++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 1++/*+ * Include ops for 64 bit integer arithmetic.+ * Using this on a 32 bit platform will make cells be 12 bytes instead of 8.+ * On 64 bit platforms there is always 64 bit arithmetic.+ */+#define WANT_INT64 1++/*+ * Include MD5 checksumming code+ */+#define WANT_MD5 1++/*+ * Include profiling code+ */+#define WANT_TICK 1++/*+ * This is Windows+ */+#define ISWINDOWS 1++#include <inttypes.h>+#define WIN32_LEAN_AND_MEAN+#include <Windows.h>+#include <intrin.h>+#include <stdlib.h>+#include <stdio.h>+#include <locale.h>+#include <string.h>+#include <errno.h>+#include <fcntl.h>+#include <sys/stat.h>++/* Make these empty */+#define NORETURN+#define PACKED++/*+ * 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 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/windows/extra.c view
@@ -0,0 +1,156 @@+/* Copyright 2025 Lennart Augustsson+ * See LICENSE file for full license.+ */+#include <conio.h>+#include <io.h>++/*+ * Find First Set+ * This macro must be defined.+ * It returns the number of the least significant bit that is set.+ * Numberings starts from 1.  If no bit is set, it should return 0.+ */+//#pragma warning(disable : 4996)+#pragma intrinsic(_BitScanForward64)+#pragma intrinsic(_BitScanReverse64)+static inline int+ffs(int64_t arg)+{+  unsigned long r;+  if (_BitScanForward64(&r, arg))+    return (int)(r+1);+  else+    return 0;+}+#define FFS ffs++#if defined(_M_X64)+#define POPCOUNT __popcnt64+#elif defined(_M_IX86)+#define POPCOUNT __popcnt+#endif++static inline uint64_t clz(uint64_t x) {+  unsigned long count;+  if (_BitScanReverse64(&count, x)) {+    return 63 - (uint64_t)count;+  } else {+    return 64;+  }+}+#define CLZ clz++static inline uint64_t ctz(uint64_t x) {+  unsigned long count;+  if (_BitScanForward64(&count, x)) {+    return (uint64_t)count;+  } else {+    return 64;+  }+}+#define CTZ ctz++/*+ * 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+int+getraw(void)+{+  static char buf[2];+  int c;+  if (buf[0]) {+    c = buf[0];+    buf[0] = buf[1];+    buf[1] = 0;+  } else {+  tryagain:+    c = _getch();+    if (c == 0xe0 || c == 0x00) {+      switch(_getch()) {+      case 0x48: buf[1] = 'A'; break; /* Up arrow */+      case 0x50: buf[1] = 'B'; break; /* Down arrow */+      case 0x4d: buf[1] = 'C'; break; /* Right arrow */+      case 0x4b: buf[1] = 'D'; break; /* Left arrow */+      default: goto tryagain;+      }+      buf[0] = '[';+      c = 0x1b;                 /* ESC */+    }+  }+  return c;+}++/*+ * Get time since some epoch in milliseconds.+ * If undefined, return 0.+ */+#define GETTIMEMILLI gettimemilli++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;+}++/*+ * Create a unique file name.+ */+char*+tmpname(const char* prefix, const char* suffix)+{+  char tmpdir[MAX_PATH];+  DWORD len = GetTempPathA(sizeof(tmpdir), tmpdir);+  if (len == 0 || len > sizeof(tmpdir))+    return 0;++  /* Ensure prefix isn't too short */+  if (!prefix || strlen(prefix) < 3) prefix = "tmp";  // GetTempFileName needs at least 3 chars++  char tempFile[MAX_PATH];+  if (GetTempFileNameA(tmpdir, prefix, 0, tempFile) == 0)+    return 0;++  /* Delete the file created by GetTempFileName */+  DeleteFileA(tempFile);++  /* Append suffix */+  size_t total_len = strlen(tempFile) + strlen(suffix) + 1;+  char *filename = malloc(total_len);+  if (!filename)+    return 0;+  snprintf(filename, total_len, "%s%s", tempFile, suffix);++  // Create the file exclusively to ensure it exists and is unique+  int fd = _open(filename, _O_CREAT | _O_EXCL | _O_RDWR | _O_BINARY,+                 _S_IREAD | _S_IWRITE);+  if (fd == -1) {+    free(filename);+    return 0;+  }+  _close(fd);++  return filename;+}+#define TMPNAME tmpname
+ targets.conf view
@@ -0,0 +1,37 @@+[default]+cc = "cc"+ccflags = "-w -Wall -O3 "+cclibs = " -lm"+conf = "unix"++[debug]+cc = "cc"+ccflags = "-w -Wall -g"+cclibs = "-lm"+conf = "unix"++[emscripten]+cc = "emcc"+ccflags = "-O3 -sEXPORTED_RUNTIME_METHODS=stringToNewUTF8 -sALLOW_MEMORY_GROWTH -sTOTAL_STACK=5MB -sNODERAWFS -sSINGLE_FILE -DUSE_SYSTEM_RAW -sEXIT_RUNTIME -Wno-address-of-packed-member"+cclibs = "-lm"+conf = "unix"++[tcc]+cc = "tcc"+ccflags = "-D__TCC__=1"+cclibs = "-lm"+conf = "unix"++[windows]+cc = "cl"+ccflags = "-O2"+cclibs = ""+conf = "windows"+cout = "-Fe"++[environment]+-- Get all values from the environment+cc = "$CC"+ccflags = "$MHSCCFLAGS"+cclibs = "$MHSCCLIBS"+conf = "$MHSCONF"
+ tests/ApplySP.hs view
@@ -0,0 +1,16 @@+module ApplySP where+import Foreign+import Foreign.C.String++foreign import ccall "hsasp.h hsasp" asp :: StablePtr (CString -> IO CString) -> IO ()++fcn :: CString -> IO CString+fcn cs = do+  s <- peekCString cs+  putStrLn $ "fcn: " ++ show s+  newCString "done"++main :: IO ()+main = do+  sp <- newStablePtr fcn+  asp sp
+ tests/ApplySP.ref view
@@ -0,0 +1,2 @@+fcn: "arg"+hsasp: done
+ tests/Arith64.hs view
@@ -0,0 +1,23 @@+module Arith64 where+import Data.Int+import Data.Word++vals :: [Int64]+vals = [-5, -2, -1, 0, 1, 2, 5]++uvals :: [Word64]+uvals = [-5, -2, -1, 0, 1, 2, 5]++main :: IO ()+main = do+  print [ op x y | x <- vals, y <- vals, op <- [(+),( - ),(*)] ]+  print [ op x y | x <- vals, y <- vals, y /= 0, op <- [quot, rem] ]+  print [ op x y | x <- vals, y <- vals, op <- [(==),(/=),(<),(<=),(>),(>=)] ]+  print [ op x y | x <- vals, y <- vals, let op = compare ]+  print [ minBound, maxBound :: Int64]++  print [ op x y | x <- uvals, y <- uvals, op <- [(+),( - ),(*)] ]+  print [ op x y | x <- uvals, y <- uvals, y /= 0, op <- [quot, rem] ]+  print [ op x y | x <- uvals, y <- uvals, op <- [(==),(/=),(<),(<=),(>),(>=)] ]+  print [ op x y | x <- uvals, y <- uvals, let op = compare ]+  print [ minBound, maxBound :: Word64]
+ tests/Arith64.ref view
@@ -0,0 +1,10 @@+[-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]+[EQ,LT,LT,LT,LT,LT,LT,GT,EQ,LT,LT,LT,LT,LT,GT,GT,EQ,LT,LT,LT,LT,GT,GT,GT,EQ,LT,LT,LT,GT,GT,GT,GT,EQ,LT,LT,GT,GT,GT,GT,GT,EQ,LT,GT,GT,GT,GT,GT,GT,EQ]+[-9223372036854775808,9223372036854775807]+[18446744073709551606,0,25,18446744073709551609,18446744073709551613,10,18446744073709551610,18446744073709551612,5,18446744073709551611,18446744073709551611,0,18446744073709551612,18446744073709551610,18446744073709551611,18446744073709551613,18446744073709551609,18446744073709551606,0,18446744073709551606,18446744073709551591,18446744073709551609,3,10,18446744073709551612,0,4,18446744073709551613,18446744073709551615,2,18446744073709551614,18446744073709551614,0,18446744073709551615,18446744073709551613,18446744073709551614,0,18446744073709551612,18446744073709551612,3,18446744073709551609,18446744073709551606,18446744073709551610,4,5,18446744073709551613,1,2,18446744073709551614,0,1,18446744073709551615,18446744073709551615,0,0,18446744073709551614,18446744073709551615,1,18446744073709551613,18446744073709551614,4,18446744073709551610,18446744073709551611,18446744073709551611,5,0,18446744073709551614,2,0,18446744073709551615,1,0,0,0,0,1,18446744073709551615,0,2,18446744073709551614,0,5,18446744073709551611,0,18446744073709551612,6,18446744073709551611,18446744073709551615,3,18446744073709551614,0,2,18446744073709551615,1,1,0,2,0,1,3,18446744073709551615,2,6,18446744073709551612,5,18446744073709551613,7,18446744073709551606,0,4,18446744073709551612,1,3,18446744073709551614,2,2,0,3,1,2,4,0,4,7,18446744073709551613,10,0,10,18446744073709551591,3,7,18446744073709551606,4,6,18446744073709551611,5,5,0,6,4,5,7,3,10,10,0,25]+[1,0,0,18446744073709551611,0,18446744073709551611,18446744073709551611,0,9223372036854775805,1,3689348814741910322,1,1,3,1,0,0,18446744073709551614,18446744073709551614,0,9223372036854775807,0,3689348814741910322,4,1,4,1,1,1,0,18446744073709551615,0,9223372036854775807,1,3689348814741910323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,2,0,2,0,2,2,0,1,0,0,2,0,5,0,5,0,5,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,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,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,False,True,True,True,False,False,False,True,True,True,False,False,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]+[EQ,LT,LT,GT,GT,GT,GT,GT,EQ,LT,GT,GT,GT,GT,GT,GT,EQ,GT,GT,GT,GT,LT,LT,LT,EQ,LT,LT,LT,LT,LT,LT,GT,EQ,LT,LT,LT,LT,LT,GT,GT,EQ,LT,LT,LT,LT,GT,GT,GT,EQ]+[0,18446744073709551615]
tests/Array.hs view
@@ -1,5 +1,5 @@ module Array where-import Data.Array+import Mhs.Array  main :: IO () main = do
+ tests/Base64.hs view
@@ -0,0 +1,18 @@+module Base64 where+import System.Environment+import System.IO+import System.IO.Transducers++main :: IO ()+main = do+  [fn] <- getArgs+  file <- readBinaryFile fn+  hout <- openFile "out.b64" WriteMode+  hout' <- addBase64 hout+  hPutStr hout' file+  hClose hout'++  hin <- openBinaryFile "out.b64" ReadMode+  hin' <- addBase64 hin+  ofile <- hGetContents hin'+  writeBinaryFile "out" ofile
tests/BitCount.hs view
@@ -19,6 +19,10 @@   print $ popCount (42 :: Word32)   print $ popCount (64 :: Word32)   print $ popCount (maxBound :: Word32)+  print $ popCount (0 :: Word64)+  print $ popCount (42 :: Word64)+  print $ popCount (64 :: Word64)+  print $ popCount (maxBound :: Word64)   print $ popCount (0 :: Word)   print $ popCount (42 :: Word)   print $ popCount (64 :: Word)@@ -44,6 +48,13 @@   print $ popCount (-42 :: Int32)   print $ popCount (minBound :: Int32)   print $ popCount (maxBound :: Int32)+  print $ popCount (0 :: Int64)+  print $ popCount (42 :: Int64)+  print $ popCount (64 :: Int64)+  print $ popCount (-1 :: Int64)+  print $ popCount (-42 :: Int64)+  print $ popCount (minBound :: Int64)+  print $ popCount (maxBound :: Int64)   print $ popCount (0 :: Int)   print $ popCount (42 :: Int)   print $ popCount (64 :: Int)@@ -67,6 +78,10 @@   print $ countLeadingZeros (42 :: Word32)   print $ countLeadingZeros (64 :: Word32)   print $ countLeadingZeros (maxBound :: Word32)+  print $ countLeadingZeros (0 :: Word64)+  print $ countLeadingZeros (42 :: Word64)+  print $ countLeadingZeros (64 :: Word64)+  print $ countLeadingZeros (maxBound :: Word64)   print $ countLeadingZeros (0 :: Word) == _wordSize   print $ countLeadingZeros (42 :: Word) == _wordSize - 6   print $ countLeadingZeros (64 :: Word) == _wordSize - 7@@ -92,6 +107,13 @@   print $ countLeadingZeros (-42 :: Int32)   print $ countLeadingZeros (minBound :: Int32)   print $ countLeadingZeros (maxBound :: Int32)+  print $ countLeadingZeros (0 :: Int64)+  print $ countLeadingZeros (42 :: Int64)+  print $ countLeadingZeros (64 :: Int64)+  print $ countLeadingZeros (-1 :: Int64)+  print $ countLeadingZeros (-42 :: Int64)+  print $ countLeadingZeros (minBound :: Int64)+  print $ countLeadingZeros (maxBound :: Int64)   print $ countLeadingZeros (0 :: Int) == _wordSize   print $ countLeadingZeros (42 :: Int) == _wordSize - 6   print $ countLeadingZeros (64 :: Int) == _wordSize - 7@@ -115,6 +137,10 @@   print $ countTrailingZeros (42 :: Word32)   print $ countTrailingZeros (64 :: Word32)   print $ countTrailingZeros (maxBound :: Word32)+  print $ countTrailingZeros (0 :: Word64)+  print $ countTrailingZeros (42 :: Word64)+  print $ countTrailingZeros (64 :: Word64)+  print $ countTrailingZeros (maxBound :: Word64)   print $ countTrailingZeros (0 :: Word) == _wordSize   print $ countTrailingZeros (42 :: Word)   print $ countTrailingZeros (64 :: Word)@@ -140,6 +166,13 @@   print $ countTrailingZeros (-42 :: Int32)   print $ countTrailingZeros (minBound :: Int32)   print $ countTrailingZeros (maxBound :: Int32)+  print $ countTrailingZeros (0 :: Int64)+  print $ countTrailingZeros (42 :: Int64)+  print $ countTrailingZeros (64 :: Int64)+  print $ countTrailingZeros (-1 :: Int64)+  print $ countTrailingZeros (-42 :: Int64)+  print $ countTrailingZeros (minBound :: Int64)+  print $ countTrailingZeros (maxBound :: Int64)   print $ countTrailingZeros (0 :: Int) == _wordSize   print $ countTrailingZeros (42 :: Int)   print $ countTrailingZeros (64 :: Int)
tests/BitCount.ref view
@@ -13,6 +13,10 @@ 0 3 1+64+0+3+1 True 0 3@@ -38,6 +42,13 @@ 0 3 1+64+61+1+63+0+3+1 True True 1@@ -55,6 +66,10 @@ 26 25 0+64+58+57+0 True True True@@ -80,6 +95,13 @@ 0 0 1+64+58+57+0+0+0+1 True True True@@ -100,6 +122,10 @@ 1 6 0+64+1+6+0 True 1 6@@ -124,6 +150,13 @@ 0 1 31+0+64+1+6+0+1+63 0 True 1
+ tests/Builder.hs view
@@ -0,0 +1,70 @@+module Builder where++import Data.ByteString.Builder+import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as L+import qualified Data.ByteString.Short as S+import Data.Int+import Data.Word++builder :: Builder+builder = mempty+    <> byteString (B.pack [32..64])+    <> lazyByteString (L.pack [65..126])+    <> shortByteString (S.pack [0xff, 0xfe])+    <> int8 0xf0+    <> word8 0xf0+    <> int16BE 0xf063+    <> int32BE 0xf063481a+    <> int64BE 0xf063481acbd25901+    <> word16BE 0x63f0+    <> word32BE 0x1a4863f0+    <> word64BE 0x0159d2cb1a4863f0+    <> floatBE (sqrt 2)+    <> doubleBE (sqrt 2)+    <> int16LE 0xf063+    <> int32LE 0xf063481a+    <> int64LE 0xf063481acbd25901+    <> word16LE 0x63f0+    <> word32LE 0x1a4863f0+    <> word64LE 0x0159d2cb1a4863f0+    <> floatLE 1.0+    <> doubleLE 1.0+    <> char7 '$'+    <> string7 "hello"+    <> char8 'µ'+    <> stringUtf8 "Ölrückstoßabdämpfung"+    <> charUtf8 '€'+    <> int8Dec minBound+    <> int16Dec minBound+    <> int32Dec minBound+    <> int64Dec minBound+    <> intDec (-42)+    <> integerDec (2 ^ 127 - 1)+    <> word8Dec maxBound+    <> word16Dec maxBound+    <> word32Dec maxBound+    <> word64Dec maxBound+    <> wordDec 42+    <> word8Hex maxBound+    <> word16Hex maxBound+    <> word32Hex maxBound+    <> word64Hex maxBound+    <> wordHex 42+    <> int8HexFixed (-123)+    <> int16HexFixed (-1234)+    <> int32HexFixed (-12345)+    <> int64HexFixed (-123456)+    <> word8HexFixed 123+    <> word16HexFixed 1234+    <> word32HexFixed 12345+    <> word64HexFixed 123456+    <> floatHexFixed (sqrt 2)+    <> doubleHexFixed (sqrt 2)+    <> byteStringHex (B.pack [32..64])+    <> lazyByteStringHex (L.pack [65..126])+    <> floatDec (sqrt 2)+    <> doubleDec (sqrt 2)++main :: IO ()+main = print $ toLazyByteString builder
+ tests/Builder.ref view
@@ -0,0 +1,1 @@+" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\255\254\240\240\240c\240cH\SUB\240cH\SUB\203\210Y\SOHc\240\SUBHc\240\SOHY\210\203\SUBHc\240?\181\EOT\243?\246\160\158f\DEL;\205c\240\SUBHc\240\SOHY\210\203\SUBHc\240\240c\240cH\SUB\240cH\SUB\203\210Y\SOH\NUL\NUL\128?\NUL\NUL\NUL\NUL\NUL\NUL\240?$hello\181\195\150lr\195\188cksto\195\159abd\195\164mpfung\226\130\172-128-32768-2147483648-9223372036854775808-421701411834604692317316873037158841057272556553542949672951844674407370955161542ffffffffffffffffffffffffffffff2a85fb2effffcfc7fffffffffffe1dc07b04d200003039000000000001e2403fb504f33ff6a09e667f3bcd202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e1.41421351.4142135623730951"
+ tests/ByteArray.hs view
@@ -0,0 +1,12 @@+module ByteArray where+import Control.Monad.ST+import Data.Array.Byte++main :: IO ()+main = do+  let b = runST $ do+        a <- newMutableByteArray 5+        writeWord8 a 1 65+        writeWord8 a 3 66+        freezeMutableByteArray a+  print b
+ tests/ByteArray.ref view
@@ -0,0 +1,1 @@+"\NULA\NULB\NUL"
tests/ByteStringIO.hs view
@@ -2,7 +2,7 @@  import Data.ByteString as BS hiding (map) import Data.Char-import System.IO (stdout)+import System.IO(stdout)  text :: ByteString text = BS.pack $ map (fromIntegral . ord) "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+ tests/ByteStringLow.hs view
@@ -0,0 +1,34 @@+module ByteStringLow where++import Data.ByteString+import Data.ByteString.Internal+import Foreign+import Foreign.C++foreign import ccall "strlen" c_strlen :: Ptr CChar -> IO CSize+foreign import ccall "malloc" c_malloc :: CSize -> IO (Ptr CChar)+foreign import ccall "strcpy" c_strcpy :: Ptr CChar -> Ptr CChar -> IO ()++-- test some low level ugliness+main :: IO ()+main = do+  let s = "abc" :: ByteString+  print s+  xbs <- useAsCString s $ \ p -> do+    -- p is a pointer to the C string "abc"+    n <- c_strlen p+    q <- c_malloc (n+1)+    c_strcpy q p+    grabCString q+  print xbs++  -- Check that NUL terminates the C string+  let s = "a\NULbc" :: ByteString+  print s+  xbs <- useAsCString s $ \ p -> do+    -- p is a pointer to the C string "a"+    n <- c_strlen p+    q <- c_malloc (n+1)+    c_strcpy q p+    grabCString q+  print xbs
+ tests/ByteStringLow.ref view
@@ -0,0 +1,4 @@+"abc"+"abc"+"a\NULbc"+"a"
+ tests/Callback.hs view
@@ -0,0 +1,26 @@+module Callback where++foreign export ccall "hsexp" cb :: Int -> IO Int+foreign import ccall "hsimp.h hsimp" imp :: Int -> IO Int++fac :: Int -> Int+fac 0 = 1+fac n = n * fac(n-1)++--pp :: Int -> IO ()+--pp = _primitive "IO.pp"++cb :: Int -> IO Int+cb n = do+  let r = fac n+  putStrLn $ "cb: " ++ show r+  return r++doit :: Int -> IO ()+doit n = do+  r <- imp n+  putStrLn $ "doit: " ++ show r++main :: IO ()+main = do+  mapM_ doit [1..5]
+ tests/Callback.ref view
@@ -0,0 +1,20 @@+enter hsimp n=1+cb: 1+exit hsimp hsexp=1+doit: 1+enter hsimp n=2+cb: 2+exit hsimp hsexp=2+doit: 2+enter hsimp n=3+cb: 6+exit hsimp hsexp=6+doit: 6+enter hsimp n=4+cb: 24+exit hsimp hsexp=24+doit: 24+enter hsimp n=5+cb: 120+exit hsimp hsexp=120+doit: 120
tests/Catch.ref view
@@ -1,7 +1,7 @@ "ok"-"error: bang!"-"no match at \"./Catch.hs\",6:1"-"no default for m, at \"./Catch.hs\",9:3"+"error: \"./Catch.hs\",21:20: bang!"+"Non-exhaustive patterns \"./Catch.hs\",6:1"+"No instance nor default method for class operation m, at \"./Catch.hs\",9:3" "hello" "bye" "hello"
+ tests/Ctx.hs view
@@ -0,0 +1,8 @@+module Ctx where++foo :: Int -> (Eq a => a -> Int)+foo i a = if a==a then i else 0++main :: IO ()+main = do+  print $ foo 5 ()
+ tests/DArith.hs view
@@ -0,0 +1,17 @@+module DArith(module DArith) where++readDouble :: String -> Double+readDouble = read++list1 :: [Double]+list1 = [-100.5::Double, -53.25::Double, 0.0::Double, 1.0::Double, 1.125::Double, 1.0e3::Double]++main :: IO ()+main = do+  print [ op x y | x <- list1, y <- list1, op <- [(+), (-), (*)] ]+  print [ op x y | x <- list1, y <- list1, op <- [(==), (/=), (<), (<=), (>), (>=)] ]+  print [ x / y  | x <- list1, y <- [1.0::Double, -16.0::Double, 0.0625::Double]]+  print $ readDouble "1.625"+  print $ 1.0 + readDouble "2.5"+  print $ map readDouble ["1.5e4", "12500.0e-4"]+  print (fromInteger 1000000000000000 :: Double)
+ tests/DArith.ref view
@@ -0,0 +1,7 @@+[-201.0,0.0,10100.25,-153.75,-47.25,5351.625,-100.5,-100.5,-0.0,-99.5,-101.5,-100.5,-99.375,-101.625,-113.0625,899.5,-1100.5,-100500.0,-153.75,47.25,5351.625,-106.5,0.0,2835.5625,-53.25,-53.25,-0.0,-52.25,-54.25,-53.25,-52.125,-54.375,-59.90625,946.75,-1053.25,-53250.0,-100.5,100.5,-0.0,-53.25,53.25,-0.0,0.0,0.0,0.0,1.0,-1.0,0.0,1.125,-1.125,0.0,1000.0,-1000.0,0.0,-99.5,101.5,-100.5,-52.25,54.25,-53.25,1.0,1.0,0.0,2.0,0.0,1.0,2.125,-0.125,1.125,1001.0,-999.0,1000.0,-99.375,101.625,-113.0625,-52.125,54.375,-59.90625,1.125,1.125,0.0,2.125,0.125,1.125,2.25,0.0,1.265625,1001.125,-998.875,1125.0,899.5,1100.5,-100500.0,946.75,1053.25,-53250.0,1000.0,1000.0,0.0,1001.0,999.0,1000.0,1001.125,998.875,1125.0,2000.0,0.0,1000000.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,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,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,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,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,True,False,False,True,False,True]+[-100.5,6.28125,-1608.0,-53.25,3.328125,-852.0,0.0,-0.0,0.0,1.0,-6.25e-2,16.0,1.125,-7.03125e-2,18.0,1000.0,-62.5,16000.0]+1.625+3.5+[15000.0,1.25]+1.0e15
+ tests/DataData.hs view
@@ -0,0 +1,32 @@+module DataData where+import Data.Functor.Const+import Data.Data++data T a = C0 | C1 a | C2 Int a | C3 { x,y,z :: a } | Int `C4` Int+  deriving (Data, Show)++showConstr' :: Constr -> String+showConstr' c =+  "Constr { conrep=" ++ show (constrRep c)+  ++     ", constring=" ++ show c+  ++     ", confields=" ++ show (constrFields c)+  ++     ", confixity=" ++ show (constrFixity c)+  ++     ", datatype="  ++ dataTypeName (constrType c)++arity :: Data a => a -> Int+arity x = getConst (gfoldl step start x)+  where+    start :: forall g. g -> Const Int g+    start _ = Const 0+    step  :: forall d b. Data d+          => Const Int (d -> b) -> d -> Const Int b+    step (Const n) _ = Const (n + 1)++main :: IO ()+main = do+  print $ dataTypeOf (C1 ())+  print $ toConstr (C1 ())+  print (arity (C1 ()))+  print (arity (C4 1 2 :: T ()))+  let AlgRep cs = dataTypeRep (dataTypeOf (C1 ()))+  mapM_ (putStrLn . showConstr') cs
+ tests/DataData.ref view
@@ -0,0 +1,9 @@+DataType {tycon = "DataData.T", datarep = AlgRep [C0,C1,C2,C3,C4]}+C1+1+2+Constr { conrep=AlgConstr 1, constring=C0, confields=[], confixity=Prefix, datatype=DataData.T+Constr { conrep=AlgConstr 2, constring=C1, confields=[], confixity=Prefix, datatype=DataData.T+Constr { conrep=AlgConstr 3, constring=C2, confields=[], confixity=Prefix, datatype=DataData.T+Constr { conrep=AlgConstr 4, constring=C3, confields=["x","y","z"], confixity=Prefix, datatype=DataData.T+Constr { conrep=AlgConstr 5, constring=C4, confields=[], confixity=Infix, datatype=DataData.T
tests/Deriving.hs view
@@ -1,21 +1,75 @@ module Deriving(main) where+import Control.Monad+import Data.Char(chr)+import qualified Data.Foldable as F+import Data.Ix+import Data.Typeable+import Data.Traversable+import Text.Read (readMaybe)  data T a b c = A a | B b | C a Int | D-  deriving (Eq, Ord, Show)+  deriving (Eq, Ord, Show, Read)  data Rec a = R { x :: a, y :: Int }-  deriving Show+  deriving (Show, Read)  newtype Alt f a = Alt (f a)   deriving Show  data E = X | Y | Z-  deriving (Enum, Bounded, Show)+  deriving (Enum, Bounded, Show, Eq, Ord, Ix, Typeable) --- Not yet--- data F a = F0 | F1 a | F2 (a,a) | F3 Int | F4 a Int | F5 (Int -> a)---   deriving Functor+data FF a b = FF a b+  deriving (Show, Functor) +data F a = F0 | F1 a | F2 (a, [a]) | F3 Integer | F4 a Integer | F5 (Integer -> a) | F6 (Maybe [F a]) | F7 (FF Int a) | F8 [(a, a)]+  deriving (Show, Functor)+instance Show (Integer -> Char) where show f = "fcn(100)=" ++ show (f 100)++data G q a = G1 a | G2 (q a)+  deriving (Show, Functor)++data H a = H0 | H1 Int | H2 a | H3 (H a) | H4 (H a) (H a) | H5 [(a, Bool, Maybe a)] | H6 [H a]+  deriving (Foldable)++data U a = U1 | U2 Int | U3 a | U4 a Int (a,a) | U5 [U a]+  deriving (Show, Functor, Foldable, Traversable)++newtype St a = St (Int -> (Int, a))+  deriving (Functor)+instance Applicative St where+  pure x = St $ \ i -> (i, x)+  (<*>) = ap+instance Monad St where+  St sa >>= sk = St $ \ i ->+    case sa i of+      (i', a) ->+        case sk a of+          St f -> f i'+get :: St Int+get = St $ \ i -> (i, i)+put :: Int -> St ()+put i = St $ const (i, ())+num :: a -> St (a, Int)+num a = do+  i <- get+  put (i+1)+  return (a, i)+run :: St a -> a+run (St f) = snd (f 1)++data Pair = MkPair Bool Int deriving (Show, Eq, Ord, Ix)++infixr 5 :^:+data Tree a = Leaf a | Tree a :^: Tree a+  deriving (Show, Read)++infixr 5 `Cons`+data List a = Nil | a `Cons` List a+  deriving (Show, Read)++newtype Op = (:::) () deriving (Read, Show)+ main :: IO () main = do   print $ A 'a' == (A 'a' :: T Char () ())@@ -36,10 +90,116 @@   print (C 'a' 1 :: T Char () ())   print (D :: T () () ())   print (A (A 'a') :: T (T Char () ()) () ())++  print (read "A 42" :: T Int () ())+  print (read "(B (D))" :: T () (T () () ()) ())+  print (read " ( C (((\tTrue\t)))3  ) " :: T Bool () ())+  print (read "D" :: T () () ())+   print $ R{ x='a', y=10 }   print $ R{ x=R{x='b',y=11}, y=10 }+  print (read "R{x=True,y=12}" :: Rec Bool)+  print (read "R { x = True , y = 12 }" :: Rec Bool)    print $ Alt [True] +  let fs = [F0, F1 49, F2 (50, [51,52]), F3 5, F4 54 7, F5 fromInteger, F6 (Just [F1 56, F1 57]), F7 (FF 0 58), F8 [(59,60),(61,62)]] :: [F Int]+  print $ map (fmap chr) fs+  let gs = [G1 True, G2 [True, False]]+  print $ map (fmap show) gs++  let h = H6 [H0, H1 1, H2 1, H3 (H2 2), H4 (H2 3) (H2 4), H5 [(6, False, Just 7), (8, False, Nothing)]]+  print $ F.foldr (:) [] h++  let u = U5 [U1, U2 1, U3 True, U4 False 1 (True, False)]+  print $ run (traverse num u)+  +   print $ fromEnum Y   print (minBound :: E, maxBound :: E)+  -- Ix E+  print $ range (X, X)+  print $ range (X, Y)+  print $ range (X, Z)+  print $ range (Y, X)+  print $ range (Y, Y)+  print $ range (Y, Z)+  print $ range (Z, X)+  print $ range (Z, Y)+  print $ range (Z, Z)+  print $ unsafeIndex (X, X) X+  print $ unsafeIndex (X, Y) X+  print $ unsafeIndex (X, Z) X+  print $ unsafeIndex (Y, X) X+  print $ unsafeIndex (Y, Y) X+  print $ unsafeIndex (Y, Z) X+  print $ unsafeIndex (Z, X) X+  print $ unsafeIndex (Z, Y) X+  print $ unsafeIndex (Z, Z) X+  print $ unsafeIndex (X, X) Y+  print $ unsafeIndex (X, Y) Y+  print $ unsafeIndex (X, Z) Y+  print $ unsafeIndex (Y, X) Y+  print $ unsafeIndex (Y, Y) Y+  print $ unsafeIndex (Y, Z) Y+  print $ unsafeIndex (Z, X) Y+  print $ unsafeIndex (Z, Y) Y+  print $ unsafeIndex (Z, Z) Y+  print $ unsafeIndex (X, X) Z+  print $ unsafeIndex (X, Y) Z+  print $ unsafeIndex (X, Z) Z+  print $ unsafeIndex (Y, X) Z+  print $ unsafeIndex (Y, Y) Z+  print $ unsafeIndex (Y, Z) Z+  print $ unsafeIndex (Z, X) Z+  print $ unsafeIndex (Z, Y) Z+  print $ unsafeIndex (Z, Z) Z+  print $ inRange (X, X) X+  print $ inRange (X, Y) X+  print $ inRange (X, Z) X+  print $ inRange (Y, X) X+  print $ inRange (Y, Y) X+  print $ inRange (Y, Z) X+  print $ inRange (Z, X) X+  print $ inRange (Z, Y) X+  print $ inRange (Z, Z) X+  print $ inRange (X, X) Y+  print $ inRange (X, Y) Y+  print $ inRange (X, Z) Y+  print $ inRange (Y, X) Y+  print $ inRange (Y, Y) Y+  print $ inRange (Y, Z) Y+  print $ inRange (Z, X) Y+  print $ inRange (Z, Y) Y+  print $ inRange (Z, Z) Y+  print $ inRange (X, X) Z+  print $ inRange (X, Y) Z+  print $ inRange (X, Z) Z+  print $ inRange (Y, X) Z+  print $ inRange (Y, Y) Z+  print $ inRange (Y, Z) Z+  print $ inRange (Z, X) Z+  print $ inRange (Z, Y) Z+  print $ inRange (Z, Z) Z++  -- Ix Pair+  let r = (MkPair False 2, MkPair True 5)+  print $ range r+  print $ unsafeIndex r (MkPair True 3)+  print $ inRange r (MkPair True 3)++  print (Leaf 1 :^: Leaf 2 :: Tree Int)+  print (read "Leaf 1 :^: Leaf 2" :: Tree Int)+  print (readMaybe "(:^:) (Leaf 1) (Leaf 2)" :: Maybe (Tree Int))++  print (1 `Cons` 2 `Cons` Nil :: List Int)+  print (read "1 `Cons` (2 `Cons` Nil)" :: List Int)+  print (readMaybe "1 `Cons` 2 `Cons` Nil" :: Maybe (List Int))+  print (readMaybe "Cons 1 (Cons 2 Nil)" :: Maybe (List Int))++  print ((:::) ())+  print (read "(:::) ()" :: Op)+  print (readMaybe "::: ()" :: Maybe Op)++  -- Check that they all have Typeable+  print (typeOf (R True 1), X)
tests/Deriving.ref view
@@ -14,8 +14,95 @@ C 'a' 1 D A (A 'a')-R{x='a',y=10}-R{x=R{x='b',y=11},y=10}+A 42+B D+C True 3+D+R {x = 'a', y = 10}+R {x = R {x = 'b', y = 11}, y = 10}+R {x = True, y = 12}+R {x = True, y = 12} Alt [True]+[F0,F1 '1',F2 ('2',"34"),F3 5,F4 '6' 7,F5 fcn(100)='d',F6 (Just [F1 '8',F1 '9']),F7 (FF 0 ':'),F8 [(';','<'),('=','>')]]+[G1 "True",G2 ["True","False"]]+[1,2,3,4,6,7,8]+U5 [U1,U2 1,U3 (True,1),U4 (False,2) 1 ((True,3),(False,4))] 1 (X,Z)+[X]+[X,Y]+[X,Y,Z]+[]+[Y]+[Y,Z]+[]+[]+[Z]+0+0+0+-1+-1+-1+-2+-2+-2+1+1+1+0+0+0+-1+-1+-1+2+2+2+1+1+1+0+0+0+True+True+True+False+False+False+False+False+False+False+True+True+False+True+True+False+False+False+False+False+True+False+False+True+False+False+True+[MkPair False 2,MkPair False 3,MkPair False 4,MkPair False 5,MkPair True 2,MkPair True 3,MkPair True 4,MkPair True 5]+5+True+Leaf 1 :^: Leaf 2+Leaf 1 :^: Leaf 2+Nothing+1 `Cons` (2 `Cons` Nil)+1 `Cons` (2 `Cons` Nil)+Nothing+Nothing+(:::) ()+(:::) ()+Nothing+(Rec Bool,X)
− tests/EmptyCase.hs
@@ -1,12 +0,0 @@-module EmptyCase where--data Void--absurd1 :: Void -> a-absurd1 x = case x of {}--absurd2 :: Void -> a-absurd2 = \case {}--main :: IO ()-main = pure ()
+ tests/EmptyData.hs view
@@ -0,0 +1,16 @@+module EmptyData where++data Void++absurd1 :: Void -> a+absurd1 x = case x of {}++absurd2 :: Void -> a+absurd2 = \case {}++data Empty deriving (Eq, Ord, Read, Show)++main :: IO ()+main = do+    print $ (undefined :: Empty) == (undefined :: Empty)+    print $ compare (undefined :: Empty) (undefined :: Empty)
+ tests/EmptyData.ref view
@@ -0,0 +1,2 @@+True+EQ
tests/Exists.hs view
@@ -35,6 +35,15 @@ unD :: D -> String unD (D x) = show (x+1) +scp :: Show a => a -> String+scp a =+  let t = C a+      tt = case t of+             C (x :: a) -> C ([] :: [a])+             --C x -> C ([] `asTypeOf` [x])+  in  case tt of+        C y -> show y+ main :: IO () main = do   print es@@ -46,3 +55,5 @@   putStrLn (sh (T 'x'))   putStrLn (unD (D (1::Int)))   putStrLn (unD (D 1.5))+  putStrLn (scp 'a')+  
tests/Exists.ref view
@@ -6,3 +6,4 @@ 'x' 2 2.5+""
tests/FArith.hs view
@@ -1,19 +1,20 @@ module FArith(module FArith) where -readDouble :: String -> Double-readDouble = read+readFloat :: String -> Float+readFloat = read --- Be careful about what constants we use here, so it works with both 32 and 64 bit floats.+-- Be careful about what constants we use here, so it works with 32 bit floats. -- We only use values that can be represented exactly. -list1 :: [Double]-list1 = [-100.5::Double, -53.25::Double, 0.0::Double, 1.0::Double, 1.125::Double, 1.0e3::Double]+list1 :: [Float]+list1 = [-100.5::Float, -53.25::Float, 0.0::Float, 1.0::Float, 1.125::Float, 1.0e3::Float]  main :: IO () main = do   print [ op x y | x <- list1, y <- list1, op <- [(+), (-), (*)] ]   print [ op x y | x <- list1, y <- list1, op <- [(==), (/=), (<), (<=), (>), (>=)] ]-  print [ x / y  | x <- list1, y <- [1.0::Double, -16.0::Double, 0.0625::Double]]-  print $ readDouble "1.625"-  print $ 1.0 + readDouble "2.5"-  print $ map readDouble ["1.5e4", "12500.0e-4"]+  print [ x / y  | x <- list1, y <- [1.0::Float, -16.0::Float, 0.0625::Float]]+  print $ readFloat "1.625"+  print $ 1.0 + readFloat "2.5"+  print $ map readFloat ["1.5e4", "12500.0e-4"]+  print (fromInteger 1000000000000000 :: Float)
tests/FArith.ref view
@@ -1,6 +1,7 @@ [-201.0,0.0,10100.25,-153.75,-47.25,5351.625,-100.5,-100.5,-0.0,-99.5,-101.5,-100.5,-99.375,-101.625,-113.0625,899.5,-1100.5,-100500.0,-153.75,47.25,5351.625,-106.5,0.0,2835.5625,-53.25,-53.25,-0.0,-52.25,-54.25,-53.25,-52.125,-54.375,-59.90625,946.75,-1053.25,-53250.0,-100.5,100.5,-0.0,-53.25,53.25,-0.0,0.0,0.0,0.0,1.0,-1.0,0.0,1.125,-1.125,0.0,1000.0,-1000.0,0.0,-99.5,101.5,-100.5,-52.25,54.25,-53.25,1.0,1.0,0.0,2.0,0.0,1.0,2.125,-0.125,1.125,1001.0,-999.0,1000.0,-99.375,101.625,-113.0625,-52.125,54.375,-59.90625,1.125,1.125,0.0,2.125,0.125,1.125,2.25,0.0,1.265625,1001.125,-998.875,1125.0,899.5,1100.5,-100500.0,946.75,1053.25,-53250.0,1000.0,1000.0,0.0,1001.0,999.0,1000.0,1001.125,998.875,1125.0,2000.0,0.0,1000000.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,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,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,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,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,True,False,False,True,False,True]-[-100.5,6.28125,-1608.0,-53.25,3.328125,-852.0,0.0,-0.0,0.0,1.0,-0.0625,16.0,1.125,-0.0703125,18.0,1000.0,-62.5,16000.0]+[-100.5,6.28125,-1608.0,-53.25,3.328125,-852.0,0.0,-0.0,0.0,1.0,-6.25e-2,16.0,1.125,-7.03125e-2,18.0,1000.0,-62.5,16000.0] 1.625 3.5 [15000.0,1.25]+1.0e15
+ tests/Fix.hs view
@@ -0,0 +1,20 @@+module Fix where+import System.IO++main :: IO ()+main = do+  r <- fmap (take 10) . fixIO $+        \ fibs -> putStrLn "computing fibs" >> return (1 : 1 : zipWith (+) fibs (tail fibs))+  print r++  rec { a <- return (b+1)+      ; b <- return 2 }+  print (a, b)++  x <- mdo+         a <- return (b+1)+         b <- return (c+1)+         let c = d+1+         d <- return 42+         return (a+b)+  print x
+ tests/Fix.ref view
@@ -0,0 +1,4 @@+computing fibs+[1,1,2,3,5,8,13,21,34,55]+(3,2)+89
tests/Floating.hs view
@@ -2,6 +2,10 @@  main :: IO () main = do-  print $ logBase 10 (1000::Double)+  print $ logBase 10 (10000::Double)   print $ cos (pi::Double)   print $ sqrt (4::Double)++  print $ logBase 10 (10000::Float)+  print $ cos (pi::Float)+  print $ sqrt (4::Float)
tests/Floating.ref view
@@ -1,3 +1,6 @@-3.0+4.0+-1.0+2.0+4.0 -1.0 2.0
+ tests/ForExp.hs view
@@ -0,0 +1,9 @@+module ForExp where++foreign export ccall funcName :: Int -> IO Int+foreign export ccall "other" (*) :: Int -> Int -> Int++funcName :: Int -> IO Int+funcName x = do+  putStrLn "funcName called"+  pure (x + 1)
+ tests/ForExp.ref view
@@ -0,0 +1,3 @@+funcName called+6+42
+ tests/ForImpJS.hs view
@@ -0,0 +1,20 @@+module ForImpJS where+import Data.Text hiding(show)+import Foreign.C.String(CString)++foreign import javascript "console.log('log: ' + UTF8ToString($0))" clog :: CString -> IO ()+foreign import javascript "return stringToNewUTF8('PRE' + UTF8ToString($0))" pre :: CString -> IO CString+foreign import javascript "return $0 + $1"                           add :: Int -> Int -> Int+foreign import javascript "return $0 * $1"                           mul :: Double -> Double -> Double++hlog :: Text -> IO ()+hlog t = useAsCString t clog++main :: IO ()+main = do+  hlog "JS log"+  hlog "JS log again"+  hlog $ pack $ show $ add 3 4+  hlog $ pack $ show $ mul 3 4+  s <- useAsCString "-test" $ \ p -> pre p >>= grabCString+  putStrLn (unpack s)
+ tests/ForImpJS.ref view
@@ -0,0 +1,5 @@+log: JS log+log: JS log again+log: 7+log: 12.0+PRE-test
tests/ForeignC.hs view
@@ -3,13 +3,18 @@ import Foreign.Ptr import Foreign.Storable -foreign import ccall "sys/errno.h &errno" cerrno :: IO (Ptr CInt)+foreign import ccall "errno.h &errno" cerrno :: IO (Ptr CInt) foreign import ccall "unistd.h getpid" getpid :: IO CInt+foreign import capi  "value 3+4" seven :: CInt+foreign import ccall labs :: CLong -> CLong  main :: IO () main = do+  let CLong r = labs (-33)+  print r   CInt pid <- getpid   print (pid /= 0)   p <- cerrno   CInt e <- peek p   print e+  print (let CInt x = seven in x)
tests/ForeignC.ref view
@@ -1,2 +1,4 @@-5-2+33+True+0+7
tests/ForeignPtr.hs view
@@ -1,11 +1,9 @@ module ForeignPtr(main) where+import System.Mem import Foreign.Ptr import Foreign.ForeignPtr import Foreign.Storable -gc :: IO ()-gc = _primitive "IO.gc"- add :: Ptr a -> Int -> Ptr a add = plusPtr @@ -19,11 +17,11 @@     poke p (42::Int)     poke (add p sInt) (88::Int)   withForeignPtr fp $ \ p -> do-    gc+    performGC     peek p >>= print     peek (add p sInt) >>= print   let fp1 :: ForeignPtr Int       fp1 = plusForeignPtr fp sInt   withForeignPtr fp1 $ \ p -> do     peek p >>= print-  gc+  performGC
tests/FunDep.hs view
@@ -1,5 +1,6 @@ module FunDep(main) where import Data.Char+import Data.Functor.Const  class C a b | a -> b where   f :: a -> b@@ -35,6 +36,32 @@ instance C a b => C (T a) b where   f (T a) = f a +------++type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t+type Traversal s t a b = forall f. Applicative f => (a -> f b) -> s -> f t+type Traversal' s a = Traversal s s a a+type Getting r s a = (a -> Const r a) -> s -> Const r s++class Cons s t a b | s -> a, t -> b, s b -> t, t a -> s where+  _Cons :: Traversal s t (a,s) (b,t)++instance Cons [a] [b] a b where+  _Cons f (a:as) = uncurry (:) <$> f (a, as)+  _Cons _ []     = pure []++class Field2 s t a b | s -> a, t -> b, s b -> t, t a -> s where+  _2 :: Lens s t a b++instance Field2 (a,b) (a,b') b b' where+  _2 k ~(a,b) = (\b' -> (a,b')) <$> k b++_tail :: Cons s s a a => Traversal' s s+_tail = _Cons._2++(^.) :: s -> Getting a s a -> a+s ^. l = getConst (l Const s)+ {- class D a where   d :: a -> Int@@ -52,6 +79,12 @@ instance E Int -} +class C3 aa bb cc | aa -> bb, bb -> cc where+  c3 :: aa -> bb -> cc++instance C3 Int Int Int where+  c3 = (+)+ main :: IO () main = do   print $ f 'a' + 1@@ -62,4 +95,6 @@   print $ isoL 'a'   print $ isoR (100::Int)   print $ f (T 'b')+  print $ ("abcd"::String)^._tail._tail --  print $ d (f (e (0::Int)))+  print $ c3 (1::Int) 2
tests/FunDep.ref view
@@ -6,3 +6,5 @@ 97 'd' 98+"cd"+3
tests/IOArray.hs view
@@ -1,5 +1,5 @@ module IOArray(main) where-import Data.IOArray+import Mhs.MutArr import Data.IORef import System.IO import System.IO.Serialize@@ -7,19 +7,22 @@  main :: IO () main = do-  a <- newIOArray 10 0-  s <- sizeIOArray a+  a <- newMutIOArr 10 0+  s <- sizeMutIOArr a   print s-  mapM_ (\ i -> writeIOArray a i (i*i)) [0..9]-  xs <- mapM (readIOArray a) [0..9]+  mapM_ (\ i -> unsafeWriteMutIOArr a i (i*i)) [0..9]+  xs <- mapM (unsafeReadMutIOArr a) [0..9]   print xs   o <- openFile "arr.tmp" WriteMode   hSerialize o a   hClose o   i <- openFile "arr.tmp" ReadMode   a' <- hDeserialize i-  xs' <- mapM (readIOArray a') [0..9]+  xs' <- mapM (unsafeReadMutIOArr a') [0..9]   print $ xs == xs'+  shrinkMutIOArr a 5+  s <- sizeMutIOArr a+  print s    r <- newIORef "foo"   s1 <- readIORef r
tests/IOArray.ref view
@@ -1,5 +1,6 @@ 10 [0,1,4,9,16,25,36,49,64,81] True+5 "foo" "bar"
tests/ImpMet.hs view
@@ -1,5 +1,9 @@ module ImpMet where-import Prelude(pure, IO, {-(),-} putStrLn)+import Prelude(IO, putStrLn)++-- check that these symbols are available without import+ls :: [] ()+ls = () : []  main :: IO () main = putStrLn "ok"
tests/Info.hs view
@@ -4,9 +4,17 @@ import Foreign.Ptr import Data.Word +foreign import capi "want_gmp" want_gmp :: Int++thisOS :: String+thisOS | _isWindows = "Windows"+       | _isMacOS   = "MacOS"+       | _isLinux   = "Linux"+       | otherwise  = "Unknown OS"+ main :: IO () main = do-  putStrLn $ "Running on " ++ if _isWindows then "Windows" else "Unix"+  putStrLn $ "Running on " ++ thisOS   putStr $ show _wordSize ++ " bit words, "    let@@ -19,3 +27,5 @@       1 -> "big endian"       2 -> "little endian"       _ -> "Mystery Endian"++  putStrLn $ "GMP: " ++ if want_gmp /= 0 then "yes" else "no"
tests/Integer.hs view
@@ -1,4 +1,8 @@ module Integer(main) where++import Data.Bits+import Data.Int+import Data.Word import System.IO.Serialize import System.IO.StringHandle @@ -13,3 +17,69 @@   h <- stringToHandle s   i' <- hDeserialize h   print $ i == i'++  -- Integer conversion+  let+    iMinI64 = -9223372036854775808+    iMinI32 = -2147483648+    iNegOne = -1+    iZero = 0+    iOne = 1+    iMaxI32 = 2147483647+    iMaxU32 = 4294967295+    iMaxI64 = 9223372036854775807+    iMaxU64 = 18446744073709551615+  putStrLn "fromInteger"+  print $ (fromInteger iMinI64 :: Int64) == (minBound :: Int64)+  print $ (fromInteger iMinI64 :: Int32) == 0+  print $ (fromInteger iMinI64 :: Word64) == 1 `shiftL` 63+  print $ (fromInteger iMinI64 :: Word32) == 0+  print $ (fromInteger iMinI32 :: Int64) == complement ((1 `shiftL` 31) - 1)+  print $ (fromInteger iMinI32 :: Int32) == (minBound :: Int32)+  print $ (fromInteger iMinI32 :: Word64) == complement ((1 `shiftL` 31) - 1)+  print $ (fromInteger iMinI32 :: Word32) == 1 `shiftL` 31+  print $ (fromInteger iNegOne :: Int64) == -1+  print $ (fromInteger iNegOne :: Int32) == -1+  print $ (fromInteger iNegOne :: Word64) == (maxBound :: Word64)+  print $ (fromInteger iNegOne :: Word32) == (maxBound :: Word32)+  print $ (fromInteger iZero :: Int64) == 0+  print $ (fromInteger iZero :: Int32) == 0+  print $ (fromInteger iZero :: Word64) == 0+  print $ (fromInteger iZero :: Word32) == 0+  print $ (fromInteger iOne :: Int64) == 1+  print $ (fromInteger iOne :: Int32) == 1+  print $ (fromInteger iOne :: Word64) == 1+  print $ (fromInteger iOne :: Word32) == 1+  print $ (fromInteger iMaxI32 :: Int64) == (1 `shiftL` 31) - 1+  print $ (fromInteger iMaxI32 :: Int32) == (maxBound :: Int32)+  print $ (fromInteger iMaxI32 :: Word64) == (1 `shiftL` 31) - 1+  print $ (fromInteger iMaxI32 :: Word32) == (1 `shiftL` 31) - 1+  print $ (fromInteger iMaxU32 :: Int64) == (1 `shiftL` 32) - 1+  print $ (fromInteger iMaxU32 :: Int32) == -1+  print $ (fromInteger iMaxU32 :: Word64) == (1 `shiftL` 32) - 1+  print $ (fromInteger iMaxU32 :: Word32) == (maxBound :: Word32)+  print $ (fromInteger iMaxI64 :: Int64) == (maxBound :: Int64)+  print $ (fromInteger iMaxI64 :: Int32) == -1+  print $ (fromInteger iMaxI64 :: Word64) == (1 `shiftL` 63) - 1+  print $ (fromInteger iMaxI64 :: Word32) == (maxBound :: Word32)+  print $ (fromInteger iMaxU64 :: Int64) == -1+  print $ (fromInteger iMaxU64 :: Int32) == -1+  print $ (fromInteger iMaxU64 :: Word64) == (maxBound :: Word64)+  print $ (fromInteger iMaxU64 :: Word32) == (maxBound :: Word32)+  putStrLn "toInteger"+  print $ toInteger (minBound :: Int64) == iMinI64+  print $ toInteger (minBound :: Int32) == iMinI32+  print $ toInteger (-1 :: Int) == iNegOne+  print $ toInteger (-1 :: Int64) == iNegOne+  print $ toInteger (0 :: Int) == iZero+  print $ toInteger (0 :: Int64) == iZero+  print $ toInteger (0 :: Word) == iZero+  print $ toInteger (0 :: Word64) == iZero+  print $ toInteger (1 :: Int) == iOne+  print $ toInteger (1 :: Int64) == iOne+  print $ toInteger (1 :: Word) == iOne+  print $ toInteger (1 :: Word64) == iOne+  print $ toInteger (maxBound :: Int64) == iMaxI64+  print $ toInteger (maxBound :: Int32) == iMaxI32+  print $ toInteger (maxBound :: Word64) == iMaxU64+  print $ toInteger (maxBound :: Word32) == iMaxU32
tests/Integer.ref view
@@ -3,3 +3,57 @@ True 1234567890123456789012345678901234567890 True+fromInteger+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+toInteger+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True
tests/LocalPoly.hs view
@@ -3,9 +3,15 @@ main :: IO () main = do   print $ f 1 ("a"::String)+  print $ g 1 ("a"::String)  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)++g :: forall b . Int -> b -> ((Int, b), (b, b))+g x b = (i x, i b)+  where     i a = (a, b)
tests/LocalPoly.ref view
@@ -1,1 +1,2 @@ ((1,"a"),("a","a"))+((1,"a"),("a","a"))
+ tests/Logarithms.hs view
@@ -0,0 +1,25 @@+module Logarithms where++import Data.Foldable (for_)+import Math.NumberTheory.Logarithms++main :: IO ()+main = do+    -- integerLogBase+    for_ [2, 3, 4, 5, 10, 20, 40] $ \b -> do+        for_ [1..42] $ \k -> do+            print $ integerLogBase b (b ^ k - 1)+            print $ integerLogBase b (b ^ k)+            print $ integerLogBase b (b ^ k + 1)++    -- integerLog2+    for_ [1..42] $ \k -> do+        print $ integerLog2 (2 ^ k - 1)+        print $ integerLog2 (2 ^ k)+        print $ integerLog2 (2 ^ k + 1)++    -- integerLog10+    for_ [1..42] $ \k -> do+        print $ integerLog10 (10 ^ k - 1)+        print $ integerLog10 (10 ^ k)+        print $ integerLog10 (10 ^ k + 1)
+ tests/Logarithms.ref view
@@ -0,0 +1,1134 @@+0+1+1+1+2+2+2+3+3+3+4+4+4+5+5+5+6+6+6+7+7+7+8+8+8+9+9+9+10+10+10+11+11+11+12+12+12+13+13+13+14+14+14+15+15+15+16+16+16+17+17+17+18+18+18+19+19+19+20+20+20+21+21+21+22+22+22+23+23+23+24+24+24+25+25+25+26+26+26+27+27+27+28+28+28+29+29+29+30+30+30+31+31+31+32+32+32+33+33+33+34+34+34+35+35+35+36+36+36+37+37+37+38+38+38+39+39+39+40+40+40+41+41+41+42+42+0+1+1+1+2+2+2+3+3+3+4+4+4+5+5+5+6+6+6+7+7+7+8+8+8+9+9+9+10+10+10+11+11+11+12+12+12+13+13+13+14+14+14+15+15+15+16+16+16+17+17+17+18+18+18+19+19+19+20+20+20+21+21+21+22+22+22+23+23+23+24+24+24+25+25+25+26+26+26+27+27+27+28+28+28+29+29+29+30+30+30+31+31+31+32+32+32+33+33+33+34+34+34+35+35+35+36+36+36+37+37+37+38+38+38+39+39+39+40+40+40+41+41+41+42+42+0+1+1+1+2+2+2+3+3+3+4+4+4+5+5+5+6+6+6+7+7+7+8+8+8+9+9+9+10+10+10+11+11+11+12+12+12+13+13+13+14+14+14+15+15+15+16+16+16+17+17+17+18+18+18+19+19+19+20+20+20+21+21+21+22+22+22+23+23+23+24+24+24+25+25+25+26+26+26+27+27+27+28+28+28+29+29+29+30+30+30+31+31+31+32+32+32+33+33+33+34+34+34+35+35+35+36+36+36+37+37+37+38+38+38+39+39+39+40+40+40+41+41+41+42+42+0+1+1+1+2+2+2+3+3+3+4+4+4+5+5+5+6+6+6+7+7+7+8+8+8+9+9+9+10+10+10+11+11+11+12+12+12+13+13+13+14+14+14+15+15+15+16+16+16+17+17+17+18+18+18+19+19+19+20+20+20+21+21+21+22+22+22+23+23+23+24+24+24+25+25+25+26+26+26+27+27+27+28+28+28+29+29+29+30+30+30+31+31+31+32+32+32+33+33+33+34+34+34+35+35+35+36+36+36+37+37+37+38+38+38+39+39+39+40+40+40+41+41+41+42+42+0+1+1+1+2+2+2+3+3+3+4+4+4+5+5+5+6+6+6+7+7+7+8+8+8+9+9+9+10+10+10+11+11+11+12+12+12+13+13+13+14+14+14+15+15+15+16+16+16+17+17+17+18+18+18+19+19+19+20+20+20+21+21+21+22+22+22+23+23+23+24+24+24+25+25+25+26+26+26+27+27+27+28+28+28+29+29+29+30+30+30+31+31+31+32+32+32+33+33+33+34+34+34+35+35+35+36+36+36+37+37+37+38+38+38+39+39+39+40+40+40+41+41+41+42+42+0+1+1+1+2+2+2+3+3+3+4+4+4+5+5+5+6+6+6+7+7+7+8+8+8+9+9+9+10+10+10+11+11+11+12+12+12+13+13+13+14+14+14+15+15+15+16+16+16+17+17+17+18+18+18+19+19+19+20+20+20+21+21+21+22+22+22+23+23+23+24+24+24+25+25+25+26+26+26+27+27+27+28+28+28+29+29+29+30+30+30+31+31+31+32+32+32+33+33+33+34+34+34+35+35+35+36+36+36+37+37+37+38+38+38+39+39+39+40+40+40+41+41+41+42+42+0+1+1+1+2+2+2+3+3+3+4+4+4+5+5+5+6+6+6+7+7+7+8+8+8+9+9+9+10+10+10+11+11+11+12+12+12+13+13+13+14+14+14+15+15+15+16+16+16+17+17+17+18+18+18+19+19+19+20+20+20+21+21+21+22+22+22+23+23+23+24+24+24+25+25+25+26+26+26+27+27+27+28+28+28+29+29+29+30+30+30+31+31+31+32+32+32+33+33+33+34+34+34+35+35+35+36+36+36+37+37+37+38+38+38+39+39+39+40+40+40+41+41+41+42+42+0+1+1+1+2+2+2+3+3+3+4+4+4+5+5+5+6+6+6+7+7+7+8+8+8+9+9+9+10+10+10+11+11+11+12+12+12+13+13+13+14+14+14+15+15+15+16+16+16+17+17+17+18+18+18+19+19+19+20+20+20+21+21+21+22+22+22+23+23+23+24+24+24+25+25+25+26+26+26+27+27+27+28+28+28+29+29+29+30+30+30+31+31+31+32+32+32+33+33+33+34+34+34+35+35+35+36+36+36+37+37+37+38+38+38+39+39+39+40+40+40+41+41+41+42+42+0+1+1+1+2+2+2+3+3+3+4+4+4+5+5+5+6+6+6+7+7+7+8+8+8+9+9+9+10+10+10+11+11+11+12+12+12+13+13+13+14+14+14+15+15+15+16+16+16+17+17+17+18+18+18+19+19+19+20+20+20+21+21+21+22+22+22+23+23+23+24+24+24+25+25+25+26+26+26+27+27+27+28+28+28+29+29+29+30+30+30+31+31+31+32+32+32+33+33+33+34+34+34+35+35+35+36+36+36+37+37+37+38+38+38+39+39+39+40+40+40+41+41+41+42+42
tests/Makefile view
@@ -1,9 +1,11 @@+MHSTARGET=+MHSOUTPUT= MHS=../bin/gmhs-TMHS=$(MHS) -i../lib+TMHS=$(MHS) $(MHSTARGET) $(MHSOUTPUT) -i../lib EVAL=../bin/mhseval +RTS -H1M -RTS .PHONY: test nfib clean errtest alltest cache info -alltest:	info test errtest+alltest:	info test errtest testforimp testforexp testforimpexp testapplysp # interactivetest  cache:@@ -23,6 +25,7 @@ 	$(TMHS) Misc       && $(EVAL) > Misc.out       && diff Misc.ref Misc.out 	$(TMHS) Case       && $(EVAL) > Case.out       && diff Case.ref Case.out 	$(TMHS) Arith      && $(EVAL) > Arith.out      && diff Arith.ref Arith.out+	$(TMHS) Arith64    && $(EVAL) > Arith64.out    && diff Arith64.ref Arith64.out 	$(TMHS) Guard      && $(EVAL) > Guard.out      && diff Guard.ref Guard.out 	$(TMHS) Newtype    && $(EVAL) > Newtype.out    && diff Newtype.ref Newtype.out 	$(TMHS) LitMatch   && $(EVAL) > LitMatch.out   && diff LitMatch.ref LitMatch.out@@ -33,7 +36,9 @@ 	$(TMHS) LocalPoly  && $(EVAL) > LocalPoly.out  && diff LocalPoly.ref LocalPoly.out 	$(TMHS) Rank2      && $(EVAL) > Rank2.out      && diff Rank2.ref Rank2.out 	$(TMHS) Catch      && $(EVAL) > Catch.out      && diff Catch.ref Catch.out+	$(TMHS) DArith     && $(EVAL) > DArith.out     && diff DArith.ref DArith.out 	$(TMHS) FArith     && $(EVAL) > FArith.out     && diff FArith.ref FArith.out+	$(TMHS) RealFloat  && $(EVAL) > RealFloat.out  && diff RealFloat.ref RealFloat.out 	$(TMHS) Infix      && $(EVAL) > Infix.out      && diff Infix.ref Infix.out 	$(TMHS) Class      && $(EVAL) > Class.out      && diff Class.ref Class.out 	$(TMHS) Eq         && $(EVAL) > Eq.out         && diff Eq.ref Eq.out@@ -69,6 +74,7 @@ 	$(TMHS) DfltSig    && $(EVAL) > DfltSig.out    && diff DfltSig.ref DfltSig.out 	$(TMHS) Bytestring && $(EVAL) > Bytestring.out && diff Bytestring.ref Bytestring.out 	$(TMHS) Text       && $(EVAL) > Text.out       && diff Text.ref Text.out+	$(TMHS) ByteStringLow && $(EVAL) > ByteStringLow.out && diff ByteStringLow.ref ByteStringLow.out 	$(TMHS) ImpMet     && $(EVAL) > ImpMet.out     && diff ImpMet.ref ImpMet.out 	$(TMHS) MultiIf    && $(EVAL) > MultiIf.out    && diff MultiIf.ref MultiIf.out 	$(TMHS) LameCase   && $(EVAL) > LameCase.out   && diff LameCase.ref LameCase.out@@ -80,7 +86,6 @@ 	$(TMHS) PatSyn     && $(EVAL) > PatSyn.out     && diff PatSyn.ref PatSyn.out 	$(TMHS) Coerce     && $(EVAL) > Coerce.out     && diff Coerce.ref Coerce.out 	$(TMHS) PatBind    && $(EVAL) > PatBind.out    && diff PatBind.ref PatBind.out-	$(TMHS) EmptyCase  && $(EVAL) 	$(TMHS) NumUnder   && $(EVAL) > NumUnder.out   && diff NumUnder.ref NumUnder.out 	$(TMHS) LocalFix   && $(EVAL) > LocalFix.out   && diff LocalFix.ref LocalFix.out 	$(TMHS) TypeApp    && $(EVAL) > TypeApp.out    && diff TypeApp.ref TypeApp.out@@ -106,11 +111,29 @@ 	$(TMHS) Throw      && $(EVAL) > Throw.out      && diff Throw.ref Throw.out 	$(TMHS) RtsExn     && $(EVAL) > RtsExn.out     && diff RtsExn.ref RtsExn.out 	$(TMHS) Mask       && $(EVAL) > Mask.out       && diff Mask.ref Mask.out+	$(TMHS) EmptyData  && $(EVAL) > EmptyData.out  && diff EmptyData.ref EmptyData.out+	$(TMHS) QualDo     && $(EVAL) > QualDo.out     && diff QualDo.ref QualDo.out+	$(TMHS) Weak       && $(EVAL) > Weak.out       && diff Weak.ref Weak.out+	$(TMHS) Fix        && $(EVAL) > Fix.out        && diff Fix.ref Fix.out+	$(TMHS) Pat        && $(EVAL) > Pat.out        && diff Pat.ref Pat.out+	$(TMHS) Logarithms && $(EVAL) > Logarithms.out && diff Logarithms.ref Logarithms.out+	$(TMHS) Builder    && $(EVAL) > Builder.out    && diff Builder.ref Builder.out -# BROKEN: cannot compile binaries here-testforeign:-	MHSDIR=.. $(TMHS) ForeignC -of.exe && ./f.exe > ForeignC.out  && diff ForeignC.ref ForeignC.out+testforimp:+	MHSDIR=.. $(TMHS) ForeignC -of.exe && ./f.exe > ForeignC.out && diff ForeignC.ref ForeignC.out +testforimpjs:+	MHSDIR=.. $(TMHS) -temscripten ForImpJS -of.js && node f.js > ForImpJS.out && diff ForImpJS.ref ForImpJS.out++testforexp:+	MHSDIR=.. $(TMHS) -c -optc --shared -optc -fPIC ForExp -oForExpHs.so && $(CC) -lm ForExp.c ForExpHs.so -Wl,-rpath,'$$ORIGIN' -o ForExp.exe && ./ForExp.exe > ForExp.out && diff ForExp.ref ForExp.out++testforimpexp:+	MHSDIR=.. $(TMHS) -optc -I. Callback hsimp.c -oCallback.exe && ./Callback.exe > Callback.out && diff Callback.ref Callback.out++testapplysp:+	MHSDIR=.. $(TMHS) -optc -I. ApplySP hsasp.c -oApplySP.exe && ./ApplySP.exe > ApplySP.out && diff ApplySP.ref ApplySP.out+ errtest: 	sh errtester.sh $(MHS) < errmsg.test @@ -121,4 +144,4 @@ 	$(TMHS) Nfib && $(EVAL)  clean:-	rm -f *.out *.tmp *.js *.exe+	rm -f *.out *.tmp *.js *.exe *.so a.out *_stub.h
tests/Nfib.hs view
@@ -1,4 +1,5 @@ module Nfib(main, nfib) where+import System.Mem import System.IO.TimeMilli(getTimeMilli)  nfib :: Int -> Int@@ -7,13 +8,21 @@     False -> nfib (n - 1) + nfib (n - 2) + 1     True  -> 1 -main :: IO ()-main = do+timeNFib :: Int -> IO ()+timeNFib n = do   t1 <- getTimeMilli-  let r = nfib 37+  let r = nfib n   print r   t2 <- getTimeMilli   putStrLn $ "nfib/s = " ++ show (r `quot` (t2 - t1)) ++ "k"++main :: IO ()+main = do+  putStrLn "Before GC reductions"+  timeNFib 35+  performGCWithReduction+  putStrLn "After GC reductions"+  timeNFib 35  -- Typical nfib/s is 10M -- mhs
tests/NumUnder.ref view
@@ -1,7 +1,7 @@ 1000000 1000000-0.0625-0.0625+6.25e-2+6.25e-2 300.0 300.0 40.0
+ tests/Pat.hs view
@@ -0,0 +1,9 @@+module Pat where++import qualified Data.List++myHead :: [a] -> a+myHead (x Data.List.: _) = x++main :: IO ()+main = print $ myHead [1, 2, 3]
+ tests/Pat.ref view
@@ -0,0 +1,1 @@+1
+ tests/QualDo.hs view
@@ -0,0 +1,26 @@+module QualDo where++import QualDoModule as Result++res1 :: Result Int String+res1 = Result.do+    a <- Ok 3+    b <- Ok 5+    Ok (a + b)++res2 :: Result Int String+res2 = Result.do+    12 <- Ok 42+    Ok 0++res3 :: Result Int String+res3 = Result.do+    Ok 1+    Err "2"+    Ok 3++main :: IO ()+main = do+    print res1+    print res2+    print res3
+ tests/QualDo.ref view
@@ -0,0 +1,3 @@+Ok 8+Err "bind"+Err "2"
+ tests/QualDoModule.hs view
@@ -0,0 +1,14 @@+module QualDoModule where++data Result a e = Ok a | Err e deriving (Show)++(>>) :: Result a e -> Result b e -> Result b e+Ok _ >> r = r+Err e >> _ = Err e++(>>=) :: Result a e -> (a -> Result b e) -> Result b e+Ok a >>= f = f a+Err e >>= _ = Err e++fail :: String -> Result a String+fail msg = Err msg
tests/Read.hs view
@@ -1,5 +1,6 @@ module Read(main) where import Text.Read+import Data.Int  main :: IO () main = do@@ -13,12 +14,8 @@   print (read "0b01111011" :: Int)   print (read "2147483647" :: Int)   print (read "-2147483648" :: Int)-  if _wordSize == 64 then do-    print (read "9223372036854775807" :: Int)-    print (read "-9223372036854775808" :: Int)-   else do-    putStrLn "9223372036854775807"-    putStrLn "-9223372036854775808"+  print (read "9223372036854775807" :: Int64)+  print (read "-9223372036854775808" :: Int64)   print (read "123"   :: Integer)   print (read " 123"  :: Integer)   print (read "123 "  :: Integer)
+ tests/RealFloat.hs view
@@ -0,0 +1,23 @@+module RealFloat where++printInfo :: forall a . (RealFloat a, Show a) => a -> IO ()+printInfo x = do+  print (floatRadix x, floatDigits x, floatRange x)+  print (decodeFloat x)+  print (encodeFloat 10 (-2))+  print (exponent x)+  print (significand x)+  print (scaleFloat 4 x)+  print (isNaN x, isNaN (0 / (0 :: a)))+  print (isInfinite x, isInfinite (x / 0))+  print (isDenormalized x)+  print (isNegativeZero x, isNegativeZero (-0 :: a))+  print (isIEEE x)++main :: IO ()+main = do+  printInfo (1.25 :: Double)+  printInfo (1.25 :: Float)+  print (map realToFrac [1.5 :: Double, 1/0, (-1)/0, -0, 0/0] :: [Float])+  print (map realToFrac [1.5 :: Float,  1/0, (-1)/0, -0, 0/0] :: [Double])+  
+ tests/RealFloat.ref view
@@ -0,0 +1,24 @@+(2,53,(-1021,1024))+(5629499534213120,-52)+2.5+1+0.625+20.0+(False,True)+(False,True)+False+(False,True)+True+(2,24,(-125,128))+(10485760,-23)+2.5+1+0.625+20.0+(False,True)+(False,True)+False+(False,True)+True+[1.5,Infinity,-Infinity,-0.0,NaN]+[1.5,Infinity,-Infinity,-0.0,NaN]
tests/Record.hs view
@@ -62,6 +62,9 @@ sel_ra CRR{r.a} = a -} +updA :: R -> Int -> R+updA CR{a=_,..} a = CR{..}+ data S a = S1 { x :: Int } | S2 { x :: Int, y :: a }  instance forall a . Show a => Show (S a) where@@ -74,6 +77,17 @@ s2 :: S String s2 = S2 { x = 20, y = "foo" } +data R3 = forall a . Show a => R3 { x3 :: a, y3 :: Int }+  deriving Show++data R4 = R4 { x4 :: forall a . a -> a -> a, y4 :: Int }++xr3 :: R3+xr3 = R3 () 10++xr4 :: R4+xr4 = R4 const 11+ main :: IO () main = do   print r1@@ -108,3 +122,9 @@   print s2.x   print (x s1)   print (x s2)+  print (updA r1 100)+  print xr3+  print (x4 xr4 'a' 'b')+  print xr3{ x3 = True }+  let xr4' = xr4{ x4 = \ _ x -> x }+  print (x4 xr4' 'a' 'b')
tests/Record.ref view
@@ -28,3 +28,8 @@ 20 10 20+CR{a=100,b=True}+R3 {x3 = (), y3 = 10}+'a'+R3 {x3 = True, y3 = 10}+'b'
tests/RtsExn.ref view
@@ -1,1 +1,1 @@-Left DivideByZero+Left divide by zero
+ tests/Stable.hs view
@@ -0,0 +1,13 @@+module Stable where+import Foreign.StablePtr++main :: IO ()+main = do+  sp1 <- newStablePtr (2 + 3)+  print sp1+  sp2 <- newStablePtr (4 + 3)+  print sp2+  deRefStablePtr sp2 >>= print+  deRefStablePtr sp1 >>= print+  freeStablePtr sp1+  newStablePtr 0 >>= print
+ tests/Stable.ref view
@@ -0,0 +1,5 @@+StablePtr#1+StablePtr#2+7+5+StablePtr#1
tests/ThrSt.ref view
@@ -1,1 +1,2 @@-[ThreadFinished,ThreadDied,ThreadBlocked BlockedOnMVar,ThreadBlocked BlockedOnOther,ThreadRunning]+Uncaught child exception: error: "./ThrSt.hs",9:8: boo+[ThreadFinished,ThreadFinished,ThreadBlocked BlockedOnMVar,ThreadBlocked BlockedOnOther,ThreadRunning]
tests/Throw.ref view
@@ -1,3 +1,3 @@ thread killed-Overflow+arithmetic overflow user interrupt
tests/TypeApp.hs view
@@ -7,10 +7,22 @@ xread :: forall a -> Read a => String -> a xread t s = read s :: t +incr :: forall a -> Num a => a -> a+incr _ x = x + 1++incu :: () -> (forall a. Num a => a -> a)+incu _ x = x + 1++inci :: forall a . Num a => a -> forall b . (Num b, Integral b) => b -> a+inci x = (+) x . fromIntegral+ main :: IO () main = do   print $ read @Int "123"   print $ xread Int "456"   let (x, y) = foo @_ @Bool   print $ typeOf y+  print (incr Int 41)+  print (incu () 41)+--  print (inci 1 41 :: Double)   return @IO ()
tests/TypeApp.ref view
@@ -1,3 +1,5 @@ 123 456 Bool+42+42
tests/Via.ref view
@@ -6,7 +6,7 @@ True True True-0x20AC+0x20ac "S \"hello\"" P (Just 10) M "ababab"
tests/View.hs view
@@ -1,10 +1,30 @@ module View(main) where -f :: Int -> Int-f ((> 10) -> True) = 1-f _ = 0+f1 :: Int -> Int+f1 ((> 10) -> True) = 1+f1 _ = 0 +f2 :: Int -> (Int, Maybe Int, Int)+f2 x@(Just -> y@(Just z)) = (x, y, z)++f3 :: Int -> Int -> Int+f3 x ((== x) -> True) = x+f3 _ _ = 0++f4 :: Int -> Int+f4 x@((==x) -> True) = x++f6 :: Int -> Int -> Int+f6 x (compare x -> LT) = -1+f6 y (compare y -> GT) = 1+f6 _ _ = 0+ main :: IO () main = do-  print (f 20)-  print (f 10)+  print (f1 20)+  print (f1 10)+  print (f2 3)+  print (f3 4 4)+  print (f3 4 5)+  print (f4 5)+  print [f6 2 3, f6 3 3, f6 4 3]
tests/View.ref view
@@ -1,2 +1,7 @@ 1 0+(3,Just 3,3)+4+0+5+[-1,0,1]
+ tests/Weak.hs view
@@ -0,0 +1,31 @@+module Weak where+import System.Mem.Weak+import System.Mem+import Data.IORef+import Control.Concurrent++main :: IO ()+main = do+  let key = "key" :: String+  let val = "val" :: String+  let final = putStrLn "run final"+  putStrLn $ "before first gc " ++ show (key, val)+  --putStr $ "test finalizer: "; final+  wk <- mkWeak key val (Just final)+  putStrLn "mkWeak done"+  performGC  -- key is alive below, so the wek pointer should survive+  mval <- deRefWeak wk+  putStrLn $ "after first gc " ++ show (key, mval)+  performGC  -- the key is not alive, so the weak pointer should be die+  mval' <- deRefWeak wk+  putStrLn $ "after second gc " ++ show mval'+  yield     -- give finalizer a chance to run+  putStrLn "after yield"++  let key2 = "key2" :: String+  let final2 = putStrLn "run final2"+  wk2 <- mkWeak key2 val (Just final2)+  putStrLn "about to finalize"+  finalize wk2+  finalize wk2+  performGC
+ tests/Weak.ref view
@@ -0,0 +1,8 @@+before first gc ("key","val")+mkWeak done+after first gc ("key",Just "val")+after second gc Nothing+run final+after yield+about to finalize+run final2
tests/Word.hs view
@@ -1,5 +1,6 @@ module Word(main) where import Data.Word+import Numeric(showHex, showBin)  vals :: [Word16] vals = [0xfff0, 0xfffe, 0xffff, 0, 1, 2, 5]@@ -7,6 +8,12 @@ maxw :: Word maxw = if _wordSize == 32 then 0x7fff::Word else 0x7fffffff::Word +hex :: Integral a => a -> String+hex x = showHex x ""++bin :: Integral a => a -> String+bin x = showBin x ""+ main :: IO () main = do   print (1000::Word)@@ -15,3 +22,10 @@   print [ op x y | x <- vals, y <- vals, y /= 0, op <- [quot, rem] ]   print [ op x y | x <- vals, y <- vals, op <- [(==),(/=),(<),(<=),(>),(>=)] ]   print [ op x y | x <- vals, y <- vals, let op = compare ]+  putStrLn $ hex $ byteSwap16 0x1234+  putStrLn $ hex $ byteSwap32 0x12345678+  putStrLn $ hex $ byteSwap64 0x123456789abcdef0+  putStrLn $ bin $ bitReverse8 0b01001000+  putStrLn $ bin $ bitReverse16 0b0100_1000_0000_0001+  putStrLn $ bin $ bitReverse32 0b0100_1000_0000_0001_0000_1111_0000_0001+  putStrLn $ bin $ bitReverse64 0b0100_1000_0000_0001_0000_1111_0000_0001_0000000000000000000000000000001
tests/Word.ref view
@@ -4,3 +4,10 @@ [1,0,0,65520,0,65520,65520,0,32760,0,13104,0,1,14,1,0,0,65534,65534,0,32767,0,13106,4,1,15,1,1,1,0,65535,0,32767,1,13107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,2,0,2,0,2,2,0,1,0,0,2,0,5,0,5,0,5,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,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,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,False,True,True,True,False,False,False,True,True,True,False,False,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] [EQ,LT,LT,GT,GT,GT,GT,GT,EQ,LT,GT,GT,GT,GT,GT,GT,EQ,GT,GT,GT,GT,LT,LT,LT,EQ,LT,LT,LT,LT,LT,LT,GT,EQ,LT,LT,LT,LT,LT,GT,GT,EQ,LT,LT,LT,LT,GT,GT,GT,EQ]+3412+78563412+f0debc9a78563412+10010+1000000000010010+10000000111100001000000000010010+1000000000000000000000000000000100000001111000010000000000100100