packages feed

MicroHs 0.15.0.0 → 0.16.0.0

raw patch · 200 files changed

+32306/−20079 lines, 200 filesdep −ghc-primdep ~base

Dependencies removed: ghc-prim

Dependency ranges changed: base

Files

LICENSE view
@@ -1,4 +1,4 @@-Copyright 2023,2024,2025 Lennart Augustsson+Copyright 2023-2026 Lennart Augustsson  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
Makefile view
@@ -20,12 +20,14 @@ # CCWARNS= -Wall CCOPTS= -O3+# CCOPTS+=  -flto             # useful, but generates harmless warning with gcc+# CCOPTS+=  -march=native     # useful on x86, but breaks on some platforms CCLIBS= -lm $(MHSGMPCCLIBS) CCSANITIZE= -fsanitize=undefined -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract CCEVAL= $(CC) $(CCWARNS) $(CCOPTS) $(MHSGMPCCFLAGS) $(RTSINC) $(MAINC) $(RTS)/eval.c # GHC= ghc-GHCINCS= -ighc -isrc -ipaths+GHCINCS= -ighc -isrc GHCWARNS= -Wall -Wno-unrecognised-warning-flags -Wno-x-partial -Wno-deprecations GHCOPTS= -O GHCEXTS= -XScopedTypeVariables -XTypeSynonymInstances -XMultiParamTypeClasses -XFlexibleInstances@@ -39,35 +41,34 @@ # Hugs HUGS= runhugs FFIHUGS= ffihugs-HUGSINCS= '+Phugs:mhs:src:paths:{Hugs}/packages/*:hugs/obj' -98 +o +w+HUGSINCS= '+Phugs:mhs:src:{Hugs}/packages/*:hugs/obj' -98 +o +w  #-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 +MHSINC=$(MHSINCNP) MAINMODULE=MicroHs.Main # .PHONY:	clean bootstrap install ghcgen newmhs newmhsz cachelib timecompile exampletest cachetest runtest runtestmhs everytest everytestmhs nfibtest info install minstall installmsg  all:	bin/mhs bin/cpphs bin/mcabal -newmhs:	ghcgen targets.conf+newmhs:	ghcgen mhs.conf 	$(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+	@rm -f generated/mhs.c 	$(MAKE) generated/mhs.c+	$(CCEVAL) generated/mhs.c $(CCLIBS) -o bin/mhs -sanitizemhs:	ghcgen targets.conf+sanitizemhs:	ghcgen mhs.conf 	$(CCEVAL) $(CCSANITIZE) generated/mhs.c $(CCLIBS) -o bin/mhssane  # Compile mhs from distribution, with C compiler-bin/mhs:	$(RTS)/*.c $(RTS)/*.h $(RTS)/*/*.h targets.conf #generated/mhs.c+bin/mhs:	$(RTS)/*.c $(RTS)/*.h $(RTS)/*/*.h mhs.conf #generated/mhs.c 	@mkdir -p bin 	$(CCEVAL) generated/mhs.c $(CCLIBS) -o bin/mhs @@ -81,6 +82,11 @@ 	@mkdir -p bin 	$(CCEVAL) generated/mcabal.c $(CCLIBS) -o bin/mcabal +# Compile cpphs from distribution, with C compiler+bin/install:	$(RTS)/*.c $(RTS)/*.h $(RTS)/*/*.h #generated/install.c+	@mkdir -p bin+	$(CCEVAL) generated/install.c $(CCLIBS) -o bin/install+ # Compile combinator evaluator bin/mhseval:	$(RTS)/*.c $(RTS)/*.h $(RTS)/*/*.h 	@mkdir -p bin@@ -95,7 +101,10 @@ 	@mkdir -p bin 	$(CCEVAL) $(CCSANITIZE) $(RTSINC) $(RTS)/comb.c $(CCLIBS) -o bin/mhsevalsane +####################### # mhseval, compiled with emscripten. Use in the browser!+#EMCC=emcc+#EMCCFLAGS=-O3 -sEXPORTED_RUNTIME_METHODS=stringToNewUTF8 -sALLOW_MEMORY_GROWTH -sTOTAL_STACK=5MB -sNODERAWFS -sSINGLE_FILE -DUSE_SYSTEM_RAW -sEXIT_RUNTIME 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@@ -103,21 +112,33 @@ 	@mkdir -p bin 	$(EMCCEVAL) $(RTS)/comb.c $(EMCCLIBS) -o generated/mhseval.js +bin/mhs.js:	mhs.js+	@mkdir -p bin+	echo '#! /usr/bin/env node' > bin/mhs.js+	cat mhs.js >> bin/mhs.js+	rm mhs.js+	chmod +x bin/mhs.js++####################### # Compile mhs with ghc bin/gmhs:	src/*/*.hs ghc/*.hs ghc/*/*.hs ghc/*/*/*.hs 	@mkdir -p bin-	$(GHC) $(GHCFLAGS) $(RTSINC) $(RTS)/mhseval.c $(MAINMODULE) -o bin/gmhs+	$(GHC) $(GHCFLAGS) $(RTSINC) $(MAINMODULE) -o bin/gmhs  # Compile mhs with ghc, with code coverage bin/cmhs:	src/*/*.hs ghc/*.hs ghc/*/*.hs 	@mkdir -p bin-	$(GHC) $(GHCFLAGS) $(RTSINC) $(RTS)/mhseval.c -fhpc $(MAINMODULE) -o bin/cmhs+	$(GHC) $(GHCFLAGS) $(RTSINC) -fhpc $(MAINMODULE) -o bin/cmhs  # Generate distribution C file generated/mhs.c:	bin/mhs src/*/*.hs 	@mkdir -p generated 	bin/mhs -z $(MHSINC) $(MAINMODULE) -ogenerated/mhs.c +generated/install.c:	bin/mhs Tools/Install.hs+	@mkdir -p generated+	bin/mhs -z $(MHSINC) -iTools Install -ogenerated/install.c+ ghcgen:	bin/gmhs src/*/*.hs lib/*.hs lib/*/*.hs lib/*/*/*.hs 	bin/gmhs $(MHSINC) $(MAINMODULE) -ogenerated/mhs.c @@ -131,14 +152,14 @@ 	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 $(RTS)/*.h $(RTS)/*/*.h targets.conf+mhs.js:	src/*/*.hs $(RTS)/*.h $(RTS)/*/*.h mhs.conf 	bin/mhs $(MHSINC) -temscripten $(MAINMODULE) -o mhs.js  # Make sure boottrapping works bootstrap:	bin/mhs-stage2 	@echo "*** copy stage2 to bin/mhs" 	cp bin/mhs-stage2 bin/mhs-	cp generated/mhs-stage2.c generated/mhs.c +	cp generated/mhs-stage2.c generated/mhs.c  # Build stage1 compiler with existing compiler bin/mhs-stage1:	bin/mhs src/*/*.hs@@ -166,8 +187,8 @@ 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+mhs.conf: mhs.conf.in+	sed -e "s,%GMPFLAGS,$(MHSGMPCCFLAGS)," -e "s,%GMPLIBS,$(MHSGMPCCLIBS)," mhs.conf.in > mhs.conf  # Run test examples with ghc-compiled compiler runtest:	bin/mhseval bin/gmhs tests/*.hs@@ -175,8 +196,11 @@  # 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" alltest+	cd tests; $(MAKE) MHS=../bin/mhs cache; $(MAKE) MHS="../bin/mhs +RTS -H4M -RTS -CR" alltest interactivetest +runitestmhs: bin/mhseval bin/mhs+	cd tests; $(MAKE) MHS=../bin/mhs cache; $(MAKE) MHS="../bin/mhs +RTS -H4M -RTS -CR" interactivetest+ # Run test examples with sanitized mhs-compiled compiler runtestsan: bin/mhsevalsane sanitizemhs 	cd tests; $(MAKE) MHS="../bin/mhssane +RTS -H4M -RTS -CW" cache@@ -187,8 +211,11 @@  # Run test examples going via JavaScript runtestemscripten: bin/mhseval bin/mhs bin/cpphs-	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+	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 testpipenonblockioem +runtestinstemscripten:+	cd tests; $(MAKE) MHSTARGET="-temscripten" MHS="mhs.js -oout.js" EVAL="$(NODE) $(NODEFLAGS) out.js" test+ # 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@@ -215,12 +242,12 @@ timemhscompile: 	@date 	@git rev-parse HEAD-	time mhs +RTS -v -RTS -z -imhs -isrc -ipaths $(MAINMODULE)+	time mhs +RTS -v -RTS -z -imhs -isrc $(MAINMODULE)  timegmhscompile: 	@date 	@git rev-parse HEAD-	time bin/gmhs -imhs -isrc -ipaths $(MAINMODULE)+	time bin/gmhs -imhs -isrc $(MAINMODULE)  timeghccompile: 	@date@@ -234,7 +261,7 @@  # 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+	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 mhs.conf 	cd tests; $(MAKE) clean 	-cabal clean 	-git submodule deinit cpphssrc/malcolm-wallace-universe@@ -247,7 +274,7 @@ 	mkdir -p $(PREFIX)/lib/mhs/$(RTS) 	cp -r lib $(PREFIX)/lib/mhs 	cp -r $(RTS)/* $(PREFIX)/lib/mhs/$(RTS)-	cp targets.conf $(PREFIX)/lib/mhs/targets.conf+	cp mhs.conf $(PREFIX)/lib/mhs/mhs.conf 	@echo "***" 	@echo "*** Installation complete" 	@echo "*** Set environment variable MHSDIR to $(PREFIX)/lib/mhs"@@ -287,28 +314,17 @@  ###### -VERSION=0.15.0.0-HVERSION=0,15,0,0+VERSION=0.16.0.0+HVERSION=0,16,0,0 MCABAL=$(HOME)/.mcabal MCABALMHS=$(MCABAL)/mhs-$(VERSION) MDATA=$(MCABALMHS)/packages/mhs-$(VERSION)/data 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 $(RTS)/*.[ch] targets.conf $(MDIST)/Paths_MicroHs.hs+$(MCABALBIN)/mhs: bin/mhs $(RTS)/*.[ch] mhs.conf machdep 	@mkdir -p $(MCABALBIN)-	@mkdir -p $(MDIST)-	bin/mhs -z $(MHSINCNP) -i$(MDIST) $(MAINMODULE) -o$(MCABALBIN)/mhs-	@mkdir -p $(MRUNTIME)-	cp targets.conf $(MDATA)-	cp -r $(RTS)/* $(MRUNTIME)--$(MDIST)/Paths_MicroHs.hs:-	@mkdir -p $(MDIST)-	@echo 'module Paths_MicroHs where { import qualified Prelude(); import MHSPrelude; import Data.Version; version :: Version; version = makeVersion [$(HVERSION)]; getDataDir :: IO FilePath; getDataDir = return "$(MDATA)" }' > $(MDIST)/Paths_MicroHs.hs+	bin/mhs -z $(MHSINCNP) $(MAINMODULE) -o$(MCABALBIN)/mhs  $(MCABALBIN)/cpphs: bin/cpphs 	@mkdir -p $(MCABALBIN)@@ -318,24 +334,15 @@ 	@mkdir -p $(MCABALBIN) 	cp bin/mcabal $(MCABALBIN) -$(MCABALMHS)/packages/$(BASE).pkg: bin/mhs lib/*.hs lib/*/*.hs lib/*/*/*.hs-	bin/mhs -P$(BASE) -o$(BASE).pkg -ilib $(BASEMODULES)-	bin/mhs -Q $(BASE).pkg $(MCABALMHS)-	@rm $(BASE).pkg--#install: $(MCABALBIN)/mhs $(MCABALBIN)/cpphs $(MCABALBIN)/mcabal $(MCABALMHS)/packages/$(BASE).pkg-#	@echo $$PATH | tr ':' '\012' | grep -q $(MCABALBIN) || echo '***' Add $(MCABALBIN) to the PATH--# mkdir ~/.mcabal/packages/array-0.5.6.0- preparedist:	newmhsz bootstrapcpphs 	rm -f generated/mcabal.c generated/mhseval.js generated/base.pkg 	$(MAKE) generated/mcabal.c+	$(MAKE) generated/install.c 	$(MAKE) generated/mhseval.js-#	$(MAKE) generated/base.pkg+	$(MAKE) generated/base.pkg -generated/base.pkg:-	cd lib; mcabal $(MCABALCMP) build+generated/base.pkg: bin/mhs bin/mcabal+	cd lib; PATH=../bin:"$$PATH" mcabal $(MCABALGMP) build 	cp lib/dist-mcabal/base-$(VERSION).pkg generated/base.pkg  install:	installmsg minstall@@ -352,26 +359,48 @@ 	@echo '***************************************************' 	@echo '' -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+minstall: bin/install+	bin/install -i$(MCABAL) GMPFLAGS=$(MHSGMPCCFLAGS) GMPLIBS=$(MHSGMPCCLIBS)++oldminstall:	bin/mhs bin/cpphs bin/mcabal machdep+	@mkdir -p $(MCABALBIN)+	@mkdir -p $(MRUNTIME)+	cp bin/mhs bin/cpphs bin/mcabal $(MCABALBIN)+	cp mhs.conf $(MDATA)+	cp -r $(RTS)/* $(MRUNTIME)+	@mkdir -p $(MCABALMHS)+	bin/mhs -Q generated/base.pkg $(MCABALMHS) 	@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+# Install with recompiling+slowinstall:	bin/cpphs bin/mcabal bin/mhs machdep 	@mkdir -p $(MCABALBIN)-	cp bin/cpphs bin/mcabal bin/mhs $(MCABALBIN)-	mhs -Q generated/base.pkg $(MCABALMHS)+	@mkdir -p $(MRUNTIME)+	cp bin/cpphs bin/mcabal $(MCABALBIN)+	cp mhs.conf $(MDATA)+	cp -r $(RTS)/* $(MRUNTIME)+	bin/mhs -z $(MHSINCNP) $(MAINMODULE) -o$(MCABALBIN)/mhs+	cd lib; PATH=$(MCABALBIN):"$$PATH" mcabal $(MCABALGMP) install+	@echo $$PATH | tr ':' '\012' | grep -q $(MCABALBIN) || echo '***' Add $(MCABALBIN) to the PATH  #####++# Profile Guided Optimization for LLVM on MacOS+# This gives about a 5% speedup on my M4 MacMini+llvmpgo:+	rm -f *.profraw+	$(CCEVAL) -fprofile-generate generated/mhs.c $(CCLIBS) -o $(MCABABIN)/mhs_gen+	mhs_gen -imhs -isrc MicroHs.Main+	xcrun llvm-profdata merge -output=code.profdata *.profraw+	$(CCEVAL) -fprofile-use=code.profdata generated/mhs.c $(CCLIBS) -o $(MCABABIN)/mhs++##### # Hugs HUGS= runhugs-HUGSINCS= '+Phugs:src:paths:{Hugs}/packages/*:hugs/obj' -98 +o +w -h100m+HUGSINCS= '+Phugs:src:{Hugs}/packages/*:hugs/obj' -98 +o +w -h100m  generated/hmhs.c: 	@mkdir -p generated@@ -380,4 +409,5 @@ bin/hmhs: generated/hmhs.c 	@mkdir -p bin 	$(CCEVAL) generated/hmhs.c $(CCLIBS) -o bin/hmhs+ 
MicroHs.cabal view
@@ -1,13 +1,13 @@ cabal-version:       3.0 name:                MicroHs-version:             0.15.0.0+version:             0.16.0.0                      -- *** When changing the version number, also                      -- *** run 'sh updateversion.sh'                      -- *** Yeah, it stinks. synopsis:            A small compiler for Haskell license:             Apache-2.0 license-file:        LICENSE-copyright:           2023,2024,2025 Lennart Augustsson+copyright:           2023-2026 Lennart Augustsson category:            language author:              lennart@augustsson.net maintainer:          lennart@augustsson.net@@ -24,13 +24,13 @@       Tools/convertX.sh       Tools/Addcombs.hs       Tools/Compress.hs+      Tools/Install.hs       generated/mhs.c       generated/cpphs.c       ghc/**/*.hs       lib/**/*.hs       lib/**/*.hs-boot       mhs/**/*.hs-      paths/Paths_MicroHs.hs       src/runtime/*.c       src/runtime/*.h       src/runtime/**/*.c@@ -41,7 +41,8 @@       tests/*.ref  data-files:-      targets.conf+      mhs.conf+      mhs.conf.in       src/runtime/*.c       src/runtime/*.h       src/runtime/**/*.c@@ -68,9 +69,11 @@                        MicroHs.Builtin                        MicroHs.Compile                        MicroHs.CompileCache+                       MicroHs.Config                        MicroHs.Deriving                        MicroHs.Desugar                        MicroHs.EncodeData+                       MicroHs.Embed                        MicroHs.Exp                        MicroHs.ExpPrint                        MicroHs.Expr@@ -95,30 +98,28 @@                        MicroHs.TCMonad                        MicroHs.Translate                        MicroHs.TypeCheck-                       MicroHs.TargetConfig+                       MicroHs.Version                        Text.ParserComb                        Text.PrettyPrint.HughesPJLite+                       Text.PrettyPrint.HughesPJLiteClass                        System.Console.SimpleReadline                        Data.Double                        Data.Integer                        PrimTable-                       MhsEval+--                       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     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,@@ -126,9 +127,9 @@                        text         >= 2.0 && < 2.5,                        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+--    install-includes:  mhseval.h+--    c-sources:         src/runtime/mhseval.c+--    includes:          mhseval.h    if impl(hugs)     hs-source-dirs:    hugs src@@ -137,83 +138,3 @@     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
@@ -2,6 +2,8 @@ This repository contains an implementation of an extended subset of Haskell. It uses combinators for the runtime execution. +[Try it in your browser](https://augustss.github.io/MicroHs/web-mhs/)+ The runtime system has minimal dependencies, and can be compiled even for micro-controllers. The `boards/` directory contains some samples, e.g., some sample code for an STM32F407G-DISC1 board. @@ -9,7 +11,7 @@  ## Presentation You can find my [presentation from the Haskell Symposium 2024](https://docs.google.com/presentation/d/1WsSiSwypNVTm0oZ3spRYF8gA59wyteOsIkPRjCUAZec/edit?usp=sharing), [video](https://m.youtube.com/watch?v=uMurx1a6Zck&t=36m).-There is also a short paper in `doc/hs2024.pdf`.+There is also a short paper at [`doc/hs2024.pdf`](https://github.com/augustss/MicroHs/blob/master/doc/hs2024.pdf).  ## Compiling MicroHs There are two different ways to compile MicroHs:@@ -39,90 +41,14 @@  The compiler can also be used with emscripten to produce JavaScript/WASM. -## Language-The language is an extended subset of Haskell-2010.--Differences:- * Kind variables need an explicit `forall`.- * Always enabled extension:-   * AllowAmbiguousTypes-   * BangPatterns-   * BinaryLiterals-   * BlockArguments-   * ConstraintKinds-   * DefaultSignatures-   * DeriveAnyClass-   * DerivingDataTypeable-   * DerivingFoldable-   * DerivingFunctor-   * DerivingStrategies-   * DerivingTraversable-   * DerivingVia-   * DoAndIfThenElse-   * DuplicateRecordFields-   * EmptyCase-   * EmptyDataDecls-   * EmptyDataDeriving-   * ExistentialQuantification-   * ExplicitNamespaces-   * ExtendedDefaultRules-   * ExtraInstanceBindings-   * FlexibleContexts-   * FlexibleInstance-   * ForeignFunctionInterface-   * FunctionalDependencies-   * GADTs-   * GADTsyntax-   * GeneralizedNewtypeDeriving-   * ImportShadowing-   * ImportQualifiedPost-   * IncoherentInstances-   * InstanceSigs-   * KindSignatures-   * LambdaCase-   * LiberalTypesynonyms-   * MagicHash-   * MultilineStrings-   * MultiParamTypeClasses-   * MultiWayIf-   * NamedDefaults-   * NamedFieldPuns-   * NegativeLiterals-   * NondecreasingIndentation-   * NoStarIsType-   * NumericUnderscores-   * OrPatterns-   * OverlappingInstances-   * OverloadedRecordDot-   * OverloadedRecordUpdate-   * OverloadedStrings-   * PatternSynonyms-   * PolyKinds-   * PolymorphicComponents-   * RankNTypes-   * RecordWildCards-   * RecursiveDo (just `rec`, not `mdo`)-   * RequiredTypeArguments-   * QualifiedDo-   * ScopedTypeVariables-   * StandaloneDeriving-   * StandaloneKindSignatures-   * TupleSections (only pairs right now)-   * TypeApplications-   * TypeLits-   * TypeSynonymInstances-   * UndecidableInstances-   * UndecidableSuperClasses-   * UnicodeSyntax-   * ViewPatterns- * The only extension that is not always on is `CPP`.- * `main` in the top module given to `mhs` serves at the program entry point.- * Many things that should be an error (but which are mostly harmless) are not reported.- * Text file I/O always uses UTF8, as does the source code.- * The `BangPatterns` extension is parsed, but only effective at the a top level `let`/`where`.- * More differences that I don't remember right now.+### Using GMP for `Integer`+The default implementation of the `Integer` type is written in Haskell and is quite slow.+It is possible to use the [GMP](https://gmplib.org/) library instead.+To use GMP you need to uncomment the first few lines in the `Makefile`, and also+modify the definition that directs the C compiler where to find GMP. -Mutually recursive modules are allowed the same way as with GHC, using `.hs-boot` files.+***NOTE*** To switch between using and not using GMP you need to do `make clean`.+You might also need to do `make USECPPHS=cpphs bootstrapcpphs` if there are complaints.  ## Example The file `Example.hs` contains the following:@@ -160,133 +86,12 @@ This will not even try to open `Prelude.hs`.  It also avoids the automagic (qualified) import of `Mhs.Builtin` that normally happens. -## Types-There are some primitive data types, e.g `Int`, `IO`, `Ptr`, and `Double`.-These are known by the runtime system and various primitive operations work on them.-The function type, `->`, is (of course) also built in. -All other types are defined with the language.  They are converted to lambda terms using-an encoding.-For types with few constructors (< 5) it uses Scott encoding, otherwise it is a pair with-an integer tag and a tuple (Scott encoded) with all arguments.-The runtime system knows how lists and booleans are encoded.---## Compiler-The compiler is written in Micro Haskell.-It takes a name of a module (or a file name) and compiles to a target (see below).-This module should contain the function `main` of type `IO ()` and-it will be the entry point to the program.--### Compiler flags-* `--version` show version number-* `-i` set module search path to empty-* `-iDIR` append `DIR` to module search path-* `-oFILE` output file.  If the `FILE` ends in `.comb` it will produce a textual combinator file.  If `FILE` ends in `.c` it will produce a C file with the combinators.  For all other `FILE` it will compile the combinators together with the runtime system to produce a regular executable.-* `-r` run directly-* `-v` be more verbose, flag can be repeated-* `-CW` write compilation cache to `.mhscache` at the end of compilation-* `-CR` read compilation cache from `.mhscache` at the start of compilation-* `-C` short for `-CW` and `-CR`-* `-T` generate dynamic function usage statistics-* `-z` compress combinator code generated in the `.c` file-* `-l` show every time a module is loaded-* `-s` show compilation speed in lines/s-* `-XCPP` run `cpphs` on source files-* `-Dxxx` passed to `cpphs`-* `-Ixxx` passed to `cpphs`-* `-tTARGET` select target-* `-a` set package search path to empty-* `-aDIR` prepend `DIR` to package search path-* `-PPKG` create package `PKG`-* `-L[FILE]` list all modules in a package-* `-Q FILE [DIR]` install package-* `-ddump-PASS` debug, show AST after `PASS`.  Possible passes `parse`, `derive`, `typecheck`, `desugar`, `toplevel`, `combinator`, `all`-* `--` marks end of compiler arguments--With the `-v` flag the processing time for each module is reported.-E.g.-  ```-  importing done MicroHs.Exp, 284ms (91 + 193)-  ```-which means that processing the module `MicroHs.Exp` took 284ms,-with parsing taking 91ms and typecheck&desugar taking 193ms.--With the `-C` flag the compiler writes out its internal cache of compiled modules to the file `.mhscache`-at the end of compilation.  At startup it reads this file if it exists, and then validates the contents-by an MD5 checksum for all the files in the cache.-This can make compilation much faster since the compiler will not parse and typecheck a module if it is in-the cache.-Do **NOT** use `-C` when you are changing the compiler itself; if the cached data types change the compiler will probably just crash.--### Targets-The configuration file `targets.conf` (in the installation directory) defines how to compile for-different targets.  As distributed it contains the targets `default` and `emscripten`.-The first is the normal target to run on the host.-The `emscripten` target uses `emcc` to generate JavaScript/WASM.-If you have `emcc` and `node` installed you can do-  ```-  mhs -temscripten Example -oout.js; node out.js-  ```-to compile and run the JavaScript.  The generated JavaScript file has some regular JavaScript,-and also the WASM code embedded as a blob.  Running via JavaScript/WASM is almost as fast as running natively.--### Environment variables-* `MHSDIR` the directory where `lib/` and `src/` are expected to be.  Defaults to `./`.-* `MHSCC` command use to compile C file to produce binaries.  Look at the source for more information.-* `MHSCPPHS` command to use with `-XCPP` flag.  Defaults to `cpphs`.-* `MHSCONF` which runtime to use, defaults to `unix-32/64` depending on your host's word size-* `MHSEXTRACCFLAGS` extra flags passed to the C compiler--### Compiler modules--* `Abstract`, combinator bracket abstraction and optimization.-* `Compile`, top level compiler.  Maintains a cache of already compiled modules.-* `CompileCache`, cache for compiled modules.-* `Deriving`, do deriving for various type classes.-* `Desugar`, desugar full expressions to simple expressions.-* `EncodeData`, data type encoding.-* `Exp`, simple expression type.-* `ExpPrint`, serialize `Exp` for the runtime system.-* `Expr`, parsed expression type.-* `FFI`, generate C wrappers for FFI.-* `Fixity`, resolve operator fixities.-* `Flags`, compiler flags.-* `Graph`, strongly connected component algorithm.-* `Ident`, identifiers and related types.-* `IdentMap`, map from identifiers to something.-* `Interactive`, top level for the interactive REPL.-* `Lex`, lexical analysis and indentation processing.-* `Main`, the main module.  Decodes flags, compiles, and writes result.-* `MakeCArray`, generate a C version of the combinator file.-* `Parse`, parse and build and abstract syntax tree.-* `StateIO`, state + IO monad.-* `SymTab`, symbol table manipulation.-* `TCMonad`, type checking monad.-* `Translate`, convert an expression tree to its value.-* `TypeCheck`, type checker.- ## Interactive mode If no module name is given the compiler enters interactive mode. You can enter expressions to be evaluated, or top level definitions (including `import`). Simple line editing is available. -All definitions are saved in the file `Interactive.hs` and all input-lines as saved in `.mhsi`.  The latter file is read on startup so-the command history is persisted.--Available commands:--* `:quit` Quit the interactive system-* `:clear` Get back to start state-* `:del STR` Delete all definitions that begin with `STR`-* `:reload` Reload all modules-* `: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`)- ## MHS as a cross compiler When `mhs` is built, targets.conf is generated. It will look something like this: ```ini@@ -298,89 +103,6 @@ You can add other targets to this file, changing which compiler command is used and which runtime is selected and then use the `-t` argument to select which target you would like. -## Packages-To avoid compiling everything from source all the time there is a notion of a precompiled package.-A package is simply a set of modules that are compiled together and that can then be installed in-a known place (typically `~/.mcabal/mhs-VERSION/packages/`).-Packages can depend on already installed packages.--There is a search path for installed packages, controlled by the `-a` flag.--There is no need for any extra flags to `mhs` to use installed packages, they are all visible at all times.-When compiling to a binary only the used parts of a package will be included in the binary.--### Compiling a package-To compile a package use the command `mhs -Ppackage-name.pkg modules...` where `modules...`-are all the modules you wish to expose from the package.  If other modules are needed they will-automatically be included in the package.-You typically also want to use the `-o` flag to give the package a sensible name.--### Installing a package-To install a package use the command `mhs -Q package-name.pkg [install-dir]`.-If the `install-dir` is left out the package is installed in the default place.--### MicroCabal (`mcabal`)-Normally a package is downloaded from hackage and it will have a `.cabal` file-that describes the package contents.  To install a downloaded package simply-do `mcabal install`.  The `mcabal` program is included in the MicroHs download.-You can also do `mcabal install PKG` to download an install a package.--### Installed package organization-The packages are typically installed in `~/.mcabal/` and it has the following-layout:-* `.mcabal/bin/` installed binaries, initially `mhs`, `cpphs`, and `mcabal`-* `.mcabal/mhs-VER/` installed files for the given `mhs` version-* `.mcabal/mhs-VER/packages/` for each library package a `PKG.pkg` file (the binary blob for the package)-  and also (maybe) a directory `PKG/` that contains `data/`, `include/`, and `cbits/` for the package.-* `.mcabal/.../MODULE.txt` a file for each installed module, it contains the name of the package the contains that module.--For example, after installing `mhs` version 0.10.5.0 we will have something like this:-```-.mcabal/-        bin/cpphs-            mcabal-            mhs-        mhs-0.10.5.0/Control/Applicative.txt   -- contains "base-0.10.5.0.pkg"-                             ...-                             Monad/Fail.txt    -- contains "base-0.10.5.0.pkg"-                                   ...-                             ...-                     Data/-                     ...-                     Prelude.txt               -- contains "base-0.10.5.0.pkg"-        packages/base-0.10.5.0.pkg-                 mhs-0.10.5.0/data/src/runtime/eval.c-                                               ...-```---A (maybe) short-coming of the package system is that there can only be one version of a-package installed at a time.  If you need multiple version, you have to use different directories for them-and use `-a` to control it.  There is absolutely no checks for consistency among packages.-There is also no compatibility between packages compiled with different versions of the compiler.--### Hackage-Hackage is full of great packages, unfortunately most of them contain some GHC specific code.-Some compile, most don't.  Some have replacement, most don't.  Here's a summary of-the current state:--#### 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--#### 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: * `Tools/` a few useful tools for compressions etc.@@ -391,106 +113,6 @@ * `src/runtime/` the runtime source * `tests/` some tests -## Runtime-The runtime system is written in C and is in `src/runtime/eval.c`.-It uses combinators for handling variables, and has primitive operations-for built in types and for executing IO operations.-There is a also a simple mark-scan garbage collector.-The runtime system is written in a reasonably portable C code.--### Runtime flags-Runtime flags are given between the flags `+RTS` and `-RTS`.-Between those the runtime decodes the flags, everything else is available to-the running program.--* `-HSIZE` set heap size to `SIZE` cells, can be suffixed by `k`, `M`, or `G`, default is `50M`-* `-KSIZE` set stack size to `SIZE` entries, can be suffixed by `k`, `M`, or `G`, default is`100k`-* `-rFILE` read combinators from `FILE`, instead of `out.comb`-* `-v` be more verbose, flag can be repeated-* `-T` generate profiling stats (if compiled with `-T` as well)-* `-B` ring the bell on every GC-* `-oFILE` just read the input, run garbage collection, and write out the resulting graph to file.--For example, `bin/mhseval +RTS -H1M -v -RTS hello` runs `out.comb` and the program gets the argument `hello`,-whereas the runtime system sets the heap to 1M cells and is verbose.--### FFI-MicroHs supports calling C functions.-When running the program directly (using `-r`) or when generating a `.comb` file only the functions in the table built-into `src/runtime/eval.c` can be used.  When generating a `.c` file or an executable any C function can be called.--There is a lot of missing FFI functionality compared to GHC.--### Records-MicroHs implements the record dot extensions.-So accessing a field `a` in record `r` is written `r.a`, as well as the usual `a r`.-The former is overloaded and can access any `a` field, whereas the latter is the usual monomorphic field selector.-Updating a field has the usual Haskell syntax `r{ a = e }`, but the type is overloaded so this can update the `a` field in any record.-The typeclasses `HasField` and `SetField` capture this.-`HasField "name" rec ty` expresses that the record type `rec` has a field `name` with type `ty` that can be extracted with `getField`.-`SetField "name" rec ty` expresses that the record type `rec` has a field `name` with type `ty` that can be set `setField`.--Record updates can also update nested fields, e.g., `r{ a.b.c = e }`.  Note that this will not easily work in GHC, since GHC does not-fully implement `OverloadedRecordUpdate`.  When GHC decides how to do it, MicroHs will follow suit.--Note that record updates cannot change the type of polymorphic fields.--### Serialization-The runtime system can serialize and deserialize any expression-and keep its graph structure (sharing and cycles).-The only exceptions to this are C pointers (e.g., file handles),-which cannot be serialized (except for `stdin`, `stdout`, and `stderr`).--### Memory layout-Memory allocation is based on cells.  Each cell has room for two pointers (i.e., two words, typically 16 bytes),-so it can represent an application node.  One bit is used to indicate if-the cell is an application or something else.  If it is something else one-word is a tag indicating what it is, e.g., a combinator or an integer.-The second word is then used to store any payload, e.g., the number itself for an integer node.--Memory allocation has a bitmap with one bit per cell.-Allocating a cell consists of finding the next free cell using the bitmap,-and then marking it as used.  The garbage collector first clears the bitmap-and then (recursively) marks every used cell in the bitmap.-There is no explicit scan phase since that is baked into the allocation.-Allocation is fast assuming the CPU has some kind of FindFirstSet instruction.--It is possible to use smaller cells by using 32 bit "pointers" instead of 64 bit pointers.-This has a performance penalty, though.--### Portability-The C code for the evaluator does not use any special features, and should be-portable to many platforms.  It has mostly been tested with MacOS and Linux,-and somewhat with Windows.--The code has been tested on 64- and 32-bit little-endian platforms.--The `src/runtime/` directory contains configuration files for different platform.-Use the appropriate `src/runtime/eval-`*platform*`.c`.--## Bootstrapping-The compiler can compile itself.  To replace `bin/mhs` with a new version,-do `make bootstrap`.  This will recompile the compiler twice and compare-the outputs to make sure the new compiler still works.--### Bootstrapping with Hugs-It is also possible to bootstrap MicroHs using Hugs.  That means that-MicroHs can be built from scratch in the sense of [bootstrappable.org](https://bootstrappable.org/).-To compile with Hugs you need [a slightly patched version of Hugs](https://github.com/augustss/hugs98-plus-Sep2006)-and also the [hugs branch of MicroHs](https://github.com/augustss/MicroHs/tree/hugs).--The patched version of Hugs is needed to work around undefined behavior with arithmatic overflow.-Hugs provided Linux distribtions or other third party package managers may or may not work.--## Using GMP for `Integer`-The default implementation of the `Integer` type is written is Haskell and is quite slow.-It is possible to use the [GMP](https://gmplib.org/) library instead.-To use GMP you need to uncomment the first few lines in the `Makefile`, and also-modify the definition that directs the C compiler where to find GMP.--***NOTE*** To switch between using and not using GMP you need to do `make clean`.-You might also need to do `make USECPPHS=cpphs bootstrapcpphs` if there are complaints.- # Preprocessor Sadly, compiling a lot of Haskell packages needs the C preprocessor. To this end, the distribution contains the combinator code for `cpphs`.@@ -596,3 +218,52 @@ *   * Q: Why are the error messages so bad?   * A: Error messages are boring.++---++For more information, see the [wiki](https://github.com/augustss/MicroHs/wiki).++---++# Finding modules *NOT YET IMPLEMENTED*+A module `M` is located using the _sourcePath_ and the _packageDbPath_.+Both of the paths are a list of directories and are searched left-to-right.+This lookup is used both `import` and modules given on the command line.++Note: If the module name given on the command line has suffix `.hs` or `.lhs`+it is used as a file name, rather than a module name.++First, the the _sourcePath_ is used.  For each directory in the+path:+ * the module name `M` is appended with `.` changed to `/`.+ * then the suffixes `.hs`, `.hsc`, and `.lhs` are tried in order+ * if the file exists it is assumed to be the source for module `M`++Second, if no source file is found, then each directory in the+_packageDbPath_ is tried.  If the module is found, the corresponing+package is loaded and the compiled module 'M' from that package is used.++## Setting the _sourcePath_+The default _sourcePath_ is just the current directory, `.`.+The path can be cleared by using the `-i` command line flag.+To append to the path use `-iPATH`, where `PATH` is a colon (`:`)+separated list of directories.++## Setting the _packageDbPath_+The default _packageDbPath_ is take from the `mhs.conf` file+in the section `[mhs]` and key `packageDbPath`.+The path can contain environment variables that are expanded.+In addition $MHSPKG expand to the package directory relative to the executing binary.+Furthermore $VERSION expands to the mhs version number.++The path can be cleared by using the `-a` command line flag.+To append to the path use `-aPATH`, where `PATH` is a colon (':')+separated list if directories.++## Installing packages++The _packageDb_ directory can be given directly with the `-Q`+flag used to install.++The `mcabal` command can install to a particular package db by using+`--install=PATH`.
+ Tools/Install.hs view
@@ -0,0 +1,275 @@+module Install where+import Control.Monad+import qualified Data.ByteString as BS+import Data.Char+import Data.List+import Data.Maybe+import Data.Word+import Foreign.Storable+import Foreign.Marshal.Utils+import Foreign.Ptr+import System.Directory+import System.Environment+import System.FilePath+import System.Process+import System.IO.TimeMilli+import Text.Printf+import MicroHs.Config++type CConf = [(Key, Value)]+++main :: IO ()+main = do+  start <- getTimeMilli+  args <- getArgs+  let flags = decodeArgs defaultFlags args+  confText <- macroExpand flags <$> readFile (confFile flags)+  home <- getHomeDirectory+  let conf = either (\ s -> error $ "cannot parse config " ++ s) id $+                    parseConfig (confFile flags) confText+      cc = fromMaybe (error $ "Cannot locate section " ++ target flags) $+              lookup (target flags) conf+      exe | target flags == "windows" = "exe"+          | otherwise                 =  ""+      inst = fromMaybe (home </> ".mcabal") (instDirM flags)+      flags' = flags { exeSuffix = exe, cconf = cc, instDir = inst, conf = confText }++  install flags'++  end <- getTimeMilli+  let delta = (end - start) `quot` 100+      (sec, tenths) = delta `quotRem` 10+  putStrLn $ "Install time: " ++ show sec ++ "." ++ show tenths ++ "s"++install :: Flags -> IO ()+install flags = do+  time "instBin" $ instBin flags+  vers <- init <$> mhsOut flags ["--numeric-version"]+  let flags' = flags { version = vers }+  time "mkMachdep" $ mkMachdep flags'+  time "mkConf" $ mkConf flags'+  time "copyRTS" $ copyRTS flags'+  time "copyBase" $ copyBase flags'+  time "checkPath" $ checkPath flags'++instBin :: Flags -> IO ()+instBin flags = do+  let mCabal = instDir flags+      mcabalBin = mCabal </> "bin"+      exes = ["mhs", "cpphs", "mcabal"]+  mkdir flags "bin"+  mapM_ (buildBin flags) exes+  mkdir flags mcabalBin+  let cpbin pgm = do+        let exe = pgm <.> exeSuffix flags+        copy flags ("bin" </> exe) (mcabalBin </> exe)+  mapM_ cpbin exes++mkMachdep :: Flags -> IO ()+mkMachdep flags =+  machdep flags $ "src" </> "runtime" </> "MachDeps.h"++mkConf :: Flags -> IO ()+mkConf flags = do+  msg flags "create mhs.conf"+  unless (dryRun flags) $+    writeFile "mhs.conf" (conf flags)++copyRTS :: Flags -> IO ()+copyRTS flags = do+  let mCabalMhs = instDir flags </> ("mhs-" ++ version flags)+  let mData = mCabalMhs </> "packages" </> ("mhs-" ++ version flags) </> "data"+      rts = "src" </> "runtime"+  time "mkdir eData" $ mkdir flags mData+  time "copy mhs.conf" $ copy flags "mhs.conf" (mData </> "mhs.conf")+  time "copyDir" $ copyDir flags rts (mData </> rts)++copyBase :: Flags -> IO ()+copyBase flags = do+  let mCabalMhs = instDir flags </> ("mhs-" ++ version flags)+  mkdir flags mCabalMhs+  out <- mhsOut flags ["-Q", "generated" </> "base.pkg", mCabalMhs]+  msg flags out++checkPath :: Flags -> IO ()+checkPath flags = do+  path <- fromMaybe "" <$> lookupEnv "PATH"+  let paths = splitOn pathSep path+      pathSep | target flags == "windows" = ";"+              | otherwise = ":"+      bin = instDir flags </> "bin"+  unless (bin `elem` paths) $+    putStrLn $ "Please add " ++ bin ++ " to your PATH"++buildBin :: Flags -> String -> IO ()+buildBin flags pgm = do+  let src = "generated" </> pgm <.> ".c"+      dst = "bin" </> pgm <.> exeSuffix flags+      ccf = cconf flags+      rts = "src" </> "runtime"+  time ("buildBin " ++ pgm) $+   cc flags [get ccf "ccflags", "-I" ++ rts, "-I" ++ (rts </> get ccf "conf"),+            rts </> "main.c", rts </> "eval.c",+            src, get ccf "cclibs", getD ccf "-o" "cout" ++ dst]++mhsOut :: Flags -> [String] -> IO String+mhsOut flags args = do+  let exe = "bin" </> "mhs" <.> exeSuffix flags+  msg flags $ unwords (exe:args)+  if dryRun flags then+    return "MHSOUT\n"+   else+    readProcess exe args ""++-----++getD :: CConf -> Value -> Key -> Value+getD cconf def key = fromMaybe def $ lookup key cconf++get :: CConf -> Key -> Value+get cconf key = getD cconf (error $ "Cannot find " ++ key) key++-----++cc :: Flags -> [String] -> IO ()+cc flags args = do+  let c = get (cconf flags) "cc"+  msg flags $ unwords (c : args)+  unless (dryRun flags) $+    callProcess c args++msg :: Flags -> String -> IO ()+msg flags s | not (quiet flags) = putStrLn s+            | otherwise         = return ()++-----++mkdir :: Flags -> FilePath -> IO ()+mkdir flags dir = do+  msg flags $ "mkdir " ++ dir+  unless (dryRun flags) $ do+    _ <- system $ "mkdir -p " ++ dir+    return ()+--    createDirectoryIfMissing True dir++machdep :: Flags -> FilePath -> IO ()+machdep flags name = do+  msg flags $ "create " ++ name+  big <- isBigEndian+  unless (dryRun flags) $+    writeFile name $ unlines+      [ "#define WORD_SIZE_IN_BITS " ++ show _wordSize+      , (if big then "#define" else "#undef") ++ " WORDS_BIGENDIAN"+      ]++isBigEndian :: IO Bool+isBigEndian = do+  let w :: Word+      w = if _wordSize == 32 then 0x01000002 else 0x0100000000000002+  p <- new w+  b <- peek (castPtr p :: Ptr Word8)+  return (b == 1)++copy :: Flags -> FilePath -> FilePath -> IO ()+copy flags src dst = do+  msg flags $ unwords ["cp", src, dst]+  unless (dryRun flags) $ do+    copyFileBS src dst+    copyPermissions src dst++copyDir :: Flags -> FilePath -> FilePath -> IO ()+copyDir flags src dst = do+  msg flags $ unwords ["cp -r", src, dst]+  let flags' = flags{ quiet = not (verbose flags) }+  mkdir flags dst+  let one file = do+        d <- doesDirectoryExist (src </> file)+        (if d then copyDir else copy) flags' (src </> file) (dst </> file)+  mapM_ one =<< listDirectory src++splitOn :: String -> String -> [String]+splitOn d = loop []+  where loop [] [] = []+        loop r [] = [reverse r]+        loop r s@(c:cs) | Just s' <- stripPrefix d s = reverse r : loop [] s'+                        | otherwise = loop (c:r) cs++macroExpand :: Flags -> String -> String+macroExpand flags = loop+  where loop [] = []+        loop ('%':cs) =+          let (mn, rest) = span nameChar cs+              nameChar c = isAlphaNum c || c == '_'+          in  fromMaybe "" (lookup mn (macros flags)) ++ loop rest+        loop (c:cs) = c : loop cs++-----++data Flags = Flags+  { target    :: String+  , dryRun    :: Bool+  , verbose   :: Bool+  , quiet     :: Bool+  , macros    :: [(String, String)]+  , goals     :: [String]+  , confFile  :: FilePath+  , instDirM  :: Maybe FilePath+  -- The rest are for internal use+  , exeSuffix :: String+  , instDir   :: FilePath+  , cconf     :: CConf+  , version   :: String+  , conf      :: String+  }+  deriving (Show)++defaultFlags :: Flags+defaultFlags =+  Flags+    { target    = if _isWindows then "windows" else "unix"+    , dryRun    = False+    , verbose   = False+    , quiet     = False+    , macros    = []+    , goals     = []+    , confFile  = "mhs.conf.in"+    , instDirM  = Nothing+    --+    , exeSuffix = undefined+    , instDir   = undefined+    , cconf     = undefined+    , version   = undefined+    , conf      = undefined+    }++decodeArgs :: Flags -> [String] -> Flags+decodeArgs f [] = f+decodeArgs f (arg:args) =+  case arg of+    "--help"           -> error usage+    "-v"               -> decodeArgs f{verbose = True} args+    "-q"               -> decodeArgs f{quiet = True} args+    "--dryrun"         -> decodeArgs f{dryRun = True} args+    '-':'t':s          -> decodeArgs f{target = s} args+    '-':'i':s          -> decodeArgs f{instDirM = Just s} args+    '-':_              -> error $ "Unknown flag: " ++ arg ++ "\n" ++ usage+    _ | (m, '=':e) <- span (/= '=') arg+                       -> decodeArgs f{macros = macros f ++ [(m, e)]} args+      | otherwise      -> decodeArgs f{goals = goals f ++ [arg]} args++usage :: String+usage = "\ninstall [--help] [-v] [--dryrun] [-tTARGET] [-iDIR] [NAME=MACRO] [GOAL]\n"++copyFileBS :: FilePath -> FilePath -> IO ()+copyFileBS src dst = BS.readFile src >>= BS.writeFile dst++time :: String -> IO a -> IO a+time _ ioa | 0==0 = ioa+-- Time individual operations+time s ioa = do+  t1 <- getTimeMilli+  a <- ioa+  t2 <- getTimeMilli+  printf "***** %s %fs\n" s (fromIntegral (t2 - t1) / 1000)+  return a
generated/cpphs.c view
@@ -1,2264 +1,1400 @@ #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;+122,76,90,50,173,108,0,0,93,0,0,0,1,76,73,2,0,0,0,0,+0,0,59,14,1,195,100,94,61,190,90,171,231,253,202,156,110,10,21,185,+4,62,118,44,91,134,160,232,84,184,183,170,81,174,167,43,75,114,73,39,+119,241,228,199,245,33,97,62,253,33,113,102,230,164,137,4,205,10,95,18,+137,55,51,57,174,197,168,128,223,231,139,181,165,214,200,219,210,151,166,105,+80,76,112,68,219,59,163,60,52,70,126,75,54,9,75,34,148,197,177,99,+3,41,148,15,223,58,69,232,153,195,187,194,191,84,73,93,31,79,210,21,+49,31,181,65,198,33,9,183,137,46,215,9,177,224,194,54,108,40,159,216,+197,116,89,137,30,234,92,207,11,163,76,218,192,176,148,72,218,17,169,132,+179,167,253,82,31,77,119,175,78,77,65,50,186,33,58,138,240,103,42,94,+114,64,186,254,246,46,4,132,16,110,121,108,65,16,243,134,222,13,51,76,+82,51,121,64,153,24,139,82,149,119,22,183,119,215,246,76,189,182,152,130,+179,172,145,128,27,22,122,149,227,66,131,129,149,225,210,252,10,87,195,20,+20,179,99,76,88,154,78,116,9,233,147,91,220,199,158,85,69,249,65,50,+102,115,206,216,129,47,158,161,183,131,172,34,206,28,146,18,185,85,94,99,+161,164,53,209,85,30,214,68,146,244,52,216,89,203,214,197,247,110,66,106,+118,188,6,244,66,110,27,174,154,116,178,89,181,4,55,171,151,178,2,92,+121,62,50,195,195,148,38,110,36,91,82,143,105,51,124,26,151,5,148,0,+128,51,81,142,146,102,46,197,133,133,105,48,153,229,22,102,140,254,232,86,+236,45,240,252,62,113,125,190,175,127,2,174,139,41,91,217,95,69,70,32,+248,37,8,181,193,76,139,6,30,215,27,150,52,138,65,15,139,75,113,2,+137,69,201,208,220,128,123,225,16,40,175,219,10,70,204,4,194,80,157,247,+38,12,190,227,74,113,11,135,146,20,58,143,88,152,217,202,21,212,125,17,+220,13,157,96,255,134,95,198,39,40,181,210,64,39,155,2,175,21,198,41,+53,148,26,122,80,254,113,70,16,88,242,73,188,190,182,43,205,179,73,92,+6,192,43,37,177,170,8,22,183,3,234,5,50,17,173,32,24,31,157,156,+188,70,58,193,16,135,16,170,17,208,93,138,121,102,185,186,99,131,191,48,+224,103,217,51,229,91,218,101,43,101,142,18,95,100,102,240,74,37,122,170,+24,65,151,126,41,111,202,251,202,101,93,46,99,213,13,160,156,124,80,32,+49,254,68,217,23,154,28,123,161,85,226,209,200,11,45,121,134,195,26,142,+50,146,158,202,85,13,247,147,46,32,232,156,76,74,238,203,85,252,70,147,+252,96,13,28,217,37,22,43,162,217,63,85,200,247,214,187,160,168,10,28,+161,105,54,168,164,112,11,90,36,127,96,192,87,19,79,24,29,154,225,93,+37,189,184,28,242,163,87,241,210,101,7,237,137,204,14,178,94,21,248,162,+104,138,152,194,218,78,113,100,56,158,249,91,40,226,202,109,60,73,244,223,+187,233,149,149,74,113,73,165,97,78,119,102,192,16,68,8,78,96,119,139,+46,232,75,18,70,59,90,229,2,227,214,179,36,98,100,149,119,75,229,74,+202,69,161,13,230,190,79,174,17,117,232,239,36,124,116,152,150,114,45,170,+58,64,89,225,204,151,109,159,17,107,73,37,163,201,118,220,149,60,214,223,+126,231,240,87,140,34,65,246,113,164,110,111,202,204,161,48,144,72,251,23,+133,15,86,90,147,42,131,99,203,23,237,105,190,68,184,162,159,123,216,138,+252,121,230,101,245,123,117,21,50,114,200,168,231,31,70,145,5,235,228,93,+235,225,165,78,229,206,109,12,112,113,47,170,122,159,152,19,99,159,196,19,+118,1,234,60,214,155,10,11,225,55,110,244,24,231,218,178,101,103,223,2,+173,115,211,13,210,106,77,197,176,137,175,202,29,35,169,123,191,164,120,173,+176,198,159,218,24,135,181,211,70,42,34,6,159,172,92,118,208,181,0,96,+224,16,129,146,129,35,26,73,173,30,32,13,13,235,0,233,146,53,178,250,+175,49,111,244,38,88,98,144,245,70,246,82,150,57,254,45,182,232,226,84,+91,75,16,117,215,168,3,134,126,138,34,174,239,181,227,71,109,92,6,58,+122,161,106,179,182,175,104,197,143,167,172,54,154,11,50,58,154,188,164,176,+255,153,250,224,132,244,115,224,193,168,184,106,73,135,39,65,254,201,15,252,+156,213,199,32,211,122,246,138,152,113,244,159,21,11,90,195,70,123,218,221,+245,201,152,103,38,164,119,187,61,122,77,17,69,240,104,140,64,228,75,11,+54,60,221,212,241,249,216,88,142,70,232,170,49,198,0,234,127,30,154,84,+221,240,218,15,86,83,48,166,189,118,63,160,129,221,217,126,195,213,11,187,+253,37,156,20,225,51,182,193,226,231,226,199,241,127,180,21,123,192,15,183,+174,25,142,139,191,220,219,68,96,23,155,239,228,26,91,161,16,154,44,154,+158,105,223,29,19,249,13,180,84,110,57,17,32,45,127,185,13,191,239,102,+147,143,59,93,218,252,249,143,189,9,179,225,20,129,1,185,30,56,32,165,+177,198,190,100,205,180,255,3,30,175,142,154,76,126,25,80,229,5,123,201,+57,134,194,201,123,246,198,179,65,219,168,76,234,238,48,53,16,84,137,46,+223,111,206,69,200,14,96,189,193,108,145,175,223,91,173,182,35,80,161,15,+36,45,91,132,20,180,136,72,121,1,43,143,253,164,1,165,180,92,63,41,+239,34,220,40,206,39,126,161,8,41,88,87,235,13,208,49,40,221,231,168,+95,120,164,100,45,134,120,131,132,154,64,170,135,69,88,251,10,29,88,168,+157,67,82,183,40,93,162,168,42,38,88,163,85,148,92,150,54,79,121,129,+64,58,13,111,93,143,160,70,1,194,39,10,181,141,111,206,19,4,155,210,+170,182,225,224,162,75,52,104,0,248,12,92,232,93,172,34,19,231,183,87,+98,11,1,145,158,145,171,161,59,193,44,82,79,194,234,240,110,10,109,202,+255,227,130,129,0,5,51,49,150,162,3,109,212,214,20,104,173,13,129,63,+88,142,112,164,119,207,67,126,187,183,41,63,21,221,94,21,107,90,223,55,+29,108,162,245,26,165,27,185,136,5,104,252,97,145,168,68,73,24,25,193,+97,17,204,124,80,13,210,208,133,236,71,191,119,46,59,158,14,140,105,63,+53,66,51,1,142,217,187,174,30,117,245,68,171,215,224,183,115,232,243,121,+53,222,191,152,152,216,127,93,27,46,27,180,109,247,130,128,227,205,133,136,+100,25,112,249,196,35,13,22,124,139,125,25,223,183,201,221,155,240,120,81,+32,88,115,217,102,248,207,67,239,252,136,21,224,37,195,234,181,114,105,130,+255,130,40,101,6,36,47,167,120,30,90,197,173,215,216,14,250,76,197,153,+113,86,99,166,230,151,178,32,142,46,18,189,87,156,33,97,101,251,242,138,+21,26,39,26,234,178,75,228,132,141,133,208,109,100,83,47,167,4,161,83,+79,24,68,120,223,42,182,39,41,68,201,132,125,125,110,215,234,168,20,40,+43,241,210,115,135,190,205,217,213,227,166,72,10,190,176,137,166,112,21,60,+60,2,5,150,32,237,221,228,40,51,75,64,118,145,26,85,69,5,222,110,+168,23,230,65,211,126,153,48,24,148,56,255,50,169,226,122,231,236,186,119,+248,143,86,105,90,73,54,217,130,117,231,170,114,7,9,77,92,154,28,182,+4,13,114,104,106,1,193,100,154,195,12,243,154,83,81,117,151,112,201,157,+169,163,0,43,36,182,96,164,212,157,133,74,34,22,99,31,138,213,28,130,+213,251,27,229,160,127,181,90,128,134,184,29,206,162,87,83,193,149,162,197,+60,50,227,75,177,65,112,136,153,76,218,94,131,182,253,79,127,180,204,105,+216,210,75,225,185,65,116,173,36,101,54,21,100,52,99,23,140,206,172,48,+109,130,52,241,220,18,96,150,70,161,191,53,191,32,234,139,20,169,159,32,+199,186,43,5,9,30,142,28,194,132,237,125,126,82,179,73,199,213,153,206,+225,51,138,117,255,45,133,95,33,175,225,112,255,89,213,176,109,5,209,164,+89,97,77,28,40,255,25,4,41,254,232,102,61,17,96,148,10,119,187,18,+32,143,245,58,58,136,2,168,146,4,55,239,117,29,164,241,119,99,84,202,+91,192,62,169,155,3,43,39,126,105,143,71,182,60,51,244,139,37,65,49,+108,34,46,184,174,218,133,172,243,50,95,126,137,176,240,135,231,97,6,105,+138,191,212,253,216,46,127,169,7,237,139,150,22,119,254,145,198,155,24,64,+229,9,144,165,88,142,89,96,149,215,216,143,48,132,63,234,54,29,144,231,+14,31,194,85,109,185,102,217,175,42,54,3,186,56,213,245,148,167,21,66,+73,81,94,228,29,34,129,243,118,235,6,237,253,246,61,182,93,99,151,18,+254,32,208,212,49,224,108,184,255,129,53,159,146,98,89,17,174,201,117,160,+14,148,136,123,71,123,108,205,184,201,75,30,232,2,169,92,219,28,5,147,+113,89,246,119,132,11,42,183,144,89,58,201,21,205,241,5,250,165,3,12,+74,129,99,114,76,215,238,178,69,242,195,1,99,154,164,129,47,187,52,107,+56,148,92,80,128,57,238,62,57,138,228,118,147,52,82,185,156,92,189,81,+187,231,149,22,52,150,91,145,122,149,72,8,14,107,253,5,140,33,42,127,+100,58,204,198,6,96,143,88,3,220,203,108,221,44,116,72,135,194,84,151,+199,152,170,17,168,117,244,17,122,114,119,221,44,73,152,33,201,197,76,107,+238,110,232,79,217,144,148,214,252,251,106,33,213,172,75,134,209,162,251,187,+53,187,5,63,244,108,57,201,107,49,36,139,62,93,2,5,43,53,232,20,+202,152,194,190,82,87,169,205,143,10,41,84,217,201,40,73,62,171,243,157,+200,121,240,183,175,4,180,98,166,191,218,101,168,161,126,204,0,6,211,218,+239,44,185,205,137,226,231,28,99,100,150,164,83,222,3,142,21,77,23,24,+178,9,105,43,2,1,202,41,155,156,188,74,106,218,98,186,212,255,157,235,+47,121,220,71,124,113,215,171,194,62,92,213,229,188,192,83,173,152,74,65,+17,136,205,251,0,40,246,4,184,102,145,76,222,41,43,85,242,67,93,141,+104,103,5,74,173,133,9,138,33,65,155,196,20,139,193,205,178,206,12,100,+220,20,174,166,7,248,68,180,180,89,61,78,166,33,242,253,150,62,243,27,+81,234,198,21,223,168,143,224,113,26,68,139,185,227,184,180,101,240,186,65,+14,0,9,138,122,153,184,18,16,31,12,140,238,237,253,120,54,194,64,172,+227,186,35,144,79,125,222,226,216,125,161,151,100,16,1,204,98,19,177,189,+64,181,85,237,164,177,183,100,41,64,12,126,130,3,180,129,93,245,95,201,+29,252,249,170,108,138,87,225,214,135,229,133,128,26,31,179,124,139,225,139,+229,164,178,177,156,158,236,37,239,122,128,140,68,40,120,139,13,212,102,59,+241,22,179,58,142,169,164,233,46,101,50,224,231,255,234,248,73,74,102,166,+249,140,131,241,72,88,174,243,132,115,163,232,106,83,166,186,135,159,81,60,+153,32,211,134,19,243,102,63,42,167,16,41,194,56,32,194,233,139,1,35,+45,188,150,76,137,38,55,48,123,158,156,171,126,63,61,164,213,223,165,11,+116,209,226,240,160,5,209,95,216,165,126,225,242,251,144,182,52,145,162,181,+253,176,19,108,55,61,122,50,54,183,63,193,206,79,212,9,192,231,201,229,+118,197,151,140,26,39,217,248,44,179,200,143,166,219,123,70,181,212,232,50,+17,143,215,137,29,156,114,170,116,206,245,142,69,30,182,221,6,36,158,84,+41,41,148,52,227,173,233,45,19,231,2,127,39,42,12,224,79,228,210,30,+254,186,215,92,129,211,95,154,146,162,180,157,25,192,82,185,43,189,129,61,+33,136,51,165,31,195,68,62,122,90,241,140,91,246,247,45,19,126,66,73,+147,111,249,221,218,36,92,98,213,254,78,96,164,94,231,48,255,114,216,141,+64,50,47,244,178,33,174,88,12,30,59,113,239,182,1,162,6,126,136,210,+41,204,94,138,192,7,167,96,186,93,140,215,215,196,111,182,193,14,13,11,+147,27,160,69,153,173,87,48,190,244,49,161,79,150,196,133,130,214,42,137,+85,198,140,194,13,90,28,3,137,171,124,227,136,134,99,79,124,5,233,61,+42,253,20,128,102,18,76,18,138,103,11,94,248,1,28,203,170,153,152,37,+71,110,250,126,70,85,22,234,16,186,241,251,87,218,180,165,27,107,86,210,+26,205,199,246,83,144,165,197,71,59,165,154,206,221,162,249,239,252,235,51,+50,179,82,67,152,41,168,188,249,44,130,62,38,145,10,96,51,126,148,144,+108,245,146,174,125,198,80,227,64,26,174,73,200,56,74,44,39,218,120,64,+128,49,149,192,166,236,33,179,191,54,29,203,166,99,8,130,31,210,225,50,+59,0,31,200,185,3,6,148,41,94,221,94,235,49,169,93,89,112,17,166,+206,255,83,58,205,181,183,253,121,251,246,192,232,63,242,143,103,172,183,16,+119,154,89,151,201,18,149,31,67,110,5,225,45,162,35,243,223,115,180,93,+6,109,47,48,185,21,189,109,117,121,150,172,208,46,45,255,165,87,17,165,+149,106,147,97,115,93,188,161,131,202,26,25,237,170,60,135,13,26,166,101,+228,104,21,48,29,237,192,173,188,40,240,250,46,234,26,229,142,236,144,200,+3,17,30,6,164,230,102,168,114,48,24,120,77,147,206,21,149,171,74,246,+222,242,92,245,56,226,139,177,210,47,10,147,101,96,154,86,30,252,24,93,+178,199,62,110,240,26,198,216,99,101,203,157,144,33,187,210,123,52,249,188,+181,220,108,58,160,156,243,85,196,161,55,133,75,230,174,212,52,19,187,55,+47,207,179,26,92,153,178,204,177,33,243,172,226,127,104,113,54,193,90,138,+16,248,1,13,239,36,43,79,54,115,70,51,52,107,21,150,191,217,187,227,+49,23,55,119,134,94,58,250,82,111,63,212,174,239,10,71,118,104,68,174,+162,14,188,107,255,27,4,93,144,193,223,91,115,57,147,56,1,10,208,156,+24,177,149,122,140,249,60,47,74,19,245,103,213,14,94,19,246,202,217,212,+151,213,176,250,46,13,5,243,183,223,253,158,252,104,42,128,117,138,136,198,+102,236,25,179,161,104,142,124,173,34,212,129,56,68,142,15,169,81,216,157,+228,63,58,118,68,17,202,165,31,7,6,41,120,22,113,16,151,45,36,216,+81,66,104,31,148,235,225,200,158,52,78,94,10,50,31,59,44,121,57,154,+233,128,153,64,122,10,111,52,60,189,161,233,244,240,162,243,214,242,220,175,+35,32,156,248,148,30,175,185,153,179,86,167,112,212,212,97,26,171,81,60,+42,40,208,121,241,198,171,46,87,41,242,35,67,243,133,8,203,92,130,141,+254,10,223,44,35,139,219,82,197,238,37,158,205,89,112,94,153,179,187,185,+169,129,99,78,198,199,157,115,84,131,167,59,140,233,16,64,165,105,30,19,+116,164,82,25,213,107,7,253,238,119,17,75,132,134,165,140,129,31,192,221,+11,196,196,184,214,210,118,165,151,199,221,23,123,49,12,192,186,127,103,6,+64,146,42,2,1,5,203,128,177,238,151,145,81,251,209,182,202,230,40,141,+50,251,217,107,55,84,135,14,241,16,129,223,195,65,158,47,92,199,6,245,+101,8,187,252,140,178,179,142,254,175,174,243,160,182,84,40,224,213,86,236,+85,0,94,97,165,112,78,36,161,54,230,0,47,62,122,245,77,171,24,198,+4,227,215,253,135,247,12,202,190,51,62,44,187,106,99,18,88,8,93,153,+165,167,126,56,120,104,238,131,148,69,71,247,110,194,62,74,205,198,249,42,+135,23,144,218,93,96,11,22,22,250,162,169,43,121,80,17,198,183,179,101,+247,65,184,38,40,198,165,40,162,181,151,87,152,244,75,87,87,22,76,201,+50,17,7,111,102,56,109,43,219,18,101,231,164,170,122,83,112,217,166,106,+80,198,65,166,159,243,181,75,167,111,91,107,161,160,149,235,57,227,179,45,+104,29,220,243,85,96,100,144,114,68,232,92,219,210,240,33,70,187,242,233,+37,5,23,7,18,63,81,58,14,195,6,186,103,169,173,76,50,195,69,23,+227,203,181,182,141,151,135,154,197,82,251,214,183,192,206,253,182,102,66,69,+98,224,224,202,88,105,233,152,153,55,194,98,109,131,36,240,249,168,99,165,+48,145,150,215,56,179,150,113,65,192,63,28,203,198,156,32,96,11,16,95,+252,98,167,54,64,104,93,159,137,164,10,48,33,76,17,122,20,131,63,212,+130,60,167,113,76,193,8,86,156,131,83,237,144,60,84,201,193,102,157,163,+132,206,198,199,54,249,90,3,138,46,34,144,94,109,153,173,105,43,147,49,+114,202,11,25,22,232,138,238,132,112,142,30,203,253,41,255,132,105,163,61,+214,13,174,125,118,58,119,139,27,231,103,166,232,120,11,238,113,166,182,163,+164,160,135,179,171,176,72,220,126,151,246,14,151,221,73,114,15,99,141,150,+61,222,129,203,6,242,77,179,92,196,204,148,202,92,37,52,79,73,5,48,+148,26,151,36,69,212,58,48,34,150,147,73,70,189,176,202,37,3,146,109,+1,53,55,149,64,15,21,249,95,9,230,72,10,120,91,195,114,18,100,220,+122,187,50,126,98,215,2,71,74,17,200,5,91,237,17,135,1,0,251,13,+243,36,154,33,163,216,50,68,61,1,158,81,124,167,61,238,103,234,64,13,+172,198,182,48,22,235,134,123,143,250,235,20,72,183,139,87,210,33,107,96,+247,193,241,130,207,206,135,145,112,185,250,193,37,230,210,195,137,141,208,112,+3,62,5,12,195,100,157,48,115,90,82,58,71,18,173,171,71,103,208,226,+123,33,118,198,247,7,68,24,125,28,174,250,170,222,193,121,122,179,135,135,+148,26,149,44,6,55,222,92,34,163,154,197,164,67,101,44,198,227,233,169,+149,178,219,17,25,225,133,222,240,90,203,48,162,248,220,30,205,99,39,100,+31,137,143,21,71,219,70,72,173,2,181,35,107,207,25,29,57,38,78,26,+104,137,74,52,142,207,120,197,245,80,160,28,18,34,183,67,53,252,242,213,+191,150,178,182,189,93,227,219,246,153,245,123,193,241,250,124,52,202,56,133,+48,87,148,22,127,139,124,218,235,71,30,221,154,34,213,207,148,234,195,112,+245,98,33,98,189,164,239,86,69,242,224,87,124,50,230,75,30,148,140,87,+8,223,60,219,230,28,213,185,217,33,153,44,85,180,38,105,220,209,141,228,+249,49,189,157,73,221,201,237,1,141,175,219,189,165,250,117,127,65,107,47,+161,201,111,28,44,219,230,51,190,160,58,148,173,244,152,224,233,211,190,181,+99,37,117,41,117,154,4,70,7,113,40,145,226,81,114,38,32,181,153,202,+154,70,246,14,160,160,199,249,190,148,202,61,104,158,119,242,195,21,93,18,+161,13,210,112,31,233,0,219,75,219,18,203,222,155,73,108,137,219,71,206,+142,169,223,21,217,28,1,77,139,193,101,46,53,0,31,61,35,152,206,151,+184,36,152,67,192,126,86,221,140,71,203,73,229,51,21,181,80,54,176,144,+218,62,76,180,233,32,219,153,22,22,56,82,179,199,241,187,203,249,255,139,+12,176,113,199,112,111,41,211,126,3,130,127,164,85,20,186,68,95,32,96,+4,204,66,99,28,130,69,3,209,19,196,60,26,212,111,224,186,13,172,21,+13,185,224,231,109,74,187,0,163,65,240,154,89,125,245,148,112,116,49,51,+54,146,220,230,214,195,147,237,239,20,126,79,85,244,143,27,217,22,239,101,+88,61,177,170,51,53,100,105,92,226,207,194,13,76,27,30,85,157,210,244,+69,233,107,178,131,184,254,4,157,202,125,79,239,158,88,206,125,71,209,152,+111,213,103,39,206,233,171,176,22,94,178,121,70,183,25,49,212,11,150,121,+101,127,30,160,134,1,136,134,214,2,128,161,194,167,82,255,70,64,186,151,+58,1,50,77,11,118,1,32,23,227,26,202,123,122,44,245,115,236,199,74,+38,59,39,58,40,81,247,252,11,112,36,214,139,145,173,149,208,81,205,57,+81,73,56,136,131,29,28,50,167,60,134,242,20,216,151,72,250,188,196,186,+42,240,215,129,98,53,133,176,38,41,224,17,74,149,228,245,53,38,172,146,+37,23,85,81,81,35,218,87,186,156,215,85,113,59,74,63,34,186,224,250,+20,66,201,25,200,163,34,55,50,6,86,228,226,245,213,255,40,87,212,245,+134,49,57,5,199,102,117,171,212,63,112,246,168,109,219,107,57,87,123,95,+74,212,22,181,74,227,150,47,26,127,124,254,206,236,45,149,31,27,174,85,+93,48,137,71,194,118,192,169,0,183,47,238,26,47,233,217,217,10,136,54,+187,188,69,242,95,34,20,10,195,135,237,24,131,154,60,68,255,194,74,25,+161,12,51,58,111,242,59,193,186,244,34,166,85,40,207,39,26,18,191,205,+34,44,80,102,242,170,85,38,103,146,48,18,136,148,21,185,107,60,19,34,+167,214,69,252,219,185,69,114,88,246,69,37,241,152,74,206,2,137,201,8,+182,168,14,246,181,239,187,106,4,118,251,24,28,84,117,2,208,120,13,83,+109,126,88,184,139,175,241,125,44,84,139,108,153,123,49,255,194,86,149,153,+103,211,92,41,111,17,194,164,204,30,28,136,31,105,244,91,29,77,15,199,+19,192,161,101,121,173,136,94,115,171,146,63,157,126,118,107,27,157,213,71,+250,112,31,218,4,220,24,254,21,114,143,103,35,37,103,188,146,38,231,178,+53,175,88,161,60,153,11,239,131,192,135,185,185,92,18,227,37,105,34,150,+213,140,24,10,188,215,26,133,111,246,67,40,114,201,6,224,238,204,4,236,+47,182,50,1,36,101,219,61,241,157,46,110,104,105,70,169,21,203,44,233,+200,89,38,189,74,227,239,240,104,255,32,254,130,88,177,150,137,234,218,164,+250,153,62,34,81,78,53,162,181,23,39,78,79,214,169,128,244,209,165,239,+152,139,48,232,116,110,253,56,196,201,7,37,124,15,89,146,136,233,224,43,+254,149,48,213,144,217,11,251,206,22,139,202,91,5,15,97,47,66,131,71,+143,194,224,164,161,109,176,202,43,128,153,140,242,31,13,159,107,66,3,36,+132,32,88,193,55,79,202,73,39,173,5,11,165,29,170,37,158,235,200,168,+206,205,97,11,75,183,77,40,77,45,5,125,58,195,154,234,37,238,59,79,+225,148,156,74,163,138,100,153,97,145,194,236,229,136,23,39,93,87,64,79,+52,114,121,206,244,216,60,157,25,223,42,33,89,218,173,55,162,38,87,215,+85,36,42,222,17,64,46,5,100,102,226,217,21,56,179,226,24,26,206,231,+209,198,47,45,249,168,121,179,38,39,40,229,126,93,249,239,25,5,98,76,+63,77,216,40,2,194,105,247,216,119,186,36,90,3,219,202,109,88,146,104,+140,4,172,154,93,238,49,150,96,147,241,247,195,108,187,184,144,24,169,59,+245,1,112,251,54,215,171,145,73,3,207,184,58,27,121,0,83,112,82,6,+238,21,17,43,212,140,234,140,4,228,5,18,156,232,92,17,64,97,237,148,+150,90,114,30,237,226,0,168,203,42,68,204,236,171,144,253,243,110,75,182,+47,249,204,119,191,99,221,221,160,146,173,73,212,59,63,100,207,136,9,13,+113,156,113,165,134,215,233,33,189,167,168,50,134,220,59,222,188,63,226,69,+156,87,235,98,59,120,51,209,193,213,90,97,181,145,162,73,121,15,7,254,+99,43,95,230,204,247,176,104,160,243,73,42,98,15,225,32,147,118,250,101,+87,174,11,171,225,240,156,213,74,3,247,152,219,236,236,152,159,236,162,172,+51,178,193,27,116,135,64,242,237,73,93,154,143,223,118,171,75,213,29,133,+9,87,199,86,51,252,157,97,104,47,27,48,159,236,22,127,172,125,59,87,+255,140,141,119,35,200,238,250,30,152,187,137,69,101,99,129,129,207,159,93,+206,229,51,151,10,217,29,208,111,2,121,192,195,9,76,21,185,67,107,18,+133,114,60,33,89,229,0,255,252,141,79,135,87,242,193,75,137,216,101,45,+197,121,18,200,152,105,104,220,153,139,138,58,59,34,79,35,146,66,109,237,+211,6,235,219,228,127,252,71,26,140,52,179,174,163,181,58,144,249,239,138,+119,44,158,137,245,197,55,60,19,231,182,210,117,113,143,233,80,121,67,149,+145,247,251,50,100,172,139,213,69,226,194,44,30,48,93,44,207,129,91,169,+14,75,36,141,101,15,216,35,139,85,144,170,209,97,40,70,221,211,41,71,+92,6,92,162,248,149,198,107,195,20,195,224,1,147,7,68,219,32,82,223,+237,86,205,208,134,174,75,140,138,4,104,22,61,64,129,151,0,168,244,86,+141,175,157,202,187,153,36,69,35,28,17,211,155,92,181,56,50,176,56,238,+82,5,194,75,0,67,165,137,86,204,176,15,93,41,53,210,171,104,159,196,+37,146,57,225,69,175,129,209,157,84,27,119,6,103,157,74,186,57,221,21,+176,235,64,190,128,135,99,92,5,16,219,72,47,162,161,211,228,87,105,32,+19,103,16,15,254,3,129,54,24,148,81,68,56,112,227,98,178,98,137,149,+251,173,228,183,95,255,115,169,4,216,150,111,132,43,132,167,160,245,228,75,+202,8,83,195,169,18,251,101,214,49,61,128,2,195,195,225,146,251,25,19,+75,134,226,118,209,252,238,110,101,21,249,74,152,194,165,7,117,67,64,21,+117,83,146,26,202,174,239,175,7,183,225,111,12,73,235,82,1,220,117,217,+165,233,254,60,52,220,60,20,37,231,195,155,150,55,45,5,17,234,236,178,+217,178,28,250,150,116,200,247,15,183,229,220,227,27,54,232,104,76,9,103,+10,191,75,48,144,121,214,77,154,74,7,233,184,225,96,158,134,244,1,219,+231,14,90,81,244,90,67,206,63,128,123,97,154,98,246,227,197,235,17,111,+122,94,186,251,22,57,132,209,94,228,56,2,133,238,61,141,6,112,38,209,+99,162,19,43,30,253,100,22,125,191,8,6,134,5,74,242,187,192,232,39,+175,130,42,72,204,54,67,150,142,25,219,72,236,194,61,164,224,190,189,113,+149,60,17,92,204,34,47,9,136,146,173,62,36,229,101,48,161,144,81,239,+118,39,5,130,242,113,112,142,128,72,237,81,239,38,151,211,73,26,255,173,+168,212,210,213,83,156,155,35,241,246,114,117,248,58,100,11,39,163,74,208,+10,138,23,155,238,62,15,252,42,138,196,183,151,35,180,179,94,91,39,148,+66,134,6,144,97,69,185,22,167,82,116,74,23,208,102,72,54,242,17,233,+61,248,170,30,0,44,62,229,181,28,93,21,155,93,247,224,63,254,89,250,+108,159,202,99,126,0,67,230,60,180,226,112,253,165,8,224,216,107,236,71,+129,127,80,152,44,41,54,27,197,171,8,187,203,90,42,3,185,35,204,184,+77,241,254,184,197,193,17,133,22,2,234,147,51,106,107,102,222,113,138,244,+22,225,172,131,220,211,41,10,134,237,147,116,204,55,152,130,77,150,191,11,+33,121,26,165,203,55,243,204,198,13,142,17,196,0,196,221,69,147,61,217,+242,251,243,189,156,129,222,153,214,110,63,200,142,13,147,19,72,135,254,192,+86,61,43,203,32,38,187,177,63,17,151,42,46,148,232,0,58,214,252,188,+66,119,246,50,87,24,65,152,99,244,240,36,100,5,48,0,55,219,130,42,+93,138,149,90,17,94,122,85,132,210,246,29,208,177,233,122,39,208,19,56,+220,109,145,236,40,163,91,115,204,202,26,78,159,32,181,108,216,202,144,197,+155,239,20,121,51,235,68,200,245,197,97,86,233,89,223,139,179,107,217,99,+154,123,249,92,3,246,195,252,252,2,167,244,81,153,10,243,191,3,57,36,+178,51,12,231,144,151,67,97,246,160,146,184,150,26,9,40,70,84,220,135,+111,243,102,2,10,21,181,23,133,133,21,242,52,164,50,16,179,4,230,10,+153,116,160,197,159,101,1,73,22,16,175,240,237,27,224,107,197,248,11,17,+41,52,44,187,128,9,51,221,225,122,104,37,118,200,243,84,250,6,154,57,+13,101,139,254,119,49,234,166,73,86,122,139,128,27,253,122,113,219,111,76,+14,14,44,56,122,201,21,72,98,93,98,177,212,250,34,254,96,73,154,81,+200,215,104,73,145,156,201,51,40,129,165,113,200,57,119,160,139,152,233,69,+254,159,30,152,136,67,231,115,240,27,208,147,99,183,229,120,144,125,59,78,+238,223,243,101,37,171,213,31,10,17,153,11,247,115,154,110,104,224,128,116,+85,140,116,195,184,137,136,94,79,9,232,19,239,82,204,195,253,207,143,60,+172,173,151,2,188,219,58,59,222,153,90,148,198,156,105,110,5,61,201,245,+146,122,23,194,94,69,162,29,125,207,188,126,123,93,168,39,3,183,38,226,+246,229,108,66,152,26,29,231,214,227,77,178,121,204,201,89,207,114,105,206,+17,54,89,204,49,163,166,35,116,84,37,105,75,238,95,121,84,245,31,13,+234,149,216,223,111,222,108,115,195,46,171,232,186,60,189,240,152,138,82,150,+182,24,105,110,162,182,254,91,216,150,45,225,149,251,172,69,139,182,61,135,+140,192,140,96,152,130,79,90,252,242,191,70,91,45,103,32,42,209,91,81,+19,202,91,40,93,126,189,92,188,214,183,244,255,146,199,49,157,77,79,106,+159,132,61,51,190,190,35,84,189,153,249,92,219,102,114,184,34,72,125,135,+247,169,255,226,150,159,178,191,19,222,87,91,24,62,37,91,37,34,21,108,+165,197,34,209,78,91,97,232,246,227,232,238,119,54,148,7,63,246,94,117,+19,238,176,130,188,97,180,86,83,194,79,45,195,255,129,82,196,31,192,235,+152,232,1,57,119,25,115,241,122,229,30,11,180,149,192,198,181,178,0,121,+93,120,199,26,222,11,117,216,222,133,206,179,121,42,208,50,150,42,221,4,+183,243,49,4,59,253,150,193,58,117,151,77,155,116,11,0,0,37,80,91,+176,253,51,65,155,189,179,226,231,116,112,62,221,10,6,117,3,63,0,185,+255,210,15,237,149,222,124,217,59,193,197,189,248,6,124,176,94,237,137,142,+79,241,237,63,159,119,45,144,175,30,7,27,98,187,183,203,109,255,29,202,+77,9,189,135,90,237,137,106,106,239,228,108,147,33,110,103,91,182,6,187,+252,118,14,63,208,49,46,253,245,195,134,245,1,175,177,129,227,29,166,116,+209,245,68,179,217,218,36,42,113,61,244,111,6,111,206,95,103,9,211,34,+175,227,189,253,24,170,6,138,168,245,171,209,71,216,187,235,245,224,200,83,+26,219,80,210,212,81,120,215,165,111,173,110,8,78,162,0,120,90,70,72,+36,20,68,177,158,105,164,194,111,90,55,171,119,149,16,98,102,31,206,59,+254,187,179,176,112,224,10,165,80,177,37,207,217,99,16,136,187,97,58,3,+96,112,135,139,139,180,131,79,123,53,42,47,149,156,86,16,127,195,58,214,+36,209,37,131,38,110,201,164,190,14,186,107,114,244,6,88,41,223,86,232,+188,250,153,61,162,155,220,229,142,145,243,212,56,59,202,154,154,97,159,115,+106,89,125,99,215,190,97,249,253,78,149,109,76,234,85,188,220,136,143,214,+16,58,136,76,17,162,36,51,65,77,239,149,240,102,120,235,145,30,4,8,+232,26,50,59,60,164,99,34,85,226,236,252,232,101,156,133,223,162,253,199,+140,132,130,220,192,123,247,207,217,34,71,112,158,54,36,150,63,2,218,218,+47,83,142,89,158,215,74,152,107,142,175,175,76,200,193,150,210,121,90,89,+75,34,80,179,197,172,20,55,147,93,114,196,86,11,161,239,97,65,104,229,+203,89,19,204,178,44,42,163,230,85,62,34,178,133,33,26,21,193,224,16,+119,210,231,185,69,253,197,228,220,81,146,96,83,79,210,95,164,60,158,174,+43,103,74,255,252,225,17,83,230,240,72,133,130,253,122,196,217,112,214,212,+8,197,239,79,133,152,42,166,204,60,196,48,192,235,210,97,45,232,6,213,+193,216,168,194,124,84,5,158,123,59,190,99,16,41,40,156,117,137,159,154,+155,222,199,32,20,230,51,82,146,167,28,167,101,43,217,222,131,67,79,119,+147,60,127,44,19,36,19,157,32,137,17,104,209,194,169,89,136,104,61,154,+206,154,95,62,195,69,230,107,105,151,215,18,122,46,34,145,116,75,32,253,+32,231,142,28,137,8,197,33,172,48,116,165,145,9,156,145,30,158,198,0,+249,26,249,236,112,224,206,4,164,126,65,80,6,157,148,223,145,104,241,193,+46,79,13,24,151,19,63,65,141,240,194,102,29,92,181,58,254,221,102,44,+224,124,191,199,125,229,108,42,182,196,14,109,193,184,168,45,192,239,243,237,+224,159,160,22,248,60,147,137,186,160,62,96,96,17,83,158,150,91,103,248,+234,194,206,65,38,209,112,240,244,14,104,217,121,8,96,194,116,176,149,105,+179,249,180,77,146,165,81,173,50,174,112,245,199,235,231,99,87,44,156,107,+69,235,243,70,7,136,124,40,116,137,198,89,152,34,67,155,231,118,160,146,+32,107,210,74,213,43,238,9,167,211,20,123,68,239,207,130,206,125,182,15,+116,252,8,32,183,103,146,253,58,105,193,136,81,196,94,127,46,163,121,131,+63,52,175,177,217,40,125,231,103,155,204,93,99,3,156,189,71,48,159,116,+44,125,232,132,111,215,185,166,235,73,52,28,148,54,147,4,120,177,174,92,+218,11,223,187,50,211,8,82,58,214,244,93,183,127,22,60,151,61,149,152,+151,53,68,175,75,61,87,107,202,214,89,168,100,177,251,79,67,185,10,7,+87,32,2,38,161,215,244,231,170,29,216,146,27,101,120,228,251,44,213,158,+83,255,215,215,242,134,227,235,1,244,45,190,127,39,126,138,242,104,74,129,+200,181,149,245,8,112,135,157,42,20,33,170,217,138,49,27,255,99,119,233,+44,251,243,6,196,226,59,1,164,187,213,175,1,118,29,133,26,138,134,3,+254,29,148,113,70,139,31,253,195,91,104,135,201,89,23,201,164,39,158,39,+33,65,187,165,10,79,90,251,154,190,166,229,192,249,213,35,35,250,159,113,+38,207,193,208,144,55,5,96,60,190,33,220,66,206,221,54,11,188,52,174,+40,142,99,71,249,18,5,7,117,126,164,231,234,73,154,26,121,206,183,133,+57,129,239,195,40,140,145,17,51,178,251,132,177,49,143,143,46,65,28,76,+249,74,181,147,175,119,24,38,37,148,57,85,196,18,61,227,255,249,217,92,+13,248,225,125,4,91,157,242,159,216,155,70,199,198,14,196,48,21,134,14,+217,249,193,50,189,212,208,217,56,95,33,120,165,184,156,99,220,130,255,117,+249,113,36,111,231,231,148,248,241,0,241,21,66,18,13,26,97,26,74,214,+75,48,247,183,215,111,108,116,43,104,20,121,72,46,235,151,154,243,71,129,+189,246,184,98,50,221,174,12,191,77,115,126,193,151,1,80,115,86,59,102,+248,50,134,56,90,21,212,234,73,129,60,71,166,238,121,20,189,50,57,193,+25,223,189,212,141,176,29,130,96,164,17,36,162,24,77,136,6,133,97,130,+125,192,57,4,173,232,13,119,66,157,83,147,133,2,20,217,92,100,233,64,+166,211,77,0,131,226,94,250,244,236,241,8,10,241,144,202,91,86,107,245,+99,235,184,66,93,168,116,113,92,168,119,93,185,204,106,106,133,198,228,224,+30,77,169,107,198,116,222,6,46,170,36,221,13,6,147,212,24,48,207,184,+2,148,81,30,117,146,7,84,8,214,242,76,173,116,255,87,94,206,160,64,+124,120,168,236,135,34,165,59,102,146,239,148,140,243,165,116,99,136,246,190,+149,142,173,172,200,65,0,141,127,134,110,27,3,17,168,244,51,253,209,41,+80,237,229,43,123,236,249,21,98,33,56,219,192,50,230,102,88,234,148,170,+204,81,225,64,246,54,54,36,192,123,189,203,202,76,151,97,131,246,168,172,+83,125,91,46,185,71,71,147,27,77,67,209,143,89,96,234,255,191,248,6,+89,123,191,164,232,129,74,34,201,247,159,255,181,127,51,113,6,98,45,220,+78,205,107,8,31,13,65,17,198,41,51,126,251,5,197,200,205,61,39,164,+128,196,216,73,76,207,41,39,75,252,61,127,93,27,145,90,25,128,197,238,+44,165,39,24,219,213,19,5,114,53,143,161,78,192,145,77,49,126,128,193,+176,28,98,42,1,17,171,189,37,82,183,8,159,246,29,90,126,228,212,195,+37,146,128,31,249,50,225,245,242,226,157,20,89,94,135,158,191,127,35,170,+112,235,28,90,208,220,49,196,127,236,224,242,180,3,226,87,255,129,236,90,+223,150,171,241,16,89,153,178,13,33,46,149,131,39,195,88,34,131,117,204,+125,136,137,5,121,76,20,37,194,159,82,243,212,74,21,32,81,15,54,239,+44,142,114,245,204,50,188,90,37,9,143,249,254,116,3,233,37,166,7,79,+37,53,204,166,11,139,25,131,24,64,5,26,19,111,135,182,12,99,135,219,+73,120,35,98,198,15,77,80,97,18,127,44,146,166,124,27,13,209,180,145,+163,42,118,232,207,125,215,201,64,33,28,247,53,82,24,148,173,193,172,222,+238,205,28,145,101,183,29,71,65,105,112,50,126,35,36,28,72,156,134,92,+39,139,130,25,62,63,173,80,174,56,234,212,99,115,24,173,108,95,241,23,+164,70,150,34,62,58,226,137,158,159,187,240,39,180,177,56,145,190,59,36,+29,223,11,23,210,208,135,24,248,83,239,208,127,152,56,192,156,220,221,108,+240,189,24,75,106,25,155,253,74,83,84,112,205,217,115,192,5,96,83,11,+239,33,84,115,59,24,0,86,220,147,232,162,62,15,91,95,105,33,48,24,+148,161,128,57,20,61,29,1,94,125,75,46,177,100,153,36,231,80,85,96,+235,111,69,81,96,126,168,146,38,247,178,42,2,195,92,213,146,106,56,103,+129,252,64,217,20,159,222,123,81,253,185,209,133,28,144,125,209,133,111,113,+30,66,21,14,232,249,36,227,35,15,124,232,119,217,54,197,192,27,235,186,+182,152,31,225,168,123,48,253,131,165,134,4,214,14,203,207,213,64,107,30,+118,121,35,231,198,205,103,43,37,30,205,69,167,140,62,197,7,81,146,249,+52,83,235,16,183,212,217,245,196,34,255,48,208,39,167,241,79,138,179,133,+117,67,148,51,169,27,80,144,180,64,180,12,10,138,228,10,29,141,113,182,+37,219,142,30,212,217,82,93,137,207,96,117,119,15,8,43,24,151,65,127,+149,121,110,217,18,55,121,182,242,9,182,0,206,178,242,27,187,62,90,148,+130,131,137,133,18,222,71,67,211,134,255,3,116,4,28,100,133,143,110,94,+157,72,50,83,28,248,230,231,252,132,60,218,113,6,72,200,16,193,223,3,+215,177,16,46,37,9,207,238,246,166,121,171,82,196,176,144,236,76,231,128,+82,126,176,47,222,206,104,123,36,209,5,9,81,248,78,110,226,65,38,175,+241,130,186,166,173,74,242,178,205,148,220,130,166,247,143,116,237,221,227,22,+86,31,155,168,34,180,244,93,200,250,0,97,38,161,121,246,203,22,3,192,+141,43,82,58,25,172,23,237,164,88,67,169,221,121,21,57,137,62,79,49,+164,13,7,16,123,235,248,86,105,254,3,203,57,95,76,24,126,75,180,20,+34,8,63,119,195,144,235,102,167,180,178,155,141,249,133,254,62,48,84,176,+12,208,84,201,192,255,157,171,245,95,167,92,252,142,226,233,146,232,81,255,+158,8,78,129,213,82,154,178,22,34,78,106,127,162,94,207,193,98,112,85,+122,12,234,119,41,185,244,41,123,217,190,193,52,51,168,82,137,53,148,223,+80,202,255,120,212,51,193,206,247,11,178,179,32,30,2,154,139,237,205,68,+190,67,142,91,74,93,250,147,29,226,0,214,161,23,105,219,236,225,105,13,+164,124,251,43,120,58,230,190,51,237,54,78,35,48,130,99,149,109,114,150,+94,93,27,138,12,225,86,123,15,83,151,54,53,99,83,82,171,83,225,208,+218,93,87,123,8,65,223,54,251,189,183,85,222,197,179,78,239,132,21,144,+8,95,5,253,85,208,245,63,28,12,190,115,242,34,139,20,169,28,177,104,+87,254,239,51,162,85,57,31,52,234,172,102,63,64,168,4,175,26,102,86,+167,4,197,85,213,201,162,250,147,186,191,241,81,97,9,196,185,199,241,84,+193,232,219,159,7,208,146,114,131,155,161,238,1,120,191,240,92,244,49,233,+75,217,64,37,51,57,154,224,77,242,236,214,92,133,176,203,145,80,186,182,+210,42,69,108,157,240,216,42,155,127,199,40,165,45,160,50,248,173,50,180,+214,138,151,150,38,211,83,252,42,35,38,69,83,235,132,149,62,165,28,152,+91,168,155,230,49,59,109,57,179,91,215,150,155,222,153,62,102,102,117,29,+118,44,72,40,221,178,237,28,159,233,8,61,195,216,96,53,224,222,73,174,+65,244,235,117,200,46,158,17,103,189,82,23,77,226,106,141,41,249,238,46,+195,103,66,80,72,165,63,43,34,98,195,147,37,84,198,148,30,90,144,249,+63,21,162,60,238,133,90,82,217,150,117,92,248,252,142,7,181,201,29,109,+184,149,197,85,186,175,38,140,213,125,172,236,172,239,168,60,19,228,159,99,+150,175,38,227,35,236,70,6,101,147,220,1,180,113,120,95,217,228,251,152,+23,171,7,124,203,147,67,3,212,61,55,88,79,58,243,89,94,246,43,61,+135,31,80,161,223,235,254,35,145,161,172,185,115,52,172,25,159,86,125,102,+184,252,253,212,39,26,231,111,99,246,248,239,154,183,143,119,37,66,30,127,+92,112,255,111,8,36,107,155,169,220,57,12,208,31,161,26,68,39,200,158,+158,222,183,241,220,137,132,156,67,24,213,214,168,145,155,195,128,156,140,194,+245,138,72,253,213,171,134,16,120,186,205,34,161,126,218,195,223,2,236,108,+228,252,131,122,125,186,218,86,162,28,49,139,152,189,146,246,22,233,53,163,+208,54,112,71,43,195,24,103,115,127,19,105,200,120,55,169,214,162,19,132,+101,126,169,18,239,51,245,15,180,240,218,253,243,226,118,43,57,155,243,72,+130,73,176,29,195,75,81,245,192,212,158,247,96,36,14,178,212,95,98,169,+170,251,246,225,184,40,118,163,210,226,131,221,39,243,233,181,234,190,168,149,+249,19,143,4,118,195,153,127,64,178,4,35,35,35,163,138,132,106,163,13,+13,230,147,227,155,24,228,12,201,48,176,217,145,6,162,244,153,139,186,188,+56,61,60,4,82,13,127,144,243,196,147,211,211,205,149,225,14,31,244,218,+173,56,14,221,24,213,196,247,140,56,52,149,136,77,37,202,91,88,110,126,+19,185,96,31,159,52,98,155,110,194,217,14,177,211,183,112,3,146,226,207,+188,83,216,128,35,156,33,152,114,155,20,141,159,67,19,95,15,51,120,189,+254,20,193,123,248,88,235,87,4,165,89,167,226,86,147,4,26,199,174,72,+231,6,35,119,219,140,52,87,213,56,199,182,70,104,182,54,49,169,228,168,+167,76,219,130,152,236,105,151,248,102,27,24,81,242,170,80,167,120,107,145,+17,35,89,64,45,138,20,189,133,248,76,145,8,69,79,102,180,117,165,80,+91,98,75,120,106,45,239,77,86,84,37,247,174,243,245,130,233,16,25,106,+137,194,241,127,133,139,31,203,35,180,28,208,131,206,83,101,194,117,46,56,+193,134,31,124,40,106,170,188,25,12,131,44,72,244,171,10,153,1,17,100,+32,149,115,67,120,154,56,29,198,118,114,3,113,29,30,5,175,241,7,38,+244,132,210,15,79,40,150,222,243,209,130,211,189,197,102,210,236,192,102,255,+70,235,34,92,71,15,186,230,203,187,31,109,131,162,185,242,8,21,49,248,+215,200,225,158,49,86,188,97,24,12,26,166,174,161,194,161,189,131,136,24,+198,54,125,76,30,171,88,24,1,220,189,253,45,9,86,105,50,212,28,50,+103,135,36,31,179,96,26,155,0,114,167,27,165,44,66,142,15,22,170,47,+140,247,77,63,52,106,206,42,176,255,254,112,155,11,188,16,198,123,230,62,+144,32,26,235,116,1,141,254,145,177,21,218,134,12,223,16,113,57,3,84,+214,194,0,13,150,203,211,95,117,14,243,231,50,14,77,44,42,109,182,137,+183,218,54,29,233,9,121,117,59,57,31,143,79,144,140,4,103,107,127,27,+98,232,161,203,240,67,255,67,25,183,127,227,36,180,55,15,137,141,46,170,+121,208,255,158,126,223,13,201,153,137,126,173,118,25,234,158,40,20,39,7,+194,82,242,223,220,100,93,204,243,182,8,184,136,119,3,184,168,210,63,107,+6,139,46,135,179,57,238,131,190,130,6,30,84,105,201,148,25,177,52,41,+176,192,42,20,50,33,14,252,95,170,102,223,167,176,153,179,78,247,70,201,+122,149,14,172,77,178,163,35,249,178,246,174,4,251,238,62,235,253,130,255,+226,141,243,227,109,227,11,62,144,80,149,162,35,106,103,137,135,82,50,139,+76,140,15,83,55,35,195,133,166,229,110,165,146,197,29,247,210,199,98,186,+106,226,144,66,117,14,84,138,225,73,191,239,111,37,63,112,74,145,91,245,+145,142,166,168,97,102,217,125,134,165,212,157,67,216,41,31,152,74,232,97,+22,179,41,155,116,4,72,37,255,181,16,193,154,29,123,171,28,89,146,156,+170,177,122,32,157,141,80,245,83,182,122,54,106,221,118,168,230,46,122,239,+122,122,68,209,20,21,68,170,158,142,178,242,74,3,88,193,37,206,171,209,+249,161,2,127,123,231,48,75,156,235,6,125,41,114,51,255,177,117,36,70,+245,25,248,239,248,40,124,61,113,193,53,156,67,96,234,104,46,35,214,184,+169,240,159,83,37,1,251,15,151,51,153,108,13,63,29,183,160,159,252,93,+15,37,79,23,17,74,150,139,61,75,82,185,247,106,64,129,199,25,73,171,+117,60,200,171,189,13,82,149,63,222,75,40,78,193,245,104,68,227,249,233,+96,58,119,69,188,29,159,241,206,32,51,5,174,211,241,233,165,119,131,120,+1,70,120,27,179,147,34,14,243,21,25,122,243,128,26,122,186,72,199,189,+48,37,206,81,213,139,182,163,62,190,61,235,62,240,33,127,184,57,183,96,+51,35,85,102,3,97,31,79,205,73,233,18,34,10,54,16,69,250,186,109,+69,40,99,178,215,113,203,213,127,104,236,199,245,229,168,0,14,115,155,146,+237,156,153,38,102,8,168,179,234,101,56,157,133,210,151,163,85,7,85,110,+179,160,55,63,45,41,137,199,31,176,105,226,238,67,101,217,146,92,10,151,+210,76,21,96,37,242,170,190,210,223,215,65,165,99,202,49,178,69,12,209,+52,43,22,22,175,14,70,12,16,100,140,44,9,85,26,206,67,172,195,234,+169,97,144,85,139,224,35,105,190,159,138,135,221,208,76,182,222,194,19,178,+76,38,170,55,107,96,248,168,137,125,198,222,120,124,176,3,42,77,16,199,+243,79,196,124,37,49,41,184,230,115,98,92,34,115,50,158,125,96,81,252,+34,43,241,155,134,232,237,122,135,218,181,45,243,85,85,104,98,218,135,153,+86,108,50,83,26,2,52,140,192,132,6,104,179,50,151,131,151,7,215,229,+252,20,131,213,246,242,241,173,19,207,138,165,100,77,67,222,142,48,32,49,+117,8,253,60,190,155,225,205,207,55,10,193,18,151,156,67,13,210,26,135,+41,102,139,40,255,20,189,117,53,172,75,76,61,69,153,229,43,131,224,111,+68,23,234,220,108,244,159,52,156,248,53,195,138,214,65,183,165,136,6,184,+234,89,164,130,46,190,110,139,47,170,187,149,146,33,26,247,26,3,135,126,+197,80,90,252,182,103,34,60,59,134,39,189,147,211,88,9,162,157,102,221,+243,64,71,183,26,18,9,101,142,120,130,60,7,18,110,37,48,102,89,79,+8,222,158,24,248,109,186,177,139,76,163,70,138,134,174,9,52,181,93,213,+61,170,2,198,69,125,111,114,60,76,248,121,176,50,98,180,188,46,92,49,+134,104,9,238,140,40,151,103,204,18,214,222,48,66,251,194,6,225,181,169,+58,55,220,235,253,215,169,208,13,194,85,43,223,111,0,67,118,9,249,142,+127,227,66,20,52,172,110,99,251,105,118,90,242,39,179,85,96,197,19,4,+66,92,168,0,193,4,55,250,87,198,222,164,46,210,196,89,74,113,125,170,+121,43,85,202,63,230,206,113,104,140,56,170,153,107,191,65,249,161,193,224,+208,19,50,121,185,171,58,240,0,125,24,68,220,172,41,64,150,213,62,183,+137,113,182,187,142,203,191,68,221,169,36,171,87,220,67,164,38,100,167,74,+253,24,211,5,19,79,85,30,169,99,76,135,10,44,35,23,247,142,227,36,+177,214,98,209,32,231,160,216,48,255,71,24,32,41,50,150,132,185,240,238,+84,124,244,29,236,185,159,179,40,29,168,233,142,140,4,41,31,49,201,130,+154,5,67,13,249,140,6,255,93,220,206,143,253,98,12,52,140,228,24,76,+255,142,71,216,171,111,143,64,159,200,94,22,133,155,167,14,49,95,4,148,+76,40,26,161,84,246,84,180,241,177,212,251,19,215,197,84,5,157,140,87,+138,230,105,132,249,139,218,119,155,153,160,109,25,117,254,54,13,24,203,135,+78,233,59,105,157,68,88,75,192,179,147,101,93,37,186,173,205,54,129,208,+231,225,59,57,69,229,87,61,141,118,51,218,162,86,208,30,51,76,111,241,+115,20,147,145,203,20,138,127,236,109,34,213,138,213,36,245,87,51,250,215,+251,242,29,6,22,85,136,51,249,243,229,97,61,198,27,23,176,69,27,159,+205,145,243,195,225,145,8,22,46,73,65,154,156,134,160,116,157,206,66,211,+140,14,200,115,207,120,84,251,53,145,249,56,141,147,42,223,189,68,159,251,+34,49,179,233,159,149,37,233,223,248,78,27,39,12,10,234,29,189,131,212,+91,208,37,8,67,191,35,115,80,27,214,103,214,195,120,145,194,128,51,180,+98,249,113,144,4,243,37,177,25,55,116,151,81,89,8,54,244,34,163,237,+17,18,56,160,132,10,213,191,138,130,251,51,83,225,94,179,114,206,41,236,+68,163,108,43,123,193,129,130,156,77,139,216,36,42,153,14,127,56,192,137,+137,120,31,34,31,41,187,105,240,38,104,57,196,216,86,89,230,139,234,40,+203,75,42,218,243,104,4,254,122,152,188,241,161,143,97,42,145,224,23,152,+214,30,73,52,34,198,216,3,220,144,165,97,97,202,210,53,210,35,75,159,+234,197,162,91,148,50,222,23,15,3,204,242,115,51,55,34,62,106,155,140,+80,149,193,97,55,138,0,200,71,252,123,56,72,156,11,208,236,52,115,57,+226,154,155,164,132,78,167,236,215,129,202,202,191,72,23,26,101,175,242,241,+14,88,111,140,69,96,179,76,11,238,114,171,105,38,16,27,32,116,175,105,+199,171,203,15,185,136,228,243,190,86,94,225,27,204,78,16,1,235,88,230,+218,145,181,83,148,250,46,188,6,13,36,200,84,68,104,200,33,127,86,195,+94,3,199,123,108,63,52,190,124,153,241,38,189,227,243,144,160,139,143,79,+196,200,14,22,179,91,172,132,20,222,238,193,164,150,168,61,143,174,34,104,+71,201,83,104,47,37,191,175,242,43,239,25,196,112,188,60,118,226,24,250,+10,219,228,207,163,112,225,172,110,101,119,248,188,67,79,50,71,247,227,122,+216,220,166,210,249,58,233,220,112,72,118,49,8,22,184,72,57,52,89,60,+36,157,192,98,165,9,80,131,163,79,18,118,196,165,171,15,42,242,180,88,+90,143,104,58,144,115,57,241,163,173,201,196,131,99,39,155,214,69,94,146,+69,112,158,100,0,190,241,53,29,155,139,102,35,147,169,95,89,153,199,16,+185,160,157,235,79,174,100,170,69,7,56,1,196,67,223,240,117,102,209,156,+156,30,60,57,18,204,44,166,183,185,2,116,148,219,17,38,21,166,95,60,+205,82,199,105,254,12,125,214,190,229,244,51,131,209,234,216,220,221,92,95,+114,21,213,10,171,212,238,200,43,9,196,81,191,45,255,240,75,175,224,74,+164,25,45,11,68,175,155,35,123,23,252,90,211,34,217,177,181,125,9,255,+119,59,248,0,35,175,83,103,115,97,162,144,253,13,43,17,235,202,182,139,+127,242,240,9,158,194,60,36,118,156,30,140,128,48,203,224,240,121,82,77,+245,248,137,136,70,142,200,102,149,38,239,6,255,58,82,65,29,123,118,234,+246,27,5,129,240,170,169,187,148,88,62,109,26,165,246,20,65,164,223,231,+154,155,52,17,152,153,110,246,79,187,43,212,44,6,47,233,251,206,60,90,+45,113,75,210,74,25,246,101,140,211,235,87,252,199,240,72,51,191,106,174,+136,13,225,218,74,11,91,55,97,106,138,239,66,45,117,103,207,159,52,65,+202,17,112,191,160,68,216,145,69,166,254,162,253,81,43,9,224,53,40,98,+195,57,42,3,34,64,84,73,252,15,169,245,174,178,155,94,61,221,127,147,+171,211,253,115,140,37,113,231,84,67,35,104,172,157,224,90,102,6,255,93,+234,78,177,180,198,175,163,117,238,11,203,243,206,43,112,181,159,144,152,30,+231,4,185,252,106,220,243,162,0,102,93,24,226,149,101,106,71,76,142,44,+50,240,223,111,55,71,7,143,136,77,152,8,209,206,23,0,88,32,188,81,+233,250,0,42,37,89,173,249,158,11,41,239,236,242,0,120,15,62,48,74,+33,6,159,22,102,189,134,97,192,103,20,202,1,54,253,163,0,122,58,73,+73,231,23,163,88,134,243,51,74,112,43,155,78,161,209,170,78,28,70,16,+217,162,187,170,164,31,254,10,237,182,19,5,230,132,4,223,218,58,206,85,+218,174,1,171,142,214,153,176,127,220,218,227,74,106,140,200,191,172,64,200,+246,122,246,157,64,175,251,128,152,137,137,82,237,4,75,128,80,84,42,127,+58,102,196,48,54,178,137,0,28,82,44,34,18,92,165,1,107,6,95,11,+23,236,81,15,132,129,70,58,158,83,83,103,211,87,255,189,32,43,96,180,+32,242,157,153,62,211,52,104,208,0,123,109,17,72,55,158,238,54,211,84,+140,80,136,51,206,86,206,217,232,112,237,80,244,140,208,210,173,12,206,185,+177,59,122,225,103,241,246,185,71,78,146,71,20,113,24,63,102,88,107,164,+74,223,91,137,222,125,4,163,22,114,111,13,78,238,176,21,66,7,99,19,+108,141,136,253,130,17,161,129,230,17,46,11,45,58,97,250,32,208,237,231,+76,255,84,204,223,245,125,67,141,99,206,50,108,108,217,215,121,221,116,121,+34,196,231,70,20,16,0,106,73,157,144,51,100,29,28,183,96,88,92,129,+203,220,242,111,227,125,108,189,202,27,233,182,223,236,242,233,145,213,82,134,+135,176,131,177,190,0,46,111,211,17,198,168,23,7,183,90,68,171,21,220,+221,28,77,124,102,218,157,195,46,59,210,203,176,207,48,173,141,35,173,80,+64,221,124,151,90,190,185,247,252,243,72,181,93,80,240,83,162,3,221,174,+143,75,68,226,26,177,13,59,75,112,103,124,62,0,8,89,87,6,64,225,+254,107,157,60,211,20,147,6,27,92,88,236,230,201,19,116,56,81,208,8,+255,112,189,122,132,127,212,117,210,38,119,138,102,7,20,55,78,7,134,144,+43,128,191,255,34,239,221,50,248,99,123,175,150,85,162,226,171,184,180,21,+243,159,99,88,169,206,220,147,244,114,58,123,136,44,226,79,13,226,242,31,+143,219,92,248,15,114,77,23,55,250,82,149,188,108,92,56,108,215,200,221,+48,95,108,181,194,31,110,212,166,54,175,94,101,186,168,84,98,57,146,99,+166,95,77,28,8,209,239,81,49,86,177,149,217,136,165,126,208,186,231,107,+186,54,138,144,232,79,5,168,184,90,67,58,68,123,78,119,179,58,227,104,+246,239,63,33,113,142,176,160,178,36,44,173,239,30,230,165,209,112,34,12,+125,33,38,142,250,123,243,74,249,41,152,203,243,234,32,50,192,166,133,223,+33,100,111,81,83,202,36,234,116,112,28,131,252,36,188,143,158,85,251,0,+212,200,208,39,225,153,30,162,255,78,24,240,101,103,139,214,104,112,137,188,+83,52,221,58,147,167,90,67,50,92,206,211,171,221,40,171,253,21,80,96,+137,113,255,170,217,106,168,160,101,210,191,206,246,117,103,44,129,158,131,76,+110,10,46,253,224,78,229,181,172,18,98,203,172,62,230,32,232,117,53,77,+184,194,74,23,184,213,176,28,14,208,41,13,154,238,141,190,109,90,253,46,+44,173,56,79,68,120,103,126,120,1,56,107,140,246,216,94,200,137,159,99,+238,191,85,94,179,70,180,203,248,144,232,231,50,237,235,187,108,118,161,196,+102,118,236,59,244,129,173,170,120,112,34,59,232,178,154,175,130,71,16,228,+161,106,125,124,140,44,7,132,41,211,44,52,18,159,195,172,142,115,163,45,+174,36,210,168,113,208,107,195,79,174,70,93,50,230,234,6,212,14,164,204,+250,46,182,126,127,90,86,35,214,27,197,81,209,188,169,7,20,99,217,233,+120,180,158,116,100,76,93,159,157,8,81,161,8,248,204,152,171,160,91,45,+199,37,38,188,134,72,71,40,250,32,122,190,61,122,249,85,112,130,184,89,+246,108,91,46,13,184,56,205,138,246,57,135,172,162,191,218,64,98,252,103,+32,14,84,22,115,151,20,201,173,31,252,28,189,128,172,30,29,55,211,165,+17,40,118,131,178,135,202,70,207,147,200,34,14,99,254,255,207,197,254,252,+131,232,183,209,57,232,59,110,71,34,175,181,195,199,143,228,19,230,242,104,+213,27,145,213,254,209,93,133,170,225,121,50,115,95,35,182,78,163,155,89,+247,124,214,114,126,16,191,194,100,15,192,104,30,209,159,185,225,98,67,242,+31,35,28,183,249,42,139,73,10,14,156,159,218,46,36,188,8,112,175,243,+49,68,92,249,91,124,151,59,12,164,147,62,162,49,109,216,93,81,206,227,+238,118,109,39,3,222,44,29,88,138,211,229,227,66,1,170,129,226,71,190,+175,49,255,119,103,71,188,247,51,239,127,56,112,202,30,249,165,70,85,63,+240,129,139,243,128,180,205,206,166,184,63,104,19,92,38,215,143,62,55,14,+9,172,7,71,5,234,172,78,22,149,233,28,58,6,97,184,233,98,224,8,+114,156,205,64,29,52,30,10,217,186,8,79,121,205,8,179,32,108,152,147,+17,176,230,114,181,71,161,7,236,251,227,93,148,152,67,121,118,98,234,216,+147,254,245,18,225,5,192,139,153,57,221,68,55,212,122,203,116,81,113,116,+237,71,65,215,251,20,59,121,168,185,31,139,141,223,46,160,131,185,34,91,+241,51,74,234,201,221,170,238,170,102,8,151,249,95,156,91,250,12,252,30,+8,141,49,63,43,85,32,195,104,113,0,9,0,25,116,177,146,146,168,44,+192,36,79,57,146,15,65,86,198,179,187,123,134,83,199,20,12,179,123,16,+226,47,190,21,102,113,98,246,206,219,244,114,170,77,18,130,4,48,43,80,+65,94,185,147,116,158,25,224,208,155,176,55,235,246,170,201,39,44,182,162,+196,83,120,7,151,3,209,42,254,172,251,125,170,145,135,209,183,99,22,99,+31,60,109,207,148,31,30,177,106,215,76,234,179,125,71,48,228,52,178,116,+215,44,22,131,47,43,27,125,205,0,210,40,217,152,83,84,130,166,237,47,+86,43,53,198,28,247,140,210,227,84,105,105,184,68,109,204,130,20,95,37,+161,180,118,187,129,158,232,91,203,241,158,142,3,130,102,5,111,82,47,81,+252,53,54,36,63,43,180,45,117,104,251,166,124,29,186,190,201,230,83,97,+145,93,16,219,169,161,55,132,249,67,64,245,141,106,22,90,203,140,76,152,+245,73,252,221,63,60,154,213,70,231,78,102,4,246,125,55,189,115,1,51,+120,74,2,238,153,202,74,49,11,246,84,183,45,244,198,209,23,228,68,147,+106,134,120,197,81,21,46,236,99,56,218,214,27,161,2,93,183,24,236,49,+246,136,172,4,199,207,82,149,101,247,78,35,32,54,118,29,134,49,207,94,+174,208,169,119,111,221,25,172,0,234,150,4,174,248,98,76,37,186,186,188,+138,239,232,136,17,19,174,205,121,76,189,219,76,125,24,121,33,149,1,34,+83,214,186,60,37,80,53,72,47,49,10,109,129,212,114,58,179,223,24,200,+251,100,91,195,107,100,206,124,214,6,76,218,47,10,124,58,97,212,250,195,+212,248,173,163,94,0,215,173,167,145,17,223,153,55,175,113,246,114,199,33,+33,145,220,9,81,204,77,235,199,63,214,55,235,133,52,117,173,157,50,95,+244,219,182,172,81,98,9,44,114,123,179,122,29,54,166,185,215,254,34,216,+213,168,169,51,160,112,224,199,16,197,180,66,189,214,213,167,253,84,250,179,+163,151,88,159,57,49,2,28,231,198,220,147,34,196,238,253,215,234,205,180,+251,111,162,25,16,246,254,83,167,85,23,137,135,213,242,105,16,233,193,91,+24,114,126,235,85,101,30,188,22,107,75,11,119,82,219,249,224,255,9,173,+169,202,14,161,146,26,53,5,39,14,249,64,185,208,215,233,36,234,149,75,+84,7,219,241,114,130,57,64,93,111,12,17,224,113,135,109,17,226,175,45,+162,139,164,72,88,25,206,162,110,30,206,114,3,196,194,182,242,186,154,60,+9,37,8,89,148,139,94,5,208,161,230,117,75,195,241,191,11,11,176,227,+3,82,103,250,133,17,40,16,8,191,54,152,190,181,149,56,237,253,190,56,+231,228,61,142,161,132,189,71,88,41,63,253,138,26,172,6,162,174,240,79,+64,159,108,174,54,132,35,22,245,236,63,167,121,204,211,123,89,216,1,55,+209,164,205,202,231,202,216,81,167,205,114,90,1,156,226,65,196,56,212,156,+162,34,193,115,58,244,236,81,136,62,250,35,191,63,43,115,54,215,233,22,+70,21,67,13,249,78,249,238,120,36,103,31,207,89,49,241,36,69,143,8,+56,248,169,46,238,218,252,237,58,234,45,80,254,108,139,189,9,234,186,50,+231,141,227,4,118,132,78,44,107,197,180,34,64,255,171,101,166,14,163,35,+223,7,44,114,29,217,110,11,30,242,208,63,228,198,148,206,180,59,89,32,+48,231,85,247,239,234,244,254,170,224,225,44,107,154,131,223,22,118,17,151,+46,122,35,6,164,38,215,228,29,239,244,200,190,190,201,206,64,163,19,181,+235,234,162,51,211,232,90,33,106,230,90,87,233,175,41,212,225,156,145,197,+98,129,209,21,246,125,76,45,236,4,227,47,246,134,104,56,225,207,238,152,+134,25,88,10,201,78,141,112,243,98,178,158,86,243,40,114,252,14,50,178,+203,169,255,174,228,198,62,126,207,233,144,216,53,233,127,245,211,227,210,111,+47,49,140,224,88,135,152,121,76,181,73,199,4,66,78,237,16,127,62,21,+231,173,235,108,146,130,201,205,96,137,236,44,155,242,52,143,74,1,227,53,+218,187,187,144,223,220,141,73,218,104,202,195,23,106,244,201,99,78,166,71,+202,150,255,52,126,71,175,207,70,22,26,39,132,148,88,84,180,66,226,152,+240,14,63,81,170,7,214,170,224,210,118,35,204,255,159,150,58,190,165,123,+246,211,110,136,216,69,101,198,247,228,82,211,7,12,3,229,45,154,14,210,+101,247,216,93,74,49,41,15,237,151,251,102,189,21,156,76,149,255,90,208,+203,144,167,177,8,41,124,173,175,27,188,201,21,31,181,38,14,223,41,254,+105,106,129,25,84,82,184,74,141,53,169,182,227,100,238,120,1,100,134,141,+127,65,24,32,250,26,117,46,165,8,70,152,211,65,227,80,44,231,239,103,+10,214,26,148,219,20,196,165,100,95,159,172,7,94,66,217,189,170,101,6,+159,173,86,131,16,34,205,225,171,117,137,205,185,188,9,246,180,144,191,53,+17,234,6,242,216,189,116,130,162,71,127,253,236,31,106,186,7,195,112,219,+209,204,74,50,72,25,126,141,48,121,85,21,96,69,7,179,51,13,225,57,+159,93,148,161,8,146,213,197,40,73,62,253,208,131,31,43,95,40,16,16,+49,76,28,100,120,3,245,209,122,142,32,90,63,199,53,191,121,147,65,187,+144,215,132,27,31,243,13,124,137,65,22,114,180,141,73,190,241,26,242,16,+136,46,251,26,239,53,2,90,52,27,97,151,204,148,235,218,0,60,245,160,+48,243,248,148,2,73,174,116,219,143,156,96,7,84,64,20,79,213,228,99,+172,31,244,47,62,78,37,142,13,52,75,189,184,111,97,0,148,69,104,170,+129,10,194,141,105,218,214,100,212,47,37,80,135,68,96,206,104,66,3,33,+44,159,79,54,27,62,145,199,24,84,251,105,31,244,148,118,207,216,96,123,+28,135,239,50,82,17,135,2,224,254,154,60,85,231,159,47,43,40,47,200,+235,49,85,200,25,51,140,144,164,7,58,149,16,154,198,233,41,220,9,46,+182,231,149,242,69,0,127,197,15,33,3,124,190,232,67,244,83,209,243,31,+68,7,78,13,56,31,155,46,217,80,99,202,234,132,127,50,14,90,197,141,+6,184,165,197,47,19,113,83,74,61,100,91,67,47,32,65,139,143,212,189,+166,176,235,194,75,191,70,165,172,198,157,241,6,36,163,90,13,244,10,13,+80,44,201,232,243,194,222,3,134,222,17,221,239,89,46,198,210,51,131,136,+208,123,37,239,67,25,228,224,191,9,29,24,122,176,148,101,199,193,130,81,+144,144,140,98,82,183,20,67,235,185,207,85,32,16,224,101,85,6,53,174,+161,198,182,172,0,213,106,157,59,22,152,168,202,135,61,51,177,27,141,15,+22,219,180,112,192,73,45,65,35,184,105,30,152,205,13,56,1,155,217,59,+7,15,226,152,188,88,49,73,142,87,180,227,228,216,180,49,35,227,131,111,+91,85,243,115,244,23,81,100,74,38,244,245,143,75,49,251,228,59,169,248,+29,98,228,115,66,191,120,50,12,100,246,237,187,206,229,66,99,7,245,111,+229,141,154,97,101,46,186,225,24,22,190,10,85,28,31,80,141,81,192,227,+174,172,231,36,99,22,219,4,166,19,26,223,91,119,235,202,52,189,174,158,+65,171,120,99,201,20,67,225,96,57,75,187,153,206,111,135,117,46,195,198,+228,219,209,160,247,224,82,171,87,30,202,192,204,242,30,205,1,10,26,132,+19,225,129,64,212,244,116,15,198,212,116,187,101,115,61,90,184,164,37,8,+243,71,179,57,250,7,109,50,210,55,87,141,162,138,56,6,30,80,218,90,+161,249,253,24,170,215,58,177,199,179,232,33,30,178,243,20,37,66,205,251,+159,227,19,153,26,190,134,75,145,150,237,77,239,226,137,110,72,213,4,147,+252,214,31,209,27,49,5,233,17,72,219,44,143,237,23,180,62,216,101,71,+149,172,162,189,151,131,181,206,196,43,183,15,33,41,222,72,156,175,213,204,+10,208,248,198,84,35,122,201,6,135,120,81,91,59,27,226,82,179,0,114,+123,211,167,71,36,38,132,145,61,202,102,148,223,46,112,90,245,240,153,64,+235,243,132,184,125,131,60,53,114,46,14,186,29,67,48,150,204,64,159,13,+150,176,251,100,216,137,83,249,120,124,82,26,20,81,213,104,182,113,213,27,+103,47,33,238,73,103,126,156,82,253,142,98,150,215,210,187,28,76,141,145,+219,212,103,220,85,249,252,116,9,198,196,140,221,15,236,22,186,132,117,11,+227,152,207,121,155,167,86,161,83,132,245,244,38,143,4,102,114,252,167,54,+141,170,48,149,57,4,85,62,8,151,255,219,62,3,207,235,35,63,40,104,+12,187,165,84,39,14,243,225,42,39,32,127,164,138,129,12,49,229,158,144,+77,159,201,171,51,86,42,252,149,223,245,87,234,112,198,152,23,133,168,209,+239,200,212,1,111,73,226,195,189,154,116,120,21,108,26,36,1,208,171,201,+167,128,205,146,46,45,169,70,116,77,192,163,189,139,22,155,215,54,209,126,+216,237,204,162,134,129,190,48,153,21,150,142,61,36,149,118,11,166,120,213,+13,140,127,108,238,238,135,104,133,137,91,94,16,249,134,212,137,148,131,153,+85,214,219,31,214,124,28,35,143,196,151,93,59,122,17,188,21,23,236,15,+5,161,139,41,191,255,92,51,41,3,48,173,157,194,98,173,199,43,220,137,+183,89,221,167,125,246,132,35,57,68,214,97,121,253,126,205,201,38,72,120,+144,221,228,108,183,81,131,195,81,109,220,12,64,5,216,211,171,236,65,138,+237,74,219,68,183,50,113,127,226,104,57,154,123,71,218,129,244,5,178,239,+22,184,7,160,52,148,94,17,28,208,150,45,173,229,115,98,152,28,215,137,+141,237,68,156,21,228,190,79,200,227,13,192,221,56,77,215,217,91,132,180,+38,14,238,249,119,59,193,110,76,197,110,18,66,227,151,200,50,205,31,20,+203,31,145,172,69,104,253,145,159,184,113,5,146,191,209,241,51,162,122,101,+185,190,96,68,158,43,228,116,21,192,200,61,234,246,59,106,163,212,10,198,+126,93,10,183,93,72,101,52,54,210,243,159,94,18,18,117,225,62,221,178,+38,51,208,255,47,122,109,254,240,246,28,19,147,102,220,90,121,138,58,8,+220,160,170,19,253,105,38,17,161,236,147,119,169,37,233,188,177,112,23,68,+176,170,160,64,103,133,206,150,79,255,109,11,131,103,77,205,3,0,188,246,+81,54,213,243,245,106,26,252,119,148,205,8,31,95,31,53,198,213,17,137,+95,64,248,90,23,33,235,235,113,228,158,7,2,39,162,11,209,152,33,175,+227,68,32,74,56,228,33,181,235,71,214,80,197,121,70,51,179,41,4,66,+26,221,67,124,80,168,111,99,135,46,193,227,110,249,46,250,24,151,46,173,+98,179,170,154,64,127,1,102,165,54,126,170,67,5,237,253,175,210,51,160,+117,191,242,211,145,1,20,27,194,177,208,161,132,54,88,231,132,150,161,105,+193,25,30,3,124,181,59,60,146,81,138,221,52,130,46,11,43,178,148,5,+127,36,190,204,239,220,86,100,71,228,110,87,6,2,29,95,79,178,50,206,+115,193,69,63,105,118,227,240,110,235,51,115,200,205,220,117,37,148,220,255,+207,51,180,52,212,100,67,84,150,38,79,139,177,115,186,46,98,31,182,237,+250,86,76,127,252,161,53,129,250,237,141,40,17,186,100,137,35,58,175,29,+161,182,62,137,167,19,119,57,185,200,36,41,73,188,144,174,71,56,7,102,+243,29,5,43,44,140,191,117,85,184,190,47,109,196,224,193,29,50,181,27,+49,123,247,44,161,143,187,217,126,40,101,78,113,66,233,237,89,162,170,133,+63,173,63,198,108,208,209,33,91,164,170,0,180,172,61,31,45,204,251,142,+231,40,123,182,17,109,177,89,83,177,157,45,89,143,88,15,93,234,67,191,+169,105,168,95,68,233,126,19,217,139,81,169,156,191,145,40,188,63,75,133,+28,57,63,242,20,36,176,7,245,111,218,51,193,65,150,197,17,212,112,78,+98,209,161,48,19,173,48,209,202,18,212,127,206,17,183,122,31,62,192,107,+186,14,97,94,102,100,114,198,80,107,67,104,2,54,34,141,85,100,20,77,+170,242,184,203,180,206,250,218,14,221,101,252,140,124,128,98,49,222,36,109,+28,109,81,105,12,39,237,151,223,251,172,15,145,37,162,98,164,23,153,135,+197,93,223,33,231,103,6,206,163,180,130,100,138,171,136,214,33,159,76,35,+193,107,214,4,22,111,81,59,127,221,230,156,113,172,154,22,162,106,0,214,+151,224,30,161,240,228,249,78,67,201,108,193,180,59,63,112,25,171,60,104,+23,248,205,37,239,75,109,173,179,99,156,119,111,69,138,196,163,242,5,176,+135,9,222,209,72,248,148,58,49,245,208,34,83,77,113,90,184,31,84,171,+253,133,73,158,147,217,213,168,169,24,160,18,172,131,202,248,224,78,135,218,+155,173,242,249,34,210,146,63,38,57,48,250,59,232,175,21,47,220,213,126,+139,145,194,16,166,166,130,200,32,222,99,40,180,228,20,237,193,134,231,242,+52,73,157,120,25,7,247,11,136,155,238,214,62,230,1,138,107,118,229,198,+213,236,200,65,81,186,14,29,91,109,169,88,42,155,189,119,205,224,194,155,+35,184,160,77,18,87,34,210,83,145,245,213,92,56,73,105,99,148,69,217,+130,40,193,217,84,126,105,228,12,55,138,162,45,140,1,14,34,100,144,172,+240,197,68,120,137,6,32,114,133,216,33,240,149,81,138,235,136,191,23,214,+107,116,201,61,47,161,132,147,22,18,74,188,186,230,91,233,84,164,113,190,+3,31,157,40,95,30,57,43,4,47,218,87,184,64,124,140,179,117,41,120,+154,225,49,40,175,166,87,106,229,56,153,181,232,37,104,172,106,137,192,242,+122,188,123,117,156,2,238,95,4,104,5,45,118,4,16,250,251,48,16,183,+193,230,136,233,125,36,132,242,8,222,175,81,24,250,204,161,88,227,114,241,+107,130,14,176,208,163,134,245,203,16,198,102,76,37,179,167,8,202,49,179,+83,45,213,235,252,127,123,206,93,195,169,43,133,81,90,186,224,59,73,252,+254,185,164,52,149,195,137,71,138,51,185,144,60,142,142,176,139,100,4,252,+181,170,36,23,110,150,232,100,162,49,48,100,249,35,34,177,207,138,199,244,+193,4,71,181,216,40,51,42,9,113,10,156,242,235,12,224,202,123,100,1,+153,119,186,190,241,52,76,109,23,158,184,25,121,125,127,2,165,185,78,21,+141,39,191,67,236,57,176,135,218,134,193,234,27,137,233,73,190,111,180,22,+26,237,210,210,193,207,102,118,19,159,236,66,113,39,115,201,122,44,205,146,+230,162,94,9,233,63,247,153,170,202,12,100,225,38,12,201,190,211,219,229,+39,101,205,69,227,183,60,46,53,23,69,144,199,202,221,12,116,90,236,21,+10,148,103,153,25,82,163,105,230,178,118,17,232,35,41,164,163,47,11,179,+60,25,85,216,102,170,16,161,202,158,1,100,40,248,42,126,103,152,30,242,+185,1,69,102,51,178,19,235,41,79,163,135,60,61,101,217,18,16,141,38,+186,48,49,113,224,44,159,204,255,180,67,69,19,72,15,119,9,161,84,250,+74,215,175,173,130,31,117,20,38,160,39,111,216,38,236,20,95,118,41,237,+203,90,43,227,150,198,171,145,54,66,225,181,120,46,58,196,198,19,125,153,+93,200,75,231,182,169,206,218,116,223,48,226,152,0,138,157,127,104,20,181,+248,196,199,254,235,156,211,235,79,65,111,74,214,162,140,224,209,234,123,15,+96,77,0,106,184,225,219,13,200,160,222,28,80,237,72,255,99,20,110,155,+36,225,175,31,128,89,110,60,249,175,181,171,233,145,71,208,175,78,220,52,+18,69,36,209,79,9,129,185,100,96,34,53,253,78,145,223,158,254,22,36,+136,188,129,15,86,162,67,102,59,237,103,243,233,101,19,20,122,20,17,70,+79,242,222,205,62,102,133,165,177,28,170,109,101,171,116,114,5,207,52,239,+187,164,209,48,41,30,42,58,34,122,130,159,55,77,142,170,0,9,48,116,+122,81,193,161,222,57,105,226,212,13,30,26,18,225,120,95,189,119,45,43,+22,238,4,59,207,78,23,122,91,59,18,117,111,8,119,56,239,59,70,76,+239,93,178,163,52,220,141,223,123,200,177,132,152,167,109,40,241,71,98,200,+116,49,81,240,178,251,147,55,75,215,203,201,85,135,143,248,214,140,204,15,+25,105,82,98,186,31,107,159,244,110,122,242,221,220,168,39,64,69,161,36,+36,108,254,142,133,168,93,135,31,109,55,170,129,95,201,95,164,125,95,21,+41,154,111,245,241,54,48,22,21,87,128,8,168,161,176,123,61,7,223,99,+250,74,59,190,47,53,18,154,202,19,20,196,126,191,108,244,218,63,138,131,+228,119,81,78,95,0,189,56,167,177,173,163,91,18,204,147,5,219,160,128,+181,182,119,59,244,193,216,146,229,12,122,163,81,39,109,44,136,163,212,151,+175,83,45,165,211,179,209,206,48,169,64,147,182,67,53,79,187,242,2,109,+198,56,175,30,6,211,242,8,160,205,118,56,135,19,30,174,246,21,133,255,+57,196,40,142,44,47,50,21,89,240,193,171,7,245,150,229,128,54,42,25,+54,114,230,86,22,139,158,206,51,85,204,204,78,102,234,198,236,212,53,117,+91,153,127,224,59,243,75,49,211,209,165,200,153,182,196,224,131,66,60,123,+164,39,121,14,223,184,133,105,156,255,166,149,82,193,154,26,41,203,163,241,+235,27,243,183,191,23,223,255,162,175,167,252,142,224,120,180,247,77,130,218,+243,75,190,213,80,212,24,4,255,189,79,218,76,89,41,162,220,98,27,167,+164,10,23,40,170,12,89,119,107,88,83,32,133,101,162,190,123,72,215,108,+205,45,174,212,249,140,8,94,94,193,35,93,71,29,38,79,182,190,232,93,+164,90,215,82,195,94,254,198,201,228,248,60,15,57,56,137,162,208,182,110,+252,67,223,208,79,146,76,215,5,162,152,191,140,14,159,182,235,168,213,78,+65,212,55,14,100,223,83,46,75,15,54,36,11,140,142,181,159,249,183,233,+66,6,125,199,203,180,26,88,208,197,96,65,163,212,243,49,92,102,233,40,+207,105,138,80,163,15,54,232,48,62,61,112,3,158,76,99,240,75,99,234,+162,35,28,250,134,201,30,228,251,27,211,216,215,205,132,23,48,42,69,41,+226,227,234,208,213,79,195,2,214,143,50,41,59,227,254,6,233,151,150,87,+5,201,34,201,114,56,184,186,174,43,222,153,27,4,20,118,118,197,42,185,+210,114,178,173,55,13,69,146,64,115,123,29,181,18,112,36,48,239,24,127,+140,166,126,189,37,115,136,49,145,30,121,12,100,209,42,172,217,100,249,63,+235,232,61,17,152,67,87,5,218,116,161,178,107,169,85,9,94,213,76,245,+207,194,237,219,58,10,149,206,105,192,228,142,226,203,19,255,50,242,218,38,+189,79,34,124,132,148,65,56,186,239,78,12,188,53,199,104,110,23,145,135,+62,208,186,83,165,100,222,246,135,198,179,124,155,198,98,172,52,130,214,117,+130,59,86,51,226,8,183,75,39,79,100,107,40,217,149,245,13,163,135,195,+80,184,187,155,201,97,251,102,17,54,150,250,167,152,123,117,45,186,168,172,+115,78,176,161,193,247,118,106,119,76,228,167,145,67,41,121,216,131,101,122,+145,23,9,102,144,109,155,92,152,69,61,144,69,53,181,236,68,67,239,139,+188,117,223,88,8,167,195,213,90,106,160,177,255,15,248,95,103,69,132,159,+146,186,251,141,169,162,177,13,160,12,191,58,41,244,135,156,140,235,236,6,+83,166,49,102,37,16,45,212,46,60,26,174,50,136,158,16,98,117,133,183,+78,31,73,84,63,162,5,124,206,150,10,118,200,95,208,90,239,191,27,193,+60,215,188,172,48,98,250,43,29,125,36,71,230,236,7,32,72,240,104,204,+230,172,189,148,156,144,84,71,37,203,144,20,208,233,201,237,20,123,136,191,+115,2,241,84,127,168,73,51,241,1,2,219,156,199,76,149,139,203,156,202,+230,151,135,214,173,76,88,249,121,68,67,153,68,44,89,194,8,227,190,225,+212,167,102,202,234,97,155,3,232,41,21,117,101,199,67,7,93,37,69,60,+12,17,83,59,225,216,63,116,228,219,214,20,168,136,99,20,71,246,248,135,+239,20,175,74,41,127,114,95,94,203,63,245,246,230,85,7,76,253,63,247,+203,127,83,141,225,218,165,147,7,204,31,126,1,10,19,29,27,152,238,236,+1,105,200,51,141,13,129,123,125,163,130,210,248,76,186,157,102,139,227,17,+98,22,34,255,6,120,250,62,34,27,14,144,5,41,72,248,88,72,225,244,+18,131,142,131,114,34,89,171,83,88,21,255,206,29,195,184,44,112,84,27,+163,180,252,134,134,16,46,44,175,209,177,19,67,21,237,111,195,80,187,17,+120,226,137,36,172,60,128,30,217,248,146,164,8,39,174,135,98,23,201,167,+116,229,97,34,251,73,58,86,222,199,165,237,125,22,88,88,52,55,66,64,+237,75,95,160,174,196,215,133,145,76,178,105,181,153,55,146,139,94,204,28,+169,129,63,117,182,8,90,112,127,182,136,210,170,145,138,126,10,231,132,153,+121,52,61,18,136,47,124,59,206,47,68,167,99,41,201,208,54,194,59,3,+69,120,126,106,72,37,32,138,95,86,83,153,19,152,220,227,12,17,102,234,+182,35,38,227,51,114,43,193,161,45,179,88,196,254,25,163,29,9,52,212,+40,81,218,110,156,48,69,151,153,45,137,9,248,148,81,97,144,215,41,67,+179,161,200,253,204,60,227,13,92,253,133,196,105,195,146,231,242,176,70,144,+166,97,57,131,244,184,7,13,220,233,93,171,230,26,168,71,157,205,180,227,+181,205,244,99,93,210,45,126,40,233,68,105,205,249,42,133,94,174,229,6,+142,115,111,195,43,138,92,171,152,66,141,243,32,205,56,121,37,31,225,93,+139,69,64,219,255,71,91,17,77,138,163,169,213,101,108,44,210,252,234,166,+13,135,164,224,43,138,48,212,10,133,208,151,1,23,237,56,30,84,166,252,+21,171,12,151,82,233,209,203,72,48,25,68,49,199,236,23,58,17,134,227,+207,58,30,172,210,97,215,25,106,162,63,84,29,199,196,175,85,1,159,37,+34,135,128,206,189,37,28,139,123,72,167,244,24,55,56,151,124,181,217,217,+36,215,63,125,79,139,171,164,175,111,122,112,233,156,178,54,236,58,81,180,+73,221,222,116,211,16,244,65,3,118,232,6,193,137,251,224,51,184,56,205,+191,54,132,126,197,13,226,146,252,30,127,92,158,191,37,198,111,88,105,172,+248,219,176,119,37,186,143,55,150,178,10,147,97,242,163,186,160,188,209,145,+198,46,167,225,248,218,38,35,236,132,25,199,21,141,121,171,179,177,91,83,+48,190,155,13,233,222,229,122,0,166,128,221,141,38,178,222,100,216,90,153,+169,84,43,90,209,60,119,180,99,158,211,2,44,181,221,117,137,170,170,194,+2,55,41,202,32,198,52,204,251,6,66,197,228,192,28,140,4,174,77,64,+104,134,249,139,185,237,18,152,207,162,62,4,161,114,240,217,85,246,123,105,+106,159,128,83,81,26,129,218,92,218,100,244,98,45,247,252,239,141,57,203,+164,168,113,252,126,16,201,37,97,45,193,175,147,216,80,37,230,33,218,85,+251,167,39,254,6,81,98,145,160,52,102,78,200,201,176,195,78,161,118,97,+168,94,182,55,113,156,0,10,117,18,150,176,137,122,139,118,58,205,151,107,+214,196,95,69,170,98,241,203,180,156,200,154,55,197,163,167,125,160,30,163,+125,51,249,5,108,191,152,46,9,66,249,115,141,181,7,177,180,121,196,38,+74,51,249,37,21,54,248,73,163,254,242,66,97,44,49,249,218,149,253,180,+8,230,151,141,55,103,26,168,133,226,224,161,152,138,212,132,161,116,220,182,+93,188,244,184,116,16,53,236,163,255,169,191,135,106,17,32,82,108,177,130,+59,211,16,65,58,4,91,96,97,37,93,51,48,227,132,139,220,34,117,71,+58,245,202,60,165,187,203,185,197,130,172,216,94,118,143,26,77,228,252,129,+67,50,197,68,237,123,156,127,194,186,211,125,225,76,251,104,233,66,27,144,+59,174,4,15,128,252,119,62,26,129,87,168,211,61,124,232,235,181,55,43,+107,52,186,192,222,17,7,141,223,59,89,213,202,124,15,218,224,250,63,211,+101,109,104,137,172,169,188,7,111,116,249,7,169,44,107,180,9,171,122,177,+16,93,224,87,246,197,40,139,109,86,230,205,53,200,151,175,173,158,39,196,+31,201,20,106,120,98,2,31,213,54,187,153,144,98,89,176,94,18,96,132,+23,153,70,86,203,242,235,10,69,122,30,192,32,22,19,249,142,154,214,151,+233,40,234,22,28,57,139,246,42,173,250,73,181,125,140,74,39,145,137,175,+56,22,42,177,187,178,188,219,7,41,53,19,170,204,70,167,211,47,83,247,+183,68,141,133,167,8,27,68,162,64,80,66,128,240,0,182,182,157,239,117,+155,164,18,82,25,52,160,171,220,131,245,172,178,28,99,8,41,190,93,117,+47,247,33,35,161,220,70,61,1,233,3,162,103,247,23,188,157,210,194,217,+185,236,8,221,100,197,208,128,123,169,27,22,213,25,205,71,12,195,3,203,+144,80,204,101,74,180,47,59,107,211,69,153,137,146,197,47,240,181,105,39,+54,222,212,242,198,23,44,41,146,209,251,84,84,23,125,115,50,239,198,100,+200,161,245,95,67,233,29,105,180,246,209,34,87,248,21,18,190,162,85,155,+38,254,38,54,175,236,248,28,59,58,72,171,71,100,103,103,106,124,193,27,+254,171,10,66,36,184,242,223,173,179,236,218,107,246,12,236,190,176,169,251,+177,120,154,196,249,107,78,139,128,168,229,54,179,18,147,49,26,103,49,184,+24,188,180,64,140,250,158,9,164,143,229,2,228,192,91,19,126,145,215,98,+23,203,218,176,89,231,56,40,170,111,26,177,170,26,52,29,151,228,129,79,+239,68,59,212,91,5,137,162,81,98,38,4,213,104,167,92,39,87,202,48,+199,139,229,248,68,109,107,115,247,46,235,115,166,254,17,180,160,171,206,10,+41,79,9,120,7,31,79,63,110,226,54,221,210,16,230,7,90,245,205,232,+99,30,198,52,238,226,220,36,254,218,17,26,248,98,11,247,68,203,121,115,+122,192,99,152,18,24,204,210,90,32,54,151,85,77,89,108,39,206,230,154,+72,167,130,168,48,168,91,235,93,231,73,33,142,27,156,61,170,70,67,54,+246,195,50,130,51,164,126,197,238,228,162,217,126,209,40,2,40,50,179,129,+222,234,43,204,103,67,193,49,221,107,244,86,206,107,228,16,90,203,204,56,+122,211,120,149,58,149,35,70,170,83,229,42,235,70,162,146,113,176,188,136,+124,212,44,79,99,131,206,150,202,121,104,133,102,167,76,230,6,201,185,212,+73,216,4,228,230,141,58,154,80,99,136,225,162,243,57,201,113,60,199,205,+33,249,140,93,95,137,35,60,28,31,114,112,2,83,115,141,217,148,222,176,+6,111,245,180,76,0,21,144,3,215,1,133,7,240,46,237,119,43,198,245,+224,207,234,222,223,131,158,70,212,41,169,87,152,46,1,194,130,131,239,177,+145,41,217,181,157,98,27,239,185,255,136,103,205,210,175,103,215,246,173,120,+185,30,20,161,36,161,33,161,37,239,65,231,178,11,250,147,253,232,52,209,+27,72,27,168,245,181,222,86,67,35,70,173,175,207,121,36,118,192,68,220,+8,249,119,220,37,35,75,245,254,78,248,30,77,217,189,16,159,193,131,226,+178,160,206,76,38,193,73,150,42,100,63,204,24,100,170,218,76,202,82,164,+141,139,191,85,229,63,91,13,217,40,72,185,97,112,187,71,143,72,125,191,+79,143,176,79,94,195,25,21,207,0,160,124,122,82,88,214,182,239,94,107,+66,177,39,244,106,29,125,16,82,102,47,92,88,172,8,172,129,247,120,118,+194,186,208,47,133,208,223,86,207,35,116,67,151,54,65,148,4,131,29,56,+137,109,68,7,227,187,165,238,52,2,28,178,112,236,113,119,234,111,251,47,+98,50,111,49,71,132,57,169,47,91,105,17,59,146,203,175,97,206,27,145,+7,66,188,126,87,221,88,104,147,133,103,8,173,169,186,47,120,45,83,167,+120,183,125,15,31,182,94,111,84,177,207,216,214,185,192,92,202,14,154,135,+48,55,134,208,174,94,165,230,243,75,79,245,253,202,3,63,16,93,106,72,+60,65,243,84,87,232,178,140,123,139,255,173,229,53,238,124,43,42,139,15,+20,155,83,102,167,211,98,41,249,67,77,4,201,108,234,85,173,39,203,141,+194,28,26,110,254,31,77,51,138,195,179,61,164,151,199,245,131,216,100,5,+27,204,92,35,232,79,177,49,254,70,55,27,177,37,235,149,99,189,161,53,+24,138,79,97,152,14,75,87,105,119,213,10,51,250,5,210,158,170,31,82,+130,214,22,48,145,66,172,196,203,89,106,100,217,32,250,186,179,30,110,77,+183,227,46,125,84,101,65,66,68,253,144,55,187,254,220,253,132,49,52,101,+91,50,149,76,9,181,213,97,199,173,185,204,178,57,125,103,151,121,194,81,+177,180,100,73,128,180,113,153,6,154,58,74,238,41,126,12,193,0,48,91,+43,69,133,164,91,129,33,174,190,3,218,161,234,203,176,37,24,117,83,230,+167,37,39,132,195,123,17,234,171,168,45,92,128,153,238,246,13,129,203,93,+0,216,131,102,167,174,71,190,120,72,156,19,175,221,121,237,62,108,151,117,+89,85,103,43,189,248,68,22,36,218,238,229,185,173,144,192,225,205,201,153,+149,66,88,248,74,8,250,192,169,69,134,64,215,187,106,233,125,189,212,234,+214,122,182,155,79,204,104,138,30,134,168,25,47,36,115,246,42,198,243,200,+200,174,238,246,168,207,233,236,32,89,25,93,179,145,19,155,141,173,232,17,+163,125,234,223,241,66,229,64,174,214,130,194,87,92,184,49,175,236,239,138,+244,102,66,166,198,149,110,220,210,174,95,143,90,232,182,153,87,14,140,214,+153,189,139,197,66,243,188,123,175,53,89,193,71,231,230,10,154,244,228,147,+153,91,137,128,127,157,160,201,183,16,39,245,101,200,67,28,1,50,163,121,+51,217,220,21,17,162,94,188,111,207,87,198,63,217,122,167,90,76,180,54,+21,186,4,8,159,46,40,244,23,241,254,152,156,86,97,161,216,150,27,24,+143,156,80,10,2,18,10,3,20,223,159,59,227,252,138,76,212,18,47,9,+177,211,237,24,45,103,227,29,71,57,127,164,53,19,167,170,193,35,15,134,+168,162,51,73,163,132,61,34,210,142,17,156,133,176,54,169,45,83,165,248,+8,187,178,70,132,131,203,195,109,73,108,80,184,248,72,196,37,173,8,202,+50,134,46,205,14,118,176,57,197,162,18,118,25,198,72,60,164,110,25,173,+27,115,153,193,131,161,176,48,59,120,224,145,161,78,202,242,163,135,170,72,+60,237,44,113,122,228,235,18,118,68,229,214,48,65,56,228,26,216,223,189,+152,140,102,106,15,223,140,202,102,62,226,177,38,22,96,171,242,81,63,221,+59,114,48,6,246,90,53,8,23,49,11,174,22,62,70,16,134,146,9,171,+169,60,221,204,68,129,163,117,213,172,135,254,245,240,188,54,145,164,84,9,+21,11,157,81,177,255,106,232,158,148,216,98,161,144,145,207,165,62,86,109,+185,134,11,77,89,34,249,50,68,16,197,81,85,186,24,226,32,202,63,186,+131,159,110,101,227,184,102,191,62,51,162,194,54,66,196,147,238,107,215,136,+176,16,90,41,164,88,199,230,44,38,22,251,95,121,5,176,5,212,221,108,+68,6,114,235,224,153,229,114,3,200,205,24,99,83,79,227,152,205,220,246,+73,168,162,188,246,148,7,159,83,13,140,70,16,211,166,43,253,132,161,188,+240,159,48,199,130,3,227,57,145,224,61,20,198,210,157,69,209,141,33,192,+109,199,219,254,141,20,216,222,32,189,125,122,162,170,72,9,147,171,127,183,+50,162,34,121,135,153,22,22,253,202,208,76,37,58,246,61,211,243,112,142,+244,1,176,210,208,103,80,123,197,232,181,191,161,137,8,191,147,83,87,40,+84,139,203,3,86,201,177,194,230,149,245,142,154,48,35,157,186,41,165,82,+141,144,27,139,237,198,28,120,2,131,94,56,100,31,88,131,92,29,197,126,+149,190,64,103,236,236,239,75,85,95,180,127,79,244,172,186,70,134,215,67,+179,111,48,158,53,163,227,37,51,148,142,144,115,17,2,221,5,157,144,72,+1,6,237,184,88,63,15,114,190,53,149,79,55,253,204,3,108,114,181,2,+25,182,209,253,76,5,81,189,250,133,0,82,252,136,160,49,225,234,139,26,+204,230,207,173,7,234,143,74,162,200,143,196,59,140,231,16,128,107,74,13,+230,10,222,123,170,159,227,196,140,239,148,171,67,83,91,141,213,76,217,94,+107,173,62,70,148,49,29,72,147,201,26,88,88,172,30,233,28,191,146,215,+246,147,140,56,196,138,96,125,77,67,22,112,149,106,84,71,83,251,203,235,+20,58,139,154,168,14,253,227,104,195,59,248,99,96,31,116,75,49,196,121,+109,161,214,37,226,52,84,105,28,254,176,195,173,48,68,187,187,103,107,88,+144,195,7,73,36,54,1,254,119,27,20,51,38,141,209,25,202,109,48,55,+201,21,203,163,83,10,95,79,179,239,128,13,180,94,176,181,104,223,52,130,+217,138,190,190,107,28,175,146,65,197,175,183,45,212,216,148,142,31,184,30,+129,18,180,17,187,167,88,254,15,169,148,98,165,184,21,79,208,187,157,161,+243,90,81,116,96,44,154,248,17,157,101,167,159,171,121,89,166,132,19,39,+223,72,80,123,61,28,24,85,42,118,11,255,204,133,32,142,133,168,248,72,+64,151,171,247,26,58,41,216,215,143,89,253,20,173,15,7,152,226,45,146,+253,203,91,12,2,15,81,51,62,224,49,89,129,244,143,100,234,151,231,27,+142,54,211,246,60,235,232,47,146,222,3,84,0,120,142,207,142,180,241,62,+16,125,57,145,151,58,34,183,249,123,255,196,81,58,191,138,10,47,21,93,+92,206,61,70,10,201,179,129,162,160,42,21,70,35,105,38,20,111,219,114,+207,43,35,128,147,38,189,213,177,205,203,2,61,58,145,195,53,133,164,8,+56,99,128,26,230,104,177,203,222,112,30,97,194,111,156,36,17,92,94,114,+143,149,44,87,94,121,163,74,26,116,141,170,83,239,154,79,58,131,183,95,+94,135,244,171,68,254,108,233,126,138,48,52,148,76,11,245,160,202,128,209,+122,115,225,249,202,9,81,144,69,78,248,23,33,108,206,15,119,45,110,63,+55,166,136,207,4,6,154,102,16,166,189,99,37,186,208,134,108,223,8,28,+10,222,27,111,142,184,80,71,170,11,188,120,137,37,166,242,158,9,169,206,+43,244,198,22,174,89,110,145,174,237,147,240,135,189,250,128,33,70,55,238,+95,176,24,227,174,120,169,179,44,92,170,95,225,164,60,177,216,249,201,212,+187,117,252,65,237,38,89,253,133,135,68,81,70,214,80,203,181,120,139,2,+189,100,40,203,40,251,128,96,249,85,36,84,91,220,3,87,152,113,130,169,+38,41,218,184,44,78,108,207,45,204,127,195,250,88,212,208,16,60,93,38,+158,4,185,79,183,15,34,198,197,202,36,96,159,125,177,115,254,233,33,243,+155,179,66,149,164,4,225,97,65,70,8,205,78,240,129,37,243,112,149,226,+114,126,223,207,246,19,218,250,68,148,154,225,27,7,206,196,244,150,130,205,+90,230,97,93,51,58,137,239,68,221,203,34,79,147,129,136,99,57,188,161,+181,31,76,60,83,71,151,158,104,126,255,53,59,228,139,98,203,201,188,12,+194,131,60,224,185,105,185,234,91,18,34,98,45,196,137,47,172,136,142,236,+182,197,157,152,236,79,168,138,221,238,172,152,225,6,67,187,32,6,111,145,+171,214,148,32,59,129,178,222,248,235,36,27,90,130,50,203,58,39,44,105,+224,4,66,104,186,23,77,72,249,241,100,141,74,145,44,224,3,225,27,41,+255,91,245,126,252,35,215,3,4,226,16,27,218,239,20,191,121,0,10,155,+74,202,177,9,105,149,126,11,24,219,12,219,153,199,197,179,40,86,17,140,+245,43,30,102,43,121,237,231,248,88,21,46,86,34,42,51,195,57,178,9,+250,250,245,223,226,143,188,182,141,108,110,203,54,29,15,48,236,156,162,62,+19,55,254,90,23,251,228,68,34,9,96,189,35,214,244,129,211,22,81,36,+17,63,226,180,57,58,42,239,200,132,19,65,34,53,242,17,203,119,139,197,+199,128,162,218,201,91,217,61,12,212,67,193,17,144,136,199,120,223,223,145,+5,177,203,245,142,89,93,49,66,123,82,232,108,151,93,22,16,137,219,161,+10,158,202,86,219,9,252,74,79,10,159,252,73,201,63,186,114,73,253,242,+163,160,190,14,8,166,123,65,140,76,7,55,207,228,109,59,28,255,81,1,+87,244,69,231,213,231,139,178,60,203,28,187,212,26,140,215,30,91,214,95,+22,150,59,227,127,197,70,129,247,72,160,230,103,118,94,86,115,223,214,106,+144,86,16,204,117,239,34,44,5,133,240,121,175,118,65,181,102,72,180,248,+244,224,218,196,246,33,137,131,98,65,154,234,108,204,106,97,185,143,70,159,+73,111,64,209,100,192,197,249,183,247,224,187,17,121,241,0,251,74,139,28,+151,66,100,62,67,40,163,231,179,156,101,158,103,3,180,146,117,26,37,57,+191,213,23,185,162,241,210,14,174,91,101,185,224,107,24,20,254,132,55,219,+142,59,239,38,144,173,227,200,43,62,254,86,107,212,255,53,187,173,134,201,+116,92,207,188,200,128,234,196,203,240,255,216,250,33,68,61,135,50,101,190,+10,137,126,175,4,177,63,189,159,225,0,124,108,59,210,199,197,184,8,57,+223,1,79,220,128,240,72,44,37,220,175,227,240,167,43,239,251,172,75,202,+108,125,121,159,34,12,129,148,92,211,66,52,79,151,8,182,252,47,88,160,+157,127,158,224,35,78,153,199,156,136,117,179,246,44,33,244,8,129,96,38,+48,201,224,109,23,203,46,209,184,201,156,53,57,46,165,204,8,250,144,23,+127,37,218,170,122,24,159,99,137,219,104,0,188,176,185,234,183,112,99,124,+129,10,26,72,117,187,187,18,62,16,244,228,136,20,78,160,136,23,131,88,+85,185,5,90,241,115,128,158,1,123,37,121,76,192,248,233,69,47,174,185,+0,19,212,154,115,56,66,226,215,185,171,85,106,38,196,114,89,245,0,29,+127,235,110,42,156,44,150,112,222,23,224,4,80,27,14,53,191,184,51,246,+80,161,6,99,241,6,164,65,225,131,254,235,254,79,187,57,34,31,217,108,+70,23,166,172,28,239,225,212,117,108,85,52,125,25,72,212,93,205,141,252,+116,151,173,160,3,2,118,88,212,36,210,154,173,128,185,218,27,9,183,179,+253,3,52,191,246,211,64,105,181,129,2,222,246,203,193,48,155,205,81,116,+90,169,78,126,238,65,164,92,124,31,98,255,206,106,218,80,62,61,242,18,+144,175,210,127,82,233,90,72,32,159,211,134,214,107,204,25,39,216,14,138,+156,132,250,134,121,127,128,159,191,34,54,254,198,176,138,240,169,176,211,64,+109,158,141,106,63,238,204,175,199,211,121,4,46,88,197,192,193,165,174,13,+176,96,131,7,101,54,95,110,229,230,104,29,146,46,6,49,122,51,228,245,+136,143,138,225,129,48,77,132,47,197,60,20,202,195,46,159,111,165,243,192,+58,201,201,176,188,40,245,129,203,134,151,116,80,193,18,68,65,150,131,144,+178,151,218,233,174,210,241,227,49,71,186,69,46,121,247,102,149,24,87,32,+224,62,236,37,93,210,69,98,53,60,61,151,80,120,178,31,117,11,159,251,+143,51,0,0,93,42,217,93,208,222,28,29,179,91,248,33,11,11,177,113,+142,119,112,220,131,49,103,56,178,167,1,43,82,225,92,31,7,17,155,200,+16,15,82,5,203,55,185,122,200,132,239,241,252,229,64,141,61,80,20,194,+174,95,73,140,31,17,213,247,163,90,85,119,41,125,23,54,166,99,46,181,+138,237,240,149,84,21,180,211,18,175,236,98,19,56,246,218,229,228,236,167,+198,13,89,165,77,53,159,104,146,206,18,193,9,200,10,186,28,177,189,80,+203,131,153,138,66,233,68,171,129,236,49,35,64,106,166,255,176,39,166,153,+146,133,83,71,62,190,148,36,129,106,170,81,128,65,158,160,222,119,176,207,+17,172,27,145,176,101,228,58,75,104,12,157,161,39,70,183,250,122,41,85,+167,38,61,140,224,200,35,170,236,62,109,124,72,145,216,45,162,112,92,161,+159,134,160,145,160,46,167,69,148,94,57,44,211,247,225,98,37,15,51,207,+148,13,93,176,167,45,118,131,57,86,27,160,96,121,189,65,3,138,62,44,+139,134,62,96,253,187,190,98,219,142,45,83,115,47,107,206,102,109,128,151,+112,232,44,224,28,185,229,115,55,204,76,118,89,210,203,14,100,103,162,147,+93,192,46,52,45,9,249,25,186,56,195,163,54,69,104,103,220,199,94,32,+85,56,185,163,199,150,79,172,107,237,178,68,46,199,149,214,173,84,206,62,+132,36,65,207,246,35,226,48,137,54,5,227,94,21,245,92,49,51,81,58,+58,137,15,116,191,61,14,53,8,177,41,63,60,157,192,242,83,108,108,84,+164,17,107,191,242,232,184,86,218,187,214,148,208,50,204,212,10,233,67,220,+53,38,91,25,44,20,196,0,208,139,25,237,161,252,145,21,48,95,27,112,+243,117,221,50,37,229,15,157,35,45,112,177,115,234,163,74,155,38,62,188,+106,108,13,112,243,36,200,145,231,127,232,67,187,150,152,68,26,17,13,211,+201,186,65,90,109,82,2,132,110,255,91,163,73,226,222,245,70,249,236,80,+14,0,112,30,72,15,91,105,203,185,103,116,211,37,226,58,211,116,119,18,+172,24,23,178,11,132,71,118,240,119,38,124,17,186,3,135,187,218,168,97,+70,140,103,220,38,115,249,114,62,76,10,226,47,73,31,187,21,81,23,191,+54,222,18,247,4,143,50,167,88,226,191,155,184,206,46,65,7,208,94,183,+58,187,123,107,22,45,217,47,226,139,105,144,239,68,65,111,2,78,170,111,+113,223,62,64,197,65,65,226,200,111,87,183,47,131,10,217,234,174,35,73,+72,86,12,158,129,193,127,10,187,45,49,2,155,224,223,168,100,29,229,110,+215,62,210,149,103,121,158,49,107,179,85,63,196,33,202,25,249,7,82,21,+232,25,60,48,175,73,139,125,128,100,166,142,219,103,164,156,138,116,66,190,+198,185,59,194,112,253,37,179,58,119,109,8,45,255,190,74,188,244,34,119,+153,183,145,169,13,174,35,10,50,217,214,192,250,239,12,244,109,177,178,5,+182,156,133,106,123,175,11,25,243,121,180,199,74,115,172,47,138,116,221,146,+39,147,178,125,35,19,204,45,45,184,49,30,122,148,146,208,18,115,244,129,+103,69,98,3,202,229,180,245,42,211,236,157,99,234,224,190,209,47,117,170,+34,149,99,117,0,31,20,92,227,130,210,0,47,152,63,95,209,78,4,61,+77,4,19,122,186,211,78,26,68,43,73,195,69,13,129,39,200,162,17,9,+160,145,136,138,154,186,148,124,84,29,112,240,145,23,178,122,242,183,64,139,+28,47,174,151,175,166,31,79,9,35,237,206,170,175,95,50,163,119,77,104,+232,183,1,14,133,0,135,77,70,36,69,152,222,60,4,87,140,252,202,31,+80,149,43,79,193,63,136,32,142,173,157,196,115,125,182,251,48,135,248,186,+141,182,185,137,103,101,41,17,40,68,108,71,25,26,14,136,37,44,193,235,+66,68,211,163,210,64,40,3,99,10,192,164,20,181,159,208,145,28,126,80,+65,101,35,185,203,155,110,112,166,134,254,78,40,67,198,197,218,225,233,192,+222,99,235,169,54,93,77,127,227,2,106,212,107,119,57,139,202,200,103,9,+130,88,234,35,228,225,181,62,129,239,204,104,206,28,41,178,130,220,87,135,+250,75,20,101,225,82,18,173,211,20,28,201,219,196,170,202,157,57,13,90,+113,227,128,24,42,132,58,133,152,246,246,103,34,118,238,83,29,87,71,55,+212,94,253,46,51,108,3,236,73,239,220,112,66,23,108,100,88,41,187,192,+88,20,176,69,97,142,181,101,108,229,254,250,213,151,198,254,189,40,34,193,+203,3,182,196,24,134,244,119,250,192,16,218,41,214,49,183,44,110,212,2,+89,220,127,95,48,86,169,99,114,193,185,249,101,3,131,71,207,114,12,75,+4,39,31,189,144,109,181,212,128,130,191,208,131,37,217,126,244,98,77,35,+222,215,113,26,31,200,152,228,107,106,226,82,15,187,112,64,162,157,53,155,+173,154,39,191,170,111,153,173,87,2,44,59,189,73,236,24,181,79,127,220,+171,192,155,7,247,143,43,123,189,60,34,131,64,62,191,162,35,149,103,20,+127,236,109,85,172,42,207,184,37,210,108,143,75,44,151,188,252,253,113,254,+142,237,149,127,116,124,186,55,209,31,40,99,77,128,204,20,211,187,104,160,+48,23,73,0,159,71,133,155,122,39,74,137,17,62,82,163,89,235,109,191,+215,233,45,199,191,129,209,196,163,125,114,145,233,163,220,43,197,190,146,18,+180,125,84,217,84,10,251,198,55,95,206,225,204,7,208,176,42,239,168,37,+228,15,243,141,217,135,42,235,63,95,13,81,67,36,36,71,196,238,82,231,+181,115,122,80,69,57,38,33,29,123,63,145,244,245,8,223,9,222,74,212,+141,73,162,6,74,195,47,79,213,59,24,107,177,246,157,15,35,201,234,32,+216,220,255,178,180,74,148,81,154,238,233,153,156,189,43,223,209,153,11,239,+17,231,113,210,35,92,58,234,192,25,206,27,126,64,125,52,61,243,179,94,+26,66,13,45,152,168,247,52,215,13,236,64,51,95,135,173,149,101,117,241,+173,121,116,136,211,184,42,212,35,59,6,234,219,137,189,55,80,210,9,130,+221,55,230,161,128,186,196,50,203,197,222,53,26,37,202,0,163,124,28,187,+81,84,183,248,195,171,90,148,14,45,225,252,93,139,167,241,227,183,106,54,+100,239,138,23,232,198,70,231,175,234,243,0,63,208,235,26,8,180,28,41,+40,25,119,235,172,179,226,74,76,12,46,25,65,187,248,242,221,187,209,205,+90,184,172,245,1,90,195,76,199,223,223,182,150,110,247,205,99,119,65,70,+7,79,76,121,187,220,9,54,85,182,16,80,241,109,21,0,183,97,72,56,+70,235,80,83,172,237,97,90,110,114,169,67,151,87,162,117,226,195,100,104,+2,8,218,162,121,33,180,63,249,194,97,87,8,49,178,242,58,226,163,237,+89,49,28,207,32,220,144,87,19,103,26,82,45,153,52,150,182,197,139,10,+48,18,61,163,230,250,6,61,231,184,165,129,111,197,228,186,178,202,242,117,+63,214,54,110,155,149,208,150,158,120,11,150,202,137,234,110,197,199,86,211,+197,27,212,43,197,110,17,122,135,57,7,210,56,241,125,164,132,110,37,141,+138,204,39,110,206,161,195,108,116,173,229,133,140,104,151,197,151,43,223,55,+18,234,35,48,250,159,167,24,160,168,203,232,201,240,179,54,139,102,139,178,+2,207,57,197,95,99,215,193,16,79,217,231,6,37,198,226,102,68,58,143,+233,88,160,100,14,8,110,56,139,16,229,4,118,71,203,51,206,32,58,131,+117,246,14,166,148,231,188,61,132,103,244,99,163,125,131,198,50,148,168,244,+217,4,225,135,74,114,248,97,154,136,123,132,234,94,167,156,164,3,24,54,+15,119,139,183,45,134,61,127,108,6,193,178,202,76,202,195,201,148,213,142,+120,50,212,215,202,221,105,197,94,115,102,38,206,253,110,118,213,83,104,188,+16,149,151,37,134,169,88,110,15,127,32,230,254,25,111,200,226,84,191,173,+218,235,147,239,13,30,96,59,252,122,91,67,206,26,27,233,223,134,153,72,+136,15,85,61,164,121,110,100,17,153,233,255,57,178,36,87,0,32,175,144,+237,100,110,108,98,149,55,57,46,170,243,103,247,249,118,78,26,157,140,21,+191,14,173,68,213,204,159,52,170,54,123,33,39,125,108,106,25,235,17,137,+240,7,243,126,6,100,223,48,107,193,201,205,20,134,27,112,244,189,132,103,+215,104,23,194,15,113,10,93,217,197,211,10,59,1,180,161,71,178,110,178,+31,66,49,18,124,153,4,233,150,26,142,231,17,26,194,210,206,186,15,101,+76,159,115,135,175,186,122,234,36,85,99,45,75,46,6,118,38,143,74,91,+211,153,80,204,16,40,249,228,13,26,137,179,66,145,0,94,119,144,213,227,+118,135,138,13,89,244,174,78,21,21,206,165,24,115,46,131,245,109,229,170,+168,61,114,214,181,77,80,39,148,195,157,171,48,242,177,239,155,179,223,33,+61,171,97,161,42,127,110,55,176,230,124,199,67,118,92,75,60,49,208,43,+119,133,95,232,123,137,89,37,102,169,177,202,200,179,46,111,163,88,49,26,+84,129,147,123,112,114,174,196,242,171,96,78,99,41,227,90,135,84,97,149,+53,8,200,200,7,119,196,49,57,68,118,29,228,29,59,179,192,176,36,248,+18,53,173,72,58,4,20,200,240,182,79,95,254,117,169,212,88,22,214,135,+47,130,125,12,27,39,95,116,153,170,150,86,136,210,173,193,223,213,15,226,+0,225,63,249,113,12,205,171,6,69,53,137,17,66,122,115,118,168,198,95,+225,203,219,212,44,14,226,143,222,225,81,178,166,195,56,26,212,6,155,30,+216,113,158,253,43,110,151,65,77,162,108,96,126,84,86,103,253,88,221,206,+51,99,206,85,99,63,153,238,101,150,68,144,244,87,114,103,22,190,200,121,+81,131,70,239,123,102,140,58,243,55,233,191,18,234,63,253,198,70,33,206,+139,119,13,97,61,12,5,134,38,74,209,131,143,201,24,154,19,171,137,103,+63,56,32,152,141,208,35,53,188,242,15,13,151,170,151,52,103,129,204,204,+75,65,19,85,42,7,224,49,1,65,84,13,157,238,132,68,10,252,148,19,+79,209,255,255,93,186,120,255,88,25,30,199,163,49,195,150,45,131,125,129,+25,127,128,214,253,11,113,224,221,93,208,238,214,43,252,6,6,59,162,156,+255,23,233,184,108,220,1,246,99,39,202,255,185,161,24,142,125,59,92,248,+23,25,45,221,123,6,115,219,43,86,53,7,74,240,128,90,2,203,143,235,+14,169,86,113,196,121,43,147,55,23,153,202,110,232,68,74,107,109,190,198,+205,162,81,177,233,68,119,13,51,216,116,187,211,63,248,31,37,172,241,67,+55,124,241,190,217,187,83,118,0,95,62,231,183,202,102,12,245,176,49,146,+52,52,157,238,164,127,73,153,10,243,244,120,157,190,116,154,47,240,115,192,+210,183,4,139,196,48,94,186,195,234,154,142,158,216,246,29,66,132,116,65,+202,208,84,113,28,62,48,50,132,200,204,247,114,225,239,117,153,174,205,130,+156,116,217,223,10,222,126,106,3,145,136,81,118,74,245,204,155,137,21,33,+24,185,180,31,109,116,86,43,193,91,6,45,93,176,92,119,145,96,66,215,+249,217,215,9,197,91,163,184,29,33,104,27,164,195,4,5,77,190,255,92,+213,120,135,138,82,167,184,255,77,132,209,171,144,222,56,114,132,27,179,165,+30,223,221,11,107,5,211,204,63,80,116,83,218,245,199,44,187,251,67,151,+209,94,217,62,104,24,195,20,126,8,251,191,182,112,165,222,135,98,240,142,+19,28,200,123,19,168,142,76,44,128,255,1,245,219,235,66,212,209,91,237,+123,115,2,249,53,55,148,112,133,134,247,227,102,22,119,247,247,141,25,154,+208,131,220,67,27,74,129,46,131,77,127,152,216,124,246,13,52,25,150,73,+187,171,229,176,194,190,144,245,86,53,84,44,138,253,165,45,226,19,33,86,+29,43,92,45,49,133,124,16,192,169,96,132,73,58,194,212,254,105,203,210,+101,106,188,175,194,33,0,207,27,140,32,90,34,26,123,165,137,63,150,12,+20,180,196,84,117,171,154,232,226,111,209,218,7,227,76,159,108,123,28,223,+94,206,66,181,93,145,97,100,252,119,199,198,61,40,30,49,192,57,114,149,+178,140,39,179,16,166,123,184,83,166,168,212,164,36,104,151,76,34,168,219,+38,163,216,140,238,116,53,130,226,126,242,90,220,207,240,173,51,13,218,102,+16,210,139,55,47,226,21,81,202,95,74,184,208,101,157,24,67,187,118,83,+188,206,68,146,194,255,132,120,105,147,84,106,226,102,103,103,88,156,39,98,+1,251,62,59,200,233,25,239,192,101,183,189,226,206,144,134,105,153,232,255,+177,94,171,33,24,182,79,232,30,26,109,132,80,190,121,187,192,25,47,234,+206,4,144,6,18,24,143,4,45,85,59,42,42,142,33,172,2,51,212,208,+144,18,41,18,92,4,142,37,67,129,103,12,221,190,144,172,217,175,185,121,+62,49,195,68,71,175,144,249,2,251,215,166,193,219,251,91,111,176,33,199,+96,176,231,14,184,192,100,122,141,97,220,198,170,197,43,197,201,194,65,199,+133,137,6,117,54,38,137,85,142,61,32,129,127,37,195,106,76,43,226,222,+226,54,225,205,185,130,146,213,73,121,232,141,164,218,181,67,88,128,143,27,+208,195,222,196,250,158,185,200,27,213,63,219,57,234,244,66,2,195,173,125,+116,208,26,232,209,238,86,111,229,104,36,174,185,80,39,220,24,71,80,81,+168,20,0,216,117,65,232,105,106,233,156,37,98,235,138,182,225,88,24,152,+36,29,46,186,211,213,197,153,136,245,97,25,223,43,135,253,152,152,41,206,+0,245,27,237,106,218,96,65,35,154,81,84,51,245,73,124,254,157,212,153,+41,48,241,76,208,155,17,30,206,122,140,35,7,41,37,251,172,197,30,8,+87,175,245,220,203,130,128,109,25,101,239,219,54,56,71,21,210,181,31,134,+72,155,249,50,67,61,255,33,107,54,218,116,101,226,48,255,194,190,77,236,+150,253,57,135,37,42,238,129,226,150,164,146,248,138,250,153,160,240,156,78,+238,151,226,198,138,84,113,35,144,18,250,77,187,147,17,36,14,123,168,203,+216,251,137,30,160,34,174,91,54,225,56,58,150,252,12,5,237,135,199,163,+99,232,112,134,107,234,232,120,205,121,245,98,194,242,143,29,128,122,37,96,+112,8,184,47,198,101,255,111,169,222,152,121,246,170,187,105,171,132,211,60,+173,223,218,169,26,105,222,147,150,239,135,9,94,204,125,92,145,170,82,97,+79,248,228,197,229,142,244,110,82,37,176,154,244,74,233,106,72,55,207,130,+56,16,162,49,138,222,236,96,174,72,246,247,204,154,255,252,160,233,251,175,+66,39,213,85,241,42,51,219,16,34,77,97,156,108,246,12,243,227,239,101,+75,38,204,57,34,171,65,134,79,238,208,87,34,184,190,0,5,169,31,236,+243,163,18,122,35,106,89,137,167,75,254,189,37,89,22,51,136,20,57,93,+11,70,30,245,233,199,214,135,120,196,251,16,128,49,126,4,213,118,50,163,+237,231,153,32,227,247,227,67,198,182,119,7,137,44,2,113,68,155,36,103,+77,158,73,142,248,153,26,116,250,174,149,44,171,136,229,244,154,230,145,127,+224,218,121,1,253,76,208,36,196,179,101,146,0,146,131,21,97,34,2,7,+75,27,6,206,243,46,71,102,66,182,192,54,120,26,131,198,161,9,102,129,+87,140,216,68,252,120,61,231,40,112,208,62,250,155,200,30,128,121,75,208,+177,108,44,52,72,68,49,181,206,52,93,180,60,78,74,250,195,210,143,120,+104,152,247,149,186,207,111,81,145,245,33,75,245,64,175,52,91,219,218,52,+11,201,23,70,172,17,189,2,168,49,16,186,123,178,220,116,164,98,251,143,+23,3,146,156,239,39,179,71,17,45,52,208,135,227,87,248,250,98,96,130,+28,36,49,16,163,131,94,22,7,62,241,74,112,161,47,211,251,119,140,192,+91,70,229,80,131,112,141,15,212,0,30,6,124,79,108,251,38,122,147,235,+91,250,163,55,195,119,217,104,108,67,20,59,176,13,147,0,41,85,139,104,+141,64,214,12,75,230,6,208,220,31,149,28,178,108,77,93,174,185,87,179,+225,74,160,250,20,44,6,196,153,218,204,67,126,198,250,196,70,103,91,163,+248,221,67,186,44,222,163,26,143,137,177,250,172,151,105,58,45,188,9,116,+193,252,88,113,82,158,229,88,202,73,24,71,253,249,138,225,222,57,135,188,+160,236,224,240,210,223,15,55,18,253,61,75,227,171,7,10,205,230,169,220,+165,69,230,195,4,177,207,59,184,124,172,65,114,145,23,140,153,197,175,76,+16,47,223,59,118,164,189,226,126,249,21,142,210,252,218,230,19,140,41,232,+247,69,7,178,71,232,197,215,206,21,207,93,105,18,159,9,110,75,220,253,+197,226,254,214,211,181,219,146,117,230,14,34,72,124,27,22,225,29,111,62,+226,76,96,46,49,101,33,97,211,217,121,237,87,143,33,213,63,110,171,111,+120,127,195,187,116,42,131,207,63,152,143,103,7,147,180,113,208,35,135,69,+176,151,151,210,250,212,221,35,66,124,99,64,51,26,116,78,37,255,211,247,+13,218,82,34,126,170,15,62,203,102,74,184,230,80,26,131,92,23,252,76,+179,52,240,14,45,175,196,253,198,165,253,197,9,167,37,233,53,69,89,173,+159,117,2,48,47,104,227,204,197,135,47,26,71,150,21,2,198,239,163,250,+201,212,158,110,81,111,204,105,168,6,4,233,152,104,254,111,184,184,70,230,+178,57,181,135,146,205,11,149,179,1,225,47,80,253,250,17,171,248,50,85,+226,82,243,170,90,211,16,0,82,103,209,158,158,89,75,41,86,169,155,131,+172,242,84,120,3,38,119,105,148,248,167,15,31,18,230,232,27,111,66,66,+45,108,197,119,178,2,43,229,226,133,94,30,174,124,238,249,72,26,90,90,+120,69,183,219,191,188,74,200,103,155,9,156,227,67,230,152,26,66,244,225,+173,144,202,60,3,66,112,1,232,68,222,249,231,18,126,78,217,221,73,251,+155,98,79,252,86,81,85,135,213,228,148,7,102,49,209,128,33,6,21,117,+218,198,42,17,116,80,35,238,221,6,50,19,95,127,234,137,119,202,144,67,+223,216,71,10,191,142,239,46,78,11,191,147,247,246,90,62,230,114,253,147,+220,242,34,191,42,89,11,248,103,95,21,61,188,128,44,201,146,184,186,3,+123,220,53,144,215,86,58,111,154,227,162,54,14,69,133,249,59,31,85,236,+103,224,51,206,150,161,38,63,216,77,255,56,103,117,37,67,88,240,144,204,+182,68,60,63,195,248,188,212,73,161,72,250,147,129,15,6,206,175,181,147,+135,67,245,8,55,158,70,124,43,192,250,177,83,250,76,205,51,172,150,43,+117,77,137,181,43,60,252,110,86,246,218,39,33,125,58,5,123,183,5,205,+38,113,40,225,28,194,226,79,224,228,105,230,134,54,124,88,163,54,19,196,+168,140,56,233,48,114,11,23,5,207,79,144,172,119,39,31,194,50,18,21,+77,190,118,132,78,203,164,162,191,29,103,10,111,110,19,251,58,158,226,192,+4,53,247,159,208,42,96,124,52,113,106,148,63,174,140,68,177,100,176,74,+81,76,233,21,110,136,15,190,239,45,91,135,158,207,200,200,10,47,17,24,+139,103,113,0,223,184,100,115,86,88,182,138,124,128,111,205,198,90,215,232,+30,62,246,117,170,89,255,177,68,79,59,217,61,13,157,45,102,161,72,34,+44,176,86,3,5,184,225,198,17,9,143,168,15,29,202,47,54,254,187,212,+181,34,133,253,136,40,154,191,32,196,55,99,57,116,117,111,42,3,177,178,+143,241,226,25,139,41,22,220,55,142,103,153,226,204,229,32,215,114,99,100,+50,242,200,26,111,229,215,102,20,40,4,50,54,241,91,36,87,127,243,189,+153,137,106,250,174,210,151,115,121,150,84,190,202,34,33,30,209,62,96,38,+97,213,58,198,194,168,254,152,162,223,7,255,92,238,144,139,217,166,114,209,+107,81,93,3,17,159,226,8,179,22,7,204,19,211,86,173,173,198,221,138,+127,94,168,14,129,114,185,79,221,231,217,251,113,158,252,126,210,231,103,14,+234,112,103,205,19,158,176,34,55,162,4,163,157,203,116,171,101,216,219,131,+82,248,240,225,220,103,122,55,209,154,129,64,116,8,67,92,178,111,200,51,+230,50,67,48,2,73,93,173,218,161,5,247,181,139,191,170,189,205,250,117,+165,136,146,101,156,77,74,85,142,28,122,83,189,125,57,84,168,235,146,208,+159,59,143,174,30,144,213,112,235,25,22,54,99,150,9,250,201,254,195,201,+237,58,99,206,55,118,106,17,10,196,176,41,85,218,154,67,146,91,70,207,+239,172,189,204,190,6,227,227,219,133,47,127,133,110,92,209,179,140,46,134,+188,205,121,111,234,185,187,223,80,238,149,189,152,12,112,5,188,235,247,242,+203,111,189,212,74,218,4,59,29,56,36,34,199,165,111,113,216,201,231,167,+21,3,82,37,196,68,90,176,43,48,49,142,85,160,42,75,45,170,209,95,+197,198,209,73,15,115,90,213,50,47,215,125,247,28,81,242,37,69,36,248,+128,126,53,168,168,226,78,209,184,121,44,185,147,87,58,28,61,62,31,139,+251,190,89,44,106,243,117,125,44,220,208,58,64,123,114,233,235,2,77,143,+92,220,146,243,186,3,52,145,54,179,34,11,7,14,68,225,214,189,23,111,+87,53,113,245,145,47,224,3,137,209,220,54,119,181,131,40,25,170,198,91,+166,24,238,22,66,246,240,109,98,230,186,79,110,209,69,89,238,55,51,212,+136,201,253,136,91,112,10,185,106,119,106,196,203,187,132,164,119,142,41,70,+134,253,67,145,41,52,210,74,174,255,45,242,216,75,102,210,81,208,223,225,+61,245,163,216,83,37,133,155,154,95,130,212,14,128,125,127,3,242,196,229,+223,185,128,228,248,72,213,250,178,126,50,226,183,60,118,207,206,9,128,253,+117,177,188,207,2,48,255,171,27,234,33,230,3,170,55,48,135,45,164,178,+5,35,116,86,37,124,224,238,150,110,54,97,87,21,36,191,55,230,232,213,+55,151,190,22,157,247,200,242,255,166,212,231,152,179,157,245,92,208,166,79,+207,106,195,133,123,72,186,18,177,14,98,0,189,108,149,118,78,56,66,128,+235,29,200,14,88,158,102,193,142,243,1,239,186,227,226,174,35,1,74,4,+251,232,104,142,208,78,102,57,174,180,123,170,192,217,191,78,26,122,44,127,+162,43,23,143,164,169,85,129,194,141,169,212,155,136,109,234,59,170,112,97,+14,92,220,217,119,234,128,38,63,227,8,227,200,95,108,199,222,233,115,189,+232,218,227,170,251,105,172,113,164,196,138,12,77,19,101,108,195,166,97,40,+78,169,94,104,94,99,200,235,232,209,56,32,39,233,5,191,39,149,159,18,+150,131,183,17,30,195,190,254,157,155,216,51,90,162,42,168,76,35,74,159,+174,79,41,156,232,8,122,17,10,76,29,79,244,45,229,184,189,105,199,247,+188,57,30,227,120,214,11,155,250,56,226,109,244,197,41,115,95,208,105,108,+75,171,144,97,181,226,19,158,175,225,55,43,160,148,145,3,42,53,61,192,+243,99,13,219,33,192,247,71,96,116,137,92,214,217,175,134,37,171,2,66,+163,77,175,160,205,5,110,236,171,22,85,195,90,239,230,195,88,156,61,92,+91,250,197,15,82,133,202,240,55,230,174,57,165,77,11,227,112,251,3,252,+229,197,208,136,112,82,35,2,172,129,153,207,184,63,71,244,115,26,50,70,+3,90,199,49,210,194,2,153,246,114,102,248,172,214,85,138,184,191,87,5,+25,93,135,236,91,217,119,112,69,48,41,51,94,73,235,37,133,233,6,8,+186,63,184,241,215,225,47,49,199,172,65,70,165,141,92,176,190,13,186,7,+112,146,6,248,99,141,19,84,182,100,220,138,77,218,255,255,191,140,235,9,+88,52,32,178,254,16,21,129,64,131,153,54,173,143,225,196,68,64,116,221,+191,254,39,70,172,27,1,51,252,126,192,11,164,193,30,231,192,30,29,197,+41,208,32,178,173,106,27,247,252,130,50,25,42,70,176,159,255,155,64,227,+73,14,63,104,252,243,241,116,98,155,204,210,107,239,184,126,200,168,209,91,+59,10,212,226,129,17,224,48,0,+};+const unsigned char *combexpr = data;+const int combexprlen = 27829; static const struct ffi_entry imp_table[] = { { 0,0 } };
generated/mhs.c view
@@ -1,7831 +1,5253 @@ #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;+122,76,90,50,184,153,1,0,93,0,0,0,1,251,25,10,0,0,0,0,+0,0,59,14,1,195,100,94,33,8,250,121,62,187,23,144,190,38,187,214,+246,253,55,33,165,135,161,197,26,73,218,127,251,30,207,92,4,10,239,90,+94,97,129,192,45,186,97,36,238,89,255,26,166,218,253,24,108,151,122,5,+142,93,87,151,206,167,192,245,252,118,58,254,151,243,99,191,215,188,197,59,+10,98,75,76,104,116,46,42,107,15,46,172,13,38,204,178,85,73,110,168,+245,119,215,3,196,39,78,19,47,65,104,6,79,94,163,165,112,70,54,41,+209,176,28,4,66,99,125,50,66,92,74,232,204,44,146,241,185,140,143,194,+147,191,173,118,164,92,116,3,99,186,191,147,37,140,147,30,28,234,14,120,+158,136,15,171,132,137,41,74,235,245,97,58,160,5,193,102,29,236,188,245,+110,235,69,111,125,148,61,16,195,129,84,109,218,31,179,103,122,91,212,123,+103,57,27,104,6,132,61,0,44,151,146,63,161,172,55,113,193,229,155,244,+33,72,123,237,95,102,108,76,154,161,136,223,131,59,76,82,50,155,4,233,+44,231,211,74,231,5,137,176,38,195,64,187,201,79,250,19,30,241,27,26,+152,221,17,129,245,17,168,107,129,58,166,62,241,104,215,51,142,142,139,126,+118,28,79,237,196,30,103,37,248,233,190,133,118,26,98,165,127,152,132,200,+197,40,217,232,53,163,154,94,38,200,123,198,9,75,182,48,220,191,77,122,+233,209,82,219,254,143,166,40,112,151,102,70,222,14,77,244,51,192,81,73,+83,195,200,116,11,110,223,226,75,133,123,79,238,227,26,116,172,34,168,102,+236,161,15,251,116,110,23,18,253,148,119,183,198,56,79,53,139,16,84,23,+11,67,232,244,236,134,32,178,30,97,129,119,251,15,94,71,190,175,76,117,+55,250,180,81,151,120,137,46,110,183,60,128,131,76,134,80,143,25,154,144,+157,32,110,108,92,106,2,142,134,61,205,189,159,215,161,60,17,186,114,238,+100,114,73,63,77,43,159,39,25,14,184,179,117,34,103,43,89,225,1,80,+108,104,27,92,120,100,136,209,123,140,252,175,187,48,105,9,33,188,129,15,+71,70,142,41,105,245,67,227,146,141,246,207,74,245,1,46,109,156,244,216,+124,141,181,216,21,125,141,168,0,151,168,175,38,7,132,167,12,109,192,139,+180,14,193,126,96,180,253,84,152,67,122,107,149,65,151,235,116,216,85,25,+142,82,26,2,83,186,153,205,252,147,112,1,246,165,225,247,129,233,205,25,+93,103,73,6,232,61,37,56,111,173,144,20,186,125,120,124,56,26,226,111,+182,93,117,145,167,143,9,52,136,197,63,98,220,46,249,159,231,191,200,146,+177,8,98,193,87,251,215,30,163,4,247,147,68,246,21,40,86,103,54,152,+98,179,237,57,29,246,141,192,93,49,154,158,230,62,64,167,107,100,228,116,+37,47,7,16,191,110,103,161,148,162,38,53,47,21,189,45,237,99,171,113,+220,156,139,168,236,183,133,17,142,87,213,36,86,21,217,37,15,114,52,78,+129,108,224,38,19,40,87,225,149,230,135,251,48,72,51,98,97,18,18,202,+223,6,142,117,68,45,61,102,35,140,116,127,231,245,82,137,148,153,231,120,+107,184,66,227,211,192,68,165,174,136,206,43,99,53,180,241,26,53,112,12,+103,241,115,42,13,210,193,116,136,237,165,126,37,46,203,74,170,74,169,39,+207,155,138,148,29,125,191,198,162,101,85,20,1,252,132,235,126,45,237,138,+251,243,161,5,209,115,117,111,147,202,16,159,222,241,227,138,65,21,162,92,+27,68,205,42,209,88,188,219,195,144,140,214,184,203,23,41,228,62,14,15,+65,234,9,254,175,113,234,57,133,42,203,44,139,146,213,159,3,34,246,217,+134,46,111,61,176,239,93,29,84,232,37,215,237,94,122,145,217,54,144,83,+159,183,241,179,244,132,13,96,5,114,38,174,219,19,69,108,200,215,46,5,+228,214,161,229,166,123,191,172,118,217,98,109,143,60,28,246,236,144,127,202,+103,66,167,41,200,196,77,223,188,146,232,103,149,131,128,96,168,229,65,115,+51,197,84,159,97,209,168,55,234,158,230,136,96,124,109,203,200,49,19,50,+213,2,169,171,47,136,57,100,170,104,151,236,94,74,96,217,141,220,143,240,+52,40,159,22,165,236,86,99,27,154,232,145,170,36,95,107,138,94,156,249,+168,62,37,128,36,36,173,13,24,226,37,23,232,157,55,76,11,152,202,214,+238,224,108,191,106,231,20,44,48,87,3,39,156,78,46,185,42,214,69,238,+101,116,96,55,175,0,239,23,190,103,154,36,20,169,251,169,133,70,168,55,+50,165,185,90,162,65,134,197,24,68,98,0,159,97,8,149,233,12,145,195,+71,94,143,118,172,162,106,43,126,180,242,216,99,64,112,231,148,135,156,26,+43,88,59,40,81,121,161,28,32,222,88,237,191,179,110,106,9,45,221,7,+189,172,3,200,149,35,55,110,237,135,21,2,59,115,65,118,51,18,52,163,+10,203,25,32,174,127,108,148,186,10,186,224,191,60,66,30,203,118,20,165,+52,165,196,215,153,56,141,9,169,90,8,41,41,163,132,21,68,25,114,89,+88,178,8,191,10,217,51,51,25,135,9,137,17,95,62,214,176,60,248,13,+51,190,66,124,227,255,54,147,114,240,202,87,207,226,8,87,81,126,113,8,+227,138,4,229,243,7,129,91,217,80,191,71,76,118,114,144,176,101,22,118,+58,226,55,123,222,106,134,68,133,230,129,203,25,208,152,61,95,51,56,5,+221,183,69,0,9,242,185,188,155,68,55,190,234,120,26,77,226,159,167,189,+170,191,252,2,103,168,206,78,0,115,161,212,56,19,49,234,237,186,221,199,+212,191,27,18,10,243,118,31,80,181,216,201,143,95,39,72,171,229,175,64,+146,244,25,220,223,180,239,46,23,235,75,139,228,146,163,40,200,182,186,84,+230,56,1,147,201,8,108,245,10,176,155,101,65,18,227,119,225,188,23,134,+151,121,249,148,178,159,122,180,161,157,35,48,131,154,207,228,96,234,9,250,+39,56,37,239,93,24,209,116,109,220,185,68,249,39,144,204,153,200,121,62,+225,85,227,239,207,98,195,1,155,246,183,92,172,95,160,236,102,134,172,79,+29,43,232,205,175,200,161,100,53,248,215,106,231,223,85,188,61,79,109,29,+91,133,186,148,226,155,158,215,182,230,216,176,4,35,64,65,0,67,184,186,+82,101,226,49,242,211,204,139,28,196,201,50,60,148,192,98,114,50,182,170,+47,73,207,182,136,41,198,129,225,112,126,193,36,232,98,36,234,207,9,71,+195,245,68,1,13,171,195,99,123,60,212,130,101,165,61,228,202,19,250,14,+75,200,55,55,140,54,245,224,184,75,174,240,163,212,190,101,143,128,152,15,+243,56,193,143,95,156,72,88,152,108,146,143,90,99,234,164,244,37,106,15,+26,114,30,15,69,238,203,124,174,29,234,35,63,111,237,102,164,151,127,222,+65,25,126,86,76,143,204,250,20,3,22,249,191,117,69,135,167,86,179,46,+20,92,94,211,112,22,18,195,249,239,38,198,202,95,98,122,230,199,222,67,+140,159,207,35,167,108,3,184,188,189,39,157,149,119,245,129,59,195,253,18,+85,226,194,233,105,161,49,137,159,93,59,226,101,64,104,40,134,169,100,34,+179,51,136,209,71,121,74,200,206,26,139,96,166,213,106,36,100,83,177,111,+20,185,255,96,130,231,222,60,25,75,22,52,36,107,181,72,59,22,220,80,+96,8,221,129,121,15,182,203,59,224,224,242,128,54,208,72,203,243,24,13,+127,120,154,184,60,20,170,238,38,99,174,236,5,186,226,15,64,249,222,166,+142,127,171,118,60,213,63,172,60,239,118,117,243,93,164,21,253,197,233,172,+143,74,107,57,32,8,77,237,121,163,248,189,227,38,193,94,196,136,65,95,+189,70,149,47,27,165,171,229,230,177,241,237,6,154,67,173,201,178,130,255,+163,225,10,125,201,175,180,38,75,50,66,60,181,250,160,229,231,75,149,206,+15,207,12,208,131,230,78,180,67,127,153,114,178,87,250,176,35,68,168,55,+172,101,176,207,48,104,66,147,106,166,180,249,237,251,235,79,222,130,121,179,+3,151,188,94,132,55,132,148,2,64,242,224,233,40,2,181,241,232,173,76,+72,130,23,162,58,162,49,209,38,44,120,62,83,0,180,0,7,62,26,154,+126,43,68,174,91,3,177,227,18,246,102,106,220,12,18,251,46,24,55,64,+3,143,37,23,130,173,149,138,212,73,183,5,108,167,221,131,141,46,170,13,+108,240,174,210,64,99,121,212,228,128,100,212,165,146,29,139,3,46,67,179,+220,244,144,202,55,0,33,217,16,217,142,180,215,46,234,210,118,101,19,3,+201,37,149,215,52,17,6,251,77,70,114,197,255,69,151,55,169,157,123,178,+53,212,179,74,25,158,225,134,115,113,44,185,190,162,157,43,35,231,14,207,+208,94,65,181,168,144,116,153,209,232,74,245,164,120,245,85,116,151,146,134,+213,171,183,119,182,227,47,40,170,169,9,242,15,208,252,134,242,96,181,165,+68,3,224,104,102,114,171,63,41,162,184,247,14,215,12,110,67,198,73,168,+110,54,115,188,224,27,220,162,150,158,198,119,196,204,176,201,38,214,150,196,+240,135,152,188,36,127,90,254,88,81,160,36,59,1,215,164,239,191,151,94,+120,100,123,39,247,123,118,140,45,108,47,174,26,185,47,242,81,179,169,134,+82,72,135,182,33,223,254,214,163,127,112,120,42,23,143,20,37,47,167,184,+109,172,39,123,76,191,54,31,97,213,152,28,217,106,83,157,58,223,14,237,+104,227,245,240,235,109,85,212,196,108,229,61,87,248,78,173,216,26,68,126,+48,2,36,38,54,105,129,234,240,75,230,123,87,156,228,210,171,61,152,59,+69,177,141,227,28,120,199,188,77,111,202,161,17,110,168,86,218,190,26,111,+119,23,125,242,206,198,222,232,226,127,62,9,103,253,80,152,129,111,15,146,+214,159,85,199,131,29,100,85,196,76,13,7,79,204,82,61,45,239,94,103,+33,249,23,4,181,184,25,100,143,246,34,15,97,208,63,221,114,226,155,12,+179,63,26,192,131,92,156,169,91,54,140,236,38,196,96,0,173,144,200,5,+38,244,230,195,68,3,168,133,220,141,136,165,46,126,219,116,160,136,95,197,+62,152,183,50,75,143,148,177,161,130,27,4,236,164,87,35,29,44,80,110,+227,255,150,20,9,218,135,219,4,127,124,31,81,45,74,124,34,219,192,240,+140,231,100,253,86,252,137,76,187,147,144,14,104,79,178,248,59,162,121,42,+96,217,8,3,4,105,179,157,79,53,35,240,216,46,240,113,182,200,220,181,+254,29,219,179,14,188,235,12,218,56,161,248,182,153,130,158,93,171,201,255,+18,230,123,172,33,37,131,95,160,130,221,159,79,35,78,211,89,82,28,213,+147,174,134,64,55,177,52,132,63,25,122,149,105,109,31,18,127,244,18,225,+164,201,185,223,247,188,251,245,236,17,121,55,84,172,122,127,38,28,227,23,+82,150,196,105,241,221,162,175,222,73,44,48,38,7,251,66,131,87,221,53,+177,209,75,223,99,237,246,236,173,111,89,160,137,85,195,243,254,117,185,170,+12,36,45,1,195,99,28,182,109,52,101,82,181,34,177,123,104,215,89,120,+193,188,20,48,190,61,241,92,79,227,104,95,156,99,205,168,167,209,198,88,+80,155,79,25,214,236,54,201,20,151,148,155,119,200,194,178,155,250,248,46,+241,8,108,10,111,43,163,120,36,104,214,62,91,39,209,27,13,123,96,205,+233,129,113,94,58,232,2,119,66,77,245,66,103,88,43,230,246,57,31,64,+90,9,190,190,119,57,228,62,94,158,159,58,94,231,173,72,228,196,81,236,+135,163,46,110,69,218,237,234,208,229,43,47,37,17,81,142,180,127,88,231,+86,154,250,212,0,94,78,91,74,40,162,87,245,154,44,64,129,134,224,33,+61,169,186,210,213,103,250,140,74,229,67,231,78,174,185,88,240,209,198,183,+164,208,180,10,109,245,158,135,160,51,226,101,151,120,190,6,251,78,171,206,+195,12,160,67,229,159,184,73,126,237,130,4,243,149,127,57,82,25,174,135,+63,193,132,71,129,246,212,164,149,109,199,71,59,119,77,114,12,207,210,66,+161,90,204,155,135,189,161,133,16,255,24,39,107,152,31,253,43,220,131,138,+23,232,221,158,83,194,1,67,101,177,244,220,89,27,134,250,23,59,41,135,+148,78,108,25,130,160,35,42,24,128,23,219,28,66,249,247,215,142,204,0,+249,112,25,99,19,240,119,57,170,0,88,201,217,225,98,59,248,201,113,254,+193,79,115,41,97,231,6,119,245,248,239,174,99,21,118,52,97,223,240,11,+209,194,183,0,102,213,200,67,211,251,25,162,12,88,108,82,61,205,55,127,+8,75,208,223,130,72,198,252,250,168,62,195,202,23,45,55,168,167,153,66,+88,64,32,13,146,252,194,100,62,126,54,28,0,255,96,163,136,144,114,85,+94,137,119,170,182,2,172,146,224,35,244,84,132,0,223,235,105,189,250,29,+205,245,2,12,243,23,135,239,52,120,158,240,150,47,43,142,249,126,255,92,+209,156,172,228,26,9,76,74,192,81,1,134,67,82,253,39,105,23,251,206,+173,210,89,54,195,68,160,207,219,102,188,252,127,0,30,163,68,176,34,194,+240,1,159,122,74,146,38,157,17,186,115,241,141,46,118,129,9,104,82,191,+121,88,57,57,41,128,162,243,41,43,108,1,150,114,187,22,87,223,237,13,+245,27,4,212,89,95,153,180,121,27,18,53,116,157,83,68,5,44,26,226,+173,87,18,9,110,17,235,157,213,0,128,140,162,253,52,123,57,136,89,117,+6,117,176,50,60,226,133,147,21,70,89,172,92,120,65,246,197,250,26,46,+219,27,205,183,34,95,33,111,171,92,164,232,89,36,115,1,212,106,32,191,+169,169,107,172,0,35,185,128,2,87,42,91,80,145,92,244,102,162,217,231,+226,32,215,177,176,240,22,44,168,109,121,27,159,237,244,53,47,167,241,62,+75,89,39,113,37,24,170,181,47,9,77,221,249,59,234,175,206,179,36,222,+251,244,214,85,151,218,141,39,112,141,124,121,23,61,17,202,119,89,205,67,+148,47,120,75,128,144,35,243,165,176,43,108,241,87,235,160,82,55,3,106,+69,91,131,207,156,37,242,186,145,112,138,202,207,214,87,209,8,43,145,238,+118,64,65,100,82,205,35,194,248,87,15,24,237,114,98,93,46,71,0,66,+220,113,18,12,46,127,42,243,52,32,167,84,62,52,231,175,146,219,182,228,+7,201,213,67,1,211,162,7,179,160,214,96,12,51,160,144,46,18,129,48,+24,122,195,75,108,125,57,181,67,110,73,202,255,172,61,203,72,128,47,165,+177,14,237,126,169,179,249,89,210,188,197,195,159,144,7,168,6,202,9,30,+142,181,72,79,186,31,56,188,100,190,142,245,174,19,108,178,82,170,238,198,+218,187,188,216,80,163,162,43,163,243,230,167,124,174,119,162,244,223,227,57,+201,137,215,128,239,246,104,163,229,124,112,243,224,28,177,52,53,155,199,165,+10,221,6,177,127,69,25,237,132,4,248,128,82,60,168,132,171,28,234,157,+36,155,182,147,107,3,166,64,33,125,12,196,187,166,31,78,219,82,16,183,+131,190,59,235,133,5,160,139,149,100,24,168,182,52,207,133,187,69,116,217,+245,148,4,114,5,106,145,87,104,32,147,241,247,29,174,26,144,75,245,179,+0,148,160,155,232,206,115,19,46,68,151,97,118,130,184,177,234,21,173,241,+251,250,151,109,120,67,189,42,230,45,199,145,75,219,219,207,140,189,51,62,+89,95,195,171,55,198,67,9,61,144,69,168,253,188,88,174,116,201,141,127,+175,211,75,73,51,166,40,181,91,64,15,238,34,170,81,75,177,10,51,13,+205,7,50,156,210,77,62,123,202,208,201,240,92,164,19,151,78,156,131,194,+180,158,57,117,236,116,248,0,188,155,215,55,196,208,30,234,55,91,228,118,+232,39,250,116,88,138,165,21,19,104,198,77,248,150,70,148,201,74,145,190,+189,157,137,51,59,40,129,29,42,31,88,108,97,207,119,98,35,8,122,75,+171,238,21,106,206,121,242,157,115,232,71,55,91,113,8,168,211,99,41,15,+110,9,154,85,181,61,171,2,171,130,90,167,135,96,113,126,6,17,9,30,+104,5,216,104,247,162,97,95,11,46,245,241,203,62,251,185,65,217,88,249,+64,128,105,138,20,7,83,211,120,216,74,2,141,201,116,235,230,203,71,42,+90,226,5,239,105,13,171,220,123,120,188,92,127,208,185,158,240,12,3,158,+58,248,172,140,42,122,52,185,133,13,83,212,228,125,181,153,234,109,239,16,+104,251,63,33,200,138,58,247,198,103,43,254,89,1,233,240,143,243,53,23,+184,216,96,147,225,40,16,50,240,54,190,175,46,36,182,186,186,206,75,164,+136,148,119,80,60,69,17,203,128,218,6,119,108,8,213,224,139,82,46,227,+139,175,249,104,176,71,188,117,137,129,16,217,14,21,29,80,139,92,91,211,+37,16,254,68,248,3,195,50,34,209,98,99,192,87,23,50,140,182,226,26,+80,194,57,117,152,71,40,43,173,222,239,18,50,181,40,96,120,199,61,80,+6,152,37,21,17,116,237,154,169,110,214,1,207,217,85,195,76,188,162,67,+236,42,211,141,213,176,21,137,144,13,188,25,161,123,91,59,173,95,152,247,+252,163,243,203,121,151,190,150,103,121,94,226,145,255,211,72,187,176,220,237,+251,36,134,234,16,26,126,205,163,44,144,202,77,222,87,250,49,173,134,245,+140,11,100,187,12,92,205,130,56,112,16,42,73,7,115,115,31,162,56,61,+146,40,207,230,169,228,156,109,16,90,80,59,100,156,163,233,177,63,156,164,+11,67,70,110,174,87,11,166,112,92,233,21,6,142,211,18,39,106,43,25,+2,54,134,125,110,234,148,243,191,168,134,128,80,56,174,175,245,132,105,77,+128,113,36,193,174,220,185,82,11,212,242,95,54,97,163,140,106,29,13,166,+109,116,184,123,244,210,174,71,76,151,221,252,171,177,177,1,203,254,120,149,+123,64,242,108,199,207,159,16,163,72,187,145,180,42,160,9,16,200,63,185,+13,98,223,123,148,142,142,175,162,78,108,229,146,168,49,148,144,48,121,141,+191,27,19,13,199,21,240,65,50,11,28,91,229,38,85,44,244,172,199,88,+205,228,119,56,153,86,154,91,66,103,142,252,43,41,33,171,59,34,107,232,+73,225,78,248,125,55,106,58,96,240,192,83,112,145,101,241,154,174,139,187,+98,243,206,51,44,94,183,7,174,200,99,34,127,105,153,231,11,34,22,218,+19,114,43,38,252,156,120,235,126,68,165,129,249,172,86,132,63,30,154,132,+59,51,237,100,14,249,119,227,116,73,44,17,21,106,33,162,167,3,247,241,+126,221,186,179,104,84,53,132,34,18,31,80,72,161,62,169,242,6,89,43,+56,80,239,113,4,77,143,151,255,119,117,73,92,141,96,11,209,232,12,97,+38,154,19,138,151,247,222,131,109,102,146,64,4,69,105,231,66,138,89,43,+189,234,154,7,153,47,151,101,210,167,43,25,136,5,98,145,233,227,184,140,+53,167,200,181,39,211,251,20,47,196,92,35,191,120,17,132,227,90,10,238,+38,151,118,156,32,183,113,164,202,211,92,255,141,45,46,43,215,199,82,10,+41,6,102,186,126,181,11,61,130,203,217,29,180,89,60,98,151,194,215,95,+252,172,50,146,143,66,90,242,27,35,241,153,246,252,5,168,213,216,157,151,+9,40,174,83,47,170,241,65,72,102,142,223,196,199,62,161,129,115,101,144,+175,60,14,4,129,121,84,23,9,109,161,217,211,7,49,188,117,176,121,134,+75,201,28,168,57,61,61,155,62,72,68,101,210,192,59,175,44,197,115,254,+10,119,25,201,173,56,163,103,113,162,84,41,130,116,17,15,121,87,239,228,+24,222,173,83,207,47,111,9,175,98,176,146,170,39,127,47,255,212,61,76,+14,233,220,137,234,187,68,176,148,217,166,161,139,202,126,12,112,83,238,221,+108,125,202,122,211,169,164,142,120,211,80,220,181,73,246,121,184,54,76,159,+119,180,144,246,121,113,50,212,23,42,64,184,69,32,64,236,156,11,146,217,+91,35,45,192,50,120,25,3,225,33,91,252,151,163,136,218,5,136,240,8,+69,220,212,141,123,151,180,192,99,90,2,237,178,249,205,114,211,129,174,141,+245,250,0,251,189,243,187,9,139,221,255,17,252,4,61,203,11,231,158,54,+156,241,122,100,25,14,31,160,97,22,96,123,227,91,203,107,21,20,253,124,+138,67,225,68,198,3,155,55,159,48,24,138,186,159,217,112,74,80,91,31,+78,78,239,241,218,160,249,105,241,33,22,189,232,33,128,195,43,95,110,178,+112,70,188,184,210,33,218,37,55,62,125,137,119,187,80,184,31,66,91,251,+115,71,170,244,203,176,70,65,101,8,125,245,236,230,229,18,8,154,26,18,+85,57,125,40,237,136,151,203,174,71,62,91,177,251,103,14,196,105,108,168,+161,7,120,2,171,146,6,37,91,34,140,174,109,75,45,163,84,17,120,63,+0,219,179,90,225,72,144,229,56,92,123,108,204,62,141,235,48,120,154,173,+70,141,51,183,186,33,199,44,241,215,121,127,103,95,120,28,155,189,25,98,+171,139,196,244,226,4,123,71,139,29,97,122,109,125,170,93,147,94,196,41,+154,27,202,154,151,248,97,50,221,52,46,196,35,190,241,247,50,94,79,134,+126,184,212,44,254,5,158,219,182,97,180,213,8,142,137,28,205,57,4,82,+234,182,20,20,212,126,186,246,132,240,17,66,124,170,144,176,187,51,148,30,+183,19,168,161,74,137,96,195,163,213,103,216,245,101,173,232,34,122,92,3,+36,84,41,96,175,176,9,37,196,112,65,156,140,189,32,193,215,251,245,249,+116,35,232,221,175,94,54,187,120,49,33,130,184,141,42,93,206,25,230,91,+20,18,117,104,164,199,134,86,64,90,30,100,236,197,57,147,181,245,228,63,+41,44,129,138,64,7,162,43,9,87,84,94,30,200,171,145,99,39,251,211,+243,39,167,176,175,92,83,210,140,242,228,101,186,175,71,199,180,20,62,149,+139,29,54,218,8,234,5,2,216,23,25,29,114,18,35,166,112,87,207,220,+164,45,206,183,13,30,108,209,186,23,66,113,193,57,104,63,37,97,108,154,+37,167,65,147,35,117,5,66,40,59,187,20,211,197,206,218,49,220,148,24,+97,237,198,115,191,142,133,230,136,72,13,46,68,48,203,232,155,15,226,41,+191,51,189,179,43,113,103,49,193,17,251,166,33,13,74,49,97,148,4,78,+155,125,69,185,161,236,32,24,3,126,96,99,128,230,64,236,96,205,93,0,+208,44,79,194,11,112,12,113,40,252,198,218,197,135,45,16,0,230,154,7,+131,253,56,178,161,90,40,255,178,57,198,111,221,97,35,112,181,231,159,229,+88,185,133,103,81,138,46,194,111,141,189,164,43,233,213,143,64,73,102,234,+237,139,40,208,102,129,211,247,92,240,89,243,11,225,90,238,5,51,101,199,+221,130,150,254,208,71,242,241,13,77,49,108,133,205,239,59,185,76,163,150,+25,38,216,50,146,35,171,167,50,53,227,72,214,168,190,59,210,252,176,120,+122,16,100,64,171,103,71,25,161,41,109,201,46,194,181,155,79,149,67,83,+234,154,66,12,77,113,19,74,23,240,114,22,190,66,141,45,245,115,34,37,+224,235,91,110,6,250,63,6,5,245,32,100,239,229,218,131,75,9,226,105,+105,195,192,93,111,94,2,145,69,255,47,218,29,218,90,68,231,121,43,179,+111,90,54,153,192,16,191,251,220,192,120,74,58,95,173,95,185,200,72,236,+11,95,181,167,48,134,74,187,71,20,151,120,148,43,76,24,155,253,247,123,+87,223,223,190,107,103,147,123,254,158,136,165,223,119,125,245,99,186,130,117,+79,237,53,107,206,242,200,118,96,33,231,91,4,146,219,180,18,145,231,113,+120,66,150,105,102,169,89,44,120,45,91,158,14,1,106,117,252,104,100,46,+27,175,39,226,123,246,167,186,200,235,247,35,106,231,168,247,254,231,167,248,+151,114,84,83,178,181,187,4,50,144,235,206,113,223,1,15,157,116,171,82,+40,30,203,57,129,210,165,251,116,140,10,78,194,40,91,45,92,47,21,236,+230,122,225,168,131,131,129,251,99,218,159,101,117,136,48,132,49,199,133,89,+57,101,107,102,109,112,211,158,238,12,134,140,10,21,32,14,204,192,223,23,+42,94,113,39,157,149,168,77,183,6,138,217,236,177,245,154,98,175,175,220,+129,214,12,39,156,105,234,100,153,214,118,220,113,99,52,67,165,245,254,232,+5,63,184,63,51,10,66,129,97,183,55,227,183,12,109,116,49,106,254,86,+231,167,119,173,245,50,34,212,138,88,20,56,19,218,77,60,61,194,137,207,+250,67,189,24,156,239,67,0,135,114,233,178,4,8,18,137,141,185,139,156,+155,129,125,21,209,236,129,59,216,162,158,53,103,217,94,216,129,221,151,146,+207,108,11,173,216,37,214,48,125,208,120,254,109,253,119,197,182,202,35,221,+174,203,37,239,61,146,197,99,10,51,46,163,189,66,82,203,118,242,34,175,+230,198,61,240,154,33,194,38,253,144,158,119,119,22,123,154,29,106,34,84,+0,118,116,82,24,47,82,159,96,58,108,190,9,1,11,248,250,17,208,126,+62,254,100,36,40,115,246,75,133,142,21,193,231,95,40,39,133,34,244,124,+78,111,114,92,46,125,153,35,52,46,72,233,80,103,118,170,74,84,115,39,+68,82,190,36,195,75,19,103,130,53,58,213,51,170,67,76,15,212,14,156,+141,206,171,171,84,255,214,132,183,137,168,0,19,62,62,131,228,52,84,168,+154,148,44,129,3,176,38,17,65,0,243,129,218,115,198,242,168,243,11,227,+39,174,25,252,26,231,61,26,49,130,143,245,147,121,18,139,127,162,97,165,+32,160,43,61,22,57,75,3,216,121,198,195,22,193,140,15,133,4,146,245,+13,49,131,215,26,78,183,38,198,182,70,59,183,175,36,28,110,21,118,228,+73,87,124,94,125,171,242,170,44,151,233,74,234,248,2,123,245,189,215,42,+113,60,255,98,215,174,37,137,216,56,247,47,128,19,224,155,52,119,237,245,+143,157,49,200,139,206,75,213,155,188,46,77,243,113,51,189,181,48,109,173,+199,125,145,27,22,83,142,76,220,88,239,65,219,117,130,99,34,203,125,37,+45,77,229,154,9,35,145,205,158,6,100,165,95,5,39,172,115,62,104,75,+218,86,246,213,246,174,122,217,84,169,55,50,93,140,239,138,37,2,219,13,+246,59,145,202,62,144,148,109,118,60,127,254,110,184,130,229,16,91,132,84,+116,220,162,115,29,36,170,205,127,80,56,175,46,246,168,190,120,122,70,3,+26,51,166,183,236,35,214,195,26,158,123,154,124,250,153,202,154,231,246,95,+188,148,241,169,14,162,90,157,131,19,191,122,50,116,2,4,208,75,157,145,+148,104,245,68,7,12,61,113,207,249,224,120,64,69,20,213,21,186,2,76,+41,39,88,168,245,253,8,175,176,31,11,58,43,175,128,6,96,210,164,142,+195,119,149,38,48,156,154,73,166,204,102,194,167,213,7,28,186,224,74,48,+24,21,83,127,8,81,212,41,59,253,68,127,92,124,255,25,19,120,42,167,+120,209,120,162,112,20,36,179,167,14,153,148,12,246,212,133,197,240,176,69,+232,120,26,216,162,1,30,214,155,42,113,82,77,150,212,175,185,208,222,29,+114,231,113,210,160,23,221,21,140,188,103,111,78,112,116,170,218,176,102,110,+73,13,43,83,71,153,116,17,112,202,145,130,179,47,69,156,86,101,107,133,+177,153,87,188,237,22,176,99,107,106,155,224,72,175,98,221,189,210,252,148,+76,153,181,85,143,25,186,152,198,117,71,150,39,51,31,86,228,210,203,141,+207,220,82,204,15,192,76,12,98,25,150,57,75,182,204,103,70,236,18,213,+66,251,30,38,143,10,204,55,183,0,252,4,242,163,77,230,192,146,93,16,+32,100,203,131,88,244,120,136,208,207,241,161,237,202,35,134,77,228,30,33,+149,56,204,198,212,59,240,164,58,49,19,37,43,13,59,39,11,201,181,197,+28,175,36,126,76,168,23,156,40,191,200,163,151,134,104,201,119,66,192,188,+51,251,27,131,220,209,153,4,153,23,153,64,228,237,57,23,109,80,170,77,+220,117,229,65,36,34,117,7,206,134,228,198,87,239,170,241,177,166,49,213,+133,10,189,14,103,36,21,209,151,23,170,224,254,24,102,202,58,179,172,186,+83,134,199,146,60,65,173,164,200,16,116,136,62,206,6,140,162,23,62,30,+14,191,50,16,248,46,237,182,127,20,141,89,162,170,5,249,187,119,163,84,+97,237,39,218,63,233,207,211,20,3,13,209,142,69,121,76,211,245,51,143,+6,213,239,72,8,72,49,132,75,202,24,173,97,105,237,108,237,148,73,238,+186,216,150,220,210,31,224,151,210,217,151,187,109,20,37,182,67,3,117,156,+41,212,2,111,56,69,46,63,127,173,210,13,112,45,156,243,157,101,171,75,+197,34,111,27,204,157,51,244,4,93,223,74,60,55,88,151,192,112,150,143,+174,202,50,8,250,233,111,15,221,25,125,179,79,46,13,79,172,213,126,104,+239,242,148,29,233,87,64,151,103,43,125,123,240,156,43,28,144,129,146,201,+211,69,85,64,94,205,18,65,11,111,222,173,230,187,29,105,215,68,115,92,+42,210,46,232,63,226,95,136,176,89,126,51,245,144,105,63,134,251,246,20,+127,222,82,177,179,150,234,228,16,47,47,75,80,32,175,131,123,128,16,216,+254,205,230,95,137,230,185,112,63,255,138,39,87,39,147,57,87,106,167,14,+195,246,202,107,36,168,173,92,68,20,156,250,112,66,181,63,107,243,233,39,+170,162,65,81,146,6,187,37,54,90,93,143,255,136,21,247,96,102,21,226,+55,56,232,232,239,135,233,115,114,166,216,251,91,240,181,160,148,243,209,187,+193,186,130,202,18,105,96,8,17,34,64,127,247,11,224,151,222,181,118,16,+132,8,232,17,116,86,171,117,57,200,77,86,91,18,176,240,144,104,34,87,+133,232,179,67,61,247,38,41,205,106,62,163,77,179,62,169,138,207,120,94,+214,9,63,239,56,150,153,6,247,90,67,175,79,53,166,48,230,25,247,75,+58,196,7,177,81,241,69,189,202,46,90,51,105,172,196,117,66,232,3,68,+190,176,120,155,226,148,227,243,178,23,41,195,237,132,155,173,16,163,110,165,+124,83,103,140,14,79,46,47,227,41,35,192,43,104,243,169,170,174,191,239,+90,87,206,123,252,151,148,52,28,190,2,123,197,113,175,146,85,254,249,33,+232,188,7,174,27,39,104,149,204,45,158,150,96,251,102,57,0,200,177,34,+221,131,10,36,116,20,13,0,41,198,231,168,55,196,239,37,129,12,120,148,+148,234,38,131,195,17,136,38,126,212,201,244,137,8,172,203,46,70,142,195,+219,28,22,18,71,28,66,92,88,87,225,11,67,179,111,143,50,193,253,98,+180,106,73,173,229,185,103,23,156,198,91,107,41,45,97,131,92,241,86,186,+238,69,171,141,32,201,165,210,129,61,136,93,16,195,20,131,52,210,250,5,+54,149,30,151,83,94,31,49,174,175,72,48,155,93,184,237,8,210,235,3,+13,21,66,50,133,8,166,153,128,31,168,104,170,176,154,73,194,73,196,203,+221,40,174,12,222,249,250,254,119,159,63,73,142,54,43,209,160,100,227,167,+105,199,115,71,67,45,162,139,39,14,255,198,180,63,160,155,71,184,149,154,+25,101,51,164,251,252,31,231,57,253,50,234,214,81,126,196,72,93,226,64,+120,109,160,13,64,190,79,211,125,244,129,166,90,54,12,111,220,11,91,215,+122,224,24,134,134,233,163,157,106,90,22,148,84,67,214,13,99,21,27,242,+234,9,75,76,160,58,28,51,117,240,60,126,220,251,172,52,115,4,86,137,+193,34,212,30,251,153,80,188,209,59,51,53,251,72,47,193,52,32,144,40,+2,94,25,60,73,19,121,152,205,201,81,160,216,240,16,195,254,133,159,105,+83,129,128,58,62,110,139,5,250,111,219,169,204,191,127,242,197,48,68,205,+161,5,8,160,224,161,114,204,214,26,31,182,228,253,100,238,103,156,248,60,+129,169,26,136,210,14,145,195,107,156,44,144,14,140,133,128,149,83,110,196,+184,22,15,226,93,190,226,242,242,215,37,12,181,30,211,226,177,126,1,118,+154,86,35,187,147,178,93,99,120,232,15,252,58,189,201,172,158,196,183,188,+223,34,120,126,254,230,216,187,96,150,212,48,233,149,127,63,235,48,6,242,+67,183,2,183,90,174,90,239,117,15,1,38,159,18,72,86,204,119,100,195,+224,107,57,6,118,216,147,50,25,130,14,117,199,185,173,229,108,193,106,140,+174,91,218,208,230,85,30,34,154,144,132,142,76,63,34,31,26,15,9,33,+24,4,23,149,251,149,145,125,112,225,244,89,117,222,14,169,191,59,70,175,+110,210,75,56,13,28,6,95,220,34,122,50,207,67,164,121,113,2,146,38,+115,186,114,202,182,196,16,169,245,188,1,180,238,29,29,206,255,200,89,232,+49,31,48,100,108,168,122,188,0,239,241,233,214,60,53,143,145,235,70,152,+144,91,182,23,28,119,55,188,122,132,114,21,144,164,245,41,116,236,207,185,+231,53,61,104,198,48,171,237,47,203,128,161,63,245,162,91,118,131,161,61,+54,238,194,135,65,26,220,173,143,111,101,57,241,18,84,4,245,93,36,15,+98,11,234,45,136,203,250,123,214,49,80,118,175,129,148,121,53,181,229,222,+229,44,225,159,63,190,8,88,140,111,46,95,202,56,5,194,57,87,119,131,+197,222,41,27,49,240,247,213,125,241,254,117,43,157,211,40,202,95,222,89,+61,228,110,220,74,13,80,110,182,28,74,244,187,91,99,218,158,26,255,167,+232,151,221,220,187,198,255,64,93,50,253,243,90,93,211,20,244,220,5,70,+88,20,66,246,252,139,208,64,170,242,142,2,8,194,181,145,157,27,52,118,+137,145,127,136,181,3,74,166,190,97,236,214,103,252,89,32,198,175,204,166,+239,168,157,253,62,212,238,141,222,158,35,227,134,125,250,96,39,118,69,234,+97,206,20,201,138,19,147,188,46,10,73,238,78,122,14,177,185,13,1,151,+199,104,239,65,228,18,248,86,184,11,18,8,197,245,159,87,246,32,216,95,+220,241,202,84,249,200,251,245,141,99,18,143,5,165,228,224,77,174,66,171,+30,136,234,130,155,219,90,252,224,249,193,47,120,105,111,124,195,186,254,124,+214,27,164,233,6,145,98,197,180,242,174,226,123,242,42,247,12,181,49,99,+103,97,123,253,0,164,92,34,182,6,104,244,1,72,6,45,122,211,64,129,+75,242,240,172,178,194,181,77,127,89,132,53,181,187,208,22,206,157,4,179,+184,20,142,21,180,109,165,229,156,138,253,46,183,119,217,145,35,111,222,115,+144,158,41,180,98,60,130,157,21,144,93,228,202,186,174,163,124,98,66,216,+255,244,181,169,119,69,48,242,139,199,42,11,147,32,116,216,93,118,160,105,+179,240,171,98,64,242,164,37,28,1,191,238,76,199,202,47,171,251,107,101,+168,187,7,20,149,220,110,230,62,166,120,252,188,220,32,247,25,67,104,138,+202,118,33,205,80,148,169,77,214,146,184,98,231,223,81,100,218,221,36,17,+174,245,222,241,118,151,149,201,148,153,21,215,65,114,4,71,172,92,160,234,+144,219,170,28,9,149,8,7,144,120,162,147,113,123,3,8,121,138,30,102,+58,150,218,4,202,135,22,176,38,23,202,231,83,84,179,77,216,197,45,47,+182,236,169,75,31,210,243,202,13,45,78,1,91,135,125,31,4,36,192,128,+118,162,231,158,75,239,199,121,106,198,180,190,215,64,237,254,58,209,202,46,+140,233,230,236,195,60,208,94,13,144,7,30,135,253,241,183,200,38,239,87,+2,116,119,51,242,249,202,92,187,73,140,238,77,96,123,193,237,204,224,8,+113,217,237,21,134,5,162,178,111,79,25,139,149,200,212,196,102,160,6,24,+28,113,49,57,183,61,62,32,45,107,201,35,52,85,200,175,73,54,53,186,+189,227,76,69,55,43,195,91,36,55,254,44,94,14,211,147,5,154,125,251,+200,108,101,145,125,42,125,199,15,132,192,175,235,62,72,121,183,21,32,29,+38,2,116,44,36,93,27,35,214,49,118,180,220,254,63,177,213,91,19,246,+139,219,201,47,136,55,202,168,174,57,223,232,172,202,221,138,113,178,125,146,+231,226,197,66,217,102,135,187,75,35,172,9,74,28,49,115,186,83,190,7,+199,36,151,143,82,225,133,115,167,134,132,32,6,228,154,223,44,47,15,154,+86,173,152,171,30,171,104,32,90,189,159,185,45,243,2,88,206,128,13,75,+14,115,223,21,184,215,151,131,63,245,93,202,104,52,65,61,237,248,43,174,+19,10,33,91,133,100,127,143,103,224,218,132,20,104,107,79,235,138,31,5,+182,55,33,147,243,209,56,35,207,112,171,137,220,51,115,19,233,91,176,95,+18,134,231,207,154,96,3,71,140,105,62,40,230,123,153,131,188,11,185,94,+245,37,155,235,1,65,74,153,115,150,135,155,177,200,233,192,244,234,167,55,+154,158,62,19,85,221,116,156,224,127,160,138,240,211,216,142,43,166,19,222,+145,175,122,58,167,98,187,94,176,15,83,182,220,113,239,133,154,142,158,129,+81,9,52,176,36,92,218,184,184,139,169,106,96,199,171,174,241,48,19,132,+188,174,39,212,62,33,18,218,152,179,237,183,130,24,245,165,250,188,90,4,+62,247,23,201,28,102,88,160,34,23,149,6,202,103,152,222,196,230,141,170,+181,119,40,202,73,125,102,176,137,188,40,114,165,218,5,136,94,42,77,215,+172,201,97,141,137,196,92,123,106,176,48,52,147,139,102,146,62,209,154,83,+235,15,142,243,184,128,73,1,194,223,75,93,80,60,123,45,55,248,183,7,+249,0,150,55,171,41,10,243,206,92,144,224,96,254,146,81,77,118,0,237,+130,16,221,149,68,133,192,181,85,244,232,214,158,65,142,86,154,140,80,147,+60,193,154,70,103,94,41,43,202,2,177,155,98,254,90,108,122,59,3,69,+208,7,210,110,70,16,238,7,218,217,226,104,32,31,189,255,81,220,220,144,+17,3,218,112,46,189,192,80,240,42,56,137,41,152,179,150,69,236,250,150,+177,120,36,12,46,70,87,199,70,73,125,13,130,199,43,107,168,231,59,17,+165,15,61,64,1,128,173,0,97,199,6,122,169,75,157,43,53,91,212,204,+252,104,245,211,27,172,16,62,74,124,118,150,114,41,19,207,1,250,149,175,+22,167,135,58,187,149,240,96,93,10,193,86,82,101,147,17,35,109,200,40,+142,129,170,223,2,17,63,140,206,219,102,120,51,177,31,102,229,11,48,31,+111,180,162,22,248,128,13,214,174,218,142,66,106,185,98,97,239,105,176,106,+182,39,22,108,16,199,20,47,201,150,166,127,18,71,241,192,245,37,109,226,+142,42,37,85,71,175,25,143,29,12,5,236,39,13,99,216,236,67,191,239,+73,88,16,159,24,142,139,108,222,18,218,92,42,206,215,113,171,248,75,152,+193,109,48,116,200,44,149,149,250,200,32,68,34,62,0,201,148,78,89,89,+254,51,15,84,93,23,90,116,120,212,139,23,138,139,178,102,115,160,83,114,+197,8,252,249,186,234,19,41,96,78,0,62,219,28,101,31,233,182,24,48,+56,152,10,188,136,102,247,33,102,215,153,246,35,4,255,150,149,82,187,36,+31,174,61,61,248,63,141,111,17,122,106,233,204,13,175,149,213,145,67,113,+167,74,85,82,248,37,110,19,49,109,97,217,123,212,0,146,254,199,176,210,+246,124,89,86,18,160,91,85,117,193,208,166,245,207,175,169,132,15,19,22,+195,121,74,105,152,129,207,224,40,177,82,77,243,214,133,20,174,150,120,140,+242,251,157,196,67,226,242,186,20,19,176,139,127,1,241,10,235,67,81,96,+76,138,198,246,107,151,249,141,232,140,20,118,60,174,163,102,155,209,190,95,+32,10,64,149,190,176,142,156,166,216,244,55,246,31,207,29,75,10,147,155,+176,78,7,59,223,154,3,31,72,229,190,22,255,222,26,179,109,168,200,162,+83,192,210,142,180,180,32,135,191,174,182,4,35,120,251,155,42,33,76,32,+73,2,172,72,47,166,168,7,174,138,243,225,138,229,211,106,48,136,41,160,+21,180,129,109,111,146,191,84,249,19,243,64,70,124,173,160,115,133,170,190,+152,31,158,14,164,151,29,136,234,158,60,215,116,26,244,52,139,153,126,166,+143,151,161,162,157,34,124,245,42,94,211,163,157,167,168,18,22,215,122,165,+239,93,159,206,17,19,145,53,131,56,104,155,45,116,9,167,178,170,101,225,+242,136,53,196,106,48,149,254,137,1,2,55,44,74,103,111,97,216,109,102,+35,139,8,154,136,232,224,118,192,31,109,155,179,137,109,30,238,218,93,122,+88,36,87,75,221,187,200,13,224,75,65,31,3,163,175,183,24,185,161,139,+216,168,175,24,40,121,140,65,225,132,205,192,206,168,138,183,17,18,194,98,+0,148,223,224,141,95,235,144,141,172,53,199,181,156,30,113,96,183,15,203,+51,35,179,78,54,68,155,0,20,137,64,148,160,163,43,238,214,53,39,188,+72,211,47,173,226,118,39,150,226,176,116,136,73,199,25,111,223,157,142,39,+178,49,27,39,196,223,37,140,223,33,134,187,163,51,156,203,60,35,81,196,+205,193,215,3,113,110,112,128,186,57,178,50,240,36,186,243,175,215,5,152,+195,67,48,64,214,15,24,127,67,19,200,0,28,254,161,119,124,99,139,12,+83,45,21,214,25,94,123,194,134,226,77,60,53,120,139,98,51,232,246,123,+161,160,51,142,192,64,40,13,65,183,89,64,222,11,253,79,224,124,106,86,+145,174,252,9,226,233,17,48,210,71,43,49,64,12,86,16,197,234,156,100,+13,148,22,94,6,226,112,247,191,162,149,121,226,195,142,32,38,81,123,89,+240,206,209,200,151,158,27,28,90,131,15,27,140,12,220,220,141,240,130,6,+35,151,56,92,101,196,210,56,140,115,66,176,190,97,104,7,224,234,16,19,+76,160,65,141,124,216,183,227,192,143,77,5,195,139,167,16,38,122,188,6,+228,186,93,39,11,113,14,211,232,21,41,59,111,61,34,213,221,56,91,251,+184,95,228,191,139,26,186,235,42,16,100,165,219,131,33,72,252,135,56,252,+187,24,248,146,30,247,51,123,36,166,107,16,96,25,169,165,197,232,230,132,+243,4,126,173,113,240,54,209,97,114,166,183,197,208,6,117,86,147,231,217,+100,233,78,193,244,219,209,221,88,138,188,203,254,1,181,19,247,213,10,184,+146,200,146,154,153,45,232,139,253,95,195,133,200,241,176,200,203,217,59,65,+185,44,232,193,42,200,185,52,154,243,226,1,144,132,190,92,79,219,153,52,+84,93,65,49,18,138,39,148,72,178,83,224,6,59,92,148,88,183,244,153,+181,96,231,213,208,207,156,217,172,206,84,67,185,134,186,224,125,17,153,208,+11,100,172,208,42,252,163,211,169,137,148,203,100,53,108,28,134,1,109,35,+74,130,191,187,65,196,132,61,123,72,73,242,0,99,252,27,238,38,122,109,+239,119,254,132,81,100,79,11,27,131,94,100,133,205,101,242,45,192,115,147,+201,113,184,84,249,222,254,182,191,140,55,117,170,188,147,202,109,161,119,3,+105,130,99,199,123,253,121,168,69,189,108,35,236,119,186,118,233,133,10,125,+35,83,56,1,93,109,31,211,86,228,238,117,218,207,120,58,151,19,105,245,+30,146,48,57,45,34,103,116,63,0,106,76,249,3,197,14,151,36,54,84,+185,38,98,156,85,30,171,230,118,119,99,230,206,177,81,238,173,47,122,190,+223,241,84,115,204,85,82,206,176,37,206,209,108,198,78,85,58,160,243,192,+82,4,218,111,150,106,163,147,102,21,236,44,109,101,30,53,166,114,117,138,+15,189,197,29,157,11,55,59,231,182,81,190,133,105,194,236,94,7,204,252,+82,46,95,237,12,155,154,100,148,150,236,247,167,2,81,99,165,218,112,83,+68,65,94,231,49,83,195,156,84,108,164,184,140,1,73,229,98,6,204,221,+50,61,0,179,148,49,47,240,187,157,6,71,223,228,253,46,112,60,111,213,+36,186,253,174,78,238,204,45,111,115,144,228,124,250,254,173,223,212,180,232,+84,140,128,158,127,247,182,233,234,169,234,114,114,14,50,200,182,112,18,2,+99,90,101,28,142,253,50,9,196,170,110,179,52,44,167,158,50,209,201,139,+81,189,162,249,235,179,50,123,6,2,68,175,181,209,157,57,51,89,148,236,+181,64,22,72,144,18,85,72,114,227,53,249,234,207,88,104,152,28,157,118,+186,11,43,237,192,87,0,214,94,136,113,155,32,100,85,180,145,220,52,185,+78,47,131,232,6,160,8,215,163,243,151,86,27,187,47,68,92,211,145,100,+177,209,153,104,209,12,191,15,71,58,184,178,171,186,170,246,89,56,252,29,+70,103,92,216,99,246,156,55,3,215,204,237,178,147,16,174,154,222,137,225,+109,103,216,84,190,192,110,128,134,134,105,14,91,214,56,206,151,40,118,35,+175,33,121,23,91,177,159,115,248,186,57,146,239,211,104,143,100,46,193,217,+162,122,8,8,114,27,191,101,40,181,245,146,52,191,187,124,30,253,206,73,+237,35,52,97,15,116,252,155,59,235,104,131,245,193,107,83,196,35,196,239,+235,158,219,212,94,15,240,27,164,208,24,20,251,135,50,120,46,214,151,196,+13,22,236,85,94,153,50,242,16,160,28,162,252,43,185,95,195,197,7,78,+60,72,132,57,26,115,142,65,142,165,127,111,9,201,54,153,176,255,241,76,+96,207,242,7,150,156,250,78,155,30,50,154,229,14,187,54,233,217,192,243,+211,81,134,102,215,135,143,75,56,25,46,50,251,150,0,169,101,98,74,148,+32,141,135,83,102,59,216,148,241,194,163,55,118,78,24,177,104,69,63,235,+98,229,215,146,203,142,0,96,203,215,31,4,85,88,9,49,152,222,108,150,+79,87,93,183,211,81,217,147,181,166,145,17,92,250,181,3,40,133,43,33,+55,103,139,62,67,214,127,197,31,39,106,59,70,82,168,107,41,31,102,227,+155,168,14,76,22,96,74,18,65,241,36,158,138,6,159,140,79,194,225,111,+190,173,82,193,166,63,33,216,222,97,146,238,176,163,168,4,101,122,213,239,+79,73,92,7,195,213,154,171,55,140,74,133,155,126,163,203,223,231,159,191,+65,76,93,33,19,208,8,254,239,237,75,98,219,134,175,183,253,66,250,213,+160,196,99,186,41,71,155,234,207,93,160,225,150,211,150,68,55,247,235,45,+200,73,119,69,213,90,103,220,131,109,110,76,248,20,218,128,59,99,76,92,+104,237,101,49,146,15,60,157,226,253,120,183,31,235,29,141,221,90,163,130,+170,163,1,71,63,94,33,112,120,9,135,149,186,142,152,89,15,174,252,205,+180,5,180,206,148,158,14,14,52,124,145,51,2,251,158,109,171,196,255,123,+134,40,141,249,43,74,83,118,3,102,71,99,193,245,250,139,188,83,92,134,+75,64,187,246,103,45,10,235,59,81,207,253,122,60,121,153,33,227,100,185,+110,161,212,131,37,233,214,110,211,120,48,175,110,17,153,13,23,127,189,180,+122,60,5,30,16,136,19,125,59,97,189,92,142,220,51,24,78,223,187,201,+209,51,236,31,18,231,51,5,24,33,133,152,16,107,141,255,73,83,198,12,+20,253,166,42,52,230,23,21,121,252,15,161,49,33,239,20,171,33,90,198,+94,14,127,240,182,93,30,65,121,94,251,118,124,204,250,203,244,174,183,222,+234,109,40,47,70,49,129,194,39,164,171,113,51,99,232,244,177,134,48,234,+51,161,209,232,39,38,227,218,122,202,173,55,229,113,12,255,202,93,91,191,+21,109,70,167,212,153,133,118,181,58,1,122,107,56,207,98,183,234,192,192,+60,191,49,14,54,40,48,64,219,148,25,144,82,83,243,97,252,12,128,195,+234,200,80,188,176,124,28,57,33,43,35,212,90,48,194,52,100,217,77,148,+45,78,240,220,12,48,230,42,5,21,0,217,85,5,24,136,186,72,70,33,+98,202,88,144,223,169,150,90,17,66,25,184,150,74,166,194,45,89,150,249,+153,6,191,55,189,213,65,16,129,108,176,110,127,10,142,248,250,240,162,48,+124,239,15,90,40,251,216,140,61,78,245,5,164,188,165,190,246,18,229,134,+36,203,77,7,116,2,70,22,56,118,4,144,225,196,77,25,150,80,143,96,+66,212,171,192,43,161,60,136,64,181,212,124,158,88,102,116,205,30,14,132,+90,37,229,93,26,204,76,176,48,7,130,101,36,68,73,209,154,176,72,173,+99,95,238,79,150,8,221,40,253,120,229,74,251,159,224,59,167,174,35,122,+122,183,70,24,21,53,245,97,188,47,154,133,75,61,101,36,29,148,30,188,+131,219,171,19,173,46,160,110,90,42,119,94,190,31,164,157,9,175,6,233,+208,35,9,14,198,244,77,140,238,82,4,193,87,26,189,4,106,184,80,252,+1,213,166,220,82,185,25,100,21,5,199,104,23,9,30,19,4,44,58,205,+56,143,193,66,79,92,146,124,5,25,189,88,123,126,178,184,112,25,200,162,+46,95,109,107,94,187,145,81,177,4,95,112,79,37,164,50,217,83,92,253,+65,7,102,103,210,96,41,197,223,211,24,138,165,135,119,4,148,149,75,202,+228,217,200,126,174,136,17,117,25,2,24,123,187,20,62,12,88,71,146,85,+108,120,52,215,100,20,48,10,1,107,169,168,115,7,223,9,46,138,82,40,+208,251,54,108,141,149,8,154,3,248,88,212,117,128,228,130,186,215,179,79,+128,237,140,114,67,93,154,191,146,175,196,139,235,19,199,92,34,106,130,216,+67,44,10,56,73,157,74,255,37,229,9,213,214,183,158,85,103,214,23,135,+99,43,142,4,149,244,168,136,198,188,104,193,183,225,145,55,221,210,201,15,+2,83,177,18,44,52,228,29,174,143,4,78,138,97,34,60,176,44,129,91,+188,56,12,77,142,91,17,3,77,11,4,245,234,156,49,220,57,196,247,168,+98,178,55,204,74,175,253,102,56,255,85,167,23,226,139,32,161,120,115,17,+47,31,190,28,116,88,173,187,119,191,19,42,62,27,70,207,137,76,136,91,+28,46,70,192,1,146,198,36,28,134,71,89,142,78,181,157,178,82,176,204,+243,130,97,165,119,14,183,132,189,20,231,166,98,246,167,87,153,20,156,148,+59,121,114,89,122,146,122,40,140,161,77,95,156,36,75,113,156,230,229,169,+180,99,82,225,62,37,141,47,134,63,32,120,138,224,206,26,122,68,3,84,+235,128,202,155,200,185,133,229,225,179,39,5,173,57,157,103,243,103,221,238,+241,119,150,148,232,149,18,246,231,125,187,197,237,228,152,176,126,71,70,49,+68,189,136,31,175,12,148,213,233,222,141,214,195,106,105,80,171,197,66,243,+107,98,198,228,102,32,160,113,13,71,215,225,116,200,223,3,197,87,132,204,+200,78,91,246,214,39,187,84,161,4,16,128,59,79,166,127,51,95,182,164,+21,72,161,2,232,208,100,166,114,88,24,126,155,175,18,202,193,224,176,215,+172,22,146,43,244,163,196,117,147,208,243,156,109,79,105,180,96,38,120,117,+182,174,0,42,55,52,70,201,2,136,130,187,228,23,112,160,61,171,17,83,+79,94,23,251,21,33,25,184,44,139,68,46,94,99,226,214,88,161,233,130,+231,81,144,202,157,196,18,123,201,42,202,1,85,120,101,25,165,246,134,21,+146,40,63,17,208,147,174,182,234,12,132,218,8,148,152,110,44,248,18,85,+78,130,140,171,244,32,66,210,157,204,131,116,192,0,198,158,114,128,145,254,+71,247,187,215,62,32,247,164,65,196,134,108,192,225,229,228,94,51,231,73,+234,174,34,172,221,47,94,59,137,184,59,123,41,49,134,17,110,86,251,90,+95,160,58,45,43,173,76,159,254,148,52,147,126,6,56,169,193,96,190,110,+61,111,211,199,187,75,86,210,241,60,140,210,158,184,82,211,127,238,53,145,+211,165,237,134,125,52,28,31,76,158,215,175,176,249,15,199,21,34,231,179,+31,55,90,166,193,233,200,190,157,255,101,159,155,156,234,170,162,241,203,243,+204,218,52,34,2,252,1,39,142,41,98,92,200,86,129,124,158,172,253,81,+148,217,64,22,133,226,173,188,37,38,208,201,203,253,202,1,96,65,178,244,+120,191,12,190,217,145,102,194,196,173,37,188,3,45,100,63,54,207,239,5,+170,208,129,124,82,237,213,148,218,64,21,203,68,157,44,225,175,92,216,26,+222,173,34,132,75,27,3,89,34,124,52,251,75,193,29,92,158,153,14,168,+101,229,27,165,61,24,129,60,101,166,67,70,161,105,12,37,77,114,9,53,+198,35,238,222,219,65,132,168,236,156,87,170,226,200,160,82,50,115,219,91,+23,110,151,210,248,82,152,75,191,114,68,4,82,177,126,65,128,128,171,153,+205,9,136,102,84,142,85,188,171,76,38,75,180,207,118,5,203,169,96,156,+119,216,54,84,18,170,75,71,179,82,134,205,10,157,32,141,194,76,4,116,+94,107,108,251,247,42,135,78,137,221,64,189,182,114,223,225,229,10,68,96,+12,12,231,39,229,225,9,29,122,238,57,107,205,54,131,98,80,208,230,231,+152,112,36,104,166,71,61,135,47,220,187,135,215,163,2,219,114,5,119,125,+195,127,162,158,126,29,1,184,190,109,146,81,215,136,30,89,39,124,65,100,+181,148,182,120,45,159,94,185,163,185,2,151,169,231,200,97,115,15,140,94,+196,185,35,94,44,62,104,226,0,176,130,83,218,249,39,52,95,19,0,113,+83,60,24,203,240,9,97,229,9,97,80,182,54,86,193,68,43,237,229,101,+34,144,43,144,56,212,101,96,155,247,198,114,231,0,106,67,180,147,53,142,+81,135,159,208,20,13,218,47,167,139,155,191,205,177,139,78,159,88,50,224,+250,193,72,44,134,109,102,48,73,238,62,47,28,126,205,162,71,196,237,109,+58,104,191,217,38,159,138,128,241,249,104,74,135,186,163,6,216,172,187,62,+202,173,118,207,200,56,26,230,36,85,128,72,221,18,91,34,116,187,24,133,+91,80,194,175,43,201,53,51,39,243,192,2,242,153,95,200,94,200,26,59,+40,194,192,250,126,233,166,179,20,191,115,218,255,70,22,130,236,22,132,36,+11,129,1,134,129,240,245,93,218,18,146,227,71,164,171,203,236,133,180,248,+217,133,202,220,133,169,88,216,41,62,108,127,199,9,62,64,139,139,69,242,+182,177,132,18,0,6,38,253,114,161,119,83,183,194,156,124,241,180,78,194,+165,42,110,170,242,108,110,4,160,58,24,181,18,199,51,253,204,70,15,128,+191,144,245,91,133,242,109,206,254,197,75,34,84,225,88,115,197,99,218,208,+120,188,149,117,176,186,113,22,55,181,125,172,133,242,66,4,131,149,252,26,+232,145,13,233,88,90,84,136,118,26,72,242,245,209,5,243,214,49,154,136,+249,108,219,188,243,20,35,38,212,246,58,2,195,187,137,3,255,161,170,76,+131,191,157,137,102,166,225,143,146,56,103,76,90,143,136,245,49,16,206,156,+6,152,234,110,91,232,224,9,254,49,79,109,139,98,165,170,23,57,204,211,+83,159,57,87,198,219,31,159,134,249,227,53,138,43,56,170,101,170,163,42,+84,76,82,5,23,223,244,111,199,204,88,167,204,185,63,175,138,64,242,163,+38,25,193,152,171,26,52,26,244,236,208,254,94,19,165,101,37,226,63,16,+23,183,213,180,124,22,234,181,18,26,232,37,171,64,80,180,143,106,181,223,+31,172,35,140,129,79,245,143,248,35,7,255,143,233,136,189,41,183,39,3,+121,101,158,16,181,231,198,86,210,30,16,96,115,226,232,235,220,96,223,156,+102,247,97,151,64,245,72,161,9,250,71,91,18,180,14,60,1,217,66,106,+248,2,152,189,235,20,199,169,56,34,226,138,77,244,8,132,125,115,178,86,+32,90,83,212,38,224,90,11,16,118,12,84,10,32,234,156,204,109,220,34,+117,178,76,246,90,99,235,210,244,23,143,43,215,96,193,177,155,188,242,38,+244,19,90,207,35,24,152,109,33,52,67,46,107,228,189,220,97,245,20,1,+87,218,131,159,155,61,30,173,242,156,126,181,232,84,164,69,8,183,201,58,+11,104,77,227,152,227,48,160,250,50,181,76,27,205,49,110,2,221,170,112,+36,83,91,103,59,82,28,162,109,200,2,197,199,238,104,105,170,222,219,213,+33,85,81,49,112,77,26,108,248,94,249,39,25,253,111,9,243,200,168,159,+84,16,116,253,77,192,123,56,190,135,22,250,201,205,54,217,27,69,90,165,+40,183,31,180,191,76,52,141,224,22,103,12,189,208,196,141,129,142,199,221,+48,49,197,248,32,112,183,94,100,191,22,119,15,141,88,175,174,175,204,152,+129,33,147,172,244,18,71,105,209,122,26,46,210,197,182,170,200,109,155,152,+173,107,164,59,195,131,117,1,129,206,70,22,47,104,250,235,118,23,42,129,+225,227,132,237,204,185,250,191,17,43,176,217,129,100,3,188,130,113,65,64,+183,235,75,128,249,205,55,175,135,175,80,168,136,254,68,159,228,66,192,124,+8,219,248,194,128,111,107,195,77,30,25,190,118,12,228,213,223,254,120,12,+247,35,67,182,136,213,186,227,136,130,90,73,226,202,142,34,148,17,155,60,+212,213,104,135,208,108,46,188,173,196,16,143,45,218,15,192,184,130,43,94,+150,80,190,93,114,2,183,143,113,196,35,133,185,97,51,59,220,33,76,22,+47,148,13,241,131,210,108,244,201,7,20,28,171,64,197,127,100,47,178,91,+67,181,246,177,171,162,197,244,158,198,77,176,32,171,101,123,180,47,89,83,+234,235,106,234,2,149,200,88,40,98,237,6,164,168,200,46,1,213,179,152,+32,113,79,253,243,230,213,29,96,144,227,44,198,223,218,103,189,233,189,218,+175,243,61,189,68,118,84,251,199,167,229,56,229,74,22,161,245,180,113,159,+195,248,62,229,222,228,102,225,171,34,165,0,71,215,52,162,48,170,172,175,+13,35,84,14,246,227,149,126,199,237,119,185,114,99,84,152,36,151,55,108,+90,230,239,123,9,138,206,154,142,251,254,237,238,252,0,27,175,43,2,223,+183,93,243,216,204,224,51,161,175,162,245,196,69,160,237,243,17,190,90,164,+199,71,242,64,16,167,26,18,53,11,68,177,157,110,241,22,25,238,250,251,+150,177,99,12,100,85,8,69,251,245,142,185,173,193,215,129,116,160,187,112,+106,211,126,27,65,167,164,187,68,79,204,242,87,202,156,180,172,59,235,158,+147,45,254,4,48,42,86,170,98,179,205,219,29,77,72,204,83,140,48,237,+226,121,122,116,79,111,91,4,1,50,71,31,12,240,203,57,231,15,87,181,+12,130,113,172,89,85,60,10,198,235,32,151,138,249,0,143,125,181,68,204,+248,164,229,148,122,99,229,234,244,176,32,91,140,10,144,209,211,232,86,239,+223,4,189,113,179,111,171,58,157,173,174,4,201,5,245,117,108,70,79,55,+219,16,130,59,123,187,34,198,136,194,203,152,34,100,150,73,104,84,101,189,+215,23,166,236,119,16,17,242,226,190,119,51,165,71,60,54,142,94,248,215,+74,140,37,186,196,253,114,71,247,253,103,200,108,151,115,68,51,25,21,73,+174,80,62,150,42,181,142,154,216,88,64,217,226,69,228,128,57,63,223,243,+142,216,172,85,160,214,122,35,7,170,204,168,8,120,121,182,161,146,55,155,+125,181,17,162,54,162,254,7,181,171,21,145,222,242,106,103,10,249,185,21,+134,2,183,181,30,204,239,174,132,78,165,65,115,161,158,169,238,40,57,66,+8,28,126,197,1,115,155,21,152,248,45,185,28,46,151,205,180,185,66,65,+55,106,144,60,95,82,99,117,45,142,110,213,146,51,208,165,32,83,33,238,+227,9,182,234,206,80,233,122,90,87,25,244,193,97,242,50,24,0,145,63,+193,154,36,174,242,174,34,127,51,156,131,45,156,163,193,228,128,155,240,183,+198,153,111,188,155,39,93,220,224,40,52,93,100,41,172,40,228,59,103,28,+61,203,174,195,124,209,27,165,207,185,211,75,88,178,122,158,151,60,86,237,+251,225,88,105,8,56,67,72,186,236,196,199,234,149,75,97,206,255,53,142,+225,132,216,94,39,118,230,211,107,187,88,55,86,59,124,35,187,125,103,26,+54,90,24,52,2,230,195,16,157,141,96,220,132,245,199,200,80,207,166,199,+114,25,203,71,7,74,71,150,219,156,40,42,106,244,208,97,16,206,113,144,+180,55,175,212,81,81,227,150,107,191,43,173,164,12,40,72,96,105,46,45,+43,163,162,165,250,49,77,96,48,239,121,93,245,125,245,25,121,26,22,65,+85,2,106,139,221,130,60,47,73,104,17,226,184,145,244,215,180,123,18,214,+70,16,32,187,45,0,106,13,130,103,133,43,221,10,132,197,139,222,54,217,+146,174,100,217,92,78,70,77,168,202,117,63,51,128,102,74,215,11,82,223,+226,172,142,7,180,66,149,42,18,126,189,11,88,97,45,234,142,75,146,16,+24,211,75,144,37,185,60,234,23,202,28,31,182,157,108,230,4,210,37,4,+180,103,126,155,114,151,172,1,78,206,202,205,38,171,147,50,147,10,5,27,+248,163,92,151,104,34,114,93,13,39,188,180,15,115,114,153,245,146,122,191,+165,169,46,67,176,67,33,214,101,120,143,223,112,248,102,127,157,42,186,163,+192,156,71,227,191,52,197,123,167,189,168,115,150,211,116,31,23,83,31,83,+113,244,100,132,220,11,201,179,221,185,201,3,187,9,99,179,102,39,14,39,+54,110,163,88,228,237,217,70,184,91,76,21,158,90,241,41,150,37,208,165,+204,131,155,107,69,96,47,25,157,2,90,208,159,162,125,209,113,119,170,20,+200,13,34,37,116,47,192,18,72,153,167,125,40,106,59,10,174,98,101,191,+15,188,21,164,63,131,213,54,248,237,22,60,64,40,142,147,91,31,230,208,+6,155,137,1,221,195,186,127,21,174,223,25,230,138,7,205,190,101,242,246,+154,232,20,182,79,26,181,167,240,8,196,148,62,198,231,228,223,165,92,103,+120,144,229,30,51,163,114,208,98,190,170,88,135,79,124,65,88,59,125,68,+7,247,9,98,174,16,186,222,107,8,218,18,184,99,169,53,100,189,99,201,+77,183,248,89,152,222,218,120,30,17,241,235,29,71,155,237,121,172,81,195,+114,247,36,234,99,225,235,131,203,148,50,103,2,82,213,151,148,21,148,243,+206,35,26,253,120,84,157,70,120,56,203,108,211,21,52,108,72,141,146,204,+230,183,234,116,100,29,38,237,184,27,90,179,52,191,66,6,125,232,83,58,+141,2,214,129,175,193,77,114,129,155,61,223,22,154,137,5,169,225,132,122,+230,156,231,124,30,106,10,215,219,10,125,137,239,103,232,153,209,132,112,85,+122,110,171,204,154,71,224,124,171,103,215,198,101,214,93,240,1,157,188,51,+189,152,246,66,109,107,239,111,172,16,225,40,63,57,172,72,35,183,105,36,+217,231,92,228,174,199,57,211,128,2,56,126,69,177,102,87,164,7,141,138,+107,97,205,109,37,8,136,72,32,231,12,11,7,60,73,83,253,232,181,120,+159,125,229,216,233,225,131,241,106,108,253,248,149,80,208,69,194,0,16,120,+55,52,48,143,64,224,245,170,215,134,107,53,89,95,140,155,68,192,60,0,+155,37,89,44,72,144,235,241,74,2,224,88,95,213,50,19,137,174,112,54,+226,176,185,107,174,254,220,64,53,121,26,28,216,186,16,51,185,220,254,27,+209,120,252,21,101,97,104,29,106,228,150,192,201,80,215,69,210,197,239,20,+156,60,141,24,45,182,185,148,136,82,152,84,154,47,65,41,189,208,40,231,+220,252,88,145,62,247,150,1,10,121,137,220,148,90,6,137,62,132,15,49,+76,192,131,168,149,169,115,221,37,35,243,99,236,28,228,31,23,175,161,71,+67,8,104,220,8,74,145,157,28,76,250,88,200,117,190,26,135,107,158,228,+185,128,28,48,32,79,180,190,148,53,132,106,148,186,148,131,252,85,239,89,+196,52,54,74,94,50,172,90,133,187,124,151,83,112,224,80,90,19,33,224,+211,116,124,167,12,96,142,15,169,66,15,123,167,178,248,109,206,16,234,245,+5,167,138,138,94,107,147,37,217,226,191,134,0,239,115,165,72,51,145,216,+229,202,229,162,23,23,180,178,194,175,15,235,162,38,85,89,16,124,133,217,+206,28,124,67,76,48,174,243,211,29,44,109,211,206,179,205,252,175,37,205,+38,159,161,84,64,175,34,168,208,179,105,203,96,222,239,116,73,206,28,63,+166,31,215,214,180,19,99,111,113,5,153,131,22,227,205,18,171,76,213,110,+164,247,43,28,30,53,216,239,82,14,228,171,170,212,244,212,71,12,17,69,+211,17,181,42,181,224,223,196,157,13,193,187,35,182,4,132,63,60,140,91,+163,225,141,8,13,223,34,3,14,184,84,42,105,10,68,61,63,203,216,229,+36,62,30,8,89,177,192,112,120,154,63,135,170,172,89,54,37,198,178,21,+182,76,192,182,22,125,46,249,127,157,153,120,144,185,190,158,76,242,69,183,+21,201,92,167,167,20,188,153,144,54,46,197,137,21,154,69,179,244,216,109,+14,228,42,243,39,69,135,93,156,75,54,204,9,144,131,120,95,127,152,119,+172,21,144,77,191,57,15,78,69,103,215,101,129,55,175,42,220,250,253,220,+219,61,30,22,117,221,6,229,15,205,153,233,127,180,53,30,35,147,188,242,+42,29,175,82,109,161,37,158,149,103,150,4,158,44,43,19,187,196,155,100,+159,79,99,100,104,196,201,96,94,197,59,64,247,157,175,234,243,40,105,110,+236,20,221,204,136,106,210,253,29,162,216,68,180,77,72,211,157,147,64,198,+102,167,183,5,131,159,48,234,189,3,181,74,64,162,91,136,232,31,107,224,+172,176,224,53,212,254,1,156,155,221,8,170,251,218,144,43,55,122,60,251,+41,225,43,36,12,226,123,105,131,53,127,206,241,42,108,55,127,51,97,120,+40,215,48,148,180,36,243,185,47,210,14,183,209,31,172,62,54,11,114,116,+87,132,210,11,157,217,176,22,22,113,155,168,187,93,153,94,143,96,134,193,+244,194,180,138,236,226,2,175,129,142,217,86,203,43,236,236,41,171,40,74,+247,32,198,14,77,145,112,41,179,216,141,228,129,241,11,9,205,148,146,22,+128,192,97,110,190,131,152,14,132,101,29,204,232,130,154,33,154,32,198,235,+163,179,28,225,63,105,107,245,86,42,139,81,13,203,90,73,199,169,58,30,+158,210,252,159,142,94,163,22,37,121,232,98,255,74,103,133,129,237,222,160,+17,179,136,235,201,187,58,64,59,2,243,225,108,224,129,226,232,154,49,35,+176,178,9,254,149,229,27,137,137,160,112,163,130,0,255,162,72,223,74,90,+74,180,79,231,252,70,124,62,162,246,69,155,246,7,84,126,127,23,104,195,+142,151,165,31,78,152,68,15,15,92,103,5,55,80,197,129,213,210,163,234,+198,73,132,125,7,189,150,184,14,17,209,50,33,110,21,155,219,195,75,157,+66,246,179,27,139,17,160,207,37,102,74,70,138,128,183,71,33,169,222,20,+166,195,100,172,154,115,221,241,63,17,68,142,167,63,20,142,91,164,72,54,+122,107,80,3,2,67,116,93,177,99,225,216,239,119,19,65,203,242,240,132,+192,190,96,10,143,180,155,43,195,194,66,181,241,131,54,0,157,74,84,148,+136,240,109,233,229,190,61,210,235,50,151,203,122,245,194,187,186,60,76,75,+89,150,12,200,105,235,220,167,212,131,171,217,141,3,203,125,97,133,63,221,+162,135,55,90,56,48,200,21,74,155,95,157,15,14,61,69,181,232,109,140,+201,74,71,12,129,127,92,186,45,161,194,113,127,6,93,80,230,75,15,126,+98,200,76,187,163,150,8,61,148,173,127,208,217,245,189,181,223,26,19,81,+50,115,108,58,239,244,233,248,31,214,38,244,12,90,1,162,148,71,201,116,+45,187,92,226,156,26,14,202,13,72,198,163,15,16,178,33,220,235,24,211,+119,99,250,239,173,222,210,53,190,2,157,24,91,66,20,25,109,168,194,209,+40,167,164,29,128,58,213,162,176,203,190,14,54,7,214,16,125,233,195,39,+126,38,83,96,33,181,103,209,131,31,173,90,8,147,134,40,16,94,98,86,+228,157,210,67,244,145,113,227,41,46,73,37,255,217,220,39,45,57,39,106,+224,165,129,231,149,183,15,209,104,216,28,146,128,176,19,162,151,235,103,24,+161,254,1,3,194,75,38,202,123,21,197,234,65,6,165,227,235,123,108,151,+27,240,160,0,150,198,243,156,134,238,79,228,198,49,193,209,71,134,119,201,+19,75,131,65,154,150,142,120,173,230,207,210,161,196,72,50,117,194,30,23,+40,227,102,74,104,177,101,117,78,251,170,147,88,100,143,238,128,105,141,3,+127,144,29,124,110,184,178,68,130,107,224,214,12,228,207,21,51,238,66,68,+130,115,87,196,195,75,70,105,40,186,240,221,6,46,77,129,99,222,130,92,+10,249,230,64,227,88,54,116,188,95,152,19,131,37,136,67,76,12,149,209,+40,108,191,122,128,155,186,46,160,117,166,25,10,23,215,159,8,158,14,45,+187,133,10,127,33,114,200,76,17,92,30,164,182,236,115,81,171,177,78,211,+216,215,104,216,7,22,231,239,29,239,42,201,193,154,219,91,174,250,79,189,+146,228,43,180,244,0,235,17,108,176,238,234,24,114,167,169,26,37,22,47,+93,167,156,244,98,14,182,178,209,29,83,124,202,242,205,245,24,211,247,220,+189,206,227,82,79,145,152,32,95,140,248,47,204,141,235,46,1,44,185,65,+231,157,224,50,250,102,161,195,213,129,194,169,18,110,62,127,63,87,218,192,+83,202,47,13,46,184,159,213,178,150,108,82,56,173,17,154,120,206,18,77,+33,248,140,98,81,64,241,81,250,79,120,137,130,223,92,76,241,103,244,189,+137,252,113,177,196,143,98,100,66,213,119,89,23,30,120,149,132,181,165,152,+235,24,31,85,6,31,5,224,73,189,63,106,126,101,103,177,193,124,16,254,+119,146,115,78,98,220,16,102,192,63,122,194,106,140,225,208,120,54,243,193,+252,218,113,103,219,77,51,10,13,32,13,6,205,238,40,176,222,9,225,226,+204,133,173,170,194,103,197,234,127,114,175,233,67,254,25,42,106,220,51,114,+216,22,71,224,116,173,130,55,198,238,228,43,15,126,20,107,128,110,36,56,+196,16,35,231,114,63,130,82,228,209,252,228,22,170,250,138,11,72,251,249,+224,89,143,65,87,115,253,48,34,97,234,155,224,44,119,127,25,219,126,167,+223,39,123,151,135,64,146,208,18,114,251,254,246,55,214,110,18,242,142,238,+255,183,239,165,146,121,96,209,111,169,219,203,212,70,115,125,126,217,128,119,+28,202,145,24,110,149,1,62,34,209,107,135,39,119,22,132,70,86,38,14,+37,75,96,119,82,135,71,195,87,124,23,54,186,239,184,226,14,169,157,82,+36,80,125,86,209,131,237,237,7,146,232,118,181,88,31,214,61,127,4,148,+225,156,2,98,38,48,105,7,135,127,69,85,249,44,83,241,15,253,112,190,+142,172,93,27,224,191,105,254,187,1,225,135,57,151,51,255,22,173,224,185,+160,55,14,23,13,41,77,4,24,155,87,217,196,224,220,162,17,242,39,36,+244,246,191,95,13,92,97,158,126,18,190,21,197,251,136,58,232,134,197,158,+27,21,39,38,28,18,85,176,17,234,104,188,43,79,73,97,238,190,66,41,+174,146,75,189,54,50,127,179,173,56,112,72,43,156,137,151,46,36,30,110,+133,134,32,203,239,189,183,137,136,132,105,135,30,250,51,106,19,16,247,215,+237,98,118,154,77,174,190,93,207,34,49,208,1,97,63,134,165,157,9,253,+141,134,228,39,248,22,24,89,184,60,241,237,245,141,225,64,224,98,198,72,+202,235,10,150,87,137,253,239,216,80,106,235,59,32,74,130,18,154,235,75,+37,74,92,178,47,248,60,70,110,231,33,83,66,240,54,91,137,21,54,183,+27,43,144,107,237,54,6,170,81,162,105,175,201,190,208,61,217,38,33,124,+36,92,223,166,193,67,112,128,141,174,162,139,176,191,208,225,116,170,115,82,+51,211,147,226,38,165,214,203,134,139,167,167,17,15,4,177,202,248,162,148,+60,7,171,12,151,211,125,227,164,93,10,149,7,109,42,115,99,154,195,253,+223,86,108,230,103,115,165,168,150,45,97,13,109,227,88,36,247,185,176,100,+219,45,68,130,34,23,179,33,245,16,218,91,40,90,62,126,108,189,223,39,+121,42,72,24,63,52,42,62,168,60,119,121,45,55,221,11,54,77,185,194,+141,215,27,184,207,111,33,228,96,58,83,243,16,241,183,118,254,74,19,94,+121,205,113,41,142,85,57,176,73,69,185,217,104,228,16,207,189,233,215,210,+129,11,142,68,110,44,97,230,203,15,136,125,166,253,141,159,18,10,118,144,+91,203,220,185,244,100,18,201,155,61,138,25,9,222,46,37,15,92,27,77,+12,120,14,14,142,59,244,43,238,191,212,10,150,20,67,70,183,136,91,23,+61,76,9,228,103,19,132,34,155,180,63,1,255,34,147,47,36,243,32,104,+72,43,184,57,132,16,80,51,229,149,224,212,104,195,96,169,190,141,47,219,+221,108,204,104,26,159,134,228,92,154,88,23,165,104,213,74,152,218,161,57,+191,57,182,38,61,235,59,176,83,52,130,17,173,104,53,93,97,125,182,129,+235,33,203,178,243,131,139,87,214,125,64,81,4,158,205,35,125,105,58,30,+97,143,91,95,46,117,231,237,199,138,242,98,105,106,155,213,196,250,9,134,+53,208,45,37,64,62,209,15,62,108,240,212,85,29,44,255,39,77,144,122,+40,191,204,31,173,160,156,73,98,229,142,244,135,188,176,120,106,51,98,79,+243,184,247,89,52,171,219,240,94,136,186,96,148,218,215,251,249,93,47,58,+42,157,114,218,212,141,236,129,235,165,209,87,146,128,94,245,208,100,66,232,+192,87,40,194,224,87,222,129,243,99,77,108,237,224,160,26,203,207,19,198,+136,225,23,219,255,122,107,14,61,139,153,180,242,109,105,176,55,32,92,133,+67,98,138,212,96,178,42,1,231,154,39,224,30,98,59,54,204,135,1,189,+81,88,20,229,58,62,46,253,152,68,218,178,35,236,160,142,7,43,16,93,+32,219,55,56,101,71,63,206,220,148,228,191,38,42,207,5,233,12,62,35,+27,77,200,226,242,79,25,224,135,3,57,22,103,31,74,53,135,2,88,90,+100,40,147,107,70,203,85,106,0,103,48,5,132,120,218,19,244,84,232,165,+195,1,98,250,208,17,12,98,85,8,30,33,60,237,154,200,230,23,19,16,+76,160,125,138,111,194,47,128,233,201,41,70,124,197,50,2,123,91,132,131,+33,167,172,31,52,78,128,160,3,113,245,140,43,14,12,41,214,130,213,10,+7,22,190,180,253,169,248,225,134,166,27,62,16,129,219,133,104,183,190,132,+156,142,66,98,83,191,126,103,28,247,190,220,9,234,157,175,212,72,74,51,+201,174,181,134,41,82,83,136,31,41,244,59,162,108,233,230,14,190,33,0,+112,249,249,62,60,127,197,215,98,127,172,116,254,211,207,176,224,38,242,142,+150,115,50,36,31,229,234,181,18,73,63,129,243,255,170,175,169,177,146,181,+52,183,8,236,41,64,204,222,205,195,14,75,223,60,230,174,7,42,146,255,+177,31,108,241,40,45,53,109,239,130,206,25,196,78,21,37,232,68,241,140,+240,131,213,248,86,125,243,177,46,226,254,27,140,180,236,194,1,82,237,253,+94,220,209,16,198,125,102,135,195,27,39,38,149,169,7,49,185,40,84,241,+24,47,115,195,123,102,233,110,182,204,79,224,126,202,244,180,6,171,253,78,+116,98,56,74,115,156,182,115,167,110,15,34,126,144,45,181,123,169,42,70,+121,248,228,63,110,208,4,207,101,31,123,106,144,149,154,243,140,38,155,122,+79,71,17,156,170,36,232,90,86,120,132,219,226,154,130,134,225,99,208,178,+159,97,54,129,202,11,158,86,160,144,158,94,120,64,4,20,71,19,3,111,+65,112,221,166,148,31,154,140,71,74,141,3,141,105,87,123,49,73,120,64,+67,224,125,71,158,181,46,134,246,131,124,117,19,33,89,115,160,124,138,93,+152,79,55,221,201,79,168,51,39,114,213,80,255,205,23,88,212,211,65,225,+30,254,90,189,9,173,160,92,147,195,158,25,252,54,42,68,167,221,6,1,+73,34,164,50,48,69,25,235,4,78,226,38,131,25,194,191,234,140,210,72,+144,18,52,66,107,33,106,36,222,216,255,184,240,202,187,76,236,158,106,108,+111,244,144,113,23,91,211,109,152,94,180,235,117,149,227,2,120,100,69,24,+151,54,66,10,207,221,37,125,17,0,139,246,176,78,182,36,75,209,221,252,+43,130,40,255,218,230,42,52,145,245,7,163,109,206,16,49,30,174,78,206,+103,225,229,167,138,178,137,39,33,230,177,160,150,147,68,95,127,235,133,250,+201,96,221,239,88,247,169,207,76,224,121,243,81,189,144,181,234,200,87,201,+243,80,71,238,172,217,45,77,162,38,77,27,17,241,185,173,169,176,175,58,+111,20,226,240,241,106,249,60,131,14,4,63,214,238,212,95,237,59,190,188,+185,12,74,108,37,248,53,215,218,75,204,241,149,22,28,157,147,25,193,222,+157,57,96,142,107,84,51,142,97,112,188,98,156,72,254,126,127,30,10,79,+117,254,52,225,61,146,60,115,58,32,227,107,233,255,143,236,136,84,226,148,+239,100,89,49,93,9,40,10,241,78,17,244,74,212,130,242,224,162,215,209,+244,250,179,97,8,210,14,223,91,193,61,237,2,179,42,22,17,127,194,146,+232,73,92,26,186,195,230,55,62,76,32,205,158,51,5,99,63,118,203,15,+28,101,57,62,125,51,189,29,6,207,49,71,58,201,211,179,162,23,21,126,+6,150,41,209,32,90,21,63,9,239,200,189,135,130,193,190,230,92,160,68,+135,138,249,139,164,121,103,177,17,26,147,82,111,40,147,89,205,229,188,176,+149,123,156,134,142,65,42,168,72,148,142,242,178,253,1,15,174,179,112,77,+179,185,99,99,216,8,254,49,144,211,160,114,65,135,75,196,101,72,167,113,+113,37,100,105,213,45,167,154,181,75,226,31,151,144,176,92,16,244,143,106,+19,106,188,3,161,249,122,125,2,178,14,4,166,136,223,41,141,165,169,225,+80,174,180,38,51,94,63,64,221,248,5,88,174,249,26,22,106,167,69,226,+119,205,171,159,226,68,123,240,60,159,179,45,93,89,236,11,211,159,189,149,+181,33,154,73,133,58,222,153,72,89,151,78,24,181,28,148,207,48,97,229,+26,101,19,168,247,31,18,152,145,47,98,43,1,139,165,11,80,9,159,87,+57,86,105,199,242,129,120,65,241,38,166,54,166,34,164,226,64,159,66,178,+130,207,142,150,50,98,175,223,87,16,43,13,82,162,160,175,64,159,82,127,+200,120,163,212,15,194,84,188,122,209,198,21,241,78,74,113,150,147,252,6,+139,169,171,36,2,23,23,68,3,63,14,172,233,189,12,30,53,242,71,216,+199,9,106,38,162,115,58,250,244,65,231,186,168,221,221,26,160,86,174,110,+221,2,120,147,50,200,96,56,37,202,237,74,226,198,206,30,22,238,197,243,+197,107,115,136,103,126,249,234,144,109,119,198,212,167,89,240,8,134,164,217,+194,91,21,198,225,1,177,117,241,219,225,42,228,18,251,225,68,253,55,192,+205,148,90,21,92,181,17,219,152,98,101,188,193,76,56,201,204,220,179,167,+137,97,217,78,207,158,27,120,255,95,24,19,92,43,168,196,193,205,51,162,+113,101,58,186,222,130,15,73,251,236,24,105,104,228,48,198,244,171,129,217,+91,254,129,7,160,185,21,209,23,246,150,215,161,98,2,52,114,143,234,96,+183,234,180,191,205,50,152,22,180,42,224,66,239,213,254,208,160,47,24,51,+64,94,148,26,6,248,131,158,239,217,27,130,143,225,197,22,248,130,167,65,+108,35,209,102,161,232,230,141,171,0,123,50,209,242,90,219,95,28,47,57,+103,42,247,163,68,98,2,93,211,172,193,217,231,39,202,78,20,5,174,246,+111,219,236,138,56,194,197,36,90,226,137,176,106,118,211,180,7,147,167,6,+235,66,79,52,118,235,14,141,118,89,253,222,238,240,47,204,39,65,5,83,+99,4,121,253,155,197,133,103,203,76,37,30,90,145,241,105,175,184,36,2,+102,85,81,203,21,239,36,188,167,48,169,151,53,113,245,167,8,171,237,179,+165,114,19,107,98,35,159,59,40,180,225,94,194,254,34,82,118,232,128,216,+245,233,226,140,239,42,2,39,122,25,18,205,143,162,140,160,249,236,99,56,+20,71,253,196,45,217,139,89,190,147,28,159,45,145,247,213,49,11,56,2,+86,107,123,188,143,40,48,36,96,0,84,97,145,144,236,95,186,246,165,150,+135,46,202,208,68,229,121,213,90,152,84,73,200,56,219,157,220,167,221,22,+235,249,246,23,170,162,98,198,128,24,184,223,100,50,54,195,31,216,101,44,+158,1,79,46,118,43,132,76,156,99,43,241,108,240,105,171,205,11,152,117,+37,133,148,213,203,83,94,161,30,228,175,56,241,250,19,96,128,251,182,183,+22,99,182,8,162,140,44,61,24,148,79,20,109,135,123,106,53,170,40,35,+205,40,75,163,53,251,141,208,103,141,224,109,56,227,252,75,113,38,249,43,+140,197,151,64,183,34,26,24,225,222,59,134,145,12,1,213,15,174,128,138,+113,222,32,243,170,239,22,138,186,212,32,109,87,23,160,173,191,219,187,250,+62,196,253,134,135,180,32,74,172,96,5,148,121,108,4,162,35,68,149,214,+49,145,8,186,60,136,178,213,92,131,22,211,125,246,40,168,5,237,42,254,+196,107,207,175,218,47,192,46,242,174,229,120,191,7,224,173,207,2,160,60,+162,13,209,17,207,10,156,196,61,77,216,47,113,173,121,217,166,8,88,19,+86,138,44,87,40,152,31,125,171,104,57,59,109,59,57,48,33,4,53,25,+130,116,103,10,109,244,152,140,221,58,65,149,81,171,80,251,158,216,219,128,+49,27,131,205,217,127,159,214,33,5,241,37,144,218,70,143,32,96,230,166,+170,96,106,154,216,214,47,234,229,47,211,52,224,28,136,219,111,158,144,26,+152,86,87,25,213,28,130,142,25,208,52,242,107,152,3,150,174,133,18,206,+224,137,140,33,124,216,129,99,26,169,80,148,149,235,0,206,34,107,64,145,+30,247,79,1,188,2,240,236,13,216,125,188,132,80,48,44,115,85,43,208,+8,32,99,243,101,227,17,165,217,245,172,76,87,85,206,138,147,45,135,192,+137,218,183,242,82,120,145,192,75,253,133,91,74,100,137,113,180,160,228,205,+72,253,78,5,200,172,156,57,48,60,23,72,11,142,94,17,71,192,10,16,+83,140,221,3,255,14,165,128,176,91,140,52,10,138,195,74,61,207,74,90,+208,184,36,93,136,60,77,79,184,229,160,112,227,255,77,179,29,213,166,21,+129,71,124,65,249,138,176,235,33,204,25,179,191,190,24,166,41,179,61,116,+250,151,207,11,156,41,133,14,160,223,53,61,159,87,68,87,87,92,251,163,+216,124,191,142,129,163,241,23,178,254,117,55,39,117,211,145,255,109,125,137,+249,57,27,177,24,228,36,25,166,133,104,112,189,77,77,122,210,11,22,230,+119,3,28,218,181,41,235,75,223,239,53,54,26,18,242,25,27,243,149,178,+248,200,145,212,197,149,234,158,217,22,23,50,3,121,213,48,91,110,182,168,+199,93,155,130,11,22,220,208,252,63,66,179,200,146,117,119,1,110,107,150,+135,32,214,215,5,47,34,110,170,219,157,231,149,141,6,57,103,38,64,65,+36,98,4,231,26,15,116,57,179,51,212,68,51,214,139,75,60,13,205,237,+56,178,181,208,228,122,221,233,160,169,99,2,222,129,115,97,170,67,125,78,+194,175,148,253,159,46,118,172,131,228,116,42,43,55,22,77,1,165,176,121,+170,51,24,139,239,185,106,123,151,55,249,200,220,138,180,67,239,71,190,30,+45,128,35,29,31,95,25,95,105,194,210,71,234,141,13,25,82,28,228,63,+132,251,148,137,78,74,180,57,82,208,185,166,118,135,108,197,192,154,95,71,+46,188,204,68,22,31,250,196,215,44,71,218,31,151,164,37,51,239,166,9,+104,6,229,83,227,186,139,206,51,6,225,23,166,87,232,110,24,120,142,88,+239,36,215,45,105,49,0,56,173,246,23,141,14,158,148,222,190,17,128,124,+49,126,213,152,42,29,169,0,96,80,161,117,237,136,100,122,31,233,27,101,+208,22,97,173,223,57,106,246,14,210,55,41,73,36,14,195,80,148,198,50,+75,4,111,154,235,4,182,11,62,23,81,25,117,244,71,157,43,166,61,135,+203,135,3,36,129,48,157,158,179,220,95,60,72,175,222,123,75,239,13,100,+29,226,137,131,228,17,23,140,94,240,199,121,115,221,149,87,253,199,35,20,+85,94,58,190,97,208,220,133,28,139,176,137,172,214,241,1,250,215,86,107,+96,204,19,116,189,193,221,8,120,11,119,3,90,38,195,47,187,114,101,229,+196,237,93,148,68,46,231,111,59,74,172,213,180,174,138,59,51,142,9,28,+145,172,210,156,193,242,175,93,205,160,41,1,145,89,11,165,192,134,175,49,+78,108,5,93,21,254,10,67,92,175,97,132,103,215,115,194,241,224,210,159,+30,204,120,253,97,201,89,173,230,83,134,121,4,128,10,232,161,85,193,113,+163,119,143,168,144,185,242,36,150,253,170,11,3,232,247,169,97,54,69,218,+25,200,56,124,134,232,236,120,221,79,19,244,247,245,233,137,232,228,61,214,+32,244,131,127,121,201,222,236,218,104,211,125,208,108,172,144,123,162,217,180,+189,71,59,225,204,79,96,115,164,163,226,238,235,234,162,101,230,94,191,15,+248,46,211,124,68,5,70,196,24,65,79,235,49,30,223,144,9,19,245,215,+0,75,87,237,174,18,28,56,213,141,41,64,113,12,207,115,241,233,41,125,+25,209,223,42,165,247,95,254,81,255,105,191,203,210,20,194,90,238,82,224,+109,49,132,127,49,230,41,231,150,165,219,149,90,112,128,97,135,30,74,91,+124,234,48,249,79,30,169,237,159,67,239,241,90,89,30,224,47,143,94,97,+111,115,15,45,182,212,67,100,202,239,90,254,129,18,125,209,74,156,158,199,+252,138,254,94,89,68,29,126,223,2,123,232,77,71,30,153,134,251,13,31,+233,88,70,197,15,89,226,153,103,191,84,250,57,132,227,127,105,125,71,199,+115,121,34,41,156,57,174,122,57,80,51,15,52,92,78,168,242,98,187,141,+131,1,184,215,155,83,202,169,162,137,6,154,125,125,77,243,206,43,240,199,+37,212,209,56,158,114,55,40,209,203,218,39,3,30,70,180,53,237,96,76,+208,244,115,58,110,30,154,86,171,118,173,186,137,146,11,157,119,125,239,72,+79,193,99,229,4,190,77,28,26,204,136,172,34,241,36,38,35,2,135,135,+88,38,164,122,190,94,203,154,147,71,229,15,244,74,170,119,59,253,89,205,+31,155,100,59,195,143,142,246,80,93,183,202,241,124,10,215,198,94,154,25,+214,128,130,194,3,49,241,40,210,67,17,112,84,198,8,144,178,29,121,212,+145,129,47,4,75,47,190,60,79,116,208,222,208,116,175,208,100,172,21,229,+142,156,100,233,1,242,155,127,159,180,217,64,223,243,27,11,182,137,113,186,+253,50,183,216,52,253,138,70,253,165,207,57,54,94,153,184,191,162,162,199,+97,170,216,204,145,253,103,14,132,52,171,242,250,19,151,26,155,31,214,190,+82,190,21,124,123,137,194,169,158,137,5,233,99,96,121,145,1,91,10,102,+198,171,179,228,167,102,35,141,47,61,20,60,66,191,159,94,208,7,168,36,+228,247,230,104,124,237,179,176,239,3,91,102,60,211,144,64,218,102,119,7,+127,166,108,190,150,161,33,161,82,132,153,212,236,110,229,161,213,32,191,224,+171,48,49,106,151,221,217,86,236,129,213,232,108,84,68,11,55,208,8,193,+107,158,150,36,202,114,121,166,24,224,251,236,55,142,90,99,190,93,250,81,+148,225,67,105,26,160,220,36,247,141,201,121,109,53,142,153,225,44,150,97,+50,79,19,54,171,65,191,61,3,175,149,194,23,114,14,125,127,40,245,255,+171,88,116,79,170,65,183,180,119,239,213,122,117,51,44,177,143,145,177,123,+82,129,120,100,126,237,138,25,70,237,22,6,187,107,239,104,186,71,17,234,+196,218,143,77,110,247,91,207,142,61,97,86,45,73,158,10,36,117,146,62,+239,167,8,240,20,48,137,107,94,52,169,199,149,175,209,241,223,198,103,16,+59,172,177,33,174,174,45,71,25,105,236,138,234,21,52,192,159,51,37,154,+208,166,142,100,77,132,206,197,229,103,166,16,84,127,148,16,36,51,102,193,+223,65,51,172,233,61,136,5,184,18,17,209,167,196,189,0,119,77,228,242,+72,137,82,174,121,211,234,148,241,243,6,137,133,68,214,69,145,137,215,186,+53,140,247,239,100,66,202,58,24,36,92,129,189,156,187,44,42,39,198,200,+184,212,219,93,44,154,243,145,110,190,157,66,123,86,197,133,85,18,229,182,+150,171,90,224,252,91,98,225,58,30,221,184,248,91,77,204,82,13,203,219,+246,168,164,220,24,11,140,167,168,52,1,171,218,204,184,41,93,186,78,95,+183,49,181,237,66,21,171,186,147,198,107,184,125,27,243,106,204,186,120,23,+133,162,239,217,137,142,140,41,220,34,67,189,25,249,169,170,71,184,38,149,+143,191,191,111,162,141,66,32,201,145,220,218,220,88,74,97,166,130,12,242,+85,82,56,225,11,93,249,242,122,39,131,122,159,37,102,113,133,57,95,86,+112,236,160,77,43,115,249,125,160,128,244,184,188,126,83,130,235,35,194,46,+250,81,61,207,187,31,204,110,73,206,76,150,73,149,46,70,197,138,128,212,+7,217,159,34,79,118,10,130,74,114,134,145,54,1,20,96,154,188,136,157,+212,23,237,53,123,6,153,235,50,84,185,114,109,93,216,51,4,168,244,241,+75,3,167,118,19,61,179,6,108,190,89,253,231,31,217,6,168,109,168,66,+106,95,224,58,205,206,48,111,99,150,103,247,129,40,13,99,190,60,75,16,+157,221,109,102,33,100,51,31,17,9,253,49,168,38,245,153,51,144,232,189,+149,39,72,118,28,145,161,213,219,173,90,0,67,131,248,159,231,14,186,236,+174,209,17,69,2,125,240,1,78,2,100,78,163,232,140,104,112,234,88,15,+249,119,119,240,96,207,128,133,89,43,14,197,121,163,140,193,156,140,232,153,+32,121,127,123,3,244,179,38,206,9,144,245,47,219,106,75,127,223,101,31,+235,236,57,122,139,210,7,60,159,7,90,202,108,48,16,127,125,82,151,93,+95,82,197,88,35,172,46,251,107,247,152,99,213,147,171,153,47,144,223,145,+147,186,192,166,122,226,39,50,130,47,50,26,117,175,18,163,207,25,93,229,+92,186,179,75,224,209,218,39,49,189,178,221,60,17,185,30,62,38,14,1,+151,113,177,69,147,189,75,81,86,144,239,64,57,185,179,7,177,143,254,96,+174,129,110,33,96,84,22,9,72,224,207,64,184,142,194,56,219,139,192,64,+42,117,121,184,205,156,8,153,145,2,81,107,112,67,160,4,233,26,194,4,+168,200,200,29,107,60,213,150,220,80,248,224,54,205,142,58,85,80,23,172,+45,240,228,79,175,163,82,140,169,119,177,130,67,8,84,145,66,207,49,6,+27,245,133,121,138,237,245,75,123,245,85,245,185,45,0,233,255,51,43,221,+217,53,46,13,225,246,221,215,235,8,101,163,119,29,246,219,129,117,43,58,+246,62,144,156,236,121,127,3,140,11,225,239,254,216,116,5,143,0,232,97,+23,162,47,211,14,69,227,162,14,244,206,19,186,255,128,105,228,242,38,239,+113,192,145,241,235,15,22,245,49,59,32,243,203,167,55,23,237,239,233,171,+233,23,233,168,87,203,118,205,255,140,161,21,192,82,35,187,214,39,230,132,+98,189,208,35,37,172,62,168,79,212,218,49,138,67,148,214,129,170,154,195,+70,119,59,238,170,115,248,55,151,219,30,29,170,101,82,192,246,63,91,106,+121,11,48,170,77,148,193,57,107,194,157,120,250,98,172,127,38,189,168,249,+74,159,166,154,83,247,114,159,1,8,51,240,194,175,126,67,138,9,49,224,+193,74,226,148,39,78,148,225,95,29,39,136,141,83,186,35,117,40,230,255,+210,95,101,137,218,171,49,190,189,198,193,120,180,49,153,27,131,99,11,46,+209,149,108,226,223,228,99,192,152,161,128,148,222,106,225,204,143,78,33,133,+4,80,145,204,203,4,114,255,224,176,41,210,182,213,167,80,148,42,7,180,+169,17,107,133,143,103,152,47,46,187,83,103,226,22,180,214,131,234,202,74,+102,67,22,0,235,238,212,120,248,119,29,27,78,22,33,171,253,82,193,7,+213,183,157,19,139,187,131,68,4,59,66,207,63,99,141,70,192,210,12,103,+127,119,36,136,225,248,131,192,45,254,198,194,72,23,109,175,114,51,95,70,+16,185,230,98,50,25,92,73,159,156,103,205,73,38,51,177,57,123,123,127,+3,77,113,9,197,114,111,242,152,110,92,1,218,192,69,193,49,177,27,135,+122,248,252,190,147,208,86,40,120,127,104,211,161,163,61,77,71,50,235,183,+87,245,8,141,106,152,51,152,52,82,206,204,108,33,67,36,181,102,218,240,+94,231,163,149,38,78,228,145,184,52,40,139,110,158,229,23,184,106,254,179,+28,47,230,251,212,68,240,132,213,81,226,188,25,188,151,75,75,17,98,112,+184,108,206,217,9,240,148,67,52,172,175,61,23,237,68,102,224,242,110,234,+156,151,145,34,118,89,19,162,51,44,4,211,17,231,138,140,130,61,138,6,+133,40,211,16,189,114,177,181,162,184,6,181,113,166,99,197,104,197,202,192,+115,14,233,31,100,146,3,232,195,111,211,251,36,189,90,105,253,149,100,74,+28,244,174,1,235,222,21,0,59,204,139,153,46,33,73,155,255,234,168,66,+148,159,30,123,165,201,195,214,188,9,3,210,45,85,10,57,227,209,34,253,+135,65,239,50,59,254,231,34,126,58,89,170,0,187,242,146,79,184,146,115,+183,75,69,251,251,106,160,54,200,9,168,118,192,200,145,75,210,61,170,28,+246,19,184,220,23,22,137,249,179,65,234,180,248,214,207,88,176,33,3,225,+206,127,13,204,35,122,233,100,159,250,67,64,159,44,35,167,77,57,27,71,+65,93,117,8,23,222,56,198,152,25,110,96,82,25,208,38,55,80,95,99,+158,103,91,27,126,65,151,53,64,108,139,171,106,28,20,165,141,174,92,186,+95,184,145,185,6,146,227,25,87,50,14,49,210,217,97,23,227,115,232,147,+222,206,89,56,33,223,34,110,136,191,10,123,195,21,93,126,110,211,146,85,+253,139,254,0,228,110,55,44,206,146,26,13,144,163,240,249,83,75,212,123,+190,82,219,167,110,152,178,148,101,210,121,40,251,37,255,248,156,116,60,221,+230,124,121,155,204,179,225,187,147,36,97,49,2,199,96,80,248,92,192,134,+37,42,134,3,19,219,134,88,130,172,91,142,157,216,202,58,185,11,120,114,+165,173,105,7,248,130,156,134,138,187,157,204,254,136,185,89,61,76,187,192,+88,215,176,142,24,149,82,205,234,222,35,40,19,234,187,126,30,239,114,30,+208,121,194,54,86,23,159,19,2,189,93,186,55,172,121,138,144,197,16,116,+175,173,75,67,28,156,102,235,101,182,132,174,90,220,84,133,229,64,200,4,+177,112,9,140,131,6,214,122,94,163,151,0,228,57,187,125,46,28,111,117,+152,251,211,6,58,253,132,31,24,62,209,55,225,198,53,202,161,90,182,234,+146,108,115,75,27,155,118,38,12,154,41,170,170,62,85,207,180,59,176,143,+137,96,119,132,130,98,230,40,2,68,83,109,27,30,122,230,107,69,243,48,+164,184,101,81,83,203,16,158,230,69,130,161,180,59,156,210,140,168,146,183,+24,146,131,122,59,34,123,124,149,155,55,207,182,65,151,187,78,21,197,52,+101,32,249,49,185,138,127,34,120,222,38,138,245,145,121,206,15,20,219,90,+165,246,31,231,121,78,82,182,21,108,253,85,98,59,179,186,247,203,18,52,+191,50,66,198,105,196,46,197,20,44,241,48,212,163,85,77,222,234,197,226,+186,98,90,14,97,72,80,132,65,224,217,44,21,139,85,173,51,56,197,237,+13,50,47,207,32,172,248,176,111,77,215,4,197,32,168,198,192,39,117,226,+201,135,38,153,208,96,2,163,148,233,38,138,81,205,42,200,189,84,132,76,+142,204,142,146,95,70,174,121,116,180,34,116,244,200,5,55,190,43,46,5,+76,114,89,238,159,104,100,1,37,233,69,84,218,163,147,169,104,55,176,213,+89,162,95,148,233,202,216,180,206,103,106,49,108,26,63,149,138,27,159,87,+107,74,252,121,66,51,32,141,183,251,149,201,19,16,97,101,46,239,91,248,+253,21,218,250,190,180,188,139,172,66,33,233,30,104,230,60,79,167,187,108,+29,2,208,5,65,188,241,255,223,132,55,135,247,3,72,57,37,98,92,199,+97,135,30,56,167,166,148,165,2,71,107,131,123,242,6,252,100,141,102,127,+216,213,84,72,77,116,222,184,74,181,102,109,178,56,248,79,81,166,67,147,+56,1,62,44,213,154,52,57,70,179,103,254,76,131,16,234,56,237,40,196,+178,124,179,198,79,197,146,243,202,171,42,139,63,99,250,128,75,246,231,248,+204,168,27,23,147,214,125,242,198,185,33,86,54,42,105,203,33,172,3,196,+194,20,0,112,25,204,103,67,193,21,126,226,220,16,161,62,137,192,154,174,+51,21,84,179,167,104,21,98,21,150,183,90,141,106,134,131,88,138,55,199,+87,72,205,73,115,14,245,74,98,198,230,1,165,175,0,19,134,85,202,238,+200,3,24,26,73,237,253,78,73,159,210,178,12,28,158,103,126,24,67,100,+208,194,121,245,205,238,148,109,54,44,102,13,214,168,68,24,59,49,92,110,+165,28,103,169,200,134,173,101,46,21,108,19,172,152,193,191,106,37,132,19,+157,14,75,116,203,213,251,184,135,3,237,35,187,21,52,180,25,172,86,225,+230,181,203,42,233,243,68,38,98,108,102,27,191,243,67,50,125,205,240,168,+137,173,236,45,175,120,193,25,34,147,74,167,142,56,242,80,135,160,10,98,+18,3,178,228,203,54,29,86,91,151,16,17,19,68,48,226,22,71,150,29,+255,0,21,17,106,162,60,132,225,60,9,55,218,141,35,226,116,104,238,112,+127,250,116,173,27,189,37,42,58,41,239,125,99,86,102,79,97,75,226,222,+223,2,138,95,27,185,241,243,216,67,160,8,56,175,117,227,143,251,94,110,+52,230,242,255,211,98,161,240,67,3,249,182,215,5,241,244,247,13,116,19,+179,78,112,221,185,177,225,186,9,119,21,34,63,208,29,36,36,232,224,134,+67,226,101,35,126,232,109,220,180,7,111,181,195,249,50,120,111,227,120,228,+96,24,94,14,5,15,76,16,131,243,45,0,132,210,159,246,77,142,207,66,+58,214,230,189,183,75,64,232,148,100,47,22,233,247,29,227,181,245,24,162,+126,52,119,159,102,60,111,244,214,63,72,147,63,49,178,97,243,155,129,119,+62,128,12,147,99,58,246,211,89,7,69,184,102,180,250,85,202,153,37,111,+6,210,233,137,95,116,172,86,117,104,137,191,2,151,103,187,84,102,0,47,+61,203,34,124,31,107,122,55,158,117,121,124,95,36,21,29,44,195,31,124,+74,120,252,79,136,204,211,248,75,26,87,103,100,65,156,110,8,182,54,82,+34,49,34,32,252,202,117,91,40,67,175,15,163,121,34,183,108,142,162,129,+6,189,252,215,39,208,38,36,206,247,173,194,59,26,204,100,20,73,53,30,+164,143,208,254,141,250,165,94,101,156,182,135,104,63,213,80,136,64,37,91,+205,161,232,104,75,98,3,114,96,25,208,44,40,189,32,52,89,177,232,130,+104,248,61,2,190,116,136,140,196,255,90,95,76,73,75,11,148,208,228,133,+77,19,35,180,0,138,12,178,12,52,97,202,187,11,184,198,83,53,246,1,+124,59,224,130,203,19,17,180,166,213,70,78,246,236,216,19,167,96,226,21,+221,186,140,84,41,227,168,107,252,67,156,106,131,212,189,5,214,217,215,234,+108,188,13,32,144,145,217,72,231,150,22,22,65,169,245,75,251,119,105,111,+174,132,183,103,243,247,24,83,116,107,230,185,44,176,50,61,60,14,13,57,+82,47,22,215,9,250,114,5,229,162,171,170,237,241,39,196,92,81,28,145,+28,227,242,43,142,38,2,82,192,204,242,67,51,128,86,17,54,119,232,142,+90,78,188,17,159,235,197,240,46,174,240,130,112,247,103,217,113,51,100,45,+213,67,182,105,120,22,156,17,55,172,230,124,252,1,212,110,74,87,120,106,+59,153,188,160,253,209,69,78,190,30,20,218,26,76,73,227,65,204,192,197,+172,191,6,216,16,87,173,171,74,131,75,79,88,58,171,2,80,248,15,192,+245,186,198,27,253,20,91,44,64,70,14,109,196,35,3,246,130,226,138,70,+83,218,68,244,253,166,190,223,136,177,222,42,105,102,174,42,232,87,21,157,+207,200,105,26,157,227,63,73,254,222,32,236,20,14,21,222,37,139,244,89,+50,94,203,248,121,92,13,233,187,199,149,68,69,228,19,89,174,41,60,33,+197,189,251,112,223,230,87,96,137,52,124,225,197,126,170,215,201,100,22,64,+58,132,157,255,176,204,173,22,170,210,25,10,109,59,53,63,171,249,85,34,+53,52,202,213,48,27,82,88,70,153,210,186,153,70,187,196,113,79,86,36,+34,150,217,254,30,11,138,186,162,226,135,205,121,128,249,96,144,147,198,224,+92,254,236,214,82,133,61,215,45,42,204,174,153,157,183,155,251,116,62,144,+104,99,243,31,29,115,111,21,66,220,238,23,245,103,229,175,217,209,103,166,+220,77,11,112,254,77,34,241,55,143,127,223,40,20,230,47,24,241,108,78,+130,234,239,77,90,45,122,156,182,180,60,134,85,31,137,208,202,152,68,236,+35,84,26,67,2,235,58,237,132,70,193,231,5,229,130,100,213,18,44,137,+106,102,216,81,136,18,185,246,85,253,190,226,90,49,65,40,206,176,92,82,+174,221,13,238,11,210,39,82,234,245,190,68,7,254,171,227,141,23,145,52,+168,68,252,50,196,160,199,31,49,146,109,69,99,97,118,243,111,122,90,158,+106,144,61,102,198,7,186,80,220,181,177,125,74,191,70,209,26,81,39,231,+149,69,204,6,182,198,5,91,45,57,103,16,86,224,67,78,142,84,189,238,+96,229,247,159,178,86,180,121,123,220,240,217,173,130,181,48,62,19,45,73,+9,244,41,98,117,3,155,249,241,250,210,226,57,155,40,81,24,171,36,47,+110,226,153,77,14,17,176,131,226,215,58,34,183,77,88,91,140,107,116,165,+150,190,248,28,236,28,141,186,25,92,48,88,120,130,160,108,162,115,132,170,+243,45,226,109,153,111,67,65,27,253,240,187,160,76,17,141,219,125,177,14,+2,100,151,80,140,155,11,105,165,103,10,17,54,219,91,171,95,69,54,89,+235,210,184,161,210,34,150,207,196,206,104,1,34,198,128,10,174,112,120,88,+161,136,169,207,12,140,39,102,114,225,11,54,35,66,103,222,111,113,86,241,+44,232,60,212,125,228,160,96,4,172,37,205,67,159,229,186,132,43,19,218,+243,251,24,147,234,249,3,230,131,217,55,134,224,240,211,58,114,210,72,9,+143,189,218,114,200,95,147,31,250,175,167,21,60,186,39,247,89,3,69,225,+233,247,126,173,199,142,130,182,245,30,211,78,46,76,28,207,180,252,0,57,+170,95,255,244,195,141,250,208,142,89,144,159,127,53,120,106,231,13,181,58,+80,2,101,199,162,48,188,248,42,62,88,221,255,238,183,152,18,183,86,78,+124,24,181,237,176,61,187,74,12,69,35,167,131,197,98,49,183,78,210,211,+82,12,193,94,156,39,255,78,254,43,249,65,158,96,158,81,85,222,209,209,+77,141,218,162,245,41,188,0,156,211,245,48,231,5,233,163,96,157,238,151,+40,9,184,133,76,8,4,1,40,110,231,208,97,115,170,200,92,238,10,57,+72,197,42,39,10,214,163,126,76,122,149,88,105,89,213,106,10,29,94,241,+11,95,131,247,129,185,136,8,121,170,25,225,21,84,92,53,100,47,206,155,+159,232,175,224,25,92,203,172,99,199,195,59,65,22,94,92,161,246,232,255,+176,122,122,164,242,84,99,73,201,43,81,204,17,153,196,94,180,220,218,190,+200,114,252,202,128,143,234,121,93,165,84,86,51,64,241,155,78,21,82,199,+212,129,3,64,233,117,203,32,108,230,161,176,5,192,108,100,182,23,227,48,+210,211,224,90,132,67,138,207,107,48,175,148,53,151,99,113,86,198,3,166,+151,112,119,217,134,42,222,8,138,75,103,222,51,186,14,223,207,195,62,180,+118,39,242,49,86,75,245,117,31,249,166,246,117,36,97,145,234,104,40,89,+184,33,38,173,155,220,164,97,106,69,65,225,81,226,185,51,140,8,16,65,+55,4,246,137,124,8,154,127,215,56,249,215,232,20,168,133,183,181,14,147,+42,111,78,243,46,123,121,178,145,72,2,204,130,47,190,132,144,159,254,80,+40,157,141,138,30,22,193,110,225,48,244,201,242,143,107,251,75,171,85,163,+192,31,84,211,6,161,10,64,162,201,3,71,206,27,172,91,174,217,203,20,+72,40,231,30,172,55,80,166,218,80,148,69,137,219,26,185,109,95,168,97,+70,16,109,144,154,228,190,248,245,134,243,113,116,190,33,87,79,237,23,172,+11,168,58,84,80,29,239,221,108,84,56,221,156,72,199,101,66,26,204,136,+208,1,223,103,169,254,130,46,183,28,89,4,97,113,58,94,107,80,218,218,+238,44,125,53,168,253,113,165,114,44,183,98,40,214,200,71,151,250,118,183,+34,120,126,66,230,140,238,200,220,121,139,32,171,186,14,222,216,96,226,29,+51,113,222,121,66,83,151,66,149,152,145,74,97,192,161,45,5,140,141,227,+3,162,147,1,40,39,161,110,60,4,90,45,228,102,128,89,151,2,114,12,+68,197,38,112,131,81,189,179,76,136,1,51,1,4,30,29,95,248,146,10,+166,171,60,2,41,251,152,147,89,162,139,149,192,138,115,6,56,58,186,171,+96,95,230,226,144,215,3,71,179,56,104,184,173,112,70,171,49,176,82,163,+209,60,133,22,93,145,219,170,66,177,191,3,49,220,150,71,223,83,45,204,+158,3,236,92,209,159,12,151,147,95,133,8,239,56,153,222,28,199,140,43,+122,88,149,225,121,50,212,121,165,134,103,95,233,164,151,26,254,128,221,73,+144,220,143,207,43,42,90,227,20,155,194,208,89,19,123,90,101,6,241,36,+118,32,215,241,41,144,4,64,216,235,222,107,210,115,43,66,191,4,158,151,+132,212,198,252,130,200,2,144,186,7,134,174,239,232,135,138,94,4,48,206,+104,41,127,123,47,101,23,29,140,42,226,28,65,139,206,46,176,195,149,87,+39,75,133,92,166,0,132,25,64,117,114,65,241,29,59,200,8,150,176,150,+68,134,88,121,63,65,183,8,29,231,242,206,229,201,22,32,243,58,126,90,+64,221,15,254,212,239,73,51,87,3,152,133,50,165,132,129,197,177,167,168,+25,64,25,174,69,253,243,201,177,166,241,181,129,173,38,77,250,183,81,213,+112,150,200,75,127,132,236,209,16,219,30,142,18,193,234,221,178,165,208,191,+37,137,235,246,42,164,164,179,179,40,74,233,13,33,37,144,206,124,173,125,+188,173,96,19,127,213,157,22,222,41,110,191,179,25,207,192,243,219,221,16,+197,241,238,245,159,38,147,240,250,155,41,140,3,189,252,45,155,11,191,95,+213,207,215,191,41,52,126,187,170,208,236,178,175,77,205,36,89,251,252,31,+123,88,62,73,224,42,196,177,193,160,64,142,43,153,211,255,221,215,75,133,+109,210,87,211,161,232,55,132,185,176,167,215,200,56,237,39,133,3,243,148,+213,125,89,123,192,91,74,7,237,208,10,241,255,244,78,123,58,176,85,242,+176,95,244,6,36,94,144,101,132,109,153,247,247,35,69,114,77,196,54,73,+213,146,170,224,104,217,31,61,176,215,149,159,139,218,149,127,182,120,225,48,+127,218,231,215,77,124,46,203,66,106,9,139,60,65,206,187,114,216,255,179,+221,68,107,73,42,222,162,115,198,78,132,214,102,116,52,166,129,228,22,174,+94,204,53,246,241,35,155,178,213,64,51,252,89,246,16,226,224,177,106,124,+102,16,199,27,216,239,129,11,209,101,126,183,162,52,130,35,218,48,250,57,+41,193,167,221,133,215,121,250,94,97,123,241,7,214,12,186,67,39,40,221,+1,208,20,52,246,113,227,211,123,130,19,40,178,98,139,96,45,120,71,240,+51,161,247,88,62,111,94,163,223,196,189,153,19,173,46,42,49,30,190,159,+51,137,156,34,75,123,99,108,24,188,176,148,183,116,229,125,201,20,75,7,+172,129,27,203,70,41,137,166,7,149,90,234,84,5,152,199,128,106,65,205,+59,35,109,163,144,39,8,25,140,128,139,144,7,18,251,124,13,24,29,203,+31,167,5,149,180,195,125,178,41,37,133,17,43,190,25,101,148,182,121,114,+87,96,227,73,145,54,36,92,154,19,83,121,144,65,12,39,231,135,147,101,+206,124,220,193,212,21,149,171,110,176,252,28,4,56,55,182,13,215,109,124,+242,204,207,210,29,207,238,45,72,203,36,239,149,255,230,223,54,190,102,204,+93,23,250,79,9,150,236,120,111,33,98,217,120,118,215,80,55,171,202,155,+38,236,223,134,33,224,119,139,161,42,200,90,83,216,79,98,168,174,120,88,+4,169,251,3,122,198,65,66,150,115,35,131,120,36,105,248,171,103,115,184,+169,173,251,112,36,220,233,253,122,106,122,74,13,95,75,97,21,12,170,131,+163,118,127,187,136,67,10,142,1,179,197,33,183,56,215,72,231,101,227,16,+148,86,21,52,87,178,115,201,81,113,131,135,250,202,63,225,25,64,192,60,+88,123,94,109,89,110,7,242,241,209,30,36,244,92,29,96,169,220,5,134,+249,109,165,162,154,149,124,85,106,151,186,245,142,228,238,102,110,59,49,84,+161,139,172,78,7,91,9,234,184,231,227,82,101,90,203,253,114,135,153,61,+128,98,5,96,211,7,127,127,108,22,50,64,57,51,144,61,200,92,39,160,+177,37,60,213,108,170,221,226,90,70,7,35,9,88,116,167,230,40,88,196,+89,127,184,1,89,174,182,33,98,144,246,16,24,215,195,131,22,13,116,127,+77,113,141,100,162,111,200,29,19,13,77,66,104,252,123,213,39,15,175,75,+53,148,243,137,203,209,186,127,215,168,248,181,219,44,118,103,95,211,158,205,+35,149,189,36,239,86,248,47,46,105,173,97,243,64,135,253,89,131,21,38,+28,15,252,182,142,86,188,133,100,78,71,206,161,126,208,104,105,149,221,122,+159,84,211,238,251,216,180,103,235,33,200,62,76,141,61,53,94,111,148,29,+22,73,186,185,52,181,45,150,118,94,33,72,243,60,251,92,12,145,198,113,+185,57,188,254,173,30,64,194,206,214,89,155,184,217,198,17,148,28,22,36,+97,84,9,101,26,19,5,166,70,73,158,197,230,106,154,252,217,255,121,214,+76,132,53,83,76,110,40,70,214,242,106,234,72,194,164,61,126,159,65,76,+36,156,21,64,211,38,252,11,122,97,168,209,128,195,161,233,212,228,228,234,+240,230,214,178,102,129,163,77,136,114,9,100,86,131,114,26,254,61,230,11,+24,205,40,110,171,137,97,32,186,202,152,253,142,100,154,160,35,80,4,204,+87,35,4,65,85,246,182,58,34,235,53,85,115,98,248,72,3,49,130,44,+145,255,183,97,247,117,164,168,197,133,116,99,65,241,139,167,145,153,54,34,+23,0,23,168,45,10,155,156,66,246,96,153,42,17,25,153,195,105,194,29,+91,61,68,253,89,173,94,210,244,162,50,71,5,184,137,80,17,78,45,217,+15,197,27,125,0,129,231,45,243,158,6,15,233,15,20,30,57,32,88,83,+51,153,147,253,199,152,98,40,6,241,210,145,42,49,58,12,10,71,198,4,+0,2,219,242,249,36,45,53,132,219,48,227,220,56,102,124,62,125,11,76,+0,177,186,167,11,247,106,71,127,65,82,114,11,115,14,139,110,39,78,252,+80,236,179,4,42,62,176,246,23,71,181,59,231,255,246,153,152,61,110,64,+102,72,81,173,83,116,49,18,64,46,252,153,205,142,182,72,231,188,245,11,+156,103,175,55,235,78,83,23,57,74,208,207,85,171,31,199,241,137,20,173,+158,192,27,138,99,50,44,116,21,199,5,163,210,123,154,12,11,119,251,250,+209,84,29,187,162,198,114,147,102,19,208,26,228,119,234,35,135,141,130,77,+211,22,223,133,59,141,19,19,76,22,185,107,200,158,0,147,155,105,240,150,+208,133,133,193,177,75,212,248,166,253,105,212,127,25,221,161,242,111,227,169,+113,183,30,52,33,142,85,137,234,30,144,230,148,41,101,223,184,205,237,3,+69,100,53,5,175,43,244,26,200,220,30,219,182,225,169,17,140,53,241,47,+226,221,104,80,62,1,13,104,0,191,140,176,243,72,34,232,204,72,81,18,+3,56,80,83,192,139,248,34,29,210,119,218,80,212,1,27,191,134,93,8,+94,3,148,130,2,107,65,3,81,106,81,249,74,181,132,33,48,101,175,141,+145,208,74,134,217,30,130,200,214,255,169,233,39,127,205,217,12,152,89,121,+111,108,176,61,171,14,9,130,124,84,231,119,58,3,233,241,119,3,51,237,+124,252,235,116,183,147,169,40,216,188,248,37,75,21,48,169,201,185,66,14,+82,17,73,163,27,159,185,96,238,25,22,114,153,38,223,174,160,32,12,174,+230,249,46,91,154,10,221,78,145,141,230,235,70,233,251,210,36,233,92,255,+61,218,45,134,218,130,21,37,152,60,189,144,127,25,42,242,241,54,182,103,+45,72,207,210,17,101,16,239,144,32,11,93,244,137,169,239,41,84,12,47,+252,196,132,243,112,171,95,254,191,158,11,139,165,147,56,218,67,234,82,38,+249,117,1,78,190,56,84,149,216,2,46,240,91,85,83,107,122,252,67,141,+76,24,165,190,189,228,111,224,195,55,156,57,160,36,55,237,78,169,18,76,+190,218,168,193,166,114,153,213,113,123,146,156,88,142,26,115,81,107,97,31,+155,206,0,163,60,253,85,159,184,0,157,208,207,239,4,209,122,41,54,185,+196,87,175,188,174,204,198,31,151,60,136,162,196,86,116,68,211,133,20,137,+213,172,39,39,63,185,232,177,151,109,92,193,159,142,116,121,243,185,61,67,+68,78,172,117,135,25,66,158,251,187,141,195,98,114,165,238,104,175,241,77,+46,222,35,124,142,188,30,14,44,84,50,132,170,203,142,208,132,110,125,90,+42,170,68,158,196,78,92,103,73,32,206,175,180,60,115,250,220,202,162,171,+239,235,205,227,251,214,81,242,204,41,121,179,177,74,24,170,232,237,20,235,+70,15,9,137,246,36,193,247,84,173,47,100,89,101,40,174,66,242,124,64,+128,165,129,120,168,233,90,138,163,48,100,135,78,105,163,104,151,86,68,87,+151,39,104,125,228,96,138,187,111,26,244,47,9,66,67,48,167,0,167,26,+125,19,21,21,12,236,174,235,210,23,220,29,173,210,9,72,36,70,56,117,+185,32,37,48,193,246,179,214,42,95,101,62,43,29,254,232,21,238,186,52,+192,201,173,135,245,106,18,119,119,179,69,201,252,57,201,254,86,35,209,32,+89,185,166,217,189,248,70,195,17,111,253,95,119,165,125,146,199,59,127,116,+63,74,219,132,162,243,247,231,192,113,166,242,197,170,237,188,87,99,20,232,+127,141,82,87,0,6,39,240,115,8,72,98,119,122,172,249,115,172,19,221,+65,55,224,131,1,4,185,142,50,111,42,27,224,187,83,84,234,148,230,161,+81,222,145,134,69,126,238,86,9,63,153,225,32,221,246,128,44,203,92,133,+71,138,19,36,211,11,193,128,94,140,105,75,87,232,172,17,165,49,198,145,+255,31,92,136,217,174,5,14,226,66,36,175,139,165,140,148,128,68,185,161,+147,227,17,250,11,169,139,194,205,178,130,2,98,192,160,137,121,125,249,36,+77,142,159,54,70,224,55,47,131,240,97,90,237,41,138,60,45,163,236,162,+236,183,3,42,220,143,82,99,220,76,239,166,63,106,115,111,196,62,205,154,+214,181,85,246,225,54,220,187,137,30,31,52,138,91,214,181,228,157,123,236,+129,157,122,104,18,122,139,38,14,194,29,46,210,74,147,68,112,144,50,140,+76,115,218,58,106,210,154,2,16,93,211,252,51,160,53,196,233,5,62,50,+152,157,134,192,190,215,38,18,95,5,184,207,100,189,174,101,13,211,41,207,+127,251,172,198,3,146,206,68,190,237,152,234,94,154,82,157,154,145,17,91,+53,100,58,89,84,116,209,43,233,251,89,80,244,125,139,129,166,62,179,105,+123,138,29,205,21,17,103,108,9,205,184,8,196,175,190,78,48,168,82,1,+59,168,5,53,125,156,123,16,63,162,35,93,88,97,56,191,145,75,92,145,+209,35,191,89,90,174,34,138,26,13,129,254,177,170,70,170,140,49,200,79,+13,200,85,138,138,60,186,106,210,81,133,48,190,227,89,237,158,133,213,226,+41,97,175,137,229,146,182,69,219,193,17,118,175,161,207,66,231,94,97,0,+146,15,155,249,132,134,143,122,50,181,210,180,247,129,29,75,9,128,58,108,+57,82,151,37,204,11,96,80,246,206,212,172,211,134,177,168,239,167,226,11,+27,171,168,73,20,231,126,65,7,169,39,183,145,162,114,28,145,111,190,74,+232,66,241,9,204,164,131,70,106,254,249,102,101,102,186,89,189,255,88,69,+114,19,82,166,168,149,146,65,119,217,66,192,119,163,36,44,185,64,95,197,+169,86,96,36,7,35,155,224,194,232,181,142,229,149,180,95,70,200,157,153,+172,250,130,109,52,140,160,176,146,18,74,175,137,194,18,175,202,47,155,250,+124,187,8,69,2,255,230,146,122,31,61,228,209,195,199,121,87,20,37,68,+162,71,124,236,167,91,230,32,117,252,82,136,224,229,11,98,92,16,101,42,+71,37,64,185,217,120,131,93,46,186,223,198,157,207,188,145,243,10,115,204,+76,194,28,218,51,232,15,54,128,188,36,243,195,87,56,86,11,163,101,253,+49,136,42,138,183,199,47,163,252,52,30,153,18,218,182,83,80,47,195,44,+152,219,170,40,168,206,243,168,94,78,88,127,228,125,250,215,185,166,74,11,+18,196,115,33,44,165,49,169,27,204,155,188,191,247,205,20,248,99,35,12,+44,157,7,209,170,239,237,146,155,86,86,6,250,95,175,118,223,161,59,195,+7,217,251,170,68,27,31,129,233,159,13,85,255,135,242,238,238,128,32,130,+245,166,221,74,85,135,204,253,137,145,156,139,200,211,96,116,211,125,44,13,+128,185,103,230,133,143,89,198,132,96,119,49,201,43,173,66,252,125,12,46,+0,145,224,196,196,89,0,93,242,65,113,9,53,235,191,225,127,154,225,57,+143,233,22,73,57,251,185,192,197,243,222,86,196,32,70,17,230,22,162,71,+160,215,55,43,22,242,43,233,88,176,212,193,44,33,153,249,30,126,128,1,+1,171,87,159,176,54,139,227,126,154,140,163,19,41,133,95,50,211,76,213,+234,247,214,235,10,87,152,93,72,142,147,15,235,236,97,137,85,129,212,201,+43,34,100,210,244,96,213,114,48,174,112,250,11,190,98,164,67,245,129,199,+94,218,131,167,27,232,51,53,106,107,35,119,99,210,96,223,47,55,156,198,+169,229,101,192,100,67,109,139,186,115,180,82,180,39,144,176,143,252,211,97,+182,27,20,138,51,216,187,214,101,179,217,207,66,158,71,144,162,73,90,47,+65,227,28,54,249,158,141,92,168,62,160,47,198,76,200,252,60,42,248,213,+174,154,78,104,42,177,171,135,86,81,63,18,231,242,54,67,3,84,242,220,+55,61,199,35,43,2,113,170,42,228,200,99,165,19,103,180,150,36,215,47,+175,168,251,80,42,127,209,167,219,30,175,15,147,39,22,165,60,213,231,109,+195,75,195,193,97,30,77,249,242,240,216,174,145,233,11,2,65,249,76,128,+222,16,247,186,221,7,34,65,15,254,214,96,26,112,33,93,115,164,95,128,+158,148,131,219,86,49,144,18,77,196,197,68,126,131,81,255,211,145,126,252,+212,253,157,101,214,68,145,190,247,64,236,160,33,203,210,75,85,197,89,27,+173,126,38,216,145,181,16,250,207,55,24,181,130,188,35,192,130,255,92,206,+62,54,199,9,175,69,18,114,52,140,219,248,91,157,223,32,197,78,98,2,+138,38,38,4,196,207,90,238,172,181,71,245,42,206,161,102,249,122,82,48,+167,243,196,124,145,146,85,112,91,162,25,201,108,74,101,29,59,87,146,98,+244,197,11,242,110,140,144,61,165,182,121,31,191,66,169,243,27,221,38,178,+139,173,43,182,146,134,43,79,23,167,13,177,121,157,46,237,44,105,39,141,+1,94,25,203,145,25,58,143,122,129,197,183,190,181,44,24,104,47,247,203,+182,212,134,75,245,143,245,124,115,126,96,201,230,98,72,226,102,192,113,37,+97,210,169,94,26,85,72,90,145,94,0,106,58,27,24,150,194,17,146,221,+220,24,103,57,17,180,184,131,175,218,128,18,189,104,62,30,233,132,42,191,+141,64,230,31,159,236,21,192,180,182,13,91,57,179,130,30,158,89,67,229,+53,53,181,206,128,140,100,69,193,28,118,254,155,96,166,57,150,223,219,72,+228,38,115,56,239,254,165,154,142,35,134,22,217,71,166,63,210,46,211,95,+42,68,18,213,204,116,85,100,43,44,49,177,185,223,233,164,186,216,20,37,+13,148,9,241,71,128,134,18,247,51,60,89,244,83,70,3,127,7,42,94,+244,32,27,185,248,84,82,9,202,210,133,183,86,211,17,253,166,112,79,91,+162,54,9,243,188,226,190,118,15,142,169,23,92,135,97,134,136,207,211,250,+250,24,91,206,134,1,169,58,122,196,70,46,217,123,213,147,112,84,54,39,+192,34,172,88,6,234,91,95,43,141,209,136,208,193,96,206,191,50,127,11,+128,63,28,100,50,17,245,9,20,7,44,201,128,115,131,75,110,180,196,179,+23,41,99,243,195,19,45,178,223,15,39,20,16,139,51,64,207,245,1,129,+202,140,225,255,44,197,211,119,125,145,140,94,145,217,153,114,138,157,249,76,+122,169,39,247,254,145,25,39,208,178,157,80,49,104,143,62,1,5,225,116,+151,253,180,206,146,251,206,228,4,30,190,60,77,88,170,200,63,112,205,242,+241,228,242,159,210,64,28,84,97,158,158,28,213,129,152,7,164,202,7,17,+200,104,191,147,44,57,38,175,121,251,155,84,240,157,173,39,95,112,218,248,+205,76,153,238,192,190,132,85,109,105,26,14,188,5,134,53,9,237,48,105,+98,230,3,63,220,60,251,45,124,99,245,166,56,4,33,88,159,221,216,178,+116,200,196,81,196,39,182,129,218,53,234,77,94,85,4,77,244,152,76,3,+201,134,98,37,58,233,40,183,84,106,218,208,54,128,72,161,76,247,15,150,+3,235,211,160,251,95,132,63,92,168,95,231,4,63,9,161,97,152,38,211,+49,190,70,33,249,104,24,151,151,176,150,206,71,114,207,226,135,156,72,36,+92,151,51,44,156,228,142,84,10,121,219,104,77,134,233,58,181,207,173,16,+105,54,7,76,9,12,21,75,63,199,12,21,135,123,144,255,241,248,58,231,+127,142,212,57,120,53,204,250,52,140,253,53,245,90,167,250,75,83,160,176,+221,26,71,154,92,138,140,78,186,188,185,18,228,173,115,132,81,192,164,150,+4,34,106,247,204,221,144,135,146,160,243,57,8,127,237,104,154,113,177,181,+46,100,84,250,237,133,155,206,181,88,140,31,101,233,231,45,154,67,84,88,+93,246,90,185,171,18,188,27,174,248,240,71,95,223,181,245,2,3,81,254,+37,39,80,151,95,159,114,64,115,186,223,45,175,251,88,13,182,113,10,225,+233,47,192,96,18,203,96,27,164,50,123,238,229,30,80,156,244,240,205,77,+50,37,12,100,222,44,50,92,227,229,97,99,251,225,36,191,125,245,253,229,+43,103,105,93,177,159,158,147,177,163,247,70,50,160,230,90,24,181,117,139,+61,136,45,186,206,74,55,208,159,181,60,1,136,54,113,89,10,182,29,111,+229,168,82,19,210,22,124,174,182,112,211,31,140,38,251,18,217,218,117,153,+133,139,244,33,25,41,194,18,194,232,104,159,55,141,177,153,45,70,108,80,+213,76,0,127,79,164,119,168,107,114,180,233,29,208,26,225,135,131,59,180,+175,204,228,23,6,73,25,84,57,252,243,250,142,21,60,234,246,205,189,112,+142,32,73,74,132,204,5,70,93,218,232,176,176,112,232,228,30,4,163,220,+46,158,36,186,227,70,145,120,63,103,176,156,26,11,177,239,188,172,245,86,+15,227,156,194,30,202,255,183,84,52,189,184,53,33,170,137,113,124,163,72,+36,219,244,197,154,156,86,177,83,168,166,90,54,194,224,230,65,100,33,171,+158,91,35,203,55,228,36,8,26,95,217,4,106,51,48,188,151,99,59,159,+184,223,234,159,231,86,109,94,159,114,18,153,21,95,105,107,129,168,220,116,+95,234,105,141,72,213,223,10,120,168,86,13,187,172,25,158,71,30,86,188,+0,189,63,21,99,73,35,53,121,225,59,152,97,88,211,243,219,141,122,230,+32,43,232,206,58,60,149,100,56,238,67,131,37,192,64,77,179,225,103,184,+158,147,111,238,5,10,194,93,163,81,120,131,13,181,128,246,29,153,43,26,+88,187,102,36,56,130,125,25,190,132,14,11,186,10,81,125,9,111,141,254,+113,140,143,147,128,66,144,89,153,53,30,33,181,146,182,122,54,180,165,242,+54,216,23,92,185,111,120,97,187,253,154,159,143,14,0,67,105,230,231,139,+204,139,7,41,206,59,84,96,9,39,114,163,137,134,127,153,171,81,217,193,+202,81,103,122,35,54,162,147,185,68,192,39,213,215,116,191,170,205,102,87,+189,128,163,9,228,69,16,32,114,139,233,22,147,238,229,210,231,141,231,132,+176,246,237,148,251,71,65,182,130,184,132,16,60,73,29,108,140,28,29,158,+5,52,203,37,192,6,223,50,133,189,149,43,77,162,130,153,26,177,191,51,+158,226,173,222,50,170,200,88,195,192,101,103,50,157,72,70,138,247,68,138,+146,13,54,141,132,204,174,243,248,239,29,142,105,51,204,171,81,127,97,83,+92,42,149,242,245,245,219,19,128,71,44,62,250,54,142,152,1,227,89,248,+65,13,191,106,134,28,247,85,38,220,219,74,126,211,43,194,253,196,187,195,+125,27,181,101,23,122,194,252,113,173,181,249,198,236,165,75,151,24,85,90,+204,15,161,212,220,16,23,231,64,25,78,113,156,69,130,206,3,148,179,234,+234,230,97,165,116,201,128,230,35,29,184,85,96,54,202,250,134,254,169,132,+8,14,201,149,117,33,232,242,196,218,98,195,128,191,244,183,118,7,109,213,+64,187,52,246,180,30,39,4,30,128,29,98,121,89,114,119,70,7,211,114,+72,150,175,0,117,80,190,22,21,21,248,183,211,66,61,95,134,208,223,211,+198,202,225,196,127,246,72,56,174,103,7,144,236,19,88,173,106,178,145,17,+137,91,157,122,9,91,194,124,120,139,163,47,92,186,100,19,228,206,4,254,+103,174,175,142,188,35,230,15,170,218,65,90,241,93,172,134,74,79,206,116,+51,217,158,75,113,36,1,135,182,135,178,200,2,198,30,27,19,86,130,172,+104,108,38,201,206,56,95,187,8,169,30,201,236,149,254,51,153,190,127,103,+109,213,27,14,239,207,184,194,29,117,253,103,193,54,233,212,2,243,238,31,+255,62,121,217,154,181,254,128,211,54,183,108,47,25,182,151,12,198,86,19,+121,35,170,9,250,197,185,118,105,50,93,81,89,197,92,224,113,8,134,152,+199,82,154,114,183,92,3,174,171,69,118,242,128,193,142,12,89,42,22,236,+205,3,143,195,137,192,36,78,96,137,201,127,80,66,220,134,110,181,66,22,+197,226,150,86,168,14,41,106,144,210,43,109,210,140,2,31,77,30,216,233,+186,185,5,142,233,222,153,26,8,126,80,62,43,128,114,70,170,118,185,148,+53,217,158,146,61,223,34,121,184,138,242,246,74,193,68,231,165,160,57,47,+156,32,12,82,50,100,4,140,25,36,156,97,50,201,93,0,192,101,101,45,+118,24,174,251,212,208,244,133,100,159,219,170,178,24,58,154,218,97,186,180,+44,57,14,105,185,141,239,160,166,33,163,142,121,131,205,120,228,137,44,151,+216,126,189,22,227,129,191,59,11,166,171,255,142,188,126,154,194,134,179,139,+165,18,118,211,39,25,30,233,152,79,146,145,159,112,134,69,248,153,247,126,+243,251,0,25,39,132,229,138,50,134,151,81,81,0,36,222,44,224,75,61,+212,149,74,117,116,64,205,23,44,148,239,201,147,164,229,70,217,76,169,87,+141,71,129,223,167,54,54,165,100,239,235,100,24,183,178,226,48,243,221,196,+249,176,158,186,206,85,200,167,18,150,107,216,105,75,18,53,179,24,46,107,+38,167,250,185,21,246,126,200,14,13,84,184,121,21,87,212,75,151,120,167,+104,254,164,150,33,175,13,183,115,25,201,122,110,124,135,46,183,238,157,158,+111,64,84,29,37,24,233,20,176,205,106,114,166,252,182,61,255,229,172,177,+38,159,223,93,27,233,90,216,176,212,247,55,47,39,102,44,185,17,40,11,+111,17,195,73,89,165,76,120,123,239,146,19,145,223,46,90,35,69,199,95,+40,252,59,148,143,180,181,51,136,95,43,57,6,76,80,248,250,251,16,143,+36,206,43,202,107,15,137,216,120,245,164,78,210,180,131,101,130,199,217,206,+253,78,169,47,102,194,26,29,185,185,115,200,119,27,84,182,172,187,63,250,+179,185,205,125,22,49,82,53,170,197,29,211,50,8,143,106,213,148,78,91,+91,49,12,21,82,26,75,40,18,85,144,90,74,144,169,168,177,175,130,105,+125,151,217,22,43,224,239,245,208,73,212,145,139,67,210,195,6,191,140,216,+116,255,197,214,13,79,90,205,205,117,0,5,138,157,12,94,176,119,218,206,+224,164,56,90,156,201,83,151,154,27,227,47,29,162,155,153,111,237,245,113,+70,45,43,255,103,185,227,24,131,40,160,132,127,215,38,252,11,107,160,24,+238,147,102,83,139,98,226,191,73,234,39,37,252,241,33,35,57,214,48,116,+161,83,27,9,233,39,97,227,202,110,62,233,70,227,198,232,89,52,158,102,+145,67,96,59,88,203,202,66,55,103,151,224,50,73,135,177,73,171,130,61,+207,151,69,164,1,70,144,213,69,234,135,131,32,157,135,167,127,36,244,7,+212,137,144,254,116,47,5,143,16,43,141,81,166,93,79,187,195,82,180,26,+53,136,25,146,53,34,233,132,136,72,9,229,93,243,107,170,119,23,117,242,+104,78,201,200,75,240,250,106,215,39,27,162,121,70,228,5,198,234,253,235,+88,199,65,169,57,236,13,114,39,159,36,37,84,131,195,249,73,51,74,117,+201,242,28,149,60,236,83,8,209,200,0,187,110,168,81,82,90,200,199,226,+146,170,208,90,52,121,173,9,50,144,3,74,21,10,157,145,95,39,129,77,+201,82,58,219,216,79,229,33,15,137,59,239,46,25,227,199,164,147,61,15,+112,80,201,157,56,240,179,134,19,27,81,202,217,125,70,142,62,189,115,196,+52,145,88,135,234,97,226,155,204,240,80,127,108,13,108,125,209,154,206,12,+208,44,228,160,187,131,39,58,255,157,116,101,172,123,7,177,193,171,91,138,+84,137,5,196,63,162,204,47,181,194,158,179,210,173,10,140,94,156,193,202,+119,179,165,144,34,246,208,40,237,125,200,31,242,165,111,93,33,253,58,232,+208,10,121,146,87,171,25,103,7,208,177,132,146,230,45,151,135,177,228,154,+186,80,138,209,207,163,66,212,219,105,88,9,95,73,0,203,235,205,150,243,+89,177,23,209,123,224,55,63,15,218,96,134,37,105,224,115,98,145,156,127,+160,5,119,229,58,241,195,6,136,116,239,206,195,167,201,156,1,44,165,101,+210,88,246,5,147,133,66,101,34,252,171,78,101,73,159,168,16,216,238,224,+188,89,251,108,85,53,217,31,162,208,117,240,30,254,251,15,36,156,232,246,+152,124,2,126,194,233,246,51,157,87,104,67,172,168,176,37,162,222,217,232,+66,162,252,23,178,224,216,65,166,136,197,252,177,93,12,57,50,221,149,182,+165,95,160,116,5,250,100,114,170,50,37,194,97,227,119,30,166,77,71,10,+100,149,89,19,127,62,80,69,254,250,100,42,110,241,66,183,180,198,171,39,+108,231,75,202,139,35,140,211,216,127,206,8,75,133,77,21,250,180,111,211,+224,219,230,112,31,71,134,21,115,210,154,68,186,17,188,78,34,98,188,102,+15,205,225,51,157,236,123,19,49,144,9,52,163,231,102,98,30,116,5,202,+246,72,94,119,82,121,245,189,129,152,2,149,214,141,93,137,46,48,204,16,+197,144,202,193,71,155,197,12,198,242,138,230,84,139,199,12,15,165,28,122,+201,117,151,17,106,109,177,130,0,223,158,21,243,73,167,196,85,190,67,81,+63,201,33,162,83,127,162,140,187,33,114,194,206,20,174,116,44,225,184,123,+199,58,244,5,176,156,121,177,120,85,22,132,127,249,215,168,58,69,19,59,+167,129,88,77,241,249,237,45,207,199,66,178,54,172,128,89,247,176,158,181,+191,187,170,209,211,236,210,231,94,237,12,26,36,1,106,126,211,24,184,97,+109,206,218,2,135,31,106,100,58,6,232,180,29,11,194,156,58,203,237,158,+110,200,187,36,221,96,60,244,89,50,131,182,85,198,182,241,247,155,43,104,+112,172,119,74,213,230,139,94,190,110,131,215,98,44,39,230,47,230,127,64,+9,101,66,83,105,197,150,4,47,247,71,144,213,234,33,207,230,34,190,82,+100,184,12,255,139,206,205,111,192,90,91,49,130,49,106,82,70,180,53,244,+205,47,167,124,164,8,86,81,172,209,97,66,185,180,104,197,130,70,74,248,+176,32,164,37,146,44,117,145,171,210,229,242,218,51,159,26,111,29,183,226,+171,209,102,134,37,61,13,176,78,34,31,10,210,230,230,117,207,176,247,78,+177,71,131,18,20,78,156,206,206,93,97,172,29,169,40,17,52,154,71,17,+98,124,14,21,209,171,142,148,236,203,78,48,200,132,119,182,189,47,228,189,+156,176,47,226,194,168,2,95,133,60,135,34,120,141,175,193,5,53,100,111,+111,178,237,236,12,151,26,219,230,89,137,162,237,109,240,61,197,210,99,135,+72,136,11,113,215,201,94,69,10,221,152,193,56,78,46,56,30,205,172,58,+48,58,198,39,184,33,0,208,23,87,221,250,41,147,36,215,66,94,219,178,+247,44,139,43,35,133,41,197,179,202,16,229,66,127,58,52,180,213,145,128,+140,91,194,233,168,91,144,238,69,250,165,215,43,140,82,73,127,189,153,58,+103,100,98,40,115,117,241,220,198,141,60,71,242,35,195,48,242,110,145,169,+230,7,245,222,168,253,151,26,63,76,94,96,187,208,23,207,154,124,45,83,+147,64,70,146,237,25,117,201,178,201,19,82,167,70,106,156,136,213,194,18,+120,60,58,242,128,195,251,11,59,190,26,11,30,168,35,191,126,19,61,199,+224,82,32,253,208,215,167,238,241,105,0,108,154,223,53,186,6,124,54,143,+191,220,154,175,111,51,16,98,33,186,18,247,207,230,238,115,249,184,7,148,+233,221,162,47,158,132,136,96,251,157,51,98,96,165,119,68,104,67,149,196,+141,11,181,135,114,192,77,23,229,154,253,111,145,227,210,151,106,197,123,188,+112,104,4,96,168,228,44,11,23,59,185,96,240,55,192,67,235,173,37,232,+8,89,223,212,254,219,144,241,60,119,183,17,116,9,174,156,66,139,95,43,+136,208,81,161,229,226,4,2,2,125,26,153,18,215,63,2,233,90,247,133,+214,161,80,130,237,30,159,234,139,211,171,228,87,200,77,116,100,35,143,211,+154,255,113,205,183,245,16,68,124,192,73,44,184,180,94,12,220,116,90,17,+229,67,201,33,196,184,180,11,155,145,59,102,149,151,181,34,99,216,100,71,+91,101,210,206,21,87,220,106,63,76,64,96,205,232,44,40,73,40,208,239,+254,117,199,51,247,1,187,47,151,95,142,6,23,8,2,57,110,11,49,116,+226,237,254,253,82,12,68,168,62,213,241,193,249,246,248,57,31,251,231,170,+9,172,170,159,235,82,164,220,87,103,162,221,242,141,43,239,29,211,226,116,+120,96,236,28,157,234,248,103,204,253,29,17,248,143,20,52,41,64,222,217,+41,228,133,220,234,31,171,97,191,6,116,160,107,215,126,205,242,58,121,82,+4,122,130,200,22,218,71,191,17,172,206,183,219,76,10,40,211,108,28,0,+144,132,39,40,22,112,217,198,125,35,77,126,231,254,205,117,64,67,43,25,+47,186,123,191,50,108,63,226,163,179,223,86,209,193,28,155,20,199,164,32,+84,25,90,30,68,82,146,100,49,144,189,106,138,110,89,233,177,49,91,160,+226,12,26,27,59,0,100,91,188,244,188,244,44,149,238,140,111,5,228,219,+8,41,19,44,99,45,192,67,198,243,93,242,121,126,96,116,84,174,151,22,+128,186,139,36,137,95,118,174,158,104,157,40,77,150,231,14,127,46,222,82,+149,114,30,22,215,2,195,138,127,240,102,178,59,246,120,82,50,192,142,232,+171,59,33,73,0,239,90,90,150,42,201,215,95,50,104,42,2,242,1,8,+29,180,54,75,120,16,101,211,230,24,204,15,221,214,58,252,78,247,248,229,+217,82,67,76,66,55,127,36,165,134,16,8,138,97,215,241,168,108,136,32,+35,42,83,88,133,83,111,12,36,221,130,244,24,32,254,22,230,62,226,47,+3,73,23,234,37,55,110,67,21,118,42,193,94,43,16,111,170,164,190,155,+101,202,192,140,88,92,209,40,137,15,199,176,122,0,184,245,23,51,128,75,+11,231,92,239,229,254,52,158,12,191,159,230,201,74,223,222,190,91,104,60,+68,5,248,225,29,145,80,190,201,22,242,23,145,50,148,253,32,232,100,136,+37,94,21,163,33,29,167,71,49,73,215,78,124,213,205,47,82,185,40,10,+140,7,234,51,17,117,193,141,26,151,197,72,99,106,147,182,230,43,104,100,+152,13,23,225,184,39,13,237,160,233,201,25,207,77,0,107,232,214,130,92,+16,112,112,63,157,237,149,180,224,216,53,245,79,82,58,223,26,147,78,160,+225,133,184,12,82,124,92,152,21,156,162,27,173,117,242,197,246,118,76,75,+109,15,108,60,127,164,228,196,224,113,86,209,80,17,225,183,11,232,90,58,+91,100,7,165,81,116,141,182,206,50,14,218,10,151,135,234,194,181,107,255,+18,196,231,254,229,168,187,204,13,151,234,126,241,59,49,241,184,255,34,93,+53,77,221,185,147,193,146,27,112,174,104,14,12,92,149,251,94,183,78,140,+89,119,251,60,139,148,48,75,46,240,231,239,237,251,219,227,38,30,17,246,+62,12,0,157,187,240,152,232,187,15,163,101,222,208,93,178,117,10,143,0,+68,171,108,221,24,66,182,253,84,240,32,162,160,141,100,174,122,219,104,246,+220,128,203,244,26,14,213,201,7,236,236,123,124,32,216,52,53,87,107,136,+180,244,233,69,192,167,207,74,175,150,138,27,170,82,85,83,125,208,197,79,+128,67,50,251,82,213,56,135,4,103,225,53,129,3,111,4,205,29,63,180,+208,212,189,108,30,166,53,194,18,6,67,215,173,89,175,115,202,38,165,209,+77,180,98,146,162,116,65,98,159,251,47,81,73,223,87,61,175,214,148,218,+244,160,101,225,178,224,46,72,254,58,227,84,206,40,93,194,105,148,176,117,+26,105,52,30,197,201,92,171,0,219,22,112,111,164,19,224,22,247,64,157,+87,227,7,87,229,171,105,105,31,100,110,32,7,91,189,87,169,132,13,41,+208,105,228,207,14,232,118,73,253,164,230,102,218,31,146,43,160,117,104,98,+100,166,86,151,107,84,20,204,55,27,227,151,174,191,178,145,115,31,26,216,+45,190,89,187,146,87,37,44,170,125,240,114,109,189,250,18,180,114,22,137,+35,190,89,246,142,192,130,143,116,113,149,91,143,206,229,59,223,10,163,209,+101,178,231,108,37,25,107,213,157,77,56,0,173,46,28,231,197,231,119,197,+160,20,204,109,239,204,218,216,190,25,128,53,225,54,44,253,183,73,235,251,+69,22,176,69,158,149,86,58,27,144,129,149,68,25,222,117,74,213,251,126,+191,20,200,100,54,87,22,51,17,243,53,100,122,220,197,225,58,62,171,208,+58,122,168,48,104,1,197,104,55,34,73,194,151,130,242,101,150,133,70,202,+187,117,166,4,142,53,82,13,155,248,70,97,151,216,33,223,197,208,38,155,+191,66,194,117,243,229,88,99,211,133,206,204,122,159,221,84,107,141,38,252,+252,198,111,102,224,30,103,81,230,28,194,191,178,251,236,128,89,197,51,235,+187,237,113,112,60,83,217,74,88,113,160,173,177,136,17,194,59,87,136,233,+177,192,222,195,40,102,251,58,178,192,191,105,211,176,56,132,214,78,27,27,+25,69,78,188,142,67,25,223,7,102,174,187,62,75,45,30,108,137,244,136,+31,117,145,115,127,132,83,138,15,132,134,156,90,46,211,11,139,131,72,57,+155,5,253,197,78,226,11,8,85,121,209,69,104,205,51,201,239,192,84,11,+121,48,217,168,17,127,93,43,138,45,91,192,38,155,95,191,68,192,185,100,+111,145,124,98,202,235,168,172,155,33,92,132,81,176,237,192,135,0,78,222,+179,57,30,209,163,172,44,136,17,119,56,52,12,193,55,151,186,239,93,104,+78,179,121,50,130,242,236,120,171,175,120,213,68,164,117,211,100,3,216,60,+85,57,168,255,207,250,150,89,162,39,39,140,100,27,1,130,109,155,8,164,+138,226,86,152,70,126,144,102,93,135,204,65,95,151,121,86,25,54,75,99,+155,85,130,242,0,226,84,17,225,240,132,4,74,198,183,56,139,88,12,203,+132,192,94,136,215,173,21,76,196,212,150,100,254,237,24,177,89,180,61,106,+59,176,106,247,120,216,104,178,96,81,141,115,36,178,84,248,11,39,237,247,+177,53,105,187,207,233,218,116,123,103,139,165,113,173,10,107,238,176,160,61,+50,136,153,163,127,52,181,204,224,65,142,218,36,176,106,106,117,85,42,87,+27,115,196,62,89,227,254,252,255,21,103,233,235,65,146,71,123,40,106,132,+3,80,68,49,67,69,134,119,180,98,106,155,106,190,179,194,191,164,162,5,+188,49,108,209,26,128,222,104,49,8,217,222,19,74,181,167,124,240,26,230,+33,68,47,105,39,49,48,165,113,203,234,63,204,209,97,9,82,87,75,220,+29,60,173,200,185,239,122,11,188,31,224,32,127,29,253,44,243,50,204,197,+255,75,88,153,78,85,116,64,234,101,46,247,141,124,250,138,49,36,105,254,+55,167,202,220,187,230,40,89,205,71,18,127,237,168,46,81,80,203,144,190,+91,73,164,182,66,45,101,215,18,66,121,35,158,251,105,6,61,196,252,197,+39,153,114,128,176,121,184,240,192,122,127,59,222,181,184,46,178,228,103,114,+107,9,218,92,121,86,220,132,243,210,51,51,184,96,58,195,148,140,229,238,+84,99,176,40,176,238,179,47,103,197,90,177,49,51,68,141,135,237,148,243,+104,123,175,123,84,232,8,143,14,71,129,116,138,236,150,207,89,216,25,13,+173,169,79,144,132,141,140,205,191,52,240,117,107,53,233,49,222,169,125,235,+202,17,27,27,91,49,40,76,186,18,181,129,24,253,56,250,45,115,114,88,+22,195,155,67,125,242,177,254,176,217,232,74,206,40,182,241,69,126,195,30,+117,24,5,77,20,68,176,218,183,71,123,102,185,3,207,214,52,237,95,154,+42,62,44,51,116,42,63,128,128,158,156,17,170,243,246,171,95,235,82,203,+88,154,219,67,228,248,104,254,249,108,34,160,230,176,123,105,12,157,168,7,+221,50,165,154,157,119,69,74,58,201,12,194,215,203,129,184,184,215,237,183,+208,197,108,184,49,116,107,233,56,188,80,199,150,220,158,156,16,8,3,59,+12,57,88,107,144,97,17,180,42,198,120,202,106,177,216,107,218,149,195,159,+21,60,15,8,6,143,211,243,235,173,10,76,0,243,92,183,220,245,35,181,+248,90,54,82,115,149,36,142,234,210,253,252,212,192,138,55,230,238,164,104,+160,103,206,167,101,18,65,188,170,199,124,67,23,233,46,210,192,109,74,46,+6,2,196,242,101,229,151,22,250,45,251,17,249,70,238,243,208,110,247,82,+140,221,99,5,29,128,130,90,25,247,16,0,163,63,195,150,99,172,150,187,+123,225,55,52,97,96,13,237,31,195,158,175,9,25,230,113,93,30,213,127,+25,177,152,101,110,161,192,29,61,224,71,184,97,236,211,68,16,66,205,50,+128,202,163,43,196,173,149,198,2,2,133,69,103,78,53,109,238,195,39,240,+86,169,200,49,138,184,253,134,67,30,146,244,75,125,103,93,89,159,232,68,+151,146,157,149,11,117,129,102,238,106,165,241,142,243,36,236,217,175,253,167,+145,19,111,194,169,115,184,172,78,250,76,22,160,242,73,46,183,50,75,88,+54,3,247,31,173,142,177,153,169,194,7,22,243,43,180,76,3,82,210,202,+244,128,101,48,160,247,6,56,174,67,189,240,81,128,59,172,82,71,62,25,+198,102,147,53,132,235,136,124,136,20,252,169,68,116,140,222,0,78,36,21,+151,101,119,40,140,159,224,6,215,251,6,194,19,165,132,26,248,15,10,154,+72,181,19,120,207,70,247,33,5,6,181,34,16,216,57,185,174,58,148,230,+21,98,239,215,241,151,246,84,219,122,231,98,203,159,29,215,112,134,251,203,+235,126,205,196,15,96,204,61,74,50,251,72,62,152,53,35,197,219,189,113,+30,187,238,193,32,39,107,244,228,112,47,96,124,150,0,32,249,2,6,72,+116,28,224,89,33,100,240,19,75,118,173,172,243,188,148,208,252,170,116,151,+78,10,182,240,159,71,137,203,17,139,19,179,237,203,233,177,181,242,41,48,+210,62,235,77,121,65,213,29,255,37,200,5,104,54,130,101,188,238,56,100,+201,136,81,107,145,136,218,182,93,17,29,239,218,43,117,184,200,132,164,156,+140,247,219,222,26,18,129,249,189,14,217,170,144,44,171,121,230,38,206,206,+247,51,149,130,70,235,97,44,78,72,232,36,190,93,249,238,121,148,189,162,+178,156,205,18,175,248,135,218,84,124,213,119,149,222,4,243,218,24,52,185,+126,229,214,233,60,144,249,128,76,107,189,12,247,151,143,103,51,73,229,107,+115,148,88,42,55,97,218,195,31,65,176,59,243,124,11,16,252,81,157,222,+62,36,67,255,109,211,105,76,132,217,152,42,135,92,3,175,18,109,40,252,+240,175,90,6,159,191,104,97,4,92,238,120,79,241,237,198,100,144,149,102,+241,239,124,249,209,117,82,71,192,15,237,39,211,60,122,57,94,10,6,20,+215,104,221,25,208,112,209,116,140,50,63,2,241,156,18,220,41,15,53,88,+120,74,178,222,211,214,16,90,232,56,180,46,189,230,113,17,67,194,118,150,+119,22,193,210,11,101,181,9,24,42,251,214,229,242,134,140,229,126,73,58,+186,35,198,173,253,142,29,69,11,140,132,145,95,155,5,91,254,42,204,200,+229,67,232,113,177,140,101,28,154,67,61,160,10,58,33,67,208,147,190,244,+74,75,75,114,224,227,84,26,158,73,160,108,182,19,224,30,53,211,115,114,+13,64,12,145,224,233,70,143,37,219,239,82,239,140,49,219,194,90,114,192,+202,45,95,193,147,14,164,107,137,70,120,30,30,178,78,229,116,254,183,75,+123,105,112,171,168,9,157,219,235,41,152,70,50,217,75,39,99,133,39,60,+77,113,120,125,143,90,117,4,184,42,13,223,77,196,181,69,90,98,65,153,+143,228,209,232,9,81,78,12,170,51,30,16,252,81,45,181,193,202,183,161,+62,96,200,160,134,248,27,13,250,80,34,63,125,250,7,220,204,106,204,188,+109,215,203,143,23,188,0,240,92,252,150,47,186,50,142,194,10,112,242,197,+155,191,157,206,22,169,208,105,235,12,4,34,221,27,27,205,86,34,56,76,+212,56,168,112,145,178,183,178,18,162,89,155,23,92,157,194,88,193,179,68,+33,113,46,45,235,219,70,183,154,228,97,84,125,215,44,54,227,245,12,83,+212,207,220,179,91,245,25,31,38,100,223,208,94,220,169,199,151,228,201,113,+4,110,116,231,34,190,47,162,246,151,48,231,74,196,137,17,239,245,189,229,+234,228,39,140,107,38,6,103,28,51,111,240,21,46,177,118,58,84,66,198,+149,150,247,193,5,130,186,166,41,100,230,92,139,50,109,205,46,10,131,172,+55,200,115,89,53,95,3,146,217,97,136,254,228,54,196,199,0,70,237,125,+197,47,70,206,102,159,198,13,146,42,36,47,131,109,40,107,157,149,173,132,+31,29,110,192,64,79,165,174,128,188,77,252,232,207,49,235,200,80,96,196,+186,90,74,242,182,2,23,10,0,125,58,59,189,65,154,195,138,28,191,104,+89,171,117,101,240,205,182,89,215,198,245,206,43,225,46,85,231,173,30,197,+54,126,164,33,127,177,132,53,109,1,211,45,131,79,108,35,232,254,157,95,+160,10,142,178,51,195,83,7,89,174,64,173,128,14,70,29,118,185,159,223,+178,67,187,224,69,159,70,77,72,81,174,131,4,123,47,219,66,112,124,126,+12,40,113,215,54,243,8,179,77,246,164,1,110,103,86,209,49,60,175,94,+159,253,193,242,135,25,114,191,246,50,198,194,142,254,245,26,98,254,98,197,+110,46,249,233,127,123,130,218,210,140,230,91,185,10,107,234,155,230,210,55,+114,129,61,21,42,70,144,164,252,98,216,23,22,222,193,146,5,107,128,61,+150,235,17,244,110,18,79,230,134,166,245,215,165,94,96,247,29,140,100,27,+205,13,245,45,202,152,127,47,75,65,153,83,174,192,159,140,29,102,235,196,+106,214,35,249,151,210,237,242,249,132,249,34,59,59,140,111,118,131,221,246,+102,252,55,188,188,253,5,239,36,216,197,245,17,61,133,184,220,223,156,81,+220,81,143,79,119,177,190,102,80,163,62,102,85,18,109,40,212,214,221,209,+49,193,84,188,83,233,25,119,27,47,112,148,210,81,30,159,56,158,202,162,+81,151,142,167,202,105,161,150,6,218,168,62,141,42,46,21,150,248,193,223,+174,64,213,110,180,233,10,1,103,117,128,135,184,12,218,78,72,73,202,121,+223,43,240,126,34,92,219,247,172,253,215,75,124,93,33,146,193,152,60,64,+124,101,59,229,240,218,199,229,168,173,197,75,25,79,62,123,105,242,30,121,+161,179,245,65,28,180,253,95,133,35,134,246,233,138,62,132,3,200,255,108,+70,182,220,70,96,201,130,239,139,195,130,127,8,183,106,154,67,77,88,150,+121,64,230,224,18,117,188,255,180,51,125,249,9,115,129,75,4,170,98,87,+36,80,198,138,38,105,20,99,197,187,39,244,238,161,174,65,26,245,143,79,+70,249,232,170,31,203,218,158,68,79,205,67,204,78,30,147,200,93,177,159,+92,236,207,117,170,193,88,243,145,28,88,215,226,21,170,20,133,230,248,196,+28,47,140,190,94,33,144,203,53,229,158,140,87,94,0,107,15,238,216,79,+86,17,232,32,117,171,67,158,63,247,152,242,236,48,54,18,227,219,166,99,+120,253,159,158,205,208,212,81,123,117,8,113,5,83,207,19,153,132,67,124,+39,17,121,51,3,1,72,151,223,214,60,198,222,20,116,12,160,14,30,242,+28,222,85,31,99,108,91,33,174,150,181,179,109,85,29,137,221,36,225,108,+172,68,120,10,153,245,211,89,132,99,101,48,158,108,197,242,156,136,249,201,+166,147,101,118,18,72,137,233,166,46,135,42,57,119,228,142,249,241,38,168,+226,90,69,26,101,213,202,57,39,239,186,183,202,9,114,143,127,214,150,183,+92,182,159,171,144,209,134,187,26,219,205,102,201,234,249,94,136,62,232,121,+200,213,80,212,237,105,96,180,169,198,95,48,38,253,112,26,116,20,117,239,+55,200,170,56,4,238,9,205,238,211,98,71,74,129,223,96,31,121,90,138,+104,79,39,193,126,208,149,91,112,228,229,126,130,222,244,235,174,229,189,159,+166,52,121,147,26,44,83,9,208,144,200,146,30,195,14,72,250,53,11,113,+18,162,255,185,212,191,163,207,24,187,0,163,22,100,65,45,181,139,243,13,+0,233,140,191,105,160,130,144,147,41,30,38,244,241,190,126,87,53,158,114,+239,67,94,101,101,131,59,27,176,136,149,232,136,95,106,187,40,244,155,99,+36,215,205,95,131,209,152,107,64,25,22,68,208,146,219,39,11,101,196,4,+72,79,24,225,39,161,173,200,72,135,226,104,2,121,37,6,18,235,234,138,+53,198,212,79,15,121,124,50,241,46,176,137,22,24,155,141,217,178,205,144,+18,48,198,152,8,12,200,83,61,180,45,105,146,243,86,132,77,3,113,125,+86,205,45,222,68,41,62,166,225,204,6,56,186,55,83,37,96,28,192,206,+23,60,101,19,56,60,125,26,95,152,220,228,38,35,167,143,192,10,132,194,+105,187,163,121,232,115,114,196,34,97,227,197,132,89,196,143,232,176,130,167,+58,217,182,82,98,206,89,111,199,202,209,5,106,93,176,62,127,208,146,208,+20,14,151,38,112,233,79,83,118,82,189,58,246,94,52,242,65,211,215,173,+88,123,28,149,132,81,164,221,10,183,3,114,218,166,240,123,178,74,182,210,+221,249,245,38,9,96,1,91,126,35,202,235,73,12,213,204,240,165,155,100,+59,229,176,158,158,228,31,81,250,31,141,130,158,228,89,231,129,191,254,205,+248,197,158,144,182,165,118,192,16,83,4,247,50,102,9,123,26,128,83,51,+164,171,167,165,74,35,84,63,118,88,240,214,148,199,77,73,218,101,51,220,+191,64,49,134,62,65,179,82,154,4,76,188,212,72,202,246,199,186,225,208,+136,40,161,125,97,94,211,127,148,213,163,65,144,72,48,230,56,148,37,12,+96,112,73,167,187,190,113,90,97,117,56,219,152,137,106,211,115,99,186,141,+54,152,126,90,190,225,243,2,89,146,129,179,29,59,65,30,241,213,79,240,+56,206,152,56,146,24,21,209,103,70,150,63,96,122,179,242,66,133,11,190,+226,1,173,184,162,255,154,114,206,162,173,186,141,143,148,7,35,223,151,199,+55,75,232,220,110,142,237,209,83,66,231,198,208,23,175,138,34,81,220,157,+38,15,211,184,4,113,29,33,42,84,148,93,58,171,63,34,50,234,185,113,+59,165,66,96,173,51,40,239,30,202,37,117,20,192,7,34,20,200,81,156,+73,134,18,247,197,230,197,167,96,245,3,239,215,210,156,100,1,209,41,84,+123,133,226,123,3,189,17,118,168,179,9,130,178,140,76,199,249,134,235,2,+78,251,146,160,156,174,187,115,241,171,144,175,104,84,137,54,237,167,84,151,+215,26,102,89,177,52,207,77,100,171,8,2,173,39,144,88,225,0,210,122,+193,205,112,222,230,54,204,13,58,59,63,29,83,224,77,186,240,209,238,201,+53,233,219,65,22,222,62,209,143,206,64,230,150,108,243,167,180,55,25,92,+65,143,245,197,140,78,125,116,62,254,164,161,91,62,231,141,163,50,112,179,+130,123,177,177,75,73,173,172,35,141,236,193,197,231,245,142,85,181,109,127,+30,178,105,207,14,104,77,36,174,111,82,217,22,211,139,18,35,124,45,196,+104,154,150,182,12,153,125,142,113,168,214,104,91,182,239,59,232,151,109,250,+34,209,144,122,196,248,61,120,13,232,117,167,250,37,231,12,148,0,245,195,+251,39,148,204,93,95,34,170,39,178,46,87,167,24,107,123,101,144,223,6,+163,31,147,35,248,156,9,19,188,176,67,112,200,65,49,201,19,119,72,105,+154,212,81,93,132,73,216,159,179,90,204,23,106,13,222,200,72,193,96,17,+145,205,51,8,17,206,143,72,184,71,126,134,7,136,0,167,0,83,68,249,+70,21,245,114,196,47,94,212,208,54,196,128,174,2,163,176,185,116,223,191,+137,4,45,76,225,97,230,101,105,154,34,163,68,17,195,139,45,182,41,46,+250,169,182,249,213,70,34,102,219,109,225,78,232,12,140,97,198,243,225,81,+242,113,34,170,207,53,141,216,186,103,214,230,243,89,143,236,24,14,179,105,+197,179,206,135,135,176,73,15,17,87,165,195,194,57,168,189,139,179,92,5,+191,23,69,117,72,34,150,202,183,235,24,158,224,67,180,112,210,67,189,6,+224,181,160,39,216,125,18,16,156,77,116,195,253,19,185,24,177,154,67,216,+161,234,27,75,14,216,218,174,156,226,39,119,191,142,57,119,243,89,148,85,+137,207,4,159,96,37,99,212,123,165,115,230,185,91,244,156,39,145,62,127,+149,255,241,9,9,231,211,83,179,165,178,51,163,225,14,101,190,5,142,130,+19,18,183,217,7,13,72,116,115,74,85,193,35,88,103,181,91,1,174,87,+54,158,248,101,70,90,157,134,231,208,239,27,182,255,189,194,54,60,101,26,+128,163,135,142,123,42,146,227,99,7,155,170,25,35,26,127,20,65,138,59,+235,223,44,61,187,200,218,228,157,124,111,52,79,106,5,35,254,74,83,174,+190,129,241,126,121,53,155,206,202,180,233,226,234,46,60,156,102,9,116,11,+119,29,218,31,42,176,164,27,51,26,14,212,76,35,55,24,235,136,15,183,+144,160,188,215,8,186,66,87,130,74,98,255,32,37,118,98,67,38,75,228,+220,226,184,98,125,176,13,48,85,65,14,53,158,199,220,113,103,250,103,15,+149,214,52,140,30,163,117,223,106,201,38,108,15,208,136,11,223,244,193,38,+132,184,126,138,176,86,50,249,192,245,209,85,106,7,242,115,201,115,19,30,+84,51,106,3,157,77,65,178,193,250,111,5,237,248,196,98,65,150,96,140,+16,148,92,130,17,177,189,166,204,96,214,14,37,33,173,181,198,181,118,116,+189,93,64,65,82,206,136,199,223,171,31,131,122,169,76,236,109,152,86,228,+247,63,209,55,126,248,146,87,46,241,246,124,103,184,40,185,114,203,142,208,+216,227,9,155,181,9,142,237,41,47,97,144,149,60,93,243,232,157,188,64,+7,138,163,142,36,230,0,51,16,95,105,66,115,76,92,31,141,17,103,82,+192,77,116,54,47,146,176,2,167,3,253,167,244,135,193,187,101,113,57,206,+81,244,155,70,5,52,13,130,0,169,23,217,252,193,114,81,245,99,253,209,+202,171,69,119,52,3,20,83,19,151,66,212,221,220,212,190,130,8,182,152,+10,125,218,72,100,174,234,144,117,180,210,36,154,220,199,249,222,28,84,219,+83,60,208,119,56,74,37,176,199,85,29,131,19,176,233,142,231,138,199,133,+174,64,230,100,245,43,182,0,251,217,144,133,171,61,40,74,128,202,223,222,+58,73,47,202,17,159,153,0,171,93,121,2,20,2,81,65,9,3,198,252,+201,121,182,66,143,172,191,38,102,74,135,90,49,50,4,138,148,145,241,49,+221,125,159,226,240,86,21,175,230,72,217,150,206,190,55,181,23,35,224,145,+199,49,192,69,76,1,215,189,0,10,216,190,180,34,41,237,145,67,113,230,+99,48,221,94,108,68,139,120,220,68,126,206,89,23,87,30,27,181,13,214,+140,90,252,64,244,116,181,93,253,243,4,101,254,8,240,215,153,208,178,166,+31,234,149,219,130,91,217,223,41,26,169,193,73,66,24,209,122,144,208,238,+158,63,61,80,242,138,240,128,22,59,216,5,31,132,46,56,241,166,4,118,+195,75,42,190,241,48,53,124,63,163,100,22,187,1,206,8,165,38,174,190,+115,86,68,88,247,205,102,97,95,142,30,238,139,116,202,1,247,72,235,182,+183,34,43,39,133,198,238,95,141,250,95,235,176,134,198,127,155,182,173,244,+117,211,40,243,249,55,28,241,243,49,128,14,130,3,150,198,108,211,75,63,+101,125,9,9,14,76,74,28,67,143,210,51,65,4,139,173,160,142,106,19,+118,124,128,168,162,152,128,230,106,164,134,74,128,214,109,211,99,62,213,51,+7,163,90,36,186,111,133,46,68,26,6,8,5,208,31,90,238,9,242,55,+205,196,86,68,155,112,228,183,6,151,178,192,165,140,183,18,76,177,137,194,+27,192,205,54,184,253,107,108,216,200,243,76,71,220,26,247,235,252,235,137,+90,29,205,73,206,101,236,245,89,176,241,241,58,196,234,72,50,224,152,252,+185,7,241,206,147,66,243,93,133,25,20,29,62,59,194,186,89,189,60,104,+184,225,224,183,117,121,169,66,167,232,38,153,69,21,36,131,23,90,152,254,+15,238,158,116,169,70,47,254,163,37,224,192,199,79,230,94,3,52,150,188,+5,225,168,224,96,162,107,214,61,221,14,52,202,141,228,29,214,219,193,183,+41,75,33,88,68,59,7,110,112,179,36,94,176,146,68,209,28,209,61,146,+160,225,11,21,183,240,153,206,215,32,91,125,222,141,161,114,243,110,243,129,+122,32,134,74,19,234,49,33,70,159,43,11,124,42,7,215,8,30,72,71,+82,240,157,165,179,227,101,229,21,169,64,37,95,205,211,29,41,130,231,184,+254,122,96,226,133,66,98,40,131,250,194,207,69,230,121,238,228,22,233,37,+34,139,237,70,253,225,9,144,26,11,110,118,207,101,233,193,196,174,212,91,+232,11,165,202,104,227,43,127,136,171,96,205,147,233,72,199,79,222,176,197,+126,169,238,139,77,59,229,103,87,17,197,79,131,60,96,44,15,129,82,189,+0,12,231,236,251,203,69,188,136,167,181,179,73,142,152,120,138,241,116,125,+77,117,165,76,0,187,235,162,156,142,25,18,32,235,80,66,194,43,189,138,+92,94,234,56,28,133,215,18,43,231,46,214,0,133,237,123,98,11,172,227,+52,253,160,238,166,11,35,157,83,254,103,114,103,181,114,181,237,137,173,235,+22,105,196,5,207,182,32,237,55,39,157,212,185,37,226,198,239,175,34,237,+0,24,19,217,241,166,40,248,5,76,221,229,114,138,200,60,10,30,22,3,+177,152,243,203,220,99,12,203,95,110,68,2,169,255,7,208,68,69,97,136,+118,168,226,131,157,102,126,78,206,34,154,7,62,111,205,157,210,155,220,215,+255,191,224,49,115,19,207,193,14,178,56,76,22,169,61,173,99,39,244,39,+121,142,129,161,27,24,152,223,94,142,198,114,155,20,215,255,120,4,116,102,+62,126,68,241,236,121,78,218,113,226,43,109,188,15,186,33,28,55,4,63,+106,147,162,185,112,15,28,253,1,45,191,153,132,102,64,38,29,241,52,70,+96,184,185,86,208,82,17,52,250,233,108,133,184,41,53,115,13,119,42,130,+161,4,47,77,254,192,0,157,41,145,155,10,14,180,123,66,72,247,253,232,+186,5,143,133,7,90,122,201,13,225,142,20,88,11,249,246,16,184,217,231,+151,17,110,23,149,216,79,142,209,58,227,213,124,48,11,245,33,199,100,86,+101,91,202,249,78,35,228,247,105,154,150,127,53,171,194,72,63,214,7,246,+151,1,190,80,241,247,109,134,171,177,161,87,6,241,14,35,85,151,218,151,+189,74,84,175,175,132,200,81,148,236,208,255,108,129,5,93,6,234,92,138,+82,254,241,88,113,221,15,75,227,217,180,121,73,18,255,206,247,53,67,106,+117,163,202,229,235,5,130,49,119,248,12,87,8,1,101,109,208,29,36,151,+127,64,46,104,14,220,175,240,201,149,247,223,20,63,64,124,231,106,162,143,+24,174,41,75,173,201,36,113,112,151,197,210,19,210,159,213,81,135,43,196,+175,151,119,5,174,58,97,154,34,234,78,3,38,81,79,122,48,155,76,133,+131,92,177,248,107,126,183,83,230,144,173,3,148,206,80,207,126,94,193,102,+47,52,183,54,203,241,53,77,97,146,161,160,41,4,17,133,136,68,105,132,+215,36,113,14,51,83,165,219,187,68,174,36,206,233,169,234,10,72,18,237,+27,63,92,33,243,70,96,65,232,131,229,126,60,124,241,39,6,10,135,160,+184,1,234,121,5,168,60,128,244,83,41,53,31,24,247,110,210,47,237,25,+27,122,50,214,220,94,211,17,240,88,3,86,205,160,242,160,2,53,205,78,+168,158,108,69,99,101,145,215,241,227,91,246,227,94,126,103,53,53,135,144,+15,230,158,166,79,173,148,201,169,51,172,211,24,140,248,222,239,125,240,87,+145,213,26,159,226,12,249,20,226,116,19,198,5,227,239,42,31,220,125,16,+9,152,156,210,173,20,75,201,71,107,193,52,183,186,44,33,149,188,252,231,+214,57,4,224,26,110,246,62,228,222,103,118,45,41,203,84,227,170,194,72,+73,82,222,108,157,73,167,40,112,42,158,213,14,7,226,234,7,195,215,87,+89,44,246,168,98,0,64,194,131,169,47,134,28,121,192,13,199,181,31,104,+52,34,4,145,59,248,88,153,120,179,118,181,24,58,155,62,128,67,21,206,+174,235,206,149,48,17,97,4,161,45,189,166,1,132,237,218,65,11,71,208,+125,106,114,164,205,87,147,58,56,54,69,151,229,17,127,81,77,98,134,164,+99,212,182,83,10,182,22,35,56,252,50,188,176,220,105,28,1,40,196,236,+211,18,21,157,16,221,142,119,228,174,155,207,5,194,127,152,205,149,220,211,+4,79,28,85,55,170,95,138,41,122,196,64,25,79,137,151,193,43,145,85,+72,52,140,138,134,104,14,52,117,53,52,210,246,151,211,6,59,126,128,58,+39,165,164,134,239,201,17,47,45,92,112,162,124,132,68,173,240,231,241,99,+157,113,192,57,150,30,215,101,24,251,21,139,223,221,154,229,133,137,112,44,+135,209,177,177,167,181,232,136,168,100,13,213,103,40,27,81,37,118,64,132,+205,58,59,103,99,29,55,138,157,4,102,149,171,82,145,200,108,28,30,141,+243,71,225,7,98,185,79,9,138,91,42,51,66,244,180,210,234,195,236,150,+2,145,178,109,206,190,29,158,99,47,164,86,244,110,7,197,139,235,93,30,+250,16,64,83,64,152,245,205,124,193,30,201,11,37,133,38,129,220,197,224,+164,118,196,132,230,208,49,254,131,6,214,32,84,116,238,0,175,192,216,132,+179,111,146,215,244,17,81,66,76,93,36,192,219,12,162,169,210,177,106,128,+182,31,42,244,175,65,252,241,186,114,187,203,116,144,221,109,91,208,163,60,+164,238,69,56,197,164,174,19,108,253,73,117,56,25,58,164,8,12,182,207,+94,64,75,249,57,241,170,156,204,55,99,107,37,194,77,33,63,67,44,250,+236,18,37,113,247,88,57,80,131,102,118,68,201,219,200,92,130,198,29,203,+144,197,171,125,160,95,33,234,238,145,67,170,174,37,176,186,147,172,89,18,+135,236,172,234,53,251,83,14,130,219,159,235,11,194,212,228,221,221,33,215,+207,143,127,89,136,11,33,251,202,226,167,64,60,8,142,204,42,93,246,92,+122,71,104,243,51,10,13,65,133,149,5,137,69,15,206,202,15,223,223,142,+25,163,11,211,128,126,241,245,157,96,170,9,29,57,226,92,58,101,184,204,+204,165,223,219,35,60,46,177,137,171,238,212,127,7,106,148,156,21,197,56,+184,205,142,89,128,218,107,174,225,150,58,183,226,69,223,185,170,129,42,134,+234,189,3,182,247,115,12,148,208,237,239,205,155,114,28,23,236,57,222,81,+194,2,80,254,93,244,155,139,57,22,212,60,72,10,23,77,135,131,76,227,+118,106,31,214,144,152,94,60,109,73,202,188,64,53,209,124,213,81,125,146,+52,141,186,94,206,43,195,198,255,175,114,52,197,186,88,226,70,204,5,146,+21,239,90,71,96,254,176,195,165,36,0,250,43,159,196,123,43,23,217,39,+57,108,222,32,215,27,69,182,135,206,122,123,64,108,33,69,218,15,236,30,+237,149,146,75,68,48,156,228,5,108,55,152,24,179,1,59,147,21,10,96,+56,220,133,84,221,40,94,235,2,39,134,188,39,48,61,252,87,99,156,121,+146,192,82,204,169,114,204,84,197,164,128,176,224,228,18,243,39,10,255,83,+189,117,32,1,8,248,23,66,190,24,40,22,38,15,98,192,151,231,78,11,+196,111,145,88,92,85,224,47,160,33,64,40,95,74,17,215,32,93,225,53,+118,37,239,142,145,245,114,161,132,9,237,62,165,9,92,187,152,188,184,234,+167,136,99,100,2,22,0,159,227,143,65,247,232,28,156,31,209,62,208,160,+228,14,73,181,252,130,114,201,79,53,234,1,23,113,183,241,83,150,64,233,+199,140,0,160,62,12,131,47,72,17,248,70,145,206,139,13,81,82,218,93,+187,176,37,135,239,202,159,3,156,3,170,228,131,26,214,50,152,183,238,207,+145,87,241,180,5,139,115,248,227,82,62,246,174,148,186,153,218,57,174,238,+39,14,54,52,74,145,140,59,247,252,191,83,201,94,209,214,194,9,178,151,+129,187,125,56,61,11,133,247,142,51,122,1,240,179,193,25,119,129,93,177,+219,207,118,75,168,99,216,51,153,17,37,240,47,44,208,190,38,211,65,106,+187,129,217,101,146,10,80,206,61,58,0,130,130,69,234,72,231,172,95,212,+249,208,92,249,3,14,113,181,65,237,85,130,60,89,96,113,217,37,43,79,+36,8,157,85,176,20,228,82,222,121,4,44,202,8,207,4,162,4,1,190,+135,166,106,204,80,86,10,14,145,220,31,59,239,84,186,208,107,81,15,164,+67,34,70,34,170,43,168,250,131,173,151,101,23,90,108,65,189,43,113,37,+25,45,197,10,203,17,229,136,24,219,74,58,95,86,38,176,102,216,73,24,+76,24,53,245,255,96,144,69,155,10,228,5,208,150,111,85,221,253,215,196,+238,75,129,101,16,244,64,244,113,196,136,0,0,88,237,159,190,225,199,126,+138,103,39,11,107,161,162,93,214,203,104,108,202,96,60,39,199,23,5,99,+122,227,239,88,252,150,8,216,181,68,22,75,156,134,241,135,10,66,3,29,+10,242,7,188,139,110,219,16,130,167,74,186,114,102,161,55,194,64,125,248,+48,100,148,121,233,87,118,128,132,203,180,81,146,104,144,148,145,154,60,190,+177,187,36,104,83,85,168,190,168,15,0,7,91,172,10,53,153,1,16,238,+100,41,118,99,148,221,119,56,130,176,75,79,191,60,185,60,116,105,139,104,+197,84,4,139,212,135,45,134,174,193,68,118,133,127,59,155,215,57,6,181,+2,185,152,50,185,191,68,186,222,16,212,136,182,88,216,25,153,72,164,19,+167,223,172,157,238,52,74,245,103,25,209,168,221,96,218,131,172,134,98,0,+167,127,16,104,152,159,92,29,100,79,241,90,45,186,50,190,180,21,221,21,+140,139,163,237,108,98,14,101,17,72,126,77,65,123,159,251,114,173,122,185,+142,236,222,173,121,218,65,75,16,251,242,35,89,87,46,183,146,161,163,214,+180,175,199,112,63,49,132,26,123,161,141,139,81,251,93,17,20,244,232,178,+225,81,70,253,150,130,108,68,151,149,117,46,199,85,116,201,190,115,152,23,+51,38,130,80,162,154,219,153,137,14,248,58,43,246,100,74,92,152,79,9,+207,183,157,99,254,246,197,76,180,60,124,168,148,222,155,80,239,140,3,135,+95,36,237,223,133,205,203,68,37,33,107,124,253,19,232,224,173,72,220,215,+233,189,35,116,22,185,154,95,225,192,208,249,243,193,46,35,78,62,238,165,+95,199,119,105,147,143,164,52,162,248,45,251,75,77,176,248,38,197,108,226,+234,199,101,69,230,232,122,14,227,2,129,229,240,14,174,31,48,90,219,86,+245,125,190,11,79,197,28,58,102,20,79,231,44,52,102,100,157,255,111,148,+59,180,109,150,116,2,113,186,231,233,120,122,13,54,81,55,106,107,213,73,+224,106,17,37,117,160,158,156,179,168,42,46,56,16,243,17,221,197,190,253,+92,118,118,143,238,255,167,229,24,217,74,67,78,136,112,141,198,99,185,20,+121,135,145,128,94,109,241,224,70,73,146,55,226,83,70,138,25,1,177,30,+26,227,187,24,141,150,94,72,58,55,56,173,237,51,86,54,57,149,59,111,+36,184,147,3,2,40,30,118,23,249,151,157,251,52,252,0,50,115,251,42,+116,71,56,153,115,112,27,72,100,208,101,52,226,49,97,207,98,198,132,182,+203,255,59,251,106,207,31,212,68,99,46,11,45,154,112,152,150,63,109,154,+81,22,210,85,129,65,178,63,91,136,19,134,169,251,243,68,86,144,19,206,+180,29,140,4,12,184,238,108,103,121,36,219,20,221,111,195,225,199,50,238,+234,118,162,116,58,130,4,71,54,29,18,2,118,26,253,194,178,119,160,87,+134,186,137,159,7,123,192,167,252,52,170,181,18,64,168,247,24,37,71,185,+98,249,228,125,140,18,120,250,133,86,130,255,55,182,221,99,1,60,33,91,+58,104,36,9,114,247,157,250,205,96,97,5,57,198,8,252,64,189,162,79,+63,100,239,206,230,98,132,204,47,221,10,250,240,190,7,68,198,244,154,92,+173,226,106,214,40,23,247,89,114,172,239,148,48,170,45,134,59,98,3,10,+183,126,186,40,199,23,46,161,92,3,36,129,243,167,155,113,123,3,219,62,+174,87,54,51,123,206,253,124,22,34,207,125,232,142,166,219,48,26,72,165,+202,164,7,180,131,33,81,112,255,219,90,87,162,159,99,243,20,16,135,118,+123,8,251,237,123,5,211,49,159,62,24,193,137,127,226,118,199,27,255,140,+130,231,204,140,126,60,174,226,82,48,215,183,145,251,51,114,192,86,76,121,+129,169,107,205,40,147,244,169,141,189,179,159,202,157,61,51,79,50,145,87,+1,9,196,91,124,235,18,161,4,54,154,176,108,160,205,251,54,97,102,211,+253,105,233,15,133,68,106,157,56,111,18,248,130,119,136,37,239,147,47,140,+92,44,152,172,211,149,203,199,54,144,120,91,60,75,103,70,220,37,188,226,+56,176,84,20,230,220,35,59,239,52,24,236,182,97,181,237,176,209,131,164,+197,93,37,121,212,29,133,20,61,181,228,105,90,68,121,39,186,50,130,212,+192,231,61,195,4,251,50,228,106,68,135,136,131,219,155,142,245,231,203,130,+247,196,62,240,124,131,42,82,220,207,177,146,169,139,0,13,41,245,213,98,+78,233,136,163,176,176,9,85,173,51,206,145,148,14,192,230,187,96,68,21,+253,137,191,9,96,100,33,99,166,234,154,158,110,252,108,184,131,145,244,177,+142,29,147,107,69,133,14,238,32,65,36,120,215,31,76,156,175,96,254,142,+237,240,156,104,128,155,147,58,223,86,184,197,226,127,102,84,67,216,181,213,+196,12,71,29,94,159,185,93,194,82,202,211,122,227,246,52,69,92,213,239,+176,248,50,239,159,209,46,131,226,115,78,54,89,115,112,149,25,117,8,167,+149,33,146,158,163,44,198,177,134,133,182,191,143,97,32,39,5,16,84,26,+168,226,16,251,208,200,246,6,142,237,96,75,249,28,203,190,220,149,178,21,+251,3,148,36,125,237,74,159,231,227,196,198,142,109,125,208,14,221,206,43,+232,164,55,238,135,124,138,241,123,116,41,31,154,78,116,154,7,87,7,72,+167,199,114,76,168,43,112,113,135,65,169,166,77,177,222,52,243,226,140,67,+125,174,152,141,156,108,86,12,218,132,144,221,141,199,247,22,221,246,99,217,+241,136,78,124,177,7,104,102,214,224,114,201,190,249,241,88,129,124,85,249,+223,166,238,249,92,180,18,205,36,57,178,154,213,58,166,174,251,27,7,203,+67,188,85,74,165,108,198,242,77,145,71,131,85,67,61,161,142,81,53,189,+79,116,150,247,146,172,73,170,144,253,194,239,11,187,210,145,76,51,75,53,+45,228,205,224,174,127,92,199,85,235,180,13,156,197,135,194,23,91,252,165,+95,53,164,205,144,221,42,126,162,117,205,116,166,137,134,53,61,248,130,112,+244,240,232,58,200,32,40,238,71,111,134,52,79,26,133,79,70,215,220,184,+152,132,129,50,117,85,150,199,208,146,176,66,59,180,217,200,84,180,86,201,+76,153,198,18,220,127,170,191,116,174,159,121,101,193,176,142,13,21,124,243,+181,84,94,154,227,242,12,252,113,118,187,48,60,31,185,156,70,213,101,239,+102,231,185,82,149,162,208,175,82,219,80,237,86,144,39,3,147,128,159,97,+131,165,59,100,123,180,145,156,180,189,94,245,32,23,11,126,99,193,98,227,+241,158,208,118,134,17,147,179,29,203,144,131,115,148,43,245,207,138,209,18,+168,160,151,140,100,22,124,253,22,55,207,224,104,43,54,84,25,63,185,196,+94,242,112,116,38,16,161,68,122,117,178,233,65,161,151,124,94,165,24,52,+17,215,43,200,154,136,19,122,125,202,50,110,5,154,220,206,145,89,77,159,+189,79,30,119,202,156,228,98,249,106,115,253,6,75,93,184,114,155,100,223,+87,175,174,8,14,186,184,28,49,255,126,221,198,171,250,227,35,120,64,79,+108,34,126,83,202,105,34,242,125,53,123,42,16,37,133,115,215,24,192,62,+116,180,252,133,34,226,158,152,147,212,216,211,120,176,39,85,76,231,85,21,+121,184,211,217,186,209,93,32,105,117,252,36,207,236,104,17,173,40,244,66,+127,163,129,240,192,160,218,98,2,231,53,150,1,136,227,37,111,69,42,147,+226,49,182,33,136,61,142,254,117,17,8,71,91,94,225,133,216,13,79,111,+218,206,16,109,140,90,75,18,56,121,73,103,10,185,47,86,237,122,201,157,+45,99,80,233,116,15,246,167,168,56,199,177,133,202,33,34,90,217,162,145,+219,92,253,147,14,95,234,216,176,210,39,230,49,45,165,159,65,94,172,142,+98,215,16,117,117,212,112,129,81,116,225,89,159,116,42,41,222,187,212,111,+201,167,95,30,212,105,56,117,32,121,220,75,153,149,211,59,54,244,252,236,+187,53,4,107,6,93,53,196,237,234,122,69,168,118,224,207,227,232,235,98,+42,186,255,83,75,89,59,138,150,201,26,215,206,112,88,209,176,176,165,126,+120,240,193,115,217,36,38,198,59,34,221,153,33,163,55,23,21,30,192,174,+189,195,246,25,88,61,142,47,33,214,240,246,97,26,192,130,91,183,235,60,+251,169,77,86,152,66,87,186,227,111,224,193,63,255,94,207,132,28,0,31,+173,215,131,163,63,50,135,56,103,164,76,12,154,61,211,253,217,134,9,81,+49,69,165,186,124,177,14,169,245,135,226,106,95,179,169,220,165,240,183,9,+99,181,203,132,84,100,203,1,232,84,81,187,168,39,141,217,115,106,109,39,+42,195,136,163,218,241,99,129,190,139,219,191,111,170,74,229,239,198,243,139,+116,49,11,210,19,252,0,235,20,161,54,80,172,42,105,68,131,213,127,207,+250,255,77,36,218,153,119,191,88,104,99,109,161,182,58,18,76,92,26,155,+87,126,12,238,63,99,245,221,73,39,47,25,42,59,244,200,83,245,140,23,+93,96,177,185,9,103,80,1,150,96,99,72,118,143,78,230,227,139,1,172,+147,83,7,66,205,3,158,115,114,110,193,29,70,72,225,77,125,144,248,83,+87,211,21,87,31,57,26,62,114,211,111,16,61,233,174,5,249,226,205,24,+133,136,18,134,10,175,111,114,51,249,104,160,190,149,246,187,84,228,120,93,+1,219,182,221,84,225,0,184,218,2,14,138,136,24,120,110,159,131,9,192,+17,2,204,174,211,180,161,233,138,90,135,221,117,121,80,217,31,29,242,205,+102,244,69,117,237,196,162,55,39,14,141,10,157,37,162,185,119,167,203,197,+72,109,123,204,180,38,145,32,250,254,233,31,18,124,218,23,150,55,241,238,+112,117,145,15,207,87,94,196,103,195,237,188,119,137,68,120,23,221,161,183,+127,197,137,83,142,125,9,130,92,228,245,215,146,155,37,62,211,89,52,105,+131,241,128,27,65,244,190,115,174,130,194,213,21,215,141,229,181,92,152,41,+246,178,19,51,54,4,12,211,236,98,119,240,103,120,129,231,16,155,70,78,+145,241,15,210,113,118,179,184,132,42,208,100,213,174,97,255,14,34,33,43,+38,224,159,178,33,222,10,4,227,240,145,176,246,70,170,134,138,162,143,78,+51,122,165,75,35,144,35,168,37,152,28,48,245,246,254,180,227,233,39,125,+111,240,236,191,206,178,208,239,71,215,152,170,71,245,109,88,131,72,186,226,+205,190,125,50,142,159,191,169,143,151,75,99,57,157,62,89,131,34,96,166,+254,95,43,79,57,91,28,248,125,52,91,73,228,180,206,126,68,5,167,160,+121,170,95,127,190,3,29,112,155,8,104,25,122,36,122,201,174,193,153,119,+23,50,201,201,21,209,58,80,98,154,88,92,111,131,79,175,120,30,196,212,+85,107,42,195,234,125,236,225,223,252,201,209,48,228,142,159,249,147,251,5,+120,45,180,110,16,33,103,79,161,58,148,229,104,26,157,53,94,19,210,243,+83,236,172,93,155,177,178,103,169,146,25,128,105,173,29,59,52,183,167,235,+200,219,153,2,192,191,139,182,91,179,37,216,166,6,166,8,106,74,68,121,+105,222,179,99,147,95,72,14,66,142,123,154,142,15,27,33,153,142,58,137,+21,108,134,103,7,74,218,247,94,159,63,140,63,80,70,34,152,246,176,137,+239,46,154,57,208,30,14,247,82,82,118,175,203,207,41,54,21,122,45,126,+152,148,129,1,189,75,205,43,21,51,141,213,33,103,248,66,241,51,43,65,+231,80,154,78,28,191,146,192,144,94,113,109,157,232,239,1,218,51,124,140,+40,26,46,170,180,139,166,105,0,25,112,239,212,10,205,12,103,37,102,172,+152,93,113,49,170,53,128,34,56,137,182,57,64,27,14,136,25,205,46,230,+139,88,184,32,99,48,212,86,191,120,182,58,151,140,112,67,246,77,40,191,+46,109,103,209,8,14,135,89,85,211,16,90,10,193,234,166,184,153,237,43,+115,17,18,114,107,56,87,85,122,37,186,197,91,103,185,28,136,197,162,232,+55,241,225,121,207,206,181,164,164,198,89,197,133,156,231,230,48,202,226,92,+128,18,147,250,35,238,174,83,28,210,241,85,203,131,162,20,120,91,99,107,+146,212,197,201,217,137,5,30,184,61,74,128,50,150,75,203,141,169,132,234,+100,148,144,61,127,19,163,187,135,124,200,100,220,27,192,70,17,254,79,76,+115,176,115,247,22,122,81,106,73,245,123,10,16,28,36,247,9,98,63,128,+140,65,39,148,26,173,13,64,212,158,39,187,14,49,180,7,93,182,128,54,+35,11,84,79,9,227,106,177,80,135,97,88,43,162,242,224,213,179,201,171,+181,25,230,219,135,179,143,253,85,127,137,64,2,77,114,74,243,77,154,10,+180,5,132,92,104,205,35,216,4,80,216,78,89,120,220,54,208,179,202,117,+111,107,250,145,84,207,119,165,219,86,39,237,122,244,118,65,35,63,1,100,+219,85,71,7,45,64,97,222,209,239,189,63,231,206,26,187,13,118,23,147,+177,71,225,125,133,127,72,158,253,202,154,153,25,46,42,29,246,184,69,182,+40,226,58,82,7,61,78,97,189,20,167,130,61,236,191,122,135,50,57,57,+133,130,156,155,102,200,36,20,41,188,253,117,11,86,132,252,200,83,85,248,+111,81,250,224,156,210,232,27,31,83,149,137,185,211,81,219,49,32,205,163,+166,242,240,178,76,159,99,37,135,169,151,98,66,73,116,24,127,223,99,27,+178,230,23,207,203,16,69,86,32,148,136,4,66,134,59,88,145,42,166,20,+5,122,41,2,214,213,129,70,237,198,48,73,144,172,18,13,139,43,213,155,+23,88,92,18,8,94,93,137,104,80,118,235,156,200,80,206,86,183,149,108,+60,43,36,83,58,199,41,120,151,30,73,89,184,151,157,163,157,171,203,42,+182,41,220,165,153,106,151,97,240,183,215,219,68,107,139,47,235,54,130,211,+51,255,195,142,233,60,186,241,71,36,160,243,26,196,128,84,124,32,146,19,+62,30,26,53,214,133,208,102,62,119,49,72,202,210,121,204,225,111,20,243,+217,29,5,37,207,234,184,114,74,170,182,54,113,221,168,254,238,177,159,31,+17,254,170,77,130,229,198,235,58,230,6,241,230,92,218,151,89,102,29,229,+84,141,201,15,91,33,116,18,56,166,158,253,206,223,201,74,155,63,208,230,+120,195,161,82,134,54,250,38,45,123,55,255,130,145,112,42,129,152,203,252,+255,216,33,90,138,102,0,108,137,254,122,92,168,243,39,162,236,15,235,9,+18,136,252,14,223,153,202,231,49,157,87,198,142,175,132,192,57,27,128,32,+214,38,49,244,10,56,194,65,83,224,111,32,232,244,70,40,84,172,71,23,+212,67,165,12,198,189,251,114,189,75,166,186,88,64,211,179,212,127,168,179,+154,103,187,69,200,160,37,116,17,203,101,242,56,128,250,139,168,168,193,246,+193,11,94,193,170,41,133,203,60,229,214,176,93,50,207,26,240,133,219,143,+98,159,1,169,48,34,85,97,88,47,28,104,157,204,96,75,117,153,54,215,+197,37,31,32,196,213,2,138,137,183,34,4,22,103,224,220,168,231,52,185,+159,111,184,46,82,8,202,2,212,155,43,255,153,5,230,157,28,241,10,90,+144,219,76,62,194,14,161,105,186,123,113,203,171,1,46,198,147,217,108,255,+239,70,231,20,250,150,143,147,118,67,124,20,204,124,51,129,242,172,55,225,+10,169,59,244,180,255,177,115,63,66,118,228,16,217,153,231,217,191,171,184,+109,104,229,240,200,31,135,0,159,206,235,151,118,0,62,27,69,130,155,206,+238,170,213,127,163,65,34,213,155,239,110,0,186,29,136,178,166,114,24,60,+115,145,222,13,1,142,124,165,144,85,35,137,122,25,69,65,116,13,148,86,+169,9,12,237,161,78,67,253,38,216,57,131,120,194,89,221,105,91,36,38,+216,7,222,66,104,180,239,253,172,145,194,89,28,105,191,148,115,75,50,154,+90,130,99,185,68,215,128,150,133,93,89,240,26,12,231,254,30,175,36,96,+214,110,116,0,223,31,87,145,201,40,156,176,246,175,1,25,51,206,164,48,+209,224,5,207,53,75,226,105,138,232,217,102,58,146,112,224,231,211,31,112,+130,202,132,227,16,230,208,164,155,154,201,143,134,78,50,64,232,103,205,6,+124,9,56,18,22,27,129,241,116,42,65,103,222,30,173,181,118,186,107,128,+134,95,194,192,180,144,61,136,196,54,199,198,35,19,7,164,246,160,180,215,+60,8,215,147,127,57,90,102,238,78,248,164,212,233,69,113,14,227,197,139,+179,220,19,1,99,35,146,67,84,11,146,226,19,109,151,73,143,105,66,95,+242,24,51,37,173,129,59,176,190,102,227,115,186,139,80,14,52,203,44,152,+5,92,194,185,152,247,230,183,229,58,54,222,68,204,212,112,48,82,157,37,+208,220,174,255,34,151,103,212,158,212,126,150,69,89,134,190,86,23,136,106,+0,84,217,151,194,229,17,13,241,189,208,201,111,230,77,139,111,17,218,18,+164,162,78,141,106,238,146,80,199,160,49,171,230,161,92,59,254,246,98,54,+69,49,122,18,139,30,63,75,213,187,193,5,230,160,241,53,80,207,149,51,+42,170,134,255,65,198,215,50,120,128,143,5,40,8,98,120,206,184,17,170,+81,63,220,59,125,174,7,14,115,165,160,11,182,75,123,64,15,154,132,9,+148,177,53,143,152,254,17,246,32,102,236,237,223,245,48,157,90,234,181,77,+177,25,173,36,188,75,115,251,212,15,255,11,23,168,148,34,89,87,8,127,+149,174,67,138,14,220,40,189,189,93,73,28,29,213,194,191,125,103,83,19,+84,242,248,31,119,18,47,135,73,41,203,182,223,191,71,19,7,226,46,148,+251,246,251,72,200,188,30,172,210,24,152,210,252,191,147,194,41,155,213,90,+212,40,254,220,247,195,228,70,147,158,31,24,52,55,65,251,166,183,203,81,+102,222,155,66,49,209,18,68,133,166,201,249,5,222,223,69,116,2,192,91,+35,183,87,4,22,22,107,68,109,177,35,10,36,81,185,113,220,248,167,108,+232,250,246,52,200,17,111,52,223,202,115,147,82,176,182,207,135,124,129,172,+57,74,19,155,29,179,33,233,134,137,221,113,69,237,203,242,175,240,243,165,+189,15,85,253,227,142,68,39,10,143,32,205,23,255,28,181,197,103,234,243,+107,30,186,26,19,185,255,70,116,22,108,32,114,135,64,12,218,191,191,58,+163,125,41,194,165,98,135,39,224,92,198,161,199,146,125,201,80,107,227,208,+76,217,60,168,67,56,99,113,245,64,224,240,225,161,178,44,114,123,106,255,+41,246,149,22,79,220,94,134,62,190,19,37,136,63,252,24,169,231,165,155,+139,1,159,252,51,71,21,101,232,192,98,105,197,9,222,60,181,67,75,223,+199,23,126,214,194,179,86,83,0,0,179,164,226,42,74,212,72,164,247,147,+29,38,204,118,119,214,8,155,72,111,6,149,109,254,133,51,53,52,108,180,+126,24,205,45,213,81,28,109,34,196,125,83,78,117,230,110,242,187,94,200,+177,51,163,3,255,116,137,193,241,238,124,236,172,119,188,236,36,8,5,85,+17,32,156,66,99,8,250,109,170,14,64,162,113,254,33,252,166,13,247,137,+251,241,248,50,172,177,118,5,112,108,29,24,111,227,42,126,3,42,245,206,+116,55,3,81,2,96,134,234,31,204,2,84,64,253,201,76,139,30,98,45,+77,31,52,228,89,61,108,79,196,22,205,156,49,162,193,9,63,253,68,224,+6,216,103,16,34,144,236,100,85,124,129,221,189,234,31,118,172,157,71,23,+36,132,127,92,16,206,167,158,2,137,139,94,113,143,120,100,132,163,163,24,+20,226,195,176,79,194,175,219,169,154,131,248,241,179,220,33,239,90,20,196,+96,104,198,15,155,109,0,92,35,149,244,132,55,96,124,246,199,252,242,194,+102,202,195,53,122,29,110,37,73,170,30,60,230,125,175,214,28,254,158,217,+84,3,127,200,12,62,5,190,165,147,121,8,109,178,149,160,167,157,210,30,+125,181,241,53,69,53,162,119,173,244,87,121,227,183,49,59,249,77,18,255,+194,213,134,17,59,110,70,234,28,48,187,122,19,200,34,60,195,39,7,230,+26,251,114,28,34,29,62,184,110,158,43,36,232,42,35,213,203,202,202,83,+57,201,229,233,211,80,238,122,236,182,88,42,41,112,53,252,9,198,168,91,+228,95,157,121,155,3,13,116,126,140,69,237,1,119,28,116,149,103,236,41,+76,21,255,172,10,34,228,126,84,193,17,242,61,119,120,114,203,152,27,38,+185,56,29,103,211,244,232,133,225,72,52,138,205,200,37,139,210,155,78,151,+140,181,84,202,89,144,102,159,28,185,252,212,77,33,103,16,84,137,36,39,+86,76,12,133,23,182,73,148,154,47,246,160,85,76,135,22,33,87,86,110,+181,136,241,68,3,15,52,117,230,1,182,41,46,46,144,175,1,223,192,124,+132,63,46,32,149,179,223,92,229,169,173,210,45,156,236,179,87,112,224,122,+89,59,172,174,224,43,179,200,223,33,230,107,23,142,137,80,187,167,137,56,+1,247,247,102,138,30,40,60,25,169,141,56,123,203,73,51,179,157,164,109,+145,16,77,245,95,222,178,39,102,174,42,131,249,129,243,69,124,220,100,170,+251,253,224,86,183,109,45,194,57,51,63,140,94,85,106,90,218,129,215,204,+111,64,176,18,240,21,22,96,30,252,249,130,161,9,252,48,51,133,205,177,+194,107,198,102,118,230,87,189,165,108,136,101,196,138,60,228,130,188,207,122,+58,244,192,195,226,18,26,152,116,215,173,105,45,88,127,101,51,53,223,110,+121,217,255,145,141,91,177,43,3,185,104,202,177,7,182,144,47,124,27,88,+91,57,207,3,245,243,62,120,4,206,76,191,48,32,24,134,88,251,17,198,+167,81,102,171,9,75,164,238,114,43,189,225,133,12,161,45,206,101,249,67,+2,118,184,54,125,151,46,211,241,178,180,174,41,215,249,222,93,184,2,0,+114,138,232,173,110,149,36,34,243,150,147,91,167,185,122,142,119,244,193,12,+45,8,0,223,21,124,128,209,200,47,199,172,130,238,235,71,45,220,196,125,+195,241,142,153,249,102,101,46,12,143,234,54,17,108,30,196,139,86,161,125,+162,124,27,66,35,10,45,50,211,80,177,113,22,110,163,88,146,10,67,115,+24,198,4,162,233,16,80,104,97,132,174,99,11,3,52,157,64,214,33,97,+194,52,53,136,38,38,197,22,206,209,128,181,164,101,153,164,42,131,203,163,+165,217,252,16,236,11,252,176,52,188,77,137,154,148,171,145,66,38,154,135,+16,36,24,33,231,84,95,225,255,132,62,239,140,172,1,94,154,233,72,94,+252,208,44,86,123,17,189,82,25,130,176,223,253,128,134,50,160,191,200,47,+160,253,239,12,52,55,45,57,234,143,107,35,47,176,74,47,99,242,250,170,+61,221,189,215,68,76,89,45,66,41,202,175,141,94,66,129,147,4,233,147,+138,58,90,28,223,231,51,193,33,143,96,74,194,80,173,16,225,220,142,175,+97,196,127,33,4,13,107,192,185,9,252,77,167,33,12,129,41,69,66,229,+146,2,83,115,138,216,223,22,76,112,184,120,33,57,16,250,152,13,195,22,+32,109,152,187,164,5,107,79,167,75,245,127,120,241,74,151,211,9,230,183,+225,188,7,79,45,88,46,48,164,215,26,165,152,131,10,157,105,1,117,58,+69,120,200,100,132,231,247,216,185,83,6,8,194,245,84,194,144,129,78,119,+65,106,49,57,188,160,195,112,3,97,43,251,67,33,151,69,8,127,43,218,+76,44,105,55,11,204,4,98,196,124,59,12,141,187,97,31,115,22,237,6,+46,154,162,155,76,89,13,133,207,142,80,218,216,210,238,223,196,112,115,208,+20,168,107,221,143,41,189,151,160,47,121,232,19,69,189,201,151,13,213,20,+102,103,237,230,19,68,23,108,204,193,1,42,232,205,1,187,10,50,37,52,+135,153,239,198,206,246,162,86,248,191,49,162,92,227,168,11,199,242,81,243,+106,1,223,143,147,135,194,86,245,214,213,252,132,22,24,10,157,29,121,27,+213,253,104,82,196,220,252,73,39,33,91,231,208,181,56,212,61,203,48,116,+121,29,233,8,9,212,2,59,89,83,172,88,75,117,104,19,126,101,243,11,+15,202,106,143,18,129,237,49,179,23,139,222,251,66,225,16,223,187,228,2,+251,167,86,5,34,213,201,131,6,163,171,218,153,248,246,8,43,205,56,102,+44,85,60,244,236,141,104,174,183,255,20,221,60,59,51,85,42,133,52,23,+158,18,4,161,9,255,67,19,129,240,147,56,1,82,198,233,103,99,110,164,+123,244,156,92,20,183,68,241,153,105,117,232,229,116,203,89,175,98,53,1,+154,118,58,18,70,84,10,0,37,185,75,187,244,76,0,238,249,129,29,253,+154,104,169,60,9,162,65,80,175,34,230,158,11,44,203,247,186,133,218,77,+57,45,173,34,3,13,75,108,147,53,116,30,218,205,25,206,186,33,4,150,+78,108,155,88,197,199,98,152,242,19,210,95,233,90,74,74,181,201,23,83,+100,51,145,202,206,237,134,72,118,222,233,85,205,255,152,219,116,186,91,72,+235,176,157,170,172,85,104,150,5,94,181,31,244,246,76,115,56,180,3,3,+240,229,90,185,211,197,156,142,13,77,251,168,220,210,223,130,221,188,66,2,+207,2,185,20,201,2,106,202,228,135,70,185,30,217,90,134,198,47,58,103,+72,252,176,74,206,142,147,47,209,51,99,182,204,46,229,52,97,171,210,17,+135,224,86,55,3,254,22,117,151,214,210,52,162,168,78,20,60,12,69,243,+230,43,98,104,89,106,104,230,124,134,66,253,152,94,241,66,216,151,218,136,+79,116,198,79,37,172,102,225,22,224,12,15,219,11,111,246,233,23,120,43,+183,180,171,140,50,156,86,5,159,163,36,91,237,66,6,157,176,45,220,250,+50,220,66,96,89,253,45,13,216,208,102,250,41,197,249,232,41,60,47,18,+161,177,120,31,76,42,48,174,98,136,107,100,75,160,107,202,21,223,35,48,+183,192,75,103,226,92,52,126,123,89,77,159,181,99,90,155,86,235,31,117,+216,86,157,94,15,192,246,157,213,194,37,49,197,146,255,216,92,192,169,173,+13,86,130,174,164,71,250,10,69,118,232,142,108,53,86,167,100,87,69,95,+61,251,104,114,206,216,248,250,167,62,77,62,133,212,135,214,127,151,214,230,+132,69,153,255,185,119,82,132,49,135,154,151,88,35,167,230,11,59,193,152,+96,224,190,251,159,115,160,102,183,171,50,200,85,119,252,55,211,82,143,174,+52,8,4,246,90,32,30,47,57,91,242,251,187,145,181,247,171,20,186,169,+154,70,40,240,45,70,233,110,175,76,14,7,95,219,65,145,123,2,214,39,+125,127,24,195,1,38,56,160,135,143,182,243,174,202,29,48,212,227,90,92,+245,26,88,5,166,184,142,142,148,245,171,45,189,177,212,140,81,60,185,60,+95,0,99,38,243,6,42,140,28,249,31,48,26,135,202,209,184,234,224,79,+12,193,138,252,191,156,19,220,101,76,163,184,86,56,93,188,133,199,77,203,+60,82,55,94,80,6,245,247,26,26,255,136,230,246,82,237,98,211,56,151,+144,162,93,171,228,227,62,235,102,169,109,210,69,124,134,171,187,17,93,111,+8,190,112,110,234,242,202,45,47,159,203,78,92,223,37,158,253,84,232,106,+106,46,38,83,242,30,47,155,104,141,187,171,221,36,208,132,20,18,197,53,+254,22,72,132,24,116,162,191,144,55,217,180,246,129,143,64,131,91,140,135,+56,215,94,63,144,153,197,26,217,83,39,94,142,68,168,66,164,223,80,109,+224,215,180,46,174,171,83,92,38,204,196,199,182,98,37,251,226,241,70,121,+100,86,173,122,200,12,196,30,110,149,92,8,235,37,145,182,55,95,69,24,+168,79,238,36,9,33,95,119,234,68,110,104,187,239,114,64,0,150,98,198,+33,47,228,49,106,117,167,31,8,140,113,9,252,85,190,112,56,186,105,222,+219,123,112,252,235,223,203,146,215,150,215,38,149,242,201,222,158,60,200,251,+252,93,27,197,49,127,53,131,64,43,87,52,132,169,141,243,131,138,135,16,+3,6,40,168,247,208,214,134,102,35,23,94,41,86,71,35,192,72,0,193,+135,68,59,105,116,171,11,241,164,40,100,181,92,16,197,188,9,101,201,20,+11,21,209,7,9,139,139,1,123,170,42,51,0,172,67,211,233,130,150,78,+213,94,113,33,238,202,231,230,213,218,93,236,177,111,220,13,206,46,40,175,+193,144,52,109,90,32,22,124,20,172,95,123,224,254,178,141,57,138,71,156,+6,87,130,175,135,27,44,74,49,116,181,74,73,151,194,247,17,201,180,69,+202,188,77,208,254,169,73,127,79,158,191,188,153,104,50,105,170,211,225,180,+150,125,140,52,139,242,155,203,63,232,87,155,247,199,11,18,197,211,38,211,+226,242,224,114,67,252,35,126,189,238,17,122,23,234,98,250,9,39,115,107,+138,249,247,223,153,67,179,168,158,85,158,56,232,124,155,238,127,126,62,39,+70,172,37,236,208,93,240,166,34,140,12,78,4,163,19,231,191,247,226,71,+43,34,106,1,197,179,34,138,16,157,252,186,92,139,13,243,8,78,43,181,+76,183,163,108,171,172,69,186,189,143,99,185,101,139,112,35,52,197,197,81,+195,102,133,172,58,142,85,184,227,84,93,8,38,250,101,218,51,2,216,117,+171,57,205,49,228,75,56,4,202,242,120,97,68,7,236,10,198,205,252,2,+237,18,7,123,91,11,90,66,235,123,96,241,226,166,128,103,86,113,95,10,+82,252,95,244,176,75,213,47,123,184,8,64,138,241,24,16,180,171,15,13,+20,113,212,232,202,183,183,3,170,128,91,55,69,250,237,47,143,240,76,146,+110,6,90,107,230,109,88,22,220,166,241,222,242,255,232,62,122,225,224,159,+100,79,41,2,247,189,208,224,177,187,99,214,176,235,186,13,101,81,122,23,+32,119,217,7,39,82,131,40,242,54,41,202,11,245,25,50,217,159,48,178,+96,246,140,74,61,132,252,192,128,19,215,201,32,242,82,33,213,252,22,251,+39,157,203,32,22,177,91,232,222,238,46,173,127,169,68,186,238,47,225,228,+158,191,244,161,178,9,196,98,178,35,207,202,136,137,65,152,247,209,239,25,+41,57,220,78,84,146,56,89,19,132,224,14,141,128,174,51,166,78,229,185,+83,203,149,96,95,75,60,150,245,79,81,120,226,166,254,92,41,112,193,195,+35,250,157,13,251,40,60,119,80,177,105,44,231,114,21,42,206,54,229,170,+140,29,101,89,71,219,4,20,63,122,63,240,147,108,217,198,25,168,21,157,+121,211,163,96,237,57,163,23,111,18,158,239,214,250,184,217,219,9,207,161,+151,152,122,38,189,28,104,129,188,111,190,255,221,22,157,196,39,183,185,75,+148,51,1,245,86,13,4,179,131,80,219,254,238,78,27,210,81,235,149,210,+65,121,225,134,218,236,91,181,72,5,212,217,17,117,214,116,71,36,117,173,+0,83,120,187,99,227,172,56,249,22,22,106,77,218,119,219,232,217,32,153,+49,173,235,219,39,31,122,191,130,87,208,76,74,127,115,186,200,152,18,120,+59,43,10,213,50,195,81,150,204,133,198,21,190,175,176,23,102,165,147,190,+151,210,176,158,158,153,103,1,220,87,71,75,224,102,218,2,57,79,119,207,+0,173,77,180,197,186,58,67,17,176,113,154,115,33,53,140,116,191,232,132,+177,110,245,96,74,216,60,184,120,252,3,231,85,40,152,79,234,251,33,14,+93,73,197,51,23,248,4,71,208,153,135,187,162,83,162,27,39,230,207,63,+5,205,81,244,232,50,40,74,206,215,132,139,245,114,212,20,88,21,233,134,+191,124,0,122,25,208,146,13,147,125,11,107,188,240,247,163,210,155,124,249,+252,39,240,156,27,251,81,135,219,252,32,220,223,207,223,156,204,195,118,212,+108,205,242,192,193,71,220,156,170,172,85,48,41,208,14,24,181,77,137,168,+54,32,170,18,9,2,233,139,35,163,130,180,24,151,79,114,184,160,87,63,+193,208,113,58,10,122,196,202,110,184,202,202,40,41,92,176,153,83,45,161,+215,230,185,76,228,104,15,162,104,206,253,143,79,144,215,128,114,33,196,32,+46,244,147,244,247,116,239,76,208,203,254,139,210,85,57,226,0,132,43,34,+142,253,242,132,236,143,49,130,68,198,60,174,50,219,168,230,44,238,188,82,+94,3,127,30,83,253,197,219,88,240,72,109,234,169,51,17,246,177,31,99,+54,248,160,189,127,226,142,138,160,205,2,120,186,203,112,75,115,33,171,76,+6,144,198,108,87,244,36,185,177,54,22,144,233,208,231,193,27,133,66,195,+184,94,178,206,227,126,87,157,34,141,87,171,25,53,17,196,160,54,54,125,+192,194,170,136,6,172,237,47,178,78,0,229,107,11,63,105,227,39,21,33,+168,130,11,86,123,213,231,87,226,44,3,9,62,10,245,184,127,217,28,17,+242,27,95,22,33,141,69,231,10,233,58,4,13,40,81,176,167,43,216,95,+123,6,97,222,177,175,119,128,59,42,76,188,177,222,20,116,201,9,41,56,+199,68,6,117,84,87,83,26,79,146,100,190,57,200,218,212,77,27,235,93,+48,8,70,59,23,213,30,205,64,47,219,152,106,100,102,227,115,156,143,153,+95,75,151,96,25,126,237,198,66,88,78,113,151,242,89,91,171,77,93,215,+110,100,197,244,186,90,178,146,60,245,15,10,104,244,22,157,198,6,159,75,+125,22,13,247,248,248,66,51,32,211,85,84,0,232,36,14,28,130,172,106,+234,3,134,127,0,14,40,211,142,155,179,234,241,192,203,20,50,30,174,30,+128,8,120,26,169,63,208,2,104,202,186,39,109,94,162,90,23,206,18,247,+172,63,17,192,203,213,194,131,124,87,210,244,231,77,78,113,112,99,226,200,+152,82,162,145,188,95,23,208,41,18,194,65,172,238,8,7,224,224,137,154,+93,21,198,238,171,166,4,30,224,254,43,205,197,175,205,124,146,37,154,17,+116,38,185,150,18,184,58,176,212,129,150,164,23,11,215,78,98,48,238,114,+173,60,187,78,177,183,60,163,157,201,20,208,39,161,135,16,119,192,88,74,+19,82,125,103,176,71,125,73,227,26,132,83,167,60,51,143,46,153,249,29,+238,223,38,82,247,225,136,35,116,20,219,208,134,49,231,45,81,210,219,252,+175,22,168,119,136,157,177,48,99,253,65,187,227,232,52,4,86,166,201,53,+54,171,55,251,19,36,92,124,105,212,47,246,68,204,28,92,216,173,81,80,+100,228,239,163,120,199,154,90,207,162,113,203,169,152,4,126,100,151,151,169,+215,223,8,81,188,103,93,100,69,208,25,212,59,61,41,146,227,112,33,39,+118,142,66,221,112,49,173,97,168,137,118,168,82,87,199,110,246,238,193,68,+61,178,63,165,81,71,142,0,250,50,176,120,140,39,78,192,233,110,218,34,+232,64,80,74,131,240,44,240,106,77,183,200,225,3,98,31,27,42,75,1,+120,207,25,70,25,171,72,164,67,143,69,18,51,12,144,128,22,123,18,92,+168,50,169,67,229,214,117,61,244,116,246,151,143,45,49,84,128,12,101,237,+117,153,23,253,55,9,201,228,118,50,78,198,115,222,138,59,222,129,240,218,+116,82,223,33,245,224,46,9,235,20,204,149,125,14,62,173,34,2,56,183,+183,243,45,132,15,50,188,194,88,59,186,138,166,192,11,144,209,141,46,20,+225,79,249,169,106,61,251,31,217,114,115,83,26,225,249,212,175,239,168,79,+146,30,111,122,178,200,144,207,103,55,38,40,183,206,176,22,53,204,251,33,+159,156,5,160,124,211,79,199,28,170,24,30,220,1,116,196,188,160,164,24,+195,161,35,238,214,11,184,35,150,175,104,199,215,156,170,103,222,111,77,126,+253,21,117,41,175,173,250,103,56,8,76,150,57,139,62,101,234,139,229,112,+37,137,123,97,148,179,77,175,97,191,205,149,51,108,214,84,89,57,101,171,+253,87,180,168,198,220,220,62,121,253,74,191,0,10,131,122,96,99,3,1,+99,188,124,17,151,44,0,133,81,198,53,244,165,194,250,226,73,59,70,82,+117,11,244,126,208,17,195,42,229,233,58,161,191,41,252,41,124,70,3,163,+151,42,235,0,90,11,11,140,199,144,162,229,169,204,39,31,190,57,86,39,+146,145,201,99,103,62,141,3,32,12,177,62,86,244,120,123,222,143,82,40,+174,250,15,58,214,141,87,49,178,183,206,165,10,73,109,240,7,156,244,31,+171,181,174,91,14,55,200,8,138,6,50,90,169,236,218,58,62,215,18,105,+232,207,242,104,14,105,228,25,194,66,183,249,116,227,218,215,58,67,80,191,+247,213,2,80,138,5,103,22,252,168,6,237,226,215,187,190,221,152,103,106,+51,155,19,95,124,241,199,251,20,75,191,111,48,42,128,152,7,46,151,121,+8,111,51,17,22,27,157,206,179,110,227,248,157,27,176,8,254,9,241,120,+202,39,108,248,217,73,199,82,13,65,1,90,166,243,104,48,126,79,193,80,+171,105,215,167,199,255,40,250,230,173,38,88,92,12,211,113,117,70,159,65,+28,200,116,17,219,236,193,44,112,247,127,193,4,139,119,32,114,73,133,127,+61,141,115,230,180,120,98,89,171,0,150,251,76,50,204,129,148,148,165,188,+70,32,163,230,38,0,99,172,167,23,183,187,177,41,164,144,56,200,25,106,+25,41,144,31,55,95,106,0,197,131,232,184,150,116,236,39,83,248,208,190,+253,245,212,133,33,84,35,6,218,209,56,32,174,50,250,147,178,125,246,9,+47,157,104,236,116,67,32,251,205,117,234,125,228,142,72,87,200,179,3,127,+55,210,216,110,233,135,205,128,170,48,105,188,46,172,88,77,12,147,158,139,+80,246,131,254,229,125,112,99,208,39,221,120,146,117,128,94,24,3,152,162,+152,206,105,10,216,29,175,219,73,230,122,164,47,182,156,84,21,48,167,46,+252,32,111,147,15,121,161,128,255,145,28,173,229,215,67,17,203,38,222,19,+36,214,156,150,68,66,46,237,81,216,201,101,224,121,48,199,182,146,21,221,+56,158,33,167,120,176,57,95,152,158,55,240,1,234,45,94,73,50,155,43,+108,51,16,39,232,123,104,176,107,112,213,179,74,202,253,235,59,189,61,185,+193,174,72,253,8,203,116,68,29,180,186,240,56,104,102,151,90,255,190,65,+46,56,224,207,183,199,44,128,69,1,29,18,83,128,132,249,136,122,121,61,+176,113,114,132,238,100,252,155,240,72,104,4,231,252,229,5,192,9,88,86,+35,214,163,245,109,151,42,135,138,219,60,130,15,244,24,21,24,204,92,0,+88,40,254,46,22,95,230,187,255,4,112,156,173,248,103,63,112,101,129,82,+86,32,50,202,61,170,98,239,239,126,35,205,31,207,77,149,228,54,39,170,+232,167,54,227,1,218,149,253,77,82,190,186,159,181,234,60,177,148,67,62,+191,147,54,37,209,54,37,6,191,0,206,47,10,218,101,61,217,95,173,66,+93,233,42,60,50,227,47,199,157,81,161,249,174,105,224,247,192,189,139,254,+97,76,78,250,48,40,101,208,158,158,159,11,124,212,243,243,204,171,130,12,+112,171,79,13,124,253,27,165,204,120,28,130,126,117,246,53,8,95,146,76,+171,167,195,167,233,73,194,172,178,32,227,61,68,70,122,223,214,22,59,186,+61,4,106,95,189,186,103,197,60,154,112,236,101,17,27,125,234,186,106,167,+102,182,14,34,176,130,78,93,88,145,95,228,235,247,255,78,146,4,136,157,+221,144,165,153,250,80,247,178,6,124,16,206,168,173,182,42,168,229,68,92,+162,240,178,67,241,15,63,105,138,68,3,241,139,117,56,33,130,175,53,93,+184,188,180,185,101,114,161,190,67,10,214,55,209,226,102,82,225,5,230,60,+80,175,203,93,101,107,56,21,130,119,215,179,87,183,149,65,70,176,26,102,+65,83,21,166,13,212,47,177,11,93,172,48,215,69,55,158,170,248,33,154,+199,14,74,197,225,16,49,31,149,214,67,204,128,235,90,243,108,246,212,17,+50,176,127,63,41,11,44,227,26,97,102,195,74,15,241,187,102,97,153,156,+49,3,29,56,163,6,243,233,236,173,59,61,103,109,25,71,151,236,186,35,+76,233,49,96,132,76,247,187,195,87,133,103,78,238,201,105,9,61,254,225,+136,180,200,239,68,137,91,108,148,48,161,105,27,214,247,94,20,140,221,86,+253,151,150,154,77,44,28,48,202,206,147,153,205,84,215,105,190,162,169,172,+38,11,231,192,162,171,71,88,124,204,95,122,219,85,241,182,15,114,102,100,+29,174,80,26,221,87,228,83,92,170,247,201,178,224,132,32,210,187,249,119,+64,152,208,49,181,243,175,136,159,180,104,87,167,118,53,2,34,211,192,140,+166,14,4,158,227,13,219,194,33,132,10,72,107,98,224,39,189,116,77,197,+117,75,213,10,6,250,206,64,47,54,212,80,103,110,249,0,251,42,244,241,+104,41,99,49,6,94,106,96,57,144,114,125,210,64,133,204,138,100,33,4,+135,148,27,21,231,101,165,19,109,215,34,129,78,248,165,34,167,140,106,75,+15,234,65,91,154,42,148,15,165,10,191,244,133,132,228,183,145,5,215,10,+3,251,140,58,132,139,65,156,159,51,171,121,176,190,83,208,229,73,156,251,+207,154,113,226,111,187,85,86,146,154,246,238,109,249,194,128,47,119,61,85,+214,207,225,63,93,148,70,198,176,49,148,170,90,214,129,219,34,124,199,231,+94,171,212,47,21,3,162,43,151,144,42,193,105,143,198,141,217,63,219,191,+14,209,54,167,48,144,97,64,138,81,250,2,99,52,36,129,103,75,15,16,+117,126,15,38,168,135,79,209,89,50,247,216,71,233,207,5,242,153,53,30,+93,167,238,110,47,35,248,9,1,159,75,14,98,181,178,21,134,71,54,171,+65,35,60,106,174,205,18,113,215,49,46,51,124,104,25,13,17,31,244,13,+167,19,123,153,19,176,161,1,238,17,134,217,166,155,64,216,14,54,119,21,+105,253,231,248,123,26,250,12,59,32,97,141,213,101,77,128,110,107,214,150,+73,58,171,89,74,187,154,36,34,81,73,233,70,255,154,156,208,102,221,100,+151,23,101,141,71,35,45,65,79,58,216,127,222,155,181,248,11,100,126,225,+147,42,89,243,52,122,16,59,86,218,154,1,230,250,117,116,89,160,23,85,+240,78,96,136,52,48,122,15,59,26,20,252,56,17,85,234,199,94,209,80,+139,215,18,121,56,75,158,45,236,13,96,124,247,69,214,175,49,245,78,88,+185,79,142,199,247,95,127,15,181,100,183,65,211,41,72,61,141,213,18,254,+176,212,211,71,77,214,72,193,8,207,170,228,185,140,192,62,197,129,82,80,+75,169,103,186,153,82,79,221,219,84,198,184,150,224,79,116,65,115,84,12,+67,95,55,221,109,153,94,233,231,21,252,156,178,47,237,149,209,213,203,13,+70,87,237,10,33,99,61,200,148,44,198,212,42,208,209,190,175,114,169,117,+62,27,49,221,138,235,191,146,187,152,247,160,125,246,0,106,175,252,176,147,+68,49,192,0,116,223,241,110,238,251,141,139,94,94,140,158,159,38,223,76,+193,17,193,122,54,35,72,77,84,34,111,152,24,70,174,85,204,248,106,62,+21,147,48,128,64,121,51,11,75,86,179,48,232,50,114,167,42,208,159,130,+121,51,66,155,218,96,67,144,194,181,52,128,80,194,30,218,58,190,183,58,+72,100,71,238,135,93,247,227,107,71,74,214,247,91,55,213,28,108,233,13,+230,91,32,195,16,104,222,232,33,124,153,247,98,109,112,215,224,174,159,21,+61,52,198,157,194,47,174,83,149,76,200,85,37,169,119,49,214,15,227,78,+109,113,142,76,93,50,179,21,199,177,126,31,152,107,162,227,98,27,98,151,+219,4,178,28,161,83,249,172,18,213,69,242,191,181,200,232,229,30,158,131,+232,196,243,249,39,197,194,55,2,108,155,194,216,174,182,227,78,188,221,151,+116,254,44,105,108,42,205,210,127,91,86,148,24,129,176,196,89,229,83,8,+236,155,254,80,4,172,22,80,59,240,76,88,162,95,168,136,88,59,2,173,+39,126,152,17,153,76,230,62,149,183,158,248,81,209,124,77,86,229,175,41,+0,119,104,155,52,54,208,186,240,162,125,67,187,249,100,162,136,116,135,236,+118,219,115,216,85,34,90,167,205,149,48,203,33,6,232,75,75,27,10,209,+196,240,78,8,238,4,50,76,199,224,98,214,200,211,55,146,124,168,228,47,+146,122,206,75,127,151,172,75,8,28,201,12,44,232,249,157,78,8,115,73,+52,41,82,137,146,162,83,9,193,43,110,194,103,160,169,83,151,42,4,112,+65,17,24,201,203,205,83,11,139,194,110,30,124,249,190,117,140,252,216,227,+200,59,11,141,156,183,66,190,76,99,222,131,252,162,58,101,83,50,141,253,+213,173,210,57,78,130,171,65,71,73,229,253,81,181,205,234,75,233,19,31,+0,183,104,116,62,118,243,169,135,201,251,5,127,54,118,238,64,84,107,192,+182,53,8,84,211,26,210,247,174,203,68,118,184,10,54,43,15,155,82,21,+54,109,152,33,112,73,41,83,56,148,27,179,43,145,206,6,86,175,206,250,+219,43,106,79,67,161,34,136,70,192,254,198,79,1,1,130,162,33,227,137,+5,231,118,113,38,98,57,241,68,125,132,114,234,110,148,179,15,153,241,181,+55,158,47,65,126,120,125,204,155,4,237,50,255,118,83,158,189,126,171,78,+101,142,23,215,232,185,42,53,66,212,203,28,235,97,0,174,188,5,10,23,+163,30,49,49,211,110,18,149,134,170,241,21,200,55,152,45,185,48,59,85,+54,61,115,198,46,118,178,187,247,39,252,108,198,244,194,250,70,67,112,174,+249,237,97,15,31,202,87,237,8,82,115,139,200,166,127,141,213,242,134,108,+221,41,57,178,133,187,214,81,10,221,7,141,58,132,75,141,93,162,239,116,+193,0,175,106,100,216,161,64,13,87,200,153,228,3,198,116,195,41,160,4,+240,198,86,214,62,183,245,108,181,4,214,165,247,138,234,13,24,93,71,164,+227,53,30,250,61,207,4,255,81,244,186,122,113,20,25,186,238,43,191,51,+198,105,232,136,177,56,185,226,89,234,59,157,35,123,245,52,35,160,107,171,+220,106,20,226,103,134,212,151,95,165,211,33,109,224,8,13,191,40,243,155,+233,150,8,66,18,200,93,215,118,125,238,142,209,74,205,174,126,207,217,235,+99,213,172,119,133,237,220,209,195,107,215,117,95,226,76,12,72,52,103,218,+104,59,31,30,250,224,77,239,136,44,135,223,151,183,205,87,190,114,250,199,+31,101,126,80,54,43,229,152,251,220,93,65,231,161,210,122,144,207,82,232,+123,231,180,0,163,102,110,30,122,42,240,177,160,97,205,132,50,137,152,204,+250,74,235,95,225,94,253,6,83,98,37,70,54,187,36,196,237,94,197,200,+26,13,193,89,38,130,90,168,108,234,0,198,4,37,250,225,129,61,24,38,+86,11,57,4,40,169,171,110,3,152,244,36,179,223,202,130,25,8,26,97,+178,33,31,114,238,205,113,13,159,189,189,86,79,73,162,204,196,228,160,60,+165,227,210,77,255,62,233,160,140,219,231,117,51,163,140,106,63,253,23,133,+10,244,97,159,177,230,204,82,115,78,1,217,62,61,134,42,196,115,56,85,+149,172,187,7,207,20,5,148,189,188,49,107,45,14,190,127,226,64,232,228,+206,206,158,92,145,75,136,11,27,253,22,71,144,40,8,153,249,163,101,110,+68,229,123,159,231,42,108,124,78,65,154,59,90,134,169,235,54,112,195,243,+21,26,126,87,34,5,213,223,16,155,125,10,200,117,74,214,5,229,88,122,+64,78,87,190,136,171,112,205,231,135,208,50,40,52,169,112,237,143,158,141,+207,136,141,245,169,239,14,217,234,190,93,176,22,253,88,170,231,51,208,57,+78,253,108,171,214,92,13,64,119,247,57,137,255,117,24,16,219,134,189,16,+149,28,90,243,83,254,165,230,152,75,17,183,190,18,37,164,150,51,250,84,+178,55,30,101,95,213,237,57,161,167,81,84,62,180,189,220,4,208,234,221,+1,178,81,16,243,15,154,141,16,180,214,73,232,148,176,211,87,187,234,77,+65,24,241,132,234,198,175,188,51,108,92,229,50,104,196,144,19,253,119,214,+139,59,78,158,24,194,222,68,160,107,164,84,124,204,101,24,222,49,110,8,+36,28,63,245,219,103,237,218,228,35,52,206,244,109,115,148,7,85,228,213,+116,24,204,161,15,16,49,241,95,163,228,203,46,73,124,204,176,190,176,188,+73,95,250,216,196,25,204,252,231,114,204,20,127,76,19,118,37,2,126,149,+176,209,24,239,190,29,189,83,164,191,253,130,24,156,87,81,254,139,51,137,+195,132,182,218,200,66,51,133,53,55,75,198,159,75,195,230,196,117,49,248,+126,243,45,73,244,227,226,176,24,66,252,250,208,54,240,119,182,63,149,40,+158,252,228,224,124,186,252,145,129,237,32,225,25,246,133,95,243,147,194,171,+131,133,42,97,229,122,160,28,225,42,181,209,138,64,180,180,175,129,210,165,+193,253,178,20,191,205,56,214,154,190,81,137,115,203,177,133,11,67,126,236,+65,19,229,173,210,102,90,209,73,90,213,168,47,146,25,92,118,216,179,82,+228,73,8,242,227,22,99,153,87,93,61,119,97,247,145,55,118,224,205,85,+197,91,225,124,148,189,50,72,254,136,34,151,12,162,30,60,64,40,112,33,+25,195,102,237,52,246,186,178,207,159,153,120,184,221,165,74,54,234,94,235,+105,18,150,251,200,191,167,77,59,37,249,248,144,180,215,97,38,37,132,42,+46,70,226,140,111,77,154,146,169,22,21,219,75,19,213,200,153,128,19,246,+80,71,151,161,73,191,229,94,247,116,212,72,5,130,199,34,73,204,250,225,+248,5,149,55,197,169,243,140,93,148,171,80,9,125,73,245,86,18,165,165,+28,230,210,166,112,21,195,17,35,193,120,232,210,115,75,4,250,19,191,226,+110,27,39,156,123,71,58,208,239,211,183,173,245,203,229,190,23,182,127,223,+108,66,145,147,142,188,84,176,151,201,231,7,226,59,226,69,180,111,60,27,+211,66,238,192,180,3,110,32,115,194,206,197,41,57,60,133,169,144,207,73,+239,4,60,40,110,117,197,13,243,118,42,110,172,48,38,122,57,85,218,45,+180,81,42,223,197,253,21,160,228,234,94,156,176,245,118,253,158,225,70,102,+198,229,31,164,35,134,103,16,195,179,106,113,133,23,0,46,19,145,179,118,+28,170,46,3,254,233,222,209,193,74,111,153,247,250,149,194,229,218,205,43,+221,123,110,194,80,129,182,227,244,47,235,222,253,229,101,50,94,37,76,54,+95,230,115,188,165,101,128,33,108,249,204,40,245,179,242,16,104,181,183,60,+61,146,44,222,127,92,16,56,187,176,77,15,196,251,188,222,50,51,71,233,+209,170,205,5,253,120,83,213,13,93,227,1,201,115,156,104,22,125,161,153,+146,230,229,33,91,171,20,127,56,252,19,237,207,58,42,10,49,126,237,8,+251,155,136,80,7,107,38,229,191,195,173,66,199,205,59,188,132,5,14,239,+13,182,215,181,243,224,68,151,238,91,212,170,147,73,157,160,55,165,246,250,+203,181,47,168,132,112,127,117,127,69,174,237,160,225,98,13,138,146,155,149,+238,184,128,114,69,179,17,5,148,155,59,0,79,20,198,115,107,30,195,66,+122,120,198,114,228,106,145,68,255,214,205,141,51,24,254,45,82,149,90,58,+73,141,33,124,143,138,229,61,63,232,195,236,30,203,127,75,124,139,56,121,+100,180,66,232,170,193,79,110,127,35,10,221,185,124,222,3,112,99,48,254,+9,217,118,142,38,153,211,108,99,242,54,30,88,180,80,168,92,115,89,196,+62,224,169,155,210,162,9,216,60,211,218,161,252,99,254,116,254,8,140,106,+202,146,32,235,43,234,127,10,37,241,6,135,33,100,79,27,192,190,205,142,+62,232,146,25,186,197,49,3,246,211,156,7,92,118,150,91,125,223,65,196,+5,169,58,71,26,92,224,65,193,133,87,7,5,88,176,135,111,188,182,97,+20,152,18,138,242,102,127,248,203,5,78,215,182,53,227,132,56,239,216,182,+132,121,236,232,33,69,110,47,95,37,190,117,103,218,255,40,101,175,102,188,+85,200,44,223,57,246,148,184,92,220,101,31,187,87,186,171,20,20,200,43,+225,73,182,125,120,89,126,43,192,239,32,138,10,74,33,252,74,208,34,142,+120,3,205,134,53,106,164,196,40,63,178,58,189,210,227,217,227,107,65,63,+74,151,196,211,70,1,120,196,106,186,0,224,70,120,197,61,223,111,94,146,+19,71,84,29,68,79,230,26,117,159,237,230,102,205,42,142,138,206,174,213,+157,3,51,174,35,103,40,53,69,217,5,153,40,88,82,243,105,163,201,185,+90,169,158,52,250,169,35,53,19,130,43,103,113,61,212,106,33,15,82,133,+213,173,43,97,253,68,147,248,164,212,29,148,175,107,251,98,51,46,124,101,+171,168,119,179,212,113,110,184,119,135,60,198,211,167,80,229,42,130,3,122,+55,170,185,152,16,139,55,85,234,174,39,240,133,178,190,243,120,165,171,35,+208,29,28,198,204,27,24,170,113,31,181,20,20,104,205,6,61,16,27,230,+56,61,128,209,169,169,128,225,51,93,161,181,98,68,105,222,206,184,236,92,+232,61,215,102,13,242,64,210,156,93,229,179,164,41,88,242,167,175,168,70,+154,98,2,215,153,58,124,197,82,217,19,210,213,246,8,79,60,146,116,98,+88,48,237,28,136,98,63,62,102,25,45,151,102,43,11,119,188,134,190,109,+200,160,60,240,113,145,130,207,84,128,112,44,185,6,173,126,207,106,228,75,+205,241,20,120,142,172,129,33,225,93,152,163,173,76,79,227,42,211,112,84,+225,92,115,112,137,163,17,16,46,194,165,82,27,37,205,252,51,143,205,24,+34,241,227,181,220,115,189,244,95,1,17,30,254,170,233,194,215,131,249,22,+214,3,8,192,152,6,168,169,170,30,1,67,228,94,214,203,24,28,217,81,+119,184,70,46,50,14,229,246,214,120,136,184,233,66,11,202,111,175,57,26,+186,79,74,164,231,75,122,103,40,105,152,66,203,131,133,208,116,22,216,111,+101,215,232,178,26,255,141,1,213,184,253,172,174,108,227,0,4,10,75,67,+199,134,59,238,102,82,194,208,193,187,208,33,135,87,159,148,176,115,76,17,+8,45,213,29,39,187,100,84,154,9,119,81,216,96,128,122,39,87,11,73,+252,154,123,107,103,130,53,243,106,237,198,73,31,241,30,88,93,65,254,209,+88,88,77,85,35,174,163,250,245,18,83,2,25,131,234,176,107,188,64,136,+29,74,165,255,165,120,113,213,183,207,119,24,11,35,252,253,233,244,172,203,+86,103,109,216,63,143,62,18,43,113,112,55,7,142,17,103,54,159,228,170,+92,206,135,132,243,206,212,12,195,137,79,199,226,142,126,86,175,95,97,129,+143,99,168,213,179,203,36,193,79,40,177,170,68,105,94,245,68,233,9,43,+96,27,240,179,96,176,33,99,239,24,144,159,127,237,177,227,158,101,252,156,+38,237,97,10,149,230,183,91,79,59,178,144,9,156,248,23,174,142,104,80,+218,220,113,244,191,138,161,43,230,27,14,248,185,181,205,212,184,194,235,136,+14,149,35,255,210,62,11,250,232,127,216,39,165,4,120,9,34,121,145,38,+3,113,65,248,92,192,178,193,23,185,61,225,181,106,101,104,14,106,114,161,+91,110,202,155,55,64,19,20,78,123,172,70,126,47,13,54,69,135,126,218,+230,107,111,146,167,218,137,30,126,68,99,168,122,253,240,50,205,192,171,244,+28,214,90,96,128,62,164,160,152,222,31,155,137,133,185,176,74,247,81,136,+42,194,48,72,137,144,240,173,194,83,7,246,48,13,242,20,195,80,147,213,+184,55,234,220,146,236,77,169,176,154,172,179,173,184,161,160,169,33,83,135,+216,64,137,116,80,181,59,197,131,2,217,239,13,194,187,159,7,237,206,115,+157,165,216,11,25,51,30,4,129,12,30,198,53,137,186,127,56,76,243,23,+173,0,94,161,100,228,108,34,183,44,152,38,128,146,212,77,98,255,235,110,+84,190,32,87,122,181,137,51,215,156,175,50,127,158,172,32,170,87,94,121,+105,153,47,89,149,138,176,94,241,45,99,81,67,244,31,91,77,240,15,249,+60,156,62,16,24,239,102,41,182,176,218,234,20,144,235,199,198,112,229,17,+120,123,91,245,90,82,18,251,67,227,38,2,8,105,98,6,106,82,70,62,+106,232,52,137,163,53,233,42,90,191,131,119,117,200,75,100,212,191,72,69,+78,33,191,10,174,180,76,178,133,206,5,109,250,77,62,127,72,16,229,135,+51,29,4,12,149,193,238,154,39,193,95,18,4,134,36,117,125,250,153,171,+255,31,17,214,150,172,196,46,150,24,147,193,203,219,244,240,1,196,152,126,+74,108,96,142,234,138,48,215,199,35,181,21,233,172,130,1,177,103,10,1,+204,147,209,183,166,163,255,194,133,100,248,20,72,139,35,116,60,76,159,163,+7,239,10,167,231,58,141,56,72,158,74,251,224,150,192,219,72,48,221,173,+6,222,114,226,51,193,61,53,180,59,236,93,112,175,213,128,245,227,195,113,+46,1,86,16,74,246,38,180,24,61,121,135,234,154,181,9,246,169,179,47,+243,92,204,219,136,133,104,95,253,64,246,250,3,247,80,213,220,145,2,33,+113,246,193,191,144,218,190,99,85,38,164,30,207,199,73,30,150,132,62,62,+195,136,31,11,57,11,55,180,131,61,215,137,86,227,83,237,133,139,205,24,+24,215,151,196,188,112,4,179,191,247,73,233,228,40,153,247,239,51,151,99,+227,169,45,164,196,108,37,182,165,215,158,233,16,65,46,68,160,137,7,177,+150,75,52,89,124,221,167,159,213,77,168,13,30,117,204,135,131,115,17,160,+231,42,29,176,105,231,119,108,130,83,59,125,39,92,112,94,28,247,241,180,+155,212,67,205,131,42,50,47,127,138,162,127,8,74,164,78,17,126,130,74,+237,11,117,63,226,124,194,56,176,31,70,238,211,250,75,148,58,126,242,37,+18,122,121,219,220,6,100,153,160,158,113,44,7,225,67,127,135,69,28,111,+244,217,189,42,240,222,55,146,60,211,192,255,74,151,146,174,126,221,18,193,+96,153,181,40,53,204,67,64,149,171,60,217,91,28,25,13,44,12,101,219,+165,113,219,118,176,159,82,216,54,226,61,174,218,85,174,82,240,248,43,193,+42,171,99,98,58,20,176,214,160,190,109,225,177,90,68,197,166,111,251,125,+133,154,141,117,108,117,96,179,153,242,96,182,26,170,217,71,37,186,28,239,+34,224,58,52,222,216,185,66,89,219,186,117,197,166,14,235,239,52,234,43,+57,65,145,182,70,134,173,233,202,26,196,121,197,23,182,97,7,141,8,45,+223,19,192,217,13,207,124,240,180,197,204,155,155,10,209,14,206,54,173,38,+144,189,151,174,159,49,42,90,127,150,101,162,205,240,166,167,208,25,175,133,+157,156,225,135,51,210,6,197,215,209,143,218,192,129,4,169,106,27,114,113,+111,210,139,149,139,125,92,138,40,53,146,217,126,209,17,197,93,72,88,156,+59,166,220,23,63,68,167,87,211,226,187,185,63,198,39,75,79,208,106,140,+128,126,232,190,254,218,30,223,187,92,197,117,10,26,146,43,202,90,20,182,+44,232,1,155,4,134,134,142,247,52,120,59,99,65,169,153,102,232,24,139,+90,222,240,89,181,184,190,140,77,109,85,192,53,209,13,97,249,30,66,73,+123,241,174,180,89,238,141,90,196,109,217,73,59,254,131,171,77,199,92,108,+162,249,27,28,24,213,82,75,178,98,183,190,250,29,149,78,17,18,251,104,+50,118,173,176,246,140,87,234,9,94,87,163,181,117,78,136,184,92,38,207,+254,62,222,26,39,97,237,244,165,103,200,183,230,21,170,85,255,242,163,143,+222,250,207,219,70,212,56,174,193,52,197,142,73,110,241,45,209,168,132,61,+232,231,158,252,126,83,217,199,157,9,163,245,126,87,152,133,183,41,2,231,+123,14,61,166,140,60,78,189,125,1,238,13,90,21,123,219,207,144,209,246,+232,33,122,206,2,231,126,85,3,112,246,157,228,154,159,174,220,224,194,211,+166,27,69,0,115,201,39,13,2,150,94,158,124,16,2,225,231,101,84,64,+148,66,222,223,87,30,92,226,91,179,170,219,75,29,184,44,90,121,113,180,+90,40,192,249,232,164,107,187,16,68,148,238,89,145,218,14,142,38,2,207,+159,65,123,216,146,95,244,140,159,117,222,125,215,239,55,79,34,244,148,52,+9,42,91,85,92,254,3,128,159,55,88,17,226,25,151,192,251,57,239,202,+41,181,154,151,126,243,238,12,124,114,167,105,85,69,244,250,30,239,9,210,+138,46,35,72,16,225,33,238,174,43,134,224,232,83,112,160,253,88,225,57,+249,187,231,148,0,184,72,63,130,164,197,3,38,53,212,147,179,46,196,163,+82,181,147,152,84,73,135,76,43,153,52,33,169,64,59,98,33,154,67,45,+211,126,200,161,80,172,190,63,126,215,152,3,1,36,219,166,232,156,88,122,+245,229,189,245,135,15,156,123,3,43,214,24,246,253,26,182,54,76,25,193,+104,45,246,118,134,248,87,141,0,55,8,77,19,193,146,159,134,40,208,142,+21,211,202,213,115,251,204,7,206,136,228,27,81,175,11,78,81,76,45,202,+32,214,159,229,56,69,65,31,216,94,214,124,51,124,169,214,241,120,78,254,+144,3,155,57,165,126,172,47,14,95,55,187,56,207,103,207,105,49,78,43,+178,155,26,247,182,31,144,57,146,29,45,53,91,200,182,115,103,247,129,139,+127,131,162,82,92,161,85,44,194,164,41,2,227,223,163,157,169,235,183,134,+86,215,56,7,12,119,14,54,172,91,255,35,192,29,140,115,205,120,154,102,+38,141,7,25,178,16,51,146,92,99,172,131,150,223,107,231,177,226,228,115,+125,231,241,172,170,83,110,164,70,157,124,249,224,205,165,167,67,81,172,70,+147,155,120,81,146,97,169,45,123,169,61,217,179,12,41,58,51,180,109,111,+6,168,68,129,123,81,219,174,251,249,153,126,75,56,219,236,203,212,12,81,+236,183,35,150,136,48,186,102,212,68,102,136,175,104,97,81,33,254,171,83,+42,222,45,74,130,223,32,175,18,14,74,110,103,82,143,91,15,133,110,86,+238,40,143,64,80,155,14,177,10,133,106,176,169,241,199,189,248,40,216,2,+171,106,61,196,156,0,211,109,101,104,35,192,102,126,23,56,79,132,164,104,+48,134,84,182,129,11,211,144,91,188,95,230,159,11,134,14,171,165,249,109,+90,160,245,38,61,152,218,142,51,21,41,17,238,108,36,69,82,36,36,15,+183,137,43,222,120,253,203,244,69,50,237,233,222,142,69,129,49,123,202,246,+118,157,1,246,99,72,213,106,254,103,242,56,23,222,35,62,42,159,60,40,+40,202,30,175,132,190,238,46,178,160,227,7,162,38,100,17,74,197,0,58,+167,251,249,122,134,142,118,133,22,91,244,84,97,235,180,74,211,235,57,254,+150,130,174,190,18,2,116,98,136,164,146,93,17,73,169,135,159,20,3,150,+245,31,185,229,121,111,146,6,250,75,188,216,80,198,228,107,207,151,252,118,+171,59,85,128,28,126,90,139,205,14,183,68,60,220,146,51,32,110,78,161,+115,167,93,48,73,185,183,199,18,115,97,158,234,159,231,178,14,31,131,214,+129,233,143,219,26,253,21,67,156,192,134,130,147,124,147,57,174,46,203,121,+36,232,141,254,0,13,160,173,109,131,38,251,70,218,208,211,70,4,118,231,+209,38,56,12,161,111,152,83,97,112,167,62,204,121,227,28,4,70,142,225,+91,194,25,197,238,86,29,237,240,16,129,31,125,124,198,27,74,32,66,140,+210,41,45,204,209,160,204,250,233,134,183,165,34,140,59,176,63,182,233,210,+79,3,84,213,172,117,246,65,43,34,98,53,27,57,160,118,36,39,152,230,+255,76,122,15,12,33,80,168,46,243,104,14,153,222,158,158,166,115,9,24,+239,255,202,168,124,218,34,35,156,49,47,219,241,37,237,18,177,151,222,128,+162,219,34,166,23,23,212,159,145,148,229,163,64,36,168,244,50,239,209,209,+198,122,125,177,138,242,8,204,125,178,224,34,45,177,97,131,30,188,237,144,+142,233,185,51,41,111,114,220,229,39,230,236,88,5,43,211,125,20,184,149,+80,239,23,29,88,103,218,56,230,42,46,150,233,11,9,140,226,61,174,215,+151,84,32,241,9,197,20,163,80,201,226,140,226,75,123,5,39,236,12,240,+24,31,84,22,85,40,134,143,201,150,237,159,239,149,1,136,76,195,205,48,+42,114,143,0,87,224,240,26,205,122,193,78,105,34,222,173,6,90,204,201,+141,4,174,42,179,105,10,32,52,61,32,166,49,235,34,156,129,127,172,183,+97,5,115,205,192,93,72,62,68,252,167,156,216,134,62,55,115,156,189,224,+25,232,74,88,58,105,86,97,248,220,48,216,161,206,124,98,9,159,105,118,+247,189,206,40,170,202,26,24,70,7,41,122,81,131,69,97,57,171,243,63,+229,184,189,245,82,134,231,11,135,11,48,233,211,152,139,150,229,30,58,255,+43,213,213,5,89,95,74,5,156,65,247,109,47,77,75,149,17,46,111,229,+115,11,59,151,170,160,77,112,103,152,52,122,226,57,2,38,177,118,78,239,+159,62,187,253,162,107,72,251,139,47,6,108,112,180,209,145,63,2,138,227,+208,253,210,203,226,130,82,44,181,171,106,102,129,108,171,113,17,233,137,86,+126,245,221,16,120,212,81,57,1,101,125,158,91,26,79,215,75,9,236,254,+162,201,186,68,11,70,251,22,153,149,248,148,150,98,29,107,254,189,233,125,+55,214,210,32,43,23,10,55,189,218,193,98,82,242,236,16,170,183,11,110,+77,35,31,158,20,169,111,11,210,129,43,98,211,195,230,32,74,151,9,135,+151,128,136,73,201,19,199,62,54,57,83,37,170,130,52,180,127,174,248,252,+18,115,206,241,126,48,183,157,221,245,95,90,119,178,129,104,13,70,130,178,+15,225,160,46,217,80,88,223,254,128,156,67,116,155,93,103,122,156,221,63,+30,115,228,232,71,52,128,247,121,47,29,46,103,16,197,51,62,35,100,222,+231,103,79,153,72,242,76,42,210,236,147,240,31,15,157,227,15,165,41,176,+31,145,110,212,14,38,92,177,28,107,118,197,232,84,106,160,147,64,116,75,+252,21,116,193,150,178,175,32,162,46,206,15,106,206,30,81,255,17,244,135,+198,39,233,160,11,70,225,232,13,56,43,60,98,51,170,173,34,32,206,49,+69,17,124,228,160,109,151,158,213,241,111,23,132,23,24,239,210,74,59,2,+78,175,192,248,16,250,40,178,107,218,192,241,150,125,144,76,151,189,44,250,+79,76,190,221,125,249,146,6,85,236,66,107,30,178,45,189,240,239,215,137,+190,2,207,153,138,1,145,15,59,71,206,76,53,186,63,48,94,77,177,239,+59,203,251,34,185,226,89,58,166,234,121,29,145,158,179,147,212,90,32,239,+88,115,40,82,184,215,202,217,35,51,126,1,46,133,243,216,230,38,57,136,+137,140,207,22,239,0,134,240,194,200,204,4,113,171,159,44,237,144,130,105,+23,212,255,35,227,141,81,75,246,0,86,98,87,208,254,236,246,63,129,63,+188,160,128,245,144,164,63,225,41,149,208,224,156,153,178,159,27,17,15,42,+97,11,26,163,187,75,83,83,151,175,210,205,59,43,206,225,120,26,75,216,+169,17,72,42,220,26,80,246,179,8,176,192,112,9,203,128,192,62,67,176,+246,232,95,27,52,161,44,7,252,112,76,118,37,168,218,158,167,234,206,13,+231,215,162,49,170,192,28,198,3,220,2,6,139,118,193,140,165,137,220,108,+88,104,56,243,205,124,59,89,181,117,238,249,137,28,223,42,184,254,213,105,+150,179,108,73,78,116,42,79,68,14,195,57,113,243,9,57,217,214,95,246,+172,82,66,224,186,168,213,116,143,69,117,78,124,140,246,86,78,172,119,67,+112,199,161,143,205,254,41,145,152,161,101,36,184,1,162,230,22,57,56,141,+189,223,143,170,205,117,29,233,186,234,124,138,42,231,88,81,133,114,222,134,+189,10,72,44,48,74,83,177,218,187,224,8,199,197,204,249,239,148,245,231,+130,157,111,184,60,14,125,4,197,220,217,177,214,26,54,144,90,30,237,165,+231,5,93,125,151,78,246,55,139,11,192,168,170,206,241,174,103,204,232,124,+90,48,69,120,7,102,241,157,26,114,155,185,214,207,56,74,242,103,242,118,+74,134,16,232,221,139,224,253,191,50,20,127,141,1,6,190,194,166,122,138,+139,173,139,105,47,116,237,213,148,170,17,188,189,238,193,137,191,214,139,3,+62,146,62,18,199,78,246,233,221,246,99,33,229,172,10,56,145,47,4,197,+37,37,190,254,85,55,121,21,162,69,245,88,2,145,202,20,179,193,197,53,+54,90,103,210,138,217,81,143,123,228,116,29,78,222,196,88,223,179,201,45,+126,31,93,146,53,135,199,17,213,7,91,61,244,26,164,25,8,190,36,25,+137,153,3,139,221,46,194,251,215,102,233,61,230,226,18,120,103,87,85,166,+32,251,77,101,228,238,157,130,216,90,65,217,137,135,215,94,231,148,198,121,+164,188,92,156,9,238,199,166,223,102,55,99,78,185,192,229,63,164,214,214,+123,164,208,18,57,9,183,230,162,72,159,1,206,208,194,57,182,53,48,214,+57,109,172,139,175,60,106,236,246,143,232,91,43,239,236,36,94,190,252,243,+254,167,212,208,219,16,45,205,155,146,250,161,25,65,86,188,236,12,130,118,+233,170,178,192,18,151,20,212,36,208,226,113,17,81,200,55,7,215,57,199,+237,139,203,245,17,94,10,79,117,178,240,49,246,108,105,59,211,216,167,203,+213,17,43,105,22,157,217,225,187,135,136,180,176,130,209,158,101,188,5,17,+59,115,79,243,157,49,85,204,7,82,127,44,45,1,225,77,189,110,49,110,+209,83,227,65,46,49,16,205,251,206,187,67,95,56,93,198,124,112,129,97,+75,152,156,72,22,22,177,62,43,93,246,61,101,131,196,18,88,230,133,1,+189,163,93,6,100,48,76,184,117,63,245,56,182,80,110,245,102,143,249,242,+142,82,129,96,41,212,59,0,174,229,130,102,138,247,78,141,29,213,178,61,+3,243,227,252,91,8,251,71,67,91,67,175,187,193,202,77,172,155,138,236,+200,131,231,197,16,159,113,223,79,37,173,192,173,61,228,164,15,234,57,138,+59,201,199,106,58,254,50,112,103,10,245,40,89,157,106,147,181,123,242,85,+255,54,64,247,225,183,35,210,68,160,43,57,254,225,159,239,44,98,51,20,+127,138,21,32,78,56,16,157,130,53,246,118,103,6,245,79,132,180,110,81,+42,156,231,107,5,153,172,37,88,35,182,155,183,152,211,13,248,42,4,222,+82,186,89,180,153,211,81,243,187,6,243,69,178,94,254,72,188,210,115,49,+10,1,37,85,132,21,140,187,184,59,5,55,244,233,144,249,164,25,249,161,+12,193,83,225,40,212,53,100,155,61,143,65,244,24,249,230,195,198,109,166,+210,90,137,181,232,145,120,12,154,25,170,52,88,35,231,69,195,130,123,226,+152,131,121,199,223,134,35,41,141,76,127,58,236,15,239,135,192,109,244,48,+71,68,32,67,250,32,252,162,182,237,142,123,54,153,62,64,223,151,128,13,+188,148,199,23,37,226,106,214,9,208,171,138,48,27,201,60,141,111,53,123,+119,160,163,140,96,67,71,50,132,196,92,223,241,181,34,50,206,8,119,163,+238,159,76,248,131,111,116,224,59,22,125,120,135,204,72,136,213,190,234,127,+167,248,218,46,156,71,181,39,119,141,153,13,123,190,161,199,207,225,130,120,+101,167,142,102,104,201,199,41,154,212,38,26,71,127,240,16,112,17,191,66,+135,76,4,109,45,122,158,33,6,31,131,11,232,19,165,229,108,51,135,140,+137,196,146,142,237,108,19,54,216,229,196,243,207,115,176,207,140,27,2,19,+203,27,188,241,79,83,235,249,229,163,157,146,63,79,144,197,153,247,55,168,+155,187,121,110,60,153,226,76,89,195,88,96,226,211,111,47,136,160,96,16,+97,62,196,22,19,27,143,46,192,188,139,182,246,233,71,26,202,154,38,214,+113,231,214,46,143,247,244,140,8,148,16,47,242,85,202,241,54,255,40,231,+184,176,224,53,130,212,202,26,241,79,66,231,113,19,65,59,255,125,106,16,+35,116,51,121,93,129,168,169,197,11,132,102,16,50,212,130,69,132,149,0,+8,102,72,24,180,124,84,230,94,111,39,173,166,95,186,236,232,102,184,119,+18,233,133,76,169,79,63,194,63,50,133,103,59,254,116,22,249,63,187,137,+82,105,62,140,115,233,241,223,98,161,183,140,244,203,28,64,128,125,93,22,+67,89,42,42,211,226,174,198,229,205,73,3,89,204,155,183,156,59,157,47,+244,156,124,61,53,138,18,218,201,197,201,214,187,118,50,227,33,194,248,18,+18,5,108,123,18,138,223,3,201,249,215,206,134,36,65,157,241,54,134,207,+155,167,31,157,2,104,255,255,239,172,145,41,48,61,181,221,68,0,75,111,+5,137,239,173,43,145,226,227,197,99,192,215,250,70,191,142,69,16,254,209,+146,109,187,237,180,90,30,81,14,179,154,110,31,192,91,113,80,149,172,86,+111,3,7,165,25,125,225,161,70,184,210,192,143,127,136,234,216,27,52,51,+193,64,245,200,108,190,162,214,1,221,79,232,83,14,101,38,50,33,155,220,+106,70,65,78,249,208,139,134,6,160,194,168,231,162,7,39,184,121,67,12,+49,18,112,48,200,142,19,60,242,28,135,141,28,68,126,184,70,6,219,94,+134,228,4,35,67,254,206,68,61,152,184,160,95,131,109,192,63,47,46,138,+202,185,108,54,128,107,171,104,38,156,202,21,41,180,131,240,192,177,73,132,+113,164,235,164,27,120,193,221,231,162,134,60,167,241,197,117,205,35,76,104,+197,152,67,202,212,60,233,81,88,147,221,127,227,233,130,116,234,37,77,75,+240,122,225,47,30,175,38,32,59,185,86,145,225,227,26,153,97,164,40,119,+133,178,100,187,119,241,153,138,10,132,184,216,196,40,121,250,253,101,216,89,+180,185,201,86,147,223,66,36,173,80,53,55,229,109,177,171,216,252,45,180,+50,151,144,85,0,14,148,119,161,56,192,73,82,73,128,40,116,160,115,228,+170,154,225,3,110,117,88,177,199,238,245,176,2,180,170,45,144,137,204,62,+175,180,192,106,80,97,121,207,28,92,95,223,75,194,209,208,129,49,200,73,+6,177,23,63,127,91,188,29,23,147,18,5,125,6,117,167,134,35,27,69,+95,117,150,106,26,97,116,45,48,88,23,82,204,186,118,181,189,49,101,190,+155,142,167,249,113,210,20,255,176,116,21,25,207,135,198,91,138,249,32,22,+203,88,36,174,115,70,31,26,74,15,170,18,83,252,66,115,191,183,227,253,+68,240,63,54,243,65,249,225,32,40,251,17,109,197,144,67,193,223,106,30,+19,187,134,59,8,196,82,223,15,172,245,12,122,164,156,126,0,45,205,225,+32,114,18,80,23,115,135,125,155,227,115,228,211,151,215,39,73,216,79,132,+6,69,202,170,198,201,76,252,49,201,232,98,220,135,190,159,75,244,239,40,+163,27,90,7,17,81,191,196,3,196,182,60,98,73,194,121,149,59,145,86,+176,13,59,155,100,129,214,126,152,143,202,66,126,218,129,12,214,45,171,91,+92,67,137,94,207,86,75,145,42,144,194,120,251,100,188,117,197,137,199,110,+175,209,97,76,254,231,19,115,119,47,37,25,149,215,197,215,193,117,70,2,+54,239,213,27,190,148,252,27,13,33,161,70,228,1,45,253,125,221,107,129,+109,78,203,231,221,137,218,15,113,133,81,208,69,133,46,33,69,239,74,45,+139,1,197,57,36,91,20,240,77,192,187,54,99,136,78,150,49,76,158,166,+26,148,165,244,68,210,12,36,88,3,32,228,206,79,101,212,241,44,34,87,+15,202,55,175,134,201,168,194,204,130,70,32,208,64,100,57,27,248,222,229,+16,191,172,94,1,38,19,206,36,24,197,244,32,73,166,184,149,201,233,136,+40,54,191,54,190,114,74,195,156,231,34,160,208,44,133,182,241,130,142,221,+241,64,204,77,160,202,221,233,255,213,240,16,123,166,68,17,2,35,58,190,+92,174,252,43,162,121,222,128,70,71,16,6,9,115,21,252,93,192,24,109,+112,153,98,159,250,164,152,112,41,91,122,183,96,251,129,227,224,237,163,213,+229,110,209,117,174,225,131,9,32,166,29,146,235,96,70,213,182,6,24,139,+159,92,214,154,163,13,38,173,140,95,185,215,61,133,90,252,27,0,132,188,+207,65,179,209,106,253,99,188,62,28,24,151,198,26,36,110,3,105,179,69,+25,252,146,103,87,140,233,184,202,32,115,11,55,212,105,37,30,52,97,42,+33,143,79,162,9,201,103,23,55,187,20,74,161,21,51,13,91,197,64,199,+174,253,249,12,55,11,28,224,237,140,52,190,52,56,152,197,36,111,73,123,+201,212,41,86,240,120,103,71,202,113,60,126,99,138,20,17,129,149,113,142,+16,82,108,226,118,227,226,199,122,23,154,132,198,53,226,244,251,196,77,19,+72,106,170,62,164,133,45,63,188,213,150,101,119,54,179,68,132,192,122,151,+193,210,91,153,32,224,48,57,209,163,243,186,212,132,222,58,35,209,41,16,+249,189,110,18,118,38,253,92,105,228,18,211,132,123,81,69,21,42,221,167,+218,161,198,189,23,59,156,24,50,187,220,126,29,62,156,63,177,196,83,115,+140,102,19,75,113,73,150,153,195,247,31,179,239,70,32,24,201,113,221,189,+222,102,120,87,201,118,228,182,76,22,39,143,249,234,190,38,241,182,25,50,+19,80,46,24,128,136,126,219,101,148,254,58,22,225,197,157,134,224,155,218,+228,104,16,97,254,230,116,57,228,129,199,189,154,184,64,95,18,103,178,172,+225,199,187,213,182,81,244,129,88,79,42,172,109,33,240,73,94,237,11,174,+71,135,73,146,77,56,151,196,189,187,254,58,110,19,7,160,193,28,140,20,+171,11,231,16,48,4,95,132,68,177,164,116,198,14,122,173,119,236,124,105,+83,165,148,252,8,9,29,170,14,150,13,76,222,105,177,211,170,74,254,97,+88,101,234,189,105,45,83,214,223,44,187,199,163,112,157,136,111,214,225,243,+229,213,115,59,83,112,186,175,127,250,97,93,6,21,164,236,141,67,118,22,+30,128,235,43,44,227,46,5,91,110,223,225,122,6,230,100,209,79,73,142,+4,35,118,104,165,51,213,199,58,144,187,76,11,115,23,130,141,230,207,96,+138,223,115,159,161,22,165,200,51,43,226,120,154,6,191,11,209,164,32,144,+59,117,82,3,65,84,86,24,172,80,136,74,200,147,184,196,130,230,48,122,+91,104,164,89,21,22,134,80,200,158,158,147,194,66,222,158,19,44,16,252,+204,206,196,157,82,56,17,8,124,46,115,166,1,77,182,167,42,126,122,14,+153,29,3,87,244,84,225,56,232,41,67,156,204,254,75,58,208,202,116,66,+97,119,96,178,146,49,111,83,251,18,190,182,113,135,145,236,179,121,99,90,+101,105,63,70,33,179,15,167,231,175,173,227,47,212,145,131,156,244,217,150,+66,181,109,225,242,243,63,100,117,235,228,105,23,218,133,178,216,250,59,196,+98,208,2,112,155,41,87,212,18,9,83,41,249,110,185,97,42,92,15,153,+243,95,48,127,66,148,199,195,120,195,3,244,190,106,45,118,183,17,184,1,+148,102,235,60,117,66,95,36,130,101,202,201,153,240,34,240,213,224,143,67,+10,253,144,210,188,209,56,38,39,137,2,194,133,186,223,212,254,162,151,208,+172,162,154,66,176,132,39,207,144,31,93,47,82,25,247,196,208,221,105,192,+7,92,90,109,101,109,146,47,167,161,62,254,215,22,152,98,254,215,181,45,+252,68,79,177,80,75,184,149,76,156,223,148,65,96,145,89,230,240,14,97,+109,23,215,79,35,117,148,201,16,4,198,135,129,102,0,19,204,184,64,162,+112,81,6,179,9,248,46,108,111,190,115,231,25,65,110,132,29,80,39,120,+64,182,190,129,242,79,98,250,13,108,186,134,3,182,126,18,9,246,99,139,+213,242,50,43,79,180,121,5,120,32,54,47,41,108,174,4,188,225,89,70,+203,109,182,219,232,120,56,1,221,48,197,28,87,234,2,138,63,124,196,64,+102,184,204,219,137,240,162,87,155,113,183,12,228,67,202,176,175,132,64,23,+195,111,253,113,5,2,22,88,137,18,18,93,149,248,5,107,78,31,77,133,+180,215,3,97,84,255,52,217,103,12,145,7,91,164,14,8,224,26,87,215,+3,221,43,196,187,148,15,126,21,141,4,14,146,127,57,165,27,97,185,121,+122,106,179,120,54,24,227,11,64,100,44,196,98,39,91,32,72,236,205,42,+86,246,114,85,42,222,98,172,209,251,64,185,169,251,234,208,237,72,118,144,+210,67,106,182,16,191,130,200,50,220,141,169,244,166,158,125,196,108,31,71,+200,138,248,123,152,249,250,187,175,193,48,38,170,89,141,218,243,49,37,49,+15,217,6,244,127,205,170,40,217,235,160,189,254,235,19,221,50,182,97,185,+72,249,53,171,136,9,148,20,51,234,141,165,135,9,98,195,43,200,138,101,+158,41,136,244,173,41,131,69,247,114,21,77,163,36,66,141,150,77,60,192,+74,131,246,219,163,183,230,234,227,62,164,61,27,124,61,155,125,132,43,56,+160,178,8,223,215,73,107,204,130,17,115,118,180,210,151,110,27,96,13,199,+215,194,202,231,203,251,33,58,32,28,161,237,162,185,66,233,121,252,163,25,+119,184,194,248,255,187,86,204,248,179,180,245,240,181,117,12,203,20,124,226,+122,186,109,63,41,111,202,230,183,99,240,119,53,106,63,133,114,136,227,56,+156,250,108,36,25,58,227,147,155,210,238,253,93,240,143,117,117,132,55,105,+57,245,192,138,22,208,4,129,162,171,183,217,184,103,161,20,208,174,129,124,+121,246,167,93,239,92,185,229,87,234,5,152,160,209,155,153,135,102,43,201,+61,206,93,146,104,228,102,72,16,124,195,23,109,24,79,32,39,111,56,44,+21,81,200,206,184,208,167,119,197,84,93,71,155,238,8,46,161,79,176,47,+59,111,6,38,148,79,29,120,238,199,69,214,102,82,28,75,139,212,57,52,+218,29,127,19,27,154,200,67,243,153,221,28,107,9,162,12,233,1,89,207,+153,248,33,10,75,228,62,235,138,48,41,147,181,77,14,71,43,46,202,109,+87,232,116,193,92,166,119,34,13,158,5,136,213,241,91,215,186,28,124,144,+156,239,137,70,255,133,161,212,166,146,19,94,24,233,223,215,86,66,221,64,+6,187,252,254,56,181,172,95,87,8,75,165,111,226,193,156,25,145,57,127,+30,125,94,61,135,184,250,129,163,245,120,130,163,94,208,89,104,252,138,7,+69,124,105,73,179,121,98,220,89,161,40,68,51,2,243,143,103,70,247,178,+87,167,72,145,50,42,184,223,130,215,222,227,59,118,81,172,144,180,166,172,+189,180,52,255,22,85,135,112,176,83,59,96,193,105,129,34,206,246,23,164,+63,214,184,244,38,78,73,238,97,132,198,132,177,56,163,89,53,254,168,164,+149,153,15,109,114,82,114,82,24,9,82,37,93,185,72,40,252,4,174,240,+187,73,86,12,221,117,27,222,129,126,137,80,254,182,238,115,67,77,168,123,+34,46,12,235,6,75,65,33,44,57,26,95,206,247,173,208,37,103,4,12,+218,186,32,176,207,128,152,119,231,71,108,184,145,179,0,189,168,166,2,17,+145,73,254,113,191,55,206,140,64,108,166,83,234,42,97,32,149,232,117,76,+132,129,153,221,114,116,209,38,207,247,47,28,74,95,110,56,246,162,230,141,+238,196,81,45,249,7,189,209,58,5,247,0,151,243,53,236,172,251,55,157,+62,148,185,158,208,96,251,154,14,5,8,62,237,186,4,51,172,186,0,3,+182,199,106,190,182,222,95,155,202,208,16,178,49,164,162,232,151,10,168,44,+156,211,81,21,132,38,74,31,206,13,23,11,135,62,78,185,201,229,254,198,+5,230,58,18,72,202,70,177,22,42,166,6,13,197,4,11,99,22,244,7,+254,162,245,246,148,196,100,7,153,254,152,9,87,144,154,1,136,213,208,58,+97,16,217,124,224,102,47,30,66,22,228,90,126,22,75,172,74,23,143,194,+63,87,105,47,55,191,134,28,19,202,15,225,57,54,166,252,85,139,220,85,+139,12,105,176,59,78,60,1,149,100,132,243,187,13,184,181,172,151,12,149,+86,75,154,245,241,210,143,13,181,44,248,93,65,134,64,116,87,7,83,204,+32,144,6,85,82,130,1,8,180,64,211,250,174,219,40,96,204,2,194,58,+68,135,121,114,42,155,249,5,78,112,29,169,34,209,167,230,78,222,46,237,+78,195,82,179,96,217,139,195,84,253,130,155,249,21,64,125,69,185,154,140,+115,192,31,34,138,186,104,71,198,227,236,96,98,156,127,73,112,10,94,61,+19,58,15,34,29,144,124,249,101,155,188,197,120,162,119,167,145,76,15,55,+107,233,251,119,202,78,238,254,35,255,80,193,134,184,171,142,41,6,52,55,+25,131,68,236,180,59,38,103,59,110,64,214,15,205,74,206,123,127,120,102,+214,252,90,116,89,55,118,172,127,16,39,72,137,168,17,184,58,51,120,126,+41,192,179,162,170,105,52,32,113,189,109,40,80,93,225,253,245,188,137,224,+194,89,233,147,32,51,184,104,42,49,204,184,246,17,107,151,2,72,95,220,+147,232,170,223,68,59,61,178,211,25,13,184,148,133,109,83,53,110,181,25,+21,51,195,119,171,167,169,124,92,154,113,200,223,177,164,135,80,101,211,13,+154,112,223,102,213,47,85,203,206,81,148,235,212,247,74,249,200,36,249,169,+144,59,230,222,190,125,39,4,21,95,95,250,104,43,155,10,3,124,147,39,+226,112,174,143,70,0,187,134,255,194,40,190,228,164,221,193,39,230,9,185,+101,71,35,1,247,107,238,169,8,164,32,215,147,43,136,93,169,215,54,203,+113,131,100,152,196,169,143,194,105,36,4,183,84,8,32,166,41,9,229,133,+243,36,19,155,214,125,255,224,46,78,67,92,241,221,92,37,211,221,83,184,+232,46,251,100,58,117,44,48,184,35,63,140,148,109,142,57,95,196,130,83,+5,158,235,99,184,12,7,58,11,173,160,83,189,53,161,118,69,119,98,174,+101,140,146,22,63,25,200,246,11,89,36,211,104,171,4,254,80,168,78,106,+58,39,233,164,0,53,74,144,52,115,40,196,83,5,252,147,207,98,101,70,+109,161,10,45,15,182,139,132,33,159,181,89,154,152,63,147,148,237,229,248,+224,37,166,38,21,47,162,97,225,57,224,111,88,196,42,240,146,4,88,137,+175,59,194,109,247,125,183,101,175,57,170,85,104,232,247,151,5,1,159,157,+214,58,3,196,187,108,57,51,89,9,201,76,112,250,247,91,5,37,98,31,+125,208,225,71,205,72,143,184,51,24,235,167,30,229,146,232,102,75,174,206,+75,73,19,172,215,175,131,145,94,60,100,164,158,64,142,218,154,21,58,10,+56,2,212,193,127,102,247,245,196,5,191,224,35,59,105,65,211,161,12,43,+1,229,126,66,116,220,150,135,207,224,41,153,63,64,218,152,254,200,153,137,+35,173,124,71,162,55,72,212,199,121,161,234,102,110,44,2,214,151,9,142,+246,188,205,82,93,18,69,147,36,123,77,101,211,27,80,106,189,111,61,108,+206,252,104,197,187,180,55,251,182,137,244,94,224,21,244,78,193,169,101,47,+104,83,36,122,154,159,17,142,145,180,236,43,241,239,161,137,216,82,203,137,+44,226,225,106,168,207,18,10,93,178,237,80,113,233,93,66,47,33,181,119,+23,181,141,220,156,93,97,183,41,198,192,159,55,209,22,183,88,24,154,61,+151,90,135,54,20,204,95,231,54,216,151,21,81,102,168,89,145,33,23,131,+77,135,250,244,115,109,54,190,3,11,92,175,62,195,50,137,114,85,60,249,+159,61,248,68,3,219,72,31,186,234,106,208,232,101,6,106,221,102,12,31,+72,25,255,21,234,200,118,187,46,175,210,227,187,172,130,11,7,10,53,18,+114,103,67,249,110,4,122,189,153,118,151,168,58,104,20,117,58,192,213,75,+242,209,254,253,12,215,181,226,49,161,175,255,90,95,118,196,192,119,110,104,+32,185,15,8,25,232,122,206,126,229,165,226,59,49,215,8,0,162,188,243,+252,100,130,144,238,83,182,205,209,219,138,107,66,195,66,145,26,33,183,26,+192,134,191,60,22,90,32,252,149,82,235,26,13,46,169,159,114,37,234,80,+163,99,79,26,210,148,27,101,242,93,116,88,210,137,215,0,24,194,170,213,+56,82,139,215,121,177,108,182,125,207,193,44,219,94,104,48,45,17,191,152,+205,0,28,224,191,170,18,1,0,120,245,90,89,52,87,239,22,26,236,40,+77,136,138,242,134,63,228,19,156,116,101,239,227,117,145,95,115,130,74,255,+55,54,192,255,24,158,25,26,162,66,191,35,115,51,169,90,55,19,52,69,+233,192,49,175,29,104,156,28,71,254,206,3,73,153,100,168,158,241,153,57,+42,54,139,176,211,73,45,218,108,113,242,131,5,74,52,128,205,172,206,252,+61,136,204,174,252,129,72,0,69,161,1,21,99,218,244,222,223,89,32,23,+135,141,231,102,224,78,217,105,240,88,95,121,173,18,165,25,115,182,68,229,+188,244,203,96,159,130,21,183,36,12,247,123,29,17,197,163,33,177,147,161,+138,174,2,142,37,253,176,254,64,186,125,172,67,4,204,59,58,149,0,143,+50,177,9,76,207,84,135,165,7,213,252,255,112,250,59,142,96,241,99,185,+225,206,227,252,79,143,243,19,129,46,185,169,239,50,201,80,180,160,225,219,+161,175,117,181,187,131,244,88,71,128,208,253,190,100,16,80,73,180,144,56,+69,47,226,150,116,95,60,105,195,176,246,70,202,64,59,17,6,128,149,121,+211,55,184,144,108,109,107,211,2,80,192,41,195,228,111,1,228,14,227,105,+147,83,67,186,14,157,113,139,86,87,180,100,201,19,107,226,170,166,130,249,+117,202,21,142,174,70,234,194,26,56,101,221,64,161,167,188,232,69,49,230,+137,18,155,196,56,214,35,208,94,252,211,154,237,136,206,197,216,79,83,130,+107,50,238,42,236,67,121,152,116,69,116,251,101,138,147,16,231,248,156,55,+190,12,47,63,225,239,72,171,6,192,109,250,156,144,92,135,213,221,230,232,+77,80,175,116,185,161,135,12,160,29,239,38,31,81,158,158,29,141,27,115,+39,72,178,157,205,105,84,168,195,35,61,250,10,46,130,83,84,251,138,129,+129,128,164,159,213,165,152,18,29,51,23,82,214,241,181,45,123,180,172,21,+238,146,206,1,176,131,196,131,127,134,24,8,119,210,27,205,42,145,247,249,+164,227,54,240,25,252,67,164,88,32,154,145,26,178,120,85,21,82,66,218,+44,30,74,152,114,181,216,27,196,26,0,15,84,223,1,75,69,48,237,202,+219,11,0,106,69,17,99,14,249,119,246,28,225,55,207,39,121,121,85,80,+123,208,57,23,151,192,23,234,123,1,198,32,3,178,221,92,69,180,181,10,+73,169,78,211,155,48,221,13,157,168,150,15,243,171,133,103,85,116,78,245,+131,66,78,137,14,186,53,67,242,29,252,238,195,174,181,139,254,199,252,235,+158,192,49,110,180,76,65,82,250,113,28,136,19,154,23,83,97,252,41,166,+42,15,218,35,215,54,91,141,3,172,136,0,132,176,245,94,221,76,229,233,+42,207,99,235,236,53,7,120,218,185,36,128,31,148,214,46,17,139,209,29,+217,215,222,76,66,142,185,31,235,9,224,158,41,55,61,84,37,25,210,160,+30,212,221,243,216,169,7,235,7,184,127,184,2,139,74,200,241,150,195,45,+35,142,157,54,149,89,46,104,184,29,115,210,7,114,212,209,168,11,234,249,+149,42,71,174,33,55,118,133,39,245,214,9,130,122,161,11,255,10,165,198,+214,104,87,41,90,100,168,212,150,212,211,254,63,30,31,176,34,238,44,140,+101,141,140,210,101,124,86,146,220,238,145,81,24,125,226,250,109,206,15,150,+83,149,173,117,203,153,96,199,193,26,111,148,231,134,116,85,11,72,16,63,+183,115,79,162,198,108,74,252,189,54,143,0,82,180,81,145,117,236,1,243,+102,178,118,200,233,237,248,145,73,14,142,231,191,64,213,101,167,173,230,238,+161,156,40,57,58,64,15,218,129,82,205,221,81,197,109,234,48,155,124,187,+72,158,134,38,76,141,192,192,142,103,139,35,151,63,204,231,53,113,247,90,+22,109,234,117,64,208,84,2,46,194,52,133,240,110,116,195,205,52,82,55,+116,45,229,23,93,41,255,3,73,60,64,198,194,165,104,106,150,26,141,166,+214,115,213,186,157,141,191,97,147,26,115,230,147,255,236,171,253,140,214,67,+201,80,77,143,118,16,229,25,198,4,26,19,47,22,60,138,235,107,143,82,+58,64,250,126,148,62,75,132,116,51,95,168,66,61,202,23,126,153,150,250,+129,198,176,40,43,95,238,69,28,252,92,167,125,106,104,99,134,51,69,108,+120,13,135,112,117,164,183,110,211,182,105,70,178,113,229,203,92,207,140,173,+186,60,128,249,214,67,240,54,15,166,250,194,161,162,197,38,16,209,215,163,+184,48,165,154,244,69,141,126,168,89,217,162,104,174,225,73,129,232,201,190,+139,117,230,23,111,100,198,62,154,236,49,205,186,187,239,44,69,131,0,54,+122,31,190,102,121,34,182,215,191,75,30,88,83,90,126,222,22,234,41,62,+72,252,44,125,111,133,149,169,46,192,126,223,155,92,127,215,9,93,238,202,+135,100,201,10,166,130,116,182,51,236,126,112,184,1,57,144,139,195,237,27,+214,224,237,145,92,108,135,95,4,88,146,205,5,90,223,150,54,173,175,36,+70,40,20,15,15,173,111,228,167,198,176,231,77,6,62,235,15,57,85,111,+31,129,80,50,159,88,15,207,21,86,159,26,164,18,47,75,4,43,54,95,+143,253,208,81,172,44,91,49,97,48,80,33,162,91,33,90,176,232,175,203,+51,211,96,46,149,237,143,176,235,177,70,125,169,236,255,211,129,9,70,183,+87,51,42,177,81,34,66,243,235,135,156,196,125,30,1,183,94,199,148,168,+136,213,224,32,143,143,161,122,19,89,77,150,218,68,207,54,211,81,79,174,+157,176,115,11,63,250,188,121,124,235,63,216,119,104,5,116,146,40,195,35,+59,158,121,147,189,28,227,57,236,244,70,209,215,157,12,139,1,37,213,118,+185,108,53,127,74,182,171,190,105,231,42,207,34,197,91,69,251,239,75,58,+212,208,43,146,167,153,4,175,28,206,240,229,78,62,128,76,26,29,110,200,+90,49,69,200,45,33,96,232,165,190,98,139,199,110,111,30,205,192,174,96,+20,49,173,207,132,25,226,158,102,175,45,53,101,3,14,183,51,57,173,203,+85,208,136,203,46,31,84,45,186,8,63,151,141,40,129,194,225,220,162,65,+80,88,52,133,168,150,107,148,185,170,240,16,122,48,212,43,142,218,138,231,+61,12,153,126,127,128,179,107,49,173,9,87,243,15,86,81,186,27,123,130,+149,160,34,3,124,214,91,214,230,188,214,95,181,189,178,21,238,179,47,213,+200,68,155,73,210,48,106,61,116,20,195,206,74,129,210,6,154,133,226,75,+35,26,95,126,100,206,69,219,115,160,103,97,158,47,168,1,172,151,83,208,+241,47,105,134,43,149,109,116,132,113,61,169,62,213,254,35,225,126,231,83,+82,46,235,83,124,212,111,220,158,190,13,11,123,129,142,54,47,107,119,177,+249,223,36,254,136,194,32,194,215,214,16,205,11,30,145,29,13,80,106,247,+196,14,61,87,158,131,82,207,174,138,17,238,246,95,92,39,133,118,33,232,+63,107,26,182,230,36,236,98,161,69,176,83,226,100,34,46,141,151,110,52,+210,175,185,132,33,82,239,4,174,58,132,175,161,102,204,175,221,14,76,24,+201,87,216,114,106,77,20,233,147,219,222,184,4,178,140,199,158,79,110,208,+204,162,90,71,130,108,213,125,199,50,230,26,117,164,130,38,205,173,121,210,+101,125,200,204,92,45,18,100,225,80,119,118,211,249,62,71,233,56,119,71,+170,58,105,67,162,214,192,190,69,142,33,40,253,51,213,154,230,208,90,55,+73,70,133,242,132,89,23,80,148,20,7,250,105,75,161,121,138,75,5,134,+55,83,213,177,194,214,31,229,177,135,15,14,36,35,169,254,227,150,178,75,+204,21,241,211,245,160,175,39,134,26,252,165,67,160,224,203,43,222,213,142,+173,16,102,35,151,249,25,203,55,200,8,49,23,214,186,245,159,181,229,78,+135,205,56,204,194,133,235,176,89,160,160,47,122,77,10,74,245,36,8,166,+87,38,95,67,179,68,15,135,124,203,117,109,48,72,43,18,112,177,237,112,+93,241,49,51,249,29,56,145,15,154,93,26,185,234,142,61,16,195,219,226,+126,15,13,148,179,77,4,78,115,15,74,236,69,72,26,153,229,232,214,253,+160,148,67,57,236,46,35,154,209,216,239,21,42,251,79,19,2,187,2,75,+89,187,157,107,166,118,229,98,220,9,127,153,193,53,99,20,61,114,50,91,+242,76,37,59,105,246,158,168,10,79,208,209,177,143,34,141,204,76,151,19,+253,53,254,177,235,198,251,174,210,163,202,139,76,171,115,170,241,192,103,91,+186,40,221,73,211,157,60,167,156,194,227,98,169,124,40,153,156,122,173,124,+152,28,80,112,113,185,249,72,144,91,95,171,95,60,181,132,241,208,133,182,+108,218,85,84,210,167,34,7,127,113,245,87,17,83,127,196,63,23,224,38,+52,155,128,198,92,101,146,239,177,135,120,218,72,219,205,48,145,102,155,72,+83,122,36,209,227,138,131,125,69,15,193,105,14,19,236,219,22,31,179,254,+37,174,115,241,138,207,89,129,127,218,83,104,59,245,149,186,9,245,58,39,+168,135,116,255,154,57,205,116,55,63,74,182,121,61,229,251,242,128,178,63,+173,19,193,102,37,250,32,169,189,116,98,111,249,89,117,124,24,35,35,145,+119,153,27,199,95,148,57,185,125,183,149,118,230,160,85,74,161,33,46,96,+155,148,0,47,153,230,23,18,81,5,180,49,216,39,201,134,73,200,69,228,+41,154,22,171,152,60,89,229,154,79,130,203,167,132,195,64,229,25,50,74,+38,17,77,213,243,94,38,33,60,196,166,143,33,185,226,53,3,180,70,75,+86,37,149,96,196,63,97,16,137,221,176,124,242,47,180,178,111,150,42,184,+145,158,169,161,175,253,227,216,197,40,16,55,212,249,245,237,87,71,245,68,+235,225,19,105,85,198,217,68,189,16,101,186,207,45,9,246,191,3,43,79,+194,154,94,209,240,94,51,247,48,90,38,200,154,117,119,240,108,156,15,42,+87,175,129,108,205,176,80,193,114,206,146,35,140,101,136,154,58,232,87,185,+205,183,157,91,148,11,127,71,68,23,196,119,67,158,8,19,223,200,138,241,+204,134,157,181,16,77,1,211,193,251,100,158,111,231,118,233,64,87,111,117,+113,68,194,250,71,222,77,208,33,157,206,236,143,128,94,161,234,45,251,38,+231,166,168,110,84,121,25,47,147,134,129,204,99,108,223,114,136,30,241,196,+109,32,166,11,62,159,218,40,109,93,153,100,80,150,38,132,236,119,112,173,+97,127,217,244,217,129,116,118,148,56,169,213,11,149,78,67,13,232,41,198,+124,216,202,168,196,246,129,148,167,170,103,198,176,36,177,45,139,124,97,189,+243,104,191,130,159,44,180,218,98,3,136,231,32,96,218,143,174,30,251,168,+167,128,23,173,5,236,114,165,159,69,225,156,90,12,95,151,31,182,83,212,+217,125,85,99,58,255,70,249,180,170,102,45,128,134,4,157,37,52,114,145,+86,176,97,215,96,19,98,191,117,248,132,108,111,184,135,150,225,228,27,123,+162,11,69,134,121,9,107,244,75,24,51,18,165,250,205,208,45,144,125,125,+88,35,100,36,127,99,64,103,211,42,205,8,53,243,36,80,41,92,197,241,+68,83,24,69,54,22,208,78,250,9,170,156,116,5,23,205,140,175,171,69,+192,74,217,245,60,226,98,197,204,244,114,1,92,71,54,29,202,25,181,249,+183,145,255,118,127,210,148,173,249,195,174,132,70,29,186,185,175,148,163,118,+122,3,205,210,248,155,145,142,209,236,249,226,255,76,216,252,85,228,117,210,+88,66,151,28,98,160,180,18,72,145,50,251,220,105,61,104,185,135,108,7,+140,22,144,11,215,1,228,192,144,193,21,138,50,153,157,100,72,196,253,66,+13,213,59,50,21,172,156,166,124,152,6,25,73,210,47,38,120,90,82,30,+101,78,66,142,42,9,231,116,144,45,227,166,47,44,89,164,126,67,112,90,+176,154,72,239,192,122,171,138,178,143,199,54,106,171,85,53,194,220,48,113,+118,28,4,116,237,251,162,229,225,54,250,52,57,222,116,238,138,223,131,143,+7,206,64,225,184,250,178,130,176,230,140,146,207,8,25,60,113,52,168,94,+175,40,245,141,164,137,139,158,68,202,253,34,186,170,252,95,235,201,93,36,+67,46,61,138,144,110,224,150,235,73,201,104,97,179,124,32,139,30,214,24,+84,134,188,71,115,254,168,159,161,242,160,149,158,17,205,50,178,93,68,8,+144,54,103,255,85,179,243,44,16,142,214,100,73,116,253,144,222,133,197,59,+226,67,255,19,192,111,73,18,85,135,32,41,107,206,161,59,157,233,131,68,+21,36,70,138,224,141,212,151,110,253,182,80,227,79,40,100,140,247,234,142,+244,132,2,88,34,250,28,237,143,89,245,72,108,60,147,91,6,140,156,60,+180,31,59,157,50,177,127,111,60,30,174,130,245,41,162,59,14,83,50,71,+13,136,129,37,242,88,160,48,228,65,129,77,102,60,125,97,50,120,135,249,+140,54,252,51,120,207,198,167,56,159,172,238,231,103,12,162,35,244,183,70,+71,123,225,188,178,162,76,140,171,240,27,193,116,52,82,136,103,133,200,132,+165,38,82,30,57,50,15,197,221,198,61,182,236,8,164,35,174,251,75,56,+0,116,82,182,59,196,247,167,81,250,153,119,117,38,25,181,63,74,183,218,+13,6,172,137,80,214,64,5,208,200,200,25,34,70,43,252,98,67,67,5,+224,0,251,193,200,27,244,20,159,245,139,0,4,240,55,117,197,191,230,59,+20,71,73,198,34,131,155,40,47,208,17,235,84,105,8,209,247,70,253,37,+150,57,123,133,192,213,206,118,75,61,184,158,188,240,242,235,185,136,149,172,+60,75,214,226,48,55,198,197,228,18,92,69,35,122,146,174,205,244,137,159,+67,171,27,62,238,25,171,163,135,206,186,107,6,54,186,59,77,136,157,38,+65,207,78,236,110,95,67,125,96,95,59,22,125,74,12,21,46,69,150,43,+223,65,112,140,38,177,16,105,47,8,192,114,97,159,180,179,179,89,111,193,+98,75,191,27,168,189,194,66,162,165,16,202,126,36,251,217,245,114,26,137,+173,106,48,3,19,131,130,61,204,60,90,209,75,37,113,63,140,90,82,64,+85,64,83,55,50,240,146,80,214,211,130,69,130,158,71,31,137,221,140,147,+146,255,127,167,89,185,118,230,204,222,5,143,222,116,183,54,54,243,209,200,+224,250,143,236,226,250,121,138,42,244,250,230,48,21,105,206,58,194,218,49,+48,106,255,159,71,249,1,96,193,246,95,122,158,4,76,13,66,173,182,56,+112,216,92,66,183,183,227,50,44,142,108,238,213,129,176,51,47,64,230,216,+45,137,176,210,196,31,81,116,8,68,16,22,200,100,75,50,197,100,144,82,+32,246,151,24,31,172,49,98,193,126,55,14,72,196,243,1,133,230,208,93,+206,133,120,223,195,171,165,131,128,139,82,85,50,10,122,150,39,120,23,212,+11,206,160,147,228,20,61,32,70,157,203,231,248,155,16,247,154,187,248,196,+45,255,208,83,43,142,110,239,222,27,85,101,116,76,231,187,106,5,34,231,+34,239,255,107,54,89,53,201,206,56,208,175,217,25,236,152,96,4,93,207,+111,212,134,41,250,47,38,238,171,215,96,174,19,214,173,47,225,209,151,217,+151,130,106,151,43,209,222,43,204,16,46,31,60,41,252,168,43,147,204,55,+12,94,238,43,45,160,198,35,0,14,58,202,48,226,75,134,115,177,185,81,+219,13,33,245,143,80,44,27,85,214,69,119,113,153,92,28,171,91,246,48,+186,247,115,57,85,188,55,68,173,207,207,229,110,81,222,81,168,50,113,178,+157,125,190,117,52,243,60,114,156,193,194,242,187,70,210,21,246,191,54,97,+225,37,125,46,150,220,106,116,201,44,189,210,60,196,103,248,43,248,210,155,+225,229,225,240,37,32,138,236,232,42,177,131,188,129,36,162,219,199,120,166,+150,194,116,73,85,79,82,113,213,202,236,52,48,144,153,63,136,212,254,40,+105,141,87,136,195,156,148,114,91,152,104,77,193,33,97,229,112,138,85,255,+246,186,92,196,101,10,31,3,3,165,0,112,92,146,88,178,198,135,229,64,+66,10,169,21,154,88,98,57,195,57,4,12,57,166,45,30,202,248,181,223,+226,109,89,197,90,227,207,150,1,149,208,146,148,90,68,232,164,211,149,42,+198,79,232,1,36,174,152,203,156,48,97,254,28,62,87,68,95,151,173,92,+105,213,63,22,38,238,107,247,186,123,136,188,110,157,111,83,160,78,40,19,+146,133,238,246,5,198,45,181,56,22,218,16,27,20,222,129,33,12,134,170,+115,248,121,19,103,242,24,152,220,90,2,52,131,99,143,38,102,35,45,251,+202,244,99,119,240,133,60,227,100,39,95,104,78,9,187,174,14,53,245,106,+61,211,132,22,111,126,213,13,153,104,22,3,165,249,60,35,139,255,132,246,+171,140,116,139,171,29,73,240,149,151,99,175,92,37,49,12,54,50,89,183,+168,221,164,211,56,246,222,185,204,181,71,162,187,35,142,177,49,80,97,23,+95,204,229,224,84,57,187,27,142,179,149,21,34,233,120,187,105,230,127,207,+47,55,160,132,188,24,202,58,76,7,184,27,182,195,149,42,122,248,208,243,+244,26,237,15,78,65,71,237,238,125,214,139,0,102,160,23,158,151,119,40,+201,22,47,99,112,247,125,174,85,189,55,218,121,237,41,110,119,10,69,237,+84,16,227,193,93,114,50,137,243,144,3,32,33,99,226,246,134,97,175,178,+241,84,96,75,40,129,145,218,199,169,247,80,251,110,127,207,161,251,156,69,+103,176,192,189,223,10,39,158,96,40,228,215,188,80,105,177,187,37,27,162,+218,43,34,235,67,225,140,193,187,88,53,11,181,67,105,219,198,169,221,25,+72,102,89,245,199,169,35,92,15,241,157,108,234,183,118,240,83,30,107,167,+86,67,218,124,221,217,190,180,55,182,208,211,168,3,101,26,85,142,145,244,+192,67,135,88,144,93,91,92,44,253,63,73,226,164,191,14,91,237,232,37,+24,23,174,69,4,62,52,214,34,178,172,57,121,38,147,8,181,201,34,147,+75,220,221,41,189,221,217,181,77,216,55,182,91,51,18,0,1,93,49,118,+20,33,168,161,37,188,100,120,115,249,135,69,244,93,33,175,96,247,0,100,+230,35,91,206,210,88,25,214,18,102,118,53,28,176,119,159,93,111,162,42,+67,94,139,129,194,203,63,255,55,53,240,123,27,197,238,35,4,91,175,3,+8,12,201,198,22,158,225,38,86,35,3,219,8,220,161,81,213,32,136,27,+155,251,47,157,182,197,61,53,227,228,205,211,207,151,196,49,189,14,60,204,+171,151,34,170,99,120,67,149,92,117,40,109,158,156,56,247,102,143,88,209,+127,15,190,126,188,64,194,152,33,77,19,82,5,3,19,66,77,171,55,68,+43,30,38,49,49,128,92,205,26,247,3,16,52,163,245,136,247,133,0,157,+236,21,149,168,99,92,153,235,110,209,228,196,1,170,187,111,40,31,164,165,+99,172,148,47,107,221,210,228,254,111,109,108,249,205,3,129,9,27,86,38,+66,78,254,218,71,237,223,153,6,198,47,113,20,193,10,55,181,179,234,70,+51,252,124,83,79,215,124,237,127,35,200,172,176,54,47,130,122,10,151,214,+8,29,90,13,34,103,224,177,78,167,41,225,198,121,228,45,109,177,42,228,+232,199,149,252,167,81,69,240,115,134,12,247,228,242,151,180,138,80,74,163,+145,223,140,186,76,217,204,70,217,28,83,36,224,220,86,59,144,169,68,24,+181,43,249,254,244,131,176,166,162,26,59,154,102,255,5,229,111,43,213,222,+206,136,95,118,100,206,134,251,90,99,101,225,119,171,203,253,248,218,238,225,+216,180,145,186,214,168,224,244,49,131,49,102,246,225,27,31,206,1,38,111,+237,69,129,108,84,52,157,241,90,219,34,5,1,40,132,162,125,33,183,139,+153,192,0,196,42,77,152,78,182,102,122,155,233,252,101,54,178,118,21,17,+184,106,17,188,251,79,142,169,22,147,164,88,24,115,82,63,170,226,155,12,+196,54,186,115,187,53,150,215,225,241,117,115,254,5,66,30,123,181,21,201,+159,57,44,240,56,95,92,225,17,193,128,248,132,73,219,197,24,34,76,165,+196,188,11,231,73,150,68,117,110,38,95,240,60,128,122,200,160,170,83,225,+18,32,191,170,153,113,124,58,111,119,61,229,103,3,191,117,117,246,183,38,+166,132,111,50,170,76,229,77,202,84,106,241,131,128,121,149,149,168,131,140,+57,3,101,75,17,44,59,22,188,71,187,195,237,90,57,221,203,104,231,117,+72,82,149,0,124,222,73,233,244,190,27,132,172,3,178,17,34,183,76,108,+9,138,136,224,143,236,229,19,230,153,149,146,172,23,6,193,128,69,114,153,+48,146,60,199,113,75,202,175,54,56,4,65,150,152,109,177,49,20,103,25,+211,90,191,206,192,38,45,96,143,6,184,179,121,6,12,32,65,174,66,101,+202,6,117,49,33,32,9,189,143,145,167,210,148,165,166,113,231,115,201,48,+218,234,164,18,78,59,83,218,118,22,10,64,13,198,27,94,8,17,138,146,+91,172,206,202,100,122,17,206,51,121,221,29,45,125,134,131,148,255,122,50,+6,154,143,168,115,50,46,4,197,73,64,223,255,193,87,71,70,204,99,186,+54,192,143,86,131,19,154,88,1,131,47,104,45,220,134,117,75,91,97,61,+165,166,132,254,117,11,236,50,97,216,10,25,102,149,157,41,79,210,244,248,+156,179,181,32,135,184,82,23,201,63,123,141,86,130,129,26,42,194,82,51,+190,48,91,103,46,37,39,219,170,242,75,216,240,87,89,158,216,34,210,179,+114,69,219,113,111,101,251,192,24,150,246,152,183,41,10,250,203,251,29,17,+111,12,242,251,105,149,223,97,129,233,129,235,239,36,29,36,64,239,199,23,+179,115,148,115,19,122,126,47,122,223,213,105,227,112,59,206,131,224,67,173,+248,120,212,175,67,207,180,124,55,84,206,24,91,171,38,192,75,190,167,249,+112,240,83,229,168,245,141,207,67,131,142,71,14,1,128,168,167,248,141,152,+213,138,38,1,210,143,122,191,188,118,38,206,148,203,79,247,24,125,153,226,+71,181,69,88,167,202,131,213,46,204,70,197,124,193,179,115,82,25,212,175,+23,228,187,139,11,100,90,108,175,224,208,83,77,126,166,163,26,170,181,68,+35,228,244,52,255,61,199,45,218,80,163,95,195,5,51,223,152,123,132,20,+204,19,154,255,82,138,157,185,44,158,214,225,171,103,158,187,175,147,36,204,+154,93,162,117,7,40,90,30,79,176,186,162,135,167,14,100,237,160,215,198,+158,54,203,171,14,209,6,151,31,14,38,249,134,135,51,69,24,163,72,120,+105,234,61,254,222,182,215,147,50,87,60,56,222,31,119,161,43,237,175,78,+71,116,125,200,179,244,138,182,172,166,163,48,215,147,241,104,34,210,96,152,+61,148,21,69,11,178,114,13,176,178,212,152,174,75,46,26,240,65,209,42,+98,186,54,50,133,12,9,47,49,236,246,193,196,42,49,159,137,166,64,196,+245,111,120,40,140,54,40,166,128,215,21,44,78,82,179,251,95,134,65,163,+17,7,242,143,193,185,0,117,199,131,33,169,165,83,210,128,142,25,213,234,+252,65,237,113,135,245,204,100,51,114,18,169,60,167,2,20,93,76,104,247,+74,140,29,60,62,252,112,195,250,113,118,226,152,108,220,172,56,172,11,44,+38,11,53,82,83,201,7,92,65,121,234,102,163,214,98,202,76,255,83,43,+87,223,154,82,30,121,247,71,129,59,143,146,54,28,182,140,46,69,162,44,+22,94,158,241,127,172,169,33,162,145,110,50,185,15,119,126,51,106,33,168,+191,34,129,207,89,245,211,122,173,158,43,71,254,107,173,55,235,225,57,254,+9,14,29,157,133,107,33,114,123,125,131,75,94,226,68,225,252,147,103,14,+109,27,184,108,101,189,4,17,84,5,48,214,99,38,107,119,189,93,243,119,+65,4,43,17,82,86,207,149,32,111,61,184,154,253,243,136,40,20,83,152,+43,255,250,135,211,9,140,80,225,97,50,83,197,140,212,221,229,35,165,155,+98,88,40,218,241,110,41,170,221,39,77,61,254,89,192,36,202,67,42,131,+202,156,226,106,32,74,236,120,229,76,216,206,26,102,176,189,45,214,247,188,+52,13,49,60,33,236,158,192,215,247,201,174,148,38,25,7,225,121,183,76,+183,82,193,64,253,178,86,139,223,137,188,72,16,74,122,134,133,200,48,113,+105,97,92,29,219,242,77,87,66,45,199,178,10,223,213,90,251,191,159,225,+7,44,141,28,155,140,253,29,44,40,85,244,21,148,23,37,249,227,246,173,+19,186,15,6,187,41,29,182,68,126,46,177,68,134,71,151,172,240,151,124,+223,84,112,218,113,254,142,249,40,164,250,171,111,72,8,190,219,27,155,81,+72,164,112,74,99,78,6,134,164,75,119,86,53,35,244,2,213,185,123,92,+114,6,98,148,229,152,10,215,251,200,170,119,91,134,242,129,209,76,198,227,+173,51,5,248,242,76,75,168,255,100,52,136,152,194,50,188,90,117,109,40,+128,244,154,17,91,177,74,58,32,177,248,73,141,91,170,91,225,201,88,183,+200,9,50,244,161,163,24,151,182,4,234,139,192,43,108,169,147,80,146,227,+15,101,123,210,41,99,172,182,174,188,29,209,148,4,255,96,227,231,219,73,+57,246,46,106,168,51,203,91,9,4,105,157,22,138,253,94,196,152,202,52,+250,196,250,15,3,80,246,61,249,2,62,80,97,24,37,210,202,153,221,61,+40,182,162,24,54,107,88,30,221,255,233,86,155,80,122,19,37,241,219,228,+81,223,144,1,218,175,62,146,235,227,34,216,248,68,156,112,194,85,44,199,+101,210,38,62,238,131,20,221,186,151,52,254,200,246,176,118,138,115,99,223,+86,159,43,249,51,149,80,150,183,196,55,163,227,192,208,217,184,167,22,87,+32,224,27,149,218,84,110,173,84,48,220,25,76,18,217,58,61,192,225,105,+13,134,44,130,105,95,89,121,128,210,190,123,28,144,120,202,65,221,76,74,+51,108,53,8,184,246,123,19,141,187,128,204,180,121,80,3,149,40,29,153,+135,169,71,114,69,153,189,68,151,225,46,200,152,34,157,10,125,167,123,235,+87,51,161,148,193,112,70,121,241,1,202,147,4,192,136,246,9,36,209,5,+189,69,176,254,36,160,0,212,123,175,13,26,39,2,207,19,211,108,49,145,+247,125,157,156,148,81,199,185,233,224,219,193,246,120,199,185,190,149,187,102,+29,230,141,24,250,238,213,116,236,248,217,133,197,193,108,223,124,0,15,8,+46,243,179,36,146,150,15,109,157,77,143,197,1,34,111,70,194,149,207,212,+98,40,93,108,205,98,220,54,224,29,171,220,138,225,108,10,92,131,153,174,+188,208,154,124,204,57,141,127,249,221,28,204,225,150,151,206,200,190,27,194,+167,186,111,172,19,143,105,157,196,34,73,65,89,223,47,57,80,30,28,255,+90,124,82,229,102,143,10,11,244,117,226,25,158,255,244,98,180,9,35,111,+221,155,113,187,93,11,171,25,24,56,118,30,98,191,109,106,25,47,162,0,+250,164,69,108,71,225,241,168,177,183,159,79,182,173,82,87,103,28,62,16,+146,165,95,110,164,240,97,207,126,47,118,120,215,154,200,28,143,50,38,239,+232,33,145,229,54,168,64,223,50,45,59,14,111,199,135,168,204,111,18,204,+179,229,121,116,29,225,178,248,36,246,231,164,8,110,239,192,59,134,29,142,+131,64,189,45,229,104,4,101,86,208,139,167,249,95,126,221,7,68,100,91,+67,12,238,228,184,63,206,252,197,17,123,86,79,99,103,61,240,255,104,47,+159,138,154,245,131,113,30,71,49,112,171,215,110,109,93,225,112,88,197,118,+121,180,91,69,97,151,157,119,65,91,228,5,132,91,242,242,54,200,39,135,+47,146,215,118,148,219,208,197,139,68,35,24,57,102,176,55,14,2,47,190,+91,251,195,170,136,71,89,90,141,171,170,245,154,34,128,130,21,90,148,179,+74,174,168,21,148,113,4,227,95,57,65,62,93,213,112,215,88,59,42,18,+117,64,214,147,196,117,9,232,117,106,204,198,179,168,131,199,50,22,174,132,+86,44,138,236,143,184,21,9,228,235,244,209,35,169,177,240,39,164,59,220,+25,194,245,13,168,214,88,105,182,142,74,46,72,123,112,151,22,2,91,178,+203,124,31,73,209,66,73,89,180,156,176,142,251,156,164,61,161,179,131,4,+71,8,30,206,53,223,57,25,48,155,183,141,250,189,170,217,98,209,108,177,+55,149,24,196,229,151,177,123,244,7,145,104,119,85,212,85,136,182,69,3,+177,180,147,14,186,235,208,126,228,232,6,119,238,2,49,73,133,252,167,79,+127,66,14,175,12,82,21,227,102,220,63,152,23,104,51,54,43,163,59,174,+248,143,3,248,248,7,17,48,2,130,6,198,21,186,50,236,12,232,15,45,+53,54,66,190,186,99,147,162,190,80,217,34,91,166,114,88,194,148,55,190,+70,69,244,176,162,191,175,235,225,46,90,151,170,150,108,29,250,236,191,59,+129,149,65,171,38,59,17,153,73,190,128,30,54,34,79,153,22,194,127,101,+96,205,8,15,22,57,28,164,30,69,112,154,203,65,210,43,142,93,72,89,+54,102,162,233,57,95,41,110,180,148,37,144,67,146,2,130,253,9,18,214,+99,160,22,32,66,138,109,81,148,134,28,115,24,76,9,154,184,7,121,233,+126,119,21,70,73,155,14,4,87,71,162,26,145,38,90,35,78,50,86,240,+182,36,248,117,19,180,119,58,96,111,127,131,216,16,149,109,148,116,253,83,+6,235,37,216,29,34,146,244,241,132,145,227,136,138,34,67,24,23,111,94,+235,199,179,50,168,88,205,117,104,239,61,87,88,233,125,46,61,45,17,241,+40,153,84,203,82,39,131,171,175,218,171,235,9,176,192,240,136,215,233,12,+70,210,231,169,120,246,151,81,192,141,94,104,248,137,7,209,166,82,209,98,+87,139,52,1,175,125,210,11,169,85,95,153,111,35,234,168,203,66,232,188,+62,136,57,68,92,244,217,96,160,68,58,194,57,68,56,123,108,17,66,97,+81,198,164,94,255,209,153,43,200,137,65,134,139,78,1,52,216,45,235,243,+238,1,135,216,144,149,172,0,166,133,218,46,240,121,12,68,147,111,206,53,+71,226,127,232,112,88,108,17,15,232,169,176,29,36,13,232,180,194,76,23,+129,24,205,6,204,82,235,149,44,52,172,180,183,28,204,110,149,131,125,145,+195,88,251,198,98,81,251,237,181,129,14,47,229,128,4,77,34,60,80,73,+68,173,135,20,231,123,65,163,30,134,167,209,39,199,5,8,250,33,3,66,+155,38,151,63,109,46,212,18,67,189,218,6,141,82,255,191,104,39,234,121,+150,19,142,154,49,127,68,68,13,35,222,46,156,250,9,101,216,93,47,76,+66,148,106,120,182,155,213,24,188,89,186,8,49,127,133,187,188,56,67,17,+88,0,79,8,211,57,44,204,213,106,179,197,73,71,73,23,189,227,152,136,+173,239,106,184,44,96,149,136,94,126,254,28,47,145,178,197,43,59,6,147,+143,154,216,137,23,160,178,64,77,24,185,36,72,87,6,255,74,250,253,14,+192,103,238,223,120,232,62,239,60,181,233,181,57,3,250,237,120,207,76,225,+196,171,228,234,102,241,40,192,175,33,123,190,14,222,81,157,111,158,42,221,+198,229,195,44,87,215,120,187,32,236,236,20,165,173,214,34,220,27,47,38,+20,71,70,251,230,11,119,33,3,98,213,189,1,220,199,198,21,63,74,194,+128,245,30,68,210,136,192,127,196,125,5,177,184,26,115,202,71,85,80,218,+144,224,188,203,92,131,11,163,117,234,230,50,198,114,35,244,255,178,213,185,+219,138,94,210,228,118,249,241,130,32,51,215,160,56,169,198,228,251,6,47,+140,149,157,10,25,79,109,5,13,218,240,2,208,193,52,124,39,165,168,100,+42,167,33,59,59,179,237,8,30,40,167,251,139,115,176,111,31,18,117,90,+214,249,16,155,236,113,242,106,36,247,173,40,54,186,143,159,53,17,22,33,+93,126,7,131,192,188,83,153,104,154,94,150,74,4,143,251,255,175,90,150,+106,3,172,227,78,46,241,126,108,232,233,133,120,50,151,54,50,43,23,107,+129,59,171,152,213,91,240,208,148,237,54,63,22,135,214,198,243,136,68,173,+37,165,50,179,41,127,96,202,183,39,122,164,157,138,25,242,168,201,129,136,+8,213,167,210,86,26,7,102,114,191,78,188,164,33,132,160,65,55,125,215,+88,76,207,124,224,174,18,101,84,1,155,187,37,200,189,167,255,14,60,177,+162,161,207,35,18,165,74,12,205,209,104,104,248,131,141,127,208,117,4,228,+251,40,52,166,72,29,23,231,137,42,214,43,243,6,137,14,192,136,111,142,+62,4,136,137,158,181,108,206,27,35,60,135,184,238,112,146,224,123,232,254,+73,161,8,151,54,238,179,49,69,141,5,8,170,124,173,155,248,54,195,223,+237,101,143,17,176,47,241,9,140,183,244,9,7,215,25,152,157,155,138,1,+142,96,85,146,173,127,167,226,156,155,216,137,43,163,34,3,10,22,191,202,+239,48,156,118,141,132,38,111,47,212,24,120,60,234,236,100,124,45,135,196,+24,168,44,5,77,98,105,56,28,72,38,244,219,65,210,159,178,74,143,215,+188,241,241,41,44,13,141,185,68,247,201,177,152,57,61,41,194,51,82,228,+128,152,157,248,26,188,56,139,100,28,165,14,205,72,191,173,1,215,177,141,+66,126,185,228,240,219,42,205,241,154,134,105,6,116,219,118,136,123,235,160,+169,13,39,38,17,244,125,183,48,221,80,143,196,125,49,52,213,60,32,195,+102,29,73,113,219,207,51,159,110,166,188,234,190,164,25,243,216,121,149,177,+238,98,121,213,134,132,173,142,164,7,182,102,148,76,69,169,168,118,29,127,+30,188,109,39,131,193,139,100,12,118,187,207,63,48,58,96,3,253,176,51,+24,242,104,80,244,207,132,147,188,242,79,162,251,7,81,117,96,253,180,72,+202,81,127,39,40,22,200,241,138,31,130,207,218,161,208,103,130,37,69,237,+49,79,208,83,58,136,216,81,86,9,242,246,30,17,188,198,180,27,131,156,+117,154,67,9,44,83,82,192,182,118,192,192,136,74,234,183,78,190,52,83,+148,45,167,21,35,59,89,228,122,197,171,58,45,117,24,70,59,216,240,75,+149,227,57,38,235,4,100,38,16,142,145,194,232,173,134,83,252,219,223,253,+133,1,51,70,147,177,190,253,248,87,146,39,196,57,46,232,75,255,174,194,+142,123,17,125,80,241,18,148,185,152,191,155,195,185,50,37,43,78,113,89,+21,220,24,152,20,128,182,253,95,180,120,126,185,146,106,169,34,17,118,35,+241,49,93,164,29,106,6,65,224,6,102,126,201,82,252,207,185,44,113,44,+115,127,6,44,236,174,15,177,3,151,205,233,108,5,159,206,152,104,72,172,+51,242,140,79,123,109,46,31,61,166,61,29,92,168,119,185,241,82,30,152,+196,202,135,158,96,28,25,42,238,14,64,59,190,182,16,238,227,183,111,218,+209,198,16,170,86,46,255,13,36,151,135,97,217,214,252,255,108,241,252,173,+129,43,224,92,75,157,135,161,35,65,160,47,52,234,120,57,154,5,122,255,+24,160,125,18,234,53,38,117,99,162,57,37,60,28,217,185,30,176,169,105,+210,141,10,105,91,89,98,90,227,188,29,189,247,221,57,221,40,80,239,223,+141,5,60,120,17,33,245,167,220,139,171,86,35,238,52,79,9,207,223,139,+12,225,183,14,143,78,111,182,127,26,11,19,177,24,48,211,71,112,234,120,+247,137,111,244,25,79,164,45,22,192,17,165,97,221,229,105,173,178,91,218,+31,216,24,253,123,37,50,180,180,134,77,36,2,182,149,243,138,186,250,241,+37,162,176,145,102,232,33,75,149,244,26,159,221,23,156,84,210,214,92,89,+206,239,163,163,160,81,239,91,181,50,130,225,110,54,232,183,176,250,62,47,+122,59,134,201,27,194,152,162,43,71,127,18,155,119,1,64,183,175,47,166,+229,90,242,32,54,147,14,2,87,83,250,1,220,63,199,156,70,238,108,239,+132,146,44,127,213,218,143,255,164,20,212,222,126,35,237,43,54,111,6,190,+53,250,144,83,14,28,160,170,180,61,33,178,201,147,140,110,83,225,14,176,+145,127,20,90,38,145,208,188,239,54,18,185,38,247,172,181,80,101,242,88,+51,159,243,52,171,32,134,140,165,242,188,24,93,63,249,138,192,122,167,68,+44,221,17,129,107,27,131,49,191,211,157,103,49,7,195,154,217,217,14,60,+194,252,194,240,45,172,201,92,146,214,127,140,182,240,57,63,134,247,218,142,+141,151,46,197,242,249,128,210,107,42,60,196,208,36,63,96,219,106,12,250,+104,242,222,160,36,3,120,164,196,199,47,27,234,112,212,7,177,95,96,182,+51,230,190,101,156,85,25,97,218,0,235,94,108,22,85,108,170,15,201,13,+108,137,40,92,220,85,111,88,94,52,61,214,10,201,133,118,224,246,89,128,+66,36,175,122,227,77,1,111,251,49,13,213,230,184,104,236,205,180,201,254,+148,51,127,87,61,172,184,134,130,75,195,93,157,43,190,156,27,98,171,224,+69,240,169,172,19,247,31,205,115,13,51,137,187,72,11,215,226,193,26,215,+207,101,140,145,249,87,197,179,222,55,80,1,200,245,65,170,72,53,230,175,+120,103,249,176,183,84,30,207,192,109,241,16,233,177,122,51,217,58,156,56,+243,131,135,9,249,37,46,54,48,109,236,159,68,45,212,150,74,13,48,216,+154,161,138,71,168,130,123,123,131,173,172,147,221,60,52,254,250,147,21,213,+65,207,154,211,154,153,48,103,56,66,60,48,144,57,8,10,48,90,59,181,+17,77,190,125,174,125,107,7,231,189,29,91,98,201,72,96,244,163,191,114,+153,80,57,208,103,155,241,17,248,248,119,132,175,162,216,165,227,76,114,130,+211,28,55,233,205,152,185,45,108,47,108,104,62,119,168,47,246,230,243,61,+172,90,3,34,169,129,109,136,185,170,229,214,26,122,81,37,20,124,158,40,+220,10,21,9,231,8,158,8,125,100,161,123,209,225,234,115,3,90,45,169,+37,171,40,72,76,44,64,56,164,203,133,202,146,67,78,154,250,225,141,52,+213,50,114,4,140,108,120,100,136,81,170,253,231,129,119,131,127,28,158,227,+22,141,245,75,117,111,239,254,237,40,196,88,108,168,223,167,239,167,38,129,+122,97,166,230,93,65,40,72,117,207,180,54,203,30,70,150,63,70,129,9,+254,102,13,229,221,75,51,156,108,124,25,201,23,249,162,73,137,91,226,13,+199,183,181,22,75,206,203,229,41,175,139,46,41,100,229,146,21,74,89,90,+156,78,98,199,236,229,148,133,117,192,235,144,122,228,79,253,116,101,110,248,+228,96,141,171,194,92,202,175,246,5,37,56,13,109,59,62,42,141,222,157,+165,34,180,174,101,200,239,194,195,63,232,103,99,145,230,115,173,250,121,226,+0,200,21,124,7,245,153,204,204,49,153,35,76,192,188,110,40,237,14,184,+49,77,41,86,109,97,213,92,15,216,129,23,83,9,59,215,241,75,13,95,+17,128,129,254,141,197,181,39,197,98,206,176,92,151,104,13,165,214,1,47,+177,70,117,63,149,231,152,168,192,92,210,218,189,67,115,34,253,41,79,136,+32,191,51,122,249,33,147,56,17,102,114,124,197,214,151,141,218,145,0,177,+235,240,221,41,139,232,133,37,218,70,86,93,205,14,80,5,119,58,45,153,+8,191,179,85,178,3,202,152,217,196,214,57,224,200,225,20,111,107,59,100,+216,154,97,244,137,164,120,113,69,208,114,140,182,239,122,123,66,221,84,114,+198,63,254,211,134,26,15,99,177,64,220,156,15,250,215,64,202,170,90,66,+97,135,214,218,150,49,61,88,169,226,52,146,115,41,174,165,45,55,236,20,+250,148,109,162,255,81,4,152,112,251,211,75,173,61,203,238,116,63,47,253,+195,127,102,79,24,129,125,29,25,114,153,219,67,88,30,40,63,250,247,123,+78,85,179,109,184,151,120,46,48,69,176,99,45,135,143,68,74,101,229,2,+47,45,187,28,238,67,248,182,234,176,131,89,248,32,41,84,174,187,169,248,+151,106,224,47,2,145,209,160,57,140,78,181,43,92,123,100,2,171,174,238,+204,80,169,188,208,41,218,253,20,249,135,94,17,15,50,26,19,221,115,194,+36,30,199,204,248,119,235,196,48,198,44,35,159,242,208,213,8,221,133,183,+50,43,111,221,180,2,199,181,134,33,13,201,189,105,186,123,77,230,236,209,+173,252,254,135,26,18,15,152,128,66,60,120,237,242,29,27,58,113,182,183,+206,97,176,117,111,252,59,252,13,155,67,109,145,12,119,180,98,97,227,135,+44,102,202,80,69,146,126,44,30,179,220,26,174,229,29,224,183,120,125,112,+155,96,226,194,206,48,222,60,253,179,59,31,212,60,191,83,115,157,200,9,+118,88,58,2,51,112,86,165,117,7,133,186,69,180,71,92,216,197,58,174,+56,23,251,191,14,172,99,53,84,173,146,203,170,80,80,44,228,55,146,13,+147,146,148,99,185,116,196,173,123,220,92,223,157,220,171,5,117,172,98,150,+144,134,183,147,85,188,222,200,182,4,126,19,22,115,239,169,206,252,232,71,+107,15,162,255,101,86,19,51,109,32,48,18,54,89,20,167,133,168,140,135,+233,210,254,150,209,252,228,91,23,136,29,220,253,97,3,69,174,10,75,188,+101,82,26,169,182,143,209,102,176,216,126,152,142,226,230,64,96,63,0,195,+230,37,106,66,58,141,70,63,102,106,200,151,129,74,165,230,248,39,68,184,+6,86,87,15,208,172,135,92,27,75,215,165,173,17,72,207,231,248,215,163,+180,182,108,25,236,116,62,201,175,248,120,125,193,76,62,86,20,129,99,4,+216,57,12,38,185,27,109,229,79,95,29,29,242,135,84,25,157,149,183,66,+118,214,232,193,31,140,27,26,236,197,217,218,2,98,151,185,6,123,114,217,+0,191,219,186,250,148,135,43,200,142,197,140,9,149,91,167,136,155,209,45,+201,248,203,228,10,78,109,143,202,117,244,216,205,40,211,202,224,96,192,225,+228,221,219,103,165,189,252,8,123,180,129,182,127,75,115,41,203,187,73,229,+242,230,191,125,27,5,34,15,246,253,157,9,73,174,91,145,141,162,193,12,+147,247,215,245,238,237,184,179,199,53,158,130,99,199,114,17,137,241,161,2,+124,172,60,169,251,51,136,135,28,3,187,70,24,58,143,181,108,51,109,70,+220,148,194,77,219,95,206,80,235,149,88,221,122,244,242,182,178,66,251,15,+30,122,173,68,160,224,42,170,11,17,141,215,145,216,5,99,199,205,122,129,+46,81,208,25,126,120,43,165,120,117,23,79,142,3,125,193,174,201,64,228,+117,228,162,190,194,24,74,133,176,40,48,99,140,163,209,165,100,84,62,252,+254,226,131,215,203,108,245,188,106,116,75,238,122,28,1,43,219,184,244,0,+188,68,48,187,196,18,7,100,23,48,140,61,149,132,71,42,231,134,4,153,+46,152,206,237,46,174,254,99,47,239,110,196,103,23,217,235,186,161,240,11,+251,107,202,196,236,172,215,200,126,204,222,251,195,118,91,102,69,171,98,162,+152,234,177,166,239,244,169,46,95,47,20,140,48,207,106,219,192,24,35,195,+149,162,81,144,170,130,227,199,125,195,149,10,110,213,76,254,148,49,86,168,+239,44,181,5,115,42,71,224,130,98,157,85,171,211,124,236,216,105,30,136,+77,155,59,54,19,84,210,157,67,76,170,81,239,185,102,119,103,85,159,231,+216,90,39,81,171,108,137,41,8,77,133,20,180,91,86,118,93,198,78,107,+92,97,7,114,179,244,111,206,90,123,92,214,125,16,84,191,111,163,198,239,+115,111,90,83,13,224,193,230,189,156,190,184,184,161,141,131,216,224,72,18,+205,254,22,239,164,99,93,135,26,92,100,27,100,0,210,253,17,112,179,250,+178,188,251,147,224,174,208,35,68,51,109,204,250,110,47,132,23,81,237,124,+5,126,15,131,137,155,147,246,22,205,238,179,54,70,129,22,255,129,147,150,+138,131,10,212,163,88,43,126,222,82,151,219,111,221,161,248,227,38,126,74,+230,190,234,229,86,36,113,99,1,181,212,105,4,102,184,38,87,171,205,32,+50,89,23,212,48,193,234,193,126,11,66,180,176,177,50,252,254,141,196,24,+216,86,200,98,106,212,31,181,60,39,210,226,28,29,7,145,100,228,104,155,+159,114,156,65,3,167,68,89,27,128,87,128,123,16,174,113,209,115,252,158,+220,4,18,181,123,144,115,234,206,211,166,2,197,30,126,229,114,248,169,47,+136,93,154,246,230,144,115,151,230,190,6,76,200,2,211,215,235,233,218,171,+21,34,37,122,12,43,26,218,242,223,22,16,170,100,205,190,80,155,234,148,+254,175,167,118,73,185,115,81,224,210,158,186,195,169,255,74,193,131,185,180,+18,217,84,59,169,145,5,140,206,100,49,192,82,51,196,159,238,254,150,20,+28,186,189,19,155,112,10,60,184,150,80,144,58,249,168,211,220,206,99,177,+217,137,231,125,32,122,152,209,6,137,130,96,96,246,58,148,135,170,254,239,+123,65,66,165,165,89,201,122,153,252,140,21,30,246,153,1,181,162,137,63,+178,150,101,192,143,79,222,66,84,51,117,101,138,131,197,160,236,19,244,50,+154,193,157,28,13,130,124,71,168,136,62,157,5,184,124,189,190,184,43,136,+42,195,19,108,44,42,137,66,104,204,245,19,120,36,202,70,89,95,54,136,+101,132,77,43,211,62,184,143,229,22,104,27,137,154,143,220,84,140,21,11,+151,56,50,192,1,8,65,43,249,107,213,239,241,8,23,15,38,115,248,201,+25,113,151,10,52,163,128,37,248,63,20,245,193,142,19,178,89,98,227,68,+171,140,87,103,149,131,104,64,118,159,65,155,229,243,54,129,200,108,178,225,+20,216,131,125,57,219,161,168,81,15,121,188,42,119,54,186,113,108,30,51,+111,227,18,40,196,64,50,90,248,221,110,199,88,149,26,48,49,211,23,154,+243,126,63,205,53,12,32,62,75,7,189,237,99,84,216,68,113,86,181,254,+251,193,26,110,32,103,147,234,10,39,208,107,164,72,154,76,203,229,111,214,+199,220,252,200,20,228,218,31,247,155,25,48,212,214,197,140,236,32,204,226,+46,44,106,35,174,23,94,27,136,227,194,43,197,99,197,179,204,114,135,223,+5,236,112,99,71,128,208,98,60,205,214,85,2,206,30,168,196,163,79,36,+5,98,190,81,234,230,77,31,179,179,85,84,15,192,53,179,112,202,250,4,+51,72,168,222,232,177,208,5,32,186,189,83,7,154,191,166,57,240,62,1,+178,72,194,70,84,57,50,67,214,99,71,105,20,84,138,178,196,69,62,100,+41,10,86,199,47,142,198,216,8,113,100,35,104,147,195,205,4,190,129,66,+150,12,197,103,92,140,9,24,229,139,154,132,207,37,165,157,236,237,121,166,+4,148,75,141,202,209,141,247,187,201,210,48,255,36,14,244,207,126,0,202,+70,197,81,246,187,27,129,108,121,65,238,77,133,117,130,51,144,108,212,100,+252,14,124,48,200,50,231,225,251,29,205,158,148,201,55,210,203,115,41,195,+186,201,92,66,11,102,179,77,170,158,17,48,51,228,222,153,248,146,95,141,+119,127,52,84,239,76,210,66,172,4,25,105,123,150,92,201,116,148,17,69,+221,20,58,46,212,221,148,172,107,19,188,223,108,19,125,225,78,15,116,96,+80,236,102,5,107,97,51,243,183,105,10,152,212,137,61,176,132,191,145,158,+58,227,112,78,127,94,202,151,29,202,61,101,145,169,167,104,25,68,82,200,+180,138,142,36,13,53,202,7,19,208,176,177,117,27,204,46,109,110,54,116,+2,170,97,85,56,236,157,3,232,40,235,197,199,120,255,112,208,211,134,55,+49,137,2,131,12,122,85,120,232,178,147,212,32,227,179,7,172,245,82,174,+147,218,136,143,134,112,113,75,136,243,108,28,6,228,241,176,166,71,10,204,+14,152,147,245,187,13,150,182,42,209,141,58,229,77,113,50,158,168,157,195,+81,182,34,3,193,192,230,53,32,163,25,185,153,226,195,207,196,88,82,141,+172,38,35,16,152,131,201,220,71,187,116,137,99,18,107,168,194,117,20,77,+247,131,113,158,87,30,225,223,43,166,155,29,98,22,252,82,131,189,157,54,+35,184,79,108,25,94,16,40,175,246,36,74,96,93,65,27,65,155,226,142,+151,210,153,140,41,252,0,113,177,136,58,182,104,14,168,26,72,89,211,53,+60,73,192,148,99,249,222,75,174,39,166,132,152,18,20,132,134,59,237,167,+60,13,194,91,140,90,16,4,143,47,155,202,8,33,57,102,45,255,74,111,+41,8,7,240,184,178,168,22,211,250,187,89,43,43,149,224,81,183,24,193,+149,129,246,17,173,30,76,41,223,103,105,116,92,26,233,180,86,65,250,194,+67,2,153,122,151,77,7,49,151,184,50,166,79,189,67,154,8,215,168,250,+90,75,108,238,104,37,193,60,207,231,150,17,89,185,167,132,54,44,253,110,+200,60,224,129,106,78,32,15,0,188,145,112,22,134,190,200,37,6,207,168,+171,223,236,69,246,241,222,192,122,1,110,171,171,152,204,69,152,30,32,244,+239,22,248,169,119,99,105,152,108,200,212,213,108,84,194,255,95,93,249,91,+25,175,23,40,1,122,222,153,222,168,198,5,147,51,179,55,233,119,2,78,+126,183,161,170,101,255,207,94,170,120,234,117,124,21,103,230,185,56,210,133,+145,124,46,179,180,44,194,215,178,145,42,17,226,97,9,14,39,153,33,13,+68,107,126,173,1,54,164,127,95,114,192,246,178,204,94,252,116,118,118,161,+136,85,27,18,218,148,61,120,112,184,176,188,132,149,159,119,134,30,222,120,+177,179,152,245,185,79,98,220,189,199,48,236,176,119,55,4,122,0,217,156,+202,11,248,20,173,241,84,175,143,211,226,214,71,249,54,255,11,163,151,43,+222,20,232,88,161,76,153,189,131,115,102,66,209,113,1,161,245,122,223,114,+137,90,63,147,89,51,202,203,118,32,58,116,134,21,128,233,198,228,119,73,+217,235,130,247,71,114,22,79,29,67,191,116,17,73,40,199,84,192,126,70,+238,59,115,0,235,48,111,46,201,167,56,241,158,126,191,48,45,151,250,139,+183,34,146,77,156,79,7,176,93,61,189,41,239,160,75,4,255,9,57,55,+251,164,49,208,118,245,27,109,94,13,184,166,124,93,139,134,64,175,13,133,+108,56,55,52,246,88,76,93,108,162,141,225,223,30,203,145,58,232,31,7,+151,78,75,121,255,110,221,19,154,191,126,122,118,226,114,128,221,35,193,92,+221,92,116,142,17,163,65,118,123,148,31,191,246,48,4,4,80,129,18,199,+228,107,230,190,169,72,199,32,148,94,73,132,179,93,187,74,114,212,35,106,+94,78,123,248,146,212,124,136,62,34,163,94,204,10,73,16,208,164,150,172,+41,228,7,64,201,243,59,46,74,62,161,250,85,220,198,225,101,34,213,19,+96,232,196,118,101,186,105,8,179,175,104,245,7,12,79,122,112,165,201,140,+54,15,125,112,24,251,160,169,123,43,9,50,93,251,132,40,119,212,215,219,+61,191,102,41,174,160,246,161,223,7,0,163,138,134,94,250,117,78,43,136,+213,14,12,135,254,55,118,24,12,80,188,203,136,105,0,154,179,119,222,57,+3,141,217,140,209,124,43,45,213,40,131,40,197,63,218,78,2,161,117,150,+186,254,237,105,95,156,62,120,70,94,37,6,198,160,230,204,190,123,44,216,+105,78,24,246,108,218,148,176,19,163,247,216,126,230,164,67,47,21,101,194,+77,71,141,119,159,185,145,13,156,1,176,32,19,93,24,85,244,194,123,245,+224,14,74,234,185,242,123,220,3,132,129,9,201,226,41,237,211,225,239,147,+10,145,100,24,80,185,172,3,69,231,124,157,29,59,97,145,111,209,84,61,+218,53,99,2,169,245,241,74,120,9,71,154,142,0,145,218,205,186,112,176,+18,253,59,37,50,9,91,224,209,53,147,123,60,48,61,29,236,66,124,177,+228,115,216,2,234,168,64,26,182,126,154,42,212,190,99,94,84,100,163,85,+197,199,53,207,172,129,89,223,205,127,219,119,19,179,240,215,15,83,254,112,+5,1,38,91,69,74,56,12,216,152,46,36,133,23,222,43,102,204,193,114,+183,157,128,30,242,1,133,117,191,137,160,36,197,92,20,81,53,242,226,253,+242,34,183,214,43,117,107,244,27,197,84,46,86,214,238,179,70,196,115,125,+247,76,209,66,251,187,247,187,178,36,11,224,27,151,6,206,187,27,166,222,+219,226,39,193,86,204,221,197,209,81,197,195,29,150,217,231,147,70,157,38,+193,66,95,159,170,89,82,124,253,70,209,124,183,160,85,62,13,17,210,206,+145,215,234,102,141,105,146,107,242,38,206,168,193,97,147,86,242,164,81,201,+126,55,172,228,252,158,85,18,38,91,162,142,146,144,189,107,82,115,96,49,+227,214,151,141,52,177,136,0,134,249,238,101,36,74,175,69,160,62,129,13,+244,164,141,251,174,214,144,169,128,232,152,137,178,201,230,100,151,194,82,159,+68,141,137,126,28,89,88,184,31,129,39,116,145,136,68,136,92,211,128,189,+234,31,63,129,82,252,148,60,109,90,184,21,3,215,184,208,240,21,64,29,+56,91,136,194,97,104,18,7,196,114,230,242,114,203,207,116,53,185,235,80,+54,157,244,12,7,240,23,174,170,53,99,134,165,146,166,179,42,202,250,90,+196,122,103,129,138,78,142,235,70,16,69,135,253,22,160,222,154,52,6,74,+212,9,176,130,168,91,165,220,79,200,146,30,202,87,33,224,85,175,175,249,+247,179,196,169,164,201,92,124,209,245,18,213,139,124,214,0,99,72,194,179,+98,85,43,49,45,104,123,241,64,159,201,219,66,121,88,3,255,28,19,153,+49,90,85,6,130,179,132,151,178,94,236,133,180,114,111,9,54,51,148,49,+156,21,130,249,232,44,61,39,243,14,97,92,36,91,199,221,60,18,153,33,+129,183,18,207,46,58,23,141,21,70,97,35,185,36,48,132,147,240,59,254,+221,20,14,5,69,145,146,50,218,83,106,30,191,163,243,4,204,188,9,117,+102,80,158,59,229,121,200,136,166,237,41,137,188,160,155,199,122,193,142,169,+83,198,7,225,219,1,236,80,99,109,91,67,86,103,107,189,40,206,195,220,+179,249,120,50,49,27,199,66,32,52,70,203,108,175,90,126,162,9,232,83,+160,236,224,30,204,167,210,68,70,130,124,90,198,7,246,149,222,14,24,73,+97,54,157,4,200,39,218,192,149,193,74,31,190,218,53,232,5,87,157,27,+94,204,89,240,149,186,93,203,236,10,128,158,24,103,124,19,62,196,227,52,+109,15,89,163,162,157,8,229,47,176,78,117,203,199,126,42,49,179,26,29,+8,130,36,254,92,225,151,168,180,23,79,12,248,79,69,245,67,99,34,31,+14,70,127,168,90,207,47,204,53,146,204,218,45,177,38,61,55,68,116,84,+32,151,148,63,236,90,232,10,162,144,99,95,131,55,239,239,219,150,196,100,+4,156,243,205,210,71,141,122,70,231,140,6,53,85,234,101,0,240,190,72,+113,83,242,176,216,17,105,50,131,93,247,100,118,203,128,120,56,208,1,74,+198,54,239,157,93,173,255,191,48,117,143,245,174,173,52,148,185,188,97,25,+4,79,232,224,121,11,70,54,172,239,2,15,225,131,177,199,218,63,22,10,+193,37,233,168,64,180,200,104,84,122,207,72,53,222,62,66,139,13,230,168,+130,90,107,166,96,213,150,240,186,238,227,119,42,64,99,244,227,85,115,35,+131,239,152,192,176,210,55,212,146,24,112,94,243,41,53,41,75,149,174,128,+45,89,184,204,137,53,250,223,102,228,164,41,199,136,123,80,9,21,101,104,+148,98,121,37,177,228,19,99,142,186,29,41,166,12,176,137,145,160,192,63,+229,181,204,191,182,25,244,143,135,213,116,107,226,211,110,26,167,100,147,252,+134,60,12,177,101,183,124,75,190,79,161,154,105,170,177,30,53,237,28,166,+10,40,138,121,172,232,40,22,213,83,218,235,54,198,71,93,103,165,132,67,+173,7,176,252,229,150,138,91,114,66,122,69,155,172,208,188,3,219,219,87,+67,198,104,13,159,122,77,214,140,162,43,186,179,147,206,244,63,228,96,150,+180,97,221,222,44,71,43,255,43,40,95,222,245,165,226,148,11,46,114,72,+227,31,64,254,116,95,188,22,145,197,169,237,165,10,47,19,138,103,233,81,+53,30,115,38,99,202,164,251,197,42,134,137,223,66,147,66,73,174,124,167,+146,5,36,186,138,245,63,93,154,173,192,2,97,62,50,217,203,216,216,65,+40,104,102,58,91,134,2,117,183,196,239,86,104,184,143,128,166,181,198,78,+9,19,219,171,120,204,58,195,157,249,106,108,34,71,232,205,108,179,2,61,+17,168,192,30,22,20,245,182,92,55,250,182,200,138,156,69,84,102,177,114,+5,142,189,19,71,206,169,242,239,99,83,16,139,211,5,121,251,241,195,184,+147,111,248,117,84,18,92,215,228,145,85,190,214,67,50,48,171,170,23,2,+91,136,13,215,157,142,136,82,2,247,222,162,106,193,200,224,54,149,73,16,+141,58,175,231,55,240,229,23,164,188,31,97,110,235,27,254,23,190,81,40,+115,70,72,89,140,165,230,9,177,106,242,237,220,141,16,114,251,2,75,235,+196,140,97,112,11,203,193,123,186,140,145,113,10,65,86,32,183,52,192,83,+211,42,90,95,189,211,46,235,31,21,22,254,82,77,188,157,159,185,52,243,+38,167,233,113,107,120,225,244,114,10,211,252,126,23,108,151,76,53,135,246,+16,89,234,3,219,44,210,164,39,70,35,253,14,31,95,29,7,0,113,250,+154,197,30,74,126,1,13,208,237,78,217,113,231,59,26,119,202,251,116,161,+185,186,116,249,82,50,63,158,122,48,127,15,214,46,8,220,95,209,129,123,+207,255,193,54,82,45,205,181,214,190,88,137,134,209,148,201,243,58,211,83,+24,152,26,160,148,82,175,231,199,90,246,138,238,3,241,200,89,109,39,255,+132,16,27,152,128,243,236,72,211,139,141,203,91,174,220,180,68,238,7,64,+84,96,115,236,129,1,171,199,67,84,89,204,119,44,192,224,233,250,120,179,+188,221,214,238,65,69,89,77,73,153,184,251,240,180,33,61,248,178,206,193,+227,46,234,4,184,89,57,116,93,13,194,114,181,149,188,145,215,217,216,126,+226,123,107,201,161,6,61,172,80,187,144,66,51,55,123,104,42,166,196,119,+100,6,186,198,123,242,4,94,177,91,167,93,36,144,254,37,170,117,81,40,+81,143,210,157,181,84,155,107,142,180,39,246,140,224,173,180,163,181,241,243,+149,158,185,120,164,157,101,10,143,164,7,24,166,42,90,81,123,142,150,202,+75,214,88,229,126,166,74,51,110,11,85,217,169,175,195,216,130,19,198,83,+15,246,112,208,247,92,148,246,204,158,247,176,250,176,130,64,6,37,171,181,+75,239,138,209,98,204,20,92,200,187,166,199,217,42,234,40,84,141,179,53,+94,37,3,19,13,139,76,230,208,27,147,239,18,77,161,59,229,147,93,119,+53,169,110,254,232,33,216,239,231,50,22,241,32,197,246,8,46,99,151,249,+85,69,128,57,153,165,17,78,11,232,215,139,30,236,50,25,240,178,100,221,+60,41,75,85,142,33,125,192,203,125,45,53,176,37,216,106,7,201,107,151,+42,143,52,234,220,140,230,184,233,9,118,67,252,100,1,179,3,188,94,175,+127,151,128,164,91,217,193,188,54,7,43,80,79,55,184,240,32,13,227,23,+168,136,60,97,28,246,13,190,100,196,219,205,123,110,181,130,99,129,209,18,+197,107,55,58,23,229,125,150,46,254,181,209,92,225,89,171,197,63,46,169,+204,85,42,166,236,162,156,104,206,114,53,159,15,233,216,33,217,74,180,212,+76,115,228,157,164,151,210,66,125,9,3,253,208,126,35,46,211,108,84,136,+44,148,85,4,211,138,188,88,145,161,10,221,17,157,221,119,122,126,227,125,+100,5,231,29,5,30,161,232,46,217,92,7,33,173,135,179,101,103,210,107,+27,193,60,227,221,62,234,165,216,2,162,147,101,104,222,37,228,87,151,55,+37,22,104,100,53,27,51,55,110,170,121,79,182,100,105,65,63,48,169,150,+18,18,217,140,141,66,146,5,122,77,171,104,56,252,191,64,76,240,34,66,+216,121,187,158,4,208,198,133,109,216,99,19,35,56,61,166,231,5,55,20,+137,185,213,147,216,23,25,67,28,19,36,140,97,250,25,1,243,9,164,218,+125,224,152,215,27,229,18,76,137,159,25,234,253,220,245,184,67,146,108,146,+251,57,112,225,38,137,244,106,201,171,126,129,51,227,198,209,244,48,222,27,+127,134,204,80,164,255,111,2,48,171,236,5,220,9,174,64,214,37,164,54,+50,193,162,166,243,205,33,129,58,90,75,28,93,181,21,163,13,156,65,2,+128,119,180,72,75,223,245,254,77,100,197,136,217,9,218,121,7,84,175,160,+84,94,204,99,3,132,111,71,105,189,17,103,170,141,221,200,66,124,97,132,+95,93,178,24,132,42,59,171,33,169,53,207,32,106,167,141,106,55,76,226,+52,224,223,228,62,148,54,250,36,90,197,194,175,254,127,29,30,123,172,225,+140,234,111,243,123,137,135,194,232,196,5,162,57,246,46,84,95,11,246,101,+59,61,13,55,37,227,252,153,190,221,19,107,64,115,109,41,185,240,29,226,+168,58,157,74,210,156,65,185,87,38,133,222,48,131,50,72,118,253,12,27,+99,100,228,135,107,132,50,38,52,27,146,4,142,179,158,237,202,65,103,65,+211,224,144,180,84,143,186,57,225,209,217,45,91,15,62,53,58,173,244,70,+210,207,91,195,68,237,67,216,136,20,72,101,18,193,238,207,25,152,108,248,+247,72,41,29,84,226,209,85,183,10,186,207,176,52,197,131,32,9,54,201,+172,123,80,202,115,227,94,121,14,101,212,154,223,147,238,219,143,179,193,7,+156,134,6,20,41,223,195,242,209,6,141,219,253,185,45,27,243,22,56,207,+235,105,185,95,203,192,50,235,9,11,214,92,129,18,4,32,78,5,67,62,+65,88,133,116,233,218,249,144,109,116,133,180,186,84,106,144,134,107,102,58,+121,15,211,203,210,107,159,59,247,222,84,216,214,30,84,85,132,11,210,19,+158,181,58,8,247,104,193,185,182,174,219,12,205,167,92,210,177,22,112,4,+180,176,63,36,164,154,45,14,133,66,201,31,169,152,98,227,128,110,11,39,+56,246,249,244,12,90,195,187,249,93,38,166,194,247,17,225,88,9,213,1,+242,104,62,15,108,75,46,23,45,23,210,63,123,236,52,173,40,10,139,119,+31,184,159,19,120,162,35,147,245,140,93,94,84,172,17,98,85,200,151,237,+25,104,149,44,204,213,51,249,48,109,55,183,91,172,59,155,54,203,55,78,+139,88,117,164,122,143,16,165,145,43,82,116,199,62,87,128,180,69,108,62,+204,194,5,165,146,22,140,148,149,197,61,212,251,251,168,36,40,193,67,20,+156,238,161,204,63,173,101,156,162,218,55,136,225,219,125,241,204,160,15,38,+234,117,38,207,104,178,61,32,207,249,122,83,243,95,129,135,126,187,84,243,+158,2,42,197,141,13,68,47,124,248,25,237,195,97,137,154,79,248,173,191,+67,90,11,55,130,236,94,40,104,33,175,162,23,144,199,37,66,174,43,89,+29,98,128,183,189,163,88,240,103,213,191,151,196,143,5,245,99,170,25,207,+48,18,107,151,79,196,202,36,97,69,152,123,180,72,127,197,216,220,136,145,+239,28,182,162,243,59,172,207,22,37,228,33,177,158,90,251,244,71,78,117,+86,139,143,221,8,188,177,167,121,72,32,142,34,141,242,97,192,196,60,101,+217,194,27,23,125,168,81,14,62,169,50,148,102,195,123,36,90,62,3,116,+114,25,143,50,177,179,81,53,16,66,150,98,54,138,208,80,51,146,26,198,+85,28,10,209,205,125,186,144,142,134,51,1,162,231,14,69,23,27,213,30,+127,25,146,127,164,109,221,240,161,116,185,79,128,240,30,239,23,206,131,110,+239,224,112,150,218,31,176,181,129,17,24,64,109,2,48,174,204,128,208,188,+197,0,50,164,209,23,232,27,127,164,168,153,140,238,213,115,18,224,33,79,+225,78,161,81,117,143,164,68,20,206,36,120,19,81,3,240,198,91,184,89,+182,179,16,87,93,11,41,195,99,162,190,89,240,246,224,6,46,207,35,27,+65,51,32,243,67,3,61,108,68,108,36,75,95,136,126,219,113,220,252,158,+22,71,215,96,72,115,104,82,24,70,140,225,76,95,53,87,17,113,243,222,+78,49,158,153,144,96,67,81,245,1,135,254,127,55,26,180,204,79,21,197,+157,34,252,160,238,163,88,157,29,198,37,10,162,172,24,222,90,161,251,39,+40,122,41,43,125,71,211,80,238,93,252,221,107,149,0,33,99,49,43,118,+6,115,118,186,181,198,221,134,172,127,227,107,5,217,106,48,189,184,114,186,+223,253,80,46,211,13,37,32,80,187,154,232,254,227,92,177,177,218,86,100,+125,228,197,186,253,150,114,162,151,124,159,128,14,50,240,115,2,114,65,207,+183,247,231,201,226,192,232,95,85,81,139,88,143,141,162,26,112,106,192,104,+7,72,32,162,230,204,14,213,228,255,134,12,133,235,119,119,91,38,242,250,+58,211,152,64,108,199,50,255,145,28,97,64,35,218,185,251,210,77,56,53,+40,252,5,232,146,34,177,178,2,246,18,112,188,252,29,37,195,167,38,105,+142,160,94,166,97,94,92,87,108,79,104,189,107,0,144,152,82,111,16,97,+122,100,245,135,77,49,82,125,94,229,253,151,45,112,144,74,170,246,161,142,+169,14,192,97,238,192,125,82,46,58,119,140,43,190,230,55,149,227,76,78,+143,176,140,92,129,124,220,253,67,112,172,246,24,151,25,176,202,51,70,156,+34,137,15,19,224,172,153,119,167,106,17,50,107,13,169,11,139,142,165,72,+133,160,58,21,165,97,188,60,163,59,121,235,205,144,108,106,233,207,4,237,+127,71,158,87,32,113,123,218,186,241,92,3,109,115,54,119,230,238,150,19,+32,163,82,107,223,79,228,5,236,95,88,40,191,157,28,198,199,67,208,111,+206,38,211,76,5,149,175,203,92,10,111,192,109,197,196,213,145,188,144,106,+181,117,147,61,204,42,81,209,254,1,74,168,185,82,207,104,58,169,114,177,+134,156,176,49,222,27,236,28,9,222,21,57,84,150,195,122,198,33,171,141,+40,106,126,25,191,163,78,91,121,77,103,199,28,62,202,8,246,255,181,142,+236,97,195,52,195,190,155,64,45,14,205,157,32,221,206,6,128,84,122,205,+213,177,246,229,246,182,50,140,22,187,108,177,255,227,239,97,24,159,127,83,+18,24,42,46,115,101,132,47,63,242,160,146,71,208,52,62,28,220,110,110,+35,255,59,201,160,9,238,201,12,70,200,31,195,38,174,179,253,122,178,83,+246,54,12,230,145,253,247,190,176,163,94,163,75,53,162,226,1,244,70,163,+206,128,74,234,221,68,222,189,209,205,28,242,174,134,146,208,219,26,9,33,+97,144,75,126,64,122,183,144,97,59,207,196,210,36,179,79,14,131,212,216,+129,158,241,5,142,201,166,135,125,230,184,97,85,94,220,26,87,103,192,250,+55,22,226,222,197,251,196,151,111,228,215,171,195,162,24,202,120,52,215,61,+215,181,219,246,154,44,105,230,66,179,167,175,17,150,212,86,134,30,204,59,+13,197,109,73,212,192,169,131,195,27,14,134,193,39,136,50,187,217,219,189,+47,7,250,21,234,162,114,70,101,204,17,47,182,57,101,7,169,57,186,0,+195,161,153,250,172,188,173,152,191,24,64,86,194,41,88,110,148,15,95,37,+145,6,202,17,20,32,163,85,7,225,204,136,88,207,60,240,184,51,27,49,+99,175,209,181,222,165,101,6,236,193,105,170,110,117,170,112,222,211,24,245,+248,59,199,27,94,196,40,49,181,54,103,234,42,102,11,97,203,178,93,86,+117,3,174,254,129,164,148,109,233,30,3,179,109,246,3,220,78,75,247,114,+250,249,212,18,136,170,82,219,48,63,41,192,86,76,39,113,107,147,130,25,+123,102,44,62,46,209,209,17,7,147,88,248,68,152,142,85,222,229,208,168,+233,139,35,10,215,54,181,172,243,65,26,204,174,50,20,131,28,215,23,150,+138,48,255,100,36,25,122,45,96,162,5,151,126,136,27,212,236,125,102,2,+126,135,84,208,9,9,129,73,12,73,228,135,181,19,112,124,222,236,132,42,+203,232,29,223,177,194,51,32,144,25,223,198,238,82,178,202,198,53,226,28,+52,12,151,20,68,13,1,153,91,86,221,223,108,165,118,28,181,235,210,140,+155,54,48,62,190,19,75,164,25,217,6,87,222,38,7,17,21,183,23,154,+153,219,109,236,116,165,56,92,242,247,144,39,13,143,64,102,49,248,121,99,+25,207,116,88,74,71,10,18,194,121,122,252,43,2,43,224,57,35,213,188,+110,172,119,57,177,81,88,53,243,182,157,177,59,103,163,84,113,154,51,104,+102,217,228,255,185,112,236,230,37,47,75,110,87,139,87,106,134,219,201,138,+249,92,198,209,124,228,38,125,62,48,226,92,2,83,126,77,25,152,239,136,+127,122,14,237,44,7,15,207,216,9,30,23,181,248,169,84,53,244,142,120,+32,221,127,46,76,172,54,128,216,190,72,28,199,167,155,175,112,148,222,252,+68,10,90,215,246,53,120,42,146,237,152,5,46,158,112,14,32,206,109,194,+213,183,145,193,222,124,212,45,24,82,23,19,94,36,72,34,232,141,70,239,+148,55,115,218,162,78,12,193,12,188,27,101,16,115,111,155,223,71,102,166,+220,254,189,228,159,81,175,176,94,167,178,45,238,112,16,162,201,196,2,176,+212,90,242,19,125,92,188,195,33,102,186,134,141,63,124,239,113,40,240,236,+67,154,210,186,59,133,185,161,202,36,168,75,127,198,209,227,247,85,22,57,+63,14,185,40,122,40,38,86,5,158,22,185,201,127,59,239,148,105,200,155,+24,78,210,58,196,111,32,136,145,146,28,188,65,41,130,198,94,144,194,149,+21,183,110,2,75,95,62,93,27,173,116,206,1,36,92,136,164,190,150,45,+252,229,252,61,153,198,161,29,150,108,195,210,134,119,140,94,247,130,170,143,+23,254,35,111,65,176,44,204,98,202,148,115,20,128,242,199,123,53,40,12,+239,40,61,55,163,162,180,47,70,163,240,45,128,84,22,215,217,255,177,95,+32,166,75,17,255,225,60,184,175,153,207,42,138,167,50,188,247,221,56,9,+112,221,5,81,30,148,6,147,100,17,10,87,16,178,181,92,121,98,18,204,+237,136,32,123,5,70,140,106,34,115,200,78,233,191,158,71,28,19,203,61,+136,158,158,241,190,138,14,14,126,231,188,184,30,127,218,61,26,70,34,247,+106,96,58,169,206,129,222,158,47,52,107,155,64,233,8,3,10,251,214,217,+225,117,179,5,29,206,213,142,79,89,246,192,151,161,191,34,77,227,227,201,+116,150,225,188,74,81,255,212,79,64,52,43,203,235,197,229,197,177,19,153,+184,67,130,207,145,65,176,21,82,100,28,28,96,225,162,181,178,169,247,254,+240,17,109,193,4,199,210,48,173,204,95,143,146,101,108,103,146,217,179,99,+110,62,237,79,114,175,242,150,60,176,42,53,217,196,55,170,62,191,150,62,+168,234,70,166,103,247,198,118,53,1,60,80,159,222,30,46,112,150,8,159,+241,139,188,204,109,209,95,10,51,220,35,176,54,208,241,39,184,251,36,52,+31,204,235,63,176,223,141,18,188,62,42,23,103,75,239,31,39,252,214,205,+217,79,180,58,5,121,132,162,134,143,116,80,128,137,93,51,97,126,167,34,+22,209,7,155,41,92,19,166,56,255,193,239,246,231,43,139,230,54,167,240,+137,183,188,37,113,31,249,219,240,241,253,38,117,6,73,129,168,186,170,22,+143,200,171,12,226,20,150,138,61,138,14,139,52,221,240,232,217,25,38,99,+223,235,46,36,97,151,49,218,119,239,156,209,255,250,186,111,245,102,232,144,+118,177,231,96,185,168,75,249,206,79,134,47,7,109,146,250,172,38,161,97,+209,49,196,162,164,224,62,176,189,62,176,166,110,63,98,39,198,82,149,242,+221,239,152,20,110,232,142,199,217,9,111,71,190,173,77,150,180,130,179,13,+145,84,143,34,54,161,107,54,1,120,253,15,0,237,57,206,106,51,198,186,+26,249,234,172,112,160,251,221,96,247,221,148,175,249,3,1,8,243,0,101,+139,252,211,113,200,163,216,201,234,157,103,113,154,218,5,22,44,190,228,118,+40,0,122,33,244,107,219,234,229,215,203,127,164,73,171,129,202,105,6,24,+239,29,204,133,16,103,121,149,48,148,47,15,189,149,7,51,166,56,8,229,+252,65,251,62,176,1,29,205,230,70,193,74,187,249,228,254,137,37,204,143,+67,130,178,29,65,213,209,194,224,245,186,59,53,167,129,135,126,119,84,234,+67,84,11,180,230,191,173,192,89,49,63,125,133,143,110,93,214,115,196,53,+228,225,118,48,239,248,186,237,172,104,117,212,150,88,255,40,95,101,36,4,+30,22,134,13,83,46,76,23,214,58,225,10,245,22,130,79,124,127,45,36,+138,97,57,98,60,251,88,237,218,53,25,10,94,156,195,40,172,182,61,172,+34,196,9,127,191,79,196,5,2,31,179,39,13,85,246,144,85,133,168,104,+29,10,199,12,210,221,194,122,98,155,157,5,182,237,96,241,144,142,253,158,+89,181,70,29,2,161,3,200,15,238,251,99,236,8,210,81,93,19,214,82,+20,137,118,144,167,101,42,158,117,122,31,122,175,221,195,141,169,217,112,191,+80,51,148,107,250,185,40,28,252,129,22,211,67,179,53,36,38,116,254,223,+208,209,56,221,155,33,7,221,132,53,202,140,20,181,220,2,55,184,87,208,+165,141,133,21,54,85,43,222,109,245,23,149,81,239,210,140,24,80,42,193,+187,16,52,243,170,220,59,130,141,156,163,13,158,69,148,208,151,120,116,39,+209,47,169,70,108,213,202,73,128,32,106,233,99,135,207,97,32,229,152,4,+232,248,92,231,20,184,223,168,163,55,38,130,27,167,155,7,207,201,71,133,+72,204,135,90,97,187,250,250,168,202,24,205,12,127,208,110,102,147,151,247,+140,43,252,137,33,142,125,247,170,252,27,233,49,91,162,188,84,199,154,177,+71,127,174,218,40,176,168,104,183,180,45,110,196,124,239,172,186,234,64,191,+132,177,86,79,191,18,70,21,231,26,13,82,135,1,91,135,27,105,27,74,+187,119,108,102,203,236,12,235,93,154,125,116,79,203,185,162,78,172,30,232,+117,118,42,115,209,5,84,89,92,115,53,107,63,46,167,134,98,219,203,50,+181,206,190,79,47,112,244,126,7,152,13,119,54,34,94,230,174,7,77,45,+114,25,122,150,128,27,83,238,204,145,236,129,60,136,31,40,155,98,147,157,+23,26,88,213,195,216,60,93,208,117,116,110,106,156,236,116,149,91,223,139,+254,218,223,109,22,58,179,154,152,184,20,91,133,64,28,79,55,2,123,197,+108,46,143,58,162,115,207,84,161,185,110,106,76,196,15,103,12,117,37,96,+73,34,3,199,149,250,159,220,161,191,1,128,121,140,126,149,135,140,176,111,+58,137,200,244,3,174,174,129,241,93,83,159,229,151,73,74,15,53,43,75,+244,93,203,211,209,201,98,103,126,64,87,194,175,68,70,155,15,151,193,145,+154,187,229,105,72,102,159,53,32,233,196,141,87,89,102,5,229,191,110,33,+217,168,219,36,193,71,107,92,46,210,162,46,240,143,54,30,153,248,125,3,+119,218,3,211,78,208,231,75,243,98,237,54,94,188,181,189,144,184,199,149,+71,222,5,161,20,204,13,67,200,158,173,91,38,198,7,199,116,163,161,37,+33,61,91,27,163,138,91,39,165,218,97,17,9,183,214,89,112,17,16,238,+162,115,238,24,202,109,11,157,65,116,220,3,237,15,105,241,166,31,196,160,+114,21,8,161,123,152,225,129,40,253,176,15,90,236,159,137,104,112,114,247,+190,118,188,216,194,92,26,225,135,127,21,69,69,21,194,101,64,250,229,231,+179,98,180,9,249,163,207,42,132,123,238,87,133,213,115,223,6,126,254,10,+8,61,10,161,52,182,135,103,157,36,85,12,182,17,121,188,96,95,71,65,+79,129,139,131,129,39,177,190,170,135,143,35,36,0,214,194,74,210,31,90,+27,169,136,83,167,111,212,253,6,102,94,245,155,47,82,247,94,222,238,63,+11,133,210,67,44,132,242,18,78,212,112,15,208,95,209,165,94,31,244,230,+96,94,163,44,154,93,154,205,19,236,57,200,126,84,38,22,68,12,98,124,+77,44,239,129,190,19,72,29,210,197,180,55,176,152,25,14,121,119,214,255,+48,158,65,167,205,230,166,36,248,24,90,40,25,147,92,235,187,23,119,219,+252,97,174,147,185,21,242,232,95,61,100,239,92,202,179,107,80,163,169,136,+162,116,85,216,198,75,254,69,174,14,223,4,135,88,81,89,54,33,231,191,+233,127,196,206,101,83,66,36,98,214,132,10,175,245,188,108,248,9,222,50,+13,84,149,103,66,119,61,94,186,219,69,181,19,144,124,220,102,182,48,196,+183,161,156,248,236,60,15,150,112,42,247,150,8,92,49,255,103,26,101,113,+125,182,214,195,111,226,220,250,227,17,21,102,248,131,25,59,112,8,127,83,+32,123,252,223,234,196,182,16,222,254,37,94,143,71,248,51,209,11,165,233,+238,182,119,17,167,224,161,182,145,183,44,17,144,12,175,202,64,115,188,143,+250,230,49,52,253,23,50,170,174,209,137,218,169,226,56,128,68,226,118,169,+250,44,159,71,88,205,3,72,174,107,200,219,219,192,190,229,27,141,210,86,+135,31,147,13,126,243,168,30,137,210,107,49,170,183,17,217,103,66,41,85,+86,205,139,99,202,118,209,68,227,51,96,40,37,2,172,26,168,200,125,134,+186,223,141,230,203,63,228,52,153,177,171,243,196,48,203,67,38,57,20,133,+148,122,102,89,103,241,221,160,5,161,103,69,230,55,133,24,74,97,23,20,+237,109,60,25,49,57,191,214,233,117,212,93,140,82,203,239,48,178,238,223,+192,74,210,184,219,191,129,124,216,147,236,187,39,91,0,45,93,15,45,101,+173,170,194,7,213,176,34,199,151,200,133,5,53,77,60,40,100,125,147,135,+166,104,57,227,6,39,211,127,6,148,71,194,41,82,112,34,211,67,147,244,+144,168,184,140,44,62,114,38,157,246,77,32,234,38,192,131,29,175,148,219,+56,171,186,236,51,159,96,142,177,139,140,1,162,70,227,93,88,212,217,30,+142,119,232,19,101,136,222,132,186,27,165,88,167,32,5,67,244,35,47,131,+83,75,218,4,7,102,43,135,200,86,67,211,122,139,208,195,155,207,204,178,+74,208,236,173,204,24,56,57,204,181,65,28,122,138,103,118,195,113,99,67,+68,188,31,246,104,94,187,242,173,48,10,20,214,32,144,189,212,240,245,171,+192,240,18,110,187,107,118,230,131,207,9,43,128,231,61,169,192,247,240,82,+249,105,65,123,135,50,101,58,135,134,248,13,224,40,62,102,167,68,133,216,+93,33,222,38,54,72,79,191,92,254,73,173,106,70,18,140,73,41,231,14,+181,94,242,172,124,19,250,91,188,206,3,79,200,136,129,149,245,5,9,251,+25,226,104,101,210,157,201,142,61,147,69,87,59,233,12,129,13,67,137,244,+208,74,88,41,68,180,150,157,247,37,166,10,131,84,180,66,176,196,215,242,+28,44,76,225,62,250,26,197,32,67,36,73,250,20,247,129,44,51,62,183,+43,199,61,197,137,165,254,142,221,111,32,52,153,188,85,10,87,56,6,217,+26,36,138,248,140,65,113,229,65,67,252,104,255,87,203,179,125,39,221,32,+244,2,225,219,178,107,53,246,119,202,154,248,123,253,31,33,107,188,175,83,+58,158,1,219,177,218,178,42,157,157,139,127,81,231,250,182,239,249,124,215,+21,184,250,0,172,136,231,198,138,234,7,47,49,203,65,185,227,26,192,215,+16,69,69,223,132,39,243,65,120,178,165,107,250,65,0,108,53,199,102,102,+166,87,31,194,51,98,5,42,52,84,36,184,173,133,148,168,224,128,76,5,+58,130,78,231,33,235,212,168,209,46,65,109,24,195,48,16,222,252,86,92,+212,117,70,239,165,212,125,133,161,191,17,234,58,58,99,143,96,80,250,157,+90,22,61,113,125,235,39,52,252,78,149,165,104,242,226,98,192,185,205,94,+190,225,55,49,0,229,130,162,52,129,67,100,156,200,52,193,86,158,211,162,+20,149,25,239,119,215,214,108,255,197,27,17,22,94,233,106,165,48,232,170,+244,222,220,1,127,247,196,252,203,238,85,82,101,50,50,122,37,38,187,150,+249,240,203,249,226,192,246,33,205,215,165,64,239,243,54,252,180,156,189,98,+140,106,18,131,17,170,6,41,234,17,102,105,71,96,200,105,72,144,84,109,+230,200,139,22,8,192,79,69,143,106,40,113,255,51,23,157,30,57,228,160,+78,9,18,243,211,153,137,236,138,197,207,128,112,122,231,167,179,140,249,135,+182,213,38,48,223,35,235,69,57,20,90,216,7,135,228,165,203,102,74,35,+57,53,12,113,64,216,54,2,183,8,171,101,225,155,165,237,181,149,236,165,+110,230,117,50,235,190,115,10,54,185,221,14,249,97,203,27,78,69,249,74,+57,166,133,21,33,168,171,237,70,33,232,15,212,224,190,44,45,140,192,255,+213,134,4,71,146,83,111,223,106,106,60,155,88,60,79,150,242,6,147,64,+148,90,45,174,186,221,101,200,197,64,158,108,171,181,131,209,217,94,47,230,+83,184,254,13,152,218,42,238,156,37,140,10,119,251,68,161,104,23,144,216,+117,48,29,226,219,176,216,55,144,24,114,146,17,78,72,31,147,252,12,47,+234,84,36,142,41,172,23,171,10,151,68,216,81,193,32,204,175,77,239,139,+54,45,1,219,186,47,182,194,249,185,63,247,206,5,158,60,203,222,29,210,+241,83,93,101,90,252,169,183,35,94,51,84,237,78,18,185,164,207,39,183,+93,166,198,192,197,19,86,162,8,134,157,166,140,41,191,100,57,124,202,208,+72,188,72,150,151,162,99,214,135,83,127,64,84,35,129,91,156,16,123,138,+63,182,249,179,105,224,32,106,197,223,191,53,40,1,255,7,57,40,241,148,+196,154,153,146,96,112,179,5,114,149,216,61,242,222,219,125,193,5,249,180,+200,248,9,80,32,32,69,174,150,234,138,87,214,57,90,111,171,140,126,239,+65,30,125,236,103,71,228,203,77,76,190,107,128,190,84,172,182,83,70,38,+221,157,214,15,26,41,155,93,160,119,76,234,7,62,54,48,215,249,190,224,+24,92,184,229,111,166,138,218,100,65,159,235,64,170,163,97,181,158,98,26,+83,20,51,139,183,82,13,101,13,74,117,191,216,162,217,19,20,246,249,236,+52,145,136,73,32,210,230,48,212,72,33,117,195,154,110,192,170,87,49,174,+206,2,191,81,10,9,85,155,249,84,215,78,252,143,227,72,107,243,133,219,+115,33,101,253,51,103,78,221,240,166,92,212,125,87,226,82,226,51,174,66,+235,97,37,67,183,100,190,60,216,1,7,158,190,160,172,150,49,203,52,154,+153,71,208,28,158,5,237,214,5,196,111,41,11,42,187,156,202,252,191,190,+104,137,176,61,113,154,180,105,14,111,35,163,214,141,173,146,10,123,178,140,+162,112,107,30,57,241,76,254,243,114,45,115,26,240,79,20,45,189,104,243,+231,131,171,216,121,48,172,28,50,197,61,121,217,203,47,104,184,74,131,132,+61,32,22,80,226,179,129,169,94,123,161,186,227,19,17,66,245,249,168,234,+185,215,65,82,6,113,116,56,72,148,125,103,2,63,50,90,189,223,139,11,+165,42,129,149,13,14,57,22,53,251,180,29,80,36,35,74,88,203,247,225,+230,85,195,241,97,94,126,192,196,229,67,128,124,70,165,192,154,20,136,135,+130,249,187,113,157,108,205,250,215,5,77,212,81,214,255,210,122,176,54,131,+136,112,213,183,13,18,5,104,34,141,88,8,236,106,248,115,233,239,106,65,+103,180,2,231,56,41,68,224,9,42,102,107,165,190,247,109,163,166,121,35,+225,250,245,75,232,193,135,181,94,254,122,157,133,251,185,25,93,51,193,210,+168,153,140,44,19,210,84,64,4,139,16,18,224,116,35,93,77,185,124,138,+104,145,35,72,140,139,51,13,105,112,50,8,18,170,214,37,205,248,175,131,+67,142,236,67,37,231,67,27,219,50,214,164,172,218,144,120,243,222,200,70,+228,188,46,215,148,236,33,250,94,162,20,33,80,56,108,56,37,10,139,64,+159,19,62,211,149,252,57,165,99,39,41,45,72,170,237,224,58,67,82,175,+169,54,209,231,182,74,45,92,51,167,22,245,83,222,91,18,248,94,181,77,+227,23,201,203,24,184,186,188,183,62,228,26,63,181,197,213,55,101,8,206,+32,125,46,95,242,82,115,211,35,79,195,33,162,55,110,129,45,114,33,110,+131,157,157,46,138,90,78,155,92,17,227,101,203,196,93,19,159,137,138,115,+183,247,244,172,19,141,96,60,137,240,155,226,59,162,64,227,123,216,219,126,+28,28,47,117,116,53,145,109,219,206,223,137,171,96,5,161,142,216,27,13,+106,97,229,152,102,166,118,177,247,124,89,117,199,235,125,161,89,250,198,134,+157,214,178,217,150,27,51,159,165,213,114,195,125,26,104,160,55,141,91,79,+89,201,83,245,140,223,237,188,19,51,228,183,96,126,238,237,240,109,236,99,+154,214,3,223,118,107,222,163,171,203,217,75,74,1,249,132,84,139,109,28,+174,144,46,143,20,52,224,201,118,191,245,30,64,198,125,51,143,6,66,188,+219,220,164,61,135,93,22,85,63,54,80,32,239,92,180,242,135,172,202,236,+54,154,123,33,226,228,114,152,103,19,62,199,237,255,68,228,112,144,229,139,+205,239,160,42,173,90,93,115,18,40,45,184,185,107,72,113,194,34,245,121,+219,40,89,116,209,102,77,100,33,77,124,131,119,55,208,195,214,6,19,158,+212,17,249,10,43,50,62,238,100,236,164,44,21,223,254,224,38,212,252,71,+148,70,85,56,109,84,24,161,67,40,218,45,65,56,157,5,190,225,53,165,+213,91,205,156,53,80,31,242,10,119,17,184,206,125,255,147,69,86,198,201,+73,121,127,20,5,6,86,225,177,174,161,30,65,182,226,94,250,229,115,233,+193,129,231,12,207,222,170,194,222,143,255,252,10,71,66,5,50,212,38,144,+244,153,166,46,150,135,166,164,208,231,208,55,252,197,69,5,166,210,31,62,+103,49,186,186,21,213,224,22,46,18,142,95,19,105,195,30,0,174,178,0,+36,244,9,144,36,207,12,247,161,71,199,91,168,182,81,41,147,207,155,54,+55,99,105,58,87,237,81,186,96,63,166,111,183,146,203,49,118,251,86,220,+98,196,253,35,113,81,102,2,90,206,140,69,153,167,88,221,77,178,139,215,+106,190,5,199,157,14,163,227,223,112,30,14,50,133,69,198,127,222,107,67,+156,84,142,43,202,173,1,80,183,58,201,191,124,149,211,1,33,80,233,23,+123,120,99,228,29,29,20,245,148,174,121,249,170,209,138,14,33,3,209,10,+97,193,144,127,124,60,51,189,177,12,187,150,204,90,33,23,7,156,159,122,+176,43,229,238,81,47,106,97,122,103,15,241,210,92,49,47,220,115,83,213,+40,240,90,179,118,173,8,51,248,76,252,74,105,85,196,118,175,103,163,181,+250,128,225,96,39,149,109,162,39,56,97,121,178,27,146,42,51,200,70,193,+252,219,228,158,195,220,21,201,219,234,96,44,27,85,147,255,67,84,105,4,+122,130,228,162,241,142,246,51,14,200,183,195,178,13,37,137,234,13,69,118,+74,13,139,247,127,76,234,82,208,189,37,80,57,228,163,76,239,232,219,238,+220,48,173,100,110,73,237,16,12,64,227,211,175,56,201,77,83,106,204,233,+184,141,136,170,2,101,250,209,125,70,104,125,158,216,58,140,139,236,172,103,+139,36,185,126,62,241,66,83,241,89,177,220,176,7,98,243,178,46,65,179,+192,221,48,243,220,169,249,222,177,114,29,102,75,178,109,203,146,104,84,194,+232,97,177,181,246,183,236,159,81,137,167,140,90,174,109,203,134,15,162,39,+191,197,237,34,12,113,143,17,229,64,223,78,202,96,199,90,39,122,111,231,+7,56,10,178,254,51,208,225,83,193,84,151,127,58,194,185,217,38,40,254,+126,15,191,115,20,47,103,17,43,85,224,189,253,119,21,54,90,104,43,141,+138,245,217,229,160,21,63,234,120,106,116,50,45,196,139,172,181,50,7,155,+200,161,56,127,201,58,152,86,176,217,74,3,137,108,121,24,123,204,94,44,+227,119,122,132,82,229,71,37,45,81,183,175,94,191,103,179,230,71,207,156,+10,107,100,239,235,16,212,125,64,207,102,72,240,6,120,23,251,65,65,198,+94,65,177,111,155,150,98,140,79,205,207,107,15,145,91,142,248,163,224,34,+76,93,40,187,81,149,97,15,79,88,219,139,30,132,137,60,88,202,143,112,+104,30,176,111,24,209,171,120,97,197,237,176,59,213,212,141,109,109,244,190,+154,6,131,207,113,194,36,185,214,36,239,40,73,84,187,28,151,9,203,180,+43,250,22,213,130,4,36,243,213,166,24,56,196,248,76,220,20,33,104,100,+48,143,153,234,124,59,189,40,117,205,7,250,32,63,202,203,226,98,235,147,+118,137,9,21,205,15,132,227,48,33,154,253,176,187,8,46,92,60,81,138,+82,145,45,32,43,235,229,205,11,180,105,68,200,172,152,166,20,198,51,129,+77,117,165,38,38,163,126,100,157,71,222,77,53,239,131,53,86,52,167,6,+13,197,167,236,191,100,44,117,114,134,111,47,62,196,141,206,131,195,220,3,+82,4,58,84,25,184,2,111,176,137,52,88,254,235,248,107,59,245,135,171,+207,241,181,90,186,123,49,219,255,222,109,232,62,64,97,38,76,190,103,49,+134,98,8,2,113,103,56,15,254,208,217,129,28,70,119,5,164,66,188,198,+68,155,17,110,21,176,164,229,25,231,93,67,143,48,115,184,162,83,1,55,+20,110,200,130,49,111,204,225,72,115,110,207,233,148,243,70,16,85,34,99,+145,99,197,231,165,25,162,245,233,165,201,96,234,201,217,127,125,232,130,180,+177,10,24,85,157,255,95,174,41,217,138,154,131,175,8,25,114,212,85,74,+236,137,64,25,27,252,0,14,145,125,172,95,225,168,233,43,215,169,180,193,+243,0,173,44,176,47,117,108,237,250,189,211,105,254,73,23,205,222,40,4,+21,188,114,166,66,43,68,144,70,173,185,181,239,61,116,134,11,212,4,90,+238,157,42,8,70,51,77,84,145,198,162,153,122,170,131,155,42,150,114,89,+111,11,14,228,149,214,58,123,213,166,128,103,130,50,178,120,98,103,26,223,+131,169,104,100,182,208,163,72,63,212,31,203,134,151,195,10,229,136,220,233,+13,41,235,138,103,214,168,33,135,209,187,69,39,161,182,142,35,70,224,131,+25,129,225,41,114,223,154,91,24,253,149,204,213,86,61,153,146,225,140,72,+142,111,128,151,132,171,249,96,155,102,228,136,139,229,169,117,6,17,223,67,+167,133,191,92,56,79,170,47,217,149,6,159,120,32,42,230,123,171,92,76,+114,41,29,30,248,169,197,100,164,117,177,237,186,99,154,247,84,139,241,121,+92,233,70,158,125,177,86,227,137,6,43,88,46,178,197,76,42,129,254,193,+24,18,171,19,192,153,210,185,99,179,109,175,174,202,49,49,122,207,92,36,+62,83,227,109,153,235,104,3,76,131,26,241,246,176,114,11,62,199,160,222,+196,17,161,116,194,163,238,200,128,176,100,114,147,138,166,180,122,54,179,59,+120,215,49,229,238,102,202,80,56,212,63,91,43,246,9,233,233,32,101,59,+248,73,93,138,128,169,122,153,72,132,149,102,213,200,86,249,236,57,122,77,+225,156,53,249,10,205,212,65,234,106,153,3,123,127,126,37,227,253,132,5,+206,229,33,160,199,39,120,90,179,50,66,166,172,22,96,235,107,12,69,130,+6,167,128,17,30,196,86,213,126,246,28,126,47,214,251,26,35,47,65,176,+55,1,69,53,89,101,144,231,83,93,5,238,20,88,211,30,170,214,63,74,+178,202,221,64,112,16,48,238,236,164,41,39,84,2,200,212,121,225,111,204,+6,60,36,22,199,167,164,189,127,156,75,51,249,13,117,122,95,59,23,119,+207,97,137,70,171,33,152,13,209,10,2,232,195,135,242,96,27,205,128,229,+128,181,198,187,211,212,105,73,58,45,211,126,101,12,170,45,123,16,0,105,+185,103,3,230,80,30,73,148,153,66,25,156,115,97,38,187,169,112,182,48,+127,1,66,129,88,193,208,4,130,54,222,76,58,10,215,38,193,194,30,24,+103,177,132,223,24,79,118,3,138,211,94,28,248,167,79,48,50,11,254,30,+104,158,107,54,131,57,150,211,195,163,3,237,41,123,87,41,65,247,247,68,+125,53,237,6,230,46,133,185,20,186,67,161,146,240,7,71,157,244,85,186,+58,79,15,23,62,2,237,178,65,188,190,173,220,233,169,87,27,236,118,6,+62,227,58,217,246,224,246,240,97,160,119,61,155,5,127,19,193,136,19,181,+29,230,206,249,101,136,182,121,192,59,69,214,226,136,148,155,87,227,205,57,+45,128,174,146,135,231,112,215,183,87,50,20,63,25,220,69,114,62,200,156,+157,182,125,113,200,244,78,126,99,82,215,188,148,1,74,129,139,247,25,254,+113,21,137,148,150,84,217,114,232,95,156,90,7,40,219,139,140,54,174,42,+191,189,135,252,197,213,106,151,79,96,13,62,164,111,75,32,174,66,73,59,+109,60,29,77,33,30,36,178,43,62,108,138,72,218,36,164,210,195,147,95,+239,134,227,38,128,175,142,145,81,178,173,168,169,158,239,114,235,12,141,97,+11,107,253,204,136,128,214,11,77,126,175,91,246,210,140,205,32,228,217,135,+28,135,78,187,119,211,134,168,72,232,74,223,155,116,192,145,6,42,87,114,+66,9,138,188,55,43,101,217,205,31,34,0,237,100,41,115,86,107,5,188,+176,135,70,4,212,155,161,19,172,183,219,131,137,41,43,172,103,13,226,158,+67,140,114,96,221,37,225,58,231,57,163,191,190,105,56,146,94,239,52,13,+41,255,154,213,216,237,201,121,44,192,26,145,40,168,242,94,165,196,117,138,+246,10,133,46,46,209,56,133,108,47,59,253,48,44,91,254,49,167,29,237,+180,8,15,255,203,119,229,93,67,13,202,147,217,161,24,195,112,141,152,88,+16,201,11,90,14,58,35,223,208,80,182,108,121,44,119,155,175,117,73,135,+201,236,174,212,165,231,65,217,222,201,125,96,190,30,1,240,94,157,195,4,+207,44,246,82,131,233,14,107,175,206,198,161,96,173,30,147,51,63,67,104,+61,141,227,40,34,126,230,234,133,250,58,163,145,34,68,34,188,88,150,69,+129,204,245,119,110,182,246,110,9,155,173,179,146,99,215,68,104,67,40,231,+6,100,192,41,225,122,118,15,71,167,203,201,223,71,115,69,102,111,235,154,+92,177,188,2,66,145,210,111,35,232,204,64,224,101,245,145,191,124,249,35,+251,176,9,154,136,72,127,116,26,12,81,113,46,34,147,129,62,107,177,7,+225,192,45,202,12,85,168,235,234,73,171,39,129,246,198,170,184,233,142,106,+20,20,121,36,112,243,149,110,215,90,44,49,78,143,172,245,247,28,97,172,+69,191,237,199,140,9,235,86,182,150,193,138,61,240,82,90,197,116,156,57,+209,125,192,249,205,167,118,200,243,32,200,162,77,132,156,118,10,83,99,30,+87,147,215,196,41,89,173,218,86,12,31,24,157,59,242,123,246,37,41,71,+47,16,63,56,211,40,110,39,153,184,97,67,22,188,98,35,144,83,33,249,+178,143,26,151,242,101,83,25,188,169,239,73,94,110,72,146,130,69,23,143,+237,36,230,223,165,214,170,239,124,217,155,32,140,72,66,92,7,154,152,182,+52,46,193,11,96,42,167,56,225,95,49,86,160,39,131,133,94,29,139,29,+29,96,228,133,132,15,142,43,25,237,23,192,6,18,204,40,189,199,80,27,+12,145,93,41,79,161,231,80,98,187,19,40,34,199,210,129,197,204,87,201,+148,27,108,197,184,177,160,43,245,138,45,74,234,147,235,166,129,67,183,115,+152,81,175,14,104,205,104,238,241,233,49,38,61,20,104,118,76,195,175,114,+11,119,239,45,155,233,71,212,33,161,211,67,234,107,2,8,162,185,12,219,+3,190,28,137,164,154,87,126,188,19,56,11,161,34,93,203,201,173,104,246,+224,188,1,239,149,27,33,82,88,172,173,7,168,208,142,235,5,27,77,21,+6,136,121,143,84,1,243,189,134,230,28,47,2,146,206,161,218,82,93,52,+26,150,164,120,249,107,43,153,232,188,164,202,248,225,213,46,195,139,109,35,+1,59,220,245,83,174,135,23,49,216,2,216,189,141,113,79,188,29,108,78,+108,177,115,41,99,43,231,181,17,124,220,151,139,2,191,218,188,65,255,0,+114,213,74,180,176,16,43,57,249,130,82,137,255,167,21,37,59,116,8,161,+148,243,96,252,18,97,80,76,52,227,229,102,64,244,39,129,195,163,178,167,+49,38,245,234,176,241,97,3,103,140,176,216,162,137,107,242,174,59,100,221,+70,68,160,8,130,167,237,38,115,41,215,255,66,150,4,189,185,203,143,181,+29,95,162,196,223,1,230,247,70,19,255,114,153,61,87,116,241,190,106,30,+216,135,242,167,235,166,109,4,125,112,27,147,81,237,168,215,94,158,55,26,+104,238,197,238,116,163,37,53,90,100,105,3,195,160,77,118,88,127,115,57,+236,144,224,191,60,221,146,183,223,44,50,89,120,160,33,124,59,5,169,253,+130,70,13,228,102,14,103,250,238,218,76,241,244,110,103,49,84,68,131,146,+175,69,121,64,192,231,212,248,16,199,8,122,131,53,173,240,168,197,242,145,+43,25,176,17,111,109,224,169,167,236,20,239,32,76,169,158,225,178,128,70,+62,79,136,35,7,25,172,121,185,139,96,62,116,84,192,46,49,216,144,62,+32,88,141,249,17,144,127,171,27,252,4,75,5,190,165,178,162,119,46,94,+163,168,189,75,238,206,43,2,212,229,39,116,233,215,163,127,95,94,207,11,+178,101,159,77,154,132,187,191,157,56,110,80,238,137,15,157,77,120,249,63,+128,131,72,103,90,22,174,252,79,191,106,83,177,8,183,60,179,101,5,49,+143,81,153,135,182,9,58,202,168,145,126,242,123,193,7,247,0,207,188,38,+168,13,99,116,129,82,230,250,99,234,197,115,76,126,15,19,192,103,136,4,+162,231,249,52,180,180,64,166,32,79,49,86,56,190,62,51,9,230,152,22,+148,164,121,86,102,57,38,112,15,74,32,92,171,64,65,135,250,85,223,73,+159,82,188,120,139,10,30,114,188,46,135,167,80,5,79,132,248,83,117,226,+165,208,97,111,146,57,197,30,179,117,205,212,42,253,30,6,71,127,183,121,+92,117,54,107,160,82,38,21,162,172,123,65,29,71,224,255,215,213,156,81,+213,63,44,175,248,203,238,198,234,153,64,107,158,114,166,121,170,230,230,254,+182,87,43,77,62,2,96,202,200,190,86,142,7,232,227,128,58,32,53,254,+240,131,108,135,74,15,134,93,187,176,133,40,175,66,44,123,53,33,27,22,+154,120,156,153,187,95,220,93,255,3,85,141,122,201,237,59,12,0,241,128,+10,100,60,152,181,149,134,68,121,136,37,227,65,230,243,70,95,108,249,98,+230,200,130,196,189,62,34,131,162,24,113,10,175,105,237,23,247,4,255,233,+178,185,40,21,10,139,194,247,226,108,85,174,20,63,123,243,6,199,1,12,+16,68,161,123,98,85,92,204,109,219,253,227,180,81,210,172,79,44,191,154,+152,98,67,81,156,226,32,36,142,254,176,251,188,244,40,176,32,23,120,232,+15,79,138,126,19,115,208,55,204,148,119,106,189,179,126,191,88,232,235,223,+71,149,36,207,14,125,96,83,112,162,20,69,73,167,74,215,245,202,241,239,+58,178,163,142,146,244,169,36,178,197,57,107,136,143,25,244,10,134,255,164,+84,151,221,236,201,210,68,66,253,226,98,189,142,58,157,23,48,53,37,39,+248,240,214,243,102,154,235,31,245,33,157,17,164,141,116,152,110,14,184,20,+102,17,237,227,207,88,39,128,249,37,14,31,167,160,202,118,194,168,94,193,+239,124,68,154,202,11,247,70,55,238,21,139,99,254,136,215,241,109,200,137,+86,63,135,253,195,126,230,34,183,176,204,185,61,210,250,161,125,37,175,95,+230,177,22,234,205,89,36,134,139,97,91,249,215,233,30,161,20,245,32,207,+230,20,162,134,87,70,65,253,123,47,59,36,88,208,111,158,17,223,55,244,+103,96,203,92,122,226,249,121,90,228,203,136,215,31,103,95,255,110,6,21,+20,18,202,156,134,251,143,40,10,129,77,18,63,185,39,174,63,43,42,46,+12,254,149,147,64,200,43,143,192,117,82,244,238,157,135,219,113,196,49,164,+203,1,58,220,63,193,236,45,43,233,154,162,7,97,188,185,42,125,171,80,+76,113,84,97,198,59,222,10,220,201,121,12,185,140,23,213,102,92,2,219,+44,158,5,56,149,210,123,238,180,133,152,143,108,40,112,139,16,52,116,108,+94,203,36,103,93,124,78,77,41,191,9,174,91,129,148,191,71,211,142,186,+95,246,120,18,56,32,231,68,200,113,141,234,206,184,123,35,46,114,123,249,+63,154,136,169,55,200,18,160,129,0,24,104,95,176,57,126,170,216,13,245,+113,38,228,185,130,45,197,160,108,196,1,58,131,221,169,179,41,84,125,96,+78,184,178,4,40,61,137,89,249,203,242,179,31,2,186,26,159,238,32,52,+171,36,215,38,20,171,36,91,154,238,95,254,223,214,80,29,225,17,158,44,+12,5,244,74,175,193,112,153,51,59,189,254,232,72,140,102,1,39,239,4,+190,69,147,56,217,224,231,134,111,58,165,196,204,80,122,13,221,82,60,23,+48,25,254,232,127,83,109,100,133,190,167,179,188,146,98,243,27,181,64,158,+26,212,114,58,92,242,68,197,50,109,220,74,54,233,40,124,124,24,59,255,+255,243,63,150,30,30,22,170,137,178,209,29,41,36,196,205,119,118,192,96,+103,13,49,130,6,93,25,211,78,159,190,152,153,242,48,236,106,226,238,248,+81,195,202,167,245,97,175,60,114,155,14,219,105,125,168,96,211,217,86,145,+15,46,49,113,120,177,167,99,106,93,38,214,85,218,232,180,115,118,20,135,+23,103,170,146,96,175,36,16,27,208,96,38,13,247,154,7,22,249,15,126,+180,72,214,208,207,185,229,88,8,203,64,212,161,35,59,39,100,166,170,132,+35,254,143,222,50,192,213,189,131,102,226,157,87,103,22,102,171,200,76,125,+88,234,29,238,194,39,141,151,230,232,102,41,40,103,9,29,239,107,107,23,+139,95,94,7,190,97,78,205,118,148,184,145,227,222,55,20,18,47,228,102,+182,117,166,17,134,108,43,27,214,6,7,239,219,115,188,119,118,253,88,219,+122,148,18,158,219,255,110,66,158,178,121,189,34,235,60,1,241,55,58,99,+244,223,175,32,223,184,106,223,47,157,45,150,182,4,198,105,123,58,2,90,+53,128,5,211,20,32,241,89,34,255,103,248,217,216,234,15,203,49,175,203,+155,60,124,119,191,100,13,52,116,231,48,64,47,220,114,47,107,97,197,25,+137,96,197,79,133,171,226,189,255,50,165,112,210,202,79,207,78,134,92,177,+64,221,175,210,49,0,214,231,23,138,116,247,253,14,120,173,173,251,48,113,+160,214,7,117,110,43,145,149,226,84,126,183,199,175,161,111,128,168,239,154,+82,171,88,213,187,65,40,116,116,76,119,130,121,52,139,42,38,31,169,232,+88,121,97,101,250,30,160,74,5,98,37,88,11,161,81,27,156,249,136,187,+118,167,147,41,85,122,100,168,226,87,129,25,115,163,139,203,237,89,155,199,+153,233,43,59,145,164,84,210,197,81,24,139,6,169,231,35,225,181,145,248,+238,224,252,83,59,207,247,210,182,182,9,4,77,129,185,132,166,43,165,48,+171,182,116,213,254,242,202,84,111,99,224,34,71,140,1,54,252,43,132,37,+38,154,149,183,238,197,138,249,100,145,76,161,236,65,241,253,127,208,147,217,+193,207,219,73,33,231,93,187,240,189,157,165,154,194,57,218,176,39,210,54,+184,60,83,81,5,101,107,151,238,93,95,110,163,200,62,25,96,115,150,58,+133,17,149,94,106,176,121,239,121,75,15,195,46,217,166,4,178,236,95,0,+177,172,138,243,176,130,63,112,162,62,193,176,179,110,251,0,83,115,173,54,+76,213,5,180,53,55,48,226,97,252,232,54,88,171,18,109,141,158,114,94,+247,65,161,122,74,189,150,37,49,227,237,121,146,139,105,27,163,135,98,39,+101,197,123,36,140,67,54,67,48,0,76,13,36,184,146,54,183,163,199,215,+65,120,147,122,165,5,184,171,11,190,35,135,42,254,213,73,154,252,11,49,+167,52,214,107,13,238,205,187,152,178,166,227,65,39,223,198,120,254,250,159,+173,195,247,78,182,255,154,163,211,238,48,142,139,187,249,42,215,151,249,102,+7,228,103,124,225,209,155,134,177,106,53,49,77,103,98,247,55,70,4,251,+56,33,239,101,77,99,193,227,192,118,90,249,34,49,99,152,184,184,177,194,+30,92,7,84,71,105,133,17,8,191,222,123,186,125,17,86,50,132,225,203,+3,56,226,150,170,48,80,241,205,164,48,9,153,252,71,208,101,208,55,131,+244,139,22,173,98,138,192,51,201,232,116,142,206,164,244,255,241,127,169,107,+200,43,75,180,205,185,200,214,225,28,216,212,50,101,212,204,27,169,109,0,+115,232,212,16,28,248,50,139,42,240,212,134,28,70,57,237,28,130,44,69,+28,47,204,108,73,93,61,107,64,100,102,78,97,217,216,13,205,216,252,244,+145,158,33,85,227,251,60,121,51,127,172,134,5,103,213,216,43,166,75,25,+159,156,231,226,226,188,112,113,186,222,8,110,140,165,35,184,32,168,180,51,+75,153,166,44,6,38,132,51,174,143,130,55,177,83,244,24,114,211,136,33,+231,230,203,193,63,0,13,44,12,51,133,200,0,128,175,73,251,34,103,59,+145,65,215,40,226,237,223,205,13,18,52,253,193,230,81,182,15,231,39,12,+98,164,43,243,143,51,149,196,108,214,84,28,131,127,238,129,231,85,244,87,+254,194,27,107,172,138,47,82,8,99,190,125,156,26,161,74,202,128,16,30,+12,116,126,10,202,250,138,226,72,226,218,220,96,198,44,228,178,68,136,206,+126,50,36,179,50,81,193,212,239,174,158,220,44,193,217,133,174,11,71,0,+167,154,20,183,61,103,42,49,205,251,141,193,2,166,128,210,10,163,130,61,+54,41,160,71,14,83,191,22,228,133,119,184,179,66,30,33,125,161,122,97,+16,9,152,16,171,126,167,198,242,186,181,14,61,138,233,175,62,65,216,249,+212,66,243,173,227,41,10,63,141,121,201,180,43,236,157,100,190,43,243,140,+218,249,110,86,12,250,203,144,7,129,90,115,130,201,23,135,144,155,100,102,+93,66,193,238,45,25,69,242,129,122,244,204,69,157,88,112,117,128,13,181,+142,70,88,22,223,24,24,60,26,26,178,221,52,251,154,29,231,54,122,179,+94,195,100,111,125,79,18,113,157,180,14,41,148,207,13,212,38,33,209,154,+129,164,112,173,109,12,218,53,144,149,110,50,232,222,6,1,192,253,169,138,+155,146,232,3,40,239,38,75,244,135,154,111,209,45,15,218,93,129,4,23,+174,183,179,182,221,123,31,231,158,242,247,6,200,142,218,157,253,181,119,91,+233,169,64,82,72,119,65,129,19,136,68,104,169,124,208,167,71,106,134,209,+81,124,86,192,255,167,56,26,87,247,194,90,187,230,139,206,116,246,158,214,+89,31,176,124,191,100,217,127,141,69,118,178,100,67,43,238,204,21,151,238,+131,24,202,237,108,69,105,101,18,87,219,199,173,42,194,141,67,151,55,34,+251,127,170,171,197,63,100,65,147,28,226,6,124,13,254,164,89,157,216,109,+128,153,219,79,21,171,152,114,163,55,50,149,224,219,86,19,177,111,118,152,+72,166,250,30,9,132,21,168,210,59,18,120,180,30,176,204,104,114,26,121,+123,77,11,233,89,102,76,100,125,6,145,216,112,91,213,244,220,180,82,234,+6,231,34,39,164,6,52,218,199,41,129,190,75,92,30,172,184,109,53,53,+177,1,12,37,175,166,58,238,178,181,43,245,92,110,214,142,246,179,226,2,+126,16,229,194,59,75,109,196,218,37,36,59,216,177,31,46,52,46,147,122,+106,137,248,148,35,221,164,164,126,129,215,110,161,231,94,65,71,2,78,24,+150,255,108,49,191,195,250,213,110,248,132,214,43,189,109,199,161,157,149,236,+61,31,181,135,50,197,131,210,30,232,227,179,85,38,136,51,212,31,198,73,+233,20,1,46,153,125,131,123,38,151,38,109,17,163,208,177,80,59,36,44,+15,121,178,140,29,25,95,213,77,242,196,44,162,210,0,75,172,86,239,109,+29,153,10,237,179,251,73,159,99,252,241,137,162,42,218,255,103,104,12,154,+149,38,197,118,65,53,85,228,58,80,10,227,213,135,18,232,230,90,204,128,+201,42,227,29,176,28,152,78,141,10,241,101,243,96,97,43,247,46,103,200,+95,241,127,156,15,90,64,171,4,11,152,86,11,156,122,137,193,142,64,73,+214,228,97,35,193,91,242,241,55,150,108,10,185,88,128,222,217,109,122,228,+184,42,8,98,197,101,131,38,24,216,224,228,245,7,41,37,237,188,211,198,+5,25,135,153,202,58,224,187,127,199,136,101,76,224,238,190,11,204,226,46,+216,221,130,88,246,88,71,253,171,233,137,93,60,87,213,158,118,92,113,8,+176,200,124,43,238,46,214,15,187,75,191,21,123,169,254,30,66,157,198,49,+185,156,193,100,56,219,78,154,39,13,167,13,180,16,48,206,106,43,34,161,+252,150,237,72,76,10,90,156,131,121,80,157,122,58,208,250,205,179,137,55,+249,47,108,25,64,59,56,46,160,240,162,35,155,166,213,229,222,55,168,77,+197,104,187,34,56,21,193,26,35,57,213,100,72,14,68,195,67,170,125,114,+99,94,188,104,5,78,250,215,95,166,161,166,113,86,1,191,110,223,81,39,+168,131,145,75,202,17,121,211,182,155,24,152,99,119,238,213,214,225,247,84,+90,99,80,15,228,35,123,255,38,94,209,104,80,176,122,197,24,179,233,97,+26,90,132,69,43,201,104,193,168,125,70,191,73,0,202,168,128,223,85,226,+73,103,67,117,170,135,254,27,233,183,93,132,230,188,217,224,245,17,231,41,+95,79,204,237,20,248,239,120,57,56,68,239,144,50,175,12,212,246,216,222,+77,90,43,23,77,165,120,77,184,81,50,39,249,38,122,242,235,184,188,28,+12,117,216,174,20,113,34,248,82,225,94,85,99,105,226,61,150,82,147,29,+226,174,32,248,175,180,100,228,43,170,238,248,118,83,27,186,67,140,227,96,+6,216,101,244,162,237,247,147,23,74,104,85,168,121,147,163,218,194,204,228,+178,216,52,170,184,117,72,31,76,46,127,172,104,96,96,2,123,101,120,33,+104,104,51,21,142,193,11,254,177,201,8,106,37,86,7,85,21,4,254,48,+196,47,41,249,227,101,102,137,45,113,239,101,248,100,61,79,143,60,236,209,+115,252,177,9,134,47,232,248,160,241,141,147,178,125,228,143,143,167,116,161,+32,203,63,39,198,108,155,190,174,245,191,245,253,35,249,77,242,79,181,243,+171,96,163,51,236,160,207,101,127,174,126,134,82,146,19,154,239,76,196,189,+209,215,43,88,84,132,161,122,169,217,141,108,80,96,25,64,242,27,125,45,+102,75,237,6,121,101,57,69,37,200,83,4,40,198,70,45,107,22,46,85,+15,213,85,64,232,56,7,96,67,4,16,138,26,232,131,11,23,169,174,122,+91,212,166,214,239,113,232,142,225,203,243,98,125,133,234,174,245,14,27,11,+49,85,188,55,184,96,176,216,53,154,82,123,131,109,164,225,212,232,43,255,+95,205,170,146,117,152,133,188,219,179,122,116,104,198,188,219,160,108,219,160,+22,43,129,222,92,242,182,130,188,207,200,140,79,244,202,242,16,208,96,153,+13,156,64,60,195,151,146,238,189,92,155,10,83,195,171,190,144,54,119,75,+232,199,165,161,152,132,33,71,79,171,175,180,176,135,147,95,121,177,35,116,+145,40,147,211,85,154,152,197,138,158,223,155,240,251,150,17,219,34,125,189,+49,170,198,133,46,157,58,151,206,226,42,73,82,186,228,87,32,72,89,219,+57,7,54,215,245,103,170,153,75,17,135,67,157,144,63,89,172,52,177,116,+144,131,148,74,232,44,143,248,97,66,242,67,22,205,102,63,9,122,208,83,+1,170,135,220,142,183,7,72,33,195,130,16,95,107,253,189,70,126,91,159,+147,206,103,236,93,91,247,34,177,52,160,162,248,205,201,172,149,120,165,38,+130,226,207,129,48,46,97,192,108,115,248,28,109,198,224,97,40,138,25,217,+32,33,161,101,101,227,70,38,30,155,201,45,191,173,62,27,37,12,117,217,+240,166,239,69,238,137,12,231,13,35,11,166,105,107,108,28,21,114,11,12,+72,13,19,181,6,221,129,30,92,108,38,229,212,52,70,85,50,251,3,13,+247,224,25,46,40,199,13,144,242,33,78,242,183,103,158,194,231,242,217,226,+80,249,178,112,232,219,232,169,6,99,164,72,187,7,159,52,82,128,151,20,+179,67,153,110,20,92,94,2,252,41,220,112,238,79,67,208,53,252,102,170,+45,255,75,87,35,28,170,211,133,0,68,144,0,151,18,111,161,161,183,211,+174,254,54,71,253,14,231,66,20,249,123,237,3,180,190,74,17,167,171,107,+250,42,231,145,67,12,41,98,39,206,194,151,252,176,35,61,70,47,222,26,+213,22,150,61,163,68,189,151,63,10,148,237,100,0,156,70,10,105,119,123,+236,91,70,217,225,51,3,212,159,160,70,252,149,205,33,179,204,88,148,254,+76,87,149,36,38,39,234,41,203,73,200,159,146,131,111,121,255,157,18,49,+223,143,78,85,85,89,202,74,106,14,243,2,21,57,239,174,118,138,248,108,+252,57,80,224,100,78,133,245,102,86,163,187,175,96,145,173,24,13,213,181,+45,8,146,58,35,51,134,219,112,78,0,209,143,20,150,4,60,81,71,77,+187,205,109,241,74,102,165,237,59,92,34,48,221,61,60,191,145,71,250,151,+182,161,231,104,218,8,214,109,175,238,134,44,183,115,217,127,25,148,162,83,+71,105,136,235,120,150,63,213,49,129,59,112,233,43,34,160,130,98,165,211,+173,26,179,213,113,71,139,183,231,109,196,251,162,117,180,168,157,253,96,8,+218,244,94,170,125,134,138,7,119,175,37,109,28,122,162,191,188,28,171,122,+93,255,41,225,185,29,100,249,158,225,100,81,62,109,196,35,248,153,200,152,+43,54,179,156,198,207,107,37,197,132,248,205,144,191,69,142,229,103,105,171,+105,180,58,255,147,230,197,200,254,137,38,9,241,31,239,222,67,153,224,92,+111,214,172,221,2,206,120,185,155,150,92,206,193,28,15,224,13,15,219,195,+216,207,160,130,96,90,142,87,15,29,63,174,226,195,213,166,58,103,180,11,+215,17,80,115,197,9,4,152,154,34,183,178,69,32,34,121,117,31,230,226,+92,41,201,48,36,7,247,139,129,63,109,117,68,216,48,93,125,169,52,57,+58,134,106,235,158,139,247,114,234,116,184,168,43,157,157,62,64,49,172,26,+185,186,2,91,161,59,71,238,143,142,100,227,105,0,2,168,135,202,46,240,+11,71,84,52,240,174,145,119,137,87,112,25,232,44,88,110,127,74,111,82,+166,96,137,128,180,36,33,248,215,78,52,94,194,195,34,190,117,20,215,53,+202,156,218,69,36,81,10,40,28,81,163,204,213,51,235,215,143,174,87,184,+121,215,98,234,49,66,18,213,248,100,19,142,98,21,170,21,138,122,19,167,+245,64,241,147,162,57,208,0,246,88,149,221,75,1,46,4,183,30,201,242,+237,5,219,185,106,202,116,237,10,251,58,106,148,214,239,237,78,45,203,68,+242,193,187,70,85,178,191,59,212,146,60,76,2,184,176,115,88,104,194,232,+30,245,223,198,87,132,49,0,110,226,210,232,201,98,173,206,146,98,216,149,+1,104,43,39,64,92,151,40,75,30,42,255,152,3,24,113,80,211,46,8,+214,6,94,8,133,191,113,180,80,249,192,118,142,10,151,190,201,160,42,76,+129,107,68,160,103,115,201,183,238,224,40,198,233,8,0,204,229,105,2,98,+136,22,177,201,142,194,232,136,188,60,221,202,199,126,154,20,40,153,145,158,+85,129,87,122,234,23,163,119,137,187,117,183,240,193,99,93,80,167,126,109,+251,171,183,16,229,7,228,183,177,144,190,131,186,125,235,217,74,187,112,232,+42,255,113,95,62,28,152,45,96,152,165,112,151,84,227,14,149,241,103,162,+7,3,11,184,173,37,170,115,109,39,47,245,235,186,18,222,41,80,58,183,+15,224,230,69,226,7,126,134,13,27,27,121,19,118,84,229,3,112,188,145,+197,126,215,86,149,139,135,19,108,96,250,232,175,107,188,249,232,158,176,246,+93,68,83,99,159,44,54,34,210,131,174,229,200,212,138,26,125,20,239,194,+53,140,39,14,141,44,38,234,139,138,99,88,192,202,33,25,50,114,142,34,+32,21,128,227,187,76,77,241,196,80,237,196,155,115,85,133,121,206,26,82,+203,12,58,191,72,199,177,135,225,135,158,23,65,117,12,203,182,6,31,199,+16,158,5,108,141,164,199,54,22,60,100,163,205,35,38,104,228,151,147,136,+84,65,174,82,224,24,230,175,49,229,92,180,146,81,216,227,22,203,175,187,+131,184,32,76,219,143,72,230,176,94,36,43,200,254,97,40,175,203,189,135,+224,240,228,103,44,57,6,177,50,222,86,218,108,82,242,49,111,136,159,204,+144,143,95,66,113,95,149,184,99,189,213,86,40,36,40,181,48,115,34,247,+245,197,112,219,88,151,38,199,100,248,30,235,237,183,73,124,26,36,20,176,+149,254,209,74,178,127,127,116,116,219,161,60,86,154,158,196,191,185,87,185,+69,51,197,39,37,143,244,176,94,102,68,144,137,145,123,192,22,41,152,247,+30,155,121,38,202,249,157,106,74,240,31,61,10,201,246,56,5,62,171,20,+220,250,2,249,204,193,187,212,105,223,45,50,245,87,69,203,235,144,213,40,+107,132,25,71,156,21,132,157,192,249,27,141,151,209,93,98,187,24,112,67,+197,93,251,237,76,122,71,175,102,130,1,39,97,95,245,200,220,112,133,13,+94,216,128,122,244,246,154,213,168,30,188,200,162,47,218,212,84,214,110,136,+103,252,3,40,10,162,248,78,19,172,104,106,114,176,165,18,49,19,178,17,+138,181,29,253,55,28,192,60,221,115,5,210,65,44,219,147,176,134,243,36,+57,233,68,131,63,93,53,198,88,103,92,10,254,220,160,157,224,112,111,34,+174,66,11,74,134,120,169,120,152,137,172,188,146,196,143,8,58,53,132,131,+248,231,0,195,201,149,182,90,217,103,59,105,240,249,102,113,95,130,248,93,+186,140,132,21,13,232,16,238,162,119,56,174,246,244,198,220,201,97,56,41,+13,93,60,225,210,245,140,14,39,51,53,186,85,131,241,253,196,158,80,63,+173,53,55,105,110,145,171,202,34,97,194,6,74,18,195,89,84,178,67,89,+14,137,65,234,253,7,8,193,51,240,204,189,189,100,103,157,22,101,98,115,+170,76,56,62,102,135,201,209,42,74,195,163,241,14,3,23,19,161,222,20,+57,231,243,118,180,11,186,75,14,195,103,68,40,138,238,253,160,85,193,193,+228,103,102,247,48,253,110,213,129,217,5,15,206,198,94,25,188,63,251,64,+134,110,94,86,38,246,135,104,140,55,205,40,118,150,250,85,212,78,199,97,+92,194,162,201,250,144,48,178,83,235,26,118,80,57,145,190,83,67,244,117,+241,157,186,151,197,58,237,179,101,160,56,215,252,218,193,223,237,25,140,110,+149,185,125,154,186,199,138,194,30,162,62,220,68,211,126,18,85,117,87,212,+87,123,246,173,202,236,43,126,183,10,222,175,241,71,84,175,213,147,138,237,+193,108,77,115,231,86,52,205,56,208,109,132,227,202,172,88,159,33,209,130,+66,105,58,42,245,50,167,118,171,225,250,194,4,107,128,184,110,210,1,237,+231,224,116,175,171,132,94,139,13,145,207,168,130,48,161,240,161,255,235,21,+126,85,159,127,12,20,176,133,221,99,153,160,171,162,109,7,68,172,86,15,+138,180,90,229,169,92,6,153,10,46,209,109,220,233,132,72,230,56,6,28,+254,204,242,223,199,96,171,71,220,221,170,125,210,233,254,48,19,55,3,120,+29,108,154,193,66,157,20,48,56,54,96,154,97,79,87,98,70,84,58,122,+0,211,124,193,250,186,225,250,98,145,28,102,70,239,11,232,137,245,151,62,+193,156,96,104,244,158,54,211,252,70,85,92,146,1,214,248,111,59,173,243,+227,1,0,182,149,6,210,31,181,62,68,51,224,47,195,57,249,137,210,123,+111,68,98,192,195,30,135,20,149,65,208,105,192,50,146,139,194,146,107,32,+151,208,60,75,29,205,252,206,222,41,252,66,205,19,94,11,229,125,131,132,+85,200,193,24,172,35,179,87,149,182,145,229,37,148,209,175,182,168,45,32,+248,5,84,33,179,250,152,185,198,217,188,198,231,223,192,125,50,97,87,144,+243,210,44,181,107,24,192,27,142,135,163,147,123,236,24,26,19,219,235,172,+42,5,141,228,233,211,148,140,169,55,13,86,40,102,216,93,120,90,92,84,+129,108,52,45,249,55,119,82,180,247,255,245,58,158,145,167,234,94,141,21,+180,205,8,26,109,38,73,73,42,237,8,118,233,88,78,102,191,51,187,86,+44,209,46,88,193,41,111,115,208,142,244,243,150,215,35,252,78,196,84,28,+182,226,83,227,115,183,120,44,176,174,33,202,180,190,5,2,190,47,14,16,+14,58,232,70,95,43,41,25,14,173,45,215,231,35,59,81,153,214,167,254,+165,10,239,24,0,78,44,150,187,198,107,185,28,43,116,88,239,239,52,33,+22,225,19,255,16,145,237,195,167,117,135,70,16,221,81,86,69,64,143,175,+242,178,63,131,126,133,140,154,9,5,162,187,117,92,87,66,97,216,76,18,+19,228,35,38,233,183,158,198,47,70,203,253,50,22,241,211,173,5,211,49,+251,218,44,14,199,10,130,34,209,107,189,85,29,145,83,96,78,219,103,64,+248,90,183,121,153,114,9,147,135,180,238,78,230,189,110,41,44,191,117,34,+40,84,255,145,128,131,185,159,60,119,147,32,238,105,222,106,252,129,15,146,+31,195,63,209,126,132,85,21,66,184,76,141,252,6,182,162,211,224,115,15,+82,186,24,76,75,245,190,104,45,189,199,128,254,156,175,150,17,154,140,37,+232,65,230,116,224,16,232,33,200,157,250,236,180,32,163,43,223,40,114,132,+11,215,74,224,15,203,21,108,182,165,166,107,86,199,192,60,222,124,17,171,+152,44,171,151,156,34,112,137,7,41,167,220,64,172,228,10,196,105,134,196,+130,27,227,203,34,255,62,63,64,101,205,237,214,25,224,176,60,149,183,190,+191,43,189,197,244,238,160,22,106,36,249,45,120,101,246,216,243,215,107,254,+183,80,164,110,126,197,197,212,84,7,62,73,228,240,118,157,235,179,239,24,+185,104,98,248,255,159,99,164,180,153,106,250,230,206,193,139,168,148,143,137,+146,51,187,227,184,96,73,110,67,44,147,120,10,112,210,241,171,165,92,195,+53,103,106,43,114,249,157,83,211,219,180,196,18,22,237,231,234,192,11,170,+106,144,133,24,201,104,201,198,156,109,57,123,39,65,56,126,165,17,237,136,+187,182,29,102,255,183,165,240,239,252,255,188,105,50,213,57,84,68,12,225,+188,63,212,191,111,83,250,116,43,171,66,148,165,222,149,206,238,143,86,110,+85,208,131,236,109,64,99,140,78,233,219,244,111,246,233,120,196,81,238,216,+12,194,159,115,42,161,40,160,20,178,222,31,54,105,37,109,156,38,199,41,+208,42,119,190,4,23,200,186,193,239,172,218,208,68,122,95,203,247,177,219,+238,89,29,164,177,179,135,35,111,229,56,64,243,52,193,138,50,83,184,107,+78,229,135,21,248,201,189,228,59,18,76,119,158,115,152,165,240,86,134,24,+74,74,96,63,181,36,214,177,143,145,139,225,46,220,213,33,47,54,114,3,+243,16,134,179,192,122,6,95,47,157,195,56,111,73,222,137,12,18,52,139,+203,113,242,100,29,51,246,37,17,110,172,65,14,196,67,32,184,7,254,11,+180,116,199,167,141,168,74,136,210,189,246,194,210,49,5,221,240,10,128,158,+179,78,223,36,136,2,92,46,19,28,172,243,17,189,67,57,239,222,80,133,+161,210,4,178,120,167,234,233,125,200,227,253,204,218,149,129,220,225,98,36,+236,55,10,138,72,98,108,121,137,130,253,86,212,101,108,80,25,118,228,217,+149,100,196,208,225,155,245,6,157,53,63,188,176,225,225,81,217,23,186,35,+101,53,255,130,164,106,255,7,45,57,209,100,213,113,116,59,136,83,189,89,+9,33,104,203,5,135,176,193,93,128,32,214,170,119,135,174,104,187,237,186,+214,73,132,114,198,202,216,142,219,205,25,117,85,26,168,146,197,33,28,3,+228,47,67,125,133,94,5,210,238,223,71,159,65,182,138,233,31,193,172,62,+221,34,30,132,1,130,168,44,132,42,79,84,56,149,192,101,148,126,51,53,+33,177,116,146,108,4,104,159,138,20,11,199,1,194,51,2,245,5,83,107,+25,78,82,126,202,11,58,201,94,184,243,174,207,84,35,70,11,135,97,191,+53,108,58,154,153,6,234,84,150,146,80,110,154,57,160,90,112,0,200,0,+61,49,110,92,135,64,113,85,253,15,36,225,90,129,149,216,80,253,173,151,+187,57,46,40,90,34,241,168,227,54,157,9,6,252,98,172,82,113,151,98,+62,179,55,52,207,98,129,216,165,191,42,177,205,10,138,215,116,72,2,40,+197,24,246,66,245,202,119,161,159,117,124,148,226,196,144,239,93,57,69,131,+179,255,204,3,119,202,34,140,144,47,131,120,203,254,16,110,3,214,137,178,+209,133,191,156,101,132,58,220,0,160,5,243,111,62,18,15,42,172,231,123,+115,250,32,209,238,207,111,142,213,253,48,43,222,253,23,223,32,220,40,50,+67,137,17,0,95,113,111,108,92,48,12,41,172,236,180,214,254,209,173,196,+164,188,23,60,196,126,112,149,196,246,131,132,55,28,60,115,11,67,168,151,+214,254,126,163,4,70,224,46,123,28,70,178,246,126,192,64,100,196,83,194,+252,33,28,83,234,132,111,134,49,47,141,127,81,215,103,154,135,226,252,37,+240,62,136,93,6,72,86,170,100,86,121,142,128,104,138,60,186,107,186,235,+36,170,30,59,189,172,40,235,10,107,212,38,213,59,160,204,84,54,180,241,+218,164,91,12,150,90,179,194,77,97,30,36,45,241,74,189,198,178,35,40,+190,45,197,30,61,148,14,192,215,86,201,92,59,229,88,70,136,79,3,151,+128,56,172,82,198,146,102,242,134,249,85,163,132,160,8,128,165,190,133,237,+173,57,249,74,78,89,169,78,233,122,149,131,22,209,198,127,8,43,27,241,+238,20,230,87,196,183,66,108,125,79,214,211,38,63,47,185,181,75,208,193,+151,66,125,44,147,136,115,206,183,20,99,243,22,212,55,179,224,30,44,18,+141,0,158,96,95,173,31,202,30,248,156,205,77,198,230,169,191,7,65,140,+145,130,152,215,112,105,169,248,32,123,95,63,127,223,153,45,34,173,171,98,+249,16,76,86,76,61,141,202,40,254,172,23,191,36,197,223,176,96,138,208,+129,222,243,156,240,42,26,45,225,125,163,175,234,218,121,92,212,129,195,105,+182,58,85,57,34,134,67,95,79,230,1,223,206,243,252,113,169,34,3,105,+142,163,182,229,13,87,88,213,195,112,162,209,254,75,14,9,224,214,44,64,+119,135,86,194,224,204,26,159,201,20,255,245,222,80,238,178,185,222,29,165,+78,33,100,197,247,101,102,3,246,157,129,188,100,117,44,180,142,53,89,41,+203,188,239,241,223,8,20,1,8,222,36,39,82,57,138,30,211,241,131,117,+221,21,48,243,80,206,118,111,167,85,198,87,162,206,13,162,31,254,179,13,+78,76,140,61,168,62,164,170,167,142,66,215,248,52,208,127,28,201,128,25,+235,159,37,5,53,69,85,157,230,77,96,73,62,18,61,115,40,32,129,178,+250,83,132,107,50,207,233,248,242,199,30,195,118,182,40,118,156,149,159,17,+58,245,254,235,192,7,251,11,211,231,103,207,241,112,24,25,153,144,109,40,+53,76,217,214,26,212,131,155,218,162,41,3,146,182,61,25,6,109,64,106,+122,45,100,223,107,108,83,0,4,61,112,245,117,146,68,149,130,118,183,21,+54,23,65,95,236,57,185,8,200,116,174,20,247,114,161,5,206,89,17,92,+110,19,115,223,72,89,186,24,11,207,66,252,83,196,144,78,176,99,57,18,+233,4,180,193,105,98,178,161,9,27,128,39,220,169,164,126,30,249,195,50,+195,247,123,197,167,97,73,49,234,186,91,44,198,200,3,69,32,214,105,124,+76,173,139,250,6,152,26,170,34,86,208,42,104,23,237,220,208,121,107,249,+78,203,183,191,33,181,194,55,183,77,95,50,123,236,172,91,202,182,42,98,+195,233,56,193,152,7,18,125,5,38,167,171,28,114,192,212,211,89,114,200,+162,98,117,187,86,119,135,77,240,170,173,173,49,15,214,130,161,118,254,170,+128,27,223,72,247,149,147,125,88,190,165,117,210,247,72,104,105,153,115,178,+34,93,13,5,6,122,240,223,96,233,207,231,105,100,145,250,200,212,71,162,+86,208,0,228,64,78,37,253,30,190,173,104,172,140,124,74,24,67,195,252,+50,42,199,110,154,101,29,94,77,172,224,241,7,246,44,57,130,155,74,229,+225,216,22,4,21,46,232,25,159,168,118,107,107,22,23,198,144,6,45,229,+95,163,35,105,73,225,249,38,33,159,69,92,248,99,97,174,246,200,75,241,+152,119,149,42,30,130,99,248,37,3,132,80,154,197,141,22,174,75,216,99,+96,239,0,173,85,39,225,14,149,191,170,4,170,189,50,6,102,37,101,79,+244,247,143,59,232,253,126,122,113,253,235,56,62,191,149,36,158,8,34,91,+183,22,20,254,148,88,199,115,117,154,99,25,203,172,100,41,2,245,63,225,+229,203,57,64,97,2,71,59,96,35,140,149,154,130,45,241,86,249,52,3,+187,28,55,216,187,95,190,37,167,216,255,107,169,218,207,215,242,210,63,79,+158,235,139,158,66,148,169,79,124,153,178,242,114,208,98,198,0,224,116,61,+114,14,208,54,115,17,172,14,44,96,190,28,159,150,146,188,237,247,130,130,+25,73,179,136,171,1,14,188,107,138,227,252,4,96,12,164,36,253,204,93,+170,151,60,92,59,170,171,85,157,20,185,116,164,107,42,31,225,84,96,75,+4,223,189,39,134,111,168,23,234,202,139,3,147,23,111,212,35,142,71,57,+196,196,37,7,254,159,114,94,45,53,225,77,176,131,16,219,206,99,88,53,+251,0,158,126,96,185,206,236,199,145,71,99,135,233,70,209,158,44,191,11,+180,221,163,40,139,189,19,213,93,146,227,157,148,32,138,244,190,20,150,251,+21,210,85,213,253,241,175,69,39,25,202,182,44,42,216,169,120,188,63,187,+7,45,105,201,109,107,25,94,70,209,140,23,157,155,109,12,245,216,167,184,+93,50,36,215,87,121,98,61,243,180,176,15,21,145,55,119,70,83,71,219,+159,7,190,233,210,154,161,134,82,9,250,56,122,243,78,202,100,183,192,4,+73,185,74,54,69,9,143,192,235,135,102,81,164,12,86,182,157,230,224,182,+60,51,239,140,229,174,26,217,248,90,55,36,149,229,86,230,98,80,22,108,+228,7,161,200,69,198,44,151,162,137,65,3,85,96,151,61,35,29,203,112,+59,146,61,100,101,217,220,120,65,88,96,174,134,234,156,138,46,175,217,216,+219,106,62,166,170,4,70,20,67,192,35,173,232,52,224,187,180,52,94,129,+221,118,146,74,246,202,25,206,169,187,104,28,80,133,133,94,115,51,41,214,+76,101,177,99,141,114,213,234,132,72,84,115,39,58,38,22,201,112,100,165,+30,19,51,135,45,255,77,83,64,60,62,173,47,38,134,238,42,162,255,5,+129,62,85,222,202,200,31,64,41,11,189,201,252,85,94,250,7,193,81,3,+245,164,79,28,232,106,54,138,136,207,71,84,254,172,216,19,83,133,133,112,+40,117,56,172,214,71,90,59,62,252,79,212,213,80,252,147,62,156,26,252,+211,51,125,221,119,181,197,82,14,188,52,39,21,211,142,100,106,123,9,220,+146,162,238,243,91,52,7,135,126,176,81,178,124,15,124,76,114,160,84,130,+218,249,68,128,1,252,211,12,87,10,124,106,113,189,153,151,160,121,245,146,+219,240,187,3,254,114,255,108,154,226,215,198,178,153,245,16,147,137,100,206,+148,238,61,157,138,65,21,248,146,93,147,159,166,162,200,29,191,40,132,201,+23,188,68,17,95,175,7,211,189,178,162,64,202,42,17,236,195,196,74,168,+119,4,239,126,182,245,4,227,242,92,235,201,255,65,80,30,99,139,54,252,+146,102,91,34,251,169,249,66,3,147,104,2,170,61,186,72,2,9,157,32,+48,115,199,141,23,136,236,247,61,11,28,78,211,78,118,113,201,27,83,3,+154,179,13,140,208,111,172,134,33,66,131,60,21,96,171,108,132,155,238,183,+94,85,141,247,187,163,142,63,27,248,77,178,72,225,176,158,195,42,136,247,+72,159,205,122,244,19,12,179,61,173,223,22,98,193,75,252,238,79,131,33,+226,180,76,152,55,12,48,68,53,43,1,186,169,115,185,82,210,173,207,55,+171,220,46,247,167,41,15,202,193,153,237,175,155,184,236,237,146,36,94,186,+43,88,176,218,122,128,194,227,118,139,85,78,131,95,156,168,77,199,44,114,+11,202,36,127,67,157,175,97,105,153,230,40,226,225,229,138,159,239,31,82,+17,163,36,108,13,75,41,121,237,94,142,42,40,113,102,200,36,162,253,162,+217,30,237,55,179,144,0,143,153,136,57,165,54,212,168,232,31,62,13,157,+109,13,43,46,191,145,80,171,11,213,1,59,109,146,88,199,12,250,239,109,+148,223,223,233,194,70,160,242,120,37,88,189,231,18,115,21,245,213,196,52,+240,193,108,34,5,195,101,141,191,20,165,234,99,48,91,52,24,191,197,235,+152,86,207,239,143,20,179,162,202,140,59,115,88,243,239,76,173,69,127,59,+104,138,90,187,175,51,64,211,80,225,116,59,68,16,26,74,210,22,102,133,+96,225,23,174,197,31,208,154,119,242,188,243,129,243,129,69,35,11,88,28,+227,158,13,80,17,94,249,238,166,80,186,214,177,244,243,15,207,61,131,115,+238,115,40,50,120,204,153,116,80,208,242,231,241,20,21,149,135,225,26,157,+224,124,226,1,161,155,198,218,51,80,16,49,127,47,18,52,255,207,137,121,+69,174,78,152,204,167,53,246,176,182,160,55,61,162,182,30,66,185,65,182,+175,95,199,221,188,143,167,204,54,204,4,178,26,4,171,132,168,39,220,11,+48,123,236,33,169,247,4,118,175,38,118,199,32,129,194,1,43,210,81,90,+70,85,241,95,137,105,66,183,17,163,238,79,172,147,59,255,71,145,183,140,+238,104,88,19,42,248,237,73,144,37,134,235,154,245,8,209,202,92,248,18,+23,24,55,209,115,178,87,173,153,112,24,87,190,192,101,68,152,221,95,178,+240,14,144,18,191,78,240,128,4,254,137,201,239,201,168,85,185,6,65,187,+57,0,192,220,181,17,211,110,230,113,179,197,28,131,84,31,36,37,164,233,+222,197,198,35,68,34,156,198,234,12,116,42,201,74,30,6,237,119,225,244,+207,28,125,42,245,112,9,76,184,3,134,235,38,241,53,74,189,72,159,97,+39,254,42,100,43,239,158,88,24,61,75,179,186,149,102,218,253,61,247,15,+133,210,245,229,65,168,224,67,183,209,250,139,124,60,166,183,4,160,154,56,+220,115,128,242,163,62,247,152,97,77,243,209,28,209,240,159,200,58,249,56,+67,149,185,130,129,27,53,118,173,227,30,211,106,254,210,182,216,218,227,153,+2,131,142,59,248,113,96,45,178,98,13,223,106,66,146,129,127,66,81,41,+7,204,13,229,138,107,42,75,169,85,96,172,66,212,0,150,97,38,116,207,+238,112,202,8,99,95,206,82,98,63,186,245,82,220,211,198,154,199,143,77,+84,57,192,42,4,127,56,31,73,159,207,149,13,184,200,103,42,20,142,153,+238,226,41,145,207,135,1,115,223,25,188,139,172,214,239,150,242,159,97,46,+95,24,50,155,157,130,107,33,54,114,86,134,85,108,25,210,204,228,27,151,+21,159,51,15,126,18,96,223,155,48,145,141,134,146,157,101,179,107,251,123,+215,219,117,128,125,197,223,95,210,135,167,55,12,156,123,235,63,96,205,60,+200,198,79,107,64,151,230,41,136,29,223,246,22,8,69,135,95,38,85,7,+21,0,240,158,78,142,223,151,136,142,18,231,83,236,18,191,39,183,134,218,+35,145,193,191,14,5,240,122,176,232,46,19,192,78,23,3,207,167,189,171,+153,120,24,36,154,44,147,49,62,157,194,20,115,184,223,140,117,111,173,114,+75,57,45,174,0,83,36,132,163,31,56,143,172,238,230,190,142,242,181,2,+195,89,184,222,204,134,186,28,129,122,95,176,76,39,164,125,210,223,158,26,+84,224,238,222,82,118,149,208,193,212,143,67,30,94,198,113,201,87,129,250,+12,170,233,102,246,132,153,231,143,242,171,7,15,58,90,4,245,72,52,234,+121,99,46,127,224,209,155,16,150,60,38,19,23,192,56,248,64,172,91,130,+185,245,64,249,9,196,246,221,50,117,237,141,169,249,86,190,73,34,148,32,+224,3,109,227,0,129,144,93,83,51,104,23,84,219,97,132,212,15,59,192,+218,212,196,160,17,244,157,32,171,204,136,228,206,84,35,188,79,38,231,97,+6,131,121,45,20,165,124,145,12,14,246,29,1,66,157,68,108,177,34,68,+132,64,175,225,233,9,101,151,67,36,238,55,228,102,102,10,109,7,233,173,+190,184,59,94,140,93,77,243,211,65,11,77,47,91,3,101,17,240,125,105,+228,192,85,54,247,238,166,120,95,57,93,216,61,43,30,124,90,131,35,236,+93,16,238,226,177,102,23,240,216,212,48,99,112,240,136,185,255,66,52,221,+143,54,151,234,118,126,173,193,161,5,255,208,227,186,65,57,29,20,61,154,+21,92,84,239,130,74,97,112,216,199,170,40,191,122,125,78,43,127,34,10,+187,221,183,64,85,103,40,26,85,80,134,114,202,253,63,25,180,193,192,193,+85,82,162,140,59,236,78,215,204,157,98,230,172,158,178,22,38,147,94,87,+13,189,174,243,136,226,34,173,113,47,118,117,75,91,160,93,237,88,113,39,+130,103,127,207,31,247,231,55,224,151,219,105,21,124,214,216,122,50,246,212,+26,142,64,225,131,78,124,77,150,233,67,63,152,202,101,207,197,10,28,144,+130,178,200,168,249,167,43,102,173,170,98,160,2,218,166,132,12,224,241,35,+233,90,148,186,70,136,127,100,81,115,203,219,6,173,120,2,80,187,214,201,+52,29,71,208,186,137,26,37,94,107,14,35,2,254,12,34,43,138,197,95,+204,227,211,85,123,30,172,109,98,165,230,249,126,46,135,120,70,94,171,158,+41,126,214,238,252,235,206,60,21,171,140,32,193,239,72,225,134,136,99,32,+179,158,147,46,110,230,86,237,95,84,82,175,161,155,42,177,91,208,213,104,+74,134,134,179,63,76,172,243,199,22,210,187,16,86,183,138,9,104,126,42,+211,144,207,49,23,68,4,73,96,99,77,45,5,2,205,208,0,213,83,237,+27,42,123,167,34,96,66,21,64,150,45,236,227,17,138,126,5,113,39,250,+143,68,26,34,177,69,44,116,43,99,158,178,170,73,123,227,223,160,52,227,+42,235,183,167,232,173,45,125,118,160,141,47,156,226,36,244,49,213,230,214,+31,60,221,200,171,66,183,183,107,184,15,112,101,52,42,116,35,0,2,36,+191,165,117,111,61,245,72,142,112,15,48,247,127,173,216,183,157,217,115,111,+156,23,3,232,52,204,138,52,158,79,5,199,73,80,231,197,24,25,173,19,+115,74,2,93,46,14,61,86,40,106,129,28,46,135,146,156,59,170,149,179,+173,106,152,74,47,114,23,88,144,202,109,121,33,188,12,65,211,65,172,159,+250,148,117,255,35,67,209,123,58,95,234,35,90,184,214,125,5,94,209,246,+78,146,13,106,144,95,144,245,176,242,253,187,68,59,170,239,204,191,6,157,+90,37,83,186,80,63,157,80,222,146,68,44,182,191,243,31,189,1,109,109,+143,166,72,228,217,170,183,52,222,90,100,193,107,128,249,6,53,226,81,131,+216,141,194,63,100,134,178,11,102,212,32,127,78,71,187,126,170,242,228,13,+248,122,238,227,217,53,144,65,88,104,128,150,10,98,163,3,89,239,154,15,+187,132,221,252,28,102,132,20,185,141,20,159,71,158,175,225,19,194,157,39,+217,253,234,127,196,128,233,200,81,118,4,227,208,149,206,20,2,159,168,74,+249,57,14,139,182,102,37,234,237,121,41,88,78,144,243,165,83,63,170,91,+34,37,118,155,199,49,6,68,8,80,42,246,156,37,190,166,99,96,108,36,+39,183,139,50,14,92,175,123,38,29,46,218,241,34,76,65,221,179,208,36,+66,32,215,3,45,136,164,173,36,6,250,34,158,169,47,248,171,58,150,250,+51,52,59,150,248,96,179,5,236,159,246,101,171,182,153,29,17,167,197,148,+158,63,251,60,104,160,109,89,211,242,190,95,248,96,10,12,13,228,106,240,+11,96,80,7,227,102,20,119,52,130,95,189,185,86,61,114,29,167,183,45,+248,163,115,115,21,146,227,205,64,251,115,56,201,218,29,8,16,215,232,48,+103,52,87,102,1,115,143,143,66,238,245,216,163,213,82,78,164,110,110,154,+212,160,37,27,104,255,255,152,46,56,99,222,233,48,219,87,94,254,251,251,+211,34,91,2,234,74,95,185,4,247,206,237,5,204,73,33,184,85,212,15,+146,98,154,73,60,221,55,216,161,211,251,229,204,178,140,111,62,178,226,145,+4,50,191,245,221,203,37,138,252,70,11,189,232,8,179,167,13,139,92,235,+46,28,144,241,25,162,36,105,62,73,68,218,66,180,175,59,14,108,80,157,+41,239,158,105,182,202,65,119,92,118,4,206,167,71,72,183,110,106,18,139,+179,151,27,231,182,187,147,114,49,90,92,87,24,249,20,186,190,121,136,35,+99,251,179,107,232,209,101,226,108,135,228,150,192,20,72,76,208,222,135,15,+179,117,175,208,201,242,67,131,64,67,32,175,71,239,74,154,107,130,225,32,+145,53,160,66,134,48,205,38,243,234,47,165,52,42,199,50,155,170,139,79,+234,26,68,91,87,0,95,197,183,92,84,170,133,84,189,189,226,106,184,169,+214,230,122,254,117,39,227,91,127,89,145,207,119,83,96,95,23,113,182,20,+211,108,242,17,56,85,35,212,33,182,117,221,228,138,51,88,96,99,216,26,+28,40,255,193,82,1,191,181,134,187,184,67,168,109,124,30,78,18,200,97,+31,3,253,60,220,238,201,153,241,127,92,102,225,237,147,94,49,52,76,127,+157,113,77,133,54,59,137,5,10,139,101,189,3,2,202,246,165,170,230,233,+142,124,168,231,240,17,85,159,35,239,152,253,4,252,43,0,255,198,71,4,+197,213,10,231,12,151,216,66,183,93,132,249,245,142,78,175,221,117,125,134,+183,171,115,78,109,234,58,2,51,140,142,247,192,35,135,153,209,15,190,203,+102,109,166,217,191,90,206,159,208,209,198,111,229,225,208,178,155,2,53,37,+0,70,250,122,84,51,114,251,9,130,175,200,230,161,146,156,253,89,101,239,+132,182,70,221,139,25,155,38,153,251,160,78,43,217,135,169,49,125,136,116,+67,245,78,140,54,107,177,16,186,39,18,75,59,137,220,76,110,33,18,231,+117,93,134,148,115,23,68,246,2,170,103,216,100,82,40,196,72,246,132,7,+8,129,29,189,3,239,240,107,215,218,133,60,213,132,39,129,94,73,63,255,+161,162,199,25,116,100,239,38,80,59,148,4,89,167,168,183,255,240,141,10,+155,176,159,17,51,162,101,183,234,85,218,71,215,236,28,85,166,170,75,180,+31,239,21,14,236,119,16,43,36,44,223,18,37,3,246,111,5,222,249,127,+210,78,101,3,181,198,250,107,97,53,229,85,206,109,164,137,90,225,227,198,+90,89,147,174,130,175,45,116,71,36,110,190,146,206,31,96,116,37,167,144,+146,153,25,146,116,1,238,235,66,224,237,185,24,1,236,89,166,117,15,217,+71,202,247,153,73,210,147,144,92,95,129,17,214,226,18,35,185,229,227,59,+115,244,20,45,241,251,142,116,138,85,202,38,180,166,58,142,11,9,179,1,+22,204,191,77,228,42,15,17,176,96,74,184,213,81,41,98,19,110,127,26,+227,162,165,151,186,240,149,192,204,192,170,114,64,145,220,85,129,85,70,94,+243,225,92,73,165,78,249,182,227,142,246,134,224,7,18,137,203,53,205,190,+3,245,215,167,79,1,201,165,40,252,101,183,116,161,160,219,150,212,86,52,+155,220,143,165,46,59,218,207,107,192,35,41,193,130,244,195,135,72,28,121,+81,124,26,103,86,249,11,91,172,73,133,153,46,216,72,250,106,44,151,184,+60,199,188,147,88,224,231,155,84,99,172,240,61,178,60,168,12,93,207,44,+84,233,56,156,18,61,36,46,220,2,185,56,29,149,72,99,48,70,145,78,+75,97,110,137,201,58,19,89,138,91,210,243,96,33,59,9,240,154,213,120,+6,252,219,71,173,204,94,101,56,80,242,167,105,150,9,195,101,126,88,216,+89,63,83,56,229,244,155,26,69,206,137,18,247,180,152,48,255,61,42,197,+218,221,136,52,160,163,156,103,171,123,144,188,140,139,145,173,45,247,141,181,+162,4,70,83,57,93,5,108,174,139,19,0,158,105,178,8,47,70,100,55,+167,179,245,97,155,0,76,122,0,116,210,2,224,231,82,13,132,143,138,110,+200,2,10,159,109,2,20,44,68,128,28,233,154,13,119,239,249,252,231,184,+17,223,214,252,176,58,87,11,8,96,76,116,28,233,240,15,53,43,110,110,+43,19,123,223,52,49,75,59,180,63,182,255,16,68,189,146,93,212,199,178,+26,89,47,181,75,217,199,179,228,167,154,103,158,21,175,13,235,139,47,98,+70,190,31,8,157,6,210,161,50,204,77,33,220,143,129,79,44,117,239,240,+207,201,106,117,17,175,163,188,250,180,138,238,126,59,146,155,122,70,139,204,+238,161,201,93,28,37,101,72,209,170,153,204,138,245,90,67,81,41,55,104,+177,40,188,76,13,119,32,41,36,217,28,93,124,41,63,36,91,130,63,153,+116,96,250,76,49,82,24,170,132,15,142,146,150,17,41,13,116,206,70,250,+72,155,161,79,97,116,57,242,234,23,92,216,86,121,99,29,98,176,57,67,+234,120,126,45,196,64,5,86,53,221,91,226,55,75,155,94,13,155,146,77,+9,241,216,29,46,112,135,58,229,3,164,110,45,238,121,205,187,75,192,226,+125,238,190,67,207,94,69,80,235,21,68,175,45,237,105,11,16,61,191,201,+104,243,173,179,139,235,69,153,99,63,223,106,120,25,65,177,211,20,49,73,+59,138,76,67,187,141,212,195,236,31,235,147,168,225,52,91,86,124,161,104,+22,34,15,251,115,76,63,74,219,84,203,94,136,161,7,232,50,195,29,161,+251,126,147,0,10,1,216,168,145,95,69,128,122,216,188,25,75,131,232,19,+154,34,62,189,155,132,212,144,145,141,164,118,176,191,130,72,46,42,15,131,+67,189,92,1,133,213,103,148,45,109,162,224,46,248,8,126,80,14,66,20,+191,43,63,32,234,193,168,234,221,112,202,186,209,160,39,2,80,113,194,241,+161,168,21,233,205,25,227,55,10,8,185,71,148,87,250,49,179,195,34,135,+203,144,154,140,129,102,19,89,181,131,190,216,38,232,102,157,48,233,167,172,+193,146,26,195,83,175,157,198,199,84,67,167,79,109,36,16,137,149,161,238,+244,16,226,40,118,165,32,40,48,234,36,7,65,58,176,195,119,204,173,126,+226,76,133,211,225,245,103,249,232,41,25,105,77,198,84,118,120,37,98,201,+204,209,19,255,98,30,109,46,121,228,174,22,197,19,243,148,130,45,131,166,+192,10,86,19,29,117,16,4,246,193,158,97,158,254,187,91,43,89,189,2,+91,13,36,167,238,80,13,170,216,76,189,53,123,133,11,222,217,40,89,159,+120,117,58,112,250,238,78,220,17,157,66,103,200,87,161,208,31,59,7,74,+37,250,252,14,226,17,34,232,23,187,45,195,144,108,206,13,63,193,45,199,+79,139,238,116,29,151,228,139,189,231,94,38,32,4,98,169,136,124,200,77,+235,190,33,28,75,16,254,205,139,47,57,98,78,21,94,49,25,218,235,80,+141,213,222,163,51,89,185,183,99,37,195,65,18,162,19,233,216,171,116,39,+20,24,187,48,95,215,134,193,186,228,242,205,76,248,157,56,238,202,46,76,+83,5,42,205,96,94,111,251,152,18,226,183,152,230,55,139,172,75,139,86,+99,207,4,96,186,166,20,171,66,121,137,99,37,27,81,32,146,25,44,116,+231,77,126,27,140,167,255,21,218,238,58,251,44,221,225,195,231,176,87,135,+108,48,181,160,88,120,178,185,122,92,151,6,133,76,171,138,243,206,131,142,+170,144,212,150,129,147,38,11,194,113,219,10,131,50,152,65,198,133,144,14,+162,212,47,127,222,232,68,95,77,94,161,195,77,73,121,83,82,134,71,156,+97,150,137,111,151,140,65,246,217,98,64,107,115,117,141,42,237,241,241,114,+7,83,20,195,27,103,234,182,159,240,131,4,185,153,149,152,173,51,31,188,+255,24,168,203,23,86,164,123,221,83,173,30,246,36,118,61,148,153,35,143,+214,104,210,112,216,59,107,48,195,216,19,123,110,56,6,106,216,111,210,115,+34,221,63,139,208,254,184,56,49,47,7,15,236,192,245,140,108,96,4,77,+196,41,131,52,106,224,29,40,121,243,252,210,7,14,205,139,99,35,71,183,+205,240,11,198,92,202,245,193,120,167,197,181,154,77,62,89,114,101,247,38,+201,44,150,171,254,152,201,3,100,225,24,71,254,14,232,209,119,45,194,136,+60,35,143,169,21,18,151,25,218,171,234,198,139,2,143,193,24,140,217,19,+44,55,0,75,60,130,39,65,49,50,95,218,154,213,191,222,141,184,21,52,+50,72,26,94,58,229,14,183,81,59,151,230,146,252,156,41,241,51,109,4,+32,126,28,151,173,206,120,136,123,244,109,223,111,154,159,151,143,4,31,119,+19,241,150,151,154,127,150,104,205,67,211,246,46,238,243,118,27,143,86,100,+250,29,12,55,247,144,245,172,92,251,119,129,221,242,228,229,77,90,237,178,+189,197,123,76,227,9,234,45,247,99,232,229,32,178,253,223,98,59,84,52,+0,135,82,0,195,178,160,153,3,61,216,124,39,228,137,175,220,135,136,1,+157,142,30,233,139,110,216,86,220,163,232,80,94,250,215,10,229,54,173,34,+211,146,58,105,116,56,74,241,204,116,19,158,42,184,51,70,191,29,174,91,+58,125,234,215,151,81,93,149,249,78,219,133,18,131,117,19,191,145,1,2,+246,144,64,201,229,235,61,126,196,58,80,192,234,67,154,218,7,220,124,174,+135,227,71,37,57,229,157,199,79,140,243,90,210,2,118,203,49,9,200,18,+240,185,64,91,153,132,75,114,82,60,159,52,24,121,160,194,197,234,181,11,+110,82,127,240,226,179,104,222,6,207,183,97,122,18,112,100,250,130,209,55,+228,30,102,121,111,110,23,244,152,81,133,185,254,144,14,132,55,158,53,208,+93,236,10,249,192,45,161,178,252,97,36,149,126,132,76,169,76,146,78,232,+174,125,209,147,209,92,221,94,35,70,2,58,196,63,84,190,211,193,241,209,+4,52,180,91,185,155,84,239,254,239,202,233,37,138,82,205,191,98,96,6,+75,29,182,84,162,16,130,190,75,251,218,139,226,44,172,73,145,144,9,233,+212,39,140,22,108,238,92,217,32,113,226,41,184,62,70,31,127,210,46,40,+88,220,55,9,68,154,229,64,238,146,246,101,137,8,43,42,226,110,99,251,+72,242,44,57,73,123,122,235,189,250,105,98,162,67,47,56,3,63,199,196,+7,223,83,138,28,17,59,49,199,55,240,176,176,211,166,17,42,198,210,36,+7,105,241,66,104,199,87,237,127,119,181,121,100,135,168,209,211,65,63,149,+168,212,111,136,197,120,241,150,255,185,148,154,250,84,184,118,222,114,56,120,+84,231,171,223,181,234,172,166,185,122,140,19,235,140,183,97,247,248,36,191,+114,205,147,169,217,43,210,62,196,207,253,104,155,50,23,92,161,28,43,135,+114,28,104,24,251,207,135,109,70,148,143,35,11,87,86,0,56,11,141,217,+152,140,200,103,164,102,224,215,249,201,103,216,186,48,176,220,54,7,83,218,+123,116,240,192,17,254,43,233,27,167,242,45,221,162,25,142,75,245,44,97,+116,47,165,237,195,13,102,235,87,250,20,26,122,155,208,31,200,214,29,22,+92,42,32,139,160,199,146,210,231,185,206,222,139,233,136,16,216,188,137,163,+242,123,149,173,96,239,40,28,90,27,124,88,127,153,45,9,227,117,16,162,+4,118,123,37,34,13,184,82,249,242,81,44,23,212,160,124,50,187,183,48,+245,5,171,48,63,230,103,13,181,102,204,98,210,51,12,120,26,226,33,162,+199,200,167,126,221,129,156,195,204,15,153,49,189,17,151,238,173,99,40,101,+87,92,2,88,88,100,150,202,145,180,207,17,204,65,152,178,170,165,220,135,+56,62,1,202,229,86,151,59,67,150,246,158,167,248,191,60,75,198,137,191,+128,148,134,114,172,15,175,73,223,40,174,52,214,222,110,32,244,6,198,213,+190,103,180,253,180,181,60,17,186,176,9,133,7,170,35,141,150,146,54,88,+236,215,236,7,229,226,200,220,1,85,173,38,113,30,159,213,8,22,207,28,+189,104,140,220,181,173,163,225,59,33,53,52,169,229,235,59,52,237,235,0,+226,145,210,163,161,220,244,100,124,224,102,218,217,226,253,83,90,161,219,209,+99,43,91,27,53,237,31,18,249,118,41,149,177,150,37,236,75,18,65,112,+44,131,1,201,177,56,33,198,241,1,121,76,241,41,135,58,44,65,146,59,+16,67,255,147,209,196,131,77,177,225,136,181,148,231,43,157,240,54,237,84,+5,180,221,231,198,0,25,234,16,7,168,218,69,208,163,13,242,119,249,118,+67,57,60,135,127,235,114,32,255,100,126,79,9,216,177,53,26,115,76,70,+185,4,6,106,150,60,16,189,237,1,184,85,53,137,57,31,216,66,37,59,+78,196,161,35,13,184,104,146,128,198,188,233,34,201,156,1,147,94,194,70,+154,96,85,169,53,106,202,199,54,98,154,215,52,174,80,142,11,63,184,130,+215,244,76,65,146,88,156,64,76,45,219,204,124,228,87,161,116,199,220,32,+132,223,185,153,232,185,182,213,120,40,192,211,166,17,9,114,119,3,94,152,+211,185,211,226,208,2,12,6,92,73,30,251,225,184,141,233,73,235,102,151,+156,31,102,133,19,180,247,212,248,32,96,151,4,189,161,73,107,247,169,2,+151,45,223,231,216,38,149,80,146,159,173,250,210,254,159,235,88,56,192,196,+27,61,230,72,150,226,65,73,142,229,189,231,35,205,250,232,226,252,215,42,+78,126,82,70,186,125,6,115,47,126,75,178,247,177,138,249,59,145,18,198,+147,186,167,240,28,170,202,100,197,147,19,24,221,222,168,74,201,235,139,177,+80,105,69,94,116,56,19,151,9,137,199,229,127,48,130,125,182,61,173,157,+208,78,74,223,38,194,150,5,105,77,100,225,63,56,152,96,140,33,150,24,+218,134,108,152,138,92,136,189,56,229,180,39,226,235,146,192,255,171,248,0,+222,86,3,219,180,64,83,211,95,196,144,226,41,101,119,224,28,195,205,42,+222,115,97,208,193,41,224,18,121,210,162,173,179,58,223,23,24,38,246,22,+84,14,191,198,34,36,225,98,122,173,47,25,110,249,6,126,253,95,106,125,+97,39,177,82,79,65,184,243,235,95,194,35,89,229,222,63,248,114,116,202,+182,77,15,206,154,74,58,102,114,188,35,244,24,103,61,127,199,50,56,237,+180,105,202,186,107,190,178,241,159,40,202,3,182,1,81,167,41,102,181,55,+62,172,157,13,104,71,249,88,141,6,204,148,134,187,221,146,32,133,159,111,+78,143,47,126,229,79,67,76,226,100,115,214,84,11,169,75,85,248,171,188,+4,41,115,60,186,254,133,97,49,228,192,53,29,215,153,242,74,69,228,156,+228,20,241,245,50,74,135,224,147,211,202,184,48,105,230,252,102,212,133,36,+117,133,25,16,68,190,45,51,201,249,226,250,164,199,204,209,192,159,1,232,+214,137,76,65,101,243,57,26,144,90,103,212,97,31,55,10,63,41,2,122,+112,27,202,226,129,16,224,32,117,85,194,141,71,63,161,249,89,63,127,172,+12,62,240,57,0,2,20,183,231,11,236,165,61,94,140,78,163,210,55,58,+254,25,148,230,149,211,245,159,67,59,200,142,172,248,105,225,79,52,112,48,+106,17,22,164,68,135,105,79,117,190,29,120,247,37,252,29,155,253,161,173,+156,77,74,255,50,162,67,211,15,18,253,110,16,240,58,4,253,208,70,192,+152,229,106,167,160,0,9,208,181,242,80,22,160,219,101,3,154,229,100,3,+61,164,110,149,245,162,17,192,78,97,123,43,130,147,18,37,225,53,39,10,+203,134,194,151,90,99,84,121,246,236,127,153,226,0,134,184,104,242,31,144,+33,150,217,139,234,132,254,193,97,146,206,52,75,120,29,93,175,101,221,73,+117,239,219,65,202,229,129,175,249,184,103,10,105,143,198,106,22,82,114,142,+198,243,143,194,157,107,49,57,217,215,160,238,125,75,165,115,205,200,251,146,+23,146,2,36,9,145,194,250,154,87,225,10,231,197,172,105,199,144,53,150,+167,120,136,145,145,168,163,197,119,44,58,120,229,73,28,8,36,103,217,22,+49,182,240,137,28,223,230,16,121,27,252,85,195,240,144,226,90,237,198,138,+183,187,77,145,80,21,200,99,39,76,215,40,154,191,106,205,66,160,119,189,+181,87,183,53,26,103,37,94,172,165,89,9,47,45,214,234,4,195,101,152,+80,34,176,180,225,66,232,83,106,95,179,183,171,41,236,205,121,205,207,54,+15,212,242,140,2,234,159,232,112,7,27,90,221,34,186,166,185,198,109,44,+62,114,45,224,190,93,83,201,191,148,185,176,139,237,197,32,59,178,152,165,+175,192,222,185,201,163,13,66,168,43,70,128,12,150,85,248,117,63,187,222,+29,60,176,181,220,43,130,31,55,116,195,34,181,190,42,221,69,141,247,129,+252,49,139,77,185,80,138,234,231,37,60,31,65,166,91,64,207,106,95,176,+232,160,22,109,158,34,160,129,127,235,214,212,34,188,136,76,24,226,52,238,+235,239,204,3,42,237,110,73,134,237,1,103,17,190,138,132,102,88,133,30,+216,207,79,89,68,244,165,28,12,67,99,92,194,24,33,11,43,92,11,197,+21,76,175,223,60,14,101,194,172,29,168,241,94,103,28,31,67,146,247,37,+180,13,80,208,211,51,236,173,142,126,22,242,255,100,205,189,66,228,188,206,+233,143,176,39,80,98,249,176,203,190,64,203,149,30,150,235,189,26,19,201,+141,104,153,91,33,167,23,128,133,1,147,71,202,166,221,79,165,135,145,140,+3,95,55,79,74,154,40,232,178,220,242,120,50,139,185,118,54,255,217,34,+56,247,41,216,158,101,77,146,23,134,24,42,192,26,36,109,207,87,227,104,+31,32,174,1,246,73,87,149,69,91,56,112,164,3,139,27,255,81,224,29,+123,190,211,22,108,191,131,116,183,245,48,19,154,7,241,101,131,149,53,79,+254,130,67,151,101,237,32,60,164,57,249,166,211,155,190,204,151,129,204,34,+114,135,184,73,54,100,80,165,60,216,33,173,4,100,246,226,115,203,17,219,+187,139,152,132,118,140,113,97,67,86,112,214,110,4,214,105,163,255,157,17,+189,29,224,140,144,94,247,45,254,253,10,108,214,132,190,213,155,38,47,207,+175,131,131,101,67,252,35,163,90,206,17,45,69,128,151,47,111,115,194,70,+140,85,164,171,38,165,220,222,216,66,113,251,116,125,93,203,110,232,33,92,+38,238,213,100,230,182,20,170,237,11,93,78,49,116,235,107,181,241,47,131,+161,190,41,191,86,130,247,179,232,144,185,62,209,133,8,181,52,229,122,29,+44,142,51,254,180,16,27,45,5,170,202,211,136,214,229,55,179,179,150,245,+178,158,88,123,151,222,246,134,225,14,180,203,8,5,237,159,128,206,14,220,+31,2,184,132,137,111,65,93,42,131,62,187,180,23,163,25,39,49,126,21,+171,175,209,67,197,244,62,26,66,58,4,65,41,178,214,138,43,43,236,207,+185,209,81,95,238,49,108,3,152,33,142,106,167,182,6,238,99,245,112,190,+109,136,118,49,142,139,195,121,109,45,19,5,175,76,2,178,233,177,13,55,+181,230,80,71,249,173,231,15,58,7,202,12,2,97,250,188,16,152,212,87,+136,92,196,194,190,180,56,240,242,9,237,226,159,116,213,184,20,234,222,189,+70,111,213,157,231,85,180,57,180,14,114,152,177,229,41,35,222,217,115,42,+66,144,131,247,199,88,8,174,250,199,53,31,7,44,188,157,84,138,239,6,+59,16,66,112,214,190,245,179,40,104,88,141,141,115,158,231,165,110,197,252,+206,66,63,104,35,49,109,9,7,109,160,10,132,20,87,40,191,156,193,30,+247,158,49,92,222,116,14,6,189,14,122,50,214,255,162,169,167,100,123,177,+79,203,198,79,128,70,145,213,24,230,163,44,204,138,138,250,13,157,254,85,+17,202,190,126,104,236,245,170,149,126,86,63,218,216,146,179,190,248,209,160,+90,158,63,245,99,35,225,175,110,189,57,155,131,138,70,86,22,143,247,13,+75,63,152,165,206,45,97,252,16,197,59,36,213,199,246,196,187,242,53,51,+166,73,19,152,59,87,143,210,8,176,213,222,73,162,161,5,169,97,55,120,+102,197,0,109,122,23,134,11,97,56,58,172,241,176,30,61,199,31,157,134,+223,148,232,149,142,251,14,7,206,55,229,37,87,17,197,236,152,237,158,180,+56,247,21,140,234,79,144,12,110,106,58,131,139,186,29,20,199,203,176,186,+58,34,126,119,139,178,20,244,10,246,77,245,108,136,237,7,249,98,102,206,+146,24,167,102,158,75,238,143,108,15,117,219,66,19,118,28,41,239,41,126,+37,88,18,139,12,132,40,192,145,68,168,101,226,178,43,65,71,30,229,39,+52,46,68,203,226,150,173,100,195,110,140,24,151,59,109,102,9,65,185,170,+5,9,221,121,45,75,128,80,222,41,166,71,17,118,178,40,169,98,103,139,+23,203,36,166,134,179,113,124,185,11,240,6,171,196,22,84,58,115,60,152,+3,96,75,138,222,118,83,60,54,160,38,84,241,183,7,237,15,169,158,116,+40,165,0,79,139,196,217,138,244,211,149,228,235,3,20,55,79,122,6,50,+20,150,201,225,242,194,39,169,84,214,25,138,239,191,235,146,1,87,159,70,+194,187,196,47,155,131,170,251,173,200,37,108,53,127,175,63,140,221,33,173,+180,179,98,148,105,77,240,80,230,4,144,96,38,155,234,92,165,245,123,174,+0,0,194,87,187,71,36,172,228,115,114,25,231,35,249,47,3,168,153,86,+211,2,104,180,170,148,47,20,97,213,158,30,39,116,250,245,215,171,214,151,+116,31,188,162,154,237,137,99,86,180,188,134,177,193,127,101,75,108,40,136,+99,215,230,102,10,24,147,58,233,91,153,184,81,87,97,174,194,0,184,53,+90,213,27,31,42,219,219,0,99,153,116,101,161,52,167,92,188,226,161,45,+218,46,197,147,218,5,17,15,97,248,59,87,212,57,178,192,131,65,236,135,+99,138,248,157,134,5,171,201,101,66,116,219,203,105,36,234,243,89,153,130,+78,170,217,160,23,138,82,65,203,5,135,255,47,119,151,253,179,32,184,90,+153,10,129,199,89,210,244,250,232,7,74,36,246,115,93,47,0,118,155,20,+237,100,116,26,224,150,77,221,156,125,248,88,51,136,237,248,98,214,27,234,+233,100,147,59,213,84,153,43,43,201,138,14,114,192,59,191,206,70,63,22,+95,28,94,34,241,43,164,231,216,134,116,223,17,236,219,109,53,79,68,63,+187,23,96,29,217,173,153,30,248,144,50,173,109,81,0,82,22,200,213,202,+228,218,132,120,199,58,51,133,189,21,62,163,134,10,57,254,238,171,8,235,+194,45,169,229,104,54,68,198,190,126,105,124,92,244,152,140,84,103,96,154,+155,221,207,203,71,49,127,226,221,68,62,19,66,59,171,234,69,104,127,114,+101,162,255,122,187,8,98,139,28,190,55,29,37,255,99,79,217,144,169,28,+205,102,227,147,49,163,25,42,155,113,48,199,180,80,92,28,217,77,246,150,+255,100,163,34,176,15,221,214,243,125,220,249,248,1,134,41,108,154,252,219,+123,71,129,12,17,133,11,219,221,168,196,212,235,180,217,133,131,225,90,167,+209,88,64,69,86,40,193,116,55,187,200,43,65,144,182,204,15,92,100,240,+193,172,193,195,104,75,86,124,20,126,173,55,134,10,228,126,238,215,71,20,+102,230,220,104,1,39,36,227,192,198,224,4,88,25,98,242,91,6,46,254,+124,248,202,24,140,122,163,211,114,134,72,19,44,215,148,193,150,95,223,184,+184,167,225,44,239,172,127,231,214,211,146,40,86,94,96,54,24,42,123,251,+105,135,250,21,194,225,218,210,141,20,60,234,20,170,8,175,202,238,1,154,+240,222,73,240,130,101,197,27,7,221,59,45,180,231,215,82,36,185,90,6,+137,14,17,109,100,236,85,230,84,176,129,115,210,68,0,91,240,66,1,30,+119,196,205,140,10,47,232,2,32,214,192,24,9,230,85,142,180,152,189,30,+39,157,253,104,16,224,129,0,20,75,61,127,195,0,101,114,165,36,226,28,+187,164,186,225,111,85,208,109,222,18,39,114,147,107,104,135,89,29,17,155,+140,32,202,136,168,178,172,107,37,15,207,33,219,136,147,125,212,203,242,241,+58,80,72,144,121,250,60,157,14,203,35,13,135,64,218,56,223,115,197,1,+206,211,62,81,176,179,65,234,114,38,46,10,222,68,107,187,63,59,210,147,+146,46,145,108,10,144,200,173,149,75,252,199,245,95,4,32,149,193,137,254,+61,212,142,245,153,103,1,234,240,108,111,111,63,169,228,206,149,203,244,89,+148,58,233,71,130,50,73,132,147,4,132,192,78,42,181,148,44,247,53,199,+157,178,213,233,155,185,244,154,37,39,4,102,181,159,122,225,65,170,27,253,+6,50,25,163,150,66,3,95,200,27,21,227,86,84,85,63,111,186,91,135,+108,53,120,41,131,111,181,233,98,180,98,63,3,30,16,134,69,179,15,116,+235,146,126,216,137,154,80,59,112,100,86,13,221,90,151,246,160,227,164,115,+21,177,244,10,137,172,149,114,250,168,97,81,17,52,146,48,226,59,104,144,+83,79,78,254,217,9,29,127,25,95,215,42,105,125,95,25,69,168,225,136,+155,215,31,66,22,103,190,221,104,108,43,183,187,42,10,200,16,67,129,254,+253,215,109,177,197,127,253,78,195,78,65,138,95,63,177,14,13,148,55,213,+49,231,97,123,47,134,142,105,52,28,244,67,173,132,199,93,126,10,219,242,+206,92,6,14,234,153,45,65,183,54,209,170,97,74,193,176,188,95,58,159,+235,187,11,11,191,230,206,16,33,73,41,234,166,123,30,156,218,21,224,235,+151,146,58,117,88,96,154,70,175,29,190,196,173,42,106,10,105,209,19,179,+185,243,228,240,200,87,177,112,151,204,246,151,0,66,227,109,161,215,204,104,+81,83,151,242,116,192,168,192,108,200,32,74,175,249,214,50,121,166,105,73,+18,247,110,72,45,241,114,247,160,148,216,19,178,241,148,251,161,144,212,247,+196,198,155,161,150,109,140,69,62,201,146,31,158,111,113,56,224,124,26,212,+30,38,18,184,33,200,175,49,44,130,170,243,136,249,138,93,253,44,32,242,+50,245,199,254,89,79,124,186,170,71,224,157,228,132,162,233,224,35,123,238,+210,39,32,205,73,119,255,156,13,204,43,198,20,118,49,110,126,177,94,64,+191,247,133,147,126,170,117,11,20,13,179,58,65,53,192,246,232,53,11,247,+152,215,132,68,145,155,12,152,232,123,2,183,188,174,127,93,37,223,47,107,+33,180,171,61,187,201,83,42,66,65,144,250,218,137,59,227,199,186,58,195,+171,252,241,107,0,62,56,12,161,16,140,80,192,95,16,89,27,184,253,124,+209,103,188,43,113,64,36,2,229,167,184,99,24,79,225,106,186,21,101,137,+43,200,106,56,3,136,0,148,60,114,149,210,146,237,219,220,52,66,130,245,+15,193,189,203,42,69,39,52,123,97,183,39,183,244,218,49,90,93,153,186,+196,113,40,77,72,210,39,45,169,100,10,109,24,155,0,20,47,124,250,90,+59,80,202,96,89,40,253,88,246,177,30,40,219,27,227,91,85,113,18,109,+225,177,47,144,40,103,253,105,95,46,48,84,36,133,213,79,30,247,49,13,+61,37,1,171,190,20,240,119,191,231,232,32,13,148,73,129,208,110,76,111,+218,24,62,119,251,173,117,127,42,180,209,251,124,225,103,29,105,72,232,85,+98,83,72,126,69,205,22,146,253,59,159,95,232,117,213,168,121,96,215,189,+79,166,158,59,150,205,173,133,63,0,167,118,173,101,104,3,60,227,170,109,+145,41,211,26,9,204,16,203,41,246,23,71,173,7,141,161,145,185,40,245,+1,48,83,6,38,117,140,53,31,81,157,212,33,201,198,71,183,234,204,109,+238,158,30,91,150,89,102,134,51,199,62,11,182,216,194,208,110,127,37,156,+29,48,199,121,96,52,131,126,186,19,246,106,125,120,188,170,135,151,239,110,+24,115,75,78,252,211,17,199,149,116,158,131,115,101,130,3,100,130,228,23,+119,128,244,221,104,192,165,37,112,59,167,205,125,235,29,156,52,220,83,39,+24,86,77,7,251,69,159,49,25,84,242,187,164,115,248,88,14,189,188,35,+213,140,220,140,9,197,222,248,81,186,153,53,160,92,122,219,153,73,38,121,+188,174,134,210,69,242,164,3,21,23,81,42,97,232,184,144,73,39,42,30,+165,166,75,154,159,146,141,255,142,42,170,240,36,181,109,21,77,136,136,51,+176,111,11,220,115,172,145,11,27,121,141,158,76,244,238,43,250,191,74,96,+41,85,51,29,23,76,177,9,208,159,131,3,140,248,56,132,104,132,209,157,+143,102,167,82,202,21,242,52,207,160,18,183,250,23,154,164,63,113,170,176,+17,79,5,108,250,196,139,211,186,4,69,175,74,1,14,207,101,10,5,199,+210,185,165,199,84,202,254,194,104,65,102,84,40,81,90,81,214,165,159,222,+167,128,110,118,226,151,234,91,248,172,192,65,164,56,148,80,160,108,90,20,+12,243,167,183,119,167,70,136,138,77,74,184,79,60,184,160,65,150,171,218,+7,13,167,113,68,16,238,72,129,149,228,179,2,74,172,121,2,138,136,82,+213,77,37,171,158,210,74,173,146,75,134,27,24,63,0,101,221,18,29,30,+95,108,229,212,160,103,133,87,152,198,180,14,196,120,251,50,211,139,152,47,+182,238,220,50,208,185,62,217,175,194,202,201,147,69,222,71,157,238,116,43,+43,133,68,54,202,246,98,123,81,201,252,189,77,113,58,194,143,17,254,92,+201,95,252,121,91,116,245,89,192,176,109,49,191,126,234,158,40,100,49,56,+3,234,152,129,226,168,77,4,160,42,56,114,5,52,181,1,132,2,118,6,+29,255,205,106,100,104,53,150,248,225,87,147,159,205,219,132,17,128,208,93,+99,73,42,203,145,227,156,156,176,207,217,113,124,102,28,86,45,157,254,10,+211,184,199,47,215,44,67,186,178,245,49,211,220,155,36,62,245,74,100,13,+170,136,70,105,88,126,248,67,255,102,198,154,123,164,214,182,94,110,149,145,+213,143,207,159,249,30,27,167,100,45,156,236,244,147,94,205,82,48,204,236,+198,103,103,252,36,94,242,48,184,156,106,154,58,13,235,42,178,202,194,184,+153,20,157,130,235,24,222,6,31,61,118,80,229,166,220,72,240,158,202,64,+150,140,138,76,36,106,124,203,177,150,240,103,12,170,251,150,105,218,237,234,+83,92,194,205,130,36,9,21,229,191,35,170,71,125,80,184,222,30,239,19,+58,179,250,99,60,191,88,18,194,151,249,34,125,238,4,18,237,94,135,206,+60,212,88,46,80,100,28,22,229,174,41,210,101,110,141,131,252,45,101,36,+221,175,14,182,40,50,249,209,185,115,129,82,53,228,209,223,214,204,146,136,+187,23,63,114,22,200,236,155,142,168,126,34,197,187,226,159,246,222,118,62,+212,158,149,153,202,142,115,222,24,17,254,207,26,131,108,82,191,118,217,47,+47,127,253,13,121,138,46,170,16,139,112,72,127,130,71,249,102,109,205,217,+41,20,17,249,3,207,68,255,120,208,19,73,161,205,54,219,27,232,253,101,+217,226,121,95,144,219,119,248,97,250,74,214,250,179,140,65,166,229,66,185,+126,66,176,174,70,29,91,218,89,68,236,220,234,51,114,165,98,239,225,59,+189,64,50,42,0,204,205,143,233,145,165,145,231,205,74,114,166,169,214,208,+132,84,97,88,254,232,145,206,251,183,109,184,51,55,17,228,107,85,196,76,+153,229,79,215,165,77,92,54,208,75,200,30,151,43,134,175,226,184,114,230,+28,105,248,34,181,83,116,16,247,253,47,54,122,3,117,205,10,138,140,112,+228,86,172,18,217,180,254,195,26,116,158,207,156,69,82,207,30,11,25,233,+254,242,112,30,168,197,247,202,99,238,141,104,197,184,147,46,97,107,89,73,+194,181,247,185,198,2,95,128,168,36,167,223,69,72,5,133,119,17,225,180,+96,126,13,39,93,111,122,66,93,151,167,174,147,16,34,26,29,129,253,24,+200,168,144,58,200,31,94,231,226,139,93,222,183,96,254,254,143,161,204,254,+39,157,167,248,111,69,82,251,134,151,130,126,65,255,149,243,201,35,41,191,+30,145,29,87,62,223,61,254,83,88,127,57,15,176,5,125,66,236,191,154,+184,110,174,233,126,46,95,11,143,18,20,232,158,177,58,33,201,95,127,19,+132,108,255,188,117,230,198,137,187,39,244,144,239,178,44,241,103,19,73,132,+65,108,84,196,148,179,150,39,21,44,203,151,72,104,65,125,43,191,250,194,+253,55,64,47,171,233,115,8,198,32,238,69,34,208,143,16,194,101,8,181,+45,237,195,210,44,197,79,238,220,132,249,190,21,200,184,79,162,104,26,100,+192,82,170,105,90,37,37,55,210,121,18,62,188,81,27,179,146,232,239,82,+3,167,131,64,207,142,43,96,69,94,176,198,138,61,117,232,51,174,183,246,+198,106,16,78,253,115,232,4,250,226,20,91,69,86,211,46,70,37,247,182,+44,142,119,123,128,152,122,158,209,0,46,46,115,90,158,10,52,41,210,232,+104,63,113,105,183,26,236,26,141,254,117,174,185,143,48,108,220,186,119,85,+183,122,122,24,7,194,191,42,135,183,185,241,170,118,167,87,159,49,101,195,+88,66,111,100,150,236,173,81,98,189,120,237,14,165,224,56,51,84,27,237,+45,201,248,101,129,151,144,247,229,107,5,204,229,234,136,78,57,57,178,65,+139,184,206,38,118,142,34,220,80,125,19,112,195,219,89,111,94,166,110,222,+163,141,45,196,122,166,146,212,169,31,89,209,212,63,232,45,244,94,143,243,+239,108,67,94,53,223,123,76,81,177,7,179,167,107,68,255,165,242,77,219,+140,179,142,24,250,109,241,81,232,124,32,232,129,118,90,237,27,189,91,52,+135,156,251,237,149,76,108,178,51,137,248,109,206,21,221,144,97,225,218,234,+226,161,250,211,35,81,27,187,110,85,74,55,99,49,153,48,30,97,226,101,+32,200,10,211,12,204,236,4,116,159,198,199,94,107,252,35,203,168,66,158,+110,115,26,134,28,195,174,191,63,123,168,253,28,76,15,98,69,201,32,167,+19,154,66,65,78,81,18,94,126,67,158,36,33,14,173,14,128,91,144,109,+5,167,93,80,195,163,247,5,174,109,25,166,170,155,238,1,169,15,54,3,+184,20,203,140,83,59,241,110,157,135,236,55,169,250,64,244,233,68,203,222,+107,93,193,231,59,64,67,71,169,78,240,209,11,31,79,23,170,47,212,23,+246,136,58,185,18,49,188,245,138,95,75,184,246,245,58,77,24,221,41,238,+177,141,118,180,235,172,208,65,2,188,237,4,124,234,96,98,66,130,183,136,+209,51,244,38,154,97,21,71,125,217,241,124,210,150,206,108,158,111,221,35,+116,35,157,21,135,37,136,222,182,167,104,194,78,147,98,73,28,192,86,142,+124,55,247,69,120,197,227,127,129,30,93,188,46,237,176,131,169,168,137,33,+44,164,152,81,149,13,18,37,85,33,191,114,249,254,180,63,82,12,62,197,+243,92,184,29,9,52,220,74,200,7,134,117,219,92,101,198,212,94,4,116,+105,19,250,196,79,84,130,198,219,245,165,73,158,160,164,144,233,87,133,162,+251,85,135,254,32,59,193,12,15,10,118,84,10,0,68,96,200,99,5,224,+93,170,65,251,191,207,62,6,208,70,47,59,62,185,163,216,144,167,240,4,+45,7,124,188,189,68,145,72,253,237,161,58,191,104,26,122,64,212,213,219,+153,215,152,57,194,99,126,81,197,240,81,167,200,219,31,180,212,97,45,218,+230,37,167,239,216,3,2,83,58,248,214,63,253,136,168,8,0,224,226,124,+131,88,171,20,15,138,171,182,197,190,96,88,117,189,208,222,249,32,75,60,+199,99,68,49,243,169,100,191,215,21,154,123,45,204,69,111,195,240,166,78,+232,156,186,133,35,193,243,19,122,62,157,232,155,211,105,18,12,20,172,167,+218,9,168,225,58,183,59,208,227,33,139,95,25,28,75,72,93,211,98,21,+93,191,168,223,172,245,117,203,223,129,105,115,108,151,143,76,247,120,204,34,+30,222,233,192,198,72,216,150,148,178,132,4,96,185,127,126,172,195,49,92,+24,141,200,62,115,111,213,188,18,133,253,206,82,127,114,78,169,60,48,14,+189,249,176,79,251,151,129,211,54,181,133,238,251,250,214,88,75,57,95,42,+69,207,217,177,123,72,205,152,211,6,148,26,147,27,205,78,188,174,153,9,+208,12,231,204,14,85,61,247,175,223,63,112,228,175,73,147,154,188,153,3,+184,87,110,176,26,48,13,133,17,65,223,108,187,221,217,161,168,87,182,236,+219,130,191,49,88,239,62,12,43,92,39,121,192,97,165,117,78,51,156,82,+149,33,118,80,36,48,147,180,157,74,48,152,8,33,70,189,35,92,27,227,+161,205,94,10,246,102,218,162,23,154,36,179,190,130,177,156,45,214,161,95,+161,2,24,241,180,36,163,128,25,22,2,214,202,255,45,213,162,189,181,82,+199,100,93,214,18,74,148,243,136,131,54,246,146,73,69,226,217,142,131,223,+84,89,202,124,76,193,140,209,182,138,67,244,78,35,111,22,10,47,238,55,+202,191,93,210,44,180,4,218,148,106,152,208,57,193,36,234,96,225,253,100,+171,69,3,220,127,235,67,113,213,54,240,140,27,159,180,25,112,124,37,33,+136,8,151,153,65,136,142,14,255,48,85,178,247,14,94,159,175,163,103,172,+84,142,1,60,238,192,137,76,5,66,7,233,130,59,191,183,48,182,128,147,+191,211,236,88,200,219,159,71,212,61,195,128,214,29,82,90,253,173,159,7,+93,171,32,52,79,39,208,35,91,227,252,50,195,126,162,32,18,101,108,206,+218,31,37,101,144,110,1,57,125,195,176,123,253,31,80,37,141,130,140,228,+80,36,7,195,104,58,135,159,103,125,131,155,184,199,203,27,140,5,69,116,+223,90,49,101,81,244,103,53,179,98,20,223,209,227,161,170,241,211,150,173,+147,90,157,243,143,75,251,158,220,99,9,186,11,109,44,152,83,3,149,54,+108,109,231,71,228,200,238,35,227,23,161,48,219,215,147,135,42,5,200,173,+91,91,151,14,11,87,78,160,186,135,141,69,63,93,96,157,139,234,153,237,+154,81,118,129,153,250,180,202,134,150,188,249,181,4,170,80,157,86,105,12,+171,233,226,106,30,236,247,110,127,57,68,67,184,178,171,252,146,44,200,230,+64,170,51,75,80,206,80,6,246,7,34,16,19,202,202,27,83,239,248,246,+149,237,254,78,237,94,47,89,47,89,213,41,163,50,119,232,127,124,44,99,+243,223,185,58,207,175,202,40,40,188,84,67,16,141,101,18,148,155,16,131,+126,61,105,97,201,180,190,95,150,68,139,158,67,42,22,249,206,50,26,163,+206,33,131,142,100,121,96,91,213,159,80,235,23,9,193,242,57,61,90,193,+6,3,55,174,89,235,133,30,219,162,84,220,206,216,244,73,4,61,103,131,+175,129,121,3,136,63,147,51,195,21,194,100,237,82,209,23,83,126,58,42,+101,154,140,89,180,23,229,69,2,213,4,204,32,246,234,239,104,115,25,205,+208,104,52,66,84,66,130,71,119,237,123,139,74,79,205,251,163,214,96,133,+244,141,92,38,98,125,157,30,228,15,37,190,254,244,186,27,227,16,174,174,+24,133,4,103,56,56,119,99,93,67,152,252,144,247,196,191,237,45,139,4,+14,61,218,125,91,73,46,104,159,211,241,144,100,28,208,28,25,175,23,117,+145,24,15,11,90,109,160,210,192,238,178,209,193,63,216,175,64,197,79,55,+186,209,140,99,252,3,209,217,56,36,227,100,221,44,191,127,103,50,252,154,+196,230,87,211,48,95,144,165,22,254,102,253,62,172,199,174,221,180,222,166,+77,90,119,238,233,207,251,148,6,63,24,244,133,86,131,98,7,8,164,115,+59,76,240,246,33,102,249,32,77,78,41,97,72,124,70,22,23,247,126,210,+51,124,62,24,250,244,233,155,51,180,194,158,209,85,74,43,130,249,64,16,+103,24,21,243,201,159,38,85,101,173,131,240,19,75,100,30,181,118,248,50,+200,57,79,128,6,105,19,112,142,109,110,149,218,206,1,113,221,237,37,255,+156,135,239,98,136,153,145,164,26,59,171,143,139,11,210,93,116,204,111,35,+249,162,215,146,186,134,192,102,255,65,181,165,240,0,26,219,13,45,18,132,+197,252,236,145,146,45,228,0,45,102,134,160,32,122,241,13,125,41,112,1,+181,104,145,69,60,130,193,32,249,239,135,184,212,152,173,41,38,35,239,184,+133,178,10,49,84,206,196,226,114,225,141,93,228,186,230,232,47,4,67,236,+253,115,39,17,35,2,238,207,163,202,93,22,96,66,51,241,192,243,35,155,+126,140,219,154,147,191,41,9,72,186,118,126,179,184,201,144,176,227,26,101,+128,194,179,107,159,2,1,80,140,249,55,42,87,159,176,90,240,194,44,145,+173,177,105,103,90,170,205,63,25,179,135,124,230,178,15,184,70,52,170,108,+120,84,123,106,182,126,247,18,189,148,135,163,174,53,154,147,157,71,98,37,+83,137,87,140,38,216,79,237,82,90,83,208,125,131,46,237,73,128,176,122,+31,159,20,152,177,151,37,117,233,192,92,24,59,165,183,40,119,194,142,231,+199,164,169,184,109,137,221,115,8,180,85,249,21,157,250,0,94,4,123,201,+182,102,113,68,226,56,115,247,100,174,159,105,33,201,65,8,130,246,245,182,+228,120,222,49,132,216,109,24,67,211,164,133,243,188,224,114,57,92,52,85,+157,235,25,39,80,24,129,44,221,66,241,142,172,125,200,81,21,42,54,25,+122,134,92,24,73,216,251,19,33,10,32,148,211,6,177,210,190,123,169,134,+121,138,145,105,173,129,111,79,116,228,57,193,49,53,107,14,98,241,86,236,+102,160,95,45,245,74,97,90,171,212,38,117,16,24,243,101,196,205,99,127,+18,25,200,179,176,164,46,15,248,195,121,152,58,109,101,45,21,226,66,106,+97,218,194,30,122,29,92,225,147,151,248,204,135,63,187,139,223,120,11,242,+172,129,15,103,16,66,71,214,47,175,0,94,6,246,247,238,142,64,226,236,+123,35,150,205,11,54,106,138,145,58,83,198,25,207,204,3,155,184,218,4,+174,226,173,43,224,17,175,193,56,142,100,249,195,162,179,119,6,69,91,239,+180,222,139,113,147,90,235,212,59,159,100,218,221,1,166,184,198,70,103,230,+14,11,163,70,200,208,107,46,188,27,71,28,231,148,113,7,81,131,99,3,+59,89,61,1,208,28,206,98,195,153,166,74,247,227,117,35,25,19,89,85,+37,134,1,236,44,175,132,200,209,41,116,230,183,216,252,121,0,229,199,84,+108,230,73,185,16,76,249,8,18,229,208,243,128,5,36,189,193,216,10,152,+101,142,83,110,35,174,5,183,85,113,230,155,177,193,128,183,176,104,112,49,+176,168,168,192,241,194,48,53,198,132,201,5,122,222,73,55,0,51,36,111,+59,105,188,101,219,226,184,91,134,120,118,112,227,181,126,185,169,93,214,22,+66,1,56,235,50,240,220,138,18,16,13,200,157,100,216,125,3,97,79,195,+81,3,216,90,184,115,129,82,133,254,237,81,170,163,251,5,123,88,233,171,+120,108,101,145,153,9,224,104,93,77,69,223,208,48,156,22,189,154,16,68,+195,222,47,48,62,75,29,10,236,193,239,170,232,100,58,19,233,72,208,116,+132,43,84,102,219,101,180,56,209,199,76,100,131,134,44,68,188,175,44,243,+234,55,19,60,30,32,183,84,12,72,201,75,237,195,108,76,193,160,105,24,+58,88,154,156,101,31,183,119,87,92,24,22,210,96,212,234,22,133,168,172,+176,192,231,249,52,44,88,208,88,47,48,152,139,179,71,142,148,219,61,160,+248,212,214,158,99,130,29,150,92,3,30,159,126,213,109,43,31,183,43,136,+17,154,181,231,231,146,97,160,74,206,146,226,207,80,82,170,93,173,58,205,+48,79,21,53,172,21,117,16,161,114,212,140,32,12,112,188,215,167,1,116,+85,179,181,130,105,176,217,152,66,230,70,77,49,30,216,39,13,247,71,230,+190,226,12,128,59,218,139,84,75,71,142,220,197,164,171,194,38,221,173,132,+48,227,42,6,234,78,155,165,249,13,116,221,119,31,24,169,109,216,180,189,+138,46,100,43,182,128,95,204,235,244,252,82,130,117,174,161,38,16,194,101,+53,31,166,100,131,195,239,233,125,179,245,112,144,28,195,46,199,173,189,44,+127,158,195,178,200,65,189,143,105,106,128,102,5,92,229,150,136,235,55,216,+36,41,41,102,146,54,168,137,28,46,251,132,18,176,117,37,241,243,171,12,+19,209,92,192,152,131,195,119,139,25,98,253,25,46,134,96,47,132,106,192,+113,130,173,220,114,185,93,131,85,112,78,99,140,7,42,140,72,59,160,77,+143,11,97,26,153,177,237,209,155,220,197,151,55,187,210,42,221,197,141,238,+27,165,169,13,73,99,112,95,48,77,72,23,225,232,80,95,130,0,186,37,+49,67,20,248,17,141,182,117,207,59,5,56,225,197,32,181,139,166,218,98,+62,210,94,212,58,55,147,132,28,56,219,100,139,39,218,110,124,95,96,123,+192,155,7,221,130,158,127,44,246,68,200,106,150,239,45,58,61,250,81,255,+160,253,146,218,190,218,121,101,229,103,95,140,161,88,91,35,192,72,92,126,+6,137,8,239,53,203,193,243,6,10,180,229,181,192,84,24,29,213,95,235,+164,248,84,49,59,140,106,127,167,163,75,141,1,177,86,173,33,110,67,89,+183,157,17,164,207,125,218,44,123,235,57,12,162,177,128,41,235,105,32,2,+155,95,235,197,252,228,182,91,70,108,95,164,2,182,232,136,143,187,83,142,+249,172,184,133,135,50,128,234,4,97,88,197,250,67,109,231,231,107,175,201,+218,17,84,10,247,139,251,218,151,241,96,181,141,30,79,255,199,241,205,135,+81,106,59,88,123,72,97,250,156,130,29,75,150,27,174,6,113,58,221,216,+248,171,229,99,63,228,173,168,228,139,146,63,210,78,114,201,224,100,214,48,+168,49,27,76,90,119,97,158,233,12,123,250,149,177,97,54,235,82,119,154,+97,113,177,197,140,71,172,27,188,177,105,0,154,39,110,208,232,5,139,44,+242,163,92,96,167,92,246,1,130,183,77,3,51,233,183,95,180,70,227,8,+216,11,159,92,38,48,33,140,29,229,2,64,110,231,142,170,161,129,144,160,+181,85,169,73,173,68,127,179,139,174,254,91,50,112,157,124,202,91,124,125,+199,21,34,169,139,58,207,118,129,178,66,213,115,30,218,54,89,101,6,171,+169,182,83,216,145,17,236,212,5,154,224,8,209,44,20,115,140,26,128,252,+25,46,244,50,159,86,40,254,60,138,173,181,29,87,23,56,168,39,151,120,+50,90,224,206,65,51,117,95,170,74,148,122,255,182,201,89,73,125,201,69,+63,77,56,168,132,14,16,180,83,235,3,38,191,194,210,85,79,106,20,84,+103,197,66,235,205,122,89,51,196,195,251,160,200,14,22,75,195,7,62,7,+169,200,84,215,254,145,0,177,57,20,76,179,144,72,233,141,220,237,87,19,+41,32,252,242,39,7,33,20,2,206,42,79,186,82,247,213,95,136,95,176,+196,209,253,43,48,4,56,139,132,187,169,10,154,244,233,94,181,123,21,189,+30,12,199,91,159,113,204,66,210,114,11,199,172,70,226,158,126,64,163,208,+244,191,33,151,118,78,54,0,71,72,103,144,112,183,39,246,149,60,215,135,+12,230,224,240,190,223,176,229,219,159,2,31,18,231,93,36,70,136,102,39,+40,188,245,67,141,254,244,2,147,195,1,186,199,173,182,241,74,57,218,170,+49,72,125,244,194,196,130,193,4,210,85,130,152,1,65,143,132,86,64,79,+255,121,119,205,196,180,80,74,215,154,205,242,188,49,187,208,193,20,93,44,+225,78,243,88,184,156,66,114,201,251,99,68,74,83,114,5,76,147,82,112,+6,251,49,202,202,42,44,219,223,114,168,38,164,54,43,253,40,149,44,225,+228,2,235,200,153,13,47,206,76,142,29,221,166,206,133,181,59,44,202,103,+177,31,117,48,219,249,176,205,155,66,90,54,215,52,24,34,72,100,58,1,+61,67,246,103,188,214,91,53,96,179,171,48,222,39,212,213,242,33,92,132,+209,147,69,50,222,38,149,102,215,136,206,203,237,81,226,28,107,4,69,248,+88,173,136,214,39,237,198,64,2,29,72,25,7,182,165,213,93,133,7,160,+51,239,91,8,146,122,54,101,190,203,140,33,162,78,173,148,26,2,56,223,+36,0,186,14,111,211,183,98,171,245,220,253,254,155,252,121,86,56,190,49,+37,100,137,71,89,39,37,230,50,175,156,54,98,157,99,236,79,130,185,24,+224,111,184,68,99,170,38,218,3,131,173,153,1,17,63,184,4,91,248,223,+68,241,1,184,200,26,199,187,144,63,133,4,54,212,169,118,125,52,144,57,+27,216,133,165,246,79,90,202,193,75,63,135,254,115,253,75,101,87,48,158,+16,31,38,253,119,75,241,139,107,82,254,25,225,3,171,202,233,64,20,75,+213,190,187,114,82,68,31,24,148,69,250,217,210,178,177,107,157,45,101,44,+89,40,106,216,121,48,10,42,201,220,175,98,215,136,208,201,166,178,56,157,+129,30,192,29,16,138,124,183,97,107,218,19,102,59,147,188,0,51,66,43,+125,7,135,254,73,19,217,64,245,39,6,20,132,156,194,102,133,79,53,180,+238,178,87,215,232,233,181,20,153,250,195,110,131,122,128,111,21,44,0,242,+39,138,118,17,19,119,115,223,76,7,95,6,183,177,189,53,46,168,190,105,+209,234,196,138,144,151,86,178,50,226,252,94,31,199,157,243,212,198,110,185,+116,118,162,170,204,172,211,228,53,200,176,12,75,192,208,175,215,98,127,125,+124,119,30,182,185,255,31,150,5,161,146,173,118,35,110,71,13,27,222,120,+193,124,115,19,75,2,28,155,43,99,41,55,31,223,90,100,238,15,43,101,+186,73,131,226,143,23,172,167,107,114,250,171,216,58,247,12,175,57,83,209,+119,189,116,35,171,129,71,16,110,98,230,230,27,202,16,43,166,176,154,146,+23,72,144,46,124,83,208,55,50,77,36,203,10,158,212,88,43,138,144,39,+236,162,199,33,64,111,180,152,36,72,96,32,162,34,158,99,80,140,80,20,+208,182,179,51,2,167,56,202,189,55,105,120,128,178,127,151,214,143,0,14,+241,57,112,118,110,197,147,211,140,43,219,29,41,117,90,249,224,105,246,194,+182,203,235,107,9,136,227,13,215,168,42,48,233,241,46,125,123,165,221,92,+36,54,39,49,234,140,89,59,123,128,253,127,212,71,173,191,16,150,231,60,+215,108,213,215,87,53,176,60,253,79,122,23,225,181,110,113,127,242,211,53,+199,33,130,225,207,248,17,238,87,11,15,235,239,165,0,205,35,30,63,63,+112,222,73,73,230,190,207,194,242,149,32,87,76,57,56,69,120,83,155,230,+113,136,40,31,193,55,175,30,115,175,252,188,208,30,243,2,236,106,134,63,+252,0,80,68,171,18,176,7,222,49,193,188,79,21,253,203,37,159,52,17,+80,54,31,4,187,238,254,208,7,104,210,62,255,180,134,94,52,240,183,106,+245,173,40,127,94,166,67,1,163,235,88,205,249,250,133,39,220,78,131,9,+64,233,117,7,203,91,35,241,48,206,148,115,24,121,193,219,184,129,195,92,+32,51,175,126,241,203,35,216,131,221,76,148,156,74,84,249,153,126,80,142,+137,35,132,222,252,40,144,200,224,174,132,27,22,243,12,31,150,95,186,129,+212,95,237,143,60,180,215,127,75,168,95,175,21,191,112,79,100,55,193,112,+134,188,45,175,67,211,162,56,209,224,44,141,122,52,158,255,98,125,9,67,+223,197,252,245,221,177,101,180,107,14,252,50,78,49,110,196,134,76,179,126,+123,115,117,7,157,63,190,239,251,223,30,37,124,80,97,0,219,37,243,157,+195,64,180,110,6,217,198,129,22,143,174,197,120,148,88,149,174,165,253,241,+70,234,28,31,190,6,136,146,79,151,250,106,233,158,3,145,38,129,237,205,+23,125,215,175,235,66,188,185,32,232,197,252,81,161,92,249,64,255,165,24,+111,123,151,196,71,43,72,108,170,90,10,212,137,186,204,94,238,20,109,15,+26,18,56,35,149,123,153,195,143,34,134,206,112,100,27,7,131,106,82,14,+29,62,232,101,62,197,228,164,170,150,121,168,16,197,27,167,141,63,215,63,+85,117,184,172,93,77,86,116,197,177,240,96,24,122,173,33,11,185,193,96,+40,30,124,50,38,102,237,206,179,185,11,92,225,17,152,28,83,225,190,128,+31,242,30,163,25,226,114,92,97,19,23,242,27,121,95,42,125,53,34,167,+227,115,87,107,107,202,44,5,15,214,126,50,81,251,47,7,88,22,124,19,+240,90,69,217,48,233,37,41,141,1,235,177,242,5,29,22,99,115,94,137,+204,47,115,61,200,46,222,174,159,97,241,43,146,151,27,236,138,247,102,180,+80,67,134,101,236,159,255,246,142,175,127,253,92,26,26,66,83,26,30,194,+206,254,92,152,200,55,139,228,69,254,229,64,207,227,72,69,168,39,2,64,+28,253,236,74,84,149,171,50,19,52,238,160,141,162,23,161,64,32,31,195,+144,142,91,35,81,50,47,132,159,91,255,105,215,91,166,122,80,192,74,147,+32,139,193,67,109,230,147,59,233,41,79,13,142,93,69,38,246,122,188,70,+3,182,233,207,23,29,155,28,202,243,82,250,12,40,7,251,101,11,33,122,+177,139,211,165,18,27,127,228,207,35,74,222,193,10,83,230,39,199,47,211,+121,194,3,22,50,105,127,76,17,133,66,72,39,65,38,64,186,192,58,58,+126,148,155,131,177,162,160,67,217,144,252,197,91,243,239,35,101,128,240,249,+125,114,25,133,166,4,126,107,56,75,158,21,140,174,73,88,131,85,188,77,+118,67,69,198,176,165,131,1,233,27,103,214,43,155,29,48,201,79,185,133,+216,222,251,136,84,169,146,165,178,175,157,184,125,70,211,208,59,147,186,169,+61,161,178,11,203,220,165,198,16,123,229,39,201,86,18,44,112,87,207,101,+69,59,17,234,173,245,124,198,110,148,40,213,202,45,119,155,39,169,189,137,+224,225,0,211,124,108,17,204,64,121,39,82,75,126,179,238,160,10,171,110,+141,204,147,37,208,99,194,34,239,106,144,127,107,132,221,245,252,67,29,195,+28,118,39,0,141,133,26,42,139,234,247,177,165,109,43,40,223,42,46,110,+172,9,103,58,46,240,219,210,117,244,213,140,187,198,41,57,106,133,180,34,+39,29,139,30,164,93,20,249,238,169,19,201,56,149,102,124,92,40,121,19,+60,79,108,180,182,76,198,245,30,220,169,16,198,159,240,161,25,78,58,20,+111,5,168,147,102,175,162,32,189,42,139,175,47,30,250,29,142,255,240,133,+118,213,109,67,84,73,10,144,141,149,9,241,136,170,225,31,140,154,199,134,+128,120,36,198,139,70,25,197,72,97,185,79,56,58,4,21,146,181,80,238,+20,145,86,196,87,160,209,249,24,7,172,79,221,250,242,167,199,234,65,242,+240,237,242,245,79,208,19,138,125,4,40,122,173,131,45,94,180,115,230,162,+99,133,12,248,148,97,113,2,134,211,9,133,97,16,239,167,1,120,31,111,+195,251,99,161,195,77,69,206,52,53,59,62,44,6,148,253,127,185,202,200,+113,238,244,198,208,162,51,228,177,254,169,59,150,10,20,233,131,213,109,26,+60,159,86,249,200,76,227,156,184,213,184,97,211,201,188,20,102,214,121,180,+195,181,245,131,12,248,76,113,209,97,55,175,51,187,29,170,11,152,26,32,+32,124,84,175,219,6,171,229,58,95,69,148,175,143,26,241,215,63,76,44,+200,170,223,181,228,48,174,134,36,116,161,183,246,5,74,178,8,191,91,92,+245,14,165,187,154,44,146,44,140,65,51,142,147,52,255,14,98,183,220,248,+88,4,21,156,50,119,8,117,0,126,76,107,56,150,115,49,95,33,37,222,+11,209,177,249,202,10,94,5,20,47,85,15,241,122,119,160,207,132,41,22,+10,107,31,65,47,63,105,173,230,27,21,73,196,62,82,154,152,36,64,171,+70,238,132,133,207,48,140,6,19,112,49,25,108,216,177,237,44,166,92,206,+184,30,68,164,220,131,200,143,120,245,186,8,96,183,161,25,107,214,34,62,+68,237,189,185,182,215,62,52,200,126,221,223,126,36,212,210,136,107,252,90,+65,124,119,86,32,39,221,10,212,20,94,125,80,200,170,59,241,138,18,24,+177,196,90,242,69,15,237,221,143,132,244,14,197,82,69,220,55,217,83,114,+103,137,41,230,144,184,132,3,10,173,12,37,193,217,232,95,1,53,32,46,+15,2,46,75,251,191,39,109,80,245,154,62,24,148,135,154,3,200,70,78,+168,15,150,214,116,134,7,51,203,57,7,231,172,173,45,38,248,164,186,100,+217,192,254,248,160,40,96,34,40,80,210,253,204,107,44,25,149,58,233,50,+42,68,122,121,153,181,39,251,11,170,23,2,159,52,92,170,89,12,209,243,+196,166,242,112,45,222,20,200,154,189,178,40,93,178,203,52,155,9,78,144,+111,12,74,70,100,111,193,108,38,17,214,228,9,212,243,198,244,101,72,75,+249,90,7,252,194,180,33,208,125,101,76,10,121,221,233,43,117,27,27,212,+170,65,104,207,5,12,1,78,53,30,54,118,73,15,233,182,200,228,117,108,+213,244,225,58,139,96,52,194,174,199,8,42,39,126,162,119,237,84,23,199,+31,41,30,41,170,150,104,144,140,80,241,233,7,120,205,156,173,248,44,184,+195,119,28,0,46,35,185,181,32,200,64,70,181,242,223,70,132,115,161,121,+103,159,59,29,72,39,1,157,23,167,102,18,252,66,52,245,44,7,204,233,+171,97,125,164,6,28,90,209,135,220,19,126,205,221,71,125,153,124,239,90,+205,196,160,75,243,109,249,192,103,56,221,227,203,164,155,127,24,213,67,4,+153,111,87,176,91,222,37,155,144,250,208,128,137,84,27,121,156,213,87,106,+95,168,64,220,227,233,47,80,122,201,163,82,152,37,252,183,239,63,1,31,+3,202,99,107,53,95,138,68,123,157,63,88,40,218,27,247,212,124,106,119,+234,25,255,202,33,252,112,136,2,32,205,66,157,35,12,220,7,141,140,197,+139,74,170,81,217,35,151,196,61,133,21,195,174,166,22,244,243,221,44,146,+78,242,96,214,163,46,236,87,152,11,246,227,196,53,224,184,87,29,68,58,+188,25,207,207,197,2,131,103,137,219,158,87,253,89,63,77,188,235,21,76,+9,100,70,62,62,13,90,73,142,162,241,233,159,237,97,167,217,161,205,138,+130,52,186,123,133,52,29,27,201,230,68,189,232,2,22,178,99,133,195,38,+29,56,183,68,11,175,73,192,145,180,66,231,153,11,165,188,185,90,222,0,+49,224,171,39,113,223,83,120,35,78,176,242,30,239,251,233,34,4,90,255,+166,108,29,1,44,138,57,156,146,22,112,78,138,223,46,91,70,190,64,34,+31,208,118,11,148,109,1,176,9,163,53,203,55,93,183,196,222,141,168,9,+162,255,209,127,101,255,135,57,26,245,243,87,80,214,10,219,4,0,110,218,+137,180,194,180,227,138,104,132,192,181,74,117,143,77,98,232,143,71,245,217,+50,71,26,176,239,134,246,7,216,222,110,182,133,194,184,202,176,72,204,198,+9,14,245,84,150,22,244,222,66,252,121,197,234,173,170,50,223,26,118,118,+251,186,104,6,123,3,201,82,56,36,112,152,37,151,205,42,217,129,255,199,+130,41,222,150,188,52,10,82,27,192,197,254,244,164,89,135,70,57,195,160,+27,47,196,111,79,254,241,233,212,83,3,123,180,90,56,169,104,29,139,205,+126,28,134,31,112,207,224,96,20,131,82,14,240,155,28,93,252,152,220,113,+112,147,228,201,79,186,153,183,201,41,100,22,56,250,49,202,64,181,166,163,+199,227,170,82,168,228,211,63,46,203,244,134,6,132,217,217,95,152,52,188,+70,70,183,187,37,104,209,49,139,58,121,47,58,75,173,59,231,111,16,32,+127,121,89,69,186,191,134,141,180,222,119,32,198,136,3,44,16,118,11,37,+76,20,254,205,66,6,236,23,189,220,33,156,208,19,19,110,216,101,105,252,+51,15,230,127,62,118,69,145,200,54,138,32,208,231,84,141,221,153,183,96,+13,20,43,98,55,53,0,128,246,149,241,113,125,196,86,32,233,151,155,86,+73,246,41,178,216,212,235,201,158,189,178,78,55,18,130,244,31,126,82,187,+35,11,245,31,106,198,23,10,21,20,5,203,129,148,244,95,212,25,170,208,+111,114,49,237,71,249,208,249,243,198,191,154,225,221,157,157,206,222,244,76,+243,202,64,115,150,60,199,216,140,139,108,82,54,132,247,155,184,90,147,48,+89,203,250,100,115,86,110,81,136,211,75,52,161,7,248,17,62,9,164,19,+64,89,35,30,59,183,174,192,35,118,165,72,245,188,81,2,215,140,138,67,+61,121,3,110,29,4,207,82,169,100,126,30,38,223,115,96,201,229,33,211,+223,47,29,195,162,226,55,85,243,41,6,121,177,50,118,119,9,202,165,134,+25,241,49,47,222,249,63,57,194,147,205,54,59,180,54,145,202,114,13,163,+244,188,109,244,175,207,116,31,73,122,139,253,170,225,25,89,0,205,173,66,+168,97,66,161,133,207,185,70,79,197,215,44,81,224,174,75,94,160,212,128,+64,75,100,7,90,18,187,81,175,164,7,109,81,168,140,237,7,76,30,150,+15,11,245,243,14,56,63,212,172,221,31,196,14,147,78,239,29,6,170,133,+92,42,129,41,204,72,42,38,23,13,72,146,31,177,2,124,220,149,249,172,+188,253,119,34,187,65,192,105,225,196,163,87,162,62,156,49,0,143,0,79,+88,144,157,24,33,159,164,21,5,30,169,61,131,75,142,74,134,105,24,192,+175,74,17,192,148,53,221,237,73,120,198,101,170,57,52,90,168,99,29,18,+79,104,207,252,244,209,184,22,176,173,100,153,189,36,39,181,220,103,27,31,+105,18,252,182,11,43,61,93,99,59,15,215,98,37,72,13,159,49,140,89,+236,182,212,202,255,177,17,168,19,21,143,7,113,207,111,160,228,243,4,56,+113,236,186,255,215,19,214,22,132,16,26,43,25,184,141,223,204,154,7,71,+206,58,211,140,19,143,115,30,55,142,70,223,43,123,215,167,178,113,229,25,+234,49,95,165,126,97,74,210,70,88,255,107,30,142,136,134,176,78,243,191,+28,67,50,1,205,52,79,31,123,45,155,130,191,18,115,217,191,219,38,30,+181,215,229,243,155,32,236,142,49,47,130,249,220,220,17,193,31,86,182,47,+48,29,153,228,147,62,50,191,103,226,177,148,227,92,254,113,57,250,65,143,+169,24,31,216,149,2,136,20,47,67,75,126,41,77,9,242,104,167,189,117,+176,143,30,65,214,194,203,50,137,1,35,93,162,9,64,67,188,24,43,34,+227,104,201,52,162,189,184,65,135,3,66,132,141,45,117,174,133,210,169,80,+160,162,184,249,252,43,166,220,14,165,115,55,88,222,180,78,140,230,173,244,+52,59,228,63,167,24,163,9,174,68,89,124,98,167,157,54,212,67,44,47,+237,151,127,217,37,178,245,169,176,61,222,86,61,54,80,236,204,57,87,245,+49,11,116,102,200,194,126,85,112,229,190,17,245,180,111,15,44,156,124,229,+243,108,189,228,22,189,33,180,31,188,161,8,200,193,10,0,+};+const unsigned char *combexpr = data;+const int combexprlen = 104896; static const struct ffi_entry imp_table[] = { { 0,0 } };
ghc/MHSPrelude.hs view
@@ -10,7 +10,7 @@ import Data.List import Data.Text(Text, append, pack) import GHC.Stack-import GHC.Types+import Data.Kind import System.Environment import System.IO 
ghc/PrimTable.hs view
@@ -8,7 +8,7 @@ import System.IO import System.IO.TimeMilli import Unsafe.Coerce-import GHC.Types(Any)+import GHC.Exts(Any) import Foreign.C.String import Foreign.C.Types import Foreign.Marshal.Alloc
ghc/System/IO/Serialize.hs view
@@ -4,8 +4,9 @@   hSerialize, hDeserialize,   writeSerialized,   writeSerializedCompressed,-  readSerialized,+  readSerialized, readSerializedH, readSerializedBS,   ) where+import Data.ByteString(ByteString) import System.IO import GHC.Stack @@ -17,6 +18,12 @@  readSerialized :: forall a . HasCallStack => FilePath -> IO a readSerialized = errghc++readSerializedH :: forall a . HasCallStack => Handle -> IO a+readSerializedH = errghc++readSerializedBS :: forall a . HasCallStack => ByteString -> IO a+readSerializedBS = errghc  hSerialize   :: forall a . Handle -> a -> IO () hSerialize = errghc
hugs/MHSPrelude.hs view
@@ -4,10 +4,11 @@   module Prelude,   module MHSPrelude, --  module Control.Monad.Fail,-  module Control.Arrow,+  -- Exporting these with 'module Control.Arrow' does not work+  first, second,   module Data.Monoid,   module Data.Semigroup,-  (<$>), Applicative(..), (*>),+  (<$>), Applicative(..), (*>), (<*), (>=>), (<=<)   ) where import Hugs.Prelude() import Prelude hiding(fail)@@ -16,6 +17,7 @@ import Control.Applicative import Control.Exception(Exception, try) --import Control.Monad.Fail+import Data.Int import Data.List import Data.Maybe import Data.Monoid@@ -55,6 +57,12 @@ breakEnd :: (a -> Bool) -> [a] -> ([a], [a]) breakEnd p = spanEnd (not . p) +subsequences :: [a] -> [[a]]+subsequences xs = [] : sub xs+  where sub []     = []+        sub (x:xs) = [x] : foldr f [] (sub xs)+          where f ys r = ys : (x : ys) : r+ ------- Version --------  makeVersion :: [Int] -> Version@@ -193,6 +201,7 @@ force x = x `deepseq` x  instance NFData Int+instance NFData Int64 instance NFData Word instance NFData Float instance NFData Double@@ -229,3 +238,11 @@  class HasCallStack instance HasCallStack++(<=<) :: forall m a b c . Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)+f <=< g = \ a -> do+  b <- g a+  f b++(>=>) :: forall m a b c . Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)+(>=>) = flip (<=<)
− hugs/MhsEval.hs
@@ -1,21 +0,0 @@-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
@@ -7,7 +7,7 @@ import System.IO import System.IO.TimeMilli import Unsafe.Coerce-import GHC.Types(Any)+import GHC.Exts(Any) import Foreign.C.String import Foreign.C.Types import Foreign.Marshal.Alloc
− hugs/System/FilePath.hs
@@ -1,122 +0,0 @@--- 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
lib/AllOfLib.hs view
@@ -18,7 +18,12 @@ import Control.Monad.Fail import Control.Monad.IO.Class import Control.Monad.ST+import Control.Monad.ST.Lazy+import Control.Monad.ST.Lazy.Unsafe+import Control.Monad.ST.Strict import Control.Monad.ST_Type+import Control.Monad.ST.Unsafe+import Data.Any import Data.Bits import Data.Bool import Data.Bool_Type@@ -94,6 +99,8 @@ import Data.Records import Data.Semigroup import Data.STRef+import Data.STRef.Lazy+import Data.STRef.Strict import Data.String import Data.Text import Data.Text.Encoding
lib/Control/Applicative.hs view
@@ -13,10 +13,12 @@ import Primitives import {-# SOURCE #-} Control.WrappedMonad import Data.Bool_Type+import Data.Coerce import Data.Functor import Data.Function import Data.List_Type import Data.Maybe_Type+import Data.Ord import Data.Functor.Const_Type import {-# SOURCE #-} Data.Typeable import {-# SOURCE #-} Data.ZipList@@ -34,6 +36,14 @@   a1 *> a2     = (id <$ a1) <*> a2   a1 <* a2     = const <$> a1 <*> a2   liftA2 f a b = f <$> a <*> b++instance Applicative ((->) a) where+  pure = const+  f <*> g = \ a -> f a (g a)++instance Applicative Down where+    pure = Down+    (<*>) = coerce  liftA :: forall f a b . Applicative f => (a -> b) -> f a -> f b liftA f a = f <$> a
lib/Control/Concurrent.hs view
@@ -119,11 +119,12 @@   st <- primThreadStatus thr   return $     case st of-      0 -> ThreadRunning                 -- ts_runnable-      1 -> ThreadBlocked BlockedOnMVar   -- ts_wait_mvar-      2 -> ThreadBlocked BlockedOnOther  -- ts_wait_time-      3 -> ThreadFinished                -- ts_finished-      4 -> ThreadDied                    -- ts_died+      0 -> ThreadRunning                      -- ts_runnable+      1 -> ThreadBlocked BlockedOnMVar        -- ts_wait_mvar+      2 -> ThreadBlocked BlockedOnOther       -- ts_wait_time+      3 -> ThreadFinished                     -- ts_finished+      4 -> ThreadDied                         -- ts_died+      5 -> ThreadBlocked BlockedOnForeignCall -- ts_wait_io  ------------------------------------------------------- -- Just for GHC compatibility.
lib/Control/Exception/Internal.hs view
@@ -73,6 +73,7 @@       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 if primIntEQ n (7::Int) then SomeException Overflow       else e  -- Throw an exception when executed, not when evaluated
lib/Control/Monad.hs view
@@ -47,11 +47,11 @@ import Data.List import Data.Monoid.Internal import Data.Ord---import Data.Maybe+import Data.Tuple (Solo(..)) import {-# SOURCE #-} Data.Typeable -infixl 1 >>, >>=, =<<-infixr 1 <=<, >=>+infixl 1 >>, >>=+infixr 1 =<<, <=<, >=>  class (Applicative m) => Monad m where   (>>=)  :: forall a b . m a -> (a -> m b) -> m b@@ -169,7 +169,7 @@ -----  liftM :: forall m r a1 . (Monad m) => (a1 -> r) -> m a1 -> m r-liftM f m1 = f <$> m1+liftM f m1 = do { x1 <- m1; return (f x1) } liftM2 :: forall m r a1 a2 . (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) } liftM3 :: forall m r a1 a2 a3 . (Monad m) => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r@@ -187,36 +187,26 @@  ----- -instance Functor ((->) a) where-  fmap = (.)--instance Applicative ((->) a) where-  pure = const-  f <*> g = \ a -> f a (g a)- instance Monad ((->) a) where   x >>= y = \ z -> y (x z) z +instance Monad Solo where+  MkSolo x >>= f = f x++instance Monad Down where+  Down a >>= k = k a+ instance Monad Dual where   m >>= k = k (getDual m) -instance Monad [] where-  (>>=) = flip concatMap--{---- Same for Maybe-instance Functor Maybe where-  fmap _ Nothing = Nothing-  fmap f (Just a) = Just (f a)+instance Monad Sum where+  m >>= k = k (getSum m) -instance Applicative Maybe where-  pure a = Just a-  (<*>) = ap+instance Monad Product where+  m >>= k = k (getProduct m) -instance Monad Maybe where-  Nothing >>= _ = Nothing-  Just a  >>= f = f a--}+instance Monad [] where+  (>>=) = flip concatMap  class (Alternative m, Monad m) => MonadPlus m where   mzero :: forall a . m a
lib/Control/Monad/Fix.hs view
@@ -10,6 +10,7 @@ import Data.Functor.Identity import Data.List.NonEmpty(NonEmpty(..)) import Data.Monoid.Internal+import Data.Ord(Down(..)) import Data.Tuple  class (Monad m) => MonadFix m where@@ -18,11 +19,10 @@ _mfix :: MonadFix m => (a -> m a) -> m a _mfix = mfix -{- instance MonadFix Solo where     mfix f = let a = f (unSolo a) in a              where unSolo (MkSolo x) = x--}+ instance MonadFix Maybe where     mfix f = let a = f (unJust a) in a              where unJust (Just x) = x@@ -78,7 +78,10 @@  instance MonadFix f => MonadFix (Ap f) where     mfix f = Ap (mfix (getAp . f))+-} +-- Instances for Data.Ord++-- | @since base-4.12.0.0 instance MonadFix Down where     mfix f = Down (fix (getDown . f))--}
lib/Control/Monad/ST.hs view
@@ -1,6 +1,7 @@ module Control.Monad.ST(   ST,   runST,+  fixST,   --   RealWorld, stToIO,  -- GHC compat   ) where@@ -13,6 +14,9 @@ runST :: (forall s . ST s a) -> a runST (ST ioa) = primPerformIO ioa +fixST :: (a -> ST s a) -> ST s a+fixST f = ST (fixIO (unST . f))+ instance Functor (ST s) where   fmap f (ST x) = ST (fmap f x) @@ -24,7 +28,7 @@   ST x >>= f = ST (x >>= (unST . f))  instance MonadFix (ST s) where-  mfix f = ST (fixIO (unST . f))+  mfix = fixST  --------------------------------- -- This does not belong here since it's GHC specific,@@ -32,5 +36,5 @@  data RealWorld  -- Just to be compatible with GHC.  We don't use it. -stToIO :: forall a . ST RealWorld a -> IO a+stToIO :: ST RealWorld a -> IO a stToIO = unST
+ lib/Control/Monad/ST/Lazy.hs view
@@ -0,0 +1,58 @@+module Control.Monad.ST.Lazy(+  ST,+  runST,+  fixST,+  strictToLazyST,+  lazyToStrictST,+  --+  RealWorld, stToIO,  -- GHC compat+  ) where+import qualified Prelude(); import MiniPrelude+import Primitives(primPerformIO)+import Control.Monad.Fix+import Control.Monad.ST(RealWorld)+import qualified Control.Monad.ST_Type as S+import qualified Control.Monad.ST as S++primLazyBind :: IO a -> (a -> IO b) -> IO b+primLazyBind = _primitive "IO.lazyBind"+primStrictIO :: IO a -> IO a+primStrictIO = _primitive "IO.strict"++newtype ST s a = ST {unST :: S.ST s a}++-- This gets a type error when defined in terms of S.runST+runST :: (forall s . ST s a) -> a+runST = primPerformIO . S.unST . unST++-- XXX This seems suspicious; it's just the strict fix.+fixST :: (a -> ST s a) -> ST s a+fixST f = ST (S.fixST (unST . f))++strictToLazyST :: S.ST s a -> ST s a+strictToLazyST = ST . S.ST . primStrictIO . S.unST++-- Is this right?  Should we force the lazy state?+lazyToStrictST :: ST s a -> S.ST s a+lazyToStrictST = unST++instance Functor (ST s) where+  fmap f a = a >>= (return . f)  -- defined in terms on >>=, so it becomes lazy++instance Applicative (ST s) where+  pure = ST . pure+  (<*>) = ap                     -- defined in terms on >>=, so it becomes lazy++instance Monad (ST s) where+  ma >>= k = ST $ S.ST $ primLazyBind (S.unST (unST ma)) (S.unST . unST . k)++instance MonadFix (ST s) where+  mfix = fixST++---------------------------------+-- This does not belong here since it's GHC specific,+-- but to be compatible we do it the same way.++stToIO :: ST RealWorld a -> IO a+stToIO = S.unST . lazyToStrictST+
+ lib/Control/Monad/ST/Lazy/Unsafe.hs view
@@ -0,0 +1,15 @@+module Control.Monad.ST.Lazy.Unsafe(+  unsafeInterleaveST,+  unsafeIOToST,+  ) where+import qualified Prelude();+import Primitives(IO)+import qualified Control.Monad.ST.Unsafe as S+import Control.Monad.ST.Lazy+import Data.Function++unsafeInterleaveST :: ST s a -> ST s a+unsafeInterleaveST = strictToLazyST . S.unsafeInterleaveST . lazyToStrictST++unsafeIOToST :: IO a -> ST s a+unsafeIOToST = strictToLazyST . S.unsafeIOToST
+ lib/Control/Monad/ST/Strict.hs view
@@ -0,0 +1,3 @@+module Control.Monad.ST.Strict (module Control.Monad.ST) where++import Control.Monad.ST
lib/Control/Monad/ST/Unsafe.hs view
@@ -4,6 +4,8 @@   unsafeIOToST,   unsafeSTToIO,   ) where+import qualified Prelude()+import Primitives(IO) import Control.Monad.ST_Type import System.IO.Unsafe 
lib/Control/Monad/ST_Type.hs view
@@ -9,5 +9,5 @@ -- The ST monad is implemented with the IO monad. newtype ST s a = ST (IO a) -unST :: forall s a . ST s a -> IO a+unST :: ST s a -> IO a unST (ST io) = io
lib/Control/Monad/Zip.hs view
@@ -18,7 +18,9 @@ import Data.Functor.Identity import Data.Monoid.Internal import qualified Data.List.NonEmpty as NE---import Data.Tuple+import Data.Ord (Down)+import Data.Tuple (Solo(..))+import GHC.Generics  -- | Instances should satisfy the laws: --@@ -65,7 +67,6 @@     mzipWith                 = liftM2     munzip (Identity (a, b)) = (Identity a, Identity b) -{- -- | @since 4.15.0.0 instance MonadZip Solo where     mzipWith = liftM2@@ -88,6 +89,7 @@ instance MonadZip Maybe where     mzipWith = liftM2 +{- -- | @since 4.8.0.0 instance MonadZip First where     mzipWith = liftM2@@ -103,6 +105,7 @@ -- | @since 4.9.0.0 instance MonadZip Proxy where     mzipWith _ _ _ = Proxy+-}  -- Instances for GHC.Generics -- | @since 4.9.0.0@@ -125,9 +128,8 @@ instance (MonadZip f, MonadZip g) => MonadZip (f :*: g) where     mzipWith f (x1 :*: y1) (x2 :*: y2) = mzipWith f x1 x2 :*: mzipWith f y1 y2 --- instances for GHC.Internal.Data.Ord+-- instances for Data.Ord  -- | @since 4.12.0.0 instance MonadZip Down where     mzipWith = liftM2--}
lib/Control/WrappedMonad.hs-boot view
@@ -1,6 +1,7 @@ module Control.WrappedMonad where import qualified Prelude()+import Data.Records -newtype WrappedMonad m a = WrapMonad (m a)+newtype WrappedMonad m a = WrapMonad { unwrapMonad :: m a } -newtype WrappedArrow a b c = WrapArrow (a b c)+newtype WrappedArrow a b c = WrapArrow { unwrapArrow :: a b c }
+ lib/Data/Any.hs view
@@ -0,0 +1,3 @@+module Data.Any(Any) where+import Primitives(AnyType)+type Any = AnyType
lib/Data/Bifunctor.hs view
@@ -17,6 +17,7 @@   ( Bifunctor(..)   ) where import Control.Applicative  ( Const(..) )+import Data.Monoid.Internal ( Arg(..) ) import Data.Tuple.Instances  -- $setup@@ -173,3 +174,7 @@ -- | @since 4.8.0.0 instance Bifunctor Const where     bimap f _ (Const a) = Const (f a)++-- | @since 4.9.0.0+instance Bifunctor Arg where+  bimap f g (Arg a b) = Arg (f a) (g b)
lib/Data/Bitraversable.hs view
@@ -18,20 +18,23 @@   , bisequenceA   , bisequence   , bimapM+  , firstA+  , secondA   , bifor   , biforM   , bimapAccumL   , bimapAccumR---  , bimapDefault---  , bifoldMapDefault+  , bimapDefault+  , bifoldMapDefault   ) where  import Control.Applicative import Data.Bifunctor import Data.Bifoldable--- Data.Coerce+import Data.Coerce import Data.Functor.Identity(Identity(..)) import Data.Foldable.Internal(StateL(..), runStateL, StateR(..), runStateR)+import Data.Monoid.Internal(Arg(..))  class (Bifunctor t, Bifoldable t) => Bitraversable t where   bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)@@ -46,6 +49,12 @@ bisequence :: (Bitraversable t, Applicative f) => t (f a) (f b) -> f (t a b) bisequence = bitraverse id id +firstA :: Bitraversable t => Applicative f => (a -> f c) -> t a b -> f (t c b)+firstA f = bitraverse f pure++secondA :: Bitraversable t => Applicative f => (b -> f c) -> t a b -> f (t a c)+secondA f = bitraverse pure f+ {- instance Bitraversable (,) where   bitraverse f g ~(a, b) = liftA2 (,) (f a) (g b)@@ -74,6 +83,9 @@ instance Bitraversable Const where   bitraverse f _ (Const a) = Const <$> f a +instance Bitraversable Arg where+  bitraverse f g (Arg a b) = liftA2 Arg (f a) (g b)+ bifor :: (Bitraversable t, Applicative f)       => t a b -> (a -> f c) -> (b -> f d) -> f (t c d) bifor t f g = bitraverse f g t@@ -92,7 +104,8 @@ bimapAccumR f g s t   = runStateR (bitraverse (StateR . flip f) (StateR . flip g) t) s -{-+bimapDefault :: forall t a b c d . Bitraversable t+             => (a -> b) -> (c -> d) -> t a c -> t b d bimapDefault = coerce   (bitraverse :: (a -> Identity b)               -> (c -> Identity d) -> t a c -> Identity (t b d))@@ -102,4 +115,3 @@ bifoldMapDefault = coerce   (bitraverse :: (a -> Const m ())               -> (b -> Const m ()) -> t a b -> Const m (t () ()))--}
lib/Data/Bits/Base.hs view
@@ -2,6 +2,7 @@ import qualified Prelude()              -- do not import Prelude import Primitives import Control.Error+import Control.Exception.Internal import Data.Bool import Data.Eq import Data.Function@@ -111,7 +112,7 @@     go c w = go (c + 1) (w .&. (w - 1)) -- clear the least significant bit  _overflowError :: a-_overflowError = error "arithmetic overflow"+_overflowError = throw Overflow  instance Bits Int where   (.&.) = primIntAnd
lib/Data/ByteString.hs view
@@ -175,7 +175,7 @@ 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 System.IO.Base(Handle, IOMode(..), hClose, openBinaryFile, stdin, stdout) import qualified System.IO.Base as P import System.IO.Internal(BFILE, withHandleRd, withHandleWr) import qualified Text.Read.Lex as L@@ -616,18 +616,18 @@  readFile :: FilePath -> IO ByteString readFile f = do-  h <- openFile f ReadMode+  h <- openBinaryFile f ReadMode   hGetContents h  writeFile :: FilePath -> ByteString -> IO () writeFile f bs = do-  h <- openFile f WriteMode+  h <- openBinaryFile f WriteMode   hPut h bs   hClose h  appendFile :: FilePath -> ByteString -> IO () appendFile f bs = do-  h <- openFile f AppendMode+  h <- openBinaryFile f AppendMode   hPut h bs   hClose h 
lib/Data/ByteString/Internal.hs view
@@ -69,6 +69,9 @@ primBSgrab :: Ptr CChar -> IO ByteString primBSgrab = _primitive "bsgrab" +primBSgrabLen :: Ptr CChar -> Int -> IO ByteString+primBSgrabLen = _primitive "bsgrablen"+ -----------------------------------------  instance NFData ByteString@@ -130,7 +133,7 @@ null :: ByteString -> Bool null bs = length bs == 0 --- Take a C string and turn it into a ByteString.+-- Take a malloced() 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
lib/Data/ByteString/Unsafe.hs view
@@ -14,13 +14,15 @@         -- ** Using ByteStrings with functions for CStrings         unsafeUseAsCString,         unsafeUseAsCStringLen,-{-+         -- ** Converting CStrings to ByteStrings+{-         unsafePackCString,         unsafePackCStringLen,+-}         unsafePackMallocCString,         unsafePackMallocCStringLen,-+{-         unsafePackAddress,         unsafePackAddressLen,         unsafePackCStringFinalizer,@@ -64,3 +66,9 @@  unsafeUseAsCStringLen :: ByteString -> (CStringLen -> IO a) -> IO a unsafeUseAsCStringLen bs act = withForeignPtr (primBS2FPtr bs) (\p -> act (p, primBSlength bs))++unsafePackMallocCString :: CString -> IO ByteString+unsafePackMallocCString = primBSgrab++unsafePackMallocCStringLen :: CString -> Int -> IO ByteString+unsafePackMallocCStringLen = primBSgrabLen
lib/Data/Char/Unicode.hs view
@@ -218,21 +218,21 @@ bytestringGCTable = decompressRLE compressedGCTable  -- These tables are generated by unicode/UniParse.hs--- This is for Unicode 16.0.0+-- This is for Unicode 17.0.0 unicodeVersion :: Version-unicodeVersion = makeVersion [16,0,0]+unicodeVersion = makeVersion [17,0,0] compressedGCTable :: ByteString compressedGCTable =-  "\159\12\9\130\25\27\130\25\21\22\25\26\25\20\25\25\137\6\25\25\130\26\25\25\153\0\21\25\22\28\19\28\153\1\21\26\22\26\160\12\9\25\131\27\29\25\28\29\18\23\26\13\29\28\29\26\8\8\28\1\25\25\28\8\18\24\130\8\25\150\0\26\134\0\151\1\26\135\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\0\1\0\1\0\130\1\0\0\1\0\1\0\0\1\130\0\1\1\131\0\1\0\0\1\130\0\130\1\0\0\1\0\0\1\0\1\0\1\0\0\1\0\1\1\0\1\0\0\1\130\0\1\0\1\0\0\1\1\18\0\130\1\131\18\0\2\1\0\2\1\0\2\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\2\1\0\1\130\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\134\1\0\0\1\0\0\1\1\0\1\131\0\1\0\1\0\1\0\1\0\196\1\18\154\1\145\17\131\28\139\17\141\28\132\17\134\28\17\28\17\144\28\239\3\0\1\0\1\17\28\0\1\16\16\17\130\1\25\0\131\16\28\28\0\25\130\0\16\0\16\0\0\1\144\0\16\136\0\162\1\0\1\1\130\0\130\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\132\1\0\1\26\0\1\0\0\1\1\178\0\175\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\29\132\3\5\5\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\16\165\0\16\16\17\133\25\168\1\25\20\16\16\29\29\27\16\172\3\20\3\25\3\3\25\3\3\25\3\135\16\154\18\131\16\131\18\25\25\138\16\133\13\130\26\25\25\27\25\25\29\29\138\3\25\13\130\25\159\18\17\137\18\148\3\137\6\131\25\18\18\3\226\18\25\18\134\3\13\29\133\3\17\17\3\3\29\131\3\18\18\137\6\130\18\29\29\18\141\25\16\13\18\3\157\18\154\3\16\16\216\18\138\3\18\141\16\137\6\160\18\136\3\17\17\29\130\25\17\16\16\3\27\27\149\18\131\3\17\136\3\17\130\3\17\132\3\16\16\142\25\16\152\18\130\3\16\16\25\16\138\18\132\16\151\18\28\133\18\16\13\13\132\16\136\3\168\18\17\151\3\13\159\3\4\181\18\3\4\3\18\130\4\135\3\131\4\3\4\4\18\134\3\137\18\3\3\25\25\137\6\25\17\142\18\3\4\4\16\135\18\16\16\18\18\16\16\149\18\16\134\18\16\18\130\16\131\18\16\16\3\18\130\4\131\3\16\16\4\4\16\16\4\4\3\18\135\16\4\131\16\18\18\16\130\18\3\3\16\16\137\6\18\18\27\27\133\8\29\27\18\25\3\16\16\3\3\4\16\133\18\131\16\18\18\16\16\149\18\16\134\18\16\18\18\16\18\18\16\18\18\16\16\3\16\130\4\3\3\131\16\3\3\16\16\130\3\130\16\3\134\16\131\18\16\18\134\16\137\6\3\3\130\18\3\25\137\16\3\3\4\16\136\18\16\130\18\16\149\18\16\134\18\16\18\18\16\132\18\16\16\3\18\130\4\132\3\16\3\3\4\16\4\4\3\16\16\18\142\16\18\18\3\3\16\16\137\6\25\27\134\16\18\133\3\16\3\4\4\16\135\18\16\16\18\18\16\16\149\18\16\134\18\16\18\18\16\132\18\16\16\3\18\4\3\4\131\3\16\16\4\4\16\16\4\4\3\134\16\3\3\4\131\16\18\18\16\130\18\3\3\16\16\137\6\29\18\133\8\137\16\3\18\16\133\18\130\16\130\18\16\131\18\130\16\18\18\16\18\16\18\18\130\16\18\18\130\16\130\18\130\16\139\18\131\16\4\4\3\4\4\130\16\130\4\16\130\4\3\16\16\18\133\16\4\141\16\137\6\130\8\133\29\27\29\132\16\3\130\4\3\135\18\16\130\18\16\150\18\16\143\18\16\16\3\18\130\3\131\4\16\130\3\16\131\3\134\16\3\3\16\130\18\16\16\18\16\16\18\18\3\3\16\16\137\6\134\16\25\134\8\29\18\3\4\4\25\135\18\16\130\18\16\150\18\16\137\18\16\132\18\16\16\3\18\4\3\132\4\16\3\4\4\16\4\4\3\3\134\16\4\4\133\16\18\18\16\18\18\3\3\16\16\137\6\16\18\18\4\139\16\3\3\4\4\136\18\16\130\18\16\168\18\3\3\18\130\4\131\3\16\130\4\16\130\4\3\18\29\131\16\130\18\4\134\8\130\18\3\3\16\16\137\6\136\8\29\133\18\16\3\4\4\16\145\18\130\16\151\18\16\136\18\16\18\16\16\134\18\130\16\3\131\16\130\4\130\3\16\3\16\135\4\133\16\137\6\16\16\4\4\25\139\16\175\18\3\18\18\134\3\131\16\27\133\18\17\135\3\25\137\6\25\25\164\16\18\18\16\18\16\132\18\16\151\18\16\18\16\137\18\3\18\18\136\3\18\16\16\132\18\16\17\16\134\3\16\137\6\16\16\131\18\159\16\18\130\29\142\25\29\25\130\29\3\3\133\29\137\6\137\8\29\3\29\3\29\3\21\22\21\22\4\4\135\18\16\163\18\131\16\141\3\4\132\3\25\3\3\132\18\138\3\16\163\3\16\135\29\3\133\29\16\29\29\132\25\131\29\25\25\164\16\170\18\4\4\131\3\4\133\3\4\3\3\4\4\3\3\18\137\6\133\25\133\18\4\4\3\3\131\18\130\3\18\130\4\18\18\134\4\130\18\131\3\140\18\3\4\4\3\3\133\4\3\18\4\137\6\130\4\3\29\29\165\0\16\0\132\16\0\16\16\170\1\25\17\130\1\130\200\18\16\131\18\16\16\134\18\16\18\16\131\18\16\16\168\18\16\131\18\16\16\160\18\16\131\18\16\16\134\18\16\18\16\131\18\16\16\142\18\16\184\18\16\131\18\16\16\194\18\16\16\130\3\136\25\147\8\130\16\143\18\137\29\133\16\213\0\16\16\133\1\16\16\20\132\235\18\29\25\144\18\9\153\18\21\22\130\16\202\18\130\25\130\7\135\18\134\16\145\18\130\3\4\136\16\146\18\3\3\4\25\25\136\16\145\18\3\3\139\16\140\18\16\130\18\16\3\3\139\16\179\18\3\3\4\134\3\135\4\3\4\4\138\3\130\25\17\130\25\27\18\3\16\16\137\6\133\16\137\8\133\16\133\25\20\131\25\130\3\13\3\137\6\133\16\162\18\17\180\18\134\16\132\18\3\3\161\18\3\18\132\16\197\18\137\16\158\18\16\130\3\131\4\3\3\130\4\131\16\4\4\3\133\4\130\3\131\16\29\130\16\25\25\137\6\157\18\16\16\132\18\138\16\171\18\131\16\153\18\133\16\137\6\8\130\16\161\29\150\18\3\3\4\4\3\16\16\25\25\180\18\4\3\4\134\3\16\3\4\3\4\4\135\3\133\4\137\3\16\16\3\137\6\133\16\137\6\133\16\134\25\17\133\25\16\16\141\3\5\143\3\176\16\131\3\4\174\18\3\4\132\3\4\3\132\4\3\4\4\135\18\16\25\25\137\6\134\25\137\29\136\3\136\29\130\25\3\3\4\157\18\4\131\3\4\4\3\3\4\130\3\18\18\137\6\171\18\3\4\3\3\130\4\3\4\130\3\4\4\135\16\131\25\163\18\135\4\135\3\4\4\3\3\130\16\132\25\137\6\130\16\130\18\137\6\157\18\133\17\25\25\136\1\0\1\132\16\170\0\16\16\130\0\135\25\135\16\130\3\25\140\3\4\134\3\131\18\3\133\18\3\18\18\4\3\3\18\132\16\171\1\190\17\140\1\17\161\1\164\17\191\3\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\136\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\136\1\135\0\133\1\16\16\133\0\16\16\135\1\135\0\135\1\135\0\133\1\16\16\133\0\16\16\135\1\16\0\16\0\16\0\16\0\135\1\135\0\141\1\16\16\135\1\135\2\135\1\135\2\135\1\135\2\132\1\16\1\1\131\0\2\28\1\130\28\130\1\16\1\1\131\0\2\130\28\131\1\16\16\1\1\131\0\16\130\28\135\1\132\0\130\28\16\16\130\1\16\1\1\131\0\2\28\28\16\138\9\132\13\133\20\25\25\23\24\21\23\23\24\21\23\135\25\10\11\132\13\9\136\25\23\24\131\25\19\19\130\25\26\21\22\138\25\26\25\19\137\25\9\132\13\16\137\13\8\17\16\16\133\8\130\26\21\22\17\137\8\130\26\21\22\16\140\17\130\16\160\27\142\16\140\3\131\5\3\130\5\139\3\142\16\29\29\0\131\29\0\29\29\1\130\0\1\1\130\0\1\29\0\29\29\26\132\0\133\29\0\29\0\29\0\29\131\0\29\1\131\0\1\131\18\1\29\29\1\1\0\0\132\26\0\131\1\29\26\29\29\1\29\143\8\162\7\0\1\131\7\8\29\29\131\16\132\26\132\29\26\26\131\29\26\29\29\26\29\29\26\134\29\26\158\29\26\26\29\29\26\29\26\158\29\130\139\26\135\29\21\22\21\22\147\29\26\26\134\29\21\22\208\29\26\157\29\152\26\167\29\133\26\199\29\149\16\138\29\148\16\187\8\205\29\149\8\129\182\29\26\136\29\26\181\29\135\26\238\29\26\129\247\29\21\22\21\22\21\22\21\22\21\22\21\22\21\22\157\8\171\29\132\26\21\22\158\26\21\22\21\22\21\22\21\22\21\22\143\26\129\255\29\129\130\26\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\190\26\21\22\21\22\159\26\21\22\130\129\26\175\29\148\26\29\29\133\26\166\29\16\16\159\29\16\232\29\175\0\175\1\0\1\130\0\1\1\0\1\0\1\0\1\131\0\1\0\1\1\0\133\1\17\17\130\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\133\29\0\1\0\1\130\3\0\1\132\16\131\25\8\25\25\165\1\16\1\132\16\1\16\16\183\18\134\16\17\25\141\16\3\150\18\136\16\134\18\16\134\18\16\134\18\16\134\18\16\134\18\16\134\18\16\134\18\16\134\18\16\159\3\25\25\23\24\23\24\130\25\23\24\25\23\24\136\25\20\25\25\20\25\23\24\25\25\23\24\21\22\21\22\21\22\21\22\132\25\17\137\25\20\20\131\25\20\25\21\140\25\29\29\130\25\21\22\21\22\21\22\21\22\20\161\16\153\29\16\216\29\139\16\129\213\29\153\16\143\29\9\130\25\29\17\18\7\21\22\21\22\21\22\21\22\21\22\29\29\21\22\21\22\21\22\21\22\20\21\22\22\29\136\7\131\3\4\4\20\132\17\29\29\130\7\17\18\25\29\29\16\213\18\16\16\3\3\28\28\17\17\18\20\217\18\25\130\17\18\132\16\170\18\16\221\18\16\29\29\131\8\137\29\159\18\165\29\136\16\29\143\18\158\29\16\137\8\157\29\135\8\29\142\8\159\29\137\8\166\29\142\8\130\191\29\18\179\189\16\18\191\29\18\129\163\253\16\149\18\17\136\246\18\130\16\182\29\136\16\167\18\133\17\25\25\130\139\18\17\130\25\143\18\137\6\18\18\147\16\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\18\3\130\5\25\137\3\25\17\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\17\17\3\3\197\18\137\7\3\3\133\25\135\16\150\28\136\17\28\28\0\1\0\1\0\1\0\1\0\1\0\1\0\130\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\17\135\1\0\1\0\1\0\0\1\0\1\0\1\0\1\0\1\17\28\28\0\1\0\1\18\0\1\0\130\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\132\0\1\132\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\131\0\1\0\1\0\0\1\16\16\0\1\16\1\16\1\0\1\0\1\0\1\0\148\16\130\17\0\1\18\17\17\1\134\18\3\130\18\3\131\18\3\150\18\4\4\3\3\4\131\29\3\130\16\133\8\29\29\27\29\133\16\179\18\131\25\135\16\4\4\177\18\143\4\3\3\135\16\25\25\137\6\133\16\145\3\133\18\130\25\18\25\18\18\3\137\6\155\18\135\3\25\25\150\18\138\3\4\4\138\16\25\156\18\130\16\130\3\4\174\18\3\4\4\131\3\4\4\3\3\130\4\140\25\16\17\137\6\131\16\25\25\132\18\3\17\136\18\137\6\132\18\16\168\18\133\3\4\4\3\3\4\4\3\3\136\16\130\18\3\135\18\3\4\16\16\137\6\16\16\131\25\143\18\17\133\18\130\29\18\4\3\4\177\18\3\18\130\3\18\18\3\3\132\18\3\3\18\3\18\151\16\18\18\17\25\25\138\18\4\3\3\4\4\25\25\18\17\17\4\3\137\16\133\18\16\16\133\18\16\16\133\18\136\16\134\18\16\134\18\16\170\1\28\131\17\136\1\17\28\28\131\16\207\1\162\18\4\4\3\4\4\3\4\4\25\4\3\16\16\137\6\133\16\18\215\161\16\18\139\16\150\18\131\16\176\18\131\16\14\134\253\16\14\14\253\16\14\14\135\253\16\14\15\177\253\16\15\130\237\18\16\16\233\18\165\16\134\1\139\16\132\1\132\16\18\3\137\18\26\140\18\16\132\18\16\18\16\18\18\16\18\18\16\235\18\144\28\143\16\130\234\18\22\21\143\29\191\18\16\16\181\18\134\16\29\159\16\139\18\27\130\29\143\3\134\25\21\22\25\133\16\143\3\25\20\20\19\19\21\22\21\22\21\22\21\22\21\22\21\22\21\22\21\22\25\25\21\22\131\25\130\19\130\25\16\131\25\20\21\22\21\22\21\22\130\25\26\20\130\26\16\25\27\25\25\131\16\132\18\16\129\134\18\16\16\13\16\130\25\27\130\25\21\22\25\26\25\20\25\25\137\6\25\25\130\26\25\25\153\0\21\25\22\28\19\28\153\1\21\26\22\26\21\22\25\21\22\25\25\137\18\17\172\18\17\17\158\18\130\16\133\18\16\16\133\18\16\16\133\18\16\16\130\18\130\16\27\27\26\28\29\27\27\16\29\131\26\29\29\137\16\130\13\29\29\16\16\139\18\16\153\18\16\146\18\16\18\18\16\142\18\16\16\141\18\161\16\250\18\132\16\130\25\131\16\172\8\130\16\136\29\180\7\131\8\144\29\8\8\130\29\16\140\29\130\16\29\174\16\172\29\3\129\129\16\156\18\130\16\176\18\142\16\3\154\8\131\16\159\18\131\8\136\16\147\18\7\135\18\7\132\16\165\18\132\3\132\16\157\18\16\25\163\18\131\16\135\18\25\132\7\169\16\167\0\167\1\205\18\16\16\137\6\133\16\163\0\131\16\163\1\131\16\167\18\135\16\179\18\138\16\25\138\0\16\142\0\16\134\0\16\0\0\16\138\1\16\142\1\16\134\1\16\1\1\130\16\179\18\139\16\130\182\18\136\16\149\18\137\16\135\18\151\16\133\17\16\169\17\16\136\17\196\16\133\18\16\16\18\16\171\18\16\18\18\130\16\18\16\16\150\18\16\25\135\8\150\18\29\29\134\8\158\18\135\16\136\8\175\16\146\18\16\18\18\132\16\132\8\149\18\133\8\130\16\25\153\18\132\16\25\191\16\183\18\131\16\8\8\18\18\143\8\16\16\173\8\18\130\3\16\3\3\132\16\131\3\131\18\16\130\18\16\156\18\16\16\130\3\131\16\3\136\8\134\16\136\25\134\16\156\18\8\8\25\156\18\130\8\159\16\135\18\29\155\18\3\3\131\16\132\8\134\25\136\16\181\18\130\16\134\25\149\18\16\16\135\8\146\18\132\16\135\8\145\18\134\16\131\25\139\16\134\8\207\16\200\18\182\16\178\0\140\16\178\1\134\16\133\8\163\18\131\3\135\16\137\6\133\16\137\6\131\18\17\18\149\0\130\16\132\3\20\17\149\1\135\16\26\26\129\207\16\158\8\16\169\18\16\3\3\20\16\16\18\18\143\16\130\18\182\16\131\3\156\18\137\8\18\135\16\149\18\138\3\131\8\132\25\149\16\145\18\131\3\131\25\165\16\148\18\134\8\147\16\150\18\136\16\4\3\4\180\18\142\3\134\25\131\16\147\8\137\6\3\18\18\3\3\18\136\16\130\3\4\172\18\130\4\131\3\4\4\3\3\25\25\13\131\25\3\137\16\13\16\16\152\18\134\16\137\6\133\16\130\3\163\18\132\3\4\135\3\16\137\6\131\25\18\4\4\18\135\16\162\18\3\25\25\18\136\16\3\3\4\175\18\130\4\136\3\4\4\131\18\131\25\131\3\25\4\3\137\6\18\25\18\130\25\16\147\8\138\16\145\18\16\152\18\130\4\130\3\4\4\3\4\3\3\133\25\3\18\18\3\189\16\134\18\16\18\16\131\18\16\142\18\16\137\18\25\133\16\174\18\3\130\4\135\3\132\16\137\6\133\16\3\3\4\4\16\135\18\16\16\18\18\16\16\149\18\16\134\18\16\18\18\16\132\18\16\3\3\18\4\4\3\131\4\16\16\4\4\16\16\130\4\16\16\18\133\16\4\132\16\132\18\4\4\16\16\134\3\130\16\132\3\138\16\137\18\16\18\16\16\18\16\165\18\16\18\130\4\133\3\16\4\16\16\4\16\131\4\16\4\4\3\4\3\18\3\18\25\25\16\25\25\135\16\3\3\156\16\180\18\130\4\135\3\4\4\130\3\4\3\131\18\132\25\137\6\25\25\16\25\3\130\18\157\16\175\18\130\4\133\3\4\3\131\4\3\3\4\3\3\18\18\25\18\135\16\137\6\129\165\16\174\18\130\4\131\3\16\16\131\4\3\3\4\3\3\150\25\131\18\3\3\161\16\175\18\130\4\135\3\4\4\3\4\3\3\130\25\18\138\16\137\6\133\16\140\25\146\16\170\18\3\4\3\4\4\133\3\4\3\18\25\133\16\137\6\133\16\147\6\155\16\154\18\16\16\3\4\3\4\4\131\3\4\132\3\131\16\137\6\8\8\130\25\29\134\18\129\184\16\171\18\130\4\136\3\4\3\3\25\227\16\159\0\159\1\137\6\136\8\139\16\135\18\16\16\18\16\16\135\18\16\18\18\16\151\18\133\4\16\4\4\16\16\3\3\4\3\18\4\18\4\3\130\25\136\16\137\6\197\16\135\18\16\16\166\18\130\4\131\3\16\16\3\3\131\4\3\18\25\18\4\154\16\18\137\3\167\18\133\3\4\18\131\3\135\25\3\135\16\18\133\3\4\4\130\3\173\18\140\3\4\3\3\130\25\18\132\25\140\16\200\18\134\16\137\25\129\181\16\160\18\25\141\16\137\6\133\16\136\18\16\164\18\4\134\3\16\133\3\4\3\18\132\25\137\16\137\6\146\8\130\16\25\25\157\18\16\16\149\3\16\4\134\3\4\3\3\4\3\3\200\16\134\18\16\18\18\16\165\18\133\3\130\16\3\16\3\3\16\134\3\18\3\135\16\137\6\133\16\133\18\16\18\18\16\159\18\132\4\16\3\3\16\4\4\3\4\3\18\134\16\137\6\130\181\16\146\18\3\3\4\4\25\25\134\16\3\3\18\4\140\18\16\161\18\4\4\132\3\130\16\4\4\3\4\3\140\25\137\6\3\212\16\18\142\16\148\8\135\29\131\27\144\29\140\16\25\135\153\18\229\16\238\7\16\132\25\138\16\129\195\18\148\203\16\224\18\25\25\140\16\136\175\18\143\13\3\133\18\142\3\137\16\159\154\18\132\16\132\198\18\181\184\16\157\18\139\3\130\4\130\3\137\6\141\197\16\132\184\18\134\16\158\18\16\137\6\131\16\25\25\206\18\16\137\6\133\16\157\18\16\16\132\3\25\137\16\175\18\134\3\132\25\131\29\131\17\25\29\137\16\137\6\16\134\8\16\148\18\132\16\146\18\131\175\16\130\17\167\18\17\17\130\25\137\6\129\197\16\159\0\159\1\150\8\131\25\228\16\202\18\131\16\3\18\182\4\134\16\131\3\140\17\191\16\17\17\25\17\3\138\16\4\4\141\16\18\175\245\16\18\135\16\137\213\18\168\16\18\18\134\16\18\197\230\16\131\17\16\134\17\16\17\17\16\130\162\18\142\16\18\156\16\130\18\16\16\18\141\16\131\18\135\16\131\139\18\146\131\16\234\18\132\16\140\18\130\16\136\18\134\16\137\18\16\16\29\3\3\25\131\13\158\219\16\129\239\29\137\6\133\16\131\179\29\203\16\173\3\16\16\150\3\136\16\243\29\187\16\129\245\29\137\16\166\29\16\16\187\29\4\4\130\3\130\29\133\4\135\13\135\3\29\29\134\3\157\29\131\3\188\29\148\16\193\29\130\3\29\249\16\147\8\139\16\147\8\139\16\214\29\136\16\152\8\129\134\16\153\0\153\1\153\0\134\1\16\145\1\153\0\153\1\0\16\0\0\16\16\0\16\16\0\0\16\16\131\0\16\135\0\131\1\16\1\16\134\1\16\138\1\153\0\153\1\0\0\16\131\0\16\16\135\0\16\134\0\16\153\1\0\0\16\131\0\16\132\0\16\0\130\16\134\0\16\153\1\153\0\153\1\153\0\153\1\153\0\153\1\153\0\153\1\153\0\153\1\153\0\155\1\16\16\152\0\26\152\1\26\133\1\152\0\26\152\1\26\133\1\152\0\26\152\1\26\133\1\152\0\26\152\1\26\133\1\152\0\26\152\1\26\133\1\0\1\16\16\177\6\131\255\29\182\3\131\29\177\3\135\29\3\141\29\3\29\29\132\25\142\16\132\3\16\142\3\136\207\16\137\1\18\147\1\133\16\133\1\129\212\16\134\3\16\144\3\16\16\134\3\16\3\3\16\132\3\132\16\189\17\160\16\3\239\16\172\18\130\16\134\3\134\17\16\16\137\6\131\16\18\29\130\191\16\157\18\3\144\16\171\18\131\3\137\6\132\16\27\131\207\16\154\18\17\131\3\137\6\129\213\16\157\18\3\3\18\137\6\131\16\25\131\223\16\134\18\16\131\18\16\18\18\16\142\18\16\129\196\18\16\16\136\8\134\3\168\16\161\0\161\1\134\3\17\131\16\137\6\131\16\25\25\134\144\16\186\8\29\130\8\27\131\8\203\16\172\8\29\142\8\129\193\16\131\18\16\154\18\16\18\18\16\18\16\16\18\16\137\18\16\131\18\16\18\16\18\133\16\18\131\16\18\16\18\16\18\16\130\18\16\18\18\16\18\16\16\18\16\18\16\18\16\18\16\18\16\18\18\16\18\16\16\131\18\16\134\18\16\131\18\16\131\18\16\18\16\137\18\16\144\18\132\16\130\18\16\132\18\16\144\18\179\16\26\26\130\141\16\171\29\131\16\227\29\139\16\142\29\16\16\142\29\16\142\29\16\164\29\137\16\140\8\129\160\29\183\16\156\29\140\16\171\29\131\16\136\29\134\16\29\29\141\16\133\29\129\153\16\129\250\29\132\28\133\215\29\131\16\144\29\130\16\140\29\130\16\246\29\131\16\222\29\133\16\139\29\131\16\29\142\16\139\29\131\16\183\29\135\16\137\29\133\16\167\29\135\16\157\29\16\16\139\29\131\16\29\29\189\16\130\211\29\139\16\141\29\16\16\140\29\130\16\137\29\132\16\183\29\134\16\142\29\16\16\138\29\133\16\136\29\134\16\129\146\29\16\219\29\137\6\136\133\16\18\130\205\221\16\18\159\16\18\160\183\16\18\133\16\18\129\219\16\18\16\16\18\172\255\16\18\141\16\18\186\174\16\18\142\16\18\132\235\16\18\147\161\16\132\157\18\139\225\16\18\166\200\16\18\132\16\18\160\221\16\18\171\184\208\16\13\157\16\223\13\255\16\129\239\3\131\252\143\16\15\131\255\251\16\15\16\16\15\131\255\251\16\15"+  "\159\25\22\130\17\19\130\17\13\14\17\18\17\12\17\17\137\8\17\17\130\18\17\17\153\0\13\17\14\20\11\20\153\1\13\18\14\18\160\25\22\17\131\19\21\17\20\21\4\15\18\26\21\20\21\18\10\10\20\1\17\17\20\10\4\16\130\10\17\150\0\18\134\0\151\1\18\135\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\0\1\0\1\0\130\1\0\0\1\0\1\0\0\1\130\0\1\1\131\0\1\0\0\1\130\0\130\1\0\0\1\0\0\1\0\1\0\1\0\0\1\0\1\1\0\1\0\0\1\130\0\1\0\1\0\0\1\1\4\0\130\1\131\4\0\2\1\0\2\1\0\2\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\2\1\0\1\130\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\134\1\0\0\1\0\0\1\1\0\1\131\0\1\0\1\0\1\0\1\0\196\1\4\4\153\1\145\3\131\20\139\3\141\20\132\3\134\20\3\20\3\144\20\239\5\0\1\0\1\3\20\0\1\29\29\3\130\1\17\0\131\29\20\20\0\17\130\0\29\0\29\0\0\1\144\0\29\136\0\162\1\0\1\1\130\0\130\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\132\1\0\1\18\0\1\0\0\1\1\178\0\175\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\21\132\5\7\7\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\29\165\0\29\29\3\133\17\168\1\17\12\29\29\21\21\19\29\172\5\12\5\17\5\5\17\5\5\17\5\135\29\154\4\131\29\131\4\17\17\138\29\133\26\130\18\17\17\19\17\17\21\21\138\5\17\26\130\17\159\4\3\137\4\148\5\137\8\131\17\4\4\5\226\4\17\4\134\5\26\21\133\5\3\3\5\5\21\131\5\4\4\137\8\130\4\21\21\4\141\17\29\26\4\5\157\4\154\5\29\29\216\4\138\5\4\141\29\137\8\160\4\136\5\3\3\21\130\17\3\29\29\5\19\19\149\4\131\5\3\136\5\3\130\5\3\132\5\29\29\142\17\29\152\4\130\5\29\29\17\29\138\4\132\29\151\4\20\134\4\26\26\132\29\136\5\168\4\3\151\5\26\159\5\6\181\4\5\6\5\4\130\6\135\5\131\6\5\6\6\4\134\5\137\4\5\5\17\17\137\8\17\3\142\4\5\6\6\29\135\4\29\29\4\4\29\29\149\4\29\134\4\29\4\130\29\131\4\29\29\5\4\130\6\131\5\29\29\6\6\29\29\6\6\5\4\135\29\6\131\29\4\4\29\130\4\5\5\29\29\137\8\4\4\19\19\133\10\21\19\4\17\5\29\29\5\5\6\29\133\4\131\29\4\4\29\29\149\4\29\134\4\29\4\4\29\4\4\29\4\4\29\29\5\29\130\6\5\5\131\29\5\5\29\29\130\5\130\29\5\134\29\131\4\29\4\134\29\137\8\5\5\130\4\5\17\137\29\5\5\6\29\136\4\29\130\4\29\149\4\29\134\4\29\4\4\29\132\4\29\29\5\4\130\6\132\5\29\5\5\6\29\6\6\5\29\29\4\142\29\4\4\5\5\29\29\137\8\17\19\134\29\4\133\5\29\5\6\6\29\135\4\29\29\4\4\29\29\149\4\29\134\4\29\4\4\29\132\4\29\29\5\4\6\5\6\131\5\29\29\6\6\29\29\6\6\5\134\29\5\5\6\131\29\4\4\29\130\4\5\5\29\29\137\8\21\4\133\10\137\29\5\4\29\133\4\130\29\130\4\29\131\4\130\29\4\4\29\4\29\4\4\130\29\4\4\130\29\130\4\130\29\139\4\131\29\6\6\5\6\6\130\29\130\6\29\130\6\5\29\29\4\133\29\6\141\29\137\8\130\10\133\21\19\21\132\29\5\130\6\5\135\4\29\130\4\29\150\4\29\143\4\29\29\5\4\130\5\131\6\29\130\5\29\131\5\134\29\5\5\29\130\4\29\4\4\29\29\4\4\5\5\29\29\137\8\134\29\17\134\10\21\4\5\6\6\17\135\4\29\130\4\29\150\4\29\137\4\29\132\4\29\29\5\4\6\5\132\6\29\5\6\6\29\6\6\5\5\134\29\6\6\132\29\130\4\29\4\4\5\5\29\29\137\8\29\4\4\6\139\29\5\5\6\6\136\4\29\130\4\29\168\4\5\5\4\130\6\131\5\29\130\6\29\130\6\5\4\21\131\29\130\4\6\134\10\130\4\5\5\29\29\137\8\136\10\21\133\4\29\5\6\6\29\145\4\130\29\151\4\29\136\4\29\4\29\29\134\4\130\29\5\131\29\130\6\130\5\29\5\29\135\6\133\29\137\8\29\29\6\6\17\139\29\175\4\5\4\4\134\5\131\29\19\133\4\3\135\5\17\137\8\17\17\164\29\4\4\29\4\29\132\4\29\151\4\29\4\29\137\4\5\4\4\136\5\4\29\29\132\4\29\3\29\134\5\29\137\8\29\29\131\4\159\29\4\130\21\142\17\21\17\130\21\5\5\133\21\137\8\137\10\21\5\21\5\21\5\13\14\13\14\6\6\135\4\29\163\4\131\29\141\5\6\132\5\17\5\5\132\4\138\5\29\163\5\29\135\21\5\133\21\29\21\21\132\17\131\21\17\17\164\29\170\4\6\6\131\5\6\133\5\6\5\5\6\6\5\5\4\137\8\133\17\133\4\6\6\5\5\131\4\130\5\4\130\6\4\4\134\6\130\4\131\5\140\4\5\6\6\5\5\133\6\5\4\6\137\8\130\6\5\21\21\165\0\29\0\132\29\0\29\29\170\1\17\3\130\1\130\200\4\29\131\4\29\29\134\4\29\4\29\131\4\29\29\168\4\29\131\4\29\29\160\4\29\131\4\29\29\134\4\29\4\29\131\4\29\29\142\4\29\184\4\29\131\4\29\29\194\4\29\29\130\5\136\17\147\10\130\29\143\4\137\21\133\29\213\0\29\29\133\1\29\29\12\132\235\4\21\17\144\4\22\153\4\13\14\130\29\202\4\130\17\130\9\135\4\134\29\145\4\130\5\6\136\29\146\4\5\5\6\17\17\136\29\145\4\5\5\139\29\140\4\29\130\4\29\5\5\139\29\179\4\5\5\6\134\5\135\6\5\6\6\138\5\130\17\3\130\17\19\4\5\29\29\137\8\133\29\137\10\133\29\133\17\12\131\17\130\5\26\5\137\8\133\29\162\4\3\180\4\134\29\132\4\5\5\161\4\5\4\132\29\197\4\137\29\158\4\29\130\5\131\6\5\5\130\6\131\29\6\6\5\133\6\130\5\131\29\21\130\29\17\17\137\8\157\4\29\29\132\4\138\29\171\4\131\29\153\4\133\29\137\8\10\130\29\161\21\150\4\5\5\6\6\5\29\29\17\17\180\4\6\5\6\134\5\29\5\6\5\6\6\135\5\133\6\137\5\29\29\5\137\8\133\29\137\8\133\29\134\17\3\133\17\29\29\141\5\7\158\5\29\29\139\5\147\29\131\5\6\174\4\5\6\132\5\6\5\132\6\5\6\6\135\4\29\17\17\137\8\134\17\137\21\136\5\136\21\130\17\5\5\6\157\4\6\131\5\6\6\5\5\6\130\5\4\4\137\8\171\4\5\6\5\5\130\6\5\6\130\5\6\6\135\29\131\17\163\4\135\6\135\5\6\6\5\5\130\29\132\17\137\8\130\29\130\4\137\8\157\4\133\3\17\17\136\1\0\1\132\29\170\0\29\29\130\0\135\17\135\29\130\5\17\140\5\6\134\5\131\4\5\133\4\5\4\4\6\5\5\4\132\29\171\1\190\3\140\1\3\161\1\164\3\191\5\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\136\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\136\1\135\0\133\1\29\29\133\0\29\29\135\1\135\0\135\1\135\0\133\1\29\29\133\0\29\29\135\1\29\0\29\0\29\0\29\0\135\1\135\0\141\1\29\29\135\1\135\2\135\1\135\2\135\1\135\2\132\1\29\1\1\131\0\2\20\1\130\20\130\1\29\1\1\131\0\2\130\20\131\1\29\29\1\1\131\0\29\130\20\135\1\132\0\130\20\29\29\130\1\29\1\1\131\0\2\20\20\29\138\22\132\26\133\12\17\17\15\16\13\15\15\16\13\15\135\17\23\24\132\26\22\136\17\15\16\131\17\11\11\130\17\18\13\14\138\17\18\17\11\137\17\22\132\26\29\137\26\10\3\29\29\133\10\130\18\13\14\3\137\10\130\18\13\14\29\140\3\130\29\161\19\141\29\140\5\131\7\5\130\7\139\5\142\29\21\21\0\131\21\0\21\21\1\130\0\1\1\130\0\1\21\0\21\21\18\132\0\133\21\0\21\0\21\0\21\131\0\21\1\131\0\1\131\4\1\21\21\1\1\0\0\132\18\0\131\1\21\18\21\21\1\21\143\10\162\9\0\1\131\9\10\21\21\131\29\132\18\132\21\18\18\131\21\18\21\21\18\21\21\18\134\21\18\158\21\18\18\21\21\18\21\18\158\21\130\139\18\135\21\13\14\13\14\147\21\18\18\134\21\13\14\208\21\18\157\21\152\18\167\21\133\18\199\21\149\29\138\21\148\29\187\10\205\21\149\10\129\182\21\18\136\21\18\181\21\135\18\238\21\18\129\247\21\13\14\13\14\13\14\13\14\13\14\13\14\13\14\157\10\171\21\132\18\13\14\158\18\13\14\13\14\13\14\13\14\13\14\143\18\129\255\21\129\130\18\13\14\13\14\13\14\13\14\13\14\13\14\13\14\13\14\13\14\13\14\13\14\190\18\13\14\13\14\159\18\13\14\130\129\18\175\21\148\18\21\21\133\18\166\21\29\29\129\137\21\175\0\175\1\0\1\130\0\1\1\0\1\0\1\0\1\131\0\1\0\1\1\0\133\1\3\3\130\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\1\133\21\0\1\0\1\130\5\0\1\132\29\131\17\10\17\17\165\1\29\1\132\29\1\29\29\183\4\134\29\3\17\141\29\5\150\4\136\29\134\4\29\134\4\29\134\4\29\134\4\29\134\4\29\134\4\29\134\4\29\134\4\29\159\5\17\17\15\16\15\16\130\17\15\16\17\15\16\136\17\12\17\17\12\17\15\16\17\17\15\16\13\14\13\14\13\14\13\14\132\17\3\137\17\12\12\131\17\12\17\13\140\17\21\21\130\17\13\14\13\14\13\14\13\14\12\161\29\153\21\29\216\21\139\29\129\213\21\153\29\143\21\22\130\17\21\3\4\9\13\14\13\14\13\14\13\14\13\14\21\21\13\14\13\14\13\14\13\14\12\13\14\14\21\136\9\131\5\6\6\12\132\3\21\21\130\9\3\4\17\21\21\29\213\4\29\29\5\5\20\20\3\3\4\12\217\4\17\130\3\4\132\29\170\4\29\221\4\29\21\21\131\10\137\21\159\4\165\21\136\29\21\143\4\158\21\29\137\10\157\21\135\10\21\142\10\159\21\137\10\166\21\142\10\130\191\21\4\179\189\29\4\191\21\4\129\163\253\29\149\4\3\136\246\4\130\29\182\21\136\29\167\4\133\3\17\17\130\139\4\3\130\17\143\4\137\8\4\4\147\29\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\4\5\130\7\17\137\5\17\3\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\3\3\5\5\197\4\137\9\5\5\133\17\135\29\150\20\136\3\20\20\0\1\0\1\0\1\0\1\0\1\0\1\0\130\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\3\135\1\0\1\0\1\0\0\1\0\1\0\1\0\1\0\1\3\20\20\0\1\0\1\4\0\1\0\130\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\132\0\1\132\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\131\0\1\0\1\0\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\147\29\131\3\0\1\4\3\3\1\134\4\5\130\4\5\131\4\5\150\4\6\6\5\5\6\131\21\5\130\29\133\10\21\21\19\21\133\29\179\4\131\17\135\29\6\6\177\4\143\6\5\5\135\29\17\17\137\8\133\29\145\5\133\4\130\17\4\17\4\4\5\137\8\155\4\135\5\17\17\150\4\138\5\6\6\138\29\17\156\4\130\29\130\5\6\174\4\5\6\6\131\5\6\6\5\5\130\6\140\17\29\3\137\8\131\29\17\17\132\4\5\3\136\4\137\8\132\4\29\168\4\133\5\6\6\5\5\6\6\5\5\136\29\130\4\5\135\4\5\6\29\29\137\8\29\29\131\17\143\4\3\133\4\130\21\4\6\5\6\177\4\5\4\130\5\4\4\5\5\132\4\5\5\4\5\4\151\29\4\4\3\17\17\138\4\6\5\5\6\6\17\17\4\3\3\6\5\137\29\133\4\29\29\133\4\29\29\133\4\136\29\134\4\29\134\4\29\170\1\20\131\3\136\1\3\20\20\131\29\207\1\162\4\6\6\5\6\6\5\6\6\17\6\5\29\29\137\8\133\29\4\215\161\29\4\139\29\150\4\131\29\176\4\131\29\27\134\253\29\27\27\253\29\27\27\135\253\29\27\28\177\253\29\28\130\237\4\29\29\233\4\165\29\134\1\139\29\132\1\132\29\4\5\137\4\18\140\4\29\132\4\29\4\29\4\4\29\4\4\29\235\4\144\20\143\21\130\234\4\14\13\143\21\191\4\21\21\181\4\135\21\159\29\139\4\19\130\21\143\5\134\17\13\14\17\133\29\143\5\17\12\12\11\11\13\14\13\14\13\14\13\14\13\14\13\14\13\14\13\14\17\17\13\14\131\17\130\11\130\17\29\131\17\12\13\14\13\14\13\14\130\17\18\12\130\18\29\17\19\17\17\131\29\132\4\29\129\134\4\29\29\26\29\130\17\19\130\17\13\14\17\18\17\12\17\17\137\8\17\17\130\18\17\17\153\0\13\17\14\20\11\20\153\1\13\18\14\18\13\14\17\13\14\17\17\137\4\3\172\4\3\3\158\4\130\29\133\4\29\29\133\4\29\29\133\4\29\29\130\4\130\29\19\19\18\20\21\19\19\29\21\131\18\21\21\137\29\130\26\21\21\29\29\139\4\29\153\4\29\146\4\29\4\4\29\142\4\29\29\141\4\161\29\250\4\132\29\130\17\131\29\172\10\130\29\136\21\180\9\131\10\144\21\10\10\130\21\29\140\21\130\29\21\174\29\172\21\5\129\129\29\156\4\130\29\176\4\142\29\5\154\10\131\29\159\4\131\10\136\29\147\4\9\135\4\9\132\29\165\4\132\5\132\29\157\4\29\17\163\4\131\29\135\4\17\132\9\169\29\167\0\167\1\205\4\29\29\137\8\133\29\163\0\131\29\163\1\131\29\167\4\135\29\179\4\138\29\17\138\0\29\142\0\29\134\0\29\0\0\29\138\1\29\142\1\29\134\1\29\1\1\130\29\179\4\139\29\130\182\4\136\29\149\4\137\29\135\4\151\29\133\3\29\169\3\29\136\3\196\29\133\4\29\29\4\29\171\4\29\4\4\130\29\4\29\29\150\4\29\17\135\10\150\4\21\21\134\10\158\4\135\29\136\10\175\29\146\4\29\4\4\132\29\132\10\149\4\133\10\130\29\17\153\4\132\29\17\153\4\165\29\183\4\131\29\10\10\4\4\143\10\29\29\173\10\4\130\5\29\5\5\132\29\131\5\131\4\29\130\4\29\156\4\29\29\130\5\131\29\5\136\10\134\29\136\17\134\29\156\4\10\10\17\156\4\130\10\159\29\135\4\21\155\4\5\5\131\29\132\10\134\17\136\29\181\4\130\29\134\17\149\4\29\29\135\10\146\4\132\29\135\10\145\4\134\29\131\17\139\29\134\10\207\29\200\4\182\29\178\0\140\29\178\1\134\29\133\10\163\4\131\5\135\29\137\8\133\29\137\8\131\4\3\4\149\0\130\29\132\5\12\3\149\1\135\29\18\18\129\207\29\158\10\29\169\4\29\5\5\12\29\29\4\4\143\29\130\4\3\4\4\135\29\17\135\21\160\29\133\5\156\4\137\10\4\135\29\149\4\138\5\131\10\132\17\149\29\145\4\131\5\131\17\165\29\148\4\134\10\147\29\150\4\136\29\6\5\6\180\4\142\5\134\17\131\29\147\10\137\8\5\4\4\5\5\4\136\29\130\5\6\172\4\130\6\131\5\6\6\5\5\17\17\26\131\17\5\137\29\26\29\29\152\4\134\29\137\8\133\29\130\5\163\4\132\5\6\135\5\29\137\8\131\17\4\6\6\4\135\29\162\4\5\17\17\4\136\29\5\5\6\175\4\130\6\136\5\6\6\131\4\131\17\131\5\17\6\5\137\8\4\17\4\130\17\29\147\10\138\29\145\4\29\152\4\130\6\130\5\6\6\5\6\5\5\133\17\5\4\4\5\189\29\134\4\29\4\29\131\4\29\142\4\29\137\4\17\133\29\174\4\5\130\6\135\5\132\29\137\8\133\29\5\5\6\6\29\135\4\29\29\4\4\29\29\149\4\29\134\4\29\4\4\29\132\4\29\5\5\4\6\6\5\131\6\29\29\6\6\29\29\130\6\29\29\4\133\29\6\132\29\132\4\6\6\29\29\134\5\130\29\132\5\138\29\137\4\29\4\29\29\4\29\165\4\29\4\130\6\133\5\29\6\29\29\6\29\131\6\29\6\6\5\6\5\4\5\4\17\17\29\17\17\135\29\5\5\156\29\180\4\130\6\135\5\6\6\130\5\6\5\131\4\132\17\137\8\17\17\29\17\5\130\4\157\29\175\4\130\6\133\5\6\5\131\6\5\5\6\5\5\4\4\17\4\135\29\137\8\129\165\29\174\4\130\6\131\5\29\29\131\6\5\5\6\5\5\150\17\131\4\5\5\161\29\175\4\130\6\135\5\6\6\5\6\5\5\130\17\4\138\29\137\8\133\29\140\17\146\29\170\4\5\6\5\6\6\133\5\6\5\4\17\133\29\137\8\133\29\147\8\155\29\154\4\29\29\5\6\5\6\6\131\5\6\132\5\131\29\137\8\10\10\130\17\21\134\4\129\184\29\171\4\130\6\136\5\6\5\5\17\227\29\159\0\159\1\137\8\136\10\139\29\135\4\29\29\4\29\29\135\4\29\4\4\29\151\4\133\6\29\6\6\29\29\5\5\6\5\4\6\4\6\5\130\17\136\29\137\8\197\29\135\4\29\29\166\4\130\6\131\5\29\29\5\5\131\6\5\4\17\4\6\154\29\4\137\5\167\4\133\5\6\4\131\5\135\17\5\135\29\4\133\5\6\6\130\5\173\4\140\5\6\5\5\130\17\4\132\17\140\29\200\4\134\29\137\17\213\29\5\6\130\5\6\5\6\215\29\160\4\17\141\29\137\8\133\29\136\4\29\164\4\6\134\5\29\133\5\6\5\4\132\17\137\29\137\8\146\10\130\29\17\17\157\4\29\29\149\5\29\6\134\5\6\5\5\6\5\5\200\29\134\4\29\4\4\29\165\4\133\5\130\29\5\29\5\5\29\134\5\4\5\135\29\137\8\133\29\133\4\29\4\4\29\159\4\132\6\29\5\5\29\6\6\5\6\5\4\134\29\137\8\133\29\168\4\3\4\4\131\29\137\8\129\245\29\146\4\5\5\6\6\17\17\134\29\5\5\4\6\140\4\29\161\4\6\6\132\5\130\29\6\6\5\6\5\140\17\137\8\5\212\29\4\142\29\148\10\135\21\131\19\144\21\140\29\17\135\153\4\229\29\238\9\29\132\17\138\29\129\195\4\148\203\29\224\4\17\17\140\29\136\175\4\143\26\5\133\4\142\5\137\29\159\154\4\132\29\132\198\4\181\184\29\157\4\139\5\130\6\130\5\137\8\141\197\29\132\184\4\134\29\158\4\29\137\8\131\29\17\17\206\4\29\137\8\133\29\157\4\29\29\132\5\17\137\29\175\4\134\5\132\17\131\21\131\3\17\21\137\29\137\8\29\134\10\29\148\4\132\29\146\4\131\175\29\130\3\167\4\3\3\130\17\137\8\129\197\29\159\0\159\1\150\10\131\17\132\29\152\0\29\29\152\1\171\29\202\4\131\29\5\4\182\6\134\29\131\5\140\3\191\29\3\3\17\3\5\138\29\6\6\3\3\130\9\136\29\4\175\253\29\137\214\4\168\29\4\4\156\29\4\224\29\242\4\195\252\29\131\3\29\134\3\29\3\3\29\130\162\4\142\29\4\156\29\130\4\29\29\4\141\29\131\4\135\29\131\139\4\146\131\29\234\4\132\29\140\4\130\29\136\4\134\29\137\4\29\29\21\5\5\17\131\26\158\219\29\129\239\21\137\8\130\21\130\29\131\179\21\133\29\150\21\142\29\143\21\18\142\29\173\5\29\29\150\5\136\29\243\21\187\29\129\245\21\137\29\166\21\29\29\187\21\6\6\130\5\130\21\133\6\135\26\135\5\21\21\134\5\157\21\131\5\188\21\148\29\193\21\130\5\21\249\29\147\10\139\29\147\10\139\29\214\21\136\29\152\10\129\134\29\153\0\153\1\153\0\134\1\29\145\1\153\0\153\1\0\29\0\0\29\29\0\29\29\0\0\29\29\131\0\29\135\0\131\1\29\1\29\134\1\29\138\1\153\0\153\1\0\0\29\131\0\29\29\135\0\29\134\0\29\153\1\0\0\29\131\0\29\132\0\29\0\130\29\134\0\29\153\1\153\0\153\1\153\0\153\1\153\0\153\1\153\0\153\1\153\0\153\1\153\0\155\1\29\29\152\0\18\152\1\18\133\1\152\0\18\152\1\18\133\1\152\0\18\152\1\18\133\1\152\0\18\152\1\18\133\1\152\0\18\152\1\18\133\1\0\1\29\29\177\8\131\255\21\182\5\131\21\177\5\135\21\5\141\21\5\21\21\132\17\142\29\132\5\29\142\5\136\207\29\137\1\4\147\1\133\29\133\1\129\212\29\134\5\29\144\5\29\29\134\5\29\5\5\29\132\5\132\29\189\3\160\29\5\239\29\172\4\130\29\134\5\134\3\29\29\137\8\131\29\4\21\130\191\29\157\4\5\144\29\171\4\131\5\137\8\132\29\19\131\207\29\154\4\3\131\5\137\8\129\213\29\157\4\5\5\4\137\8\131\29\17\129\191\29\158\4\29\130\4\5\4\4\5\134\4\5\5\132\4\5\135\29\4\3\129\223\29\134\4\29\131\4\29\4\4\29\142\4\29\129\196\4\29\29\136\10\134\5\168\29\161\0\161\1\134\5\3\131\29\137\8\131\29\17\17\134\144\29\186\10\21\130\10\19\131\10\203\29\172\10\21\142\10\129\193\29\131\4\29\154\4\29\4\4\29\4\29\29\4\29\137\4\29\131\4\29\4\29\4\133\29\4\131\29\4\29\4\29\4\29\130\4\29\4\4\29\4\29\29\4\29\4\29\4\29\4\29\4\29\4\4\29\4\29\29\131\4\29\134\4\29\131\4\29\131\4\29\4\29\137\4\29\144\4\132\29\130\4\29\132\4\29\144\4\179\29\18\18\130\141\29\171\21\131\29\227\21\139\29\142\21\29\29\142\21\29\142\21\29\164\21\137\29\140\10\129\160\21\183\29\156\21\140\29\171\21\131\29\136\21\134\29\21\21\141\29\133\21\129\153\29\129\250\21\132\20\133\216\21\130\29\144\21\130\29\140\21\130\29\129\217\21\133\29\139\21\131\29\21\142\29\139\21\131\29\183\21\135\29\137\21\133\29\167\21\135\29\157\21\29\29\139\21\131\29\21\21\141\29\136\18\166\29\130\215\21\135\29\141\21\29\29\140\21\130\29\138\21\130\29\184\21\29\21\131\29\143\21\29\29\139\21\131\29\137\21\134\29\129\146\21\29\219\21\137\8\21\136\132\29\4\130\205\221\29\4\159\29\4\160\189\29\4\4\129\219\29\4\29\29\4\173\139\29\4\29\29\4\186\174\29\4\142\29\4\132\235\29\4\147\161\29\132\157\4\139\225\29\4\166\200\29\4\132\29\4\160\221\29\4\4\161\199\29\4\171\151\134\29\26\157\29\223\26\255\29\129\239\5\131\252\143\29\28\131\255\251\29\28\29\29\28\131\255\251\29\28"  tcTable :: [(Int, Int, Int)] tcTable =-  [(97,25,63),(84,0,1486),(43,22,63),(24,6,63),(7,0,242),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,463),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(1,0,599),(1,0,390),(3,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(3,0,194),(4,0,1),(1,0,326),(1,0,85122),(3,0,260),(3,0,1),(2,0,1),(2,0,1),(3,0,1),(5,0,1),(3,0,1),(4,0,1),(2,0,1),(3,0,1),(4,0,1),(2,0,112),(5,0,2),(1,0,0),(1,0,1),(1,0,2),(1,0,0),(1,0,1),(1,0,2),(1,0,0),(1,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,157),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,2),(1,0,0),(1,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(3,1,21630),(3,0,1),(5,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,21566),(1,0,21560),(1,0,21564),(1,0,419),(1,0,411),(2,1,409),(3,0,403),(2,0,405),(1,0,84638),(4,0,409),(1,0,84630),(2,0,413),(1,0,84686),(1,0,84560),(1,0,84616),(2,0,417),(1,0,421),(1,0,84616),(1,0,21486),(1,0,84610),(3,0,421),(2,0,21498),(1,0,425),(3,0,427),(8,0,21454),(3,0,435),(2,0,84614),(1,0,435),(4,0,84564),(1,0,435),(1,0,137),(1,1,433),(2,0,141),(6,0,437),(11,0,84522),(1,0,84516),(167,0,168),(44,0,1),(2,0,1),(4,0,1),(4,2,260),(49,0,75),(1,2,73),(4,16,63),(17,0,61),(1,8,63),(9,0,127),(1,1,125),(3,0,123),(1,0,113),(4,0,93),(1,0,107),(1,0,15),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,171),(1,0,159),(1,0,14),(1,0,231),(2,0,191),(3,0,1),(3,0,1),(53,31,63),(32,15,159),(17,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(10,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,29),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(50,37,95),(2927,42,0),(45,2,0),(763,5,15),(2184,0,12507),(1,0,12505),(1,0,12487),(1,1,12483),(2,0,12485),(1,0,12471),(1,0,12361),(1,0,70532),(2,0,1),(239,0,70664),(4,0,7628),(17,0,70768),(115,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(6,0,117),(6,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,7,16),(16,5,16),(16,7,16),(16,7,16),(16,5,16),(17,0,16),(2,0,16),(2,0,16),(2,0,16),(9,7,16),(16,1,148),(2,3,172),(4,1,200),(2,1,256),(2,1,224),(2,1,252),(4,7,16),(16,7,16),(16,7,16),(16,1,16),(3,0,18),(11,0,14409),(5,0,18),(13,1,16),(16,1,16),(5,0,14),(14,0,18),(347,0,55),(34,15,31),(20,0,1),(844,25,51),(1888,47,95),(49,0,1),(4,0,21589),(1,0,21583),(2,0,1),(2,0,1),(2,0,1),(7,0,1),(3,0,1),(11,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(2,0,1),(5,0,1),(13,37,14527),(39,0,14527),(6,0,14527),(30996,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(20,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(136,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(11,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(5,0,1),(2,0,1),(1,0,96),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(12,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(2,0,1),(2,0,1),(27,0,1),(861,0,1855),(29,79,77727),(21457,25,63),(1255,39,79),(176,35,79),(191,10,77),(12,14,77),(16,6,77),(8,1,77),(1797,50,127),(176,21,63),(2896,31,63),(21920,31,63),(31426,33,67)]+  [(97,25,63),(84,0,1486),(43,22,63),(24,6,63),(7,0,242),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,463),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(1,0,599),(1,0,390),(3,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(3,0,194),(4,0,1),(1,0,326),(1,0,85122),(3,0,260),(3,0,1),(2,0,1),(2,0,1),(3,0,1),(5,0,1),(3,0,1),(4,0,1),(2,0,1),(3,0,1),(4,0,1),(2,0,112),(5,0,2),(1,0,0),(1,0,1),(1,0,2),(1,0,0),(1,0,1),(1,0,2),(1,0,0),(1,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,157),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,2),(1,0,0),(1,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(3,1,21630),(3,0,1),(5,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,21566),(1,0,21560),(1,0,21564),(1,0,419),(1,0,411),(2,1,409),(3,0,403),(2,0,405),(1,0,84638),(4,0,409),(1,0,84630),(2,0,413),(1,0,84686),(1,0,84560),(1,0,84616),(2,0,417),(1,0,421),(1,0,84616),(1,0,21486),(1,0,84610),(3,0,421),(2,0,21498),(1,0,425),(3,0,427),(8,0,21454),(3,0,435),(2,0,84614),(1,0,435),(4,0,84564),(1,0,435),(1,0,137),(1,1,433),(2,0,141),(6,0,437),(11,0,84522),(1,0,84516),(167,0,168),(44,0,1),(2,0,1),(4,0,1),(4,2,260),(49,0,75),(1,2,73),(4,16,63),(17,0,61),(1,8,63),(9,0,127),(1,1,125),(3,0,123),(1,0,113),(4,0,93),(1,0,107),(1,0,15),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,171),(1,0,159),(1,0,14),(1,0,231),(2,0,191),(3,0,1),(3,0,1),(53,31,63),(32,15,159),(17,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(10,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,29),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(50,37,95),(2927,42,0),(45,2,0),(763,5,15),(2184,0,12507),(1,0,12505),(1,0,12487),(1,1,12483),(2,0,12485),(1,0,12471),(1,0,12361),(1,0,70532),(2,0,1),(239,0,70664),(4,0,7628),(17,0,70768),(115,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(6,0,117),(6,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,7,16),(16,5,16),(16,7,16),(16,7,16),(16,5,16),(17,0,16),(2,0,16),(2,0,16),(2,0,16),(9,7,16),(16,1,148),(2,3,172),(4,1,200),(2,1,256),(2,1,224),(2,1,252),(4,7,16),(16,7,16),(16,7,16),(16,1,16),(3,0,18),(11,0,14409),(5,0,18),(13,1,16),(16,1,16),(5,0,14),(14,0,18),(347,0,55),(34,15,31),(20,0,1),(844,25,51),(1888,47,95),(49,0,1),(4,0,21589),(1,0,21583),(2,0,1),(2,0,1),(2,0,1),(7,0,1),(3,0,1),(11,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(2,0,1),(5,0,1),(13,37,14527),(39,0,14527),(6,0,14527),(30996,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(20,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(136,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(11,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(5,0,1),(2,0,1),(1,0,96),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(12,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(27,0,1),(861,0,1855),(29,79,77727),(21457,25,63),(1255,39,79),(176,35,79),(191,10,77),(12,14,77),(16,6,77),(8,1,77),(1797,50,127),(176,21,63),(2896,31,63),(21920,31,63),(91,24,53),(31335,33,67)]  ucTable :: [(Int, Int, Int)] ucTable =-  [(97,25,63),(84,0,1486),(43,22,63),(24,6,63),(7,0,242),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,463),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(1,0,599),(1,0,390),(3,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(3,0,194),(4,0,1),(1,0,326),(1,0,85122),(3,0,260),(3,0,1),(2,0,1),(2,0,1),(3,0,1),(5,0,1),(3,0,1),(4,0,1),(2,0,1),(3,0,1),(4,0,1),(2,0,112),(6,0,1),(1,0,3),(2,0,1),(1,0,3),(2,0,1),(1,0,3),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,157),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(1,0,3),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(3,1,21630),(3,0,1),(5,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,21566),(1,0,21560),(1,0,21564),(1,0,419),(1,0,411),(2,1,409),(3,0,403),(2,0,405),(1,0,84638),(4,0,409),(1,0,84630),(2,0,413),(1,0,84686),(1,0,84560),(1,0,84616),(2,0,417),(1,0,421),(1,0,84616),(1,0,21486),(1,0,84610),(3,0,421),(2,0,21498),(1,0,425),(3,0,427),(8,0,21454),(3,0,435),(2,0,84614),(1,0,435),(4,0,84564),(1,0,435),(1,0,137),(1,1,433),(2,0,141),(6,0,437),(11,0,84522),(1,0,84516),(167,0,168),(44,0,1),(2,0,1),(4,0,1),(4,2,260),(49,0,75),(1,2,73),(4,16,63),(17,0,61),(1,8,63),(9,0,127),(1,1,125),(3,0,123),(1,0,113),(4,0,93),(1,0,107),(1,0,15),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,171),(1,0,159),(1,0,14),(1,0,231),(2,0,191),(3,0,1),(3,0,1),(53,31,63),(32,15,159),(17,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(10,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,29),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(50,37,95),(2927,42,6016),(45,2,6016),(763,5,15),(2184,0,12507),(1,0,12505),(1,0,12487),(1,1,12483),(2,0,12485),(1,0,12471),(1,0,12361),(1,0,70532),(2,0,1),(239,0,70664),(4,0,7628),(17,0,70768),(115,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(6,0,117),(6,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,7,16),(16,5,16),(16,7,16),(16,7,16),(16,5,16),(17,0,16),(2,0,16),(2,0,16),(2,0,16),(9,7,16),(16,1,148),(2,3,172),(4,1,200),(2,1,256),(2,1,224),(2,1,252),(4,7,16),(16,7,16),(16,7,16),(16,1,16),(3,0,18),(11,0,14409),(5,0,18),(13,1,16),(16,1,16),(5,0,14),(14,0,18),(347,0,55),(34,15,31),(20,0,1),(844,25,51),(1888,47,95),(49,0,1),(4,0,21589),(1,0,21583),(2,0,1),(2,0,1),(2,0,1),(7,0,1),(3,0,1),(11,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(2,0,1),(5,0,1),(13,37,14527),(39,0,14527),(6,0,14527),(30996,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(20,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(136,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(11,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(5,0,1),(2,0,1),(1,0,96),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(12,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(2,0,1),(2,0,1),(27,0,1),(861,0,1855),(29,79,77727),(21457,25,63),(1255,39,79),(176,35,79),(191,10,77),(12,14,77),(16,6,77),(8,1,77),(1797,50,127),(176,21,63),(2896,31,63),(21920,31,63),(31426,33,67)]+  [(97,25,63),(84,0,1486),(43,22,63),(24,6,63),(7,0,242),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,463),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(1,0,599),(1,0,390),(3,0,1),(2,0,1),(3,0,1),(4,0,1),(6,0,1),(3,0,194),(4,0,1),(1,0,326),(1,0,85122),(3,0,260),(3,0,1),(2,0,1),(2,0,1),(3,0,1),(5,0,1),(3,0,1),(4,0,1),(2,0,1),(3,0,1),(4,0,1),(2,0,112),(6,0,1),(1,0,3),(2,0,1),(1,0,3),(2,0,1),(1,0,3),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,157),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(1,0,3),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(3,1,21630),(3,0,1),(5,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,21566),(1,0,21560),(1,0,21564),(1,0,419),(1,0,411),(2,1,409),(3,0,403),(2,0,405),(1,0,84638),(4,0,409),(1,0,84630),(2,0,413),(1,0,84686),(1,0,84560),(1,0,84616),(2,0,417),(1,0,421),(1,0,84616),(1,0,21486),(1,0,84610),(3,0,421),(2,0,21498),(1,0,425),(3,0,427),(8,0,21454),(3,0,435),(2,0,84614),(1,0,435),(4,0,84564),(1,0,435),(1,0,137),(1,1,433),(2,0,141),(6,0,437),(11,0,84522),(1,0,84516),(167,0,168),(44,0,1),(2,0,1),(4,0,1),(4,2,260),(49,0,75),(1,2,73),(4,16,63),(17,0,61),(1,8,63),(9,0,127),(1,1,125),(3,0,123),(1,0,113),(4,0,93),(1,0,107),(1,0,15),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,171),(1,0,159),(1,0,14),(1,0,231),(2,0,191),(3,0,1),(3,0,1),(53,31,63),(32,15,159),(17,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(10,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,0,29),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(50,37,95),(2927,42,6016),(45,2,6016),(763,5,15),(2184,0,12507),(1,0,12505),(1,0,12487),(1,1,12483),(2,0,12485),(1,0,12471),(1,0,12361),(1,0,70532),(2,0,1),(239,0,70664),(4,0,7628),(17,0,70768),(115,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(6,0,117),(6,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(1,7,16),(16,5,16),(16,7,16),(16,7,16),(16,5,16),(17,0,16),(2,0,16),(2,0,16),(2,0,16),(9,7,16),(16,1,148),(2,3,172),(4,1,200),(2,1,256),(2,1,224),(2,1,252),(4,7,16),(16,7,16),(16,7,16),(16,1,16),(3,0,18),(11,0,14409),(5,0,18),(13,1,16),(16,1,16),(5,0,14),(14,0,18),(347,0,55),(34,15,31),(20,0,1),(844,25,51),(1888,47,95),(49,0,1),(4,0,21589),(1,0,21583),(2,0,1),(2,0,1),(2,0,1),(7,0,1),(3,0,1),(11,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(9,0,1),(2,0,1),(5,0,1),(13,37,14527),(39,0,14527),(6,0,14527),(30996,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(20,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(136,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(4,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(11,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(5,0,1),(2,0,1),(1,0,96),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(12,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(5,0,1),(2,0,1),(3,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(2,0,1),(27,0,1),(861,0,1855),(29,79,77727),(21457,25,63),(1255,39,79),(176,35,79),(191,10,77),(12,14,77),(16,6,77),(8,1,77),(1797,50,127),(176,21,63),(2896,31,63),(21920,31,63),(91,24,53),(31335,33,67)]  lcTable :: [(Int, Int, Int)] lcTable =-  [(65,25,64),(127,22,64),(24,6,64),(40,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,397),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,241),(1,0,2),(2,0,2),(2,0,2),(4,0,420),(1,0,2),(2,0,2),(2,0,412),(1,0,2),(2,1,410),(2,0,2),(3,0,158),(1,0,404),(1,0,406),(1,0,2),(2,0,410),(1,0,414),(2,0,422),(1,0,418),(1,0,2),(4,0,422),(1,0,426),(2,0,428),(1,0,2),(2,0,2),(2,0,2),(2,0,436),(1,0,2),(2,0,436),(3,0,2),(2,0,436),(1,0,2),(2,1,434),(2,0,2),(2,0,2),(2,0,438),(1,0,2),(4,0,2),(8,0,4),(1,0,2),(2,0,4),(1,0,2),(2,0,4),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,4),(1,0,2),(2,0,2),(2,0,193),(1,0,111),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,259),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(8,0,21590),(1,0,2),(2,0,325),(1,0,21584),(3,0,2),(2,0,389),(1,0,138),(1,0,142),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(290,0,2),(2,0,2),(4,0,2),(9,0,232),(7,0,76),(2,2,74),(4,0,128),(2,1,126),(3,16,64),(18,8,64),(44,0,16),(9,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(6,0,119),(3,0,2),(2,0,13),(1,0,2),(3,2,259),(3,15,160),(16,31,64),(80,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(10,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,30),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,37,96),(2927,37,14528),(39,0,14528),(6,0,14528),(723,79,77728),(80,5,16),(2201,0,2),(7,42,6015),(45,2,6015),(323,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(10,0,15229),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(10,7,15),(16,5,15),(16,7,15),(16,7,15),(16,5,15),(17,0,15),(2,0,15),(2,0,15),(2,0,15),(9,7,15),(32,7,15),(16,7,15),(16,7,15),(16,1,15),(2,1,147),(2,0,17),(12,3,171),(4,0,17),(12,1,15),(2,1,199),(14,1,15),(2,1,223),(2,0,13),(12,1,255),(2,1,251),(2,0,17),(298,0,15033),(4,0,16765),(1,0,16523),(7,0,56),(46,15,32),(35,0,2),(819,25,52),(1866,47,96),(96,0,2),(2,0,21485),(1,0,7627),(1,0,21453),(3,0,2),(2,0,2),(2,0,2),(2,0,21559),(1,0,21497),(1,0,21565),(1,0,21563),(2,0,2),(3,0,2),(9,1,21629),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(9,0,2),(2,0,2),(5,0,2),(31054,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(20,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(136,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(4,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(11,0,2),(2,0,2),(2,0,70663),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(5,0,2),(2,0,84559),(3,0,2),(2,0,2),(4,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,84615),(1,0,84637),(1,0,84629),(1,0,84609),(1,0,84615),(2,0,84515),(1,0,84563),(1,0,84521),(1,0,1856),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,95),(1,0,84613),(1,0,70767),(1,0,2),(2,0,2),(2,0,84685),(1,0,2),(4,0,2),(6,0,2),(2,0,2),(2,0,2),(2,0,85121),(25,0,2),(22316,25,64),(1247,39,80),(176,35,80),(192,10,78),(12,14,78),(16,6,78),(8,1,78),(1772,50,128),(208,21,64),(2896,31,64),(21920,31,64),(31424,33,68)]+  [(65,25,64),(127,22,64),(24,6,64),(40,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,397),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,241),(1,0,2),(2,0,2),(2,0,2),(4,0,420),(1,0,2),(2,0,2),(2,0,412),(1,0,2),(2,1,410),(2,0,2),(3,0,158),(1,0,404),(1,0,406),(1,0,2),(2,0,410),(1,0,414),(2,0,422),(1,0,418),(1,0,2),(4,0,422),(1,0,426),(2,0,428),(1,0,2),(2,0,2),(2,0,2),(2,0,436),(1,0,2),(2,0,436),(3,0,2),(2,0,436),(1,0,2),(2,1,434),(2,0,2),(2,0,2),(2,0,438),(1,0,2),(4,0,2),(8,0,4),(1,0,2),(2,0,4),(1,0,2),(2,0,4),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,4),(1,0,2),(2,0,2),(2,0,193),(1,0,111),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,259),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(8,0,21590),(1,0,2),(2,0,325),(1,0,21584),(3,0,2),(2,0,389),(1,0,138),(1,0,142),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(290,0,2),(2,0,2),(4,0,2),(9,0,232),(7,0,76),(2,2,74),(4,0,128),(2,1,126),(3,16,64),(18,8,64),(44,0,16),(9,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(6,0,119),(3,0,2),(2,0,13),(1,0,2),(3,2,259),(3,15,160),(16,31,64),(80,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(10,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,30),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(3,37,96),(2927,37,14528),(39,0,14528),(6,0,14528),(723,79,77728),(80,5,16),(2201,0,2),(7,42,6015),(45,2,6015),(323,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(10,0,15229),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(10,7,15),(16,5,15),(16,7,15),(16,7,15),(16,5,15),(17,0,15),(2,0,15),(2,0,15),(2,0,15),(9,7,15),(32,7,15),(16,7,15),(16,7,15),(16,1,15),(2,1,147),(2,0,17),(12,3,171),(4,0,17),(12,1,15),(2,1,199),(14,1,15),(2,1,223),(2,0,13),(12,1,255),(2,1,251),(2,0,17),(298,0,15033),(4,0,16765),(1,0,16523),(7,0,56),(46,15,32),(35,0,2),(819,25,52),(1866,47,96),(96,0,2),(2,0,21485),(1,0,7627),(1,0,21453),(3,0,2),(2,0,2),(2,0,2),(2,0,21559),(1,0,21497),(1,0,21565),(1,0,21563),(2,0,2),(3,0,2),(9,1,21629),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(9,0,2),(2,0,2),(5,0,2),(31054,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(20,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(136,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(4,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(11,0,2),(2,0,2),(2,0,70663),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(5,0,2),(2,0,84559),(3,0,2),(2,0,2),(4,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,84615),(1,0,84637),(1,0,84629),(1,0,84609),(1,0,84615),(2,0,84515),(1,0,84563),(1,0,84521),(1,0,1856),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,95),(1,0,84613),(1,0,70767),(1,0,2),(2,0,2),(2,0,84685),(1,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,2),(2,0,85121),(25,0,2),(22316,25,64),(1247,39,80),(176,35,80),(192,10,78),(12,14,78),(16,6,78),(8,1,78),(1772,50,128),(208,21,64),(2896,31,64),(21920,31,64),(96,24,54),(31328,33,68)]
lib/Data/Complex.hs view
@@ -10,15 +10,31 @@   conjugate, ) where +import Control.Monad.Fix+import Control.Monad.Zip+import Data.Data import Data.Typeable+import Foreign.Ptr+import Foreign.Storable import Text.ParserCombinators.ReadPrec import Text.Read.Internal import qualified Text.Read.Lex as L  infix 6 :+ -data Complex a = !a :+ !a-  deriving (Typeable, Eq, Read, Show)+data Complex a+  = !a :+ !a    -- ^ forms a complex number from its real and imaginary+                -- rectangular components.+        deriving ( Eq+                 , Show+                 , Read+                 , Data+--                 , Generic+--                 , Generic1+                 , Functor+                 , Foldable+                 , Traversable+                 )  realPart :: forall a . Complex a -> a realPart (x :+ _) =  x@@ -139,3 +155,30 @@       , v <- sin (b/2)       , w <- -(2*v*v) = (u*w + u + w) :+ (u+1)*sin b       | otherwise = exp x - 1++instance Storable a => Storable (Complex a) where+    sizeOf a       = 2 * sizeOf (realPart a)+    alignment a    = alignment (realPart a)+    peek p           = do+                        let q = castPtr p+                        r <- peek q+                        i <- peekElemOff q 1+                        return (r :+ i)+    poke p (r :+ i)  = do+                        let q = castPtr p+                        poke q r+                        pokeElemOff q 1 i++instance Applicative Complex where+  pure a = a :+ a+  (f :+ g) <*> (a :+ b) = f a :+ g b+  liftA2 f (x :+ y) (a :+ b) = f x a :+ f y b++instance Monad Complex where+  (a :+ b) >>= f = realPart (f a) :+ imagPart (f b)++instance MonadZip Complex where+  mzipWith = liftA2++instance MonadFix Complex where+  mfix f = (let a :+ _ = f a in a) :+ (let _ :+ b = f b in b)
lib/Data/Double.hs view
@@ -1,6 +1,6 @@ -- Copyright 2025 Lennart Augustsson -- See LICENSE file for full license.-module Data.Double(Double) where+module Data.Double(Double, doubleToInt) where import qualified Prelude()              -- do not import Prelude import Primitives import Control.Error@@ -202,3 +202,6 @@  encodeFloat64 :: Integer -> Int -> Double encodeFloat64 mant expn = scaleFloat64 expn (fromInteger mant)++doubleToInt :: Double -> Int+doubleToInt = primDoubleToInt
lib/Data/Either.hs view
@@ -10,6 +10,7 @@ import Data.Function import Data.Functor import Data.Int.Int+import Data.List(foldr) import Data.Ord import {-# SOURCE #-} Data.Typeable import Text.Show@@ -46,3 +47,9 @@ instance Monad (Either a) where   Right b >>= k = k b   Left a  >>= _ = Left a++partitionEithers :: [Either a b] -> ([a],[b])+partitionEithers = foldr (either left right) ([],[])+ where+  left  a ~(l, r) = (a:l, r)+  right a ~(l, r) = (l, a:r)
lib/Data/Enum.hs view
@@ -15,10 +15,12 @@ import Data.Bounded import Data.Enum_Class import Data.Function+import Data.Functor import Data.Int.Int import Data.List import Data.Num import Data.Ord+import Data.Tuple  boundedEnumFrom :: forall a . (Enum a, Bounded a) => a -> [a] boundedEnumFrom n = map toEnum [fromEnum n .. fromEnum (maxBound `asTypeOf` n)]@@ -78,3 +80,25 @@     | otherwise       = error "Ord.toEnum: out of range"   enumFrom = boundedEnumFrom   enumFromThen = boundedEnumFromThen++-----------------------------------++instance Enum () where+  succ _      = error "Enum.().succ: bad argument"+  pred _      = error "Enum.().pred: bad argument"++  toEnum x+    | x `primIntEQ` 0    = ()+    | otherwise = error "Enum.().toEnum: bad argument"++  fromEnum () = 0+  enumFrom ()         = [()]+  enumFromThen () ()  = let many = ():many in many+  enumFromTo () ()    = [()]+  enumFromThenTo () () () = let many = ():many in many++instance (Enum a) => Enum (Solo a) where+  succ = fmap succ+  pred = fmap pred+  toEnum = MkSolo . toEnum+  fromEnum (MkSolo x) = fromEnum x
lib/Data/Float.hs view
@@ -1,12 +1,13 @@ -- Copyright 2025 Lennart Augustsson -- See LICENSE file for full license.-module Data.Float(Float) where+module Data.Float(Float, floatToDouble, doubleToFloat) where import qualified Prelude()              -- do not import Prelude import Primitives import Control.Error import Data.Bits.Base import Data.Bool import Data.Char+import Data.Double(Double) import Data.Enum import Data.Eq import Data.Floating@@ -197,3 +198,9 @@  encodeFloat32 :: Integer -> Int -> Float encodeFloat32 mant expn = scaleFloat32 expn (fromInteger mant)++floatToDouble :: Float -> Double+floatToDouble = primFloatToDouble++doubleToFloat :: Double -> Float+doubleToFloat = primDoubleToFloat
lib/Data/Foldable.hs view
@@ -47,6 +47,7 @@ import Control.Error import Control.Monad(Monad(..), MonadPlus(..)) import Data.Bool+import Data.Coerce import Data.Either import Data.Eq import Data.Foldable.Internal@@ -61,6 +62,7 @@ import Data.Num import Data.Ord import Data.Proxy+import Data.Tuple (Solo(..)) import {-# SOURCE #-} Data.Typeable  infix  4 `elem`, `notElem`@@ -176,40 +178,16 @@      null             = isLeft -instance Foldable Proxy where-  foldMap _ _ = mempty- instance Foldable Identity where   foldMap f (Identity a) = f a  instance Foldable (Const m) where   foldMap _ _ = mempty -{- -- | @since 4.15 deriving instance Foldable Solo  -- | @since 4.7.0.0-instance Foldable ((,) a) where-    foldMap f (_, y) = f y--    foldr f z (_, y) = f y z-    length _  = 1-    null _ = False---- | @since 4.8.0.0-instance Foldable (Array i) where-    foldr = foldrElems-    foldl = foldlElems-    foldl' = foldlElems'-    foldr' = foldrElems'-    foldl1 = foldl1Elems-    foldr1 = foldr1Elems-    toList = elems-    length = numElements-    null a = numElements a == 0---- | @since 4.7.0.0 instance Foldable Proxy where     foldMap _ _ = mempty     {-# INLINE foldMap #-}@@ -300,74 +278,9 @@ instance (Foldable f) => Foldable (Ap f) where     foldMap f = foldMap f . getAp -instance Foldable (Arg a) where-  foldMap f (Arg _ a) = f a---- Instances for GHC.Generics--- | @since 4.9.0.0-instance Foldable U1 where-    foldMap _ _ = mempty-    {-# INLINE foldMap #-}-    fold _ = mempty-    {-# INLINE fold #-}-    foldr _ z _ = z-    {-# INLINE foldr #-}-    foldl _ z _ = z-    {-# INLINE foldl #-}-    foldl1 _ _ = error "foldl1: U1"-    foldr1 _ _ = error "foldr1: U1"-    length _   = 0-    null _     = True-    elem _ _   = False-    sum _      = 0-    product _  = 1---- | @since 4.9.0.0-deriving instance Foldable V1---- | @since 4.9.0.0-deriving instance Foldable Par1---- | @since 4.9.0.0-deriving instance Foldable f => Foldable (Rec1 f)---- | @since 4.9.0.0-deriving instance Foldable (K1 i c)---- | @since 4.9.0.0-deriving instance Foldable f => Foldable (M1 i c f)---- | @since 4.9.0.0-deriving instance (Foldable f, Foldable g) => Foldable (f :+: g)---- | @since 4.9.0.0-deriving instance (Foldable f, Foldable g) => Foldable (f :*: g)---- | @since 4.9.0.0-deriving instance (Foldable f, Foldable g) => Foldable (f :.: g)---- | @since 4.9.0.0-deriving instance Foldable UAddr---- | @since 4.9.0.0-deriving instance Foldable UChar---- | @since 4.9.0.0-deriving instance Foldable UDouble---- | @since 4.9.0.0-deriving instance Foldable UFloat---- | @since 4.9.0.0-deriving instance Foldable UInt---- | @since 4.9.0.0-deriving instance Foldable UWord- -- Instances for Data.Ord -- | @since 4.12.0.0 deriving instance Foldable Down--}  foldrM :: forall (t :: Type -> Type) (m :: Type -> Type) a b . (Foldable t, Monad m) => (a -> b -> m b) -> b -> t a -> m b foldrM f z0 xs = foldl c return xs z0
lib/Data/Foldable1.hs view
@@ -53,7 +53,7 @@ import qualified Data.Functor.Sum     as Functor  -- coerce---import GHC.Internal.Data.Coerce (Coercible, coerce)+import Data.Coerce (coerce)  -- $setup -- >>> import Prelude hiding (foldr1, foldl1, head, last, minimum, maximum)@@ -433,7 +433,6 @@     head = NE.head     last = NE.last -{- -- | @since 4.18.0.0 instance Foldable1 Down where     foldMap1 = coerce@@ -459,6 +458,7 @@     head (MkSolo x) = x     last (MkSolo x) = x +{- -- | @since 4.18.0.0 instance Foldable1 ((,) a) where     foldMap1 f (_, y) = f y@@ -473,7 +473,6 @@ -- Monoid / Semigroup instances ------------------------------------------------------------------------------- -{- -- | @since 4.18.0.0 instance Foldable1 Dual where     foldMap1 = coerce@@ -486,6 +485,7 @@ instance Foldable1 Product where     foldMap1 = coerce +{- -- | @since 4.18.0.0 instance Foldable1 Min where     foldMap1 = coerce@@ -513,7 +513,6 @@ -- Extra instances ------------------------------------------------------------------------------- -{- -- | @since 4.18.0.0 instance Foldable1 Identity where     foldMap1      = coerce@@ -529,7 +528,6 @@     head    = coerce     minimum = coerce     maximum = coerce--}  -- | It would be enough for either half of a product to be 'Foldable1'. -- Other could be 'Foldable'.
lib/Data/Fractional.hs view
@@ -18,6 +18,7 @@   fromRational :: Rational -> a    recip x = 1 / x+  x / y = x * recip y  infixr 8 ^^ (^^) :: forall a b . (Fractional a, Integral b, Ord b) => a -> b -> a
lib/Data/Functor.hs view
@@ -18,6 +18,9 @@   (<$) :: forall a b . a -> f b -> f a   (<$) =  fmap . const +instance Functor ((->) a) where+  fmap = (.)+ infixl 4 <$> (<$>) :: forall f a b . Functor f => (a -> b) -> f a -> f b (<$>) = fmap
lib/Data/Functor/Classes.hs view
@@ -29,6 +29,8 @@ import Data.Complex (Complex((:+))) import Data.Tuple (Solo (..)) +import GHC.Generics+ import Text.Read import Text.Read.Internal import Text.Show (showListWith)@@ -358,7 +360,6 @@ instance (Show a, Show b, Show c) => Show1 ((,,,) a b c) where     liftShowsPrec = liftShowsPrec2 showsPrec showList -{- instance (Generic1 f, Eq1 (Rep1 f)) => Eq1 (Generically1 f) where   liftEq :: (a1 -> a2 -> Bool) -> (Generically1 f a1 -> Generically1 f a2 -> Bool)   liftEq (===) (Generically1 as1) (Generically1 as2) = liftEq (===) (from1 as1) (from1 as2)@@ -366,7 +367,6 @@ instance (Generic1 f, Ord1 (Rep1 f)) => Ord1 (Generically1 f) where   liftCompare :: (a1 -> a2 -> Ordering) -> (Generically1 f a1 -> Generically1 f a2 -> Ordering)   liftCompare cmp (Generically1 as1) (Generically1 as2) = liftCompare cmp (from1 as1) (from1 as2)--}  instance Eq2 Either where     liftEq2 e1 _ (Left x) (Left y) = e1 x y
lib/Data/Functor/Contravariant.hs view
@@ -23,10 +23,8 @@   -- * Operators   , (>$<), (>$$<), ($<) -{-   -- * Predicates   , Predicate(..)--}    -- * Comparisons   , Comparison(..)@@ -40,21 +38,19 @@   -- * Dual arrows   , Op(..)   ) where+import Prelude hiding ((.), id)  import Control.Applicative import Control.Category import Control.Monad import Data.Function (on)- import Data.Functor import Data.Functor.Product import Data.Functor.Sum import Data.Functor.Compose- import Data.Monoid.Internal (Alt(..), All(..)) import Data.Proxy--import Prelude hiding ((.), id)+import GHC.Generics  -- | The class of contravariant functors. --@@ -128,7 +124,6 @@ (>$$<) :: Contravariant f => f b -> (a -> b) -> f a (>$$<) = flip contramap -{- deriving newtype instance Contravariant f => Contravariant (Alt f) deriving newtype instance Contravariant f => Contravariant (Rec1 f) deriving newtype instance Contravariant f => Contravariant (M1 i c f)@@ -157,7 +152,6 @@   contramap :: (a' -> a) -> ((f :+: g) a -> (f :+: g) a')   contramap f (L1 xs) = L1 (contramap f xs)   contramap f (R1 ys) = R1 (contramap f ys)--}  instance (Contravariant f, Contravariant g) => Contravariant (Sum f g) where   contramap :: (a' -> a) -> (Sum f g a -> Sum f g a')@@ -181,7 +175,6 @@   contramap :: (a' -> a) -> (Proxy a -> Proxy a')   contramap _ _ = Proxy -{- newtype Predicate a = Predicate { getPredicate :: a -> Bool }   deriving     ( -- | @('<>')@ on predicates uses logical conjunction @('&&')@ on@@ -203,7 +196,6 @@       Monoid     )   via a -> All-   deriving     ( -- | A 'Predicate' is a 'Contravariant' 'Functor', because       -- 'contramap' can apply its function argument to the input of@@ -219,7 +211,6 @@       Contravariant     )   via Op Bool--}  -- | Defines a total ordering on a type as per 'compare'. --
lib/Data/Hashable/Class.hs view
@@ -11,6 +11,7 @@ import Data.Hashable import Data.List import qualified Data.List.NonEmpty as NE+import Data.Proxy  class (Eq1 t {-, forall a. Hashable a => Hashable (t a)-}) => Hashable1 t where     liftHashWithSalt :: (Int -> a -> Int) -> Int -> t a -> Int
lib/Data/IORef.hs view
@@ -46,9 +46,11 @@ 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)+atomicModifyIORef' r f = atomicModifyIORef r f' `primBind` \ b -> b `primSeq` primReturn b+  where f' a =+          case f a of+            v@(a', _) -> a' `primSeq` v  atomicWriteIORef :: forall a . IORef a -> a -> IO () atomicWriteIORef = writeIORef
lib/Data/Int/Int.hs view
@@ -1,6 +1,6 @@ -- Copyright 2023 Lennart Augustsson -- See LICENSE file for full license.-module Data.Int.Int(Int) where+module Data.Int.Int(Int, module Data.Int.Int) where import qualified Prelude()              -- do not import Prelude import Primitives import Data.Bool_Type
lib/Data/Int/Int16.hs view
@@ -23,24 +23,35 @@ import Text.Show  newtype Int16 = I16 Int-  deriving (Typeable, Eq, Ord)+  deriving (Eq, Ord)  unI16 :: Int16 -> Int unI16 (I16 x) = x --- Do sign extension by shifting.+-- Do sign extension by shifting, check for overflow/underflow i16 :: Int -> Int16-i16 w = I16 ((w `primIntShl` n) `primIntShr` n)+i16 w = if n == 0 then I16 w else+        if w' == w then I16 w' else _overflowError   where n = _wordSize `primIntSub` 16+        w' = (w `primIntShl` n) `primIntShr` n +-- Do sign extension by shifting, no checks+ui16 :: Int -> Int16+ui16 w = if n == 0 then I16 w else I16 w'+  where n = _wordSize `primIntSub` 16+        w' = (w `primIntShl` n) `primIntShr` n+ bin16 :: (Int -> Int -> Int) -> (Int16 -> Int16 -> Int16) bin16 op (I16 x) (I16 y) = i16 (x `op` y) +ubin16 :: (Int -> Int -> Int) -> (Int16 -> Int16 -> Int16)+ubin16 op (I16 x) (I16 y) = ui16 (x `op` y)+ bini16 :: (Int -> Int -> Int) -> (Int16 -> Int -> Int16)-bini16 op (I16 x) y = i16 (x `op` y)+bini16 op (I16 x) y = ui16 (x `op` y)  una16 :: (Int -> Int) -> (Int16 -> Int16)-una16 op (I16 x) = i16 (op x)+una16 op (I16 x) = ui16 (op x)  instance Num Int16 where   (+)  = bin16 primIntAdd@@ -56,14 +67,14 @@   toInteger = _intToInteger . unI16  instance Bounded Int16 where-  minBound = i16 0x8000-  maxBound = i16 0x7fff+  minBound = -maxBound - 1+  maxBound = 0x7fff  instance Real Int16 where   toRational = _integerToRational . _intToInteger . unI16  instance Show Int16 where-  showsPrec = showIntegral+  showsPrec = showSignedInt  {- in Text.Read.Internal instance Read Int16 where@@ -71,8 +82,8 @@ -}  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+  succ x = x + 1  -- overflow handled by ++  pred x = x - 1  -- overflow handled by -   toEnum = i16   fromEnum = unI16   enumFrom n = enumFromTo n maxBound@@ -83,9 +94,9 @@   enumFromThenTo = coerce (enumFromThenTo @Int)  instance Bits Int16 where-  (.&.) = bin16 primIntAnd-  (.|.) = bin16 primIntOr-  xor   = bin16 primIntXor+  (.&.) = ubin16 primIntAnd+  (.|.) = ubin16 primIntOr+  xor   = ubin16 primIntXor   complement = una16 primIntInv   x `shiftL` i     | i < 0 = _overflowError@@ -101,11 +112,11 @@   bitSize _ = 16   bit = bitDefault   testBit = testBitDefault-  popCount (I16 x) = primIntPopcount (x .&. 0xffff)+  popCount (I16 x) = primWordPopcount (primIntToWord x `primWordAnd` (0xffff::Word))   zeroBits = 0   isSigned _ = True  instance FiniteBits Int16 where   finiteBitSize _ = 16-  countLeadingZeros (I16 x) = primIntClz (x .&. 0xffff) - (_wordSize - 16)+  countLeadingZeros (I16 x) = primWordClz (primIntToWord x `primWordAnd` (0xffff::Word)) - (_wordSize - 16)   countTrailingZeros (I16 x) = if x == 0 then 16 else primIntCtz x
lib/Data/Int/Int32.hs view
@@ -23,24 +23,35 @@ import Text.Show  newtype Int32 = I32 Int-  deriving (Typeable, Eq, Ord)+  deriving (Eq, Ord)  unI32 :: Int32 -> Int unI32 (I32 x) = x --- Do sign extension by shifting.+-- Do sign extension by shifting, check for overflow/underflow i32 :: Int -> Int32-i32 w = if n == 0 then I32 w else I32 ((w `primIntShl` n) `primIntShr` n)+i32 w = if n == 0 then I32 w else+        if w' == w then I32 w' else _overflowError   where n = _wordSize `primIntSub` 32+        w' = (w `primIntShl` n) `primIntShr` n +-- Do sign extension by shifting, no checks+ui32 :: Int -> Int32+ui32 w = if n == 0 then I32 w else I32 w'+  where n = _wordSize `primIntSub` 32+        w' = (w `primIntShl` n) `primIntShr` n+ bin32 :: (Int -> Int -> Int) -> (Int32 -> Int32 -> Int32) bin32 op (I32 x) (I32 y) = i32 (x `op` y) +ubin32 :: (Int -> Int -> Int) -> (Int32 -> Int32 -> Int32)+ubin32 op (I32 x) (I32 y) = ui32 (x `op` y)+ bini32 :: (Int -> Int -> Int) -> (Int32 -> Int -> Int32)-bini32 op (I32 x) y = i32 (x `op` y)+bini32 op (I32 x) y = ui32 (x `op` y)  una32 :: (Int -> Int) -> (Int32 -> Int32)-una32 op (I32 x) = i32 (op x)+una32 op (I32 x) = ui32 (op x)  instance Num Int32 where   (+)  = bin32 primIntAdd@@ -56,14 +67,14 @@   toInteger = _intToInteger . unI32  instance Bounded Int32 where-  minBound = i32 0x80000000-  maxBound = i32 0x7fffffff+  minBound = -maxBound - 1+  maxBound = 0x7fffffff  instance Real Int32 where   toRational = _integerToRational . _intToInteger . unI32  instance Show Int32 where-  showsPrec = showIntegral+  showsPrec = showSignedInt  {- in Text.Read.Internal instance Read Int32 where@@ -71,8 +82,8 @@ -}  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+  succ x = x + 1  -- overflow handled by ++  pred x = x - 1  -- overflow handled by -   toEnum = i32   fromEnum = unI32   enumFrom n = enumFromTo n maxBound@@ -83,9 +94,9 @@   enumFromThenTo = coerce (enumFromThenTo @Int)  instance Bits Int32 where-  (.&.) = bin32 primIntAnd-  (.|.) = bin32 primIntOr-  xor   = bin32 primIntXor+  (.&.) = ubin32 primIntAnd+  (.|.) = ubin32 primIntOr+  xor   = ubin32 primIntXor   complement = una32 primIntInv   x `shiftL` i     | i < 0 = _overflowError@@ -101,11 +112,11 @@   bitSize _ = 32   bit = bitDefault   testBit = testBitDefault-  popCount (I32 x) = primIntPopcount (x .&. 0xffffffff)+  popCount (I32 x) = primWordPopcount (primIntToWord x `primWordAnd` (0xffffffff::Word))   zeroBits = 0   isSigned _ = True  instance FiniteBits Int32 where   finiteBitSize _ = 32-  countLeadingZeros (I32 x) = primIntClz (x .&. 0xffffffff) - (_wordSize - 32)+  countLeadingZeros (I32 x) = primWordClz (primIntToWord x `primWordAnd` (0xffffffff::Word)) - (_wordSize - 32)   countTrailingZeros (I32 x) = if x == 0 then 32 else primIntCtz x
lib/Data/Int/Int64.hs view
@@ -58,7 +58,7 @@   (>=) = primInt64GE  instance Show Int64 where-  showsPrec = showIntegral+  showsPrec = showSignedInt  {- in Text.Read.Internal instance Read Int32 where@@ -66,8 +66,8 @@ -}  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+  succ x =  x + 1+  pred x =  x - 1   toEnum = primIntToInt64   fromEnum = primInt64ToInt   enumFrom = numericEnumFrom
lib/Data/Int/Int8.hs view
@@ -23,24 +23,35 @@ import Text.Show  newtype Int8 = I8 Int-  deriving (Typeable, Eq, Ord)+  deriving (Eq, Ord)  unI8 :: Int8 -> Int unI8 (I8 x) = x --- Do sign extension by shifting.+-- Do sign extension by shifting, check for overflow/underflow i8 :: Int -> Int8-i8 w = I8 ((w `primIntShl` n) `primIntShr` n)+i8 w = if n == 0 then I8 w else+        if w' == w then I8 w' else _overflowError   where n = _wordSize `primIntSub` 8+        w' = (w `primIntShl` n) `primIntShr` n +-- Do sign extension by shifting, no checks+ui8 :: Int -> Int8+ui8 w = if n == 0 then I8 w else I8 w'+  where n = _wordSize `primIntSub` 8+        w' = (w `primIntShl` n) `primIntShr` n+ bin8 :: (Int -> Int -> Int) -> (Int8 -> Int8 -> Int8) bin8 op (I8 x) (I8 y) = i8 (x `op` y) +ubin8 :: (Int -> Int -> Int) -> (Int8 -> Int8 -> Int8)+ubin8 op (I8 x) (I8 y) = ui8 (x `op` y)+ bini8 :: (Int -> Int -> Int) -> (Int8 -> Int -> Int8)-bini8 op (I8 x) y = i8 (x `op` y)+bini8 op (I8 x) y = ui8 (x `op` y)  una8 :: (Int -> Int) -> (Int8 -> Int8)-una8 op (I8 x) = i8 (op x)+una8 op (I8 x) = ui8 (op x)  instance Num Int8 where   (+)  = bin8 primIntAdd@@ -56,14 +67,14 @@   toInteger = _intToInteger . unI8  instance Bounded Int8 where-  minBound = i8 0x80-  maxBound = i8 0x7f+  minBound = -maxBound - 1+  maxBound = 0x7f  instance Real Int8 where   toRational = _integerToRational . _intToInteger . unI8  instance Show Int8 where-  showsPrec = showIntegral+  showsPrec = showSignedInt  {- in Text.Read.Internal instance Read Int8 where@@ -71,8 +82,8 @@ -}  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+  succ x = x + 1  -- overflow handled by ++  pred x = x - 1  -- overflow handled by -   toEnum = i8   fromEnum = unI8   enumFrom n = enumFromTo n maxBound@@ -83,9 +94,9 @@   enumFromThenTo = coerce (enumFromThenTo @Int)  instance Bits Int8 where-  (.&.) = bin8 primIntAnd-  (.|.) = bin8 primIntOr-  xor   = bin8 primIntXor+  (.&.) = ubin8 primIntAnd+  (.|.) = ubin8 primIntOr+  xor   = ubin8 primIntXor   complement = una8 primIntInv   x `shiftL` i     | i < 0 = _overflowError@@ -101,11 +112,11 @@   bitSize _ = 8   bit = bitDefault   testBit = testBitDefault-  popCount (I8 x) = primIntPopcount (x .&. 0xff)+  popCount (I8 x) = primWordPopcount (primIntToWord x `primWordAnd` (0xff::Word))   zeroBits = 0   isSigned _ = True  instance FiniteBits Int8 where   finiteBitSize _ = 8-  countLeadingZeros (I8 x) = primIntClz (x .&. 0xff) - (_wordSize - 8)+  countLeadingZeros (I8 x) = primWordClz (primIntToWord x `primWordAnd` (0xff::Word)) - (_wordSize - 8)   countTrailingZeros (I8 x) = if x == 0 then 8 else primIntCtz x
lib/Data/Integer.hs view
@@ -37,7 +37,7 @@   (>=) = geI  instance Show Integer where-  showsPrec = showIntegral+  showsPrec = showSignedInt  {- in Text.Read.Internal instance Read Integer
lib/Data/Integer_Type.hs view
@@ -25,7 +25,7 @@ maxD = 1 `primWordShl` shiftD  shiftD :: Int-shiftD = _wordSize `primIntShr` 1 -- this is used so multiplication of two digits doesn't overflow a Word+shiftD = {-_wordSize-} 32 `primIntShr` 1 -- this is used so multiplication of two digits doesn't overflow a Word  quotMaxD :: Digit -> Digit quotMaxD d = d `primWordShr` shiftD@@ -39,7 +39,7 @@ _intToInteger i   | i `primIntEQ` 0 = I Plus []   | i `primIntGE` 0 = f Plus (primIntToWord i)-  | True            = f Minus (primIntToWord (0 `primIntSub` i))+  | True            = f Minus (primWordNeg (primIntToWord i))   where     f sign i =       let@@ -65,11 +65,16 @@     Plus  -> i     Minus -> 0 `primWordSub` i   where+    xadd = primWordAdd+    xmul x = primWordShl x shiftD     i =       case ds of-        []          -> 0 :: Word-        [d1]        -> d1-        d1 : d2 : _ -> d1 `primWordAdd` (d2 `primWordShl` shiftD)+        []            -> 0 :: Word+        [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  _integerToWord64 :: Integer -> Word64 _integerToWord64 (I sign ds) =@@ -104,7 +109,7 @@   | i `primInt64EQ` 0 = I Plus []   | i `primInt64GE` 0 = _word64ToInteger (primInt64ToWord64 i)   | True              = I Minus ds-    where I _ ds = _word64ToInteger (primInt64ToWord64 (0 `primInt64Sub` i))+    where I _ ds = _word64ToInteger (primWord64Neg (primInt64ToWord64 i))  _integerToFloat :: Integer -> Float _integerToFloat (I sign ds) = sgn (loop ds)
lib/Data/Monoid.hs view
@@ -9,17 +9,37 @@   Alt(..),   First(..),   Last(..),+  Ap(..),   ) where import qualified Prelude()+import Control.Applicative+import Control.Monad+import Control.Monad.Fail+import Data.Bounded+import Data.Coerce -- needed for deriving+import Data.Enum_Class+import Data.Eq+import Data.Function -- needed for deriving+import Data.Functor import Data.Maybe_Type import Data.Monoid.Internal+import Data.Num+import Data.Ord import Data.Records import {-# SOURCE #-} Data.Typeable+import Text.Show  -- First and Last are different in Monoid and Semigroup, -- so put them here.  newtype First a = First { getFirst :: Maybe a }+        deriving ( Eq+                 , Ord+                 , Show+                 , Functor+                 , Applicative+                 , Monad+                 )  instance Semigroup (First a) where   a@(First (Just _)) <> _ = a@@ -30,6 +50,13 @@   newtype Last a = Last { getLast :: Maybe a }+        deriving ( Eq+                 , Ord+                 , Show+                 , Functor+                 , Applicative+                 , Monad+                 )  instance Semigroup (Last a) where   _ <> a@(Last (Just _)) = a@@ -37,3 +64,34 @@  instance Monoid (Last a) where   mempty = Last Nothing++newtype Ap f a = Ap { getAp :: f a }+        deriving ( Alternative+                 , Applicative+                 , Enum+                 , Eq+                 , Functor+                 , Monad+                 , MonadFail+                 , MonadPlus+                 , Ord+                 , Show+                 )++instance (Applicative f, Semigroup a) => Semigroup (Ap f a) where+  Ap x <> Ap y = Ap (liftA2 (<>) x y)++instance (Applicative f, Monoid a) => Monoid (Ap f a) where+  mempty = Ap (pure mempty)++instance (Applicative f, Bounded a) => Bounded (Ap f a) where+  minBound = pure minBound+  maxBound = pure maxBound++instance (Applicative f, Num a) => Num (Ap f a) where+  (+)         = liftA2 (+)+  (*)         = liftA2 (*)+  negate      = fmap negate+  fromInteger = pure . fromInteger+  abs         = fmap abs+  signum      = fmap signum
lib/Data/Monoid/Internal.hs view
@@ -16,6 +16,7 @@ import Data.Ord import Data.Maybe_Type import Data.Num+import Data.Proxy import Data.Records import {-# SOURCE #-} Data.Typeable import Text.Show@@ -30,6 +31,17 @@  --------------------- +instance Semigroup (Proxy s) where+  _ <> _ = Proxy+  sconcat _ = Proxy+  stimes _ _ = Proxy++instance Monoid (Proxy s) where+  mempty = Proxy+  mconcat _ = Proxy++---------------------+ instance (Monoid b) => Monoid (a -> b) where   mempty _ = mempty @@ -40,10 +52,10 @@  newtype Endo a = Endo { appEndo :: a -> a } -instance forall a . Semigroup (Endo a) where+instance Semigroup (Endo a) where   Endo f <> Endo g = Endo (f . g) -instance forall a . Monoid (Endo a) where+instance Monoid (Endo a) where   mempty = Endo id  ---------------------@@ -51,64 +63,92 @@ newtype Dual a = Dual { getDual :: a }   deriving (Bounded, Eq, Ord, Show) -instance forall a . Semigroup a => Semigroup (Dual a) where+instance Semigroup a => Semigroup (Dual a) where   Dual a <> Dual b = Dual (b <> a) -instance forall a . Monoid a => Monoid (Dual a) where+instance Monoid a => Monoid (Dual a) where   mempty = Dual mempty  instance Functor Dual where-  fmap f (Dual a) = Dual (f a)+  fmap = coerce  instance Applicative Dual where   pure = Dual-  Dual f <*> Dual b = Dual (f b)+  (<*>) = coerce  ---------------------  newtype Max a = Max { getMax :: a }   deriving (Bounded, Eq, Ord, Show) -instance forall a . Ord a => Semigroup (Max a) where+instance Ord a => Semigroup (Max a) where   Max a <> Max b = Max (a `max` b)   stimes = stimesIdempotent -instance forall a . (Ord a, Bounded a) => Monoid (Max a) where+instance (Ord a, Bounded a) => Monoid (Max a) where   mempty = Max minBound +instance Functor Max where+  fmap = coerce++instance Applicative Max where+  pure = Max+  (<*>) = coerce+ ---------------------  newtype Min a = Min { getMin :: a }   deriving (Bounded, Eq, Ord, Show) -instance forall a . Ord a => Semigroup (Min a) where+instance Ord a => Semigroup (Min a) where   Min a <> Min b = Min (a `min` b)   stimes = stimesIdempotent -instance forall a . (Ord a, Bounded a) => Monoid (Min a) where+instance (Ord a, Bounded a) => Monoid (Min a) where   mempty = Min maxBound +instance Functor Min where+  fmap = coerce++instance Applicative Min where+  pure = Min+  (<*>) = coerce+ ---------------------  newtype Sum a = Sum { getSum :: a }   deriving (Bounded, Eq, Ord, Show, Num) -instance forall a . Num a => Semigroup (Sum a) where+instance Num a => Semigroup (Sum a) where   Sum a <> Sum b = Sum (a + b) -instance forall a . (Num a) => Monoid (Sum a) where+instance (Num a) => Monoid (Sum a) where   mempty = Sum 0 +instance Functor Sum where+  fmap = coerce++instance Applicative Sum where+  pure = Sum+  (<*>) = coerce+ ---------------------  newtype Product a = Product { getProduct :: a }   deriving (Bounded, Eq, Ord, Show, Num) -instance forall a . Num a => Semigroup (Product a) where+instance Num a => Semigroup (Product a) where   Product a <> Product b = Product (a * b) -instance forall a . (Num a) => Monoid (Product a) where+instance (Num a) => Monoid (Product a) where   mempty = Product 1++instance Functor Product where+  fmap = coerce++instance Applicative Product where+  pure = Product+  (<*>) = coerce  --------------------- 
lib/Data/Num.hs view
@@ -18,6 +18,7 @@   signum :: a -> a   fromInteger :: Integer -> a   negate x = 0 - x+  x - y = x + negate y  subtract :: forall a . Num a => a -> a -> a subtract x y = y - x
lib/Data/Ord.hs view
@@ -84,14 +84,3 @@  instance Functor Down where     fmap f (Down a) = Down (f a)--{---- | @since 4.11.0.0-instance Applicative Down where-    pure = Down-    (<*>) = coerce---- | @since 4.11.0.0-instance Monad Down where-    Down a >>= k = k a--}
lib/Data/RealFloat.hs view
@@ -9,11 +9,12 @@ import Data.Fractional import Data.Int.Int import Data.Integer+import Data.RealFrac import Data.Num import Data.Ord import {-# SOURCE #-} Data.Typeable -class (Fractional a, Ord a, Floating a) => RealFloat a  where+class (RealFrac a, Floating a) => RealFloat a  where   floatRadix          :: a -> Integer   floatDigits         :: a -> Int   floatRange          :: a -> (Int,Int)
lib/Data/RealFrac.hs view
@@ -8,7 +8,7 @@ import Data.Real import {-# SOURCE #-} Data.Typeable -class  (Ord a, Real a, Fractional a) => RealFrac a  where+class  (Real a, Fractional a) => RealFrac a  where   properFraction :: (Integral b) => a -> (b,a)   truncate       :: (Integral b) => a -> b   round          :: (Integral b) => a -> b
+ lib/Data/STRef/Lazy.hs view
@@ -0,0 +1,36 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Data.STRef.Lazy+-- Copyright   :  (c) The University of Glasgow 2001+-- License     :  BSD-style (see the file libraries/base/LICENSE)+--+-- Maintainer  :  libraries@haskell.org+-- Stability   :  stable+-- Portability :  non-portable (uses Control.Monad.ST.Lazy)+--+-- Mutable references in the lazy ST monad.+--+-----------------------------------------------------------------------------++module Data.STRef.Lazy (+        -- * STRefs+        ST.STRef,       -- abstract+        newSTRef,+        readSTRef,+        writeSTRef,+        modifySTRef+ ) where++import qualified Prelude (); import MiniPrelude+import Control.Monad.ST.Lazy+import qualified Data.STRef as ST++newSTRef    :: a -> ST s (ST.STRef s a)+readSTRef   :: ST.STRef s a -> ST s a+writeSTRef  :: ST.STRef s a -> a -> ST s ()+modifySTRef :: ST.STRef s a -> (a -> a) -> ST s ()++newSTRef        = strictToLazyST . ST.newSTRef+readSTRef       = strictToLazyST . ST.readSTRef+writeSTRef  r a = strictToLazyST (ST.writeSTRef r a)+modifySTRef r f = strictToLazyST (ST.modifySTRef r f)
+ lib/Data/STRef/Strict.hs view
@@ -0,0 +1,3 @@+module Data.STRef.Strict (module Data.STRef) where++import Data.STRef
lib/Data/Semigroup.hs view
@@ -177,3 +177,9 @@   enumFromTo (WrapMonoid a) (WrapMonoid b) = WrapMonoid `fmap` enumFromTo a b   enumFromThenTo (WrapMonoid a) (WrapMonoid b) (WrapMonoid c) =       WrapMonoid `fmap` enumFromThenTo a b c++instance Foldable (Arg a) where+  foldMap f (Arg _ a) = f a++instance Traversable (Arg a) where+  traverse f (Arg x a) = Arg x `fmap` f a
lib/Data/Text.hs view
@@ -1,5 +1,6 @@ module Data.Text(   Text,+  StrictText,   pack, unpack,   show,   empty,@@ -16,6 +17,9 @@   splitOn,   dropWhileEnd,   words,+  unwords,+  toLower,+  toUpper,   foldr,   concat,   lines,@@ -29,19 +33,25 @@   isPrefixOf,   isSuffixOf,   isInfixOf,+  replace,   map,+  dropAround,+  strip,+  stripStart,+  stripEnd,+  stripPrefix,+  stripSuffix,   ) where-import qualified Prelude(); import MiniPrelude hiding(head, tail, null, length, words, map)-import Primitives(Ptr)+import qualified Prelude(); import MiniPrelude hiding(head, tail, null, length, words, unwords, map) import Control.DeepSeq.Class+import qualified Data.Char as C 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)+import Data.Text.Internal+import Text.Read.Internal -newtype Text = T BS.ByteString+type StrictText = Text  instance Eq Text where   (==) = cmp (==)@@ -59,6 +69,9 @@ cmp :: (BS.ByteString -> BS.ByteString -> Bool) -> (Text -> Text -> Bool) cmp op (T x) (T y) = op x y +instance Read Text where+  readsPrec p str = [(pack x, y) | (x, y) <- readsPrec p str]+ instance Show Text where   showsPrec p = showsPrec p . unpack @@ -135,6 +148,15 @@ words :: Text -> [Text] words = L.map pack . L.words . unpack +unwords :: [Text] -> Text+unwords = pack . L.unwords . L.map unpack++toLower :: Text -> Text+toLower = pack . L.map C.toLower . unpack++toUpper :: Text -> Text+toUpper = pack . L.map C.toUpper . unpack+ foldr :: (Char -> a -> a) -> a -> Text -> a foldr f z = L.foldr f z . unpack @@ -158,6 +180,9 @@ intercalate _ [x] = x intercalate s (x:xs) = x `append` s `append` intercalate s xs +replace :: Text -> Text -> Text -> Text+replace s r = intercalate r . splitOn s+ -- XXX Should make the BS version efficient and go via that isPrefixOf :: Text -> Text -> Bool isPrefixOf p s = L.isPrefixOf (unpack p) (unpack s)@@ -176,3 +201,21 @@  map :: (Char -> Char) -> Text -> Text map f = pack . L.map f . unpack++dropAround :: (Char -> Bool) -> Text -> Text+dropAround p = dropWhile p . dropWhileEnd p++stripStart :: Text -> Text+stripStart = dropWhile C.isSpace++stripEnd :: Text -> Text+stripEnd = dropWhileEnd C.isSpace++strip :: Text -> Text+strip = dropAround C.isSpace++stripPrefix :: Text -> Text -> Maybe Text+stripPrefix p t = pack <$> L.stripPrefix (unpack p) (unpack t)++stripSuffix :: Text -> Text -> Maybe Text+stripSuffix p t = pack <$> L.stripSuffix (unpack p) (unpack t)
lib/Data/Text/IO.hs view
@@ -21,27 +21,20 @@ import qualified Prelude as P import Control.Exception (evaluate) import qualified Data.ByteString as BS-import Data.Text+import Data.Text.Internal import Data.Text.Encoding-import System.IO.Base(Handle, IOMode(..), hClose, openFile, stdin, stdout)-import qualified System.IO.Base as IO+import System.IO.Base(Handle, IOMode(..), hClose, openBinaryFile, stdin, stdout, withBinaryFile)  readFile :: FilePath -> IO Text readFile f = do-  h <- openFile f ReadMode+  h <- openBinaryFile f ReadMode   hGetContents h  writeFile :: FilePath -> Text -> IO ()-writeFile f bs = do-  h <- openFile f WriteMode-  hPutStr h bs-  hClose h+writeFile f t = withBinaryFile f WriteMode $ \ h -> hPutStr h t  appendFile :: FilePath -> Text -> IO ()-appendFile f bs = do-  h <- openFile f AppendMode-  hPutStr h bs-  hClose h+appendFile f t = withBinaryFile f AppendMode $ \ h -> hPutStr h t  hGetContents :: Handle -> IO Text hGetContents h = do@@ -57,14 +50,10 @@   evaluate (decodeUtf8 bs)  hPutStr :: Handle -> Text -> IO ()-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)+hPutStr h (T bs) = BS.hPutStr h bs  hPutStrLn :: Handle -> Text -> IO ()-hPutStrLn h t = hPutStr h t >> hPutStr h (pack "\n")+hPutStrLn h t = hPutStr h t >> hPutStr h "\n"  interact :: (Text -> Text) -> IO () interact f = getContents >>= putStr . f
+ lib/Data/Text/Internal.hs view
@@ -0,0 +1,7 @@+module Data.Text.Internal (Text(..)) where++import qualified Prelude ()+import qualified Data.ByteString.Internal as BS+import Data.Typeable++newtype Text = T BS.ByteString
lib/Data/Text/Lazy.hs view
@@ -1,86 +1,362 @@-module Data.Text.Lazy(-  Text,-  toStrict, toLazy,-  pack, unpack,-  empty,-  singleton,-  append,-  null,-  length,-  head,-  tail,-  cons,-  snoc,-  uncons,-  replicate,-  splitOn,-  dropWhileEnd,-  map,-  concat,-  ) where+-- |+-- Module      : Data.Text.Lazy+-- Copyright   : (c) 2009, 2010, 2012 Bryan O'Sullivan+--+-- License     : BSD-style+-- Maintainer  : bos@serpentine.com+-- Portability : GHC+--+-- A time and space-efficient implementation of Unicode text using+-- lists of packed arrays.+--+-- /Note/: Read below the synopsis for important notes on the use of+-- this module.+--+-- The representation used by this module is suitable for high+-- performance use and for streaming large quantities of data.  It+-- provides a means to manipulate a large body of text without+-- requiring that the entire content be resident in memory.+--+-- Some operations, such as 'concat', 'append', 'reverse' and 'cons',+-- have better time complexity than their "Data.Text" equivalents, due+-- to the underlying representation being a list of chunks. For other+-- operations, lazy 'Text's are usually within a few percent of strict+-- ones, but often with better heap usage if used in a streaming+-- fashion. For data larger than available memory, or if you have+-- tight memory constraints, this module will be the only option.+--+-- This module is intended to be imported @qualified@, to avoid name+-- clashes with "Prelude" functions.  eg.+--+-- > import qualified Data.Text.Lazy as L++module Data.Text.Lazy+    (+    -- * Types+      Text+    , LazyText++    -- * Creation and elimination+    , pack+    , unpack+    , singleton+    , empty+    , fromChunks+    , toChunks+    , toStrict+    , fromStrict+    , foldrChunks+    , foldlChunks++    -- * Pattern matching+    , pattern Empty+    , pattern (:<)+    , pattern (:>)++    -- * Basic interface+    , cons+    , snoc+    , append+    , uncons+    , unsnoc+    , head+    , last+    , tail+    , init+    , null+    , length+    , compareLength++    , replicate+    , splitOn+    , dropWhileEnd+    , map+    , concat+    ) where import qualified Prelude(); import MiniPrelude hiding(head)+import Primitives import Control.DeepSeq.Class-import Data.Coerce-import Data.Monoid+import Data.Bounded+import qualified Data.ByteString.Internal as BS+import qualified Data.ByteString.Unsafe as BS+import Data.Data+import Data.Int.Int64+import qualified Data.List as L import Data.String import qualified Data.Text as T+import Data.Text.Internal+import Text.Read.Internal -newtype Text = L T.Text-  deriving newtype (Eq, Ord, Show, IsString, Semigroup, Monoid, NFData)+data Text = Empty | Chunk !T.Text Text -toStrict :: Text -> T.Text-toStrict (L t) = t+type LazyText = Text -toLazy :: T.Text -> Text-toLazy = L+instance Eq Text where+  (==) = equal -empty :: Text-empty = coerce T.empty+equal :: Text -> Text -> Bool+equal Empty Empty = True+equal Empty _     = False+equal _     Empty = False+equal (Chunk (T a) as) (Chunk (T b) bs) =+  let+    lenA = BS.length a+    lenB = BS.length b+  in case compare lenA lenB of+    LT -> a == BS.unsafeTake lenA b+          && as `equal` Chunk (T (BS.unsafeDrop lenA b)) bs+    EQ -> a == b+          && as `equal` bs+    GT -> BS.unsafeTake lenB a == b+          && Chunk (T (BS.unsafeDrop lenB a)) as `equal` bs -singleton :: Char -> Text-singleton = coerce T.singleton+instance Ord Text where+  compare = compareText +compareText :: Text -> Text -> Ordering+compareText Empty Empty = EQ+compareText Empty _     = LT+compareText _     Empty = GT+compareText (Chunk (T a) as) (Chunk (T b) bs) =+  let+    lenA = BS.length a+    lenB = BS.length b+  in case compare lenA lenB of+    LT -> case compare a (BS.unsafeTake lenA b) of+            EQ     -> compareText as (Chunk (T (BS.unsafeDrop lenA b)) bs)+            result -> result+    EQ -> case compare a b of+            EQ     -> compareText as bs+            result -> result+    GT -> case compare (BS.unsafeTake lenB a) b of+            EQ     -> compareText (Chunk (T (BS.unsafeDrop lenB a)) as) bs+            result -> result+-- This is not a mistake: on contrary to UTF-16 (https://github.com/haskell/text/pull/208),+-- lexicographic ordering of UTF-8 encoded strings matches lexicographic ordering+-- of underlying bytearrays, no decoding is needed.++instance Show Text where+  showsPrec p t = showsPrec p (unpack t)++instance Read Text where+  readsPrec p str = [(pack x, y) | (x, y) <- readsPrec p str]++instance Semigroup Text where+  (<>) = append+  stimes n _ | n < 0 = error "Data.Text.Lazy.stimes: given number is negative!"+  stimes n a =+    let nInt64 = fromIntegral n :: Int64+        len = if n == fromIntegral nInt64 && nInt64 >= 0 then nInt64 else maxBound+        -- We clamp the length to maxBound :: Int64.+        -- To tell the difference, the caller would have to skip through 2^63 chunks.+    in replicate len a++instance Monoid Text where+  mempty  = empty+  mappend = (<>)+  mconcat = concat++instance IsString Text where+  fromString = pack++instance NFData Text where+  rnf Empty        = ()+  rnf (Chunk _ ts) = rnf ts++{-+instance Binary Text where+  put t = do+    -- This needs to be in sync with the Binary instance for ByteString+    -- in the binary package.+    put (foldlChunks (\n c -> n + T.lengthWord8 c) 0 t)+    putBuilder (encodeUtf8Builder t)+  get   = do+    bs <- get+    case decodeUtf8' bs of+      Left exn -> fail (show exn)+      Right a -> return a+-}++instance Data Text where+  gfoldl f z txt = z pack `f` unpack txt+  toConstr _     = packConstr+  gunfold k z c  = case constrIndex c of+    1 -> k (z pack)+    _ -> error "Data.Text.Lazy.Text.gunfold"+  dataTypeOf _   = textDataType++packConstr :: Constr+packConstr = mkConstr textDataType "pack" [] Prefix++textDataType :: DataType+textDataType = mkDataType "Data.Text.Lazy.Text" [packConstr]+ pack :: String -> Text-pack = coerce T.pack+pack s = let (c, s') = L.splitAt defaultChunkSize s in Chunk (T.pack c) (pack s')  unpack :: Text -> String-unpack = coerce T.unpack+unpack = foldrChunks (\t s -> T.unpack t ++ s) "" -append :: Text -> Text -> Text-append = coerce T.append+singleton :: Char -> Text+singleton c = Chunk (T.singleton c) Empty -null :: Text -> Bool-null = coerce T.null+chunk :: T.Text -> Text -> Text+chunk t ts | T.null t = ts+           | otherwise = Chunk t ts -length :: Text -> Int-length = coerce T.length+empty :: Text+empty = Empty -head :: Text -> Char-head = coerce T.head+fromChunks :: [T.Text] -> Text+fromChunks = L.foldr chunk Empty -tail :: Text -> Text-tail = coerce T.tail+toChunks :: Text -> [T.Text]+toChunks = foldrChunks (:) [] +toStrict :: Text -> T.Text+toStrict t = T.concat (toChunks t)++fromStrict :: T.Text -> Text+fromStrict t = chunk t Empty++foldrChunks :: (T.Text -> a -> a) -> a -> Text -> a+foldrChunks f z = go+  where go Empty        = z+        go (Chunk c cs) = f c (go cs)++foldlChunks :: (a -> T.Text -> a) -> a -> Text -> a+foldlChunks f z = go z+  where go !a Empty        = a+        go !a (Chunk c cs) = go (f a c) cs++pattern (:<) :: Char -> Text -> Text+pattern x :< xs <- (uncons -> Just (x, xs)) where+  (:<) = cons+infixr 5 :<++pattern (:>) :: Text -> Char -> Text+pattern xs :> x <- (unsnoc -> Just (xs, x)) where+  (:>) = snoc+infixl 5 :>++-- -----------------------------------------------------------------------------+-- * Basic functions+ cons :: Char -> Text -> Text-cons = coerce T.cons+cons c t = Chunk (T.singleton c) t +infixr 5 `cons`+ snoc :: Text -> Char -> Text-snoc = coerce T.snoc+snoc t c = foldrChunks Chunk (singleton c) t +append :: Text -> Text -> Text+append xs ys = foldrChunks Chunk ys xs+ uncons :: Text -> Maybe (Char, Text)-uncons = coerce T.uncons+uncons Empty        = Nothing+uncons (Chunk t ts) = Just (T.head t, chunk (T.tail t) ts) -replicate :: Int -> Text -> Text-replicate n = coerce (T.replicate n)+head :: Text -> Char+head (Chunk t _) = T.head t+head Empty       = emptyError "head" +tail :: Text -> Text+tail (Chunk t ts) = chunk (T.tail t) ts+tail Empty        = emptyError "tail"++unsnoc :: Text -> Maybe (Text, Char)+unsnoc Empty          = Nothing+unsnoc ts@(Chunk _ _) = Just (init ts, last ts)++last :: Text -> Char+last = L.last . unpack+{-+last (Chunk t ts) = go t ts+    where go _ (Chunk t' ts') = go t' ts'+          go t' Empty         = T.last t'+last Empty = emptyError "last"+-}++init :: Text -> Text+init = pack . L.init . unpack+{-+init (Chunk t0 ts0) = go t0 ts0+    where go t (Chunk t' ts) = Chunk t (go t' ts)+          go t Empty         = chunk (T.init t) Empty+init Empty = emptyError "init"+-}++null :: Text -> Bool+null Empty = True+null _     = False++-- | /O(n)/ Returns the number of characters in a 'Text'.+length :: Text -> Int64+length = foldlChunks go 0+    where+        go :: Int64 -> T.Text -> Int64+        go l t = l + intToInt64 (T.length t)++compareLength :: Text -> Int64 -> Ordering+compareLength t = compareLengthList (unpack t)+  where+    compareLengthList xs n+      | n < 0 = GT+      | otherwise = foldr+        (\_ f m -> if m > 0 then f (m - 1) else GT)+        (\m -> if m > 0 then LT else EQ)+        xs+        n++replicate :: Int64 -> Text -> Text+replicate n+  | n <= 0 = const Empty+  | otherwise = \case+    Empty -> Empty+    t -> concat (L.genericReplicate n t)+ splitOn :: Text -> Text -> [Text]-splitOn = coerce T.splitOn+splitOn pat src = L.map pack $ splitOnList (unpack pat) (unpack src)+  where+    splitOnList :: Eq a => [a] -> [a] -> [[a]]+    splitOnList [] = error "splitOn: empty"+    splitOnList sep = loop []+      where+        loop r  [] = [reverse r]+        loop r  s@(c:cs) | Just t <- L.stripPrefix sep s = reverse r : loop [] t+                        | otherwise = loop (c:r) cs  dropWhileEnd :: (Char -> Bool) -> Text -> Text-dropWhileEnd = coerce T.dropWhileEnd+dropWhileEnd p = pack . L.dropWhileEnd p . unpack  map :: (Char -> Char) -> Text -> Text-map f = coerce (T.map f)+map f = foldrChunks (Chunk . T.map f) Empty  concat :: [Text] -> Text-concat = coerce T.concat+concat []                    = Empty+concat (Empty : css)         = concat css+concat (Chunk c Empty : css) = Chunk c (concat css)+concat (Chunk c cs : css)    = Chunk c (concat (cs : css))+++-- | Currently set to 16 KiB, less the memory management overhead.+defaultChunkSize :: Int+defaultChunkSize = 16384 - chunkOverhead++-- | Currently set to 128 bytes, less the memory management overhead.+smallChunkSize :: Int+smallChunkSize = 128 - chunkOverhead++-- | The memory management overhead. Currently this is tuned for GHC only.+chunkOverhead :: Int+chunkOverhead = _wordSize `primIntShl` 1++emptyError :: String -> a+emptyError fun = error ("Data.Text.Lazy." ++ fun ++ ": empty input")++intToInt64 :: Int -> Int64+intToInt64 = primIntToInt64++int64ToInt :: Int64 -> Int+int64ToInt = primInt64ToInt
lib/Data/Text/Lazy/Builder.hs view
@@ -1,42 +1,54 @@--- Fake a builder module Data.Text.Lazy.Builder-   ( Builder-   , LazyTextBuilder-   , toLazyText-   , toLazyTextWith-   , singleton-   , fromText-   , fromLazyText-   , fromString-   , flush-   ) where+  ( Builder+  , LazyTextBuilder+  , toLazyText+  , toLazyTextWith+  , singleton+  , fromText+  , fromLazyText+  , fromString+  , flush+  ) where import qualified Data.Text as S import qualified Data.Text.Lazy as L import Data.String -newtype Builder = B L.Text-  deriving newtype (Eq, Ord, {-Semigroup,-} Monoid, Show, IsString)+newtype Builder = Builder (L.Text -> L.Text) --- bug in newtype deriving+type LazyTextBuilder = Builder++instance Eq Builder where+  a == b = toLazyText a == toLazyText b++instance Ord Builder where+  compare a b = compare (toLazyText a) (toLazyText b)+ instance Semigroup Builder where-  B x <> B y = B (x <> y)+  Builder f <> Builder g = Builder (f . g) -type LazyTextBuilder = Builder+instance Monoid Builder where+  mempty = Builder id +instance IsString Builder where+  fromString = fromLazyText . L.pack++instance Show Builder where+  show = show . toLazyText+ toLazyText :: Builder -> L.Text-toLazyText (B t) = t+toLazyText (Builder f) = f L.empty  toLazyTextWith :: Int -> Builder -> L.Text-toLazyTextWith _ (B t) = t+toLazyTextWith _ = toLazyText  singleton :: Char -> Builder-singleton c = B (L.singleton c)+singleton = fromLazyText . L.singleton  fromText :: S.Text -> Builder-fromText = fromLazyText . L.toLazy+fromText = fromLazyText . L.fromStrict  fromLazyText :: L.Text -> Builder-fromLazyText t = B t+fromLazyText t = Builder (t `L.append`)  flush :: Builder-flush = B L.empty+flush = Builder id
lib/Data/Traversable.hs view
@@ -44,10 +44,10 @@ import qualified Data.List as List import Data.Maybe import Data.Monoid.Internal+import Data.Ord (Down(..)) import Data.Proxy+import Data.Tuple (Solo(..)) import {-# SOURCE #-} Data.Typeable---import Data.Ord ( Down(..) )---import Data.Proxy ( Proxy(..) )  class (Functor t, Foldable t) => Traversable (t :: Type -> Type) where @@ -78,25 +78,13 @@ instance Traversable Identity where   traverse f (Identity a) = Identity <$> f a -instance Traversable Proxy where-  traverse _ _ = pure Proxy- instance Traversable (Const m) where   traverse _ (Const m) = pure $ Const m -{- -- | @since 4.15 deriving instance Traversable Solo  -- | @since 4.7.0.0-instance Traversable ((,) a) where-    traverse f (x, y) = (,) x <$> f y---- | @since 2.01-instance Ix i => Traversable (Array i) where-    traverse f arr = listArray (bounds arr) `fmap` traverse f (elems arr)---- | @since 4.7.0.0 instance Traversable Proxy where     traverse _ _ = pure Proxy     {-# INLINE traverse #-}@@ -107,6 +95,7 @@     sequence _ = pure Proxy     {-# INLINE sequence #-} +{- -- | @since 4.7.0.0 instance Traversable (Const m) where     traverse _ (Const m) = pure $ Const m@@ -199,11 +188,12 @@  -- | @since 4.9.0.0 deriving instance Traversable UWord+-}  -- Instance for Data.Ord -- | @since 4.12.0.0 deriving instance Traversable Down--}+ -- general functions  -- | 'for' is 'traverse' with its arguments flipped. For a version
lib/Data/Tuple.hs view
@@ -4,10 +4,12 @@   module Data.Tuple,   ) where import qualified Prelude()              -- do not import Prelude+import Control.Applicative import Data.Bool import Data.Bounded import Data.Eq import Data.Function+import Data.Functor import Data.Int.Int import Data.Monoid.Internal import Data.Records@@ -20,7 +22,6 @@ -- etc  data Solo a = MkSolo a-  deriving (Eq, Ord)  getSolo :: Solo a -> a getSolo (MkSolo a) = a@@ -42,39 +43,77 @@  ----------------------------------- --- data () = () built in--instance Eq () where-  () == ()  =  True--instance (Eq a, Eq b) => Eq (a, b) where-  (a1, b1) == (a2, b2)  =  a1 == a2 && b1 == b2--instance (Eq a, Eq b, Eq c) => Eq (a, b, c) where-  (a1, b1, c1) == (a2, b2, c2)  =  a1 == a2 && b1 == b2 && c1 == c2--instance (Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d) where-  (a1, b1, c1, d1) == (a2, b2, c2, d2)  =  a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2--instance (Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a, b, c, d, e) where-  (a1, b1, c1, d1, e1) == (a2, b2, c2, d2, e2)  =  a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2 && e1 == e2+deriving instance Eq ()+deriving instance Eq a => Eq (Solo a)+deriving instance (Eq  a, Eq  b) => Eq  (a, b)+deriving instance (Eq  a, Eq  b, Eq  c) => Eq  (a, b, c)+deriving instance (Eq  a, Eq  b, Eq  c, Eq  d) => Eq  (a, b, c, d)+deriving instance (Eq  a, Eq  b, Eq  c, Eq  d, Eq  e) => Eq  (a, b, c, d, e)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f)+               => Eq (a, b, c, d, e, f)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g)+               => Eq (a, b, c, d, e, f, g)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,+                   Eq h)+               => Eq (a, b, c, d, e, f, g, h)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,+                   Eq h, Eq i)+               => Eq (a, b, c, d, e, f, g, h, i)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,+                   Eq h, Eq i, Eq j)+               => Eq (a, b, c, d, e, f, g, h, i, j)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,+                   Eq h, Eq i, Eq j, Eq k)+               => Eq (a, b, c, d, e, f, g, h, i, j, k)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,+                   Eq h, Eq i, Eq j, Eq k, Eq l)+               => Eq (a, b, c, d, e, f, g, h, i, j, k, l)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,+                   Eq h, Eq i, Eq j, Eq k, Eq l, Eq m)+               => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,+                   Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n)+               => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n)+deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,+                   Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n, Eq o)+               => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)  ----------------------------------- -instance Ord () where-  () `compare` ()  =  EQ--instance (Ord a, Ord b) => Ord (a, b) where-  (a1, b1) `compare` (a2, b2)  =  a1 `compare` a2 <> b1 `compare` b2--instance (Ord a, Ord b, Ord c) => Ord (a, b, c) where-  (a1, b1, c1) `compare` (a2, b2, c2)  =  a1 `compare` a2 <> b1 `compare` b2 <> c1 `compare` c2--instance (Ord a, Ord b, Ord c, Ord d) => Ord (a, b, c, d) where-  (a1, b1, c1, d1) `compare` (a2, b2, c2, d2)  =  a1 `compare` a2 <> b1 `compare` b2 <> c1 `compare` c2 <> d1 `compare` d2--instance (Ord a, Ord b, Ord c, Ord d, Ord e) => Ord (a, b, c, d, e) where-  (a1, b1, c1, d1, e1) `compare` (a2, b2, c2, d2, e2)  =  a1 `compare` a2 <> b1 `compare` b2 <> c1 `compare` c2 <> d1 `compare` d2 <> e1 `compare` e2+deriving instance Ord ()+deriving instance Ord a => Ord (Solo a)+deriving instance (Ord a, Ord b) => Ord (a, b)+deriving instance (Ord a, Ord b, Ord c) => Ord (a, b, c)+deriving instance (Ord a, Ord b, Ord c, Ord d) => Ord (a, b, c, d)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e) => Ord (a, b, c, d, e)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f)+               => Ord (a, b, c, d, e, f)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g)+               => Ord (a, b, c, d, e, f, g)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,+                   Ord h)+               => Ord (a, b, c, d, e, f, g, h)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,+                   Ord h, Ord i)+               => Ord (a, b, c, d, e, f, g, h, i)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,+                   Ord h, Ord i, Ord j)+               => Ord (a, b, c, d, e, f, g, h, i, j)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,+                   Ord h, Ord i, Ord j, Ord k)+               => Ord (a, b, c, d, e, f, g, h, i, j, k)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,+                   Ord h, Ord i, Ord j, Ord k, Ord l)+               => Ord (a, b, c, d, e, f, g, h, i, j, k, l)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,+                   Ord h, Ord i, Ord j, Ord k, Ord l, Ord m)+               => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,+                   Ord h, Ord i, Ord j, Ord k, Ord l, Ord m, Ord n)+               => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n)+deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,+                   Ord h, Ord i, Ord j, Ord k, Ord l, Ord m, Ord n, Ord o)+               => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)  ----------------------------------- @@ -85,51 +124,106 @@   showsPrec p (MkSolo a) = showParen (p > 10) (showString "MkSolo " . showsPrec 11 a)  instance (Show a, Show b) => Show (a, b) where-  showsPrec _ (a, b) = showParen True (shows a . showString "," . shows b)+  showsPrec _ (a,b) s = showTuple [shows a, shows b] s  instance (Show a, Show b, Show c) => Show (a, b, c) where-  showsPrec _ (a, b, c) = showParen True (shows a . showString "," . shows b . showString "," . shows c)+  showsPrec _ (a,b,c) s = showTuple [shows a, shows b, shows c] s  instance (Show a, Show b, Show c, Show d) => Show (a, b, c, d) where-  showsPrec _ (a, b, c, d) = showParen True (shows a . showString "," . shows b . showString "," . shows c .-                                             showString "," . shows d)+  showsPrec _ (a,b,c,d) s = showTuple [shows a, shows b, shows c, shows d] s  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)+  showsPrec _ (a,b,c,d,e) s = showTuple [shows a, shows b, shows c, shows d, shows e] s -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 (a,b,c,d,e,f) where+  showsPrec _ (a,b,c,d,e,f) s = showTuple [shows a, shows b, shows c, shows d, shows e, shows f] s -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)+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) s+        = showTuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g] s ------------------------------------+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h)+         => Show (a,b,c,d,e,f,g,h) where+  showsPrec _ (a,b,c,d,e,f,g,h) s+        = showTuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h] s -instance Bounded () where-  minBound = ()-  maxBound = ()+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i)+         => Show (a,b,c,d,e,f,g,h,i) where+  showsPrec _ (a,b,c,d,e,f,g,h,i) s+        = showTuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h,+                      shows i] s -instance (Bounded a) => Bounded (Solo a) where-  minBound = MkSolo minBound-  maxBound = MkSolo maxBound+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j)+         => Show (a,b,c,d,e,f,g,h,i,j) where+  showsPrec _ (a,b,c,d,e,f,g,h,i,j) s+        = showTuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h,+                      shows i, shows j] s -instance (Bounded a, Bounded b) => Bounded (a, b) where-  minBound = (minBound, minBound)-  maxBound = (maxBound, maxBound)+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k)+         => Show (a,b,c,d,e,f,g,h,i,j,k) where+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k) s+        = showTuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h,+                      shows i, shows j, shows k] s -instance (Bounded a, Bounded b, Bounded c) => Bounded (a, b, c) where-  minBound = (minBound, minBound, minBound)-  maxBound = (maxBound, maxBound, maxBound)+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k,+          Show l)+         => Show (a,b,c,d,e,f,g,h,i,j,k,l) where+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k,l) s+        = showTuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h,+                      shows i, shows j, shows k, shows l] s -instance (Bounded a, Bounded b, Bounded c, Bounded d) => Bounded (a, b, c, d) where-  minBound = (minBound, minBound, minBound, minBound)-  maxBound = (maxBound, maxBound, maxBound, maxBound)+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k,+          Show l, Show m)+         => Show (a,b,c,d,e,f,g,h,i,j,k,l,m) where+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k,l,m) s+        = showTuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h,+                      shows i, shows j, shows k, shows l, shows m] s +instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k,+          Show l, Show m, Show n)+         => Show (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k,l,m,n) s+        = showTuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h,+                      shows i, shows j, shows k, shows l, shows m, shows n] s++instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k,+          Show l, Show m, Show n, Show o)+         => Show (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) s+        = showTuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h,+                      shows i, shows j, shows k, shows l, shows m, shows n, shows o] s++showTuple :: [ShowS] -> ShowS+showTuple ss = showChar '('+             . foldr1 (\s r -> s . showChar ',' . r) ss+             . showChar ')'+  where+    -- redefine foldr1 to avoid import cycle+    foldr1 _ [x] = x+    foldr1 f (x : xs) = f x (foldr1 f xs)+ ----------------------------------- +deriving instance Bounded ()+deriving instance (Bounded a) => Bounded (Solo a)+deriving instance (Bounded a, Bounded b) => Bounded (a, b)+deriving instance (Bounded a, Bounded b, Bounded c) => Bounded (a, b, c)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d) => Bounded (a, b, c, d)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e) => Bounded (a, b, c, d, e)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f) => Bounded (a, b, c, d, e, f)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g) => Bounded (a, b, c, d, e, f, g)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h) => Bounded (a, b, c, d, e, f, g, h)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h, Bounded i) => Bounded (a, b, c, d, e, f, g, h, i)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h, Bounded i, Bounded j) => Bounded (a, b, c, d, e, f, g, h, i, j)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k) => Bounded (a, b, c, d, e, f, g, h, i, j, k)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k, Bounded l) => Bounded (a, b, c, d, e, f, g, h, i, j, k, l)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k, Bounded l, Bounded m) => Bounded (a, b, c, d, e, f, g, h, i, j, k, l, m)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k, Bounded l, Bounded m, Bounded n) => Bounded (a, b, c, d, e, f, g, h, i, j, k, l, m, n)+deriving instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h, Bounded i, Bounded j, Bounded k, Bounded l, Bounded m, Bounded n, Bounded o) => Bounded (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)++-----------------------------------+ instance Semigroup () where   _ <> _ = () @@ -145,6 +239,9 @@ instance (Semigroup a, Semigroup b, Semigroup c, Semigroup d) => Semigroup (a, b, c, d) where   (a, b, c, d) <> (a', b', c', d') = (a <> a', b <> b', c <> c', d <> d') +instance (Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e) => Semigroup (a, b, c, d, e) where+  (a, b, c, d, e) <> (a', b', c', d', e') = (a <> a', b <> b', c <> c', d <> d', e <> e')+ -----------------------------------  instance Monoid () where@@ -162,7 +259,10 @@ instance (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a, b, c, d) where   mempty = (mempty, mempty, mempty, mempty) +instance (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) => Monoid (a, b, c, d, e) where+  mempty = (mempty, mempty, mempty, mempty, mempty) + ----------------------------------- -- Virtual fields for tuples. @@ -186,3 +286,18 @@ instance SetField "_3" (a, b, c, d) c where setField _ (a, b, c, d) = \ c -> (a, b, c, d) instance HasField "_4" (a, b, c, d) d where getField _ (a, b, c, d) = d instance SetField "_4" (a, b, c, d) d where setField _ (a, b, c, d) = \ d -> (a, b, c, d)++-----------------------------------++-- | @since base-4.15+instance Functor Solo where+  fmap f (MkSolo a) = MkSolo (f a)++  -- Being strict in the `Solo` argument here seems most consistent+  -- with the concept behind `Solo`: always strict in the wrapper and lazy+  -- in the contents.+  x <$ MkSolo _ = MkSolo x++-- | @since base-4.15+instance Applicative Solo where+  pure = MkSolo
lib/Data/Tuple/Instances.hs view
@@ -5,9 +5,6 @@  -- 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) @@ -47,21 +44,12 @@ 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/Typeable.hs view
@@ -1,22 +1,44 @@ module Data.Typeable (-  Typeable(..),+  Typeable(typeRep),   TypeRep,   typeOf,+  --+  -- (:~:)(Refl),+  -- (:~~:)(HRefl),+  --   cast,   eqT,-  gcast, gcast1, gcast2,+  -- heqT, decT, hdecT+  gcast,+  gcast1,+  gcast2,+  --+  Proxy(..),+  --+  TypeRep,+  rnfTypeRep,+  showsTypeRep,+  mkFunTy,+  --+  funResultTy,+  splitTyConApp,+  typeRepArgs,+  typeRepTyCon,+  typeRepFimgerprint,+  --   TyCon,+  tyConPackage,   tyConModule,   tyConName,-  mkTyCon,+  rnfTyCon,+  tyConFingerPrint,+  --   _mkTyCon,+{-+  mkTyCon,   mkTyConApp,   mkAppTy,-  mkFunTy,-  splitTyConApp,-  funResultTy,-  typeRepTyCon,-  typeRepArgs,+-}   ) where import qualified Prelude(); import MiniPrelude import Primitives@@ -40,6 +62,10 @@  data TypeRep = TypeRep MD5CheckSum TyCon [TypeRep] +-- XXX This isn't right+rnfTypeRep :: TypeRep -> ()+rnfTypeRep (TypeRep a b c) = a `seq` b `seq` c `seq` ()+ -- Compare keys for equality instance Eq TypeRep where   TypeRep k1 _ _ == TypeRep k2 _ _  =  k1 == k2@@ -57,6 +83,12 @@           comma [s] = s           comma (s:ss) = s . showString "," . comma ss +showsTypeRep :: TypeRep -> ShowS+showsTypeRep = shows++typeRepFimgerprint :: TypeRep -> MD5CheckSum+typeRepFimgerprint (TypeRep m _ _) = m+ typeRepTyCon :: TypeRep -> TyCon typeRepTyCon (TypeRep _ tc _) = tc @@ -89,11 +121,22 @@ instance Show TyCon where   showsPrec _ (TyCon _ m n) = showString n +-- XXX not right+rnfTyCon :: TyCon -> ()+rnfTyCon (TyCon a b c) = a `seq` b `seq` c `seq` ()++-- MHS does not have package info+tyConPackage :: TyCon -> String+tyConPackage _ = ""+ tyConModule :: TyCon -> String tyConModule (TyCon _ m _) = m  tyConName :: TyCon -> String tyConName (TyCon _ _ n) = n++tyConFingerPrint :: TyCon -> MD5CheckSum+tyConFingerPrint (TyCon m _ _) = m  mkTyCon :: String -> String -> TyCon mkTyCon m n = TyCon md5 m n
lib/Data/Word/Word.hs view
@@ -28,6 +28,7 @@   (+)  = primWordAdd   (-)  = primWordSub   (*)  = primWordMul+  negate = primWordNeg   abs x = x   signum x = if x == 0 then 0 else 1   fromInteger = _integerToWord
lib/Data/Word/Word16.hs view
@@ -65,7 +65,7 @@   toRational = _integerToRational . _wordToInteger . unW16  instance Show Word16 where-  showsPrec = showIntegral+  showsPrec = showUnsignedInt  {- in Text.Read.Internal instance Read Word16 where
lib/Data/Word/Word32.hs view
@@ -65,7 +65,7 @@   toRational = _integerToRational . _wordToInteger . unW32  instance Show Word32 where-  showsPrec = showIntegral+  showsPrec = showUnsignedInt  {- in Text.Read.Internal instance Read Word32 where
lib/Data/Word/Word64.hs view
@@ -26,6 +26,7 @@   (+)  = primWord64Add   (-)  = primWord64Sub   (*)  = primWord64Mul+  negate = primWord64Neg   abs x = x   signum x = if x == 0 then 0 else 1   fromInteger i = _integerToWord64 i@@ -43,7 +44,7 @@   toRational = _integerToRational . _word64ToInteger  instance Show Word64 where-  showsPrec = showIntegral+  showsPrec = showUnsignedInt  {- in Text.Read.Internal instance Read Word64 where
lib/Data/Word/Word8.hs view
@@ -65,7 +65,7 @@   toRational = _integerToRational . _wordToInteger . unW8  instance Show Word8 where-  showsPrec = showIntegral+  showsPrec = showUnsignedInt  {- in Text.Read.Internal instance Read Word8 where
lib/Foreign/C/Error.hs view
@@ -1,6 +1,6 @@ ----------------------------------------------------------------------------- -- |--- Module      :  GHC.Internal.Foreign.C.Error+-- Module      :  Foreign.C.Error -- Copyright   :  (c) The FFI task force 2001 -- License     :  BSD-style (see the file libraries/base/LICENSE) --@@ -17,8 +17,6 @@    Errno(..), -  eOK, e2BIG, eACCES, eAGAIN, eINTR, eINVAL, eNOENT, ePERM, eRANGE, eROFS, eTXTBSY, eWOULDBLOCK,-{-   -- ** Common @errno@ symbols   -- | Different operating systems and\/or C libraries often support   -- different values of @errno@.  This module defines the common values,@@ -38,12 +36,13 @@   eRANGE, eREMCHG, eREMOTE, eROFS, eRPCMISMATCH, eRREMOTE, eSHUTDOWN,   eSOCKTNOSUPPORT, eSPIPE, eSRCH, eSRMNT, eSTALE, eTIME, eTIMEDOUT,   eTOOMANYREFS, eTXTBSY, eUSERS, eWOULDBLOCK, eXDEV,--}+   -- ** 'Errno' functions   isValidErrno,    -- access to the current thread's "errno" value   --+  setErrno,   getErrno,   resetErrno, @@ -94,158 +93,123 @@ import System.IO.Error import System.IO.Unsafe(unsafePerformIO) -{--import GHC.Internal.IO-import GHC.Internal.IO.Exception-import GHC.Internal.IO.Handle.Types-import GHC.Internal.Num-import GHC.Internal.Base--}--newtype Errno = Errno Int+newtype Errno = Errno CInt  instance Eq Errno where-  errno1@(Errno no1) == errno2@(Errno no2)-    | isValidErrno errno1 && isValidErrno errno2 = no1 == no2-    | otherwise                                  = False+  errno1@(Errno no1) == Errno no2+    | isValidErrno errno1 = no1 == no2+    | otherwise           = False -{--eOK, e2BIG, eACCES, eADDRINUSE, eADDRNOTAVAIL, eADV, eAFNOSUPPORT, eAGAIN,-  eALREADY, eBADF, eBADMSG, eBADRPC, eBUSY, eCHILD, eCOMM, eCONNABORTED,-  eCONNREFUSED, eCONNRESET, eDEADLK, eDESTADDRREQ, eDIRTY, eDOM, eDQUOT,-  eEXIST, eFAULT, eFBIG, eFTYPE, eHOSTDOWN, eHOSTUNREACH, eIDRM, eILSEQ,-  eINPROGRESS, eINTR, eINVAL, eIO, eISCONN, eISDIR, eLOOP, eMFILE, eMLINK,-  eMSGSIZE, eMULTIHOP, eNAMETOOLONG, eNETDOWN, eNETRESET, eNETUNREACH,-  eNFILE, eNOBUFS, eNODATA, eNODEV, eNOENT, eNOEXEC, eNOLCK, eNOLINK,-  eNOMEM, eNOMSG, eNONET, eNOPROTOOPT, eNOSPC, eNOSR, eNOSTR, eNOSYS,-  eNOTBLK, eNOTCONN, eNOTDIR, eNOTEMPTY, eNOTSOCK, eNOTSUP, eNOTTY, eNXIO,-  eOPNOTSUPP, ePERM, ePFNOSUPPORT, ePIPE, ePROCLIM, ePROCUNAVAIL,-  ePROGMISMATCH, ePROGUNAVAIL, ePROTO, ePROTONOSUPPORT, ePROTOTYPE,-  eRANGE, eREMCHG, eREMOTE, eROFS, eRPCMISMATCH, eRREMOTE, eSHUTDOWN,-  eSOCKTNOSUPPORT, eSPIPE, eSRCH, eSRMNT, eSTALE, eTIME, eTIMEDOUT,-  eTOOMANYREFS, eTXTBSY, eUSERS, eWOULDBLOCK, eXDEV                    :: Errno+instance Show Errno where+  showsPrec p (Errno e) = showsPrec p e -eOK             = Errno 0-e2BIG           = Errno (CONST_E2BIG)-eACCES          = Errno (CONST_EACCES)-eADDRINUSE      = Errno (CONST_EADDRINUSE)-eADDRNOTAVAIL   = Errno (CONST_EADDRNOTAVAIL)-eADV            = Errno (CONST_EADV)-eAFNOSUPPORT    = Errno (CONST_EAFNOSUPPORT)-eAGAIN          = Errno (CONST_EAGAIN)-eALREADY        = Errno (CONST_EALREADY)-eBADF           = Errno (CONST_EBADF)-eBADMSG         = Errno (CONST_EBADMSG)-eBADRPC         = Errno (CONST_EBADRPC)-eBUSY           = Errno (CONST_EBUSY)-eCHILD          = Errno (CONST_ECHILD)-eCOMM           = Errno (CONST_ECOMM)-eCONNABORTED    = Errno (CONST_ECONNABORTED)-eCONNREFUSED    = Errno (CONST_ECONNREFUSED)-eCONNRESET      = Errno (CONST_ECONNRESET)-eDEADLK         = Errno (CONST_EDEADLK)-eDESTADDRREQ    = Errno (CONST_EDESTADDRREQ)-eDIRTY          = Errno (CONST_EDIRTY)-eDOM            = Errno (CONST_EDOM)-eDQUOT          = Errno (CONST_EDQUOT)-eEXIST          = Errno (CONST_EEXIST)-eFAULT          = Errno (CONST_EFAULT)-eFBIG           = Errno (CONST_EFBIG)-eFTYPE          = Errno (CONST_EFTYPE)-eHOSTDOWN       = Errno (CONST_EHOSTDOWN)-eHOSTUNREACH    = Errno (CONST_EHOSTUNREACH)-eIDRM           = Errno (CONST_EIDRM)-eILSEQ          = Errno (CONST_EILSEQ)-eINPROGRESS     = Errno (CONST_EINPROGRESS)-eINTR           = Errno (CONST_EINTR)-eINVAL          = Errno (CONST_EINVAL)-eIO             = Errno (CONST_EIO)-eISCONN         = Errno (CONST_EISCONN)-eISDIR          = Errno (CONST_EISDIR)-eLOOP           = Errno (CONST_ELOOP)-eMFILE          = Errno (CONST_EMFILE)-eMLINK          = Errno (CONST_EMLINK)-eMSGSIZE        = Errno (CONST_EMSGSIZE)-eMULTIHOP       = Errno (CONST_EMULTIHOP)-eNAMETOOLONG    = Errno (CONST_ENAMETOOLONG)-eNETDOWN        = Errno (CONST_ENETDOWN)-eNETRESET       = Errno (CONST_ENETRESET)-eNETUNREACH     = Errno (CONST_ENETUNREACH)-eNFILE          = Errno (CONST_ENFILE)-eNOBUFS         = Errno (CONST_ENOBUFS)-eNODATA         = Errno (CONST_ENODATA)-eNODEV          = Errno (CONST_ENODEV)-eNOENT          = Errno (CONST_ENOENT)-eNOEXEC         = Errno (CONST_ENOEXEC)-eNOLCK          = Errno (CONST_ENOLCK)-eNOLINK         = Errno (CONST_ENOLINK)-eNOMEM          = Errno (CONST_ENOMEM)-eNOMSG          = Errno (CONST_ENOMSG)-eNONET          = Errno (CONST_ENONET)-eNOPROTOOPT     = Errno (CONST_ENOPROTOOPT)-eNOSPC          = Errno (CONST_ENOSPC)-eNOSR           = Errno (CONST_ENOSR)-eNOSTR          = Errno (CONST_ENOSTR)-eNOSYS          = Errno (CONST_ENOSYS)-eNOTBLK         = Errno (CONST_ENOTBLK)-eNOTCONN        = Errno (CONST_ENOTCONN)-eNOTDIR         = Errno (CONST_ENOTDIR)-eNOTEMPTY       = Errno (CONST_ENOTEMPTY)-eNOTSOCK        = Errno (CONST_ENOTSOCK)-eNOTSUP         = Errno (CONST_ENOTSUP)--- ^ @since base-4.7.0.0-eNOTTY          = Errno (CONST_ENOTTY)-eNXIO           = Errno (CONST_ENXIO)-eOPNOTSUPP      = Errno (CONST_EOPNOTSUPP)-ePERM           = Errno (CONST_EPERM)-ePFNOSUPPORT    = Errno (CONST_EPFNOSUPPORT)-ePIPE           = Errno (CONST_EPIPE)-ePROCLIM        = Errno (CONST_EPROCLIM)-ePROCUNAVAIL    = Errno (CONST_EPROCUNAVAIL)-ePROGMISMATCH   = Errno (CONST_EPROGMISMATCH)-ePROGUNAVAIL    = Errno (CONST_EPROGUNAVAIL)-ePROTO          = Errno (CONST_EPROTO)-ePROTONOSUPPORT = Errno (CONST_EPROTONOSUPPORT)-ePROTOTYPE      = Errno (CONST_EPROTOTYPE)-eRANGE          = Errno (CONST_ERANGE)-eREMCHG         = Errno (CONST_EREMCHG)-eREMOTE         = Errno (CONST_EREMOTE)-eROFS           = Errno (CONST_EROFS)-eRPCMISMATCH    = Errno (CONST_ERPCMISMATCH)-eRREMOTE        = Errno (CONST_ERREMOTE)-eSHUTDOWN       = Errno (CONST_ESHUTDOWN)-eSOCKTNOSUPPORT = Errno (CONST_ESOCKTNOSUPPORT)-eSPIPE          = Errno (CONST_ESPIPE)-eSRCH           = Errno (CONST_ESRCH)-eSRMNT          = Errno (CONST_ESRMNT)-eSTALE          = Errno (CONST_ESTALE)-eTIME           = Errno (CONST_ETIME)-eTIMEDOUT       = Errno (CONST_ETIMEDOUT)-eTOOMANYREFS    = Errno (CONST_ETOOMANYREFS)-eTXTBSY         = Errno (CONST_ETXTBSY)-eUSERS          = Errno (CONST_EUSERS)-eWOULDBLOCK     = Errno (CONST_EWOULDBLOCK)-eXDEV           = Errno (CONST_EXDEV)--}+eOK :: Errno+eOK = Errno 0 -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+foreign import capi "value E2BIG"           e2BIG           :: Errno+foreign import capi "value EACCES"          eACCES          :: Errno+foreign import capi "value EADDRINUSE"      eADDRINUSE      :: Errno+foreign import capi "value EADDRNOTAVAIL"   eADDRNOTAVAIL   :: Errno+foreign import capi "value EADV"            eADV            :: Errno+foreign import capi "value EAFNOSUPPORT"    eAFNOSUPPORT    :: Errno+foreign import capi "value EAGAIN"          eAGAIN          :: Errno+foreign import capi "value EALREADY"        eALREADY        :: Errno+foreign import capi "value EBADF"           eBADF           :: Errno+foreign import capi "value EBADMSG"         eBADMSG         :: Errno+foreign import capi "value EBADRPC"         eBADRPC         :: Errno+foreign import capi "value EBUSY"           eBUSY           :: Errno+foreign import capi "value ECHILD"          eCHILD          :: Errno+foreign import capi "value ECOMM"           eCOMM           :: Errno+foreign import capi "value ECONNABORTED"    eCONNABORTED    :: Errno+foreign import capi "value ECONNREFUSED"    eCONNREFUSED    :: Errno+foreign import capi "value ECONNRESET"      eCONNRESET      :: Errno+foreign import capi "value EDEADLK"         eDEADLK         :: Errno+foreign import capi "value EDESTADDRREQ"    eDESTADDRREQ    :: Errno+foreign import capi "value EDIRTY"          eDIRTY          :: Errno+foreign import capi "value EDOM"            eDOM            :: Errno+foreign import capi "value EDQUOT"          eDQUOT          :: Errno+foreign import capi "value EEXIST"          eEXIST          :: Errno+foreign import capi "value EFAULT"          eFAULT          :: Errno+foreign import capi "value EFBIG"           eFBIG           :: Errno+foreign import capi "value EFTYPE"          eFTYPE          :: Errno+foreign import capi "value EHOSTDOWN"       eHOSTDOWN       :: Errno+foreign import capi "value EHOSTUNREACH"    eHOSTUNREACH    :: Errno+foreign import capi "value EIDRM"           eIDRM           :: Errno+foreign import capi "value EILSEQ"          eILSEQ          :: Errno+foreign import capi "value EINPROGRESS"     eINPROGRESS     :: Errno+foreign import capi "value EINTR"           eINTR           :: Errno+foreign import capi "value EINVAL"          eINVAL          :: Errno+foreign import capi "value EIO"             eIO             :: Errno+foreign import capi "value EISCONN"         eISCONN         :: Errno+foreign import capi "value EISDIR"          eISDIR          :: Errno+foreign import capi "value ELOOP"           eLOOP           :: Errno+foreign import capi "value EMFILE"          eMFILE          :: Errno+foreign import capi "value EMLINK"          eMLINK          :: Errno+foreign import capi "value EMSGSIZE"        eMSGSIZE        :: Errno+foreign import capi "value EMULTIHOP"       eMULTIHOP       :: Errno+foreign import capi "value ENAMETOOLONG"    eNAMETOOLONG    :: Errno+foreign import capi "value ENETDOWN"        eNETDOWN        :: Errno+foreign import capi "value ENETRESET"       eNETRESET       :: Errno+foreign import capi "value ENETUNREACH"     eNETUNREACH     :: Errno+foreign import capi "value ENFILE"          eNFILE          :: Errno+foreign import capi "value ENOBUFS"         eNOBUFS         :: Errno+foreign import capi "value ENODATA"         eNODATA         :: Errno+foreign import capi "value ENODEV"          eNODEV          :: Errno+foreign import capi "value ENOENT"          eNOENT          :: Errno+foreign import capi "value ENOEXEC"         eNOEXEC         :: Errno+foreign import capi "value ENOLCK"          eNOLCK          :: Errno+foreign import capi "value ENOLINK"         eNOLINK         :: Errno+foreign import capi "value ENOMEM"          eNOMEM          :: Errno+foreign import capi "value ENOMSG"          eNOMSG          :: Errno+foreign import capi "value ENONET"          eNONET          :: Errno+foreign import capi "value ENOPROTOOPT"     eNOPROTOOPT     :: Errno+foreign import capi "value ENOSPC"          eNOSPC          :: Errno+foreign import capi "value ENOSR"           eNOSR           :: Errno+foreign import capi "value ENOSTR"          eNOSTR          :: Errno+foreign import capi "value ENOSYS"          eNOSYS          :: Errno+foreign import capi "value ENOTBLK"         eNOTBLK         :: Errno+foreign import capi "value ENOTCONN"        eNOTCONN        :: Errno+foreign import capi "value ENOTDIR"         eNOTDIR         :: Errno+foreign import capi "value ENOTEMPTY"       eNOTEMPTY       :: Errno+foreign import capi "value ENOTSOCK"        eNOTSOCK        :: Errno+foreign import capi "value ENOTSUP"         eNOTSUP         :: Errno+foreign import capi "value ENOTTY"          eNOTTY          :: Errno+foreign import capi "value ENXIO"           eNXIO           :: Errno+foreign import capi "value EOPNOTSUPP"      eOPNOTSUPP      :: Errno+foreign import capi "value EPERM"           ePERM           :: Errno+foreign import capi "value EPFNOSUPPORT"    ePFNOSUPPORT    :: Errno+foreign import capi "value EPIPE"           ePIPE           :: Errno+foreign import capi "value EPROCLIM"        ePROCLIM        :: Errno+foreign import capi "value EPROCUNAVAIL"    ePROCUNAVAIL    :: Errno+foreign import capi "value EPROGMISMATCH"   ePROGMISMATCH   :: Errno+foreign import capi "value EPROGUNAVAIL"    ePROGUNAVAIL    :: Errno+foreign import capi "value EPROTO"          ePROTO          :: Errno+foreign import capi "value EPROTONOSUPPORT" ePROTONOSUPPORT :: Errno+foreign import capi "value EPROTOTYPE"      ePROTOTYPE      :: Errno+foreign import capi "value ERANGE"          eRANGE          :: Errno+foreign import capi "value EREMCHG"         eREMCHG         :: Errno+foreign import capi "value EREMOTE"         eREMOTE         :: Errno+foreign import capi "value EROFS"           eROFS           :: Errno+foreign import capi "value ERPCMISMATCH"    eRPCMISMATCH    :: Errno+foreign import capi "value ERREMOTE"        eRREMOTE        :: Errno+foreign import capi "value ESHUTDOWN"       eSHUTDOWN       :: Errno+foreign import capi "value ESOCKTNOSUPPORT" eSOCKTNOSUPPORT :: Errno+foreign import capi "value ESPIPE"          eSPIPE          :: Errno+foreign import capi "value ESRCH"           eSRCH           :: Errno+foreign import capi "value ESRMNT"          eSRMNT          :: Errno+foreign import capi "value ESTALE"          eSTALE          :: Errno+foreign import capi "value ETIME"           eTIME           :: Errno+foreign import capi "value ETIMEDOUT"       eTIMEDOUT       :: Errno+foreign import capi "value ETOOMANYREFS"    eTOOMANYREFS    :: Errno+foreign import capi "value ETXTBSY"         eTXTBSY         :: Errno+foreign import capi "value EUSERS"          eUSERS          :: Errno+foreign import capi "value EWOULDBLOCK"     eWOULDBLOCK     :: Errno+foreign import capi "value EXDEV"           eXDEV           :: Errno  isValidErrno               :: Errno -> Bool isValidErrno (Errno errno)  = errno /= -1 -foreign import ccall unsafe "errno.h &errno" c_errno_ptr :: IO (Ptr Int)+foreign import ccall unsafe "errno.h &errno" c_errno_ptr :: IO (Ptr CInt)  getErrno :: IO Errno getErrno = do@@ -253,12 +217,14 @@   e <- peek p   return (Errno e) -resetErrno :: IO ()-resetErrno = do+setErrno :: Errno -> IO ()+setErrno (Errno e) = do   p <- c_errno_ptr-  poke p 0-  return ()+  poke p e +resetErrno :: IO ()+resetErrno = setErrno (Errno 0)+ throwErrno :: String -> IO a throwErrno loc = do   errno <- getErrno@@ -373,16 +339,16 @@   foreign import ccall "string.h strerror_r"-    c_strerror_r :: Int -> CString -> CSize -> IO Int+    c_strerror_r :: Errno -> CString -> CSize -> IO CInt  errnoToString :: Errno -> IO String-errnoToString (Errno errno) =-    allocaBytes 512 $ \ ptr -> do-        ret <- c_strerror_r errno ptr (CSize 512)+errnoToString errno =+    allocaBytes len $ \ ptr -> do+        ret <- c_strerror_r errno ptr (CSize len)         if ret /= 0           then return "errnoToString failed"           else peekCString ptr-  where len = 512::Int+  where len :: (Num a => a); len = 512  errnoToIOError  :: String       -- ^ the location where the error occurred                 -> Errno        -- ^ the error number@@ -397,14 +363,11 @@         | 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@@ -429,10 +392,8 @@         | errno == eIDRM           = ResourceVanished         | errno == eILSEQ          = InvalidArgument         | errno == eINPROGRESS     = AlreadyExists--}         | errno == eINTR           = Interrupted         | errno == eINVAL          = InvalidArgument-{-         | errno == eIO             = HardwareFault         | errno == eISCONN         = AlreadyExists         | errno == eISDIR          = InappropriateType@@ -449,9 +410,7 @@         | errno == eNOBUFS         = ResourceExhausted         | errno == eNODATA         = NoSuchThing         | errno == eNODEV          = UnsupportedOperation--}         | errno == eNOENT          = NoSuchThing-{-         | errno == eNOEXEC         = InvalidArgument         | errno == eNOLCK          = ResourceExhausted         | errno == eNOLINK         = ResourceVanished@@ -471,9 +430,7 @@         | errno == eNOTTY          = IllegalOperation         | errno == eNXIO           = NoSuchThing         | errno == eOPNOTSUPP      = UnsupportedOperation--}         | errno == ePERM           = PermissionDenied-{-         | errno == ePFNOSUPPORT    = UnsupportedOperation         | errno == ePIPE           = ResourceVanished         | errno == ePROCLIM        = PermissionDenied@@ -483,14 +440,10 @@         | 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@@ -502,14 +455,9 @@         | errno == eTIME           = TimeExpired         | errno == eTIMEDOUT       = TimeExpired         | errno == eTOOMANYREFS    = ResourceExhausted--}         | errno == eTXTBSY         = ResourceBusy-{-         | errno == eUSERS          = ResourceExhausted--}         | errno == eWOULDBLOCK     = OtherError-{-         | errno == eXDEV           = UnsupportedOperation--}         | otherwise                = OtherError 
lib/GHC/Generics.hs view
@@ -1,4 +1,574 @@ -- This is a dummy module so deriving Generic can be spoofed.-module GHC.Generics(Generic, Generic1) where-class Generic a-class Generic1 f+module GHC.Generics(+  -- * Generic representation types+    V1, U1(..), Par1(..), Rec1(..), K1(..), M1(..)+  , (:+:)(..), (:*:)(..), (:.:)(..)++  -- ** Unboxed representation types+  -- , URec(..)+  -- , type UAddr, type UChar, type UDouble+  -- , type UFloat, type UInt, type UWord++  -- ** Synonyms for convenience+  , Rec0, R+  , D1, C1, S1, D, C, S++  -- * Meta-information+  -- , Datatype(..), Constructor(..), Selector(..)+  -- , Fixity(..), FixityI(..), Associativity(..), prec+  -- , SourceUnpackedness(..), SourceStrictness(..), DecidedStrictness(..)+  -- , Meta(..)++  -- * Generic type classes+  , Generic(..), Rep+  , Generic1(..), Rep1++  -- * Generic wrapper+  , Generically(..)+  , Generically1(..)+  ) where++import Control.Applicative(Alternative(..))+import Control.Monad(MonadPlus(..))+import Control.Monad.Fix+import Data.Coerce(coerce)+import Data.Traversable++-----------------+-- Imports for 'deriving instance'+--import Data.Complex+import Data.Int+import Data.Monoid+import Data.Ratio+import Data.Tuple+import Data.Word+-----------------++class Generic a where+  from :: a -> Rep a x+  to :: Rep a x -> a+  from _ = errGeneric+  to _ = errGeneric++type Rep :: Type -> Type -> Type+data Rep a x++type Generic1 :: forall (k :: Kind) . (k -> Type) -> Constraint+class Generic1 f where+  from1 :: f a -> Rep1 f a+  to1 :: Rep1 f a -> f a+  from1 _ = errGeneric+  to1 _ = errGeneric++type Rep1 :: forall (k :: Kind) . (k -> Type) -> k -> Type+data Rep1 f a++errGeneric :: a+errGeneric = error "MicroHs does not implement Generic yet"++--------------------------------------------------------------------------------+-- 'Generic' wrapper+--------------------------------------------------------------------------------++newtype Generically a = Generically a++-- | @since base-4.17.0.0+instance (Generic a, Semigroup (Rep a ())) => Semigroup (Generically a) where+  (<>) :: Generically a -> Generically a -> Generically a+  Generically a <> Generically b = Generically (to (from a <> from b :: Rep a ()))++-- | @since base-4.17.0.0+instance (Generic a, Monoid (Rep a ())) => Monoid (Generically a) where+  mempty :: Generically a+  mempty = Generically (to (mempty :: Rep a ()))++  mappend :: Generically a -> Generically a -> Generically a+  mappend = (<>)++type    Generically1 :: forall k. (k -> Type) -> (k -> Type)+newtype Generically1 f a = Generically1 (f a)++-- | @since base-4.18.0.0+instance (Generic1 f, Eq (Rep1 f a)) => Eq (Generically1 f a) where+   Generically1 x == Generically1 y = from1 x == from1 y+   Generically1 x /= Generically1 y = from1 x /= from1 y++-- | @since base-4.18.0.0+instance (Generic1 f, Ord (Rep1 f a)) => Ord (Generically1 f a) where+   Generically1 x `compare` Generically1 y = from1 x `compare` from1 y++-- | @since base-4.17.0.0+instance (Generic1 f, Functor (Rep1 f)) => Functor (Generically1 f) where+  fmap :: (a -> a') -> (Generically1 f a -> Generically1 f a')+  fmap f (Generically1 as) = Generically1+    (to1 (fmap f (from1 as)))++  (<$) :: a -> Generically1 f b -> Generically1 f a+  a <$ Generically1 as = Generically1+    (to1 (a <$ from1 as))++-- | @since base-4.17.0.0+instance (Generic1 f, Applicative (Rep1 f)) => Applicative (Generically1 f) where+  pure :: a -> Generically1 f a+  pure a = Generically1+    (to1 (pure a))++  (<*>) :: Generically1 f (a1 -> a2) -> Generically1 f a1 -> Generically1 f a2+  Generically1 fs <*> Generically1 as = Generically1+    (to1 (from1 fs <*> from1 as))++  liftA2 :: (a1 -> a2 -> a3)+         -> (Generically1 f a1 -> Generically1 f a2 -> Generically1 f a3)+  liftA2 (·) (Generically1 as) (Generically1 bs) = Generically1+    (to1 (liftA2 (·) (from1 as) (from1 bs)))++-- | @since base-4.17.0.0+instance (Generic1 f, Alternative (Rep1 f)) => Alternative (Generically1 f) where+  empty :: Generically1 f a+  empty = Generically1+    (to1 empty)++  (<|>) :: Generically1 f a -> Generically1 f a -> Generically1 f a+  Generically1 as1 <|> Generically1 as2 = Generically1+    (to1 (from1 as1 <|> from1 as2))++--------------------------------------------------------------------------------+-- Representation types+--------------------------------------------------------------------------------++-- | Void: used for datatypes without constructors+type V1 :: forall (k :: Kind) . k -> Type+data V1 p+  deriving ( Eq       -- ^ @since base-4.9.0.0+           , Ord      -- ^ @since base-4.9.0.0+           , Read     -- ^ @since base-4.9.0.0+           , Show     -- ^ @since base-4.9.0.0+           , Functor  -- ^ @since base-4.9.0.0+           , Generic  -- ^ @since base-4.9.0.0+           , Generic1 -- ^ @since base-4.9.0.0+           )++-- | @since base-4.12.0.0+instance Semigroup (V1 p) where+  v <> _ = v++-- | @since 4.9.0.0+deriving instance Foldable V1++-- | @since 4.9.0.0+deriving instance Traversable V1++-- | Unit: used for constructors without arguments+type U1 :: forall (k :: Kind) . k -> Type+data U1 p = U1+  deriving ( Generic  -- ^ @since base-4.7.0.0+           , Generic1 -- ^ @since base-4.9.0.0+           )++-- | @since base-4.9.0.0+instance Eq (U1 p) where+  _ == _ = True++-- | @since base-4.7.0.0+instance Ord (U1 p) where+  compare _ _ = EQ++-- | @since base-4.9.0.0+deriving instance Read (U1 p)++-- | @since base-4.9.0.0+instance Show (U1 p) where+  showsPrec _ _ = showString "U1"++-- | @since base-4.9.0.0+instance Functor U1 where+  fmap _ _ = U1++-- | @since base-4.9.0.0+instance Applicative U1 where+  pure _ = U1+  _ <*> _ = U1+  liftA2 _ _ _ = U1++-- | @since base-4.9.0.0+instance Alternative U1 where+  empty = U1+  _ <|> _ = U1++-- | @since base-4.9.0.0+instance Monad U1 where+  _ >>= _ = U1++-- | @since base-4.9.0.0+instance MonadPlus U1++-- | @since base-4.12.0.0+instance Semigroup (U1 p) where+  _ <> _ = U1++-- | @since base-4.12.0.0+instance Monoid (U1 p) where+  mempty = U1++-- | @since 4.9.0.0+instance Foldable U1 where+    foldMap _ _ = mempty+    fold _ = mempty+    foldr _ z _ = z+    foldl _ z _ = z+    foldl1 _ _ = error "foldl1: U1"+    foldr1 _ _ = error "foldr1: U1"+    length _   = 0+    null _     = True+    elem _ _   = False+    sum _      = 0+    product _  = 1++-- | @since 4.9.0.0+instance Traversable U1 where+    traverse _ _ = pure U1+    sequenceA _ = pure U1+    mapM _ _ = pure U1+    sequence _ = pure U1++-- | Used for marking occurrences of the parameter+newtype Par1 p = Par1 { unPar1 :: p }+  deriving ( Eq       -- ^ @since base-4.7.0.0+           , Ord      -- ^ @since base-4.7.0.0+           , Read     -- ^ @since base-4.7.0.0+           , Show     -- ^ @since base-4.7.0.0+           , Functor  -- ^ @since base-4.9.0.0+           , Generic  -- ^ @since base-4.7.0.0+           , Generic1 -- ^ @since base-4.9.0.0+           )++-- | @since base-4.9.0.0+instance Applicative Par1 where+  pure = Par1+  (<*>) = coerce+  liftA2 = coerce++-- | @since base-4.9.0.0+instance Monad Par1 where+  Par1 x >>= f = f x++-- | @since base-4.9.0.0+instance MonadFix Par1 where+    mfix f = Par1 (fix (unPar1 . f))++-- | @since base-4.12.0.0+deriving instance Semigroup p => Semigroup (Par1 p)++-- | @since base-4.12.0.0+deriving instance Monoid p => Monoid (Par1 p)++-- | @since 4.9.0.0+deriving instance Foldable Par1++-- | @since 4.9.0.0+deriving instance Traversable Par1++-- | Recursive calls of kind @* -> *@ (or kind @k -> *@, when @PolyKinds@+-- is enabled)+type Rec1 :: forall (k :: Kind) . (k -> Type) -> k -> Type+newtype Rec1 f p = Rec1 { unRec1 :: f p }+  deriving ( Eq       -- ^ @since base-4.7.0.0+           , Ord      -- ^ @since base-4.7.0.0+           , Read     -- ^ @since base-4.7.0.0+           , Show     -- ^ @since base-4.7.0.0+           , Functor  -- ^ @since base-4.9.0.0+           , Generic  -- ^ @since base-4.7.0.0+           , Generic1 -- ^ @since base-4.9.0.0+           )++-- | @since base-4.9.0.0+deriving instance Applicative f => Applicative (Rec1 f)++-- | @since base-4.9.0.0+deriving instance Alternative f => Alternative (Rec1 f)++-- | @since base-4.9.0.0+instance Monad f => Monad (Rec1 f) where+  Rec1 x >>= f = Rec1 (x >>= \a -> unRec1 (f a))++-- | @since base-4.9.0.0+deriving instance MonadPlus f => MonadPlus (Rec1 f)++-- | @since base-4.9.0.0+instance MonadFix f => MonadFix (Rec1 f) where+    mfix f = Rec1 (mfix (unRec1 . f))++-- | @since base-4.12.0.0+deriving instance Semigroup (f p) => Semigroup (Rec1 f p)++-- | @since base-4.12.0.0+deriving instance Monoid (f p) => Monoid (Rec1 f p)++-- | @since 4.9.0.0+deriving instance Foldable f => Foldable (Rec1 f)++-- | @since 4.9.0.0+deriving instance Traversable f => Traversable (Rec1 f)++-- | Constants, additional parameters and recursion of kind @*@+type K1 :: forall (k :: Kind) . Type -> Type -> k -> Type+newtype K1 i c p = K1 { unK1 :: c }+  deriving ( Eq       -- ^ @since base-4.7.0.0+           , Ord      -- ^ @since base-4.7.0.0+           , Read     -- ^ @since base-4.7.0.0+           , Show     -- ^ @since base-4.7.0.0+           , Functor  -- ^ @since base-4.9.0.0+           , Generic  -- ^ @since base-4.7.0.0+           , Generic1 -- ^ @since base-4.9.0.0+           )++-- | @since base-4.12.0.0+instance Monoid c => Applicative (K1 i c) where+  pure _ = K1 mempty+  liftA2 _ = coerce (mappend :: c -> c -> c)+  (<*>) = coerce (mappend :: c -> c -> c)++-- | @since base-4.12.0.0+deriving instance Semigroup c => Semigroup (K1 i c p)++-- | @since base-4.12.0.0+deriving instance Monoid c => Monoid (K1 i c p)++-- | @since 4.9.0.0+deriving instance Foldable (K1 i c)++-- | @since 4.9.0.0+deriving instance Traversable (K1 i c)++-- | @since base-4.9.0.0+deriving instance Applicative f => Applicative (M1 i c f)++-- | @since base-4.9.0.0+deriving instance Alternative f => Alternative (M1 i c f)++-- | @since base-4.9.0.0+deriving instance Monad f => Monad (M1 i c f)++-- | @since base-4.9.0.0+deriving instance MonadPlus f => MonadPlus (M1 i c f)++-- | @since base-4.9.0.0+instance MonadFix f => MonadFix (M1 i c f) where+    mfix f = M1 (mfix (unM1 . f))++-- | @since base-4.12.0.0+deriving instance Semigroup (f p) => Semigroup (M1 i c f p)++-- | @since base-4.12.0.0+deriving instance Monoid (f p) => Monoid (M1 i c f p)++-- | @since 4.9.0.0+deriving instance Foldable f => Foldable (M1 i c f)++-- | @since 4.9.0.0+deriving instance Traversable f => Traversable (M1 i c f)++-- | Meta-information (constructor names, etc.)+type M1 :: forall (k :: Kind) . Type -> Type -> (k -> Type) -> k -> Type+-- XXX: c :: Meta+newtype M1 i c f p =+    M1 { unM1 :: f p }+  deriving ( Eq       -- ^ @since base-4.7.0.0+           , Ord      -- ^ @since base-4.7.0.0+           , Read     -- ^ @since base-4.7.0.0+           , Show     -- ^ @since base-4.7.0.0+           , Functor  -- ^ @since base-4.9.0.0+           , Generic  -- ^ @since base-4.7.0.0+           , Generic1 -- ^ @since base-4.9.0.0+           )++-- | Sums: encode choice between constructors+infixr 5 :+:+type (:+:) :: forall (k :: Kind) . (k -> Type) -> (k -> Type) -> k -> Type+data (:+:) f g p = L1 (f p) | R1 (g p)+  deriving ( Eq       -- ^ @since base-4.7.0.0+           , Ord      -- ^ @since base-4.7.0.0+           , Read     -- ^ @since base-4.7.0.0+           , Show     -- ^ @since base-4.7.0.0+           , Functor  -- ^ @since base-4.9.0.0+           , Generic  -- ^ @since base-4.7.0.0+           , Generic1 -- ^ @since base-4.9.0.0+           )++-- | @since 4.9.0.0+deriving instance (Foldable f, Foldable g) => Foldable (f :+: g)++-- | @since 4.9.0.0+deriving instance (Traversable f, Traversable g) => Traversable (f :+: g)++-- | Products: encode multiple arguments to constructors+infixr 6 :*:+type (:*:) :: forall (k :: Kind) . (k -> Type) -> (k -> Type) -> k -> Type+data (:*:) f g p = f p :*: g p+  deriving ( Eq       -- ^ @since base-4.7.0.0+           , Ord      -- ^ @since base-4.7.0.0+           , Read     -- ^ @since base-4.7.0.0+           , Show     -- ^ @since base-4.7.0.0+           , Functor  -- ^ @since base-4.9.0.0+           , Generic  -- ^ @since base-4.7.0.0+           , Generic1 -- ^ @since base-4.9.0.0+           )++-- | @since base-4.9.0.0+instance (Applicative f, Applicative g) => Applicative (f :*: g) where+  pure a = pure a :*: pure a+  (f :*: g) <*> (x :*: y) = (f <*> x) :*: (g <*> y)+  liftA2 f (a :*: b) (x :*: y) = liftA2 f a x :*: liftA2 f b y++-- | @since base-4.9.0.0+instance (Alternative f, Alternative g) => Alternative (f :*: g) where+  empty = empty :*: empty+  (x1 :*: y1) <|> (x2 :*: y2) = (x1 <|> x2) :*: (y1 <|> y2)++-- | @since base-4.9.0.0+instance (Monad f, Monad g) => Monad (f :*: g) where+  (m :*: n) >>= f = (m >>= \a -> fstP (f a)) :*: (n >>= \a -> sndP (f a))+    where+      fstP (a :*: _) = a+      sndP (_ :*: b) = b++-- | @since base-4.9.0.0+instance (MonadPlus f, MonadPlus g) => MonadPlus (f :*: g)++-- | @since base-4.9.0.0+instance (MonadFix f, MonadFix g) => MonadFix (f :*: g) where+    mfix f = mfix (fstP . f) :*: mfix (sndP . f)+      where+        fstP (a :*: _) = a+        sndP (_ :*: b) = b++-- | @since base-4.12.0.0+instance (Semigroup (f p), Semigroup (g p)) => Semigroup ((f :*: g) p) where+  (x1 :*: y1) <> (x2 :*: y2) = (x1 <> x2) :*: (y1 <> y2)++-- | @since base-4.12.0.0+instance (Monoid (f p), Monoid (g p)) => Monoid ((f :*: g) p) where+  mempty = mempty :*: mempty++-- | @since 4.9.0.0+deriving instance (Foldable f, Foldable g) => Foldable (f :*: g)++-- | @since 4.9.0.0+deriving instance (Traversable f, Traversable g) => Traversable (f :*: g)++-- | Composition of functors+infixr 7 :.:+type (:.:) :: forall (k2 :: Kind) (k1 :: Kind) . (k2 -> Type) -> (k1 -> k2) -> k1 -> Type+newtype (:.:) f g p =+    Comp1 { unComp1 :: f (g p) }+  deriving ( Eq       -- ^ @since base-4.7.0.0+           , Ord      -- ^ @since base-4.7.0.0+           , Read     -- ^ @since base-4.7.0.0+           , Show     -- ^ @since base-4.7.0.0+           , Functor  -- ^ @since base-4.9.0.0+           , Generic  -- ^ @since base-4.7.0.0+           , Generic1 -- ^ @since base-4.9.0.0+           )++-- | @since base-4.9.0.0+instance (Applicative f, Applicative g) => Applicative (f :.: g) where+  pure x = Comp1 (pure (pure x))+  Comp1 f <*> Comp1 x = Comp1 (liftA2 (<*>) f x)+  liftA2 f (Comp1 x) (Comp1 y) = Comp1 (liftA2 (liftA2 f) x y)++-- | @since base-4.9.0.0+instance (Alternative f, Applicative g) => Alternative (f :.: g) where+  empty = Comp1 empty+  (<|>) = coerce ((<|>) :: f (g a) -> f (g a) -> f (g a)) ::+    forall a . (f :.: g) a -> (f :.: g) a -> (f :.: g) a++-- | @since base-4.12.0.0+deriving instance Semigroup (f (g p)) => Semigroup ((f :.: g) p)++-- | @since base-4.12.0.0+deriving instance Monoid (f (g p)) => Monoid ((f :.: g) p)++-- | @since 4.9.0.0+deriving instance (Foldable f, Foldable g) => Foldable (f :.: g)++-- | @since 4.9.0.0+deriving instance (Traversable f, Traversable g) => Traversable (f :.: g)++-- | Tag for K1: recursion (of kind @Type@)+data R++-- | Type synonym for encoding recursion (of kind @Type@)+type Rec0  = K1 R++-- | Tag for M1: datatype+data D+-- | Tag for M1: constructor+data C+-- | Tag for M1: record selector+data S++-- | Type synonym for encoding meta-information for datatypes+type D1 = M1 D++-- | Type synonym for encoding meta-information for constructors+type C1 = M1 C++-- | Type synonym for encoding meta-information for record selectors+type S1 = M1 S++--------------------------------------------------------------------------------+-- Derived instances+--------------------------------------------------------------------------------++-- deriving Data.Complex causes a cycle.+-- Maybe break up this module to keep the Rep types in another module?++deriving instance Generic Bool+deriving instance Generic Char+deriving instance Generic Int+deriving instance Generic Int8+deriving instance Generic Int16+deriving instance Generic Int32+deriving instance Generic Int64+deriving instance Generic Integer+deriving instance Generic Word+deriving instance Generic Word8+deriving instance Generic Word16+deriving instance Generic Word32+deriving instance Generic Word64++--deriving instance Generic (Complex a)+deriving instance Generic [a]+deriving instance Generic (Maybe a)+deriving instance Generic (Ratio a)++deriving instance Generic (Either a b)++--deriving instance Generic1 Complex+deriving instance Generic1 []+deriving instance Generic1 Maybe+deriving instance Generic1 Ratio++deriving instance Generic ()+deriving instance Generic (Solo a)+deriving instance Generic ((,) a b)+deriving instance Generic ((,,) a b c)+deriving instance Generic ((,,,) a b c d)+deriving instance Generic ((,,,,) a b c d e)+deriving instance Generic ((,,,,,) a b c d e f)+deriving instance Generic ((,,,,,,) a b c d e f g)+deriving instance Generic ((,,,,,,,) a b c d e f g h)+deriving instance Generic ((,,,,,,,,) a b c d e f g h i)+deriving instance Generic ((,,,,,,,,,) a b c d e f g h i j)+deriving instance Generic ((,,,,,,,,,,) a b c d e f g h i j k)+deriving instance Generic ((,,,,,,,,,,,) a b c d e f g h i j k l)+deriving instance Generic ((,,,,,,,,,,,,) a b c d e f g h i j k l m)+deriving instance Generic ((,,,,,,,,,,,,,) a b c d e f g h i j k l m n)+deriving instance Generic ((,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o)++deriving instance Generic (First a)+deriving instance Generic (Last a)+deriving instance Generic (Ap f a)+deriving instance Generic1 First+deriving instance Generic1 Last+deriving instance Generic1 (Ap f)
lib/Mhs/Builtin.hs view
@@ -1,24 +1,30 @@ -- Copyright 2023-2025 Lennart Augustsson -- See LICENSE file for full license. module Mhs.Builtin(+  module Control.Applicative,+  module Control.Error,   module Control.Monad,   module Control.Monad.Fail,   module Control.Monad.Fix,   module Data.Bool,+  module Data.Bounded,   module Data.Char,   module Data.Coerce,   module Data.Data_Class,-  module Data.Enum,+  module Data.Enum_Class,   module Data.Eq, --  module Data.Foldable,   module Data.Fractional,   module Data.Function,   module Data.Functor,+  module Data.Ix,   module Data.Ord,   module Data.Num,   module Data.Records,+  module Data.Traversable,   module Data.Typeable,   module Data.Monoid.Internal,+  module Data.Proxy,   module Data.String,   module Text.ParserCombinators.ReadPrec,   module Text.Read.Internal,@@ -34,22 +40,24 @@ -- qualified, but under a name that cannot be used accidentally. -- If the Prelude is not imported, then neither is this module. import qualified Prelude()  -- no Prelude-import Control.Applicative(Applicative((<*>)))+import Control.Applicative(Applicative(pure, (<*>))) 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.Bounded(Bounded(..)) 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.Enum_Class(Enum(enumFrom, enumFromThen, enumFromTo, enumFromThenTo, fromEnum)) import Data.Eq(Eq(..)) --import Data.Foldable(Foldable(..)) import qualified Data.Foldable import Data.Fractional(Fractional(fromRational)) import Data.Function((.), id, flip) import Data.Functor(Functor(..), (<$>))+import Data.Ix(Ix(range, unsafeIndex, inRange, unsafeRangeSize)) import Data.Ord(Ord(..), Ordering(..)) import Data.Num(Num((+), (-), (*), fromInteger, negate)) import Data.Proxy(Proxy(..))
lib/Mhs/Reflect.hs view
@@ -27,7 +27,7 @@   deriving (Eq, Show)  reflect :: a -> IO (Exp a)-reflect a = Exp . parse . dropHeader <$> handleWriteToString (\ h -> hSerialize h a)+reflect a = Exp . parse . dropHeader <$> handleWriteToString (\ h -> hSerialize h a >> hFlush h)  -- The first two lines are version and number of definitions dropHeader = dropWhile (/= '\n') . drop 1 . dropWhile (/= '\n')
lib/Numeric/Show.hs view
@@ -6,7 +6,8 @@   showBin,   showHex,   showOct,-  showIntegral,+  showSignedInt,+  showUnsignedInt,   ) where import qualified Prelude()              -- do not import Prelude import Primitives@@ -41,12 +42,7 @@ showIntAtBase :: (Integral a) => a -> (Int -> Char) -> a -> ShowS showIntAtBase base toChr an   | base <= 1 = error "Numeric.showIntAtBase: unsupported base"-  | an < 0 =-    if -an < 0 then-      -- We are at minBound-      showPos (- quot an base) . showPos (- rem an base)-    else-      error "Numeric.showIntAtBase: negative argument"+  | an < 0 = error "Numeric.showIntAtBase: negative argument"   | otherwise = showPos an    where     showPos n r =@@ -70,5 +66,22 @@ showBin :: (Integral a) => a -> ShowS showBin = showIntAtBase 2  intToDigit -showIntegral :: (Integral a) => Int -> a -> ShowS-showIntegral = showSigned showInt+showSignedInt :: (Integral a) => Int -> a -> ShowS+showSignedInt p n r+  | n < 0 =+    if p > (6::Int) then+      '(' : '-' : showUnsignedNeg n (')' : r)+    else+      '-' : showUnsignedNeg n r+  | otherwise = showUnsignedNeg (-n) r++showUnsignedNeg :: (Integral a) => a -> ShowS+showUnsignedNeg n r =+  let c = primChr (primOrd '0' - fromIntegral (rem n 10))+  in  if n > -10 then+        c : r+      else+        showUnsignedNeg (quot n 10) (c : r)++showUnsignedInt :: (Integral a) => Int -> a -> ShowS+showUnsignedInt _ = showInt
lib/Prelude.hs view
@@ -21,15 +21,13 @@   module Data.Integral,   module Data.List,   module Data.Maybe,-  module Data.Monoid,+  module Data.Monoid.Internal,   module Data.Num,   module Data.Ord,   module Data.Ratio,   module Data.Real,   module Data.RealFloat,   module Data.RealFrac,-  module Data.Records,-  module Data.Semigroup,   module Data.String,   module Data.Traversable,   module Data.Tuple,@@ -59,7 +57,7 @@ import Data.Eq(Eq(..)) import Data.Float(Float) import Data.Floating(Floating(..))-import Data.Foldable(Foldable)+import Data.Foldable(Foldable(foldMap)) import Data.Fractional(Fractional(..), (^^), realToFrac) import Data.Function(id, const, (.), flip, ($), seq, ($!), until, asTypeOf) import Data.Functor(Functor(..), (<$>))@@ -74,17 +72,15 @@                  elem, notElem, lookup, zip, zip3, zipWith, zipWith3, unzip, unzip3,                  lines, words, unlines, unwords) import Data.Maybe(Maybe(..), maybe)-import Data.Monoid(Monoid(..))+import Data.Monoid.Internal(Monoid(..), Semigroup((<>))) import Data.Num(Num(..), subtract) import Data.Ord(Ord(..), Ordering(..)) import Data.Ratio(Rational) import Data.Real(Real(..)) import Data.RealFloat(RealFloat(..)) import Data.RealFrac(RealFrac(..))-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.Traversable(Traversable(traverse, sequenceA)) import Data.Tuple(fst, snd, curry, uncurry) import Data.Word.Word(Word) import System.IO(IO, putChar, putStr, putStrLn, print, getChar, getLine, getContents, interact,
lib/Primitives.hs view
@@ -101,6 +101,10 @@ primFloatFromInt64 = _primitive "Itof" primFloatFromInt :: Int -> Float primFloatFromInt = _primitive "itof"+primFloatFromWord :: Word -> Float+primFloatFromWord = _primitive "utof"+primFloatToInt :: Float -> Int+primFloatToInt = _primitive "ftoi"  primDoubleAdd :: Double -> Double -> Double primDoubleAdd  = _primitive "d+"@@ -129,17 +133,30 @@ primDoubleFromInt64 = _primitive "Itod" primDoubleFromInt :: Int -> Double primDoubleFromInt = _primitive "itod"+primDoubleFromWord :: Word -> Double+primDoubleFromWord = _primitive "utod"+primDoubleToInt :: Double -> Int+primDoubleToInt = _primitive "dtoi" +primFloatToDouble :: Float -> Double+primFloatToDouble = _primitive "ftod"+primDoubleToFloat :: Double -> Float+primDoubleToFloat = _primitive "dtof"+ primWordAdd :: Word -> Word -> Word-primWordAdd  = _primitive "+"+primWordAdd  = _primitive "u+" primWordSub :: Word -> Word -> Word-primWordSub  = _primitive "-"+primWordSub  = _primitive "u-" primWordMul :: Word -> Word -> Word-primWordMul  = _primitive "*"+primWordMul  = _primitive "u*" primWordQuot :: Word -> Word -> Word primWordQuot = _primitive "uquot" primWordRem :: Word -> Word -> Word primWordRem  = _primitive "urem"+primWordSubR :: Word -> Word -> Word+primWordSubR = _primitive "usubtract"+primWordNeg :: Word -> Word+primWordNeg = _primitive "uneg" primWordAnd :: Word -> Word -> Word primWordAnd  = _primitive "and" primWordOr :: Word -> Word -> Word@@ -372,6 +389,12 @@ primTryReadMVar :: MVar a -> IO b {-(Maybe a)-} primTryReadMVar = _primitive "IO.tryreadmvar" +primWaitWriteFD :: Int -> IO Int+primWaitWriteFD = _primitive "IO.waitwrfd"++primWaitReadFD :: Int -> IO Int+primWaitReadFD = _primitive "IO.waitrdfd"+ primThreadDelay :: Int -> IO () primThreadDelay = _primitive "IO.threaddelay" @@ -443,15 +466,19 @@ primInt64Ctz = _primitive "Ictz"  primWord64Add :: Word64 -> Word64 -> Word64-primWord64Add  = _primitive "I+"+primWord64Add  = _primitive "Iu+" primWord64Sub :: Word64 -> Word64 -> Word64-primWord64Sub  = _primitive "I-"+primWord64Sub  = _primitive "Iu-" primWord64Mul :: Word64 -> Word64 -> Word64-primWord64Mul  = _primitive "I*"+primWord64Mul  = _primitive "Iu*" primWord64Quot :: Word64 -> Word64 -> Word64 primWord64Quot = _primitive "Iuquot" primWord64Rem :: Word64 -> Word64 -> Word64 primWord64Rem  = _primitive "Iurem"+primWord64SubR :: Word64 -> Word64 -> Word64+primWord64SubR = _primitive "Iusubtract"+primWord64Neg :: Word64 -> Word64+primWord64Neg = _primitive "Iuneg" primWord64And :: Word64 -> Word64 -> Word64 primWord64And  = _primitive "Iand" primWord64Or :: Word64 -> Word64 -> Word64
lib/System/Compress.hs view
@@ -1,5 +1,7 @@ module System.Compress(   compress, decompress,+  compressLZ77, decompressLZ77,+  compressLZMA, decompressLZMA,   compressRLE, decompressRLE,   compressBWT, decompressBWT,   compressBWTRLE, decompressBWTRLE,@@ -28,6 +30,8 @@ foreign import ccall "add_rle_decompressor"  c_add_rle_decompressor  :: Transducer foreign import ccall "add_bwt_compressor"    c_add_bwt_compressor    :: Transducer foreign import ccall "add_bwt_decompressor"  c_add_bwt_decompressor  :: Transducer+foreign import ccall "add_lzma_compressor"   c_add_lzma_compressor   :: Transducer+foreign import ccall "add_lzma_decompressor" c_add_lzma_decompressor :: Transducer foreign import ccall "putb"                  c_putb                  :: Int -> PBFILE -> IO () foreign import ccall "getb"                  c_getb                  :: PBFILE -> IO Int foreign import ccall "get_mem"               c_get_mem               :: PBFILE -> Ptr CString -> Ptr Int -> IO ()@@ -62,10 +66,22 @@   return cs  compress :: [Char] -> [Char]-compress = withPutTransducer c_add_lz77_compressor+compress = compressLZMA  decompress :: [Char] -> [Char]-decompress = withGetTransducer c_add_lz77_decompressor+decompress = decompressLZMA++compressLZ77 :: [Char] -> [Char]+compressLZ77 = withPutTransducer c_add_lz77_compressor++decompressLZ77 :: [Char] -> [Char]+decompressLZ77 = withGetTransducer c_add_lz77_decompressor++compressLZMA :: [Char] -> [Char]+compressLZMA = withPutTransducer c_add_lzma_compressor++decompressLZMA :: [Char] -> [Char]+decompressLZMA = withGetTransducer c_add_lzma_decompressor  compressRLE :: [Char] -> [Char] compressRLE = withPutTransducer c_add_rle_compressor
lib/System/Compress/ByteString.hs view
@@ -20,19 +20,11 @@  type PBFILE = Ptr BFILE type Transducer = PBFILE -> 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 foreign import ccall "add_rle_decompressor"  c_add_rle_decompressor  :: Transducer-foreign import ccall "add_bwt_compressor"    c_add_bwt_compressor    :: Transducer-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_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
lib/System/Directory.hs view
@@ -1,21 +1,80 @@ module System.Directory(-  removeFile,-  doesFileExist,-  doesDirectoryExist,-  getDirectoryContents,-  listDirectory,-  setCurrentDirectory,-  getCurrentDirectory,-  withCurrentDirectory,-  createDirectory,-  createDirectoryIfMissing,-  copyFile,-  getHomeDirectory,-  getTemporaryDirectory,+    createDirectory+  , createDirectoryIfMissing+--  , removeDirectory+--  , removeDirectoryRecursive+--  , removePathForcibly+--  , renameDirectory+  , listDirectory+  , getDirectoryContents+  , getCurrentDirectory+  , setCurrentDirectory+  , withCurrentDirectory++  , getHomeDirectory+--  , XdgDirectory(..)+--  , getXdgDirectory+--  , XdgDirectoryList(..)+--  , getXdgDirectoryList+--  , getAppUserDataDirectory+--  , getUserDocumentsDirectory+  , getTemporaryDirectory++--  , getExecSearchPath++  , removeFile+--  , renameFile+--  , renamePath+  , copyFile+--  , copyFileWithMetadata+--  , getFileSize++--  , canonicalizePath+--  , makeAbsolute+--  , makeRelativeToCurrentDirectory++--  , doesPathExist+  , doesFileExist+  , doesDirectoryExist++--  , findExecutable+--  , findExecutables+--  , findExecutablesInDirectories+--  , findFile+--  , findFiles+--  , findFileWith+--  , findFilesWith+--  , exeExtension++--  , createFileLink+--  , createDirectoryLink+--  , removeDirectoryLink+--  , pathIsSymbolicLink+--  , getSymbolicLinkTarget++  , Permissions(..)+  , emptyPermissions+  , setOwnerReadable+  , setOwnerWritable+  , setOwnerExecutable+  , setOwnerSearchable++  , getPermissions+  , setPermissions+  , copyPermissions++--  , getAccessTime+--  , getModificationTime+--  , setAccessTime+--  , setModificationTime++--  , isSymbolicLink   ) where import qualified Prelude(); import MiniPrelude import Control.Exception(bracket) import Control.Monad(when)+import Data.Bits+import Foreign.C.Error import Foreign.C.String import Foreign.Marshal.Alloc import Foreign.Ptr@@ -25,7 +84,7 @@ data DIR data Dirent -foreign import ccall "unlink"   c_unlink   :: CString -> IO Int+foreign import ccall "remove"   c_remove   :: CString -> IO Int foreign import ccall "opendir"  c_opendir  :: CString -> IO (Ptr DIR) foreign import ccall "closedir" c_closedir :: Ptr DIR -> IO Int foreign import ccall "readdir"  c_readdir  :: Ptr DIR -> IO (Ptr Dirent)@@ -33,13 +92,17 @@ foreign import ccall "chdir"    c_chdir    :: CString -> IO Int foreign import ccall "mkdir"    c_mkdir    :: CString -> Int -> IO Int foreign import ccall "getcwd"   c_getcwd   :: CString -> Int -> IO CString+foreign import ccall "get_permissions"   c_getPermissions   :: CString -> IO Int+foreign import ccall "set_permissions"   c_setPermissions   :: CString -> Int -> IO Int ++-- XXX Use Foreign.C.Error++-- OK on Windows removeFile :: FilePath -> IO ()-removeFile fn = do-  r <- withCAString fn c_unlink-  when (r /= 0) $-    error "removeFile failed"+removeFile fn = throwErrnoIfMinus1_ "removeFile" $ withCAString fn c_remove +-- OK on Windows doesFileExist :: FilePath -> IO Bool doesFileExist fn = do   mh <- openFileM fn ReadMode@@ -47,6 +110,7 @@     Nothing -> return False     Just h  -> do { hClose h; return True } +-- Uses emulation in windows/extra.c doesDirectoryExist :: FilePath -> IO Bool doesDirectoryExist fn = withCAString fn $ \ cfn -> do   dp <- c_opendir cfn@@ -56,11 +120,10 @@     c_closedir dp     return True +-- Uses emulation in windows/extra.c getDirectoryContents :: FilePath -> IO [String] getDirectoryContents fn = withCAString fn $ \ cfn -> do-  dp <- c_opendir cfn-  when (dp == nullPtr) $-    error $ "getDirectoryContents: cannot open " ++ fn+  dp <- throwErrnoIfNull "getDirectoryContents" $ c_opendir cfn   let loop r = do         de <- c_readdir dp         if de == nullPtr then do@@ -75,19 +138,16 @@ listDirectory :: FilePath -> IO [String] listDirectory d = filter (\ n -> n /= "." && n /= "..") <$> getDirectoryContents d +-- OK on Windows setCurrentDirectory :: FilePath -> IO ()-setCurrentDirectory d = do-  r <- withCAString d c_chdir-  when (r /= 0) $-    error $ "setCurrentDirectory failed: " ++ d+setCurrentDirectory d = throwErrnoIfMinus1_ "setCurrentDirectory" $ withCAString d c_chdir +-- OK on Windows getCurrentDirectory :: IO FilePath getCurrentDirectory = do   let len = 10000   allocaBytes len $ \ p -> do-    cwd <- c_getcwd p len -- can return NULL if buffer to small-    when (cwd == nullPtr) $-      error "getCurrentDirectory"+    cwd <- throwErrnoIfNull "getCurrentDirectory" $ c_getcwd p len -- can return NULL if buffer to small     peekCAString cwd  withCurrentDirectory :: FilePath -> IO a -> IO a@@ -96,11 +156,9 @@     setCurrentDirectory dir     io +-- OK on Windows??? createDirectory :: FilePath -> IO ()-createDirectory d = do-  r <- withCAString d $ \ s -> c_mkdir s 0o775       -- rwxrwxr-x-  when (r /= 0) $-    error $ "Cannot create directory " ++ show d+createDirectory d = throwErrnoIfMinus1_ "createDirectory" $ withCAString d $ \ s -> c_mkdir s 0o775       -- rwxrwxr-x  createDirectoryIfMissing :: Bool -> FilePath -> IO () createDirectoryIfMissing False d = do@@ -109,11 +167,13 @@ createDirectoryIfMissing True d = do   let ds = scanl1 (\ x y -> x ++ "/" ++ y) . split [] $ d       split r [] = [r]-      split r ('/':cs) = r : split [] cs-      split r (c:cs) = split (r ++ [c]) cs+      split r (c:cs) | isPathSeparator c = r : split [] cs+                     | otherwise         = split (r ++ [c]) cs   mapM_ (createDirectoryIfMissing False) ds --- XXX does not copy flags+isPathSeparator :: Char -> Bool+isPathSeparator c = c == '/' || _isWindows && c == '\\'+ copyFile :: FilePath -> FilePath -> IO () copyFile src dst = do   hsrc <- openBinaryFile src ReadMode@@ -125,21 +185,65 @@ getHomeDirectory :: IO FilePath getHomeDirectory =   if _isWindows then do-    user <- getEnv "USERNAME"-    return $ "C:/Users/" ++ user    -- it's a guess+    mhome <- lookupEnv "USERPROFILE"+    case mhome of+      Just home -> return home+      Nothing -> do+        drive <- getEnv "HOMEDRIVE"+        path <- getEnv "HOMEPATH"+        return $ drive ++ "\\" ++ path   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"+  if _isWindows then+    tmp "TMP"    $ tmp "TEMP" $ tmp "USERPROFILE" $ return "C:\\Windows\\Temp"   else-    fromMaybe "/tmp" <$> lookupEnv "TMP"+    tmp "TMPDIR" $ tmp "TNP"  $ tmp "TEMP"        $ return "/tmp"+  where tmp :: String -> IO String -> IO String+        tmp e els = maybe els return =<< lookupEnv e++data Permissions+  = Permissions+  { readable :: Bool+  , writable :: Bool+  , executable :: Bool+  , searchable :: Bool+  } deriving (Eq, Ord, Show)++emptyPermissions :: Permissions+emptyPermissions = Permissions {+                       readable   = False,+                       writable   = False,+                       executable = False,+                       searchable = False+                   }++setOwnerReadable :: Bool -> Permissions -> Permissions+setOwnerReadable b p = p { readable = b }++setOwnerWritable :: Bool -> Permissions -> Permissions+setOwnerWritable b p = p { writable = b }++setOwnerExecutable :: Bool -> Permissions -> Permissions+setOwnerExecutable b p = p { executable = b }++setOwnerSearchable :: Bool -> Permissions -> Permissions+setOwnerSearchable b p = p { searchable = b }++getPermissions :: FilePath -> IO Permissions+getPermissions fp = withCAString fp $ \ cp -> do+  p <- throwErrnoIfMinus1 "getPermissions" $ c_getPermissions cp+  return Permissions { readable   = (p .&. 4) /= 0+                     , writable   = (p .&. 2) /= 0+                     , executable = (p .&. 1) /= 0+                     , searchable = (p .&. 8) /= 0 }++setPermissions :: FilePath -> Permissions -> IO ()+setPermissions fp p = throwErrnoIfMinus1_ "setPermissions" $ withCAString fp $ \ cp -> c_setPermissions cp ip+  where ip = b readable 4 .|. b writable 2 .|. b executable 1 .|. b searchable 8+        b sel x = if sel p then x else 0++copyPermissions :: FilePath -> FilePath -> IO ()+copyPermissions src dst = getPermissions src >>= setPermissions dst
lib/System/Environment.hs view
@@ -9,6 +9,7 @@   getEnvironment,   setEnv,   unsetEnv,+  getExecutablePath,   ) where import qualified Prelude(); import MiniPrelude import Primitives@@ -17,6 +18,7 @@ import Data.List(span) import Foreign.C.Error import Foreign.C.String+import Foreign.Marshal.Alloc import Foreign.Marshal.Array import Foreign.Ptr import System.IO@@ -95,3 +97,12 @@   chkKey "unsetEnv" key   withCAString key $ \ ckey ->     throwErrnoIfMinus1_ "unsetEnv" $ c_unsetenv ckey++foreign import ccall get_executable_path :: IO CString++getExecutablePath :: IO FilePath+getExecutablePath = do+  p <- throwErrnoIfNull "get_executable_path" get_executable_path+  s <- peekCAString p+  free p+  return s
lib/System/IO/Error.hs view
@@ -84,6 +84,7 @@ import Data.Records   -- needed since we don't import Mhs.Builtin import Data.String import {-# SOURCE #-} Data.Typeable+import Foreign.C.Types (CInt) import System.IO.Internal import Text.Show @@ -103,7 +104,7 @@      ioe_type     :: IOErrorType,    -- ^ what it was.      ioe_location :: String,         -- ^ location.      ioe_description :: String,      -- ^ error type specific information.-     ioe_errno    :: Maybe Int,      -- ^ errno leading to this error, if any.+     ioe_errno    :: Maybe CInt,     -- ^ errno leading to this error, if any.      ioe_filename :: Maybe FilePath  -- ^ filename the error is related to                                      --   (some libraries may assume different encodings                                      --   when constructing this field from e.g. 'ByteString'
+ lib/System/IO/FD.hs view
@@ -0,0 +1,9 @@+module System.IO.FD (waitForReadFD, waitForWriteFD) where+import Primitives+import Foreign.C.Error++waitForReadFD :: Int -> IO ()+waitForReadFD = throwErrnoIfMinus1_ "waitForReadFD" . primWaitReadFD++waitForWriteFD :: Int -> IO ()+waitForWriteFD = throwErrnoIfMinus1_ "waitForWriteFD" . primWaitWriteFD
lib/System/IO/Internal.hs view
@@ -44,7 +44,7 @@ type FilePath = String  data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode-  deriving (Eq, Ord, Enum)+  deriving (Eq, Ord, Enum, Show)  ioModeToHMode :: IOMode -> HandleState ioModeToHMode ReadMode = HRead@@ -112,7 +112,7 @@     p' <- trans p                 -- add transducer     mode <- readIORef st     killHandle h                  -- old handle should not be finalized,-    mkHandle desc p' mode         --   because the new handle will do that+    mkHandle ("trans-" ++ desc) p' mode         --   because the new handle will do that  ---------------------------------------- 
lib/System/IO/MD5.hs view
@@ -5,7 +5,7 @@ import Primitives(primPerformIO) import Control.DeepSeq.Class import Data.Coerce-import Data.Word.Word+import Data.Word(Word32) import Foreign.C.String import Foreign.Marshal.Alloc import Foreign.Marshal.Array@@ -13,26 +13,30 @@ import System.IO import System.IO.Internal -foreign import ccall "md5BFILE"  c_md5BFILE  :: Ptr BFILE -> Ptr Word -> IO ()-foreign import ccall "md5String" c_md5String :: CString   -> Ptr Word -> IO ()-foreign import ccall "md5Array"  c_md5Array  :: Ptr Word  -> Ptr Word -> Int -> IO ()+-- XXX change this to use hex bytestrings instead. -newtype MD5CheckSum = MD5 [Word]  -- either 2*64 bits or 4*32 bits+foreign import ccall "md5BFILE"  c_md5BFILE  :: Ptr BFILE  -> Ptr Word32 -> IO ()+foreign import ccall "md5String" c_md5String :: CString    -> Ptr Word32 -> IO ()+foreign import ccall "md5Array"  c_md5Array  :: Ptr Word32 -> Ptr Word32 -> Int -> IO ()++newtype MD5CheckSum = MD5 [Word32]  -- 4*32 bits   deriving (Eq, Ord)  instance Show MD5CheckSum where   show (MD5 ws) = "MD5" ++ show ws  instance NFData MD5CheckSum where-  rnf (MD5 ws) = rnf ws+  rnf (MD5 ws) = loop ws+    where loop [] = ()+          loop (a:as) = a `seq` loop as  md5Len :: Int md5Len = 16   -- The MD5 checksum is 16 bytes -md5WLen :: Int  -- length in words-md5WLen = (md5Len * 8) `quot` _wordSize+md5WLen :: Int  -- length in Word32+md5WLen = md5Len `quot` 4 -chksum :: (Ptr Word -> IO ()) -> IO MD5CheckSum+chksum :: (Ptr Word32 -> IO ()) -> IO MD5CheckSum chksum fn = do   buf <- mallocArray md5WLen   fn buf
lib/System/IO/Open.hs view
@@ -9,6 +9,7 @@ import Data.Char import Data.Function import Data.Functor+import Data.List_Type import Data.Maybe import Foreign.C.String import Foreign.Ptr@@ -39,14 +40,15 @@ stderr :: Handle stderr = unsafeHandle primStderr HWrite "stderr" -openFILEM :: FilePath -> IOMode -> IO (Maybe (Ptr FILE))-openFILEM p m = do+openFILEM :: FilePath -> IOMode -> Bool -> IO (Maybe (Ptr FILE))+openFILEM p m bin = do   let     ms = case m of           ReadMode -> "r"           WriteMode -> "w"           AppendMode -> "a"           ReadWriteMode -> "w+"+         ++ if bin then "b" else ""   h <- withCAString p $ \cp -> withCAString ms $ \ cm -> c_fopen cp cm   if h == nullPtr then     return Nothing@@ -55,14 +57,14 @@  openFileM :: FilePath -> IOMode -> IO (Maybe Handle) openFileM fn m = do-  mf <- openFILEM fn m+  mf <- openFILEM fn m False   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+  mf <- openFILEM fn m True   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,6 +1,7 @@--- Copyright 2023-2025 Lennart Augustsson+-- Copyright 2023-2026 Lennart Augustsson -- See LICENSE file for full license. module System.IO.PrintOrRun(PrintOrRun(..), _withArgs) where+import System.CPUTime import System.Environment import System.IO.TimeMilli import System.RTS@@ -15,10 +16,13 @@   _printOrRunStats a = do     t1 <- getTimeMilli     s1 <- getStats+    c1 <- getCPUTime     r <- a+    c2 <- getCPUTime     s2 <- getStats     t2 <- getTimeMilli-    putStrLn $ "(" ++ show (t2 - t1) ++ "ms, " +++    putStrLn $ "(" ++ show (t2 - t1) ++ "ms (elapsed), " +++                show ((c2 - c1) `div` 1000_000_000) ++ "ms (cpu), " ++                 show (reductions s2 - reductions s1) ++ " reds, " ++                 show (cellsAllocated s2 - cellsAllocated s1) ++ " cells)"     return r;
lib/System/IO/Serialize.hs view
@@ -3,12 +3,15 @@ module System.IO.Serialize(   hSerialize, hDeserialize,   writeSerialized, writeSerializedCompressed,-  readSerialized,+  readSerialized, readSerializedH, readSerializedBS,+  writeSerializedCompressedBS, writeSerializedBS,   ) where import qualified Prelude(); import MiniPrelude import Primitives(Ptr)+import Data.ByteString(ByteString) import System.IO import System.IO.Internal+import System.IO.StringHandle(withByteStringHandle, handleWriteToByteString)  primHSerialize   :: forall a . Ptr BFILE -> a -> IO () primHSerialize    = _primitive "IO.serialize"@@ -27,27 +30,48 @@   hSerialize h s   hClose h -foreign import ccall "add_lz77_compressor" c_add_lz77_compressor :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall "add_lz77_compressor"   c_add_lz77_compressor   :: Ptr BFILE -> IO (Ptr BFILE) foreign import ccall "add_lz77_decompressor" c_add_lz77_decompressor :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall "add_lzma_compressor"   c_add_lzma_compressor   :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall "add_lzma_decompressor" c_add_lzma_decompressor :: Ptr BFILE -> IO (Ptr BFILE)  writeSerializedCompressed :: forall a . FilePath -> a -> IO () writeSerializedCompressed p s = do   h <- openBinaryFile p WriteMode-  hPutChar h 'z'                               -- indicate compressed-  h' <- addTransducer c_add_lz77_compressor h+  hPutChar h 'q'                               -- indicate compressed+  h' <- addTransducer c_add_lzma_compressor h   hSerialize h' s-  hClose h'+  hFlush h'  -- Read compressed or uncompressed-readSerialized :: forall a . FilePath -> IO a-readSerialized p = do-  h <- openBinaryFile p ReadMode+readSerialized :: FilePath -> IO a+readSerialized p = openBinaryFile p ReadMode >>= readSerializedH++readSerializedBS :: ByteString -> IO a+readSerializedBS bs = withByteStringHandle bs readSerializedH++readSerializedH :: Handle -> IO a+readSerializedH h = do   c <- hLookAhead h-  h' <- if c == 'z' then do                    -- compressed?-          hGetChar h   -- get rid of the 'z'-          addTransducer c_add_lz77_decompressor h+  h' <- if c == 'q' then do                    -- compressed?+          hGetChar h   -- get rid of the 'q'+          addTransducer c_add_lzma_decompressor h         else           return h   a <- hDeserialize h'   hClose h'   return a++writeSerializedCompressedBS :: a -> IO ByteString+writeSerializedCompressedBS a =+  handleWriteToByteString $ \ h -> do+    hPutChar h 'q'                               -- indicate compressed+    h' <- addTransducer c_add_lzma_compressor h+    hSerialize h' a+    hFlush h'++writeSerializedBS :: a -> IO ByteString+writeSerializedBS a =+  handleWriteToByteString $ \ h -> do+    hSerialize h a+    hFlush h
lib/System/IO/StringHandle.hs view
@@ -1,7 +1,9 @@-module System.IO.StringHandle(handleWriteToString, stringToHandle) where+module System.IO.StringHandle(handleWriteToString, stringToHandle, withByteStringHandle, handleWriteToByteString) where import Prelude; import MiniPrelude+import qualified Data.ByteString.Internal as BS import Foreign.C.String import Foreign.C.Types+import Foreign.ForeignPtr import Foreign.Marshal.Alloc import Foreign.Marshal.Utils import Foreign.Ptr@@ -14,13 +16,12 @@ 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+-- The action should flush, but not close not the handle. handleWriteToString :: (Handle -> IO ()) -> IO String handleWriteToString act = do   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_mem bf bufp lenp                   -- get buffer and length@@ -28,7 +29,8 @@       len <- peek lenp       res <- peekCAStringLen (buf, len)        -- encode as a string       free buf                                 -- free owned memory-      hClose h                                 -- close+      -- Things go wrong if we close here and have stacked transducers.+      -- Let the GC close.       return res  -- Make a Handle that will read from a String.@@ -38,3 +40,29 @@   (ptr, len) <- newCAStringLen file            -- make memory buffer   bf <- c_openb_rd_mem ptr len                 -- open it for reading   mkHandle "stringToHandle" bf HRead           -- and make a handle++-- Turn all writes to a Handle into a ByteString.+-- The action should flush, but not close not the handle.+handleWriteToByteString :: (Handle -> IO ()) -> IO BS.ByteString+handleWriteToByteString act = do+  bf <- c_openb_wr_mem                         -- create a buffer+  h <- mkHandle "handleToByteString" bf HWrite+  act h+  with nullPtr $ \ bufp ->+    with 0 $ \ lenp -> do+      c_get_mem bf bufp lenp                   -- get buffer and length+      buf <- peek bufp+      len <- peek lenp+      res <- BS.primPackCStringLen buf len        -- create the bytestring+      free buf                                 -- free owned memory+      -- Things go wrong if we close here and have stacked transducers.+      -- Let the GC close.+      return res++withByteStringHandle :: BS.ByteString -> (Handle -> IO a) -> IO a+withByteStringHandle bs act = do+  let fp = BS.primBS2FPtr bs+  withForeignPtr fp $ \ p -> do+    bf <- c_openb_rd_mem p (BS.primBSlength bs)+    h <- mkHandle "withByteStringHandle" bf HRead+    act h
lib/System/IO/Transducers.hs view
@@ -1,18 +1,20 @@ module System.IO.Transducers(-  addUTF8, addCRLF, addBuffer, addLZ77, addRLE, addBWT, addBase64,+  addUTF8, addCRLF, addBuffer,+  addCompress,+  addLZ77, addRLE, addBWT, addBase64, addLZMA,   ) 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_lzma_compressor   :: Ptr BFILE -> IO (Ptr BFILE)+foreign import ccall add_lzma_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)@@ -42,8 +44,15 @@ defaultBufSize :: Int defaultBufSize = 512 +-- Add the default compressor+addCompress :: Handle -> IO Handle+addCompress = addLZ77+ addLZ77 :: Handle -> IO Handle addLZ77 = addTransducerRW add_lz77_decompressor add_lz77_compressor++addLZMA :: Handle -> IO Handle+addLZMA = addTransducerRW add_lzma_decompressor add_lzma_compressor  addRLE :: Handle -> IO Handle addRLE = addTransducerRW add_rle_decompressor add_rle_compressor
lib/System/Info.hs view
@@ -1,18 +1,17 @@ module System.Info(os, arch, compilerName, compilerVersion, fullCompilerVersion) where-import Control.Monad import Data.Char import Data.Version-import System.Cmd-import System.Directory-import System.Exit-import System.IO+import System.Process import System.IO.Unsafe  os :: String os = if _isWindows then "windows" else uname "-s"  arch :: String-arch = if _isWindows then "x86_64" else uname "-m"+arch = if _isWindows then if _wordSize == 64 then "x86_64" else "x86" else+  case uname "-m" of+    "arm64" -> "aarch64"     -- match ghc+    s       -> s  compilerName :: String compilerName = "mhs"@@ -20,16 +19,11 @@ compilerVersion :: Version compilerVersion = fullCompilerVersion { versionBranch = take 2 (versionBranch fullCompilerVersion) } --- Assume the system has an uname command+-- Assume the system has an uname command. uname :: String -> String uname flag = unsafePerformIO $ do-  (fn, h) <- openTmpFile "uname"-  hClose h-  rc <- system $ "uname " ++ flag ++ " >" ++ fn-  res <- readFile fn-  removeFile fn-  when (rc /= ExitSuccess) $-    error "System.Into: uname failed"+  res <- readProcess "uname" [flag] ""   return $ map toLower $ filter (not . isSpace) res -fullCompilerVersion = makeVersion [0,15,0,0]+fullCompilerVersion :: Version+fullCompilerVersion = makeVersion [0,16,0,0]
lib/System/Process.hs view
@@ -1,5 +1,6 @@ module System.Process(   callCommand,+  callProcess,   system,   readProcess,   ) where@@ -20,6 +21,9 @@     ExitSuccess -> return ()     ExitFailure r -> error $ "callCommand: failed " ++ show r ++ ", cmd=\n" ++ show cmd +callProcess :: String -> [String] -> IO ()+callProcess cmd = callCommand . unwords . (:) cmd+ system :: String -> IO ExitCode system cmd = do   r <- withCAString cmd systemc@@ -36,9 +40,10 @@   hPutStr hin sin   hClose hin   (fout, hout) <- openTempFile tmpDir "out.txt"+  hClose hout   bracket_ (return ())            (removeFile fin >> removeFile fout)            (do                callCommand $ unwords $ cmd : ("<" ++ fin) : (">" ++ fout) : args-               res <- hGetContents hout-               length res `seq` return res)+               res <- readFile fout+               seq (length res) $ return res)
lib/Text/Printf.hs view
@@ -96,6 +96,8 @@ import Data.Int import Data.List (stripPrefix) import Data.Maybe+import qualified Data.Text as T+import qualified Data.Text.Lazy as TL import Data.Word import Numeric.Show import Numeric.FormatFloat(showEFloat, showFFloat, showGFloat, showFFloatAlt, showGFloatAlt)@@ -399,6 +401,12 @@ -- | @since 2.01 instance PrintfArg Double where     formatArg = formatRealFloat++instance PrintfArg T.Text where+    formatArg txt = formatString $ T.unpack txt++instance PrintfArg TL.Text where+    formatArg txt = formatString $ TL.unpack txt  -- | This class, with only the one instance, is used as -- a workaround for the fact that 'String', as a concrete
lib/Text/Read/Internal.hs view
@@ -57,6 +57,7 @@ import Data.Fractional import Data.Function import Data.Maybe+import Data.Monoid import Data.Int import Data.Integer import Data.Integral@@ -594,7 +595,9 @@  -- | @since base-2.01 instance Read Int where-  readPrec     = readNumber convertInt+  -- Just using (readNumber convertInt) generates an overflow in negate for minInt.+  -- So we force the conversion to return the Integer, and convert after negation.+  readPrec     = fmap fromInteger (readNumber convertInt)   readListPrec = readListPrecDefault   readList     = readListDefault @@ -773,6 +776,61 @@   readListPrec = readListPrecDefault   readList     = readListDefault +-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h,+          Read i, Read j, Read k)+        => Read (a, b, c, d, e, f, g, h, i, j, k) where+  readPrec = wrap_tup (do { (a,b,c,d,e,f,g,h) <- read_tup8; read_comma+                          ; (i,j) <- read_tup2; read_comma+                          ; k <- readPrec+                          ; return (a,b,c,d,e,f,g,h,i,j,k) })+  readListPrec = readListPrecDefault+  readList     = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h,+          Read i, Read j, Read k, Read l)+        => Read (a, b, c, d, e, f, g, h, i, j, k, l) where+  readPrec = wrap_tup (do { (a,b,c,d,e,f,g,h) <- read_tup8; read_comma+                          ; (i,j,k,l) <- read_tup4+                          ; return (a,b,c,d,e,f,g,h,i,j,k,l) })+  readListPrec = readListPrecDefault+  readList     = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h,+          Read i, Read j, Read k, Read l, Read m)+        => Read (a, b, c, d, e, f, g, h, i, j, k, l, m) where+  readPrec = wrap_tup (do { (a,b,c,d,e,f,g,h) <- read_tup8; read_comma+                          ; (i,j,k,l) <- read_tup4; read_comma+                          ; m <- readPrec+                          ; return (a,b,c,d,e,f,g,h,i,j,k,l,m) })+  readListPrec = readListPrecDefault+  readList     = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h,+          Read i, Read j, Read k, Read l, Read m, Read n)+        => Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n) where+  readPrec = wrap_tup (do { (a,b,c,d,e,f,g,h) <- read_tup8; read_comma+                          ; (i,j,k,l) <- read_tup4; read_comma+                          ; (m,n) <- read_tup2+                          ; return (a,b,c,d,e,f,g,h,i,j,k,l,m,n) })+  readListPrec = readListPrecDefault+  readList     = readListDefault++-- | @since base-2.01+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h,+          Read i, Read j, Read k, Read l, Read m, Read n, Read o)+        => Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) where+  readPrec = wrap_tup (do { (a,b,c,d,e,f,g,h) <- read_tup8; read_comma+                          ; (i,j,k,l) <- read_tup4; read_comma+                          ; (m,n) <- read_tup2; read_comma+                          ; o <- readPrec+                          ; return (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) })+  readListPrec = readListPrecDefault+  readList     = readListDefault+ instance Read Int8 where     readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s] @@ -791,3 +849,11 @@  deriving newtype instance Read IntPtr deriving newtype instance Read WordPtr++--------------------------------------------------------------+-- Data.Monoid instances of Read+--------------------------------------------------------------++deriving instance Read a => Read (First a)+deriving instance Read a => Read (Last a)+deriving instance Read (f a) => Read (Ap f a)
lib/dist-mcabal/autogen/Paths_base.hs view
@@ -1,4 +1,5 @@ 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"+version :: Version; version = makeVersion [0,16,0,0]+getDataDir :: IO FilePath; getDataDir = return "/Users/augustss/.mcabal/mhs-0.16.0.0/packages/base-0.16.0.0/data"+getDataFileName :: FilePath -> IO FilePath; getDataFileName name = fmap (++ '/' : name) getDataDir
+ mhs.conf view
@@ -0,0 +1,83 @@+-- mhs keys+--  packageDbPath  package lookup path+--                 The path is expanded from the environment.+--                 $MHSPKG is always the package directory relative+--                 to the mhs binary, and $VERSION is the compiler version.+[mhs]+packageDbPath = "$MHSPKG:$HOME/.mcabal-user/mhs-$VERSION"++-- Target keys+--  cc        C compiler to use, default "cc"+--  ccflags   flags to pass at the beginning of the compiler command, default ""+--  cclibs    flags to pass at the end of the compilation command, default ""+--  conf      the config directory to use, default "unix"+--  cout      flag to set the output file to cc, default "-o"++-- If no target is set, we use 'unix' on non-Windows and 'windows' on Windows.++-- Typical Unix-like flags+-- Assumes gcc or clang+[unix]+cc = "cc"+ccflags = "-w -Wall -O3 "+cclibs = " -lm"+conf = "unix"++-- As above, but with -flto+-- This flag improves performance, but generates a warning with gcc.+[unix_lto]+cc = "cc"+ccflags = "-w -Wall -O3 -flto "+cclibs = " -lm"+conf = "unix"++-- As above, but with the non-portable flag -march=native+[unix_x86]+cc = "cc"+ccflags = "-w -Wall -O3 -flto -march=native "+cclibs = " -lm"+conf = "unix"++-- Compile with debugging instead of optimization+[debug]+cc = "cc"+ccflags = "-w -Wall -g"+cclibs = "-lm"+conf = "unix"++-- Generate JavaScript&Wasm+[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"++-- Generate JavaScript&Wasm, with xterm.js support+[emscripten_web]+cc = "emcc"+ccflags = "-O3 -sASYNCIFY -sEXPORTED_FUNCTIONS=['_main','_set_input_char'] -sEXPORTED_RUNTIME_METHODS=['FS','ccall'] -sFORCE_FILESYSTEM=1 -sALLOW_MEMORY_GROWTH -sTOTAL_STACK=5MB -sSINGLE_FILE -DUSE_WEB_INPUT -Wno-address-of-packed-member"+cclibs = "-lm"+conf = "unix"++-- Use the Tiny C Compiler+[tcc]+cc = "tcc"+ccflags = "-D__TCC__=1"+cclibs = "-lm"+conf = "unix"++-- Windows flags, with stdout supressed+[windows]+cc = "cl > NUL /nologo"+ccflags = "-O2"+cclibs = ""+conf = "windows"+cout = "-Fe"++-- Take all flags from environment variables+[environment]+-- Get all values from the environment+cc = "$CC"+ccflags = "$MHSCCFLAGS"+cclibs = "$MHSCCLIBS"+conf = "$MHSCONF"
+ mhs.conf.in view
@@ -0,0 +1,83 @@+-- mhs keys+--  packageDbPath  package lookup path+--                 The path is expanded from the environment.+--                 $MHSPKG is always the package directory relative+--                 to the mhs binary, and $VERSION is the compiler version.+[mhs]+packageDbPath = "$MHSPKG:$HOME/.mcabal-user/mhs-$VERSION"++-- Target keys+--  cc        C compiler to use, default "cc"+--  ccflags   flags to pass at the beginning of the compiler command, default ""+--  cclibs    flags to pass at the end of the compilation command, default ""+--  conf      the config directory to use, default "unix"+--  cout      flag to set the output file to cc, default "-o"++-- If no target is set, we use 'unix' on non-Windows and 'windows' on Windows.++-- Typical Unix-like flags+-- Assumes gcc or clang+[unix]+cc = "cc"+ccflags = "-w -Wall -O3 %GMPFLAGS"+cclibs = "%GMPLIBS -lm"+conf = "unix"++-- As above, but with -flto+-- This flag improves performance, but generates a warning with gcc.+[unix_lto]+cc = "cc"+ccflags = "-w -Wall -O3 -flto %GMPFLAGS"+cclibs = "%GMPLIBS -lm"+conf = "unix"++-- As above, but with the non-portable flag -march=native+[unix_x86]+cc = "cc"+ccflags = "-w -Wall -O3 -flto -march=native %GMPFLAGS"+cclibs = "%GMPLIBS -lm"+conf = "unix"++-- Compile with debugging instead of optimization+[debug]+cc = "cc"+ccflags = "-w -Wall -g"+cclibs = "-lm"+conf = "unix"++-- Generate JavaScript&Wasm+[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"++-- Generate JavaScript&Wasm, with xterm.js support+[emscripten_web]+cc = "emcc"+ccflags = "-O3 -sASYNCIFY -sEXPORTED_FUNCTIONS=['_main','_set_input_char'] -sEXPORTED_RUNTIME_METHODS=['FS','ccall'] -sFORCE_FILESYSTEM=1 -sALLOW_MEMORY_GROWTH -sTOTAL_STACK=5MB -sSINGLE_FILE -DUSE_WEB_INPUT -Wno-address-of-packed-member"+cclibs = "-lm"+conf = "unix"++-- Use the Tiny C Compiler+[tcc]+cc = "tcc"+ccflags = "-D__TCC__=1"+cclibs = "-lm"+conf = "unix"++-- Windows flags, with stdout supressed+[windows]+cc = "cl > NUL /nologo"+ccflags = "-O2"+cclibs = ""+conf = "windows"+cout = "-Fe"++-- Take all flags from environment variables+[environment]+-- Get all values from the environment+cc = "$CC"+ccflags = "$MHSCCFLAGS"+cclibs = "$MHSCCLIBS"+conf = "$MHSCONF"
mhs/MHSPrelude.hs view
@@ -7,6 +7,7 @@   module Data.Bool,   module Data.Bounded,   module Data.Char,+  module Data.Coerce,   module Data.Double,   module Data.Either,   module Data.Enum,@@ -26,6 +27,7 @@   module Data.Ratio,   module Data.Real,   module Data.Records,+  module Data.Semigroup,   module Data.String,   module Data.Tuple,   module Data.Typeable,@@ -51,6 +53,7 @@ import Data.Bool(Bool(..), (&&), (||), not, otherwise) import Data.Bounded(Bounded(..)) import Data.Char(Char, String)+import Data.Coerce(coerce) import Data.Double(Double) import Data.Either(Either(..), either) import Data.Enum(Enum(..))@@ -77,6 +80,7 @@ import Data.Ratio(Rational) import Data.Real(Real(..)) import Data.Records  -- needed for data types with fields+import Data.Semigroup import Data.String(IsString(..), lines, unlines, words, unwords) import Data.Tuple(fst, snd, curry, uncurry) import System.IO.Base(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,
mhs/System/Console/SimpleReadline.hs view
@@ -190,6 +190,15 @@         back (n + length after)   -- put cursor back         tabLoop (ss ++ [s])       -- try next alternative +    utf8 i | i `quot` 32 ==  6 = utf8' 1 (i `rem` 32)+           | i `quot` 16 == 14 = utf8' 2 (i `rem` 16)+           | i `quot`  8 == 30 = utf8' 3 (i `rem`  8)+           | otherwise         = noop+    utf8' 0 c = add (chr c)+    utf8' n c = do+      d <- getRaw+      utf8' (n - 1 :: Int) (c * 64 + ord d `rem` 64)+     exec i =       case i of         '\^D' ->                     -- CTL-D, EOF@@ -221,7 +230,17 @@               'B' -> next               'C' -> forward               'D' -> backward+              'F' -> eol+              'H' -> bol+              _ | isDigit c -> do+                    d <- getRaw+                    case (c,d) of+                      ('1','~') -> bol+                      ('3','~') -> del+                      ('4','~') -> eol+                      _         -> noop               _   -> noop+        _ | ord i >= 128 -> utf8 (ord i)         _ -> if i >= ' ' && i < '\DEL' then add i else noop    exec cmd
mhs/System/FilePath.hs view
@@ -42,7 +42,7 @@                   | otherwise -} = a ++ pathSeparator : b  pathSeparator :: Char-pathSeparator = '/'+pathSeparator = if _isWindows then '\\' else '/'  isPathSeparator :: Char -> Bool isPathSeparator = (pathSeparator ==)
− paths/Paths_MicroHs.hs
@@ -1,13 +0,0 @@--- This module is used when we are not compiling with cabal/mcabal.-module Paths_MicroHs(-  version,-  getDataDir,-  ) where-import qualified Prelude(); import MHSPrelude-import Data.Version--getDataDir :: IO FilePath-getDataDir = return "."--version :: Version-version = makeVersion [0,15,0,0]
src/MicroHs/Builtin.hs view
@@ -21,6 +21,6 @@ mkBuiltin :: SLoc -> String -> Ident mkBuiltin loc name = qualIdent builtinMdl (mkIdentSLoc loc name) --- Identifier for a builtin that is alread renamed.+-- Identifier for a builtin that is already renamed. mkBuiltinQ :: SLoc -> String -> Ident mkBuiltinQ loc name = qualIdent builtinMdlQ (mkIdentSLoc loc name)
src/MicroHs/Compile.hs view
@@ -13,13 +13,15 @@   moduleToFile,   packageDir, packageSuffix, packageTxtSuffix,   mhsVersion,-  getMhsDir,+  getPaths,   openFilePath,   loadPkg,   addPreludeImport,+  loadEmbedded,   ) where import qualified Prelude(); import MHSPrelude import Control.Exception+import qualified Data.ByteString as BS import Data.Char import Data.List import Data.Maybe@@ -36,6 +38,7 @@ import MicroHs.Builtin import MicroHs.CompileCache import MicroHs.Desugar+import qualified MicroHs.Embed as Embed import MicroHs.Exp import MicroHs.Expr import MicroHs.Flags@@ -48,7 +51,8 @@ import MicroHs.SymTab import MicroHs.TCMonad(TCState) import MicroHs.TypeCheck-import Paths_MicroHs(version, getDataDir)+import MicroHs.Version+import Text.PrettyPrint.HughesPJLiteClass(prettyShow)  mhsVersion :: String mhsVersion = showVersion version@@ -72,11 +76,16 @@   return res  compileMany :: Flags -> [IdentModule] -> Cache -> IO Cache-compileMany flags mns ach =+compileMany flags mns ach = do   execStateIO (do mapM_ (loadPkg flags) (preload flags)+                  mapM_ (loadEmbedPkg flags) Embed.packages                   mapM_ (compileModuleCached flags ImpNormal) mns)               ach +loadEmbedded :: Flags -> Cache -> IO Cache+loadEmbedded flags ach =+  execStateIO (mapM_ (loadEmbedPkg flags) Embed.packages) ach+ getCached :: Flags -> IO Cache getCached flags | not (readCache flags) = return emptyCache getCached flags = do@@ -113,6 +122,7 @@ compile flags nm ach = do   let comp = do         mapM_ (loadPkg flags) (preload flags)+        mapM_ (loadEmbedPkg flags) Embed.packages         res <- compileModuleCached flags ImpNormal nm         loadBoots flags         loadDependencies flags@@ -206,7 +216,7 @@   let pmdl@(EModule mnn _ _) = parseDie pTop pathfn file   t2 <- liftIO (seq pmdl getTimeMilli)   dumpIf flags Dparse $-    liftIO $ putStrLn $ "parsed:\n" ++ show pmdl+    liftIO $ putStrLn $ "parsed:\n" ++ prettyShow 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)@@ -258,9 +268,9 @@   return ((dmdl, syms, imported, tThis, tImp), tcstate)  compileToCombinators :: TModule [LDef] -> TModule [LDef]-compileToCombinators dmdl = do+compileToCombinators dmdl =   let cmdl = setBindings dmdl [ (i, compileOpt e) | (i, e) <- tBindingsOf dmdl ]-  seq (rnf cmdl) cmdl  -- This makes execution slower, but speeds up GC+  in seq (rnf cmdl) cmdl  -- This makes execution slower, but speeds up GC  -- Add implicit imports: --   import Prelude@@ -370,7 +380,14 @@               runCPPString flags fn file             else               return file-          return (Just (fn, file'))+          file'' <-+            if doF flags then+              case fPgm flags of+                Nothing -> error "-F without -pgmF"+                Just pgm -> runPreString flags pgm (fArgs flags) fn file'+            else+              return file'+          return (Just (fn, file''))  -- Check if the file contains {-# LANGUAGE ... CPP ... #-} -- XXX This is pretty hacky and not really correct.@@ -394,7 +411,7 @@ findModulePath flags suf mn = do   let     fn = moduleToFile mn <.> suf-  openFilePath (paths flags) fn+  openFilePath (srcPaths flags) fn  openFilePath :: [FilePath] -> FilePath -> IO (Maybe (FilePath, Handle)) openFilePath adirs fileName =@@ -420,6 +437,23 @@   removeFile fno   return ofile +-- Run a custom preprocessor.  Invoked with+--  cmd hsfilename inputfilename outputfilename [args]+runPreString :: Flags -> String -> [String] -> FilePath -> String -> IO String+runPreString flags pgm args fn ifile = do+  (fni, hi) <- openTmpFile "mhsprein.hs"+  hClose hi+  writeFile fni ifile+  (fno, ho) <- openTmpFile "mhspreout.hs"+  let cmd = unwords $ pgm : fn : fni : fno : args+  when (verbosityGT flags 1) $+    putStrLn $ "Run preprocessor: " ++ show cmd+  callCommand cmd+  ofile <- hGetContents ho+  removeFile fni+  removeFile fno+  return ofile+ mhsDefines :: [String] mhsDefines =   [ "-D__MHS__"                                 -- We are MHS@@ -428,8 +462,8 @@ runCPP :: Flags -> FilePath -> FilePath -> IO () runCPP flags infile outfile = do   mcpphs <- lookupEnv "MHSCPPHS"-  datadir <- getMhsDir-  let cpphs = fromMaybe "cpphs" mcpphs+  let datadir = mhsdir flags+      cpphs = fromMaybe "cpphs" mcpphs       mhsIncludes = ["-I" ++ datadir </> "src/runtime"]       args = mhsDefines ++ mhsIncludes ++ map quote (cppArgs flags)       cmd = cpphs ++ " --strip " ++ unwords args ++ " " ++ infile ++ " -O" ++ outfile@@ -444,8 +478,8 @@ runHsc2hs flags fni = do   (fno, ho) <- openTmpFile "mhshsc2hs.hs"   mhsc2hs <- lookupEnv "MHSHSC2HS"-  datadir <- getMhsDir-  let hsc2hs = fromMaybe "hsc2hs" mhsc2hs+  let datadir = mhsdir flags+      hsc2hs = fromMaybe "hsc2hs" mhsc2hs       mhsIncludes = ["-I" ++ datadir </> "src/runtime"                     ,"-I" ++ datadir </> "src/runtime/unix"]       args = mhsDefines ++ mhsIncludes ++ map quote (cppArgs flags)@@ -455,7 +489,7 @@   callCommand cmd   ofile <- hGetContents ho   removeFile fno-  return ofile  +  return ofile  packageDir :: String packageDir = "packages"@@ -469,7 +503,7 @@ findPkgModule flags mn = do   t0 <- liftIO getTimeMilli   let fn = moduleToFile mn <.> packageTxtSuffix-  mres <- liftIO $ openFilePath (pkgPath flags) fn+  mres <- liftIO $ openFilePath (pkgPaths flags) fn   case mres of     Just (pfn, hdl) -> do       -- liftIO $ putStrLn $ "findPkgModule " ++ pfn@@ -485,18 +519,30 @@     Nothing ->       errorMessage (getSLoc mn) $         "Module not found: " ++ show mn ++-        "\nsearch path=" ++ show (paths flags) ++-        "\npackage path=" ++ show (pkgPath flags)+        "\nsearch path=" ++ show (srcPaths flags) +++        "\npackage path=" ++ show (pkgPaths flags)  loadPkg :: Flags -> FilePath -> CM () loadPkg flags fn = do   when (loading flags || verbosityGT flags 0) $     liftIO $ putStrLn $ "Loading package " ++ fn   pkg <- liftIO $ readSerialized fn+  loadPkg' (Just fn) pkg++loadPkg' :: Maybe FilePath -> Package -> CM ()+loadPkg' mfn pkg = do   when (pkgCompiler pkg /= mhsVersion) $-    mhsError $ "Package compile version mismatch: file=" ++ fn ++ ", package=" ++ pkgCompiler pkg ++ ", compiler=" ++ mhsVersion-  modify $ addPackage fn pkg+    mhsError $ "Package compiler version mismatch: file=" ++ fromMaybe (show $ pkgName pkg) mfn +++               ", package=" ++ pkgCompiler pkg ++ ", compiler=" ++ mhsVersion+  modify $ addPackage mfn pkg +loadEmbedPkg :: Flags -> BS.ByteString -> CM ()+loadEmbedPkg flags bs = do+  pkg <- liftIO $ readSerializedBS bs+  when (loading flags || verbosityGT flags 0) $+    liftIO $ putStrLn $ "Loading embedded package " ++ showIdent (pkgName pkg)+  loadPkg' Nothing pkg+ -- XXX add function to find&load package from package name  -- Load all packages that we depend on, but that are not already loaded.@@ -514,16 +560,13 @@  loadDeps :: Flags -> (IdentPackage, Version) -> CM () loadDeps flags (pid, pver) = do-  mres <- liftIO $ openFilePath (pkgPath flags) (packageDir </> unIdent pid ++ "-" ++ showVersion pver <.> packageSuffix)+  mres <- liftIO $ openFilePath (pkgPaths flags) (packageDir </> unIdent pid ++ "-" ++ showVersion pver <.> packageSuffix)   case mres of     Nothing -> mhsError $ "Cannot find package " ++ showIdent pid     Just (pfn, hdl) -> do       liftIO $ hClose hdl       loadPkg flags pfn -getMhsDir :: IO FilePath-getMhsDir = maybe getDataDir return =<< lookupEnv "MHSDIR"- -- Deal with literate Haskell unlit :: FilePath -> String -> String unlit fn = unlines . un 1 True . lines@@ -543,3 +586,28 @@     code n [] = err n "unlit: missing \\end{code}"     err :: Int -> String -> a     err n s = error $ "unlit: " ++ fn ++ ":" ++ show n ++ ": " ++ s++---------------++getPaths :: IO (FilePath, [FilePath], Maybe FilePath)+getPaths = do+  mdir <- lookupEnv "MHSDIR"+  let srcs = ["."]+  case mdir of+    -- If MHSDIR is set, use that and no package directories+    Just dir -> return (dir, srcs ++ [dir </> "lib"], Nothing)+    Nothing -> do+      -- There are two scenarios: either we are running inplace or installed+      binDir <- takeDirectory <$> catch getExecutablePath (\ (_ :: SomeException) -> getProgName) -- ~/.mcabal/bin+      let upDir = binDir </> ".."+      inplace <- doesFileExist (upDir </> "src/runtime/eval.c")+      if inplace then do+        let libDir = upDir </> "lib"+            gmpDir | wantGMP   = [libDir </> "gmp"]+                   | otherwise = []+        return (upDir, srcs ++ gmpDir ++ [libDir], Nothing)+       else do+        let vers = "mhs-" ++ mhsVersion+            pkgDir = upDir </> vers                                   -- ~/.mcabal/bin/../mhs-VERSION+            mhsDir = pkgDir </> "packages" </> vers </> "data"+        return (mhsDir, srcs, Just pkgDir)
src/MicroHs/CompileCache.hs view
@@ -3,7 +3,7 @@   Cache, addWorking, getWorking, emptyCache, deleteFromCache, workToDone, addBoot, getBoots,   cachedModules, cachedModuleNames, cachedNonPkgModuleNames,   lookupCache, lookupCacheChksum, getImportDeps,-  addPackage, getCompMdls, getPathPkgs, getPkgs,+  addPackage, getCompMdls, getPathPkgs, getPkgs, getEmbedPkgs,   getCacheTables, setCacheTables,   saveCache, loadCached,   ) where@@ -45,8 +45,8 @@   working :: [IdentModule],             -- modules currently being processed (used to detected circular imports)   boots   :: [IdentModule],             -- modules where only the boot version has been compiled   cache   :: M.Map CacheEntry,          -- cached compiled modules-  pkgs    :: [(FilePath, Package)],     -- loaded packages-  tables  :: GlobTables+  pkgs    :: [(Maybe FilePath, Package)], -- loaded packages, no filename for embedded+  tables  :: GlobTables                 -- glbals, e.g., instances   } --  deriving (Show) @@ -113,14 +113,17 @@ getCompMdls cash = [ tm | CompMdl tm _ _ <- M.elems (cache cash) ]  getPathPkgs :: Cache -> [(FilePath, Package)]-getPathPkgs = pkgs+getPathPkgs ch = [ (fp, p) | (Just fp, p) <- pkgs ch ]  getPkgs :: Cache -> [Package] getPkgs = map snd . pkgs -addPackage :: FilePath -> Package -> Cache -> Cache-addPackage f p c = c{-  pkgs = (f, p) : pkgs c,+getEmbedPkgs :: Cache -> [Package]+getEmbedPkgs ch = [ p | (Nothing, p) <- pkgs ch ]++addPackage :: Maybe FilePath -> Package -> Cache -> Cache+addPackage mf p c = c{+  pkgs = (mf, p) : pkgs c,   cache = foldr ins (cache c) (pkgExported p ++ pkgOther p),   tables = mergeGlobTables (pkgTables p) (tables c)   }
+ src/MicroHs/Config.hs view
@@ -0,0 +1,95 @@+{-# OPTIONS_GHC -Wno-orphans #-}+module MicroHs.Config(+    Key, Value, SectionName, Section, Config+  , parseConfig+  ) where+import qualified Prelude(); import MHSPrelude hiding(lex)+import Data.List+import Text.ParserComb+import MicroHs.Ident+import MicroHs.Lex++{- File Format+[section_name]+key = "value"+...++[next_section]+key = ...+-}++type Key = String+type Value = String+type SectionName = String+type Section = (SectionName, [(Key, Value)])+type Config = [Section]++-- Parser++type Parser = Prsr [Token] Token++instance TokenMachine [Token] Token where+  tmNextToken [] = (TEnd noSLoc, [])+  tmNextToken (x:xs) = (x,xs)++  tmRawTokens = id+++eof :: Parser ()+eof = do+  t <- nextToken+  case t of+    TEnd _ -> pure ()+    _      -> fail "eof"++nl :: Parser [Token]+nl = many $ satisfy "\\n" isWhite+  where isWhite (TIndent _) = True+        isWhite _           = False++spec :: Char -> Parser Token+spec c = satisfy (showToken $ TSpec (SLoc "" 0 0) c) is+  where is (TSpec _ d) = c == d+        is _ = False++ident :: Parser String+ident = satisfyM "key" is+  where is (TIdent _ _ x) = Just x+        is _              = Nothing++key :: Parser Key+key = ident++value :: Parser Value+value = satisfyM "value" isValue+  where isValue (TString _ x) = Just x+        isValue _             = Nothing++sectionName :: Parser SectionName+sectionName = spec '[' *> ident <* spec ']'++keyValue :: Parser (String, String)+keyValue = (,) <$> key <*> (spec '=' *> value)++keyValues :: Parser [(Key, Value)]+keyValues = keyValue `sepBy` nl++section :: Parser Section+section = (,) <$> (sectionName <* nl) <*> keyValues++sections :: Parser [Section]+sections = nl *> (section `sepBy1` nl) <* nl <* eof++formatFailed :: LastFail Token -> String+formatFailed (LastFail _ ts msgs) =+  unlines [ showSLoc sloc ++ ":\n"+          , "  found: " ++ head (map showToken ts)+          , "  expected: " ++ unwords (nub msgs)+          ]+  where sloc = tokensLoc ts++parseConfig :: FilePath -> String -> Either String Config+parseConfig fp file =+  case runPrsr sections $ lex (SLoc fp 1 1) file of+    Left lf -> Left $ formatFailed lf+    Right a -> Right a
src/MicroHs/Deriving.hs view
@@ -1,5 +1,6 @@ module MicroHs.Deriving(deriveStrat, expandField, mkGetName, etaReduce, mkTypeableInst) where import qualified Prelude(); import MHSPrelude+import Control.Monad import Data.Char import Data.Function import Data.List@@ -12,7 +13,7 @@ import MicroHs.List import MicroHs.Names import MicroHs.TCMonad-import Debug.Trace+--import Debug.Trace  -- Deriving runs when types level names are resolved, but not value level names. -- To get access to names that might not be in scope, the module Mhs.Builtin@@ -24,22 +25,24 @@ --   all other names should be qualified with B@  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+deriveStrat mctx newt lhs cs strat (narg, acls) =  -- narg is the number of arguments that need eta reducing --  trace ("deriveStrat " ++ show (mctx, newt, lhs, cs, strat, narg, cls)) $+  let c = cs!!0; cls = dropForallContext acls in   case strat of-    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-    DerAnyClass                   -> anyclassDer mctx narg lhs cls-    DerVia via | newt             -> newtypeDer  mctx narg lhs (cs!!0) cls (Just via)+    DerNone | newt && useNewt cls -> maybe (deriveNoHdr mctx narg lhs cs  cls)+                                           (newtypeDer  mctx narg lhs  c acls)+                                           (getViaM narg lhs c)+            | otherwise           -> deriveNoHdr mctx narg lhs cs  cls+    DerStock                      -> deriveNoHdr mctx narg lhs cs  cls+    DerNewtype | newt             -> newtypeDer  mctx narg lhs  c acls =<< getVia narg lhs c+    DerAnyClass                   -> anyclassDer mctx narg lhs     cls+    DerVia via | newt             -> newtypeDer  mctx narg lhs  c acls via     _                             -> cannotDerive lhs cls   where useNewt d = unIdent (getAppCon d) `notElem`-          ["Data.Data_Class.Data", "Data.Typeable.Typeable", "GHC.Generics.Generic",+          ["Data.Data_Class.Data", "Data.Typeable.Typeable", "GHC.Generics.Generic", "GHC.Generics.Generic1",            "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 DeriverT = Int -> LHS -> [Constr] -> EConstraint -> T [EDef] type Deriver = StandM -> DeriverT -- StandM is --   Nothing for regular deriving@@ -58,7 +61,8 @@   ,("Data.Ord.Ord",                    derOrd)   ,("Data.Traversable.Traversable",    derTraversable)   ,("Data.Typeable.Typeable",          derTypeable)-  ,("GHC.Generics.Generic",            derNotYet)+  ,("GHC.Generics.Generic",            derGeneric)+  ,("GHC.Generics.Generic1",           derGeneric1)   ,("Language.Haskell.TH.Syntax.Lift", derLift)   ,("Text.Read.Internal.Read",         derRead)   ,("Text.Show.Show",                  derShow)@@ -74,6 +78,7 @@ getDeriver :: EConstraint -> Maybe Deriver getDeriver d = lookup (unIdent $ getAppCon d) derivers +{- derNotYet :: Deriver derNotYet _ _ _ _ d = do   notYet d@@ -82,6 +87,7 @@ notYet :: EConstraint -> T () notYet d =   traceM ("Warning: cannot derive " ++ show d ++ " yet, " ++ showSLoc (getSLoc d))+-}  -- We will never have Template Haskell, but we pretend we can derive Lift for it. derLift :: Deriver@@ -197,27 +203,41 @@ getFieldTys (Left ts) = map snd ts getFieldTys (Right ts) = map (snd . snd) ts +conFieldTys :: Constr -> [EType]+conFieldTys (Constr _ _ _ _ as) = getFieldTys as+ -- If there is no mctx we use the default strategy to derive the instance context. -- 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+-- E.g.  data T a = 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+mkHdr mctx lhs cs cls = mkHdrWithTyVarConstraint mctx lhs cs cls Nothing++mkHdrWithTyVarConstraint :: StandM -> LHS -> [Constr] -> EConstraint -> Maybe EConstraint -> T EConstraint+mkHdrWithTyVarConstraint (Just (ctx, _)) _ _ _ _ = return ctx+mkHdrWithTyVarConstraint _ lhs@(_, iks) cs cls tyVarConstraint = do   ty <- mkLhsTy 0 lhs   let ctys :: [EType]  -- All top level types used by the constructors.-      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+      ctys = nubBy eqEType [ tt+                           | Constr evs _ _ _ flds <- cs+                           , tt <- getFieldTys flds+                           , not (ty `eqEType` tt)+                           , not $ null $ freeTyVars [tt] \\ map idKindIdent evs+                           ]+      tyVars = map (EVar . idKindIdent) iks  -- type variables in type definition+      iks' = map (`IdKind` EVar dummyIdent) (freeTyVars [cls])  -- free type variables in the derived class+      tyVarConstraints = maybe [] (\c -> map (tApp c) tyVars) tyVarConstraint+--  traceM $ "mkHdrWithTyVarConstraints: " ++ show (cls, iks')+  pure $ eForall (iks' ++ iks) $ addConstraints (map (tApp cls) ctys ++ tyVarConstraints) $ tApp cls ty  -- 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+  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@@ -315,12 +335,14 @@   let loc = getSLoc ebnd       mkEqn bnd (Constr _ _ c _ flds) =         let n = either length length flds-        in  eEqn [] $ tApps c (replicate n (EVar bnd))+        in  eEqn [] $ tApps c (replicate n bnd)        iMinBound = mkIdentSLoc loc "minBound"       iMaxBound = mkIdentSLoc loc "maxBound"-      minEqn = mkEqn iMinBound c0-      maxEqn = mkEqn iMaxBound (last cs)+      eMinBound = EVar (mkBuiltin loc "minBound")+      eMaxBound = EVar (mkBuiltin loc "maxBound")+      minEqn = mkEqn eMinBound c0+      maxEqn = mkEqn eMaxBound (last cs)       inst = Instance hdr [Fcn iMinBound [minEqn], Fcn iMaxBound [maxEqn]] []   -- traceM $ showEDefs [inst]   return [inst]@@ -337,21 +359,22 @@       eLastCon = case last cs of Constr _ _ c _ _ -> tCon c        iFromEnum = mkIdentSLoc loc "fromEnum"+      eFromEnum = eAppI (mkBuiltin loc "fromEnum")       iToEnum = mkIdentSLoc loc "toEnum"       iEnumFrom = mkIdentSLoc loc "enumFrom"       iEnumFromThen = mkIdentSLoc loc "enumFromThen"-      iEnumFromTo = mkBuiltin loc "enumFromTo"-      iEnumFromThenTo = mkBuiltin loc "enumFromThenTo"+      eEnumFromTo = eAppI2 (mkBuiltin loc "enumFromTo")+      eEnumFromThenTo = eAppI3 (mkBuiltin loc "enumFromThenTo")       enumFromEqn =         -- enumFrom x = enumFromTo x (last cs)         let x = EVar (mkIdentSLoc loc "x")-        in eEqn [x] (eAppI2 iEnumFromTo x eLastCon)+        in eEqn [x] (eEnumFromTo x eLastCon)       enumFromThenEqn =         -- enumFromThen x1 x2 = if fromEnum x2 >= fromEnum x1 then enumFromThenTo x1 x2 (last cs) else enumFromThenTo x1 x2 (head cs)         let           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))+        in eEqn [x1, x2] (EIf (eAppI2 (mkBuiltin loc ">=") (eFromEnum x2) (eFromEnum x1)) (eEnumFromThenTo x1 x2 eLastCon) (eEnumFromThenTo x1 x2 eFirstCon))       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@@ -401,16 +424,19 @@         eAnd = eAppI2 (mkBuiltin loc "&&")         eAdd = eAppI2 (mkBuiltin loc "+")         eMul = eAppI2 (mkBuiltin loc "*")-        iUnsafeRangeSize = mkIdentSLoc loc "unsafeRangeSize"+        eRange           = eAppI  (mkBuiltin loc "range")+        eUnsafeIndex     = eAppI2 (mkBuiltin loc "unsafeIndex")+        eInRange         = eAppI2 (mkBuiltin loc "inRange")+        eUnsafeRangeSize = eAppI  (mkBuiltin 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))+        rangeEqn = eEqn [ETuple [xp, yp]] $ EListish (LCompr (tApps iC0 zs) (zipWith3 (\x y z -> SBind z (eRange (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])+          let mkUnsafeIndex x y z = eUnsafeIndex (ETuple [x, y]) z+              mkUnsafeRangeSize x y = eUnsafeRangeSize (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+        inRangeEqn = eEqn [ETuple [xp, yp], zp] $ foldr1 eAnd $ zipWith3 (\x y z -> eInRange (ETuple [x, y]) z) xs ys zs         inst = Instance hdr [Fcn iRange [rangeEqn], Fcn iUnsafeIndex [unsafeIndexEqn], Fcn iInRange [inRangeEqn]] []     return [inst]   else@@ -481,6 +507,7 @@   let     loc = getSLoc eread     iReadPrec = mkIdentSLoc loc "readPrec"+    eReadPrec = EVar (mkBuiltin loc "readPrec")     iReadList = mkIdentSLoc loc "readList"     iReadListPrec = mkIdentSLoc loc "readListPrec"     eReadListDefault = EVar (mkBuiltin loc "readListDefault")@@ -492,8 +519,8 @@     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))+    eReadField = eAppI (mkBuiltin loc "step") eReadPrec+    eReadNamedField name = eAppI2 (mkBuiltin loc "readField") (ELit loc (LStr name)) (eAppI (mkBuiltin loc "reset") eReadPrec)     eReturn = eAppI (mkBuiltin loc "return")     ePfail = EVar (mkBuiltin loc "pfail")     readConstr c@(Constr _ _ ident isInfix fields) =@@ -521,16 +548,18 @@ --  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+    etyp = EVar (mkI nameDataTypeableTypeable)+  hdr <- mkHdrWithTyVarConstraint mctx lhs cs edata (Just etyp)+  mn <- getDefModuleName mctx+  let+    tyname = qualIdent mn utyname     iMkDataType = mkB "mkDataType"     iMkConstrTag = mkB "mkConstrTag"     iConstrIndex = mkB "constrIndex"@@ -618,9 +647,9 @@   let loc = getSLoc efoldable       var = idKindIdent (last tyvs)       eqns = map mkEqn cs-      mkEqn c@(Constr _ _ _ _ flds) =+      mkEqn c =         let (xp, xs) = mkPat c "x$"-            ts = getFieldTys flds+            ts = conFieldTys c             rhs = foldr EApp eZ (zipWith EApp (map (mkFold eF) ts) xs)         in  eEqn [EVar iF, EVar iZ, xp] rhs @@ -636,7 +665,7 @@               Just (con, []) | con == var -> f               Just (_, ts@(_:_)) -> eFfoldr (mkFold f (last ts))               _ -> eFlipConst-        +       iF = mkIdentSLoc loc "f"       eF = EVar iF       iZ = mkIdentSLoc loc "z"@@ -690,87 +719,103 @@  -------------------------------------------- -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+-- If we have C :: Type -> Constraint and+--  newtype N = MkN T deriving C via V+-- we will derive+--  instance C N where+--    ... coerce @N @V ...   -- covariant use of N, flip for contravariant+-- assuming we already have+--  instance C V+-- this will be type correct.+-- In case there is no 'via V' we use V=T.+--+-- For a constructor class, CC :: (Type->Type) -> Constraint+--  newtype CN a - MkCN (CT a) deriving CC via CV+-- we will derive+--  instance CC CN where+--    ... coerce @CN @CV ...   -- covariant use of CN, flip for contravariant+-- assuming we already have+--  instance CC CV+-- this will be type correct.+-- In case there is no 'via V' we use CV=CT.+-- Note the use of CT, not (CT a).  So the type wrapped by MkCN needs to be eta reduced. -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-          _ -> error "newtypeDer"---  traceM ("newtypeDer " ++ show (mctx, narg, tycon, iks, c, acls, mvia, oldty'))-  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))-      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+getViaM :: Int -> LHS -> Constr -> Maybe EType+getViaM narg (_, iks) con =+  let oldty = conFieldTys con !! 0                -- the underlying type, full+  in  case etaReduce (takeEnd narg iks) oldty of  -- the underlying type, eta reduced+        ([], rt) -> Just rt+        _ -> Nothing -          -- 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+getVia :: Int -> LHS -> Constr -> T EType+getVia narg lhs con = maybe (tcError (getSLoc lhs) "Bad newtype deriving") return $ getViaM narg lhs con -                    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+newtypeDer :: StandM -> Int -> LHS -> Constr -> EConstraint -> EType -> T [EDef]+newtypeDer mctx narg lhs@(_tycon, iks) _con acls viaty = do+  let loc = getSLoc cls+      (clsIks, cls) = unForall acls+--  traceM ("newtypeDer: " ++ show (hdr, viaty))+  let qiCls = getAppCon cls+      clsQual = qualOf qiCls+  ct <- gets classTable+  (ClassInfo _ supers clsCon mits _) <-+    case M.lookup qiCls ct of+      Nothing -> tcError loc $ "not a class " ++ showIdent qiCls+      Just x -> return x+  hdr <-+    case mctx of+      Just (h, _) -> pure h+      Nothing -> do+        newtyr <- mkLhsTy narg lhs                    -- the newtype, eta reduced+        let+          cdef = tApp cls newtyr       -- the instance we are trying to make+          ctxOld = tApp cls viaty+          ctx = filter (not . null . freeTyVars . (:[])) [ctxOld]+          iks' = dropEnd narg iks+          -- clsCon is the class constructor type+          --   forall ... t1 -> t2 -> C v1 ... vn+          -- extract v1...vn from this+          supVs = map unEVar $ snd $ getApp $ snd $ getArrows $ dropForallContext clsCon+            where unEVar (EVar i) = i; unEVar _ = impossible+          curTs = snd $ getApp cdef   -- extract the actual types in the instance+          xctx = filter hasTyVars $ map (subst s) supers     -- add the superclasses as extra context (if they have tyvars)+            where s = zip supVs curTs                        -- substitution to get the supers to use the right types+                  hasTyVars t = not $ null $ freeTyVars [t]+--        traceM $ "newtypeDer newtyr=" ++ show newtyr ++ ", acls=" ++ show acls ++ ", clsIks=" ++ show clsIks +++--                 ", supers=" ++ show supers ++ ", xiks=" ++ show xiks ++ ", (iks, iks')=" ++ show (iks, iks') +++--                 ", clsCon=" ++ show clsCon ++ ", xctx=" ++ show xctx+--        traceM $ "newtypeDer " ++ show (xctx, ctx)+        pure $ eForall (clsIks ++ iks') $ addConstraints (xctx ++ ctx) cdef+  -- 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)+                _ -> impossiblePP amty+            qvar t = EQVar t kType+            nty = subst (zip tvs newtys) mty+            -- Any leading quantifier in nty (used in the method signature)+            -- also scopes over vty (used in the method body).+            -- The substitution above might have changed the bound variables.+            -- Redo the alpha conversion for vty before substituting in the viaty.+            vty  = subst (zip tvs (init newtys ++ [viaty])) $ dropForallContext $+                   case (mty, nty) of+                     (EForall _ iks' t, EForall _ iks'' _) -> subst alpha t+                       where alpha = zipWith (\ (IdKind i' _) (IdKind i'' _) -> (i', EVar i'')) iks' iks''+                     _ -> mty+            msign = Sign [mi] (qvar nty)+            qmi = EQVar (EVar $ qualIdent clsQual mi) amty   -- Use a qualified name for the method+            body = Fcn mi [eEqn [] $ eAppI2 (mkBuiltin loc "coerce") (ETypeArg $ qvar vty) qmi]+--        traceM $ "mkMethod: mi=" ++ show mi ++ "\n  mty=" ++ show mty ++ "\n  tvs=" ++ show tvs ++ "\n  newtys=" ++ show newtys ++ "\n  viaty=" ++ show viaty ++ "\n  nty=" ++ show nty ++ "\n  vty=" ++ show vty+        unless (length tvs == length newtys) $+          mhsError "mkMethod: arity"+        return [msign, body]+--  traceM $ "newtypeDer " ++ show (hdr) -- , newtys, xiks, supers, hdr)+  body <- concat <$> mapM mkMethod mits  --  traceM $ "newtypeDer: " ++ show (Instance hdr body [])-          return (Just [Instance hdr body []])+  return [Instance hdr body []]  -- Eta reduce as many of the variables as possible. -- E.g. etaReduce [a,b] (T a b) = ([], T)@@ -784,3 +829,21 @@ anyclassDer mctx _ lhs cls = do   hdr <- mkHdr mctx lhs [] cls   return [Instance hdr [] []]++--------------------------------------------++derGeneric :: Deriver+derGeneric mctx 0 lhs cs egeneric = do+  hdr <- mkHdr mctx lhs cs egeneric+  let+    inst = Instance hdr [] []+  return [inst]+derGeneric _ _ lhs _ e = cannotDerive lhs e++derGeneric1 :: Deriver+derGeneric1 mctx 1 lhs cs egeneric1 = do+  hdr <- mkHdr1 mctx lhs cs egeneric1+  let+    inst = Instance hdr [] []+  return [inst]+derGeneric1 _ _ lhs _ e = cannotDerive lhs e
src/MicroHs/Desugar.hs view
@@ -25,6 +25,7 @@ import MicroHs.Names import MicroHs.State as S import MicroHs.TypeCheck+import Text.PrettyPrint.HughesPJLiteClass(prettyShow)  type LDef = (Ident, Exp) @@ -46,7 +47,7 @@       in  zipWith dsConstr [0::Int ..] cs     Newtype _ (Constr _ _ c _ _) _ -> [ (qualIdent mn c, Lit (LPrim "I")) ]     Fcn f eqns -> [(f, wrapTick (useTicks flags) f $ dsEqns (getSLoc f) eqns)]-    ForImp cc ie i t -> [(i, ccall t $ Lit $ mkForImp ffiNo cc ie i t)]+    ForImp cc ie i t -> [(i, ccall t $ Lit $ mkForImp mn ffiNo cc ie i t)]     -- Foreign exports don't fit very well into the desugared syntax.     -- We represent     --   foreign export "foo" bar :: ty@@ -204,9 +205,9 @@   let (is, es) = unzip ies       n = length is       ev = Var v-      one m i = letE i (mkTupleSelE m n ev)+      one m i = letE i (encTupleSel m n ev)       bnds = foldr (.) id $ zipWith one [0..] is-  in  letRecE v (bnds $ mkTupleE es) $+  in  letRecE v (bnds $ encTuple es) $       bnds body  -- In case we are cross compiling for a 32 bit platform we don't want integers that are too big.@@ -244,7 +245,7 @@     ELit _ l -> Lit l     ECase e as -> dsCase (getSLoc aexpr) e as     ELet ads e -> dsBinds ads (dsExpr e)-    ETuple es -> Lam (mkIdent "$f") $ foldl App (Var $ mkIdent "$f") $ map dsExpr es+    ETuple es -> encTuple $ map dsExpr es     EIf e1 e2 e3 -> encIf (dsExpr e1) (dsExpr e2) (dsExpr e3)     EListish (LList es) -> encList $ map dsExpr es     EListish (LCompr e stmts) -> dsExpr $ dsCompr e stmts (EListish (LList []))@@ -253,11 +254,11 @@           Just n ->             let               xs = [mkIdent ("x" ++ show i) | i <- [1 .. n] ]-              body = mkTupleE $ map Var xs+              body = encTuple $ map Var xs             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+    _ -> impossiblePP aexpr+  where addLoc i = EApp (EVar i) (ELit l (LStr (prettyShow l ++ ": "))) where l = getSLoc i         iapp = mkIdent "Data.List_Type.++"  dsCompr :: Expr -> [EStmt] -> Expr -> Expr@@ -279,17 +280,6 @@     allVs = allVarsExpr (EListish (LCompr (ETuple [e,l]) xss))  -- all used identifiers dsCompr _ (SRec _ : _) _ = impossible --- Use tuple encoding to make a tuple-mkTupleE :: [Exp] -> Exp-mkTupleE = Lam (mkIdent "$f") . foldl App (Var (mkIdent "$f"))---- Select component m from an n-tuple-mkTupleSelE :: Int -> Int -> Exp -> Exp-mkTupleSelE m n tup =-  let-    xs = [mkIdent ("x" ++ show i) | i <- [1 .. n] ]-  in App tup (foldr Lam (Var (xs !! m)) xs)- -- Handle special syntax for lists and tuples. dsPat :: HasCallStack =>          EPat -> EPat@@ -320,7 +310,7 @@ showLDef :: LDef -> String showLDef a =   case a of-    (i, e) -> showIdent i ++ " = " ++ show e+    (i, e) -> showIdent i ++ " = " ++ prettyShow e  ---------------- @@ -485,7 +475,7 @@ eMatchErr :: SLoc -> Exp eMatchErr loc =   let exn = mkIdentSLoc loc "Control.Exception.Internal.patternMatchFail"-      msg = LStr $ show loc+      msg = LStr $ prettyShow loc   in  App (Var exn) (Lit msg)  -- If the first expression isn't a variable/literal, then use@@ -538,7 +528,7 @@     ECon c -> c     EAt _ p -> pConOf p     EApp p _ -> pConOf p-    _ -> impossibleShow apat+    _ -> impossiblePP apat  pArgs :: EPat -> [EPat] pArgs apat =@@ -620,42 +610,40 @@ -- "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 =+parseImpEnt :: SLoc -> CallConv -> String -> String -> ImpEnt+parseImpEnt _ Cjavascript _ s = ImpJS s+parseImpEnt loc _cc ui 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+    "static" : r -> rest [] r+    r            -> rest [] r+ where rest incs (inc : r) | ".h" `isSuffixOf` inc = rest  (incs ++ [inc])  r+       rest incs r                                 = rest' (ImpStatic incs) 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 [] = c ui        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 =+mkForImp :: IdentModule -> Int -> CallConv -> Maybe String -> Ident -> EType -> Lit+mkForImp _ _ Cjavascript Nothing i _ = badForImp (getSLoc i)+mkForImp mn 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+      impent = parseImpEnt loc cc ui $ fromMaybe "" ms+      fno = show no+      cid =+        case impent of+          ImpStatic _ _ n ->+            if isValidC n then n else fno+          _ -> fno+  in  LForImp mn impent cid cty
+ src/MicroHs/Embed.hs view
@@ -0,0 +1,8 @@+module MicroHs.Embed where+import Data.ByteString(ByteString)++-- This list is filled by the compiler when compiled with+-- the --embed-packages PKG:PKG:... flag.+-- It is simply the contents of the corresponding .pkg file.+packages :: [ByteString]+packages = []
src/MicroHs/EncodeData.hs view
@@ -5,6 +5,8 @@   encCase,   encIf,   encList,+  encTuple,+  encTupleSel,   ) where import qualified Prelude(); import MHSPrelude import Data.List@@ -35,7 +37,7 @@ -- The runtime system knows the encoding of some types: -- Bool, [], Ordering scottLimit :: Int-scottLimit = 5+scottLimit = 6 -- Some timing for different limits --   3  27.9s --   5  26.5s@@ -43,6 +45,14 @@ --  20  27.3s -- 100  32.0s +-- Special tuple constructors T3,T4,...Tn+tupleLimit :: Int+tupleLimit = 16++-- Special tag constructors TAG0,TAG1,...Tn+tagLimit :: Int+tagLimit = 32+ -------------------------------------------  -- Scott encoding@@ -66,11 +76,46 @@  -- Encode a constructor with strictness flags ss. -- The constructor arity is given by ss, and the constructor number is i out of n.+-- It's always possible to just use the lambda expression, but we handle some+-- cases specially to speed up combinator optimization. encConstrScott :: Int -> Int -> [Bool] -> Exp-encConstrScott i n ss =+encConstrScott i n ss | or ss     = encConstrScottStrict i n ss+                      | otherwise = encConstrScottLazy   i n (length ss)++encConstrScottLazy :: Int -> Int -> Int -> Exp+encConstrScottLazy i n l =+  case (i, n, l) of+    (0, 1, 0) -> comb "I"       -- single nullary+    (0, 1, 1) -> comb "U"       -- single unary+    (0, 1, 2) -> comb "P"       -- pair/...+    (0, 1, _) | l <= tupleLimit -> comb ("T" ++ show l)++    (0, 2, 0) -> comb "K"       -- []/False/Nothing/...+    (0, 2, 1) -> comb "L"       -- Left/...++    (1, 2, 0) -> comb "A"       -- True/...+    (1, 2, 1) -> comb "J"       -- Just/...+    (1, 2, 2) -> comb "O"       -- (:)/...++    (0, 3, 0) -> comb "K2"      -- LT/...+    (1, 3, 0) -> comb "KK"      -- EQ/...+    (2, 3, 0) -> comb "KA"      -- GT/...+    _ -> encConstrScottLambda i n l+  where comb = Lit . LPrim++encConstrScottLambda :: Int -> Int -> Int -> Exp+encConstrScottLambda i n l =   let     f = mkIdent "$f"     fs = map (\ k -> if k == i then f else dummyIdent) [0::Int .. n-1]+    xs = [mkIdent ("$x" ++ show j) | j <- [0 .. l-1] ]+  in lams xs $ lams fs $ apps (Var f) (map Var xs)++encConstrScottStrict :: Int -> Int -> [Bool] -> Exp+encConstrScottStrict i n ss =+  let+    f = mkIdent "$f"+    fs = map (\ k -> if k == i then f else dummyIdent) [0::Int .. n-1]     xs = [mkIdent ("$x" ++ show j) | (j, _) <- zip [0::Int ..] ss]     strict (False:ys) (_:is) e = strict ys is e     strict (True:ys)  (x:is) e = app2 (Lit (LPrim "seq")) (Var x) (strict ys is e)@@ -83,13 +128,11 @@ encList :: [Exp] -> Exp encList = foldr (app2 cCons) cNil --- XXX could use encConstr cCons :: Exp-cCons = Lit (LPrim "O")+cCons = encConstrScottLazy 1 2 2 --- XXX could use encConstr cNil :: Exp-cNil = Lit (LPrim "K")+cNil = encConstrScottLazy 0 2 0  ------------------------------------------- @@ -111,12 +154,11 @@     strict (False:ys) (_:is) e = strict ys is e     strict (True:ys)  (x:is) e = app2 (Lit (LPrim "seq")) (Var x) (strict ys is e)     strict _ _ e = e-  in lams xs $ strict ss xs $ tuple [Lit (LInt i), tuple (map Var xs)]+  in lams xs $ strict ss xs $ encTag i $ encTuple (map Var xs) -tuple :: [Exp] -> Exp-tuple es = Lam f $ apps (Var f) es-  where f = -- newIdent "$t" es ---            mkIdent "$t"+encTag :: Int -> Exp -> Exp+encTag i e | i <= tagLimit = App (Lit (LPrim ("TAG" ++ show i))) e+           | otherwise     = encTuple [Lit (LInt i), e]  encCaseNo :: Exp -> [(SPat, Exp)] -> Exp -> Exp encCaseNo var pes dflt =@@ -131,32 +173,35 @@   case pes of     [] -> dflt     [(i, xs, e)] | hi - lo == 1 -> match tup xs e-                 | otherwise    -> encIf (eqInt n i) (match tup xs e) dflt+                 | otherwise    -> encIf (eqInt i n) (match tup xs e) dflt {-     -- Strangely, this slows things down.     -- Why?  A 3-way branch should be better than a 2-way.     [(i, xs, e), (_, xs', e')]-                 | hi - lo == 2 -> encIf (eqInt n i) (match tup xs e) (match tup xs' e')-      let (pesl, (i, xs, e) : pesh) = splitAt (length pes `quot` 2) pes-      in  encTri (cmpInt n i) (caseTree n tup lo i pesl dflt)+                 | hi - lo == 2 -> encIf (eqInt i n) (match tup xs e) (match tup xs' e')+    _ ->+      case splitAt (length pes `quot` 2) pes of+        (pesl, (i, xs, e) : pesh) ->+          encTri (cmpInt i n) (caseTree n tup (i+1) hi pesh dflt)                               (match tup xs e)-                              (caseTree n tup (i+1) hi pesh dflt)+                              (caseTree n tup lo i pesl dflt)+        _ -> impossible -}     _ ->       case splitAt (length pes `quot` 2) pes of         (pesl, pesh@((i, _, _):_)) ->-          encIf (ltInt n i) (caseTree n tup lo i pesl dflt) (caseTree n tup i hi pesh dflt)+          encIf (gtInt i n) (caseTree n tup lo i pesl dflt) (caseTree n tup i hi pesh dflt)         _ -> impossible  where-   eqInt :: Exp -> Int -> Exp-   eqInt x i = app2 (Lit (LPrim "==")) x (Lit (LInt i))-   ltInt :: Exp -> Int -> Exp-   ltInt x i = app2 (Lit (LPrim "<")) x (Lit (LInt i))+   eqInt :: Int -> Exp -> Exp+   eqInt i x = app2 (Lit (LPrim "==")) (Lit (LInt i)) x+   gtInt :: Int -> Exp -> Exp+   gtInt i x = app2 (Lit (LPrim ">")) (Lit (LInt i)) x    match :: Exp -> [Ident] -> Exp -> Exp    match e is rhs = App e $ lams is rhs {-    cmpInt :: Exp -> Int -> Exp-   cmpInt x i = app2 (Lit (LPrim "icmp")) x (Lit (LInt i))+   cmpInt i x = app2 (Lit (LPrim "icmp")) (Lit (LInt i)) x    encTri o l e h = app3 o l e h -} @@ -167,3 +212,15 @@ numConstr :: [(SPat, Exp)] -> Int numConstr ((SPat (ConData cs _ _) _, _):_) = length cs numConstr _ = undefined++-- Make a tuple+encTuple :: [Exp] -> Exp+encTuple es = apps (encConstrScottLazy 0 1 (length es)) es++-- Select component m from an n-tuple+encTupleSel :: Int -> Int -> Exp -> Exp+encTupleSel m n tup =+  let+    xs = [mkIdent ("x" ++ show i) | i <- [1 .. n] ]+  in App tup (foldr Lam (Var (xs !! m)) xs)+
src/MicroHs/Exp.hs view
@@ -10,13 +10,13 @@   lams, apps,   mkForExp, getForExp,   ) where-import qualified Prelude(); import MHSPrelude hiding((<>))+import qualified Prelude(); import MHSPrelude import Data.Char import Data.List import MicroHs.Ident import MicroHs.Expr(Lit(..), showLit, CType(..)) import MicroHs.List-import Text.PrettyPrint.HughesPJLite+import Text.PrettyPrint.HughesPJLiteClass import Debug.Trace  type PrimOp = String@@ -26,7 +26,7 @@   | App Exp Exp   | Lam Ident Exp   | Lit Lit-  deriving (Eq)+  deriving (Eq, Show)  instance NFData Exp where   rnf (Var a) = rnf a@@ -40,13 +40,15 @@ app3 :: Exp -> Exp -> Exp -> Exp -> Exp app3 f a1 a2 a3 = App (app2 f a1 a2) a3 -instance Show Exp where-  show = render . ppExp+--instance Show Exp where+--  show = render . ppExp +instance Pretty Exp where+  pPrintPrec _ _ = ppExp+ ppExp :: Exp -> Doc ppExp ae =   case ae of---    Let i e b -> sep [ text "let" <+> ppIdent i <+> text "=" <+> ppExp e, text "in" <+> ppExp b ]     Var i -> ppIdent i     App f a -> parens $ ppExp f <+> ppExp a     Lam i e -> parens $ text "\\" <> ppIdent i <> text "." <+> ppExp e
src/MicroHs/ExpPrint.hs view
@@ -1,6 +1,7 @@ {-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-} module MicroHs.ExpPrint(toStringCMdl, toStringP, encodeString, combVersion, removeUnused, renumberCMdl) where import qualified Prelude(); import MHSPrelude+import qualified Data.ByteString.Char8 as BS import Data.Char(ord, chr) import qualified MicroHs.IdentMap as M import Data.Maybe@@ -113,10 +114,10 @@     Lit (LStr s) ->       -- Encode very short string directly as combinators.       if length s > 1 then-        toStringP (App (Lit (LPrim "fromUTF8")) (Lit (LBStr (utf8encode s))))+        toStringP (App (Lit (LPrim "fromUTF8")) (Lit (LBStr (BS.pack (utf8encode s)))))       else         toStringP (encodeString s)-    Lit (LBStr s) -> (quoteString s ++) . (' ' :)+    Lit (LBStr s) -> (quoteString (BS.unpack s) ++) . (' ' :)     Lit (LInteger _) -> undefined     Lit (LRat _) -> undefined     Lit (LTick s) -> ('!':) . (quoteString s ++) . (' ' :)
src/MicroHs/Expr.hs view
@@ -8,6 +8,7 @@   EDef(..), showEDefs,   Deriving(..), DerStrategy(..), doNotDerive,   Expr(..), eLam, eLamWithSLoc, eEqn, oneAlt, eEqns, showExpr, eqExpr,+  XTCState,   CallConv(..),   QForm(..),   Listish(..),@@ -47,7 +48,7 @@   HasLoc(..),   eForall, eForall', unForall,   eDummy,-  impossible, impossibleShow,+  impossible, impossibleShow, impossiblePP,   getArrow, getArrows,   showExprRaw,   mkEStr, mkExn,@@ -56,27 +57,27 @@   getImplies,   dropForallContext,   ) where-import qualified Prelude(); import MHSPrelude hiding ((<>))+import qualified Prelude(); import MHSPrelude+import Data.ByteString(ByteString) import Data.List import Data.Maybe import MicroHs.Builtin import MicroHs.Ident-import {-# SOURCE #-} MicroHs.TCMonad(TCState)-import Text.PrettyPrint.HughesPJLite+import Text.PrettyPrint.HughesPJLiteClass  type IdentModule = Ident  ----------------------  data EModule = EModule IdentModule [ExportItem] [EDef]---DEBUG  deriving (Show)+  deriving (Show)  data ExportItem   = ExpModule IdentModule   | ExpTypeSome Ident [Ident]   | ExpValue Ident   | ExpDefault Ident---DEBUG  deriving (Show)+  deriving (Show)  data EDef   = Data LHS [Constr] [Deriving]@@ -96,9 +97,12 @@   | 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)+  -- Only used by interactive system to load a cached TCState to avoid import processing.+  -- We don't want to introduce a circular reference between Expr and TCMonad,+  -- because then we cannot bootstrap with Hugs.+  -- So instead we use dummy placeholder type and then use unsafeCoerce for the values.+  | SetTCState XTCState+  deriving (Show)  instance NFData EDef where   rnf (Data a b c) = rnf a `seq` rnf b `seq` rnf c@@ -120,8 +124,12 @@   rnf (DfltSign a b) = rnf a `seq` rnf b   rnf (SetTCState a) = seq a () +data XTCState+instance Eq XTCState where _ == _  =  True+instance Show XTCState where show _ = "<<TCState>>"+ data ImpType = ImpNormal | ImpBoot-  deriving (Eq)+  deriving (Eq, Show)  instance NFData ImpType where rnf x = x `seq` () @@ -131,7 +139,7 @@ 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)+  deriving (Show)  instance NFData ImportSpec where   rnf (ImportSpec a b c d e) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e@@ -140,7 +148,7 @@   = ImpTypeSome Ident [Ident]   | ImpTypeAll Ident   | ImpValue Ident---DEBUG  deriving (Show)+  deriving (Show)  instance NFData ImportItem where   rnf (ImpTypeSome a b) = rnf a `seq` rnf b@@ -148,7 +156,7 @@   rnf (ImpValue a) = rnf a  data Deriving = Deriving DerStrategy [(Int, EConstraint)] -- The Int is added by the type checker, it indicates how many arguments to keep---DEBUG  deriving (Show)+  deriving (Show)  instance NFData Deriving where   rnf (Deriving a b) = rnf a `seq` rnf b@@ -158,17 +166,18 @@   | DerStock   | DerNewtype   | DerAnyClass-  | DerVia EConstraint---DEBUG  deriving (Show)+  | DerVia EType+  deriving (Show)  instance NFData DerStrategy where   rnf (DerVia a) = rnf a   rnf _ = () --- Indication that we don't want any deriving+-- Indication that we don't want any implicit deriving doNotDerive :: [Deriving] -> Bool-doNotDerive [Deriving DerNone []] = True-doNotDerive _ = False+doNotDerive = any p+ where p (Deriving DerNone []) = True+       p _ = False  data Expr   = EVar Ident@@ -203,7 +212,7 @@   | EQVar Expr EType             -- already resolved identifier   -- only after type checking   | ECon Con---DEBUG  deriving (Show)+  deriving (Show)  instance NFData Expr where   rnf (EVar a) = rnf a@@ -236,6 +245,7 @@   rnf (ECon a) = rnf a  data QForm = QImpl | QExpl | QReqd+  deriving (Show)  instance NFData QForm where   rnf q = seq q ()@@ -244,7 +254,7 @@   = EField [Ident] Expr     -- a.b = e   | EFieldPun [Ident]       -- a.b   | EFieldWild              -- ..---DEBUG  deriving (Show)+  deriving (Show)  instance NFData EField where   rnf (EField a b) = rnf a `seq` rnf b@@ -278,7 +288,7 @@   = ConData ConTyInfo Ident [FieldName]   | ConNew Ident [FieldName]   | ConSyn Ident Int (Expr, EType)---DEBUG  deriving(Show)+  deriving(Show)  instance NFData Con where   rnf (ConData a b c) = rnf a `seq` rnf b `seq` rnf c@@ -292,7 +302,7 @@   | LFromTo Expr Expr   | LFromThen Expr Expr   | LFromThenTo Expr Expr Expr---DEBUG  deriving(Show)+  deriving(Show)  instance NFData Listish where   rnf (LList a) = rnf a@@ -333,14 +343,13 @@   | LRat Rational   | LChar Char   | LStr String-  | LBStr String            -- bytestring+  | LBStr ByteString        -- bytestring   | LPrim String   | LExn String             -- exception to raise-  | LForImp ImpEnt String CType+  | LForImp IdentModule ImpEnt String CType   | LCType CType            -- used for foreign export   | LTick String---DEBUG  deriving (Show)-  deriving (Eq)+  deriving (Eq, Show)  instance NFData Lit where   rnf (LInt a) = rnf a@@ -354,13 +363,17 @@   rnf (LBStr a) = rnf a   rnf (LPrim a) = rnf a   rnf (LExn a) = rnf a-  rnf (LForImp a b c) = rnf a `seq` rnf b `seq` rnf c+  rnf (LForImp a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d   rnf (LCType e) = rnf e   rnf (LTick a) = rnf a  -- A type of a C FFI function newtype CType = CType EType+  deriving (Show) +instance Pretty CType where+  pPrintPrec l p (CType t) = pPrintPrec l p t+ instance Eq CType where   _ == _  =  True    -- Just ignore the CType @@ -372,7 +385,7 @@   | ImpDynamic   | ImpWrapper   | ImpJS String-  deriving (Eq)+  deriving (Eq, Show)  instance NFData ImpEnt where   rnf (ImpStatic a b c) = rnf a `seq` rnf b `seq` rnf c@@ -381,7 +394,7 @@   rnf (ImpJS s) = rnf s  data ImpVal = IPtr | IValue | IFunc-  deriving (Eq)+  deriving (Eq, Show)  instance NFData ImpVal where   rnf a = seq a ()@@ -391,7 +404,7 @@ type ECaseArm = (EPat, EAlts)  data EStmt = SBind EPat Expr | SThen Expr | SLet [EBind] | SRec [EStmt]---DEBUG  deriving (Show)+  deriving (Show)  instance NFData EStmt where   rnf (SBind a b) = rnf a `seq` rnf b@@ -403,13 +416,13 @@  -- A single equation for a function data Eqn = Eqn [EPat] EAlts---DEBUG  deriving (Show)+  deriving (Show)  instance NFData Eqn where   rnf (Eqn a b) = rnf a `seq` rnf b  data EAlts = EAlts [EAlt] [EBind]---DEBUG  deriving (Show)+  deriving (Show)  instance NFData EAlts where   rnf (EAlts a b) = rnf a `seq` rnf b@@ -476,10 +489,10 @@ type EConstraint = EType  data IdKind = IdKind Ident EKind---DEBUG  deriving (Show)+  deriving (Show) -instance Show IdKind where-  show (IdKind i k) = "(" ++ show i ++ "::" ++ show k ++ ")"+instance Pretty IdKind where+  pPrintPrec l p (IdKind i k) = maybeParens (p < 0) $ pPrintPrec l (-1) i <+> text "::" <+> pPrintPrec l (-1) k  instance NFData IdKind where   rnf (IdKind a b) = rnf a `seq` rnf b@@ -499,9 +512,10 @@ kConstraint :: EKind kConstraint = EVar (mkIdent "Primitives.Constraint") +-- XXX Switch to TupleN like GHC? tupleConstr :: SLoc -> Int -> Ident tupleConstr loc 0 = mkIdentSLoc loc "()"-tupleConstr   _ 1 = error "tupleConstr"+tupleConstr   _ 1 = error "tupleConstr"  -- XXX could use Solo tupleConstr loc n = mkIdentSLoc loc (replicate (n - 1) ',')  -- Check if it is a tuple constructor@@ -570,7 +584,7 @@ -- Approximate location; only identifiers and literals carry a location instance HasLoc Expr where   getSLoc (EVar i) = getSLoc i-  getSLoc (EApp e _) = getSLoc e+  getSLoc (EApp f a) = getSLoc f `orSLoc` getSLoc a   getSLoc (EOper e _) = getSLoc e   getSLoc (ELam l _) = l   getSLoc (ELit l _) = l@@ -597,8 +611,7 @@   getSLoc (EUVar _) = noSLoc -- error "getSLoc EUVar"   getSLoc (EQVar e _) = getSLoc e   getSLoc (ECon c) = getSLoc c-  getSLoc (EForall _ [] e) = getSLoc e-  getSLoc (EForall _ iks _) = getSLoc iks+  getSLoc (EForall _ iks e) = getSLoc iks `orSLoc` getSLoc e  instance HasLoc a => HasLoc [a] where   getSLoc [] = noSLoc  -- XXX shouldn't happen@@ -639,8 +652,7 @@ ---------------------------------  data Assoc = AssocLeft | AssocRight | AssocNone---DEBUG  deriving (Show)-  deriving (Eq)+  deriving (Eq, Show)  type Fixity = (Assoc, Int) @@ -676,7 +688,7 @@         EOper t1 its -> EOper (sub t1) (map (second sub) its)         EListish (LList [t]) -> EListish (LList [sub t])         EParen t -> EParen (sub t)-        _ -> error $ "subst unimplemented " ++  show ae+        _ -> error $ "subst unimplemented " ++ showExpr ae   in sub  allBinders :: [Ident] -- a,b,...,z,a1,a2,...@@ -806,8 +818,10 @@ setSLocExpr l (EVar i) = EVar (setSLocIdent l i) setSLocExpr l (ECon c) = ECon (setSLocCon l c) setSLocExpr l (ELit _ k) = ELit l k+setSLocExpr l (EApp f a) = EApp (setSLocExpr l f) a+setSLocExpr l (EForall q vs e) = EForall q vs (setSLocExpr l e) setSLocExpr _ e@(EUVar _) = e-setSLocExpr _ _ = error "setSLocExpr"  -- what other cases do we need?+setSLocExpr _ e = error $ "setSLocExpr: unimpl " ++ show e  -- what other cases do we need?  setSLocCon :: SLoc -> Con -> Con setSLocCon l (ConData ti i fs) = ConData ti (setSLocIdent l i) fs@@ -821,23 +835,17 @@  ---------------- -instance Show EModule where-  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+instance Pretty EModule where+  pPrintPrec l _ (EModule nm es ds) = text "module" <+> pPrint0 l nm <> parens (ppCommaSep (map (pPrint0 l) es)) <+> text "where" $$ ppEDefs l ds -instance Show Eqn where-  show eqn = render $ ppEqns (text "_") (text "=") [eqn]+instance Pretty ExportItem where+  pPrintPrec l _ (ExpModule m) = text "module" <+> pPrint0 l m+  pPrintPrec l _ (ExpTypeSome i is) = pPrint0 l i <> parens (ppCommaSep (map (pPrint0 l) is))+  pPrintPrec l _ (ExpValue i) = pPrint0 l i+  pPrintPrec l _ (ExpDefault i) = text "default" <+> pPrint0 l i -instance Show EDef where-  show d = showEDefs [d]+instance Pretty Eqn where+  pPrintPrec l _ eqn = ppEqns l (text "_") (text "=") [eqn]  showExpr :: Expr -> String showExpr = render . ppExpr@@ -846,7 +854,7 @@ showExprRaw = render . ppExprRaw  showEDefs :: [EDef] -> String-showEDefs = render . ppEDefs+showEDefs = render . ppEDefs prettyNormal  showEBind :: EBind -> String showEBind = render . ppEBind@@ -857,198 +865,215 @@ showEType :: EType -> String showEType = render . ppEType -ppImportItem :: ImportItem -> Doc-ppImportItem ae =-  case ae of-    ImpTypeSome i [] -> ppIdent i-    ImpTypeSome i is -> ppIdent i <> parens (ppCommaSep $ map ppIdent is)-    ImpTypeAll i -> ppIdent i <> text "(..)"-    ImpValue i -> ppIdent i+ppEBind :: EBind -> Doc+ppEBind = pPrint +instance Pretty ImportItem where+  pPrintPrec l _ ae =+   case ae of+    ImpTypeSome i [] -> pPrint0 l i+    ImpTypeSome i is -> pPrint0 l i <> parens (ppCommaSep $ map (pPrint0 l) is)+    ImpTypeAll i -> pPrint0 l i <> text "(..)"+    ImpValue i -> pPrint0 l i+ ppCommaSep :: [Doc] -> Doc ppCommaSep = hsep . punctuate (text ",") -ppEBind :: EBind -> Doc-ppEBind = ppEDef--ppEDef :: EDef -> Doc-ppEDef def =-  case def of-    Data lhs [] ds -> text "data" <+> ppLHS lhs <+> ppDerivings ds-    Data lhs cs ds -> text "data" <+> ppLHS lhs <+> text "=" <+> hsep (punctuate (text " |") (map ppConstr cs)) <+> ppDerivings ds-    Newtype lhs c ds -> text "newtype" <+> ppLHS lhs <+> text "=" <+> ppConstr c <+> ppDerivings ds-    Type lhs t -> text "type" <+> ppLHS lhs <+> text "=" <+> ppEType t-    Fcn i eqns -> ppEqns (ppIdent i) (text "=") eqns-    PatBind p e -> ppEPat p <+> text "=" <+> ppExpr e-    Sign is t -> hsep (punctuate (text ",") (map ppIdent is)) <+> text "::" <+> ppEType t-    KindSign i t -> text "type" <+> ppIdent i <+> text "::" <+> ppEKind t+instance Pretty EDef where+  pPrintPrec l _ def =+   case def of+    Data lhs [] ds -> text "data" <+> ppLHS l lhs <+> ppDerivings l ds+    Data lhs cs ds -> text "data" <+> ppLHS l lhs <+> text "=" <+> hsep (punctuate (text " |") (map (ppConstr l) cs)) <+> ppDerivings l ds+    Newtype lhs c ds -> text "newtype" <+> ppLHS l lhs <+> text "=" <+> ppConstr l c <+> ppDerivings l ds+    Type lhs t -> text "type" <+> ppLHS l lhs <+> text "=" <+> pPrint0 l t+    Fcn i eqns -> ppEqns l (pPrint0 l (EVar i)) (text "=") eqns+    PatBind p e -> ppEPat l p <+> text "=" <+> pPrint0 l e+    Sign is t -> ppCommaSep (map (pPrint0 l) is) <+> text "::" <+> pPrint0 l t+    KindSign i t -> text "type" <+> pPrint0 l i <+> text "::" <+> pPrint0 l t     Import (ImportSpec b q m mm mis) -> text "import" <+>       (if b == ImpBoot then text "{-# SOURCE #-}" else empty) <+>-      (if q then text "qualified" else empty) <+> ppIdent m <> text (maybe "" ((" as " ++) . unIdent) mm) <>+      (if q then text "qualified" else empty) <+> pPrint0 l m <> text (maybe "" ((" as " ++) . unIdent) mm) <>       case mis of         Nothing -> empty-        Just (h, is) -> text (if h then " hiding" else "") <> parens (hsep $ punctuate (text ",") (map ppImportItem is))-    ForImp 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))+        Just (h, is) -> text (if h then " hiding" else "") <> parens (ppCommaSep (map (pPrint0 l) is))+    ForImp cc ie i t -> text "foreign import" <+> text (drop 1 $ show cc) <+> maybe empty (text . show) ie <+> pPrint0 l i <+> text "::" <+> pPrint0 l t+    ForExp cc ie e t -> text "foreign export" <+> text (drop 1 $ show cc) <+> maybe empty (text . show) ie <+> pPrint0 l e   <+> text "::" <+> pPrint0 l t+    Infix (a, p) is -> text ("infix" ++ f a) <+> text (show p) <+> ppCommaSep (map (pPrint0 l) 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 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+    Class sup lhs fds bs -> ppWhere l (text "class" <+> ppCtx l sup <+> ppLHS l lhs <+> ppFunDeps l fds) bs+    Instance ct bs bs' -> ppWhere l (ppWhere l (text "instance" <+> pPrint0 l ct) bs) bs'+    Default mc ts -> text "default" <+> maybe empty (pPrint0 l) mc <+> parens (ppCommaSep (map (pPrint0 l) ts))+    Pattern lhs@(i,_) p meqns -> text "pattern" <+> ppLHS l lhs <+> text "=" <+> pPrint0 l p <+> maybe empty (ppWhere l (text ";") . (:[]) . Fcn i) meqns+    StandDeriving _s _narg ct -> text "deriving instance" <+> pPrint0 l ct+    DfltSign i t -> text "default" <+> pPrint0 l i <+> text "::" <+> pPrint0 l t     SetTCState _ -> text "SetTCState ..." -ppDerivings :: [Deriving] -> Doc-ppDerivings = sep . map ppDeriving+ppDerivings :: PrettyLevel -> [Deriving] -> Doc+ppDerivings l = sep . map (ppDeriving l) -ppDeriving :: Deriving -> Doc-ppDeriving (Deriving s ds) = text "deriving" <+>+ppDeriving :: PrettyLevel -> Deriving -> Doc+ppDeriving l (Deriving s ds) = text "deriving" <+>   case s of     DerNone -> empty     DerStock -> text "stock"     DerNewtype -> text "newtype"     DerAnyClass -> text "anyclass"     DerVia _ -> empty-  <+> parens (hsep $ punctuate (text ",") (map (ppExpr . snd) ds))+  <+> parens (hsep $ punctuate (text ",") (map (pPrint0 l . snd) ds))   <+>   case s of-    DerVia t -> text "via" <+> ppEType t+    DerVia t -> text "via" <+> pPrint0 l t     _ -> empty -ppCtx :: [EConstraint] -> Doc-ppCtx [] = empty-ppCtx ts = ppEType (ETuple ts) <+> text "=>"+ppCtx :: PrettyLevel -> [EConstraint] -> Doc+ppCtx _ [] = empty+ppCtx l ts = pPrint0 l (ETuple ts) <+> text "=>" -ppFunDeps :: [FunDep] -> Doc-ppFunDeps [] = empty-ppFunDeps fds =-  text "|" <+> hsep (punctuate (text ",") (map (\ (is, os) -> hsep (map ppIdent is) <+> text "-" <+> hsep (map ppIdent os)) fds))+ppFunDeps :: PrettyLevel -> [FunDep] -> Doc+ppFunDeps _ [] = empty+ppFunDeps l fds =+  text "|" <+> ppCommaSep (map (\ (is, os) -> hsep (map (pPrint0 l) is) <+> text "-" <+> hsep (map (pPrint0 l) os)) fds) -ppEqns :: Doc -> Doc -> [Eqn] -> Doc-ppEqns name sepr = vcat . map (\ (Eqn ps alts) -> sep [name <+> hsep (map ppEPat ps), ppAlts sepr alts])+ppEqns :: PrettyLevel -> Doc -> Doc -> [Eqn] -> Doc+ppEqns l name sepr = vcat . map (\ (Eqn ps alts) -> sep [name <+> hsep (map (pPrintPrec l 11) ps), ppAlts l sepr alts]) -ppConstr :: Constr -> Doc-ppConstr (Constr iks ct c _ cs) = ppForall QImpl iks <+> ppCtx ct <+> ppIdent c <+> ppCs cs-  where ppCs (Left  ts) = hsep (map ppSType ts)+ppConstr :: PrettyLevel -> Constr -> Doc+ppConstr l (Constr iks ct c _ cs) = ppForall l QImpl iks <+> ppCtx l ct <+> pPrint0 l c <+> ppCs cs+  where ppCs (Left  ts) = hsep (map (ppSType l) ts)         ppCs (Right fs) = braces (hsep $ map f fs)-          where f (i, t) = ppIdent i <+> text "::" <+> ppSType t <> text ","+          where f (i, t) = pPrint0 l i <+> text "::" <+> ppSType l t <> text "," -ppSType :: SType -> Doc-ppSType (False, t) = ppEType t-ppSType (True, t) = text "!" <> ppEType t+ppSType :: PrettyLevel -> SType -> Doc+ppSType l (False, t) = pPrint0 l t+ppSType l (True, t) = text "!" <> pPrint0 l t -ppLHS :: LHS -> Doc-ppLHS (f, vs) = hsep (ppIdent f : map ppIdKind vs)+ppLHS :: PrettyLevel -> LHS -> Doc+ppLHS l (f, vs) = hsep (pPrint0 l f : map (ppIdKind l) vs) -ppIdKind :: IdKind -> Doc-ppIdKind (IdKind i (EVar d)) | isDummyIdent d = ppIdent i-ppIdKind (IdKind i k) = parens $ ppIdent i <> text "::" <> ppEKind k+ppIdKind :: PrettyLevel -> IdKind -> Doc+ppIdKind l (IdKind i (EVar d)) | isDummyIdent d = pPrint0 l i+ppIdKind l (IdKind i k) = parens $ pPrint0 l i <> text "::" <> pPrint0 l k -ppEDefs :: [EDef] -> Doc-ppEDefs ds = vcat (map pp ds)-  where pp d@(Sign _ _) = ppEDef d-        pp d@(Import _) = ppEDef d-        pp d            = ppEDef d $+$ text ""+ppEDefs :: PrettyLevel -> [EDef] -> Doc+ppEDefs l ds = vcat (map pp ds)+  where pp d@(Sign _ _) = pPrint0 l d+        pp d@(Import _) = pPrint0 l d+        pp d            = pPrint0 l d $+$ text "" -ppAlts :: Doc -> EAlts -> Doc-ppAlts asep (EAlts alts bs) = ppWhere (ppAltsL asep alts) bs+ppAlts :: PrettyLevel -> Doc -> EAlts -> Doc+ppAlts l asep (EAlts alts bs) = ppWhere l (ppAltsL l asep alts) bs -ppWhere :: Doc -> [EBind] -> Doc-ppWhere d [] = d-ppWhere d bs = (d <+> text "where") $+$ nest 2 (vcat (map ppEBind bs))+ppWhere :: PrettyLevel -> Doc -> [EBind] -> Doc+ppWhere _ d [] = d+ppWhere l d bs = (d <+> text "where") $+$ nest 2 (vcat (map (pPrint0 l) bs)) -ppAltsL :: Doc -> [EAlt] -> Doc-ppAltsL asep [([], e)] = text "" <+> asep <+> ppExpr e-ppAltsL asep alts = vcat (map (ppAlt asep) alts)+ppAltsL :: PrettyLevel -> Doc -> [EAlt] -> Doc+ppAltsL l asep [([], e)] = text "" <+> asep <+> pPrint0 l e+ppAltsL l asep alts = vcat (map (ppAlt l asep) alts) -ppAlt :: Doc -> EAlt -> Doc-ppAlt asep (ss, e) = text " |" <+> hsep (punctuate (text ",") (map ppEStmt ss)) <+> asep <+> ppExpr e+ppAlt :: PrettyLevel -> Doc -> EAlt -> Doc+ppAlt l asep (ss, e) = text " |" <+> ppCommaSep (map (pPrint0 l) ss) <+> asep <+> pPrint0 l e  ppExprRaw :: Expr -> Doc-ppExprRaw = ppExprR True+ppExprRaw = pPrintPrec (PrettyLevel 1) 0  ppExpr :: Expr -> Doc-ppExpr = ppExprR False+ppExpr = pPrint -ppExprR :: Bool -> Expr -> Doc-ppExprR raw = ppE-  where-    ppE :: Expr -> Doc-    ppE ae =+instance Pretty Expr where+  pPrintPrec l = ppE+   where+    raw = l > PrettyLevel 0+    ppE :: PrettyPrec -> Expr -> Doc+    ppE prec ae =       case ae of-        EVar i | raw            -> text si-               | isOperChar cop -> parens (text op)-               | otherwise      -> text s+        EVar i | raw       -> text si+               | oper      -> parens (text op)+               | otherwise -> text s                  where op = unIdent (unQualIdent i)                        si = unIdent i                        s = if "inst$" `isInfixOf` si then si else op-                       cop = head op-        EApp _ _ -> ppApp [] ae-        EOper e ies -> ppE (foldl (\ e1 (i, e2) -> EApp (EApp (EVar i) e1) e2) e ies)-        ELam _ qs -> parens $ text "\\" <> ppEqns empty (text "->") qs+                       oper = case op of+                                [c] -> isOperChar c+                                c:d:_ -> isOperChar c && isOperChar d+                                _ -> False+        EApp _ _ -> ppApp prec [] ae+        EOper e ies -> ppE prec (foldl (\ e1 (i, e2) -> EApp (EApp (EVar i) e1) e2) e ies)+        ELam _ qs -> parens $ text "\\" <> ppEqns l empty (text "->") qs         ELit _ i -> text (showLit i)-        ECase e as -> text "case" <+> ppE e <+> text "of" $$ nest 2 (vcat (map ppCaseArm as))-        ELet bs e -> text "let" $$ nest 2 (vcat (map ppEBind bs)) $$ text "in" <+> ppE e-        ETuple es -> parens $ hsep $ punctuate (text ",") (map ppE es)-        EParen e -> parens (ppE e)-        EDo mn ss -> maybe (text "do") (\ n -> ppIdent n <> text ".do") mn $$ nest 2 (vcat (map ppEStmt ss))-        ESectL e i -> parens $ ppE e <+> ppIdent i-        ESectR i e -> parens $ ppIdent i <+> ppE e-        EIf e1 e2 e3 -> parens $ sep [text "if" <+> ppE e1, text "then" <+> ppE e2, text "else" <+> ppE e3]-        EMultiIf e -> text "if" <+> ppAlts (text "->") e-        EListish l -> ppListish l-        ESign e t -> parens $ ppE e <+> text "::" <+> ppEType t-        ENegApp e -> text "-" <+> ppE e-        EUpdate ee ies -> ppE ee <> text "{" <+> hsep (punctuate (text ",") (map ppField ies)) <+> text "}"-        ESelect is -> parens $ hcat $ map (\ i -> text "." <> ppIdent i) is-        ETypeArg t -> text "@" <> ppE t-        EAt i e -> ppIdent i <> text "@" <> ppE e-        EViewPat e p -> parens $ ppE e <+> text "->" <+> ppE p-        ELazy True p -> text "~" <> ppE p-        ELazy False p -> text "!" <> ppE p-        EOr ps -> parens $ hsep (punctuate (text ";") (map ppE ps))+        ECase e as -> maybeParens (prec > 0) $ text "case" <+> ppE 0 e <+> text "of" $$ nest 2 (vcat (map (ppCaseArm l) as))+        ELet bs e -> maybeParens (prec > 0) $ text "let" $$ nest 2 (vcat (map ppEBind bs)) $$ text "in" <+> ppE 0 e+        ETuple es -> parens $ hsep $ punctuate (text ",") (map (ppE 0) es)+        EParen e -> parens (ppE 0 e)+        EDo mn ss -> maybeParens (prec > 0) $ maybe (text "do") (\ n -> pPrint0 l n <> text ".do") mn $$ nest 2 (vcat (map (pPrint0 l) ss))+        ESectL e i -> parens $ ppE appPrec e <+> pPrint0 l i+        ESectR i e -> parens $ pPrint0 l i <+> ppE appPrec e+        EIf e1 e2 e3 -> maybeParens (prec > 0) $ sep [text "if" <+> ppE 0 e1, text "then" <+> ppE 0 e2, text "else" <+> ppE 0 e3]+        EMultiIf e -> maybeParens (prec > 0) $ text "if" <+> ppAlts l (text "->") e+        EListish lst -> ppListish l lst+        ESign e t -> maybeParens (prec > 0) $ ppE 1 e <+> text "::" <+> ppE 1 t+        ENegApp e -> text "-" <+> ppE 6 e+        EUpdate ee ies -> ppE 12 ee <> text "{" <+> hsep (punctuate (text ",") (map (ppField l) ies)) <+> text "}"+        ESelect is -> maybeParens (prec > appPrec) $ hcat $ map (\ i -> text "." <> pPrint0 l i) is+        ETypeArg t -> text "@" <> ppE appPrec t+        EAt i e -> pPrint0 l i <> text "@" <> ppE appPrec e+        EViewPat e p -> parens $ ppE appPrec e <+> text "->" <+> ppE appPrec p+        ELazy True p -> text "~" <> ppE appPrec p+        ELazy False p -> text "!" <> ppE appPrec p+        EOr ps -> parens $ hsep (punctuate (text ";") (map (ppE 0) ps))         EUVar i -> text ("_a" ++ show i)-        EQVar e t -> parens $ ppE e <> text ":::" <> ppE t-        ECon c -> {-text "***" <>-} ppCon c-        EForall q iks e -> parens $ ppForall q iks <+> ppEType e+        EQVar e t -> parens $ ppE 0 e <> text ":::" <> ppE 0 t+        ECon c -> {-text "***" <>-} ppCon l c+        EForall q iks e -> maybeParens (prec > 0) $ ppForall l q iks <+> ppE 0 e -    ppApp :: [Expr] -> Expr -> Doc-    ppApp as (EApp f a) = ppApp (a:as) f-    ppApp as f | raw = ppApply f as-    ppApp as (EVar i) | isOperChar cop, [a, b] <- as = parens $ ppE a <+> text op <+> ppExpr b-                      | isOperChar cop, [a] <- as    = parens $ ppE a <+> text op-                      | cop == ',' && length op + 1 == length as-                                                     = ppE (ETuple as)-                      | op == "[]", length as == 1   = ppE (EListish (LList as))-                        where op = unIdent (unQualIdent i)-                              cop = head op-    ppApp as f = ppApply f as-    ppApply f as = parens $ hsep (map ppE (f:as))+    ppApp :: PrettyPrec -> [Expr] -> Expr -> Doc+    ppApp prec as (EApp f a) = ppApp prec (a:as) f+    ppApp prec as f | raw = ppApply prec f as+    ppApp prec as (EVar i) | isOperChar cop, [a, b] <- as = maybeParens (prec > p) $ ppE pl a <+> text op <+> ppE pr b+                           | isOperChar cop, [a] <- as    = parens $ ppE appPrec a <+> text op+                           | cop == ',' && length op + 1 == length as+                                                          = ppE prec (ETuple as)+                           | op == "[]", length as == 1   = ppE prec (EListish (LList as))+      where op = unIdent (unQualIdent i)+            cop = head op+            (pl, p, pr) = lookupPrec op+    ppApp prec as f = ppApply prec f as+    ppApply prec f as = maybeParens (prec > appPrec) $ hsep (map (ppE (appPrec + 1)) (f:as)) -ppField :: EField -> Doc-ppField (EField is e) = hcat (punctuate (text ".") (map ppIdent is)) <+> text "=" <+> ppExpr e-ppField (EFieldPun is) = hcat (punctuate (text ".") (map ppIdent is))-ppField EFieldWild = text ".."+-- We don't have the fixity tables, so just hardcode a few common operators.+lookupPrec :: String -> (Int, Int, Int)+lookupPrec s = fromMaybe (10, 9, 10) $ lookup s   -- put parens both left and right on unknown operators+  [ ("->", (1, 0, 0))+  , ("=>", (1, 0, 0))+{-+  , ("||", (2, 2, 3))+  , ("&&", (3, 3, 4))+  , ("==", (4, 4, 4))+-}+  ] -ppForall :: QForm -> [IdKind] -> Doc+ppField :: PrettyLevel -> EField -> Doc+ppField l (EField is e) = hcat (punctuate (text ".") (map (pPrint0 l) is)) <+> text "=" <+> ppExpr e+ppField l (EFieldPun is) = hcat (punctuate (text ".") (map (pPrint0 l) is))+ppField _ EFieldWild = text ".."++ppForall :: PrettyLevel -> QForm -> [IdKind] -> Doc --ppForall [] = empty-ppForall q iks = text "forall" <+> hsep (map ppIdKind iks) <+> text qs+ppForall l q iks = text "forall" <+> hsep (map (ppIdKind l) iks) <+> text qs   where qs = case q of QReqd -> "->"; _ -> "." -ppListish :: Listish -> Doc-ppListish (LList es) = ppList ppExpr es-ppListish (LCompr e ss) = brackets $ ppExpr e <+> text "|" <+> hsep (punctuate (text ",") (map ppEStmt ss))-ppListish (LFrom e1) = brackets $ ppExpr e1 <> text ".."-ppListish (LFromTo e1 e2) = brackets $ ppExpr e1 <> text ".." <> ppExpr e2-ppListish (LFromThen e1 e2) = brackets $ ppExpr e1 <> text "," <> ppExpr e2 <> text ".."-ppListish (LFromThenTo e1 e2 e3) = brackets $ ppExpr e1 <> text "," <> ppExpr e2 <> text ".." <> ppExpr e3+ppListish :: PrettyLevel -> Listish -> Doc+ppListish l (LList es) = ppList (pPrint0 l) es+ppListish l (LCompr e ss) = brackets $ pPrint0 l e <+> text "|" <+> ppCommaSep (map (pPrint0 l) ss)+ppListish l (LFrom e1) = brackets $ pPrint0 l e1 <> text ".."+ppListish l (LFromTo e1 e2) = brackets $ pPrint0 l e1 <> text ".." <> pPrint0 l e2+ppListish l (LFromThen e1 e2) = brackets $ pPrint0 l e1 <> text "," <> pPrint0 l e2 <> text ".."+ppListish l (LFromThenTo e1 e2 e3) = brackets $ pPrint0 l e1 <> text "," <> pPrint0 l e2 <> text ".." <> pPrint0 l e3 -ppCon :: Con -> Doc-ppCon (ConData _ s _) = ppIdent s-ppCon (ConNew s _) = ppIdent s-ppCon (ConSyn s _ _) = ppIdent s+ppCon :: PrettyLevel -> Con -> Doc+ppCon l (ConData _ s _) = pPrint0 l s+ppCon l (ConNew s _) = pPrint0 l s+ppCon l (ConSyn s _ _) = pPrint0 l s  -- Literals are tagged the way they appear in the combinator file: --  #   Int@@ -1061,8 +1086,12 @@ --  ^   FFI function --      primitive showLit :: Lit -> String-showLit l =-  case l of+showLit = render . pPrint++instance Pretty Lit where+  pPrintPrec _ _ lit =+   text $+   case lit of     LInt i     -> '#' : show i     LInt64 i   -> '#' : '#' : show i     LInteger i -> '%' : show i@@ -1074,32 +1103,29 @@     LBStr s    -> show s     LPrim s    -> s     LExn s     -> s-    LForImp ie s _-> '^' : if isPtr then '&':s else s+    LForImp _ ie s _-> '^' : if isPtr then '&':s else s       where isPtr = case ie of ImpStatic _ IPtr _ -> True; _ -> False-    LCType (CType t) -> show t+    LCType (CType t) -> showEType t     LTick s    -> '!' : s -ppEStmt :: EStmt -> Doc-ppEStmt as =-  case as of-    SBind p e -> ppEPat p <+> text "<-" <+> ppExpr e-    SThen e -> ppExpr e-    SLet bs -> text "let" $$ nest 2 (vcat (map ppEBind bs))-    SRec ss -> text "rec" $$ nest 2 (vcat (map ppEStmt ss))+instance Pretty EStmt where+  pPrintPrec l _ as =+    case as of+      SBind p e -> ppEPat l p <+> text "<-" <+> pPrint0 l e+      SThen e -> pPrint0 l e+      SLet bs -> text "let" $$ nest 2 (vcat (map (pPrint0 l) bs))+      SRec ss -> text "rec" $$ nest 2 (vcat (map (pPrint0 l) ss)) -ppCaseArm :: ECaseArm -> Doc-ppCaseArm arm =+ppCaseArm :: PrettyLevel -> ECaseArm -> Doc+ppCaseArm l arm =   case arm of-    (p, alts) -> ppEPat p <> ppAlts (text "->") alts+    (p, alts) -> ppEPat l p <> ppAlts l (text "->") alts -ppEPat :: EPat -> Doc-ppEPat = ppExpr+ppEPat :: PrettyLevel -> EPat -> Doc+ppEPat = pPrint0  ppEType :: EType -> Doc-ppEType = ppExpr--ppEKind :: EKind -> Doc-ppEKind = ppEType+ppEType = pPrint0 prettyNormal  ppList :: forall a . (a -> Doc) -> [a] -> Doc ppList pp xs = brackets $ hsep $ punctuate (text ",") (map pp xs)@@ -1141,8 +1167,12 @@  impossibleShow :: forall a b .                   (HasCallStack, Show a, HasLoc a) => a -> b-impossibleShow a = error $ "impossible: " ++ show (getSLoc a) ++ " " ++ show a+impossibleShow a = error $ "impossible: " ++ prettyShow (getSLoc a) ++ " " ++ show a +impossiblePP :: forall a b .+                  (HasCallStack, Pretty a, HasLoc a) => a -> b+impossiblePP a = error $ "impossible: " ++ prettyShow (getSLoc a) ++ " " ++ prettyShow a+ -----------  -- Probably belongs somewhere else@@ -1163,7 +1193,7 @@ -- Make a call to generate an exception with location info mkExn :: SLoc -> String -> String -> Expr mkExn loc msg exn =-  let str = mkEStr loc $ msg ++ ", at " ++ show loc+  let str = mkEStr loc $ msg ++ ", at " ++ prettyShow loc       fn  = ELit loc $ LExn $ "Control.Exception.Internal." ++ exn   in  EApp fn str @@ -1176,7 +1206,7 @@         loop _ _ = Nothing  getApp :: HasCallStack => EType -> (Ident, [EType])-getApp t = fromMaybe (impossibleShow t) $ getAppM t+getApp t = fromMaybe (impossiblePP t) $ getAppM t  type TyVar = Ident @@ -1204,7 +1234,7 @@     go bound (ETuple es) acc = goList bound es acc     go bound (EParen e) acc = go bound e acc     go bound (EQVar e _) acc = go bound e acc-    go _ x _ = error ("freeTyVars: " ++ show x) --  impossibleShow x+    go _ x _ = error ("freeTyVars: " ++ showEType x) --  impossibleShow x     goList bound es acc = foldr (go bound) acc es  getImplies :: EType -> Maybe (EConstraint, EType)
src/MicroHs/FFI.hs view
@@ -1,5 +1,6 @@ module MicroHs.FFI(makeFFI) where import qualified Prelude(); import MHSPrelude+import Data.Char import Data.List import MicroHs.Desugar(LDef) import MicroHs.Exp@@ -10,18 +11,18 @@ --import Debug.Trace  -- 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] ]+makeFFI :: Flags -> [(Ident, Ident, CType)] -> [IdentModule ]-> [[LDef]] -> (String, String)+makeFFI _ forExps exclude dss =+  let ffiImports = nubBy eq [ (ie, n, t, mn) | ds <- dss, (_, d) <- ds, Lit (LForImp mn 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-                       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 ]+                       eq (_, n, _, _) (_, n', _, _) = n == n'+      wrappers = [ t | (ImpWrapper, _, t, _) <- ffiImports]+      dynamics = [ t | (ImpDynamic, _, t, _) <- ffiImports]+      imps     = filter ((`notElem` exclude) . impModule) $ 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+        where isJS (ImpJS _, _, _, _) = True               isJS _ = False       mkSig (_, i, CType t) = let (as, ior) = getArrows t in mkExportSig i as ior ++ ";"       header = unlines@@ -87,14 +88,17 @@           "}"         ] -impName :: (ImpEnt, String, EType) -> String-impName (_, s, _) = s+impName :: (ImpEnt, String, EType, IdentModule) -> String+impName (_, s, _, _) = s -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 ++ "},"+impModule :: (ImpEnt, String, EType, IdentModule) -> IdentModule+impModule (_, _, _, m) = m++mkEntry :: (ImpEnt, String, EType, IdentModule) -> 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@@ -123,8 +127,8 @@ 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) =+mkHdr :: (ImpEnt, String, EType, IdentModule) -> String+mkHdr (ImpStatic _ IPtr fn, f, iot, _) =   let r = checkIO iot       (s, _) =         case dropApp identPtr r of@@ -135,22 +139,34 @@               Nothing -> errorMessage (getSLoc r) "foreign & must be Ptr/FunPtr"       body = "return " ++ mkRet r 0 (s ++ "&" ++ fn)   in  mkMhsFun ("addr_" ++ f) body-mkHdr (ImpStatic _ IFunc fn, f, t) =+mkHdr (ImpStatic _ IFunc fn, f, t, _) =   let (as, ior) = getArrows t       r = checkIO ior-      n = length as+      len = length as       call = fn ++ "(" ++ intercalate ", " (zipWith mkArg as [0..]) ++ ")"       fcall =         if isUnit r then-          call ++ "; return mhs_from_Unit(s, " ++ show n ++ ")"+          call ++ "; return mhs_from_Unit(s, " ++ show len ++ ")"         else-          "return " ++ mkRet r n call+          "return " ++ mkRet r len call   in  mkMhsFun f fcall-mkHdr (ImpStatic _ IValue val, f, iot) =-  let r = checkIO iot-      body = "return " ++ mkRet r 0 val-  in  mkMhsFun f body-mkHdr (ImpJS s, f, ty) =+mkHdr (ImpStatic _ IValue val, f, t, _) =+  let (as, ior) = getArrows t+      r = checkIO ior+      len = length as+      call = expand val+      expand [] = []+      expand ('$':c:cs) | isDigit c =+        let n = digitToInt c - 1+        in mkArg (as !! n) n ++ expand cs+      expand (c:cs) = c : expand cs+      fcall =+        if isUnit r then+          call ++ "; return mhs_from_Unit(s, " ++ show len ++ ")"+        else+          "return " ++ mkRet r len call+  in  mkMhsFun f fcall+mkHdr (ImpJS s, f, ty, _) =   let (as, ior) = getArrows ty       rt = checkIO ior       jsr = jsTypeNameR rt@@ -231,7 +247,7 @@ jsTypes =   [ ("Primitives.Int",    "Int")   , ("Primitives.Double", "Double")-  , ("Primitives.Float",  "Double")+  , ("Primitives.Float",  "Float")   ]  -- These are already in the runtime@@ -241,13 +257,14 @@   "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",+  "putb", "sin", "sqrt", "system", "tan", "tmpname", "ungetb", "remove",   "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_lzma_compressor", "add_lzma_decompressor",   "add_rle_compressor", "add_rle_decompressor",   "add_base64_encoder", "add_base64_decoder",   "add_bwt_compressor", "add_bwt_decompressor",@@ -274,8 +291,58 @@   "mpz_log2",   "want_gmp",   "gettimeofday",-  "E2BIG", "EAGAIN", "EINTR", "EINVAL", "EWOULDBLOCK",+  "EOK", "E2BIG", "EACCES", "EADDRINUSE", "EADDRNOTAVAIL", "EADV", "EAFNOSUPPORT", "EAGAIN",+  "EALREADY", "EBADF", "EBADMSG", "EBADRPC", "EBUSY", "ECHILD", "ECOMM", "ECONNABORTED",+  "ECONNREFUSED", "ECONNRESET", "EDEADLK", "EDESTADDRREQ", "EDIRTY", "EDOM", "EDQUOT",+  "EEXIST", "EFAULT", "EFBIG", "EFTYPE", "EHOSTDOWN", "EHOSTUNREACH", "EIDRM", "EILSEQ",+  "EINPROGRESS", "EINTR", "EINVAL", "EIO", "EISCONN", "EISDIR", "ELOOP", "EMFILE", "EMLINK",+  "EMSGSIZE", "EMULTIHOP", "ENAMETOOLONG", "ENETDOWN", "ENETRESET", "ENETUNREACH",+  "ENFILE", "ENOBUFS", "ENODATA", "ENODEV", "ENOENT", "ENOEXEC", "ENOLCK", "ENOLINK",+  "ENOMEM", "ENOMSG", "ENONET", "ENOPROTOOPT", "ENOSPC", "ENOSR", "ENOSTR", "ENOSYS",+  "ENOTBLK", "ENOTCONN", "ENOTDIR", "ENOTEMPTY", "ENOTSOCK", "ENOTSUP", "ENOTTY", "ENXIO",+  "EOPNOTSUPP", "EPERM", "EPFNOSUPPORT", "EPIPE", "EPROCLIM", "EPROCUNAVAIL",+  "EPROGMISMATCH", "EPROGUNAVAIL", "EPROTO", "EPROTONOSUPPORT", "EPROTOTYPE",+  "ERANGE", "EREMCHG", "EREMOTE", "EROFS", "ERPCMISMATCH", "ERREMOTE", "ESHUTDOWN",+  "ESOCKTNOSUPPORT", "ESPIPE", "ESRCH", "ESRMNT", "ESTALE", "ETIME", "ETIMEDOUT",+  "ETOOMANYREFS", "ETXTBSY", "EUSERS", "EWOULDBLOCK", "EXDEV",   "errno",   "strerror_r",-  "environ"+  "environ",+  "get_executable_path",+  "setenv", "unsetenv",+  "set_permissions", "get_permissions",+  "F_SETFL", "O_NONBLOCK", "SOL_SOCKET", "SO_DEBUG", "SO_ERROR", "SO_REUSEADDR", "SO_TYPE",+  "accept", "bind", "close", "connect", "fcntl", "getsockopt", "listen", "recv", "send", "setsockopt", "socket"   ]++{-+-- lib/ modules that use foreign import+libImports :: [String]+libImports = [+  "Data.Integer_Type",+  "Data.Integer.Internal",+  "System.Process",+  "System.Environment",+  "System.Compress.ByteString",+  "System.Compress",+  "System.IO.TimeMilli",+  "System.IO.Open",+  "System.IO.Transducers",+  "System.IO.MD5",+  "System.IO.Base",+  "System.IO.StringHandle",+  "System.IO.Internal",+  "System.IO.Serialize",+  "System.CPUTime",+  "System.Directory",+  "System.Cmd",+  "Data.ByteString",+  "Data.Double",+  "Data.Float",+  "Foreign.Marshal.Utils",+  "Foreign.Marshal.Alloc",+  "Foreign.Storable",+  "Foreign.C.Error",+  "Primitives"+  ]+-}
src/MicroHs/Fixity.hs view
@@ -10,18 +10,21 @@ --   p - prefix op --   o - any op --   e - operand---  Three inputs: stack of operand, stack of operators, input sequence+--  Three inputs: stack of operands, stack of operators, input sequence.+--  State transitions: --    [e          ] [       ] [           ] --         ->  done+-- --    [e2, e1, ...] [by, ...] [bx, ...] --         ->  ambig,                                     if prec bx == prec by && (assoc bx /= assoc by || assoc bx == None) --         ->  [e1 `by` e2, ...] [        ...] [bx, ...], if prec bx < prec by || prec bx == prec by && assoc bx == Left --         ->  [e2, e1,     ...] [bx, by, ...] [    ...], otherwise+-- --    [...]         []        [bx, e, ...]---         ->  [e, ...         ] [bx         ] [        ...]---    [...]         [...]     [e, ...]---         ->  [e, ...         ] [        ...] [        ...]+--         ->  [e, ...         ] [bx         ] [    ...] --+--    [...]         [...]     [e, ...]+--         ->  [e, ...         ] [        ...] [    ...] -- --    [e2, e1, ...] [py, ...] [bx, ...] --         ->  error,                                    if prec bx == prec py && assoc bx /= assoc py@@ -31,6 +34,7 @@ --    [e2, e1, ...] [by, ...] [px,  ...] --         ->  error                                     if prec px <= prec by --         ->  [   e2, e1, ...] [px, by, ...] [    ...], otherwise+-- --    [e2, e1, ...] [py, ...] [px,  ...] --         ->  [   e2, e1, ...] [px, py, ...] [    ...], otherwise @@ -43,8 +47,14 @@ defaultFixity :: Fixity defaultFixity = (AssocLeft, 9) -eNeg :: SLoc -> Expr-eNeg loc = EVar (mkBuiltin loc "negate")+-- Do negation of literals right away,  This is not strictly correct,+-- but it allows things like (-128)::Int8 to avoid overflow in the negation.+-- XXX Should implement LexicalNegation.+-- Don't negate 0, since that ruins floating point with -0.+eNegate :: Expr -> Expr+eNegate (ELit l (LInteger x)) | x /= 0 = ELit l (LInteger (-x))+eNegate e = EApp eNeg e+  where eNeg = EVar (mkBuiltin (getSLoc e) "negate")  negFixity :: Fixity negFixity = (AssocLeft, 6)@@ -52,11 +62,11 @@ resolveFixity :: Expr -> [((Expr, Fixity), Expr)] -> Either (SLoc, String) Expr resolveFixity ae oes =   let inps = expr ae ++ concatMap opexpr oes-      expr (ENegApp e) = Rator FixPre (eNeg (getSLoc e)) negFixity : expr e+      expr (ENegApp e) = Rator FixPre undefined negFixity : expr e  -- there's only one prefix operator, so undefined is ok       expr e = [Rand e]       opexpr ((f, fx), e) = Rator FixIn f fx : expr e -      oper (Rator FixPre f _) (e:es) = EApp f e : es+      oper (Rator FixPre _ _) (e:es) = eNegate e : es       oper (Rator FixIn  f _) (e2:e1:es) = EApp (EApp f e1) e2 : es       oper _ _ = undefined 
src/MicroHs/Flags.hs view
@@ -3,12 +3,13 @@   DumpFlag(..), dumpIf,   wantGMP) where import qualified Prelude(); import MHSPrelude+import MicroHs.Config  data Flags = Flags {   verbose    :: Int,        -- verbosity level   runIt      :: Bool,       -- run instead of compile   mhsdir     :: FilePath,   -- where MHS files live-  paths      :: [FilePath], -- module search path+  srcPaths   :: [FilePath], -- module search path   output     :: String,     -- output file   loading    :: Bool,       -- show loading message   speed      :: Bool,       -- show lines/s@@ -23,25 +24,35 @@   base64     :: Bool,       -- base64 encode generated combinators   buildPkg   :: Maybe FilePath, -- build a package   listPkg    :: Maybe FilePath, -- list package contents-  pkgPath    :: [FilePath], -- package search path+  pkgPaths   :: [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,   useStdin   :: Bool,       -- Use stdin in interactive system-  noLink     :: Bool        -- Just generate an unlinked object file+  noLink     :: Bool,       -- Just generate an unlinked object file+  fPgm       :: Maybe String, -- preprocessor for -F+  fArgs      :: [String],   -- arguments for preprocessor+  doF        :: Bool,       -- run preprocessor+  interactive:: Bool,       -- enter interactive mode+  evalArg    :: Maybe String, -- evaluate an expression+  editor     :: Maybe String, -- Hugs-like flag to invoke the editor.+  iPrint     :: Maybe String, -- interactive print function+  config     :: Config,       -- from mhs.config file+  embedFFIs  :: [String],     -- embed FFI stubs from these packages+  embedPkgs  :: [String]      -- embed these packages   }   deriving (Show)  verbosityGT :: Flags -> Int -> Bool verbosityGT flags v = verbose flags > v -defaultFlags :: FilePath -> Flags-defaultFlags dir = Flags {+defaultFlags :: Flags+defaultFlags = Flags {   verbose    = 0,   runIt      = False,-  mhsdir     = dir,-  paths      = ["."] ++ gmp ++ [dir ++ "/lib"],+  mhsdir     = ".",+  srcPaths   = [],   output     = "out.comb",   loading    = False,   speed      = False,@@ -56,19 +67,26 @@   base64     = False,   buildPkg   = Nothing,   listPkg    = Nothing,-  pkgPath    = [],+  pkgPaths   = [],   installPkg = False,   preload    = [],-  target     = "default",+  target     = if _isWindows then "windows" else "unix",   dumpFlags  = [],   useStdin   = False,-  noLink     = False+  noLink     = False,+  fPgm       = Nothing,+  fArgs      = [],+  doF        = False,+  interactive = False,+  evalArg     = Nothing,+  editor      = Nothing,+  iPrint      = Nothing,+  config      = [],+  embedFFIs   = [],+  embedPkgs   = []   }-  -- This is a hack so that the in-place mhs picks up GMP.-  where gmp | dir == "." && wantGMP = ["lib/gmp"]-            | otherwise             = [] -data DumpFlag = Dpreproc | Dparse | Dderive | Dtypecheck | Ddesugar | Dlinked | Dtoplevel | Dcombinator | Dall+data DumpFlag = Dpreproc | Dparse | Dderive | DexpandInst | Dtypecheck | Ddesugar | Dlinked | Dtoplevel | Dcombinator | Dall   deriving (Eq, Show, Enum, Bounded)  dumpIf :: Monad m => Flags -> DumpFlag -> m () -> m ()
src/MicroHs/Ident.hs view
@@ -15,7 +15,7 @@   unQualString,   qualOf,   addIdentSuffix,-  SLoc(..), noSLoc,+  SLoc(..), noSLoc, isNoSLoc,   orSLoc,   showSLoc, slocFile,   isUpperX,@@ -24,7 +24,7 @@   ) where import qualified Prelude(); import MHSPrelude hiding(head) import Data.Char-import Text.PrettyPrint.HughesPJLite+import Text.PrettyPrint.HughesPJLiteClass import MicroHs.List(dropEnd)  import Data.Text(Text, pack, unpack, append, head, cons)@@ -50,17 +50,23 @@ type Col  = Int  data SLoc = SLoc FilePath Line Col---  deriving (Eq)+  deriving (Show) -instance Show SLoc where-  show (SLoc f l c) = show f ++ "," ++ show l ++ ":" ++ show c+-- instance Show SLoc where+--  show (SLoc f l c) = show f ++ "," ++ show l ++ ":" ++ show c +instance Pretty SLoc where+  pPrintPrec d _ (SLoc f l c) = pPrint0 d f <> text "," <> pPrint0 d l <> text ":" <> pPrint0 d c+ instance NFData SLoc where   rnf (SLoc a b c) = rnf a `seq` rnf b `seq` rnf c  data Ident = Ident SLoc Text-  --deriving (Show)+--  deriving (Show) +instance Show Ident where+  show = showIdent+ instance Eq Ident where   Ident _ i == Ident _ j  =  i == j @@ -71,12 +77,12 @@   Ident _ i >  Ident _ j  =  i >  j   Ident _ i >= Ident _ j  =  i >= j -instance Show Ident where-  show = showIdent- instance NFData Ident where   rnf (Ident a b) = rnf a `seq` rnf b +instance Pretty Ident where+  pPrintPrec _ _ = ppIdent+ slocIdent :: Ident -> SLoc slocIdent (Ident l _) = l @@ -146,7 +152,7 @@ isConIdent :: Ident -> Bool isConIdent i@(Ident _ t) =   let c = headIdent i-  in  isUpperX c || c == ':' || c == ',' || t == pack "[]"  || t == pack "()" || t == pack "->"+  in  isUpperX c || c == ':' || c == ',' || t == pack "[]"  || t == pack "()" || t == pack "->" || t == pack "\x2192"  isOperChar :: Char -> Bool isOperChar '@' = True@@ -200,8 +206,8 @@ slocFile (SLoc f _ _) = f  isUpperX :: Char -> Bool-isUpperX '\8658' = False  -- these two lines avoid using the whole Unicode machinery-isUpperX '\8594' = False+isUpperX '\x21d2' = False  -- these two lines avoid using the whole Unicode machinery+isUpperX '\x2192' = False isUpperX c = isUpper c  -- This is a hack to hide an identifier without removing it
src/MicroHs/IdentMap.hs view
@@ -31,10 +31,8 @@     (Map a)        -- right subtree --  deriving(Show) -{- instance Show a => Show (Map a) where   show m = show (toList m)--}  instance NFData a => NFData (Map a) where   rnf Nil = ()
src/MicroHs/IntMap.hs view
@@ -11,6 +11,8 @@   | Leaf Int a   | Node (IntMap a) (IntMap a) (IntMap a) (IntMap a)   --Xderiving (Show)+instance Show a => Show (IntMap a) where+  showsPrec p m = showParen (p > 0) $ showsPrec 10 (toList m)  {- -- This works for y>0
src/MicroHs/Interactive.hs view
@@ -1,5 +1,6 @@-module MicroHs.Interactive(mainInteractive) where+module MicroHs.Interactive(mainInteractive, mainEvalArg) where import qualified Prelude(); import MHSPrelude+import Data.Char import Data.List import Data.Maybe import Data.Version@@ -8,25 +9,31 @@ import MicroHs.CompileCache import MicroHs.Desugar(LDef) import MicroHs.Exp(Exp(Var))-import MicroHs.Expr(showEType, EModule(..), EDef(..))+import MicroHs.Expr(showEType, EModule(..), EDef(..), Expr(EVar)) import MicroHs.Flags-import MicroHs.Ident(mkIdent, Ident, unIdent, isIdentChar)+import MicroHs.Ident(mkIdent, Ident, unIdent, isIdentChar, SLoc(..), slocIdent, isNoSLoc) import qualified MicroHs.IdentMap as M import MicroHs.List import MicroHs.Parse import MicroHs.StateIO import MicroHs.SymTab(Entry(..), stEmpty, stKeysGlbU, stLookup) import MicroHs.Translate-import MicroHs.TCMonad(TCState(..))+import MicroHs.TCMonad(TCState(..), tcStateToXTCState) import MicroHs.TypeCheck(TModule(..), Symbols)+import MicroHs.Version import Unsafe.Coerce import System.Console.SimpleReadline-import Paths_MicroHs(version)+import System.Cmd import System.Environment import System.FilePath import System.IO+import Text.Printf+import Text.Read(readMaybe) --import System.IO.TimeMilli +defaultEditor :: String+defaultEditor = "vim +%d %s"+ data IState = IState {   isLines   :: String,   isFlags   :: Flags,@@ -34,7 +41,9 @@   isSymbols :: Symbols,   isStats   :: Bool,   isCComp   :: (Int, TCState, TranslateMap),-  isHistory :: FilePath+  isHistory :: FilePath,+  isErrLine :: Int,+  isErrFile :: FilePath   }  -- To speed up interactive use, the state of the symbol table after@@ -44,24 +53,41 @@  type I a = StateIO IState a -mainInteractive :: Flags -> IO ()-mainInteractive flags = do+mainInteractive :: Flags -> [String] -> IO ()+mainInteractive flags mdls = 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 False (-1, error "tcstate", M.empty) hist+  _ <- runStateIO startInteractive =<< startIState flags' mdls hist   return () +mainEvalArg :: Flags -> String -> [String] -> IO ()+mainEvalArg flags arg mdls = do+  let eval = do+        reload+        oneline arg+  _ <- runStateIO eval =<< startIState flags mdls (error "hist")+  return ()++startIState :: Flags -> [String] -> String -> IO IState+startIState flags mdls hist = do+  unless compiledWithMhs $ do+    --putStrLnI "WARNING: Not compiled with mhs, so limited functionality."+    mhsError "The interactive system currently only works with mhs"+  ccash <- getCached flags+  cash <- loadEmbedded flags ccash+  let startMdl = preamble ++ unlines (map ("import " ++) mdls)+  return $ IState startMdl flags cash noSymbols False (-1, error "tcstate", M.empty) hist 1 ""+ noSymbols :: Symbols noSymbols = (stEmpty, stEmpty)  preamble :: String preamble = "module " ++ interactiveName ++ " where\n\-           \import System.IO.PrintOrRun\n\+           \import qualified System.IO.PrintOrRun\n\            \default Num (Integer, Double)\n\            \default IsString (String)\n\            \default Show (())\n"@@ -69,15 +95,17 @@ putStrLnI :: String -> I () putStrLnI = liftIO . putStrLn -start :: I ()-start = do+startInteractive :: I ()+startInteractive = do   reload   is <- get   liftIO $ maybeSaveCache (isFlags is) (isCache is)+  let line "" = return ()+      line ('r':r) = do _ <- command r; return ()+      line s = oneline s+  rc <- liftIO (catch (lines <$> readFile ".mhsi_rc") (\ (_ :: SomeException) -> return []))+  mapM_ line rc   putStrLnI "Type ':quit' to quit, ':help' for help"-  unless compiledWithMhs $ do-    --putStrLnI "WARNING: Not compiled with mhs, so limited functionality."-    mhsError "The interactive system currently only works with mhs"   repl  repl :: I ()@@ -137,26 +165,22 @@       return True     )   , ("reload      reload modules", const $ do-      flgs <- gets isFlags-      cash <- gets isCache-      cash' <- liftIO $ validateCache flgs cash-      modify $ \ is -> is{ isCache = cash' }       reload       return True     )-  , ("delete d    delete definition(s) d", \ line -> do+  , ("delete PRE  delete definition(s) with prefix PRE", \ line -> do       updateLines (unlines . filter (not . isPrefixOf line) . lines)       return True     )-  , ("type e      show type of e", \ line -> do+  , ("type EXPR   show type of EXPR", \ line -> do       showType line       return True     )-  , ("kind t      show kind of t", \ line -> do+  , ("kind TYPE   show kind of TYPE", \ 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     )@@ -168,41 +192,66 @@       saveDefs line       return True     )-  , ("help        this text", const $ do-      putStrLnI $ helpText ++ unlines (map ((':' :) . fst) commands)+  , ("edit [FILE] edit file or last error location", \ line -> do+      edit line       return True     )-  , ("set [FLAG]  (un)set flag", \ line -> do-      setFlags line+  , ("find NAME   find definition of NAME", \ line -> do+      finds line       return True     )+  , ("help        this text", help+    )+  , ("?           this text", help+    )+  , ("! CMD       run shell command", \ line -> do+      _ <- liftIO $ system line+      return True+    )+  , ("set [OPT]   (un)set option", \ line -> do+      setOptions line+      return True+    )   ] -setFlags :: String -> I ()-setFlags "" = do+help :: String -> I Bool+help = const $ do+  putStrLnI $ helpText ++ unlines (map ((':' :) . fst) commands)+  return True++setOptions :: String -> I ()+setOptions "" = do   stats <- gets isStats+  flags <- gets isFlags   putStrLnI "Current flags: (use + to set and - to unset)"   putStrLnI $ "  " ++ (if stats then "+" else "-") ++ "s"-setFlags "+s" = do+  putStrLnI $ "  path=" ++ intercalate ":" (srcPaths flags)+setOptions "+s" = do   modify $ \ is -> is{ isStats = True }-setFlags "-s" = do+setOptions "-s" = do   modify $ \ is -> is{ isStats = False }-setFlags _ =+setOptions s | Just p <- stripPrefix "path=" s =+  modify $ \ is -> is{ isFlags = (isFlags is){ srcPaths = splitColonPath p } }+setOptions _ =   putStrLnI "Unknown flag.  Known flags: +s, -s"  reload :: I () reload = do+  cash <- gets isCache+  flags <- gets isFlags+  cash' <- liftIO $ validateCache flags cash+  modify $ \ is -> is{ isCache = cash', isCComp = (-1, undefined, undefined) }   ls <- gets isLines   rld <- tryCompile ls   -- reload modules right away   case rld of-    Left msg -> liftIO $ err msg+    Left msg -> err msg     Right _  -> return ()  helpText :: String helpText = "\   \Commands (may be abbreviated):\n\-  \expr         evaluate expression\n\-  \defn         add top level definition\n\+  \EXPR         evaluate expression\n\+  \DEFN         add top level definition\n\   \"  updateLines :: (String -> String) -> I ()@@ -233,9 +282,11 @@ mkIt l =   itName ++ " = " ++ l ++ "\n" -mkItIO :: Bool -> String -> String-mkItIO stats l =-  let prt = if stats then "_printOrRunStats" else "_printOrRun"+mkItIO :: Flags -> Bool -> String -> String+mkItIO flgs stats l =+  let prt = fromMaybe+              (if stats then "System.IO.PrintOrRun._printOrRunStats" else "System.IO.PrintOrRun._printOrRun")+              (iPrint flgs)   in  mkIt l ++       itIOName ++ " = " ++ prt ++ " " ++ itName ++ "\n" @@ -243,14 +294,30 @@ mkTypeIt l =   "type " ++ itTypeName ++ " = " ++ l ++ "\n" -err :: SomeException -> IO ()-err e = err' $ displayException e+err :: SomeException -> I ()+err e = do+  let msg = displayException e+  case parseError msg of+    Just (f, l) -> modify $ \ is -> is{ isErrFile = f, isErrLine = l }+    Nothing -> return ()+  liftIO $ err' msg +-- Try to find a file and line number+-- XXX We should have a special exception instead of parsing the message string.+parseError :: String -> Maybe (FilePath, Int)+parseError s =+  case words s of+    "error:" : ('"' : sfile) : "line" : sline : _ |+      Just file <- stripSuffix "\":" sfile,+      Just line <- stripSuffix "," sline >>= readMaybe -> Just (file, line)+    _ -> Nothing+ err' :: String -> IO () err' s = putStrLn $ "*** Exception: " ++ s  oneline :: String -> I ()-oneline line = do+oneline aline = do+  let line = dropWhile isSpace aline   ls <- gets isLines   stats <- gets isStats   let lls = ls ++ line ++ "\n"@@ -259,10 +326,11 @@         case defTest of           Right _ -> do             updateLines (const lls)-          Left  e -> liftIO $ err e+          Left  e -> err e       expr = do --        t1 <- liftIO getTimeMilli-        exprTest <- tryCompile (ls ++ "\n" ++ mkItIO stats line)+        flgs <- gets isFlags+        exprTest <- tryCompile (ls ++ "\n" ++ mkItIO flgs stats line)         case exprTest of           Right (m, _) -> do             evalExpr m@@ -271,14 +339,21 @@             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 $ \ _ ->-    -- if that fails, parse as an expression.-    tryParse pExprTop line expr $-      liftIO . err'+          Left  e -> err e+  -- A small hack, if we import something we have already imported+  -- in exactly the same way, we just reload instead.  This is to avoid+  -- building up multiple imports.+  if take 1 (words line) == ["import"] && line `elem` lines ls then+    reload+   else +    -- First try to parse as a definition,+    tryParse pTopModule lls def $ \ _ ->+      -- if that fails, parse as an expression.+      tryParse pExprTop line expr $+        liftIO . err' -tryParse :: forall a . Show a => P a -> String -> I () -> (String -> I ()) -> I ()+tryParse :: forall a . -- Show a =>+            P a -> String -> I () -> (String -> I ()) -> I () tryParse p s ok bad =   case parse p "" s of     Right _ -> ok@@ -293,7 +368,7 @@   let mdl@(EModule mn es _) = parseDie pTopModule "" file   defs <- updateTCStateCache mdl   (_, tcstate, _) <- gets isCComp-  let mdl' = EModule mn es (SetTCState tcstate : defs)+  let mdl' = EModule mn es (SetTCState (tcStateToXTCState tcstate) : defs)   flgs <- gets isFlags   cash <- gets isCache --  putStrLnI $ " tryCompile compile " ++ show mdl'@@ -309,14 +384,13 @@   let ares = translateWithMap tmap (cmdl, Var $ mkIdent (interactiveName ++ "." ++ itIOName))       res = unsafeCoerce ares :: IO ()   mval <- liftIO $ try (seq res (return res))-  liftIO $-    case mval of-      Left  e -> err e-      Right val -> do-        mio <- try val-        case mio of-          Left  e -> err e-          Right _ -> return ()+  case mval of+    Left  e -> err e+    Right val -> do+      mio <- liftIO $ try val+      case mio of+        Left  e -> err e+        Right _ -> return ()  showType :: String -> I () showType line = do@@ -327,8 +401,7 @@       case stLookup "" (mkIdent itName) (valueTable tcs) of         Right (Entry _ t) -> putStrLnI $ showEType t         _ -> error "showType"-    Left  e ->-      liftIO $ err e+    Left  e -> err e  showKind :: String -> I () showKind line = do@@ -339,11 +412,10 @@       case stLookup "" (mkIdent itTypeName) (typeTable tcs) of         Right (Entry _ t) -> putStrLnI $ showEType t         _ -> error "showKind"-    Left  e ->-      liftIO $ err e+    Left  e -> err e  runMain :: String -> I ()-runMain line = oneline $ "_withArgs " ++ show (words line) ++ " main"+runMain line = oneline $ "System.IO.PrintOrRun._withArgs " ++ show (words line) ++ " main"  showDefs :: I () showDefs = do@@ -355,7 +427,7 @@ saveDefs line = do   ls <- gets isLines   liftIO $ writeFile line ls-  liftIO $ putStrLn $ "wrote " ++ line+  putStrLnI $ "wrote " ++ line  -- This could be smarter: --  ":a"        should complete with commands@@ -401,3 +473,37 @@ --    putStrLnI $ "*** update isFast " ++ show nImps     modify $ \ is -> is{ isCComp = (nImps, tcstate, idmap), isCache = ch, isSymbols = syms }   return notImps++getEditor :: I String+getEditor = fromMaybe defaultEditor <$> gets (editor . isFlags)++edit :: String -> I ()+edit s = do+  ed <- getEditor+  case s of+    "" -> do+      line <- gets isErrLine+      file <- gets isErrFile+      _ <- liftIO $ system $ printf ed line file+      return ()+    file -> do+      _ <- liftIO $ system $ printf ed (1::Int) file+      return ()+  reload++alt :: Either a b -> Either a b -> Either a b+alt (Left _) r = r+alt r _ = r++finds :: String -> I ()+finds str = do+  (ts, vs) <- gets isSymbols+  let i = mkIdent str+  case stLookup "type" i vs `alt` stLookup "value" i ts of+    Left s -> putStrLnI s+    Right (Entry (EVar qi) _) | let loc@(SLoc f l _) = slocIdent qi, not (isNoSLoc loc) -> do+      ed <- getEditor+      _ <- liftIO $ system $ printf ed l f+      reload+      return ()+    _ -> putStrLnI "Unknown location"
src/MicroHs/Lex.hs view
@@ -11,6 +11,7 @@ import Data.Maybe (fromJust) import MicroHs.Ident import Text.ParserComb(TokenMachine(..))+import Text.PrettyPrint.HughesPJLiteClass(prettyShow)  data Token   = TIdent  SLoc [String] String  -- identifier@@ -32,7 +33,7 @@   | TPragma SLoc String           -- a {-# PRAGMA #-}   | TEnd    SLoc   | TRaw [Token]-  deriving (Show)+--  deriving (Show)  showToken :: Token -> String showToken (TIdent _ ss s) = intercalate "." (ss ++ [s])@@ -250,7 +251,7 @@         remGap l rs ('\r':cs) = remGap           l        rs  cs         remGap l rs (' ' :cs) = remGap (addCol l 1)       rs  cs         remGap l _         _  = --errorMessage oloc "bad string gap"-                                mhsError (show l ++ ": bad string gap")+                                mhsError (prettyShow l ++ ": bad string gap")  decodeEscs :: String -> String decodeEscs [] = []@@ -436,7 +437,7 @@ --   Pop   pop the context stack --   Raw   return the rest of the tokens, unprocessed -data LexState = LS (Cmd -> (Token, LexState))+newtype LexState = LS (Cmd -> (Token, LexState))  data Cmd = Next | Raw | Pop 
src/MicroHs/List.hs view
@@ -98,3 +98,14 @@  takeEnd :: Int -> [a] -> [a] takeEnd n = reverse . take n . reverse++splitWhen :: (a -> Bool) -> [a] -> [[a]]+splitWhen _ [] = []+splitWhen p as = loop as+  where loop xs =+          case break p xs of+            (ys, []) -> [ys]+            (ys, _:zs) -> ys : loop zs++splitColonPath :: String -> [String]+splitColonPath = splitWhen (':' ==)
src/MicroHs/Main.hs view
@@ -3,29 +3,33 @@ {-# OPTIONS_GHC -Wno-unused-do-bind -Wno-unused-imports #-} module MicroHs.Main(main) where import qualified Prelude(); import MHSPrelude+import Control.Monad+import Control.Applicative+import qualified Data.ByteString.Char8 as BS import Data.Char import Data.List import Data.Version-import Control.Monad-import Control.Applicative import Data.Maybe import System.Environment import MicroHs.Compile import MicroHs.CompileCache+import MicroHs.Config+import MicroHs.Desugar(LDef)+import MicroHs.EncodeData(encList) import MicroHs.Exp(Exp(Var, Lit))-import MicroHs.Expr(Lit(LInt))+import MicroHs.Expr(Lit(LInt, LForImp, LBStr)) import MicroHs.ExpPrint import MicroHs.FFI import MicroHs.Flags import MicroHs.Ident+import MicroHs.Interactive import MicroHs.Lex(readInt) import MicroHs.List+import MicroHs.MakeCArray import MicroHs.Package import MicroHs.Translate import MicroHs.TypeCheck(TModule(..), showValueExport, showTypeExport, showTypeExportAssocs, TypeExport)-import MicroHs.Interactive-import MicroHs.MakeCArray-import MhsEval+--import MhsEval import System.Cmd import System.Exit import System.FilePath@@ -34,89 +38,103 @@ import System.IO.Serialize import System.IO.TimeMilli import System.IO.Transducers(addLZ77, addBase64)-import MicroHs.TargetConfig-import Paths_MicroHs(getDataDir)+import Text.PrettyPrint.HughesPJLiteClass(prettyShow)  main :: IO () main = do+  (mhsDir, srcs, mpkg) <- getPaths   args <- getArgs-  dir <- getMhsDir-  dataDir <- getDataDir-  case args of-    ["-h"] -> putStrLn usage-    ["-?"] -> putStrLn usage-    ["--help"] -> putStrLn longUsage-    ["--version"] -> putStrLn $ "MicroHs, version " ++ mhsVersion ++ ", combinator file version " ++ combVersion-    ["--numeric-version"] -> putStrLn mhsVersion+  case () of+    _ | "-h" `elem` args -> putStrLn usage+    _ | "-?" `elem` args -> putStrLn usage+    _ | "--help" `elem` args -> putStrLn longUsage+    _ | "--version" `elem` args -> putStrLn $ "MicroHs, version " ++ mhsVersion ++ ", combinator file version " ++ combVersion+    _ | "--numeric-version" `elem` args -> putStrLn mhsVersion     _ -> do-      let dflags = (defaultFlags dir){ pkgPath = pkgPaths }-          (flags, mdls, rargs) = decodeArgs dflags [] args-          pkgPaths | dir == dataDir && dir /= "." = [takeDirectory $ takeDirectory $ takeDirectory dataDir]   -- This is a bit ugly-                   | otherwise                    = []                        -- No package search path+      -- Flag decoding happens twice, because we need to decode the flags to know+      -- how to read the config file, but we also need the config file for the+      -- default package search path.+      let (cflags, _, _) = decodeArgs defaultFlags{ mhsdir = mhsDir } [] args  -- decode flags so we can read the config file+      conf <- readConfig cflags+      let paths = splitColonPath $ fromMaybe ('$':mHSPKG) $ lookup "mhs" conf >>= lookup "packageDbPath"+          (eflags, mdls, rargs) = decodeArgs dflags [] args  -- decode flags for real+            where dflags = defaultFlags{ pkgPaths = paths, srcPaths = srcs, mhsdir = mhsDir }+      paths' <- nub . filter (not . null) . splitColonPath <$> expandPath mpkg (intercalate ":" $ pkgPaths eflags)+      let flags = eflags{ config = conf, pkgPaths = paths'  }+       when (verbosityGT flags 1) $         putStrLn $ "flags = " ++ show flags-      case listPkg flags of-        Just p -> mainListPkg flags p-        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-              withArgs rargs $ do-                case mdls of-                  []  | null (cArgs flags') -> mainInteractive flags'-                      | otherwise -> mainCompileC flags' [] ""-                  [s] -> mainCompile flags' (mkIdentSLoc (SLoc "command-line" 0 0) s)-                  _   -> mhsError usage+      preload' <- mapM (findAPackage flags) (preload flags)+      let flags' = flags { preload = preload' }+      withArgs rargs $+        case () of+          _ | Just p <- listPkg flags'        -> mainListPkg flags p+          _ | Just p <- buildPkg flags'       -> mainBuildPkg flags' p mdls+          _ | Just s <- evalArg flags'        -> mainEvalArg flags' s mdls+          _ | installPkg flags'               -> mainInstallPackage flags' mdls+          _ | null mdls && null (cArgs flags')-> mainInteractive flags' []+          _ | null mdls                       -> mainCompileC flags' [] ""+          _ | interactive flags'              -> mainInteractive flags' mdls+          _ | [s] <- mdls                     -> mainCompile flags' (mkIdentSLoc (SLoc "command-line" 0 0) s)+          _                                   -> mhsError usage +mHSPKG :: String+mHSPKG = "MHSPKG"+ usage :: String-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]"+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] [--interactive] [-eEXPR] [-ECMD] [-ddump-PASS] [--embed-packages PKG:...] [--embed-ffis PKG:...] [MODULENAME...|FILE]"  longUsage :: String longUsage = usage ++ "\nOptions:\n" ++ details   where     details = "\-      \-h                 Print usage\n\       \-?                 Print usage\n\-      \--help             Print this message\n\-      \--version          Print the version\n\-      \--numeric-version  Print the version number\n\-      \-v                 Increase verbosity (flag can be repeated)\n\-      \-q                 Decrease verbosity (flag can be repeated)\n\-      \-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\+      \-a                 Clear package search path\n\+      \-aPATH             Add PATH to package search path\n\+      \-b64               Base64 encode the combinator code\n\+      \-C                 Read and write compilation cache\n\       \-CR                Read compilation cache\n\       \-CW                Write compilation cache\n\-      \-C                 Read and write compilation cache\n\-      \-XCPP              Run cpphs on source files\n\+      \-c                 Do not generate executable\n\       \-Dxxx              Pass -Dxxx to cpphs\n\+      \-ddump-PASS        Debug, print AST after PASS\n\+      \                   Possible passes: preproc, parse, derive, typecheck, desugar, toplevel, combinator, linked, all\n\+      \-ECMD              Set editor for :edit command\n\+      \-eEXPR             Evaluate EXPR\n\+      \-embed-ffis PKG*   Embed packages FFI stubs in mhs binary\n\+      \-embed-packages PKG* Embed packages in mhs binary\n\+      \-F                 Run a preprocessor\n\+      \-h                 Print usage\n\+      \--help             Print this message\n\       \-Ixxx              Pass -Ixxx to cpphs\n\-      \-T                 Generate dynamic function usage statistics\n\-      \-z                 Compress the combinator code\n\-      \-b64               Base64 encode the combinator code\n\       \-iPATH             Add PATH to module search path\n\+      \--interactive      Start interactive mode even with module arguments\n\+      \-l                 Show every time a module is loaded\n\+      \-L[FILE|PKG]       List all modules of a package\n\+      \--numeric-version  Print the version number\n\       \-oFILE             Output to FILE\n\       \                   If FILE ends in .comb produce a combinator file\n\       \                   If FILE ends in .c produce a C file\n\       \                   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\-      \-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, windows, tcc, environment\n\-      \                   Targets can be defined in targets.conf\n\+      \-optF FLAG         Pass the FLAG to the -F preprocessor\n\       \-optc OPTION       Options for the C compiler\n\       \-optl OPTION       Options passed by mhs to the C compiler for the linker\n\+      \-PPKG              Build package PKG\n\+      \-pFILE             Pre-load package\n\+      \-pgmF CMD          Use CMD for the -F preprocessor\n\+      \-Q PKG [DIR]       Install package PKG\n\+      \-q                 Decrease verbosity (flag can be repeated)\n\+      \-r                 Run directly\n\+      \-s                 Show compilation speed in lines/s\n\       \--stdin            Use stdin in interactive system\n\-      \-ddump-PASS        Debug, print AST after PASS\n\-      \                   Possible passes: preproc, parse, derive, typecheck, desugar, toplevel, combinator, linked, all\n\+      \-T                 Generate dynamic function usage statistics\n\+      \-tTARGET           Select target\n\+      \                   Distributed targets: unix, emscripten, windows, tcc, environment\n\+      \                   Targets can be defined in mhs.conf\n\+      \-v                 Increase verbosity (flag can be repeated)\n\+      \--version          Print the version\n\+      \-XCPP              Run cpphs on source files\n\+      \-z                 Compress the combinator code\n\       \"  decodeArgs :: Flags -> [String] -> [String] -> (Flags, [String], [String])@@ -144,20 +162,36 @@                 -> 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+    "-optF" | s : args' <- args+                -> decodeArgs f{fArgs = fArgs f ++ [s]} mdls args'+    "-pgmF" | s : args' <- args+                -> decodeArgs f{fPgm = Just s} mdls args'+    "-interactive-print" | s : args' <- args+                -> decodeArgs f{iPrint = Just s} mdls args'+    "-F"        -> decodeArgs f{doF = True} mdls args+    "--stdin"   -> decodeArgs f{useStdin = True} mdls args+    "--interactive"   -> decodeArgs f{interactive = True} mdls args+    "--embed-ffis" | s : args' <- args+                -> decodeArgs f{embedFFIs = embedFFIs f ++ splitColonPath s} mdls args'+    "--embed-packages" | s : args' <- args, let ps = splitColonPath s+                -> decodeArgs f{embedPkgs = embedPkgs f ++ ps, embedFFIs = embedFFIs f ++ ps} mdls args'++    '-':'i':[]  -> decodeArgs f{srcPaths = []} mdls args+    '-':'i':s   -> decodeArgs f{srcPaths = srcPaths f ++ splitColonPath s} mdls args     '-':'o':s   -> decodeArgs f{output = s} mdls args     '-':'t':s   -> decodeArgs f{target = s} mdls args     '-':'D':_   -> decodeArgs f{cppArgs = cppArgs f ++ [arg]} mdls args     '-':'I':_   -> decodeArgs f{cppArgs = cppArgs f ++ [arg]} mdls args     '-':'P':s   -> decodeArgs f{buildPkg = Just s} mdls args-    '-':'a':[]  -> decodeArgs f{pkgPath = []} mdls args-    '-':'a':s   -> decodeArgs f{pkgPath = pkgPath f ++ [s]} mdls args+    '-':'a':[]  -> decodeArgs f{pkgPaths = []} mdls args+    '-':'a':s   -> decodeArgs f{pkgPaths = pkgPaths f ++ splitColonPath 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 ->+    '-':'E':s   -> decodeArgs f{editor = Just s} mdls args+    '-':'e':s   -> decodeArgs f{evalArg = Just s} mdls args+    _ | Just r  <- stripPrefix "-ddump-" arg, Just d <- lookup r dumpFlagTable ->                    decodeArgs f{dumpFlags = d : dumpFlags f} mdls args-    "--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@@ -166,47 +200,40 @@   where     dumpFlagTable = [(drop 1 $ show d, d) | d <- [minBound..maxBound]] -readTargets :: Flags -> FilePath -> IO [Target]-readTargets flags dir = do-  let tgFilePath = dir </> "targets.conf"-  exists <- doesFileExist tgFilePath-  if not exists-     then return []-     else do-       tgFile <- readFile tgFilePath-       case parseTargets tgFilePath tgFile of-         Left e -> do-           putStrLn $ "Cannot parse " ++ tgFilePath-           when (verbosityGT flags 0) $-             putStrLn e-           return []-         Right tgs -> do-           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-  (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+readConfig :: Flags -> IO Config+readConfig flags = do+  let cfFilePath = mhsdir flags </> "mhs.conf"+  exists <- doesFileExist cfFilePath+  if not exists then do+    when (verbosityGT flags (-1)) $+      putStrLn $ "Warning: cannot find config file: " ++ cfFilePath+    return []+   else do+    cfFile <- readFile cfFilePath+    case parseConfig cfFilePath cfFile of+      Left e -> do+        putStrLn $ "Cannot parse " ++ cfFilePath         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-                 }+          putStrLn e+        return []+      Right cfs -> do+        when (verbosityGT flags 1) $+          putStrLn $ "Read targets file. Possible targets: " ++ show (map fst cfs)+        return cfs +findSection :: Flags -> IO [(Key, Value)]+findSection flags = do+  case lookup (target flags) (config flags) of+    Nothing ->+      error $ "Cannot find config section: " ++ target flags ++ ", available=" ++ unwords (map fst (config flags))+    Just cs -> do+      when (verbosityGT flags 0) $+        putStrLn $ "Found target: " ++ show (target flags, cs)+      return cs++getSectionKey :: [(Key, Value)] -> Key -> Value -> Value+getSectionKey sect key dflt = fromMaybe dflt $ lookup key sect+ mainBuildPkg :: Flags -> String -> [String] -> IO () mainBuildPkg flags namever amns = do   when (verbose flags > 0) $@@ -244,7 +271,7 @@  -- 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.+-- It's an error if no unique package can be found. findAPackage :: Flags -> FilePath -> IO FilePath findAPackage flags pkgnm = do   ok <- doesFileExist pkgnm@@ -252,10 +279,11 @@     return pkgnm    else do     dirpkgs <- findAllPackages flags-    case [ pdir </> pkg <.> packageSuffix | (pdir, pkgs) <- dirpkgs, pkg <- pkgs, pkgnm `isPrefixOf` pkg ] of+    let isVers = all (`elem` "0123456789-.")+    case [ pdir </> pkg <.> packageSuffix | (pdir, pkgs) <- dirpkgs, pkg <- pkgs, Just suf <- [stripPrefix pkgnm pkg], isVers suf ] of       [] -> mhsError $ "Package not found: " ++ show pkgnm       [s] -> return s-      ss -> mhsError $ "Package not is ambigous: " ++ show (pkgnm, ss)+      ss -> mhsError $ "Package is ambigous: " ++ show (pkgnm, ss)  mainListPkg :: Flags -> FilePath -> IO () mainListPkg flags "" = mainListPackages flags@@ -270,7 +298,8 @@    let oneMdl tmdl = do         putStrLn $ "  " ++ showIdent (tModuleName tmdl)-        when (verbosityGT flags 0) $+        when (verbosityGT flags 0) $ do+          putStrLn $ "  file = " ++ slocFile (slocIdent (tModuleName tmdl))           printExperted tmdl         when (verbosityGT flags 1) $           printDefinitions tmdl@@ -299,13 +328,14 @@ mainCompile :: Flags -> Ident -> IO () mainCompile flags mn = do   t0 <- getTimeMilli-  (cash, (rmn, allDefs)) <- do+  (cash, (rmn, allDefs')) <- do     cash <- getCached flags     (rds, _, cash') <- compileCacheTop flags mn cash     maybeSaveCache flags cash'     return (cash', rds)    t1 <- getTimeMilli+  allDefs <- addEmbedPkgs flags allDefs'   let     mainName = qualIdent rmn (mkIdent "main")     cmdl = (allDefs, if noLink flags then Lit (LInt 0) else Var mainName)@@ -324,10 +354,12 @@     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 mhsError "The -r flag currently only works with mhs and ghc"    else do     seq (length outData) (return ())     t2 <- getTimeMilli@@ -339,7 +371,12 @@       locs <- sum . map (length . lines) <$> mapM readFile fns       putStrLn $ show (locs * 1000 `div` (t2 - t0)) ++ " lines/s" -    let (cFFI, hFFI) = makeFFI flags forExps outDefs+    -- embedPkg are the packages we are embedding in the binary.+    -- embedded are the packages embeddd in this binary.+    embedPkg <- mapM (getPackage flags) (embedFFIs flags)+    let embedded = concatMap packageModules (getEmbedPkgs cash)+    let (cFFI, hFFI) = makeFFI flags forExps embedded+                               (outDefs : map (packageDefs . snd) embedPkg)         cCode = "#include \"mhsffi.h\"\n" ++ makeCArray flags outData ++ cFFI      let outFile = output flags@@ -353,11 +390,17 @@     --  * 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-    if outFile `hasTheExtension` ".comb" then do+    if outFile `hasTheExtension` ".comb" || outFile `hasTheExtension` ".combffi" 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+      when (outFile `hasTheExtension` ".combffi") $ do+        -- add FFI info+        hPutStrLn h'' "\n#####"+        let putFFI (_, Lit (LForImp _ i n t)) = hPutStrLn h'' $ n ++ " = " ++ show i ++ " :: " ++ prettyShow t+            putFFI _ = return ()+        mapM_ putFFI outDefs       hClose h''      else if outFile `hasTheExtension` ".c" then       writeFile outFile cCode@@ -366,13 +409,15 @@        let ppkgs = getPathPkgs cash        hPutStr h cCode        hClose h-       mainCompileC flags ppkgs fn+       mainCompileC flags (embedPkg ++ ppkgs) fn        removeFile fn  mainCompileC :: Flags -> [(FilePath, Package)] -> FilePath -> IO () mainCompileC flags pkgs infile = do   let ppkgs  = map fst pkgs       poptls = filter (not . null . pkgOptl) $ map snd pkgs+  when (verbosityGT flags 0) $+    putStrLn $ "used packages: " ++ show ppkgs   ct1 <- getTimeMilli   let dir = mhsdir flags       incDirs = map (convertToInclude "include") ppkgs@@ -385,12 +430,17 @@       defs = "-D__MHS__"       cpps = concatMap (\ a -> "'" ++ a ++ "' ") (cppArgs flags)  -- Use all CPP args from the command line       rtdir = dir ++ "/src/runtime"-  tgt <- readTarget flags dir+  sect <- findSection flags   let optls = concatMap pkgOptl poptls -- optl from pkgs-      cmd = unwords $ [tCC tgt,-                       tCCFlags tgt,+      vcc      = getSectionKey sect "cc"      "cc"+      vccflags = getSectionKey sect "ccflags" ""+      vcclibs  = getSectionKey sect "cclibs"  ""+      vconf    = getSectionKey sect "conf"    "unix"+      vcout    = getSectionKey sect "cout"    "-o"+      cmd = unwords $ [vcc,+                       vccflags,                        "-I" ++ rtdir,-                       "-I" ++ rtdir </> tConf tgt,+                       "-I" ++ rtdir </> vconf,                        incs,                        defs,                        cpps] ++@@ -401,8 +451,8 @@                       [ rtdir </> "main.c" | not (noLink flags) ] ++                       [ rtdir </> "eval.c",                         infile,-                        tCCLibs tgt,-                        tOut tgt ++ outFile+                        vcclibs,+                        vcout ++ outFile                       ]   when (verbosityGT flags 0) $     putStrLn $ "Execute: " ++ show cmd@@ -421,7 +471,7 @@   let pdir = dir </> packageDir       pkgout = unIdent (pkgName pkg) ++ "-" ++ showVersion (pkgVersion pkg) <.> packageSuffix   createDirectoryIfMissing True pdir-  copyFile pkgfn (pdir </> pkgout)+  copyFileBS pkgfn (pdir </> pkgout)   let mk tm = do         let fn = dir </> moduleToFile (tModuleName tm) <.> packageTxtSuffix             dn = takeDirectory fn@@ -431,13 +481,13 @@         writeFile fn pkgout   mapM_ mk (pkgExported pkg) mainInstallPackage flags [pkgfn] =-  case pkgPath flags of-    [] -> mhsError "pkgPath is empty"+  case pkgPaths flags of+    [] -> mhsError "pkgPaths is empty"     frst:_ -> mainInstallPackage flags [pkgfn, frst] mainInstallPackage _ _ = mhsError usage  findAllPackages :: Flags -> IO [(FilePath, [String])]-findAllPackages flags = concat <$> mapM list (pkgPath flags)+findAllPackages flags = concat <$> mapM list (pkgPaths flags)   where list dir = do           let pdir = dir </> packageDir           ok <- doesDirectoryExist pdir@@ -455,7 +505,7 @@ mainListPackages flags = mapM_ one =<< findAllPackages flags   where one (pdir, pkgs) = do           putStrLn $ pdir ++ ":"-          mapM_ (\ p -> putStrLn $ "  " ++ p) pkgs+          mapM_ (\ p -> putStrLn $ "  " ++ p) (sort pkgs)  -- Convert something like --   .../.mcabal/mhs-0.10.3.0/packages/base-0.10.3.0.pkg@@ -466,3 +516,50 @@  hasTheExtension :: FilePath -> String -> Bool hasTheExtension f e = e `isSuffixOf` f++-- Get all definitions from a package.+-- Used to produce FFI wrappers for embedded packages.+getPackage :: Flags -> String -> IO (FilePath, Package)+getPackage flags pkgnm = do+  pkgfn <- findAPackage flags pkgnm+  pkg <- readSerialized pkgfn+  return (pkgfn, pkg)++addEmbedPkgs :: Flags -> [LDef] -> IO [LDef]+addEmbedPkgs flags ds | null (embedPkgs flags) = return ds+                      | otherwise = do+  let get pkgnm = do+        pkgfn <- findAPackage flags pkgnm+        BS.readFile pkgfn+  bss <- mapM get (embedPkgs flags)+  let ps = encList $ map (Lit . LBStr) bss+      rep ie@(i, _) | i == mkIdent "MicroHs.Embed.packages" = (i, ps)+                    | otherwise = ie+  +  when (verbosityGT flags 0) $+    putStrLn $ "Embedded " ++ show (embedPkgs flags)+  return $ map rep ds++expandPath :: Maybe FilePath -> FilePath -> IO FilePath+expandPath (Just s) f = do+  m <- lookupEnv mHSPKG+  when (isNothing m) $+    setEnv mHSPKG s+  setEnv "VERSION" mhsVersion+  expandEnv f+expandPath Nothing  f = do+  setEnv "VERSION" mhsVersion+  expandEnv f++expandEnv :: String -> IO String+expandEnv "" = return ""+expandEnv ('$':cs) = do+  let (name, rest) = span isMacroName cs+      isMacroName c = isAlphaNum c || c == '_'+  repl <- fromMaybe "" <$> lookupEnv name+  (repl ++) <$> expandEnv rest+expandEnv (c:cs) =+  (c :) <$> expandEnv cs++copyFileBS :: FilePath -> FilePath -> IO ()+copyFileBS src dst = BS.readFile src >>= BS.writeFile dst
src/MicroHs/Package.hs view
@@ -2,12 +2,15 @@   IdentPackage,   Package(..),   forcePackage,+  packageDefs,+  packageModules,   ) where import qualified Prelude(); import MHSPrelude import Data.Version import MicroHs.Desugar(LDef)+import MicroHs.Expr(IdentModule) import MicroHs.Ident(Ident)-import MicroHs.TypeCheck(TModule, GlobTables)+import MicroHs.TypeCheck(TModule, GlobTables, tBindingsOf, tModuleName)  -- -- Packages are organized as follows:@@ -44,3 +47,9 @@ -- Fully evaluate a package forcePackage :: Package -> Package forcePackage p = force p++packageDefs :: Package -> [LDef]+packageDefs pkg = concatMap tBindingsOf (pkgExported pkg ++ pkgOther pkg)++packageModules :: Package -> [IdentModule]+packageModules pkg = map tModuleName (pkgExported pkg ++ pkgOther pkg)
src/MicroHs/Parse.hs view
@@ -14,6 +14,7 @@ import MicroHs.Expr hiding (getSLoc) import qualified MicroHs.Expr as E import MicroHs.Ident+import Text.PrettyPrint.HughesPJLiteClass(prettyShow) --import Debug.Trace  -- Hugs can't define the efficient *>@@ -27,14 +28,14 @@  type P a = Prsr LexState Token a -parseDie :: forall a . (Show a) =>+parseDie :: forall a . -- (Show a) =>             P a -> FilePath -> String -> a parseDie p fn file =   case parse p fn file of     Left msg -> mhsError msg     Right a -> a -parse :: forall a . (Show a) =>+parse :: forall a . -- (Show a) =>          P a -> FilePath -> String -> Either String a parse p fn file =   let { ts = lexTopLS fn file } in@@ -57,6 +58,16 @@     TEnd _ -> pure ()     _      -> Control.Monad.Fail.fail "eof" +comma, equal, bar, semi, lpar, rpar, lbra, rbra :: P ()+comma = pSpec ','+equal = pSpec '='+bar   = pSpec '|'+semi  = pSpec ';'+lpar  = pSpec '('+rpar  = pSpec ')'+lbra  = pSpec '['+rbra  = pSpec ']'+ pTop :: P EModule pTop = (pModule <|> pModuleEmpty) <* eof @@ -70,7 +81,7 @@ pModule = do   pKeyword "module"   mn <- pUQIdentA-  exps <- (pSpec '(' *> sepEndBy pExportItem (pSpec ',') <* pSpec ')')+  exps <- (lpar *> sepEndBy pExportItem comma <* rpar)       <|> pure [ExpModule mn]   pKeyword "where"   defs <- pBlock pDef@@ -114,8 +125,8 @@   loc <- getSLoc   let     mk = mkIdentSLoc loc-  (mk . map (const ',') <$> (pSpec '(' *> some (pSpec ',') <* pSpec ')'))-    <|> (mk "[]" <$ (pSpec '[' *> pSpec ']'))  -- Allow [] as a constructor name+  (mk . map (const ',') <$> (lpar *> some comma <* rpar))+    <|> (mk "[]" <$ (lbra *> rbra))  -- Allow [] as a constructor name  -- Upper case, possibly qualified, alphanumeric identifier pUQIdentA :: P Ident@@ -265,12 +276,20 @@ pLQIdentSym :: P Ident pLQIdentSym = pLQIdent <|> pParens pLQSymOperArr +-- Lower case, maybe qualified, symbol+arrow+pLQIdentSymbol :: P Ident+pLQIdentSymbol = pParens pLQSymOperArr+ -- Lower case, unqualified, identifier or symbol pLIdentSym :: P Ident pLIdentSym = pLIdent <|> pParens pLSymOper +-- Lower case, unqualified, symbol+pLIdentSymbol :: P Ident+pLIdentSymbol = pParens pLSymOper+ pParens :: forall a . P a -> P a-pParens p = pSpec '(' *> p <* pSpec ')'+pParens p = lpar *> p <* rpar  pLit :: P Expr pLit = do@@ -303,8 +322,8 @@   <|> ExpTypeSome <$> pUQIdentSym <*> pure []   <|> ExpValue    <$> pLQIdentSym   <|> ExpValue    <$> (pKeyword "pattern" *> pUQIdentSym)-  <|> ExpTypeSome <$> (pKeyword "type" *> pLQIdentSym) <*> pure []-  <|> ExpDefault  <$> (pKeyword "default" *> pUQIdentSym)+  <|> ExpTypeSome <$> (pKeyword "type" *> pLQIdentSymbol) <*> (pParens pConList <|> pure [])+  <|> ExpDefault  <$> (pKeyword "default" *> (pUQIdentSym <|> pLQIdentSymbol))  pKeyword :: String -> P () pKeyword kw = void (satisfy kw is)@@ -342,15 +361,15 @@  pBlock :: forall a . P a -> P [a] pBlock p = pBraces body-  where body = sepBy p (some (pSpec ';')) <* optional (pSpec ';')+  where body = sepBy p (some semi) <* optional semi   pDef :: P EDef pDef =       pBind        -- Fcn, Sign, PatBind, Infix   <|> uncurry Data <$> (pKeyword "data"     *> pData) <*> pDerivings-  <|> Newtype      <$> (pKeyword "newtype"  *> pLHS) <*> (pSpec '=' *> (Constr [] [] <$> pUIdentSym <*> pure False <*> pField)) <*> pDerivings-  <|> Type         <$> (pKeyword "type"     *> pLHS) <*> (pSpec '=' *> pType)+  <|> Newtype      <$> (pKeyword "newtype"  *> pLHS) <*> (equal *> (Constr [] [] <$> pUIdentSym <*> pure False <*> pField)) <*> pDerivings+  <|> Type         <$> (pKeyword "type"     *> pLHS) <*> (equal *> pType)   <|> Import       <$> (pKeyword "import"   *> pImportSpec)   <|> ForImp       <$> (pKeyword "foreign"  *> pKeyword "import" *> pCallConv)                         <*> (optional pSafety *> optional pString) <*> pLIdent <*> (dcolon *> pType)@@ -358,19 +377,19 @@                         <*> optional pString <*> pFExpr <*> (dcolon *> pType)   <|> Class        <$> (pKeyword "class"    *> pContext) <*> pLHS <*> pFunDeps     <*> pWhere pClsBind   <|> Instance <$> (pKeyword "instance" *> pType) <*> pWhere pInstBind <*> (pWhere pInstBind <|> pure [])-  <|> Default      <$> (pKeyword "default"  *> optional clsSym) <*> pParens (sepBy pType (pSpec ','))+  <|> Default      <$> (pKeyword "default"  *> optional clsSym) <*> pParens (sepBy pType comma)   <|> KindSign     <$> (pKeyword "type"     *> pTypeIdentSym) <*> (dcolon *> pKind)   <|> mkPattern    <$> (pKeyword "pattern"  *> pPatSyn)-  <|> Sign         <$> (pKeyword "pattern"  *> sepBy1 pUIdentSym (pSpec ',') <* dcolon) <*> pType+  <|> Sign         <$> (pKeyword "pattern"  *> sepBy1 pUIdentSym comma <* dcolon) <*> pType   <|> StandDeriving<$> (pKeyword "deriving" *> pStrat) <*> pure 0 <*> (pKeyword "instance" *> pType)   <|> noop         <$  (pKeyword "type"     <* pKeyword "role" <* pTypeIdentSym <*                                                some (pKeyword "nominal" <|> pKeyword "phantom" <|> pKeyword "representational"))   where-    pFunDeps = (pSpec '|' *> sepBy1 pFunDep (pSpec ',')) <|> pure []+    pFunDeps = (bar *> sepBy1 pFunDep comma) <|> pure []     pFunDep = (,) <$> some pLIdent <*> (pSRArrow *> some pLIdent)     pField = guardM pFields ((== 1) . either length length) -    clsSym = do s <- pUIdentSym; guard (unIdent s /= "()"); return s+    clsSym = do s <- pUIdentSym <|> pLIdentSymbol; guard (unIdent s /= "()"); return s      mkPattern (lhs, pat, meqn) = Pattern lhs pat meqn     noop = Infix (AssocLeft, 0) []        -- harmless definition@@ -387,13 +406,13 @@ pPatSyn :: P (LHS, EPat, Maybe [Eqn]) pPatSyn = do   lhs@(i, vs) <- pLHS-  ( do pSpec '=';+  ( do equal;        p <- pPat        guard (isExp p)        let eqn = eEqn (map (EVar . idKindIdent) vs) p        pure (lhs, p, Just [eqn])    ) <|> (-    do pSymbol "<-"+    do pSLArrow        p <- pPat        meqns <- optional (pKeyword "where" *> pBraces (pEqnsU i))        pure (lhs, p, fmap snd meqns)@@ -415,7 +434,7 @@ pData :: P (LHS, [Constr]) pData = do   lhs <- pLHS-  let pConstrs = pSpec '=' *> sepBy1 pConstr (pSpec '|')+  let pConstrs = equal *> sepBy1 pConstr bar   ((,) lhs <$> pConstrs)    <|> pGADT lhs    <|> pure (lhs, [])@@ -435,7 +454,7 @@   es <- pForall   ctx <- pContext   let pGType = pStrictP $ pOperators pOper pTypeArg-  args <- many (pGType <* pSymbol "->")+  args <- many (pGType <* pSRArrow)   res <- pType   pure (cn, es, ctx, args, res) @@ -458,7 +477,7 @@             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 " ++ prettyShow (rty, tnm, vks)  pDerivings :: P [Deriving] pDerivings = many pDeriving@@ -467,7 +486,7 @@ pDeriving = pKeyword "deriving" *> (    (flip Deriving <$> pDer <*> pVia)                                     <|> (Deriving <$> pSimpleStrat <*> pDer) )   where pDer = map ((,) 0) <$>-                   (    pParens (sepBy pType (pSpec ','))+                   (    pParens (sepBy pType comma)                     <|> ((:[]) <$> pAType) )         pVia = DerVia <$> (pKeyword "via" *> pType) @@ -496,7 +515,7 @@   pFields :: P (Either [SType] [(Ident, SType)])-pFields = Right <$> (pSpec '{' *> (concatMap flat <$> sepBy ((,) <$> (sepBy1 pLIdentSym (pSpec ',') <* dcolon) <*> pSType) (pSpec ',') <* pSpec '}'))+pFields = Right <$> (pSpec '{' *> (concatMap flat <$> sepBy ((,) <$> (sepBy1 pLIdentSym comma <* dcolon) <*> pSType) comma <* pSpec '}'))       <|> Left  <$> many pSAType   where flat (is, t) = [ (i, t) | i <- is ] @@ -516,8 +535,10 @@ pStrictP p = (,) <$> pStrict <*> p  pLHS :: P LHS-pLHS = (,) <$> pTypeIdentSym <*> many pIdKind-    <|> (\ a c b -> (c, [a,b])) <$> pIdKind <*> pSymOper <*> pIdKind+pLHS =  (,)                         <$> pTypeIdentSym <*> many pIdKind+    <|> (\ a c b    -> (c, [a,b]))  <$> pIdKind <*> pSymOper <*> pIdKind+    <|> (\ a c b as -> (c, a:b:as)) <$> (lpar *> pIdKind) <*> pSymOper <*> (pIdKind <* rpar) <*> many pIdKind+    <|> (\ a c      -> (c, [a]))    <$> (lpar *> pIdKind) <*> (pSymOper <* rpar)  pImportSpec :: P ImportSpec pImportSpec =@@ -529,7 +550,7 @@             <|> ((\ a b -> (b,a)) <$> pUQIdentA <*> (pQual <|> pure False))     imp a (b, c) = ImportSpec a b c   in  imp <$> pSource <*> pQId <*> optional (pKeyword "as" *> pUQIdent) <*>-              optional ((,) <$> ((True <$ pKeyword "hiding") <|> pure False) <*> pParens (sepEndBy pImportItem (pSpec ',')))+              optional ((,) <$> ((True <$ pKeyword "hiding") <|> pure False) <*> pParens (sepEndBy pImportItem comma))  pImportItem :: P ImportItem pImportItem =@@ -537,12 +558,12 @@   <|> ImpTypeSome <$> pUQIdentSym <*> pure []   <|> ImpValue    <$> pLQIdentSym   <|> ImpValue    <$> (pKeyword "pattern" *> pUQIdentSym)-  <|> ImpTypeSome <$> (pKeyword "type" *> pLQIdentSym) <*> pure []+  <|> impType     <$> (pKeyword "type" *> pLQIdentSymbol) <*> (pParens pConList <|> pure [])   where impType i [d] | d == dotDotIdent = ImpTypeAll  i         impType i is                     = ImpTypeSome i is  pConList :: P [Ident]-pConList = sepBy (pDotDot <|> pQIdent <|> pUIdentSpecial <|> pParens pSymOper) (pSpec ',')+pConList = sepBy (pDotDot <|> pQIdent <|> pUIdentSpecial <|> pParens pSymOper) comma   where pDotDot = dotDotIdent <$ pSymbol ".."  dotDotIdent :: Ident@@ -583,7 +604,7 @@ pTypeArg =     do       vs <- pForall'-      q <- (QExpl <$ pSymbol ".") <|> (QReqd <$ pSymbol "->")+      q <- (QExpl <$ pSymbol ".") <|> (QReqd <$ pSRArrow)       EForall q vs <$> pType   <|>     pTypeApp@@ -599,11 +620,12 @@       (EVar <$> pLQIdentSym)   <|> (EVar <$> pUQIdentSym)   <|> 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')))+  <|> (eTuple <$> (lpar *> sepBy pType comma <* rpar))+  <|> (EListish . LList . (:[]) <$> (lbra *> pType <* rbra))  -- Unlike expressions, only allow a single element.+  <|> (uTupleTAp <$> (pSpec 'L' *> sepBy  pType comma <* pSpec 'R'))+  <|> (uSumTAp <$> (pSpec 'L' *> sepBy1 pType bar <* pSpec 'R'))+  <|> (uSumT <$> getSLoc <*> (succ . length <$> (pSpec 'L' *> many bar <* pSpec 'R')))+  <|> (flip EApp <$> (lpar *> pTypeApp) <*> (EVar <$> (pTypeOper <* rpar)))  ------------- -- Patterns@@ -617,27 +639,28 @@ pAPat =       (do          i <- pLIdentSym-         (EAt i <$> (pSpec '@' *> pAPat)) <|> pure (EVar i)+         (pSpec '@' *> (EAt i <$> pAPat)) <|> pure (EVar i)       )   <|> (evar <$> pUQIdentSym <*> optional pUpdate)   <|> pLit-  <|> (eTuple <$> (pSpec '(' *> sepBy pPat (pSpec ',') <* pSpec ')'))-  <|> (EListish . LList <$> (pSpec '[' *> sepBy1 pPat (pSpec ',') <* pSpec ']'))-  <|> (EViewPat <$> (pSpec '(' *> pExpr) <*> (pSRArrow *> pPat <* pSpec ')'))-  <|> (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'))+  <|> (lpar *> (eTuple <$> sepBy pPatV comma <* rpar))+  <|> (lbra *> (EListish . LList <$> sepBy1 pPat comma <* rbra))+  <|> (EViewPat <$> (lpar *> pExpr) <*> (pSRArrow *> pPat <* rpar))+  <|> (pSpec '~' *> (ELazy True  <$> pAPat))+  <|> (pSpec '!' *> (ELazy False <$> pAPat))+  <|> (lpar *> (EOr <$> sepBy1 pPat semi <* rpar))  -- if there is a single pattern it will be matched by the tuple case+  <|> (uTuple <$> (pSpec 'L' *> sepBy pPat comma <* pSpec 'R'))   <|> pUSummand pPat   where evar v Nothing = EVar v         evar v (Just upd) = EUpdate (EVar v) upd+        pPatV = (EViewPat <$> pExpr <*> (pSRArrow *> pPat)) <|> pPat  pUSummand :: P Expr -> P Expr pUSummand p = do   pSpec 'L'-  l <- length <$> many (pSpec '|')+  l <- length <$> many bar   e <- p-  r <- length <$> many (pSpec '|')+  r <- length <$> many bar   pSpec 'R'   let n = l + r   guard (n > 0)@@ -646,7 +669,7 @@ pPat :: P EPat pPat = pPatOp   -- This is where view patterns belong, but it's too slow-  --  <|> (EViewPat <$> pExpr <*> (pSRArrow *> pPatApp))+--   <|> (EViewPat <$> pExpr <*> (pSRArrow *> pPat))  pPatOp :: P EPat pPatOp = pOperators pUOper pPatArg@@ -661,8 +684,12 @@   guard (null as || isPConApp f)   pure $ foldl EApp f as +-- We prefer x = ... to be parsed as a Fcn+-- rather than a PatBind pPatNotVar :: P EPat-pPatNotVar = guardM pPat isPConApp+pPatNotVar = guardM pPat notVar+  where notVar (EVar i) = isConIdent i+        notVar _ = True  ------------- @@ -685,13 +712,13 @@       -- don't collect equations when of the form 'i = e'       pure (name, [eqn])     _ -> do-      neqns <- many (pSpec ';' *> pEqn ident oper (\ n l -> n == name && l == length ps))+      neqns <- many (semi *> pEqn ident oper (\ n l -> n == name && l == length ps))       pure (name, eqn : map snd neqns)  pEqn :: P Ident -> P Ident -> (Ident -> Int -> Bool) -> P (Ident, Eqn) pEqn ident oper test = do   (name, pats) <- pEqnLHS ident oper-  alts <- pAlts (pSpec '=')+  alts <- pAlts equal   guard (test name (length pats))   pure (name, Eqn pats alts) @@ -717,7 +744,7 @@   <|> ((\ e -> [([], e)]) <$> (sep *> pExpr))  pAlt :: P () -> P EAlt-pAlt sep = (,) <$> (pSpec '|' *> sepBy1 pStmt (pSpec ',')) <*> (sep *> pExpr)+pAlt sep = (,) <$> (bar *> sepBy1 pStmt comma) <*> (sep *> pExpr)  pWhere :: P EBind -> P [EBind] pWhere pb =@@ -782,19 +809,16 @@   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"+        pure $ EDo q [SRec (init ss), SThen e]+      _ -> Control.Monad.Fail.fail "mdo"    else     pure (EDo q ss)  pIf :: P Expr pIf = EIf <$> (pKeyword "if" *> pExpr) <*>-              (optional (pSpec ';') *> pKeyword "then" *> pExpr) <*>-              (optional (pSpec ';') *> pKeyword "else" *> pExpr)-  <|> EMultiIf <$> (EAlts <$> (pKeyword "if" *> pBlock (pAlt (pSymbol "->"))) <*> pure [])+              (optional semi *> pKeyword "then" *> pExpr) <*>+              (optional semi *> pKeyword "else" *> pExpr)+  <|> EMultiIf <$> (EAlts <$> (pKeyword "if" *> pBlock (pAlt pSRArrow)) <*> pure [])  pQualDo :: P Ident pQualDo = do@@ -806,7 +830,7 @@ pOperComma :: P Ident pOperComma = pOper <|> pComma   where-    pComma = mkIdentSLoc <$> getSLoc <*> ("," <$ pSpec ',')+    pComma = mkIdentSLoc <$> getSLoc <*> ("," <$ comma)  -- No right section for '-'. pOperCommaNoMinus :: P Ident@@ -823,11 +847,11 @@   pure $ sel (foldl EUpdate ee us)  pUpdate :: P [EField]-pUpdate = pSpec '{' *> sepBy pEField (pSpec ',') <* pSpec '}'+pUpdate = pSpec '{' *> sepBy pEField comma <* pSpec '}'   where     pEField = do       fs <- (:) . unQualIdent <$> pLQIdentSym <*> many pSelect-      EField fs <$> (pSpec '=' *> pExpr) <|> pure (EFieldPun fs)+      EField fs <$> (equal *> pExpr) <|> pure (EFieldPun fs)      <|>       (EFieldWild <$ pSymbol "..") @@ -839,14 +863,14 @@       (EVar   <$> pLQIdentSym)   <|> (EVar   <$> pUQIdentSym)   <|> pLit-  <|> (eTuple <$> (pSpec '(' *> sepBy pExpr (pSpec ',') <* pSpec ')'))-  <|> EListish <$> (pSpec '[' *> pListish <* pSpec ']')-  <|> (ESectL <$> (pSpec '(' *> pExprOp) <*> (pOperComma <* pSpec ')'))-  <|> (ESectR <$> (pSpec '(' *> pOperCommaNoMinus) <*> (pExprOp <* pSpec ')'))-  <|> (ESelect <$> (pSpec '(' *> some pSelect <* pSpec ')'))-  <|> (ELit noSLoc . LPrim <$> (pKeyword "_primitive" *> pString))-  <|> (ETypeArg <$> (pSpec '@' *> pAType))-  <|> (uTuple <$> (pSpec 'L' *> sepBy pExpr (pSpec ',') <* pSpec 'R'))+  <|> (lpar *> (eTuple <$> sepBy pExpr comma) <* rpar)+  <|> (lbra *> (EListish <$> pListish) <* rbra)+  <|> (lpar *> (ESectL <$> pExprOp) <*> (pOperComma <* rpar))+  <|> (lpar *> (ESectR <$> pOperCommaNoMinus) <*> (pExprOp <* rpar))+  <|> (lpar *> (ESelect <$> some pSelect <* rpar))+  <|> (pKeyword "_primitive" *> (ELit noSLoc . LPrim <$> pString))+  <|> (pSpec '@' *> (ETypeArg <$> pAType))+  <|> (pSpec 'L' *> (uTuple <$> sepBy pExpr comma <* pSpec 'R'))   <|> pUSummand pExpr   -- This weirdly slows down parsing   -- <?> "aexpr"@@ -857,12 +881,12 @@   let     pMore = do       e2 <- pExpr-      ((\ es -> LList (e1:e2:es)) <$> some (pSpec ',' *> pExpr))+      ((\ es -> LList (e1:e2:es)) <$> some (comma *> pExpr))        <|> (LFromThenTo e1 e2 <$> (pSymbol ".." *> pExpr))        <|> (LFromThen e1 e2 <$ pSymbol "..")        <|> pure (LList [e1,e2])-  (pSpec ',' *> pMore)-   <|> (LCompr e1 <$> (pSpec '|' *> sepBy1 pStmt (pSpec ',')))+  (comma *> pMore)+   <|> (LCompr e1 <$> (bar *> sepBy1 pStmt comma))    <|> (LFromTo e1 <$> (pSymbol ".." *> pExpr))    <|> (LFrom e1 <$ pSymbol "..")    <|> pure (LList [e1])@@ -893,14 +917,14 @@ pBind :: P EBind pBind =       pBind'-  <|> PatBind     <$> pPatNotVar <*> (EMultiIf <$> pAlts (pSpec '='))+  <|> PatBind     <$> pPatNotVar <*> (EMultiIf <$> pAlts equal)  -- Bindings allowed in top level, let, class pBind' :: P EBind pBind' =       uncurry Fcn <$> pEqns-  <|> Sign        <$> (sepBy1 pLIdentSym (pSpec ',') <* dcolon) <*> pType-  <|> Infix       <$> ((,) <$> pAssoc <*> pPrec) <*> sepBy1 pTypeOper (pSpec ',')+  <|> Sign        <$> (sepBy1 pLIdentSym comma <* dcolon) <*> pType+  <|> Infix       <$> ((,) <$> pAssoc <*> pPrec) <*> sepBy1 pTypeOper comma   where     pAssoc = (AssocLeft <$ pKeyword "infixl") <|> (AssocRight <$ pKeyword "infixr") <|> (AssocNone <$ pKeyword "infix")     dig (TInt _ ii) | 0 <= i && i <= 9 = Just i  where i = fromInteger ii@@ -917,7 +941,7 @@ pInstBind :: P EBind pInstBind =       uncurry Fcn <$> pEqns-  <|> Sign        <$> (sepBy1 pLIdentSym (pSpec ',') <* dcolon) <*> pType+  <|> Sign        <$> (sepBy1 pLIdentSym comma <* dcolon) <*> pType  ------------- 
src/MicroHs/SymTab.hs view
@@ -11,6 +11,7 @@   stElemsLcl,   stKeysLcl,   stKeysGlbU,+  stKeysU,   stInsertLcl,   mapMSymTab,   getLocals,@@ -24,6 +25,7 @@ import MicroHs.Ident(Ident, showIdent, unIdent, mkIdentSLoc, slocIdent, isUpperX) import MicroHs.List import qualified MicroHs.IdentMap as M+import Text.PrettyPrint.HughesPJLiteClass  -- Symbol table --@@ -32,10 +34,10 @@ data Entry = Entry   Expr             -- convert (EVar i) to this expression; sometimes just (EVar i)   EType            -- type/kind of identifier---  deriving(Show)+  deriving(Show) -instance Show Entry where-  showsPrec _ (Entry e t) = shows e . showString " :: " . shows t+instance Pretty Entry where+  pPrintPrec l _ (Entry e t) = pPrint0 l e <+> text "::" <+> pPrint0 l t  instance Eq Entry where   Entry x _ == Entry y _  =  getIdent x == getIdent y@@ -68,13 +70,20 @@   _uglb :: M.Map [Entry],        -- unqualified globals   _qglb :: M.Map [Entry]         -- qualified globals   }---  deriving(Show)+  deriving(Show) +{- instance Show SymTab where   show (SymTab l ug qg) = unlines $     ("Locals:"  : map (("  " ++) . show) l) ++     ("UGlobals:" : map (("  " ++) . show) (M.toList ug)) ++     ("QGlobals:" : map (("  " ++) . show) (M.toList qg))+-}+instance Pretty SymTab where+  pPrintPrec l _ (SymTab lcl ug qg) = vcat $+    (text "Locals:"   : map (nest 2 . pPrint0 l) lcl) +++    (text "UGlobals:" : map (nest 2 . pPrint0 l) (M.toList ug)) +++    (text "QGlobals:" : map (nest 2 . pPrint0 l) (M.toList qg))  getLocals :: SymTab -> [Ident] getLocals s = map fst (_lcl s)@@ -119,11 +128,17 @@ stElemsLcl :: SymTab -> [Entry] stElemsLcl (SymTab l _ _) = map snd l +-- Get local ids stKeysLcl :: SymTab -> [Ident] stKeysLcl (SymTab l _ _) = map fst l +-- Get unqualified global ids stKeysGlbU :: SymTab -> [Ident] stKeysGlbU (SymTab _ m _) = M.keys m++-- Get all unqualified ids+stKeysU :: SymTab -> [Ident]+stKeysU s = stKeysLcl s ++ stKeysGlbU s  stInsertLcl :: HasCallStack => Ident -> Entry -> SymTab -> SymTab stInsertLcl i a (SymTab l ug qg)
src/MicroHs/TCMonad.hs view
@@ -17,6 +17,7 @@ import MicroHs.State import MicroHs.SymTab import System.IO.Unsafe(unsafePerformIO)+import Unsafe.Coerce import Debug.Trace  -----------------------------------------------@@ -63,9 +64,7 @@   Ident           -- unqualified name   Entry           -- symbol table entry   [ValueExport]   -- associated values, i.e., constructors, selectors, methods---  deriving (Show)----instance Show TypeExport where show (TypeExport i _ vs) = showIdent i ++ show vs+  deriving (Show)  instance NFData TypeExport where   rnf (TypeExport a b c) = rnf a `seq` rnf b `seq` rnf c@@ -73,9 +72,7 @@ data ValueExport = ValueExport   Ident           -- unqualified name   Entry           -- symbol table entry---  deriving (Show)----instance Show ValueExport where show (ValueExport i _) = showIdent i+  deriving (Show)  instance NFData ValueExport where   rnf (ValueExport a b) = rnf a `seq` rnf b@@ -111,7 +108,7 @@        (M.Map Expr)               -- map for direct lookup of atomic types        [InstDict]                 -- slow path        [IFunDep]---  deriving (Show)+  deriving (Show)  instance NFData InstInfo where   rnf (InstInfo a b c) = rnf a `seq` rnf b `seq` rnf c@@ -122,8 +119,15 @@ -- This is the dictionary expression, instance context, and types. -- An instance (C T1 ... Tn) has the type list [T1,...,Tn] -- The types and constraint can be instantiated by providing a starting TRef-type InstDict   = (Expr, TRef -> ([EConstraint], [EType]))+data InstDict   = InstDict Expr (TRef -> ([EConstraint], [EType])) +instance NFData InstDict where+  rnf (InstDict e f) = rnf e `seq` rnf (f 0)++instance Show InstDict where+  showsPrec p (InstDict e f) =+    showParen (p > 10) $ showsPrec 11 e . showChar ' ' . showParen True (showString "\\999->" . shows (f 999))+ -- All known type equalities, normalized into a substitution. type TypeEqTable = [(Ident, EType)] @@ -133,6 +137,7 @@   EType            -- class constructor type   [(Ident,EType)]  -- methods with their types   [IFunDep]        -- fundeps+  deriving (Show) type IFunDep = ([Bool], [Bool])           -- invariant: the length of the lists is the number of class tyvars  instance NFData ClassInfo where@@ -160,7 +165,15 @@   constraints :: Constraints,           -- constraints that have to be solved   defaults    :: Defaults               -- current defaults   }+  deriving (Show) +-- Hack to avoid cricular module reference.+-- See comment for SetTCState in Expr+tcStateToXTCState :: TCState -> XTCState+tcStateToXTCState = unsafeCoerce+xTCStateToTCState :: XTCState -> TCState+xTCStateToTCState = unsafeCoerce+ instTable :: TCState -> InstTable instTable tc = case ctxTables tc of (x,_,_,_) -> x @@ -267,7 +280,7 @@ getAppCon (EVar i) = i getAppCon (ECon i) = conIdent i getAppCon (EApp f _) = getAppCon f-getAppCon e = error $ "getAppCon: " ++ show e+getAppCon e = error $ "getAppCon: " ++ showExpr e  ----------------------------------------------- 
− src/MicroHs/TCMonad.hs-boot
@@ -1,2 +0,0 @@-module MicroHs.TCMonad where-data TCState
− src/MicroHs/TargetConfig.hs
@@ -1,109 +0,0 @@-{-# OPTIONS_GHC -Wno-orphans #-}-module MicroHs.TargetConfig(-    Target(..)-  , TTarget(..)-  , parseTargets-  , findTarget-  ) where-import qualified Prelude(); import MHSPrelude hiding(lex)-import Data.List-import Text.ParserComb-import MicroHs.Ident-import MicroHs.Lex--{- File Format-[target_name]-key = "value"-...--[next_target]-key = ...--}--data Target = Target String [(String,String)]-  deriving Show--data TTarget = TTarget-  { tName    :: String-  , tCC      :: String-  , tCCFlags :: String-  , tCCLibs  :: String-  , tConf    :: String-  , tOut     :: String  -- flag to set output file-  }--findTarget :: String -> [Target] -> Maybe Target-findTarget _ [] = Nothing-findTarget name ((Target n conf):ts) | n == name = Just $ Target n conf-                                     | otherwise = findTarget name ts----- Parser--type Parser = Prsr [Token] Token--instance TokenMachine [Token] Token where-  tmNextToken [] = (TEnd noSLoc, [])-  tmNextToken (x:xs) = (x,xs)--  tmRawTokens = id---eof :: Parser ()-eof = do-  t <- nextToken-  case t of-    TEnd _ -> pure ()-    _      -> fail "eof"--nl :: Parser [Token]-nl = many $ satisfy "\\n" isWhite-  where isWhite (TIndent _) = True-        isWhite _           = False--spec :: Char -> Parser Token-spec c = satisfy (showToken $ TSpec (SLoc "" 0 0) c) is-  where is (TSpec _ d) = c == d-        is _ = False--ident :: Parser String-ident = satisfyM "key" is-  where is (TIdent _ _ x) = Just x-        is _              = Nothing--key :: Parser String-key = ident--value :: Parser String-value = satisfyM "value" isValue-  where isValue (TString _ x) = Just x-        isValue _             = Nothing--targetName :: Parser String-targetName = spec '[' *> key <* spec ']'--keyValue :: Parser (String, String)-keyValue = (,) <$> key <*> (spec '=' *> value)--keyValues :: Parser [(String,String)]-keyValues = keyValue `sepBy` nl--target :: Parser Target-target = Target <$> (targetName <* nl) <*> keyValues--targets :: Parser [Target]-targets = (target `sepBy1` nl) <* nl <* eof--formatFailed :: LastFail Token -> String-formatFailed (LastFail _ ts msgs) =-  unlines [ showSLoc sloc ++ ":\n"-          , "  found: " ++ head (map showToken ts)-          , "  expected: " ++ unwords (nub msgs)-          ]-  where sloc = tokensLoc ts--parseTargets :: FilePath -> String -> Either String [Target]-parseTargets fp file =-  case runPrsr targets $ lex (SLoc fp 1 1) file of-    Left lf -> Left $ formatFailed lf-    Right a -> Right a
src/MicroHs/Translate.hs view
@@ -13,14 +13,15 @@ import Data.Maybe import Data.String import Unsafe.Coerce-import PrimTable +import PrimTable import MicroHs.Desugar(LDef, encodeInteger) import MicroHs.Expr import MicroHs.Exp import MicroHs.ExpPrint(encodeString) import MicroHs.Ident import qualified MicroHs.IdentMap as M+import Text.PrettyPrint.HughesPJLiteClass(prettyShow)  translateAndRun :: ([LDef], Exp) -> IO () translateAndRun defs = do@@ -58,11 +59,11 @@     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 (LBStr s) -> unsafeCoerce s     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)))-    _ -> error $ "trans: impossible: " ++ show ae+    Lit f@(LForImp _ _ _ _) -> trans r (App (Lit (LPrim "dynsym")) (Lit (LStr (drop 1 $ showLit f))))+    _ -> error $ "trans: impossible: " ++ prettyShow ae  -- Use linear search in this table. -- 99% of the hits are among the combinators.@@ -82,20 +83,74 @@   ("Y", _primitive "Y"),   ("B'", _primitive "B'"),   ("Z", _primitive "Z"),---  ("J", _primitive "J"),+  ("J", _primitive "J"),   ("R", _primitive "R"),   ("K2", _primitive "K2"),   ("K3", _primitive "K3"),   ("K4", _primitive "K4"),   ("C'B", _primitive "C'B"),+  ("L", _primitive "L"),+  ("KK", _primitive "KK"),+  ("KA", _primitive "KA"),+  ("T3", _primitive "T3"),+  ("T4", _primitive "T4"),+  ("T5", _primitive "T5"),+  ("T6", _primitive "T6"),+  ("T7", _primitive "T7"),+  ("T8", _primitive "T8"),+  ("T9", _primitive "T9"),+  ("T10", _primitive "T10"),+  ("T11", _primitive "T11"),+  ("T12", _primitive "T12"),+  ("T13", _primitive "T13"),+  ("T14", _primitive "T14"),+  ("T15", _primitive "T15"),+  ("T16", _primitive "T16"),+  ("TAG0", _primitive "TAG0"),+  ("TAG1", _primitive "TAG1"),+  ("TAG2", _primitive "TAG2"),+  ("TAG3", _primitive "TAG3"),+  ("TAG4", _primitive "TAG4"),+  ("TAG5", _primitive "TAG5"),+  ("TAG6", _primitive "TAG6"),+  ("TAG7", _primitive "TAG7"),+  ("TAG8", _primitive "TAG8"),+  ("TAG9", _primitive "TAG9"),+  ("TAG10", _primitive "TAG10"),+  ("TAG11", _primitive "TAG11"),+  ("TAG12", _primitive "TAG12"),+  ("TAG13", _primitive "TAG13"),+  ("TAG14", _primitive "TAG14"),+  ("TAG15", _primitive "TAG15"),+  ("TAG16", _primitive "TAG16"),+  ("TAG17", _primitive "TAG17"),+  ("TAG18", _primitive "TAG18"),+  ("TAG19", _primitive "TAG19"),+  ("TAG20", _primitive "TAG20"),+  ("TAG21", _primitive "TAG21"),+  ("TAG22", _primitive "TAG22"),+  ("TAG23", _primitive "TAG23"),+  ("TAG24", _primitive "TAG24"),+  ("TAG25", _primitive "TAG25"),+  ("TAG26", _primitive "TAG26"),+  ("TAG27", _primitive "TAG27"),+  ("TAG28", _primitive "TAG28"),+  ("TAG29", _primitive "TAG29"),+  ("TAG30", _primitive "TAG30"),+  ("TAG31", _primitive "TAG31"),+  ("TAG32", _primitive "TAG32"),   ("+", _primitive "+"),   ("-", _primitive "-"),   ("*", _primitive "*"),   ("quot", _primitive "quot"),   ("rem", _primitive "rem"),+  ("neg", _primitive "neg"),+  ("u+", _primitive "u+"),+  ("u-", _primitive "u-"),+  ("u*", _primitive "u*"),   ("uquot", _primitive "uquot"),   ("urem", _primitive "urem"),-  ("neg", _primitive "neg"),+  ("uneg", _primitive "uneg"),   ("and", _primitive "and"),   ("or", _primitive "or"),   ("xor", _primitive "xor"),@@ -104,6 +159,7 @@   ("shr", _primitive "shr"),   ("ashr", _primitive "ashr"),   ("subtract", _primitive "subtract"),+  ("usubtract", _primitive "usubtract"),   ("popcount", _primitive "popcount"),   ("clz", _primitive "clz"),   ("ctz", _primitive "ctz"),@@ -131,7 +187,11 @@   ("f>=", _primitive "f>="),   ("fneg", _primitive "fneg"),   ("itof", _primitive "itof"),+  ("utof", _primitive "utof"),+  ("ftoi", _primitive "ftoi"),   ("Itof", _primitive "Itof"),+  ("ftod", _primitive "ftod"),+  ("dtof", _primitive "dtof"),   ("d+", _primitive "d+"),   ("d-", _primitive "d-"),   ("d*", _primitive "d*"),@@ -144,7 +204,9 @@   ("d>=", _primitive "d>="),   ("dneg", _primitive "dneg"),   ("itod", _primitive "itod"),+  ("utod", _primitive "utod"),   ("Itod", _primitive "Itod"),+  ("dtoi", _primitive "dtoi"),   ("seq", _primitive "seq"),   ("icmp", _primitive "icmp"),   ("ucmp", _primitive "ucmp"),@@ -208,8 +270,12 @@   ("fpfin", _primitive "fpfin"),   ("fp2bs", _primitive "fp2bs"),   ("bs2fp", _primitive "bs2fp"),+  ("bsgrab", _primitive "bsgrab"),+  ("bsgrablen", _primitive "bsgrablen"),   ("IO.fork", _primitive "IO.fork"),   ("IO.thid", _primitive "IO.thid"),+  ("IO.waitrdfd", _primitive "IO.waitrdfd"),+  ("IO.waitwrfd", _primitive "IO.waitwrfd"),   ("thnum", _primitive "thnum"),   ("IO.throwto", _primitive "IO.throwto"),   ("IO.yield", _primitive "IO.yield"),@@ -226,15 +292,18 @@   ("SPnew", _primitive "SPnew"),   ("SPderef", _primitive "SPderef"),   ("SPfree", _primitive "SPfree"),-   ("I+", _primitive "I+"),   ("I-", _primitive "I-"),   ("I*", _primitive "I*"),   ("Iquot", _primitive "Iquot"),   ("Irem", _primitive "Irem"),+  ("Ineg", _primitive "Ineg"),+  ("Iu+", _primitive "Iu+"),+  ("Iu-", _primitive "Iu-"),+  ("Iu*", _primitive "Iu*"),   ("Iuquot", _primitive "Iuquot"),   ("Iurem", _primitive "Iurem"),-  ("Ineg", _primitive "Ineg"),+  ("Iuneg", _primitive "Iuneg"),   ("Iand", _primitive "Iand"),   ("Ior", _primitive "Ior"),   ("Ixor", _primitive "Ixor"),@@ -243,6 +312,7 @@   ("Iashr", _primitive "Iashr"),   ("Iinv", _primitive "Iinv"),   ("Isubtract", _primitive "Isubtract"),+  ("Iusubtract", _primitive "Iusubtract"),   ("Ipopcount", _primitive "Ipopcount"),   ("Iclz", _primitive "Iclz"),   ("Ictz", _primitive "Ictz"),@@ -267,5 +337,6 @@   ("Wkderef", _primitive "Wkderef"),   ("Wkfinal", _primitive "Wkfinal"),   ("IO.getmaskingstate", _primitive "IO.getmaskingstate"),-  ("IO.setmaskingstate", _primitive "IO.setmaskingstate")+  ("IO.setmaskingstate", _primitive "IO.setmaskingstate"),+  ("IO.pp", _primitive "IO.pp")   ]
src/MicroHs/TypeCheck.hs view
@@ -19,6 +19,7 @@ import qualified Prelude(); import MHSPrelude import Control.Applicative import Control.Monad+import qualified Data.ByteString.Char8 as BS import Data.Char import Data.Function import Data.List@@ -37,6 +38,7 @@ import MicroHs.Parse(dotDotIdent) import MicroHs.SymTab import MicroHs.TCMonad+import Text.PrettyPrint.HughesPJLiteClass import Debug.Trace  --primitiveKinds :: [String]@@ -108,7 +110,7 @@     imps = map filterImports aimps     tc =       case defs of-        SetTCState tcs : _ -> tcs  -- hack to set the saved TCState+        SetTCState tcs : _ -> xTCStateToTCState tcs  -- hack to set the saved TCState         _ -> mkTCState mn globs imps   in case tcRun (tcDefs flags impt defs) tc of        (tds, tcs) ->@@ -335,9 +337,10 @@ 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 = []+        mrg ts ts' | all (\ t -> elemBy eqEType t ts) ts' = ts+                   | any (\ t -> elemBy eqEType t ts') ts = ts'+                   | otherwise = []  -- If neither module's default subsumes the other+                                     -- then use empty defaults, as per spec.  mergeInstInfo :: InstInfo -> InstInfo -> InstInfo mergeInstInfo (InstInfo m1 l1 fds) (InstInfo m2 l2 _) =@@ -353,7 +356,7 @@ -- 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'+eqInstDict (InstDict e _) (InstDict e' _) = eqExpr e e'  -- Identifier should only be seen with it's qualified name. isInstId :: Ident -> Bool@@ -395,16 +398,18 @@ --  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 ..]+      -- XXX+      -- [u ..] is not portable between 64 and 32 bit since it uses+      -- maxBound::Int which will differ between them.+      -- XXX Using a function in InstInfo is not ideal.+      zipWith (\ ik j -> (idKindIdent ik, EUVar j)) iks [u .. 100000000::Int]      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)+        (_,  _,  (c, ts      )) -> return (c, InstInfo M.empty [InstDict e ii] fds)           where ii u =                   let ctx' = map (subst s) ctx                       ts'  = map (subst s) ts@@ -568,7 +573,7 @@   in       [        -- The function arrow et al are bothersome to define in Primitives, so keep them here.-       -- But the fixity is defined in Primitives.+       -- The fixity is set by addPrimFixs        (mkIdentB "->",           [entry identArrow    kTypeTypeTypeS]),        (mkIdentB "=>",           [entry identImplies  kImplies]),        (mkIdentB "~",            [entry identTypeEq   kTypeEqual]),@@ -624,6 +629,10 @@ munify loc (Infer r) b = tSetRefType loc r b munify loc (Check a) b = unify loc a b +-- Expand type synonyms, but keep location info+expandSynLoc :: EType -> T EType+expandSynLoc at = setSLocExpr (getSLoc at) <$> expandSyn at+ -- Synonyms are expanded after kind checking. -- There should be no synonyms in any of the symbol tables (except synTable). expandSyn :: HasCallStack =>@@ -638,7 +647,7 @@     chk (EVar i) =       case M.lookup i syns of         Nothing -> return ()-        _ -> tcError (getSLoc i) $ "bad synonym use: " ++ show i ++ " in " ++ show at+        _ -> tcError (getSLoc i) $ "bad synonym use: " ++ showIdent i ++ " in " ++ showEType at     chk (EUVar _) = return ()     chk (EForall _ _ t) = chk t     chk (ELit _ _) = return ()@@ -681,7 +690,7 @@         EForall b iks tt | null ts -> EForall b iks (esyn tt)         ELit _ (LStr _) -> t         ELit _ (LInteger _) -> t-        _ -> impossibleShow t+        _ -> impossiblePP t   mapEType :: (EType -> EType) -> EType -> EType@@ -959,9 +968,7 @@   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+  dste <- tcExpandClassInst flags impt dst            -- expand class&instance, do deriving --  tcTrace ("tcDefs 3:\n" ++ showEDefs dste)   setDefault dste                                     -- set current defaults   dste' <- tcDefsValue dste                           -- type check all value definitions@@ -1030,8 +1037,8 @@   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+tcExpandClassInst :: Flags -> ImpType -> [EDef] -> T [EDef]+tcExpandClassInst flags impt dst = do   dsf <- withTypeTable $ do     dsc <- concat <$> mapM expandClass dst              -- Expand all class definitions     concat <$> mapM expandField dsc                     -- Add HasField instances@@ -1040,7 +1047,12 @@     case impt of       ImpBoot -> return dsf       ImpNormal -> concat <$> mapM doDeriving dsf       -- Add derived instances-  concat <$> mapM expandInst dsd                        -- Expand all instance definitions+  dumpIf flags Dderive $+    tcTrace' $ "derived:\n" ++ showEDefs dsd+  res <- concat <$> mapM expandInst dsd                        -- Expand all instance definitions+  dumpIf flags DexpandInst $+    tcTrace' $ "expanded:\n" ++ showEDefs res+  return res  -- Check&rename the given kinds, also insert the type variables in the symbol table. withVks :: forall a . HasCallStack => [IdKind] -> ([IdKind] -> T a) -> T a@@ -1177,34 +1189,46 @@      pure $ StandDeriving st' narg ct'  -- The type variables vks are already in scope when we get here.+-- With+--  tyId :: k1 -> ... -> kn -> Type+-- and+--  cls = C t1 ... tj+--  C :: (kk1 -> ... -> kkj -> kk -> Type) -> Constraint+--        ...............................  this is k below+-- then we need to find a k such that+--  cls (tyId v1 ... vk) is well kinded. 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+  let tcDerive (_, cls) = do+        let loc = getSLoc cls+        -- The kind of cls 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) $+        vkk <- newUVar+        --traceM $ "tcDerive 1: " ++ show cls+        cls' <- tCheckTypeTImpl QExpl (vkk `kArrow` kConstraint) cls+        --traceM $ "tcDerive 2: " ++ show cls'+--        do { vkk' <- derefUVar vkk; traceM $ "vkk=" ++ show vkk' }+        (kks, _) <- getArrows <$> derefUVar vkk      -- arrows in kk+        -- The checking that the final kind is Type happens with the tc call below.+        let kkn = length kks                        -- number of arrows in kk+            n = length vks                          -- number of args given to the data type+            k = n - kkn+            ty = tApps tyId (map (EVar . idKindIdent) (take k vks))+--        traceM $ "tcDeriving tyId=" ++ show tyId ++ " vks=" ++ show (map idKindIdent vks) ++ " cls=" ++ show cls ++ " kkn,n,k=" ++ show (kkn,n,k) ++ " ty=" ++ show ty+        when (k < 0) $           tcError loc "Bad deriving"-        -- The generated instance has the form 'instance ... => c ty'.+        -- The generated instance has the form 'instance ... => cls 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 ()+        let tc t = do _ <- tCheckTypeTImpl QExpl kConstraint (tApp cls t); return ()         tc ty         case strat of-          DerVia v -> tc v  -- XXX should this allow implicit quantification?+          DerVia via -> tc via  -- XXX should this allow implicit quantification?           _        -> return ()-        return (r, c')+--        traceM ("tcDerive: return " ++ show (kkn, cls'))+        return (kkn, cls') +   cs' <- mapM tcDerive cs   -- Ignore the kind here, it's checked for each derived type   strat' <- case strat of@@ -1538,7 +1562,7 @@                 (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@@ -1639,16 +1663,16 @@       return $ Fcn (qualIdent' mn i) teqns     ForImp cc ie i t -> do       mn <- gets moduleName-      t' <- withNewtypeAsSyns (expandSyn t)+      t' <- withNewtypeAsSyns (expandSynLoc 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')+      t'' <- withNewtypeAsSyns (expandSynLoc t')       let e'' = eLetB (eBinds ds) e'-      pure $ ForExp cc (Just $ fromMaybe (show e) ms) e'' t''+      pure $ ForExp cc (Just $ fromMaybe (showExpr e) ms) e'' t''     Pattern{} -> impossible     _ -> return adef @@ -1692,7 +1716,7 @@ addForall :: QForm -> EType -> T EType addForall _ t@EForall{} = return t addForall expl t = do-  bvs <- stKeysLcl <$> gets valueTable         -- bound outside+  bvs <- stKeysU <$> 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)@@ -1740,10 +1764,16 @@ data Expected = Infer TRef | Check EType --  deriving(Show) +{- instance Show Expected where   show (Infer r) = "(Infer " ++ show r ++ ")"-  show (Check t) = "(Check " ++ show t ++ ")"+  show (Check t) = "(Check " ++ showExpr t ++ ")"+-}+instance Pretty Expected where+  pPrintPrec l _ (Infer r) = parens $ text "Infer" <+> pPrint0 l r+  pPrintPrec l _ (Check t) = parens $ text "Check" <+> pPrint0 l t + tInfer :: forall a b . HasCallStack =>           (Expected -> a -> T b) -> a -> T (Typed b) tInfer tc a = do@@ -1893,7 +1923,7 @@                 Just (EApp (EVar lst) (EVar c))                  | lst == identList && c == identChar -> tcLit mt loc lit                 Just (EVar bs)-                 | bs == identByteString -> tcLit mt loc (LBStr s)+                 | bs == identByteString -> tcLit mt loc (LBStr (BS.pack s))                 _ -> do                   (f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromString"))                   (_at, rt) <- unArrow loc ft@@ -2064,13 +2094,13 @@            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+    _ -> error $ "tcExpr: cannot handle: " ++ prettyShow (getSLoc ae) ++ " " ++ showExpr ae       -- impossible  -- We need to use a case expression to do record updated if@@ -2132,9 +2162,14 @@  dsSRec :: Maybe Ident -> Ident -> Ident -> [EStmt] -> EStmt dsSRec mmn imfix iret ss =-  let vs = ETuple $ map EVar $ concatMap getStmtBound 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]) +-- XXX Maybe allow singleton tuples+eTuple :: [Expr] -> Expr+eTuple [e] = e+eTuple es = ETuple es+ -- 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@@ -2154,8 +2189,8 @@     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+    EVar i | isIdent dictPrefixDollar i -> impossiblePP ae+           | isDummyIdent i -> impossiblePP ae            | otherwise -> do              -- Type checking an expression (or type)              (fn, t) <- tLookupV i@@ -2178,7 +2213,7 @@       tcExprApFn mt f t args  data AnArg = ArgExpr Expr EType | ArgCtx EConstraint-  deriving Show+--  deriving Show  -- Instantiate a function, but delay generating the dictionaries. -- When generating the dictionaries here (like tInst) there@@ -2189,9 +2224,9 @@ --  * 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 fnt args | trace ("tcExprApFn: fn=" ++ show fn ++ ", fnt=" ++ show fnt ++ ", args=" ++ show args ++ ", mt=" ++ show mt) False = undefined tcExprApFn mt fn atfn aargs = do-  -- traceM $ "tcExprApFn: " ++ show (getSLoc aargs, mt, fn, atfn, aargs)+--  traceM $ "tcExprApFn: " ++ show (getSLoc aargs, mt, fn, atfn, aargs) --  xx <- gets ctxTables --  traceM $ "tcExprApFn: ctxTables=" ++ show xx   let loc = getSLoc fn@@ -2210,8 +2245,8 @@             loop ats aas ft'           AConstaint ctx ft ->             loop (ArgCtx ctx : ats) aas ft-          ARet -> do-            (at, rt) <- unArrow loc aft+          ARet aft' -> 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@@ -2237,8 +2272,8 @@         etmp' <- instSigma loc etmp rt mt          let arg (ArgExpr e t) = do-              --t' <- derefUVar t-              --traceM ("final: checkSigma: " ++ show (e, t'))+--              t' <- derefUVar t+--              traceM ("final: checkSigma: " ++ show (e, t'))               checkSigma e t             arg (ArgCtx ctx) = newDict loc ctx         args <- mapM arg aats@@ -2340,10 +2375,8 @@ 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@@ -2386,7 +2419,7 @@     EParen p -> dsEFields p     ENegApp _ -> return apat     EOr ps -> EOr <$> mapM dsEFields ps-    _ -> error $ "dsEFields " ++ show apat+    _ -> error $ "dsEFields " ++ showExpr apat  unsetField :: Ident -> Expr unsetField i = mkExn (getSLoc i) (unIdent i) "recConError"@@ -2448,6 +2481,8 @@   fixs <- gets fixTable   let     opfix :: (Ident, Expr) -> T ((Expr, Fixity), Expr)+    opfix (i, e) | Just 2 <- getTupleConstr i =  -- tcLSect/tcRSect can introduce ',' as an operator+      return ((EVar i, (AssocNone, -1)), e)     opfix (i, e) = do       (ei, _) <- tLookupV i       let fx = getFixity fixs (getAppCon ei)@@ -2465,7 +2500,7 @@   e' <- tcOper e (ies ++ [(op, x)])   case e' of     EApp f x' | x' `eqExpr` x -> return f-    _                   -> tcError loc "Bad section fixity"+    _                         -> tcError loc "Bad section fixity" tcLSect e op =   return (EApp (EVar op) e) @@ -2476,7 +2511,7 @@   e' <- tcOper x ((op, e):ies)   case e' of     EApp (EApp _ x') _ | x `eqExpr` x' -> return (eLam [x] e')-    _                            -> tcError loc "Bad section fixity"+    _                                  -> tcError loc "Bad section fixity" tcRSect op e = do   let x = eVarI (getSLoc op) "$x"   return (eLam [x] (EApp (EApp (EVar op) x) e))@@ -2520,7 +2555,7 @@   = AReqd         IdKind      EType       -- forall ->   | AForall QForm [IdKind]    EType       -- forall .   | AConstaint    EConstraint EType       -- =>-  | ARet                                  -- none of the above+  | ARet                      EType       -- none of the above --  deriving Show  nextArg :: EType -> Arg@@ -2528,7 +2563,7 @@ 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+          | otherwise                      = ARet t  tcExprLam :: HasCallStack => Expected -> SLoc -> [Eqn] -> T Expr tcExprLam mt loc qs = do@@ -2598,11 +2633,13 @@         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+    ARet at' -> +      case pps of+        p:ps -> 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')+        [] -> ta at' []   -- base case, no more arguments, explicit or implicit   tcAlts :: HasCallStack => EType -> EAlts -> T EAlts@@ -2648,6 +2685,7 @@  tCheckExprAndSolve :: HasCallStack => EType -> Expr -> T Expr tCheckExprAndSolve t e = do+--  traceM $ "tCheckExprAndSolve: " ++ show (e, t)   (e', bs) <- solveLocalConstraints $ tCheckExpr t e   if null bs then     return e'@@ -2802,7 +2840,7 @@           true = eTrue loc       tcPat mt $ EViewPat orFun true -    _ -> error $ "tcPat: not handled " ++ show (getSLoc ae) ++ " " ++ show ae+    _ -> error $ "tcPat: not handled " ++ prettyShow (getSLoc ae) ++ " " ++ showExpr ae  -- The expected type is for (eApps afn (reverse args)) tcPatAp :: HasCallStack =>@@ -2820,7 +2858,7 @@      EParen e -> tcPatAp mt args e -    _ -> tcError (getSLoc afn) ("Bad pattern " ++ show afn)+    _ -> tcError (getSLoc afn) ("Bad pattern " ++ showExpr afn)  tcPatApCon :: Expected -> [EPat] -> EPat -> EType -> T EPatRet tcPatApCon mt args con xpt = do@@ -2843,7 +2881,7 @@       case xpt of          -- Sanity check          EForall _ _ EForall{} -> return ()-         _ -> impossibleShow con+         _ -> impossiblePP con       EForall _ avs apt <- tInst' xpt        (sks, spt) <- shallowSkolemise avs apt@@ -2857,7 +2895,7 @@       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+                  arity e = impossiblePP e       checkArity ary        let step [] t r = return (t, r)@@ -2911,9 +2949,9 @@ 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+      def d = impossiblePP d   oldState <- get+  xts <- mapM def bs                    -- add temporary types   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@@ -2921,8 +2959,11 @@   --   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'+  -- Ensure pattern bindings are not polymorphic+  let isDsPatBind (Fcn i _) = isPatBindVar i+      isDsPatBind _ = False+  if any isDsPatBind bs' then do+     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@@ -2938,16 +2979,17 @@         return bs'        else do        -- Generalize-       cs  <- gets constraints-       cs' <- mapM (derefUVar . snd) cs+       cs <- mapM (derefUVar . snd) =<< gets constraints+       -- find constraints involving the local tyvars+       let ctx = nubBy eqEType $+                 filter (\ c -> not $ null $ intersect qvs' (metaTvs [c])) cs        let multiParam ct = length (snd (getApp ct)) /= 1-       if any multiParam cs' then       -- temporary workaround for +       if any multiParam ctx ||       -- temporary workaround for+          -- Overloaded bind: fallback to monomorphic behavior+          not (null ctx) && not (all isSynFcn bs') then          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'+--        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.@@ -3025,7 +3067,7 @@     ELit _ (LStr _) -> at     ELit _ (LInteger _) -> at     EQVar _ _ -> at-    _ -> impossibleShow at+    _ -> impossiblePP at  tListI :: SLoc -> Ident tListI loc = mkIdentSLoc loc nameList@@ -3352,7 +3394,7 @@   | Just  (ctx1, EForall _ vks2 t1) <- getImplies t0   , Just  (ctx2, ty) <- getImplies t1   = (vks1, ctx1, vks2, ctx2, ty)-splitPatSynType t = impossibleShow t+splitPatSynType t = impossiblePP t  ----- @@ -3380,7 +3422,7 @@           when (isConIdent iCls) $             --impossible             -- XXX it seems we can get here, e.g., Control.Monad.Fail without Applicative import-            impossibleShow (acc, iCls)+            impossiblePP (acc, iCls)           return [(edict, vks, ctx, cc, [])]         Just (ClassInfo iks sups _ _ fds) -> do           let@@ -3404,7 +3446,7 @@ --  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@@ -3474,7 +3516,7 @@         case M.lookup i ct of           Nothing -> error $ "getSuperClasses: " ++ show i           Just (ClassInfo _ supers _ _ _) ->-            loop done (concatMap flatten supers ++ is)+            loop (i:done) (concatMap flatten supers ++ is)       flatten a =         case getApp a of           (c, ts) ->@@ -3483,21 +3525,20 @@               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))+showInstDict (InstDict e ctxts) = showExpr e ++ " :: " ++ prettyShow (addConstraints ctx (tApps (mkIdent "_") ts))+  where (ctx, ts) = ctxts 10000 -showInstDef :: InstDef -> String+showInstDef :: (Ident, InstInfo) -> 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+showMatch :: (Expr, [EConstraint], [Improve]) -> String+showMatch (e, ts, _) = show e ++ " " ++ show ts  showConstraint :: (Ident, EConstraint) -> String showConstraint (i, t) = show i ++ " :: " ++ show t@@ -3557,7 +3598,7 @@   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)+--  tcTrace ("solveMany: trying " ++ showEType ct)   let loc = getSLoc di       (iCls, cts) = getApp ct       solver = head [ s | (p, s) <- solvers, p iCls ]@@ -3566,17 +3607,18 @@   -- 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+--      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)+--      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+--  traceM $ "solveInst " ++ prettyShow cts   it <- gets instTable --  tcTrace ("instances:\n" ++ unlines (map showInstDef (M.toList it)))   -- XXX The solveGen&co functions are not in the T monad.@@ -3587,7 +3629,7 @@   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)+--      tcTrace $ "solveInst: " ++ showIdent iCls ++ " atomMap size=" ++ show (M.size atomMap)       case cts of         [EVar i] -> do           case M.lookup i atomMap of@@ -3626,6 +3668,7 @@ -- XXX should look for a direct (tupled) dictionary solveTuple :: SolveOne solveTuple loc _iCls cts = do+--  traceM $ "solveTuple " ++ prettyShow cts   goals <- mapM (\ c -> do { d <- newDictIdent loc; return (d, c) }) cts   return $ Just (ETuple (map (EVar . fst) goals), goals, []) @@ -3633,6 +3676,7 @@ -- 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+--  traceM $ "solveTypeEq " ++ prettyShow [t1, t2]   eqs <- gets typeEqTable   --tcTrace ("solveTypeEq eqs=" ++ show eqs)   case solveEq eqs t1 t2 of@@ -3647,6 +3691,7 @@  solveCoercible :: HasCallStack => SolveOne solveCoercible loc iCls [t1, t2] = do+--  traceM $ "solveCoercible " ++ prettyShow [t1, t2]   -- pretend newtypes are type synonyms   (t1', t2') <- withNewtypeAsSyns $     (,) <$> expandSynNoChk t1 <*> expandSynNoChk t2@@ -3691,7 +3736,7 @@  -- Pretend newtypes are type synonyms. -- XXX It's rather inefficient to do this over and over.--- XXX Cannot handle recursive newtypes+-- XXX We give up on direct recursive newtypes.  Should do it for mutual recursion too. withNewtypeAsSyns :: T a -> T a withNewtypeAsSyns act = do   st <- gets synTable  -- get old syntable@@ -3703,9 +3748,9 @@           -- 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+          unless (qi `elem` allVarsExpr t) $+            -- Not directly recursive+            extSyn qi vs t  -- extend synonym table       ext _ = return ()   mapM_ ext $ M.toList dt @@ -3718,10 +3763,12 @@ isEUVar _ = False  solveKnownNat :: SolveOne+--solveKnownNat _ _ x | trace ("solveKnownNat: " ++ prettyShow x) False = undefined 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 _ _ x | trace ("solveKnownSymbol: " ++ prettyShow x) False = undefined solveKnownSymbol loc iCls [e@(ELit _ (LStr _))] = mkConstDict loc iCls e solveKnownSymbol loc iCls ts = solveInst loc iCls ts  -- look for a dict argument @@ -3742,7 +3789,7 @@ findMatches uniq _ loc fds ds its =  let rrr =        [ (length s, (de, map (substEUVar s) ctx, imp))-       | (de, ctxts) <- ds+       | (InstDict de ctxts) <- ds        , let (ctx, ts) = ctxts uniq        , Just (s, imp) <- [matchTypes loc ts its fds]        ]@@ -3765,9 +3812,11 @@ matchTypes :: SLoc -> [EType] -> [EType] -> [IFunDep] -> Maybe (TySubst, [Improve]) matchTypes _ ats ats' [] = do   -- Simple special case when there are no fundeps.+--  traceM $ "\nmatchTypes " ++ prettyShow (ats, ats') ++ show ats   let loop r (t:ts) (t':ts') = matchType r t t' >>= \ r' -> loop r' ts ts'       loop r _ _ = pure r   s <- loop [] ats ats'+--  traceM $ "\nmatchTypes " ++ prettyShow (ats, ats', s)   pure (s, []) matchTypes loc ts ts' fds = asum $ map (matchTypesFD loc ts ts') fds @@ -3812,10 +3861,12 @@     comb1 v t r =       case lookup v r of         Nothing -> Just ((v, t) : r)-        Just t' -> matchType [] t' t+        Just t' -> matchType r t' t  -- Get the best matches.  These are the matches with the smallest substitution. -- Always prefer arguments rather than global instances.+-- If there are multiple alternatives with the args, just pick one.+-- This can arise from diamonds in the superclass chain. getBestMatches :: [(Int, (Expr, [EConstraint], [Improve]))] -> [(Expr, [EConstraint], [Improve])] getBestMatches [] = [] getBestMatches ams =@@ -3825,7 +3876,7 @@       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+  in  if null args then pick insts else take 1 (pick args)  -- Check that there are no unsolved constraints. checkConstraints :: HasCallStack => T ()@@ -3835,9 +3886,17 @@     [] -> 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'+{-+      is <- gets instTable+      traceM $ "Cannot satisfy constraint: " ++ unlines (map (\ (xi, ii) -> show xi ++ ":\n  " ++ showInstInfo ii) (M.toList is))+      let EApp (EVar xi) _ = t'+          Just ii = M.lookup xi is+      traceM ("lookup " ++ showInstInfo ii)+      solveConstraints+      cs' <- gets constraints+      traceM (show (length cs, length cs'))+-}+      tcError (getSLoc i) $ "Cannot satisfy constraint: " ++ showExpr t'                             ++ "\n     fully qualified: " ++ showExprRaw t'  -- Add a type equality constraint.@@ -3955,12 +4014,6 @@   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]
+ src/MicroHs/Version.hs view
@@ -0,0 +1,9 @@+-- This module is updated by updateversion.sh+module MicroHs.Version(+  version,+  ) where+import qualified Prelude()+import Data.Version++version :: Version+version = makeVersion [0,16,0,0]
src/Text/ParserComb.hs view
@@ -115,7 +115,7 @@       r -> r  instance TokenMachine tm t => MonadPlus (Prsr tm t) where-  mzero = fail "mzero"+  mzero = F.fail "mzero"   mplus = (<|>)  satisfy :: forall tm t . TokenMachine tm t => String -> (t -> Bool) -> Prsr tm t t
src/Text/PrettyPrint/HughesPJLite.hs view
@@ -1,11 +1,11 @@---  Based on the pretty-printer outlined in the paper+-- Based on the pretty-printer outlined in the paper -- 'The Design of a Pretty-printing Library' by -- John Hughes in Advanced Functional Programming, 1995. -- With inspiration and code from the from the Hackage package pretty. module Text.PrettyPrint.HughesPJLite(   Doc,   text, empty,-  (<>), (<+>), ($$), ($+$),+  (<+>), ($$), ($+$),   hcat, hsep,   vcat,   sep, cat,@@ -17,9 +17,9 @@   Style,   render, renderStyle,   ) where-import qualified Prelude(); import MHSPrelude hiding ((<>))+import qualified Prelude(); import MHSPrelude -infixl 6 <>, <+>+infixr 6 <+> infixl 5 $$, $+$  data Doc@@ -177,8 +177,8 @@                              | otherwise           -- Put them really above                              = nilAbove_ (mkNest k q) -(<>) :: Doc -> Doc -> Doc-p <>  q = beside_ p False q+instance Semigroup Doc where+  p <> q = beside_ p False q  -- | Beside, separated by space, unless one of the arguments is 'empty'. -- '<+>' is associative, with identity 'empty'.
+ src/Text/PrettyPrint/HughesPJLiteClass.hs view
@@ -0,0 +1,139 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Text.PrettyPrint.HughesPJClass+-- Copyright   :  (c) Lennart Augustsson 2014+-- License     :  BSD-style (see the file LICENSE)+--+-- Maintainer  :  David Terei <code@davidterei.com>+-- Stability   :  stable+-- Portability :  portable+--+-- Pretty printing class, simlar to 'Show' but nicer looking.+--+-- Note that the precedence level is a 'Rational' so there is an unlimited+-- number of levels. This module re-exports 'Text.PrettyPrint.HughesPJ'.+--+-----------------------------------------------------------------------------++module Text.PrettyPrint.HughesPJLiteClass (+    -- * Pretty typeclass+    Pretty(..),++    PrettyLevel(..), prettyNormal,+    PrettyPrec,+    prettyShow,+    pPrint0,+    appPrec,++    -- re-export HughesPJ+    module Text.PrettyPrint.HughesPJLite+  ) where+import qualified Prelude(); import MHSPrelude++import Text.PrettyPrint.HughesPJLite++-- | Level of detail in the pretty printed output. Level 0 is the least+-- detail.+newtype PrettyLevel = PrettyLevel Int+  deriving (Eq, Ord, Show)++type PrettyPrec = Int++-- | The "normal" (Level 0) of detail.+prettyNormal :: PrettyLevel+prettyNormal = PrettyLevel 0++-- | Pretty printing class. The precedence level is used in a similar way as in+-- the 'Show' class. Minimal complete definition is either 'pPrintPrec' or+-- 'pPrint'.+class Pretty a where+  pPrintPrec :: PrettyLevel -> PrettyPrec -> a -> Doc+  pPrintPrec _ _ = pPrint++  pPrint :: a -> Doc+  pPrint = pPrintPrec prettyNormal 0++  pPrintList :: PrettyLevel -> [a] -> Doc+  pPrintList l = brackets . fsep . punctuate comma . map (pPrintPrec l 0)++-- | Pretty print a value with the 'prettyNormal' level.+prettyShow :: (Pretty a) => a -> String+prettyShow = render . pPrint++pPrint0 :: (Pretty a) => PrettyLevel -> a -> Doc+pPrint0 l = pPrintPrec l 0++appPrec :: PrettyPrec+appPrec = 10++comma :: Doc+comma = text ","++-- Various Pretty instances+instance Pretty Int where pPrint = text . show++instance Pretty Integer where pPrint = text . show++instance Pretty Double where pPrint = text . show++instance Pretty () where pPrint _ = text "()"++instance Pretty Bool where pPrint = text . show++instance Pretty Ordering where pPrint = text . show++instance Pretty Char where+  pPrint = text . show+  pPrintList _ = text . show++instance (Pretty a) => Pretty (Maybe a) where+  pPrintPrec _ _ Nothing = text "Nothing"+  pPrintPrec l p (Just x) =+    maybeParens (p > appPrec) $ text "Just" <+> pPrintPrec l (appPrec+1) x++instance (Pretty a, Pretty b) => Pretty (Either a b) where+  pPrintPrec l p (Left x) =+    maybeParens (p > appPrec) $ text "Left" <+> pPrintPrec l (appPrec+1) x+  pPrintPrec l p (Right x) =+    maybeParens (p > appPrec) $ text "Right" <+> pPrintPrec l (appPrec+1) x++instance (Pretty a) => Pretty [a] where+  pPrintPrec l _ = pPrintList l++instance (Pretty a, Pretty b) => Pretty (a, b) where+  pPrintPrec l _ (a, b) =+    parens $ fsep $ punctuate comma [pPrint0 l a, pPrint0 l b]++instance (Pretty a, Pretty b, Pretty c) => Pretty (a, b, c) where+  pPrintPrec l _ (a, b, c) =+    parens $ fsep $ punctuate comma [pPrint0 l a, pPrint0 l b, pPrint0 l c]++instance (Pretty a, Pretty b, Pretty c, Pretty d) => Pretty (a, b, c, d) where+  pPrintPrec l _ (a, b, c, d) =+    parens $ fsep $ punctuate comma+      [pPrint0 l a, pPrint0 l b, pPrint0 l c, pPrint0 l d]++instance (Pretty a, Pretty b, Pretty c, Pretty d, Pretty e) => Pretty (a, b, c, d, e) where+  pPrintPrec l _ (a, b, c, d, e) =+    parens $ fsep $ punctuate comma+      [pPrint0 l a, pPrint0 l b, pPrint0 l c, pPrint0 l d, pPrint0 l e]++instance (Pretty a, Pretty b, Pretty c, Pretty d, Pretty e, Pretty f) => Pretty (a, b, c, d, e, f) where+  pPrintPrec l _ (a, b, c, d, e, f) =+    parens $ fsep $ punctuate comma+      [pPrint0 l a, pPrint0 l b, pPrint0 l c,+        pPrint0 l d, pPrint0 l e, pPrint0 l f]++instance (Pretty a, Pretty b, Pretty c, Pretty d, Pretty e, Pretty f, Pretty g) =>+         Pretty (a, b, c, d, e, f, g) where+  pPrintPrec l _ (a, b, c, d, e, f, g) =+    parens $ fsep $ punctuate comma+      [pPrint0 l a, pPrint0 l b, pPrint0 l c,+        pPrint0 l d, pPrint0 l e, pPrint0 l f, pPrint0 l g]++instance (Pretty a, Pretty b, Pretty c, Pretty d, Pretty e, Pretty f, Pretty g, Pretty h) =>+         Pretty (a, b, c, d, e, f, g, h) where+  pPrintPrec l _ (a, b, c, d, e, f, g, h) =+    parens $ fsep $ punctuate comma+      [pPrint0 l a, pPrint0 l b, pPrint0 l c,+        pPrint0 l d, pPrint0 l e, pPrint0 l f, pPrint0 l g, pPrint0 l h]
src/runtime/HsFFI.h view
@@ -1,30 +1,34 @@+#if !defined(_HSFFI_H)+#define _HSFFI_H+ #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;+typedef uint32_t      HsChar;+typedef	intptr_t      HsInt;+typedef int8_t        HsInt8;+typedef int16_t       HsInt16;+typedef int32_t       HsInt32;+typedef int64_t       HsInt64;+typedef uintptr_t     HsWord;+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         *HsStablePtr; -#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_CHAR_MIN     0+#define HS_CHAR_MAX     0x10ffff+#define HS_INT_MIN      INTPTR_MIN+#define HS_INT_MAX      INTPTR_MAX #define HS_INT8_MIN     INT8_MIN #define HS_INT8_MAX     INT8_MAX #define HS_INT16_MIN    INT16_MIN@@ -33,87 +37,41 @@ #define HS_INT32_MAX    INT32_MAX #define HS_INT64_MIN    INT64_MIN #define HS_INT64_MAX    INT64_MAX+#define HS_WORD_MAX     UINTPTR_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();-}+#define HS_FLOAT_RADIX        FLT_RADIX+#define HS_FLOAT_ROUND        FLT_ROUNDS+#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 xhs_free_stable_ptr(void *sp)-{-  /* XXX need to change representation of stablepointers */-}+/* API functions promised by the FFI spec */+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); -void hs_free_fun_ptr(HsFunPtr fp)-{-  ERR("hs_free_fun_ptr not implemented");-}+#endif  /* _HSFFI_H */
src/runtime/bfile.c view
@@ -212,7 +212,7 @@   } } -#if NEED_INT64+#if WANT_INT64 void putnegb64(int64_t n, BFILE *p) {@@ -233,7 +233,7 @@     putnegb64(-n, p);   } }-#endif  /* NEED_INT64 */+#endif  /* WANT_INT64 */  void putint32(value_t n, BFILE *p)@@ -1764,3 +1764,228 @@ }  #endif  /* WANT_BASE64 */+++#if WANT_LZMA++#define LZMA_IMPLEMENTATION+#define _7ZIP_ST+#include "lzma.h"+#undef MIN+#undef MAX++/* This transducer was written by Clause Code and debugged by Lennart. */++/***************** BFILE via LZMA compression ********************/+/*+ * Uses the single-header lzma.h library (Ciremun/lzma.h), which+ * wraps Igor Pavlov's LZMA SDK.+ *+ * To use, #define LZMA_IMPLEMENTATION before including lzma.h,+ * then compile with this file.+ *+ * Wire format (same envelope style as the lz77 transducer):+ *   "LZ2"          -- 3-byte magic / version tag+ *   uint32 olen    -- compressed length (little-endian, 4 bytes)+ *   <olen bytes>   -- lzma_compress output (includes the 13-byte+ *                     LZMA properties+size header)+ *+ * Both compressor and decompressor buffer the entire payload in+ * memory, matching the existing lz77 design in bfile.c.+ */++struct BFILE_lzma {+  BFILE          mets;+  BFILE         *bfile;    /* underlying BFILE */+  struct bfbuffer bf;+  int            read;     /* 1 = decompressor, 0 = compressor */+  int            numflush;+};++/* ---- shared getb / ungetb / putb / readb / writeb ---- */++int+getb_lzma(BFILE *bp)+{+  struct BFILE_lzma *p = (struct BFILE_lzma *)bp;+  CHECKBFILE(bp, getb_lzma);+  return bfbuffer_get(&p->bf);+}++void+ungetb_lzma(int c, BFILE *bp)+{+  struct BFILE_lzma *p = (struct BFILE_lzma *)bp;+  CHECKBFILE(bp, getb_lzma);+  p->bf.pos--;+}++void+putb_lzma(int b, BFILE *bp)+{+  struct BFILE_lzma *p = (struct BFILE_lzma *)bp;+  CHECKBFILE(bp, getb_lzma);+  bfbuffer_snoc(&p->bf, b);+}++size_t+readb_lzma(uint8_t *buf, size_t size, BFILE *bp)+{+  struct BFILE_lzma *p = (struct BFILE_lzma *)bp;+  CHECKBFILE(bp, getb_lzma);+  return bfbuffer_read(&p->bf, buf, size);+}++size_t+writeb_lzma(const uint8_t *str, size_t size, BFILE *bp)+{+  struct BFILE_lzma *p = (struct BFILE_lzma *)bp;+  CHECKBFILE(bp, getb_lzma);+  return bfbuffer_write(&p->bf, str, size);+}++/* ---- compressor flush / close ---- */++void+flushb_lzma(BFILE *bp)+{+  struct BFILE_lzma *p = (struct BFILE_lzma *)bp;+  CHECKBFILE(bp, getb_lzma);++  /* Nothing new since last flush — skip. */+  if (p->numflush++ && !p->bf.pos)+    return;++  /*+   * Worst-case LZMA output is slightly larger than input.+   * The lzma.h docs don't give an exact bound, but input_size + (input_size/3)+   * + LZMA_HEADER_SIZE is a safe over-estimate used by many wrappers.+   */+  size_t ilen  = p->bf.pos;+  size_t olen  = ilen + (ilen / 3) + LZMA_HEADER_SIZE + 128;+  uint8_t *obuf = MALLOC(olen);+  if (!obuf)+    memerr();++  if (lzma_compress(obuf, &olen, p->bf.buf, ilen) != 0)+    ERR("lzma_compress");+  /* Put the size in place */+  ilen = p->bf.pos;+  for (int i = 0; i < 8; i++) {+    obuf[LZMA_PROPS_SIZE + i] = ilen & 0xff;+    ilen >>= 8;+  }++  putsb("LZ2", p->bfile);        /* magic / version */+  putint32((value_t)olen, p->bfile); /* compressed length */+  for (size_t i = 0; i < olen; i++)+    putb(obuf[i], p->bfile);++  FREE(obuf);+  p->bf.pos = 0;+  flushb(p->bfile);+}++void+closeb_lzma(BFILE *bp)+{+  struct BFILE_lzma *p = (struct BFILE_lzma *)bp;+  CHECKBFILE(bp, getb_lzma);++  if (!p->read) {+    /* Write mode: compress whatever is buffered. */+    flushb_lzma(bp);+    bfbuffer_free(&p->bf);+  }+  closeb(p->bfile);+  FREE(p);+}++/* ---- public constructors ---- */++BFILE *+add_lzma_decompressor(BFILE *file)+{+  struct BFILE_lzma *p = MALLOC(sizeof(struct BFILE_lzma));+  if (!p)+    memerr();+  memset(p, 0, sizeof(struct BFILE_lzma));++  p->mets.getb   = getb_lzma;+  p->mets.ungetb = ungetb_lzma;+  p->mets.putb   = 0;+  p->mets.flushb = 0;+  p->mets.closeb = closeb_lzma;+  p->mets.readb  = readb_lzma;+  p->mets.writeb = 0;+  p->read        = 1;+  p->bfile       = file;+  p->numflush    = 0;++  /* Check the 3-byte magic tag. */+  if (getb(file) != 'L' || getb(file) != 'Z' || getb(file) != '2')+    ERR("Bad LZMA signature");++  /* Read the compressed payload length, then the payload itself. */+  size_t clen = (size_t)getint32(file);+  uint8_t *cbuf = MALLOC(clen);+  if (!cbuf)+    memerr();+  for (size_t i = 0; i < clen; i++)+    cbuf[i] = getb(file);++  /*+   * The LZMA header (bytes 5–12 of cbuf) encodes the uncompressed size.+   * Read it as a little-endian 64-bit value so we can pre-allocate the+   * output buffer without guessing.+   */+  if (clen < LZMA_HEADER_SIZE)+    ERR("LZMA payload too short");++  uint64_t ulen64 = 0;+  for (int i = 0; i < 8; i++)+    ulen64 |= (uint64_t)cbuf[LZMA_PROPS_SIZE + i] << (8 * i);++  size_t ulen = (size_t)ulen64;+  uint8_t *ubuf = MALLOC(ulen);+  if (!ubuf)+    memerr();++  size_t src_len = clen;+  if (lzma_uncompress(ubuf, &ulen, cbuf, &src_len) != 0)+    ERR("lzma_uncompress");++  FREE(cbuf);++  p->bf.buf  = ubuf;+  p->bf.size = ulen;+  p->bf.pos  = 0;++  return (BFILE *)p;+}++BFILE *+add_lzma_compressor(BFILE *file)+{+  struct BFILE_lzma *p = MALLOC(sizeof(struct BFILE_lzma));+  if (!p)+    memerr();+  memset(p, 0, sizeof(struct BFILE_lzma));++  p->mets.getb   = getb_lzma;+  p->mets.ungetb = 0;+  p->mets.putb   = putb_lzma;+  p->mets.flushb = flushb_lzma;+  p->mets.closeb = closeb_lzma;+  p->mets.readb  = 0;+  p->mets.writeb = writeb_lzma;+  p->read        = 0;+  p->bfile       = file;+  p->numflush    = 0;++  bfbuffer_init(&p->bf, 25000);  /* same initial size as lz77 */++  return (BFILE *)p;+}++#endif /* WANT_LZMA */
src/runtime/c64/config.h view
@@ -10,9 +10,16 @@  /*  * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Float type.+ */+#define WANT_FLOAT32 0++/*+ * 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_FLOAT 0+#define WANT_FLOAT64 0  /*  * Include <math.h>
src/runtime/esp32/config.h view
@@ -10,9 +10,16 @@  /*  * 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_FLOAT 1+#define WANT_FLOAT64 0  /*  * Include <math.h>
src/runtime/eval.c view
@@ -8,7281 +8,8033 @@ #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 }-};--int num_ffi = sizeof(ffi_table) / sizeof(ffi_table[0]);+#if !defined(WANT_OVERFLOW)+#define WANT_OVERFLOW 0+#endif /* defined(WANT_OVERFLOW) */++#if !defined(WANT_IO_POLL)+#define WANT_IO_POLL 0+#endif /* defined(WANT_IO_POLL) */++#if !defined(WANT_SOCKET)+#define WANT_SOCKET 0+#endif /* defined(WANT_SOCKET) */++#if WANT_STDIO+#include <stdio.h>+#include <locale.h>+#endif+#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"+#ifndef EM_ASM_PTR+#define EM_ASM_PTR(...) (void*)(uintptr_t)EM_ASM_INT(__VA_ARGS__)+#endif+#endif /* __EMSCRIPTEN__ */+#if WANT_DIR+#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_IO_POLL+#include <poll.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_LZMA)+#define WANT_LZMA 1+#endif++#if !defined(WANT_RLE)+#define WANT_RLE 1+#endif++#if !defined(WANT_BWT)+#define WANT_BWT 1+#endif++#if !defined(WANT_ENV)+#define WANT_ENV 1+#endif++#if !defined(WANT_ERRNO)+#define WANT_ERRNO 0+#else+#include "ffi_errno.c"+#endif++#if !defined(GET_EXECUTABLE_PATH)+char *get_executable_path(void) { return NULL; }+#endif++#if !defined(YIELD_EXTRA)+#define YIELD_EXTRA do {} while(0)+#endif++#if !defined(MKDIR)+#define MKDIR mkdir+#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++/* The register optimization is disabled for now since it breaks on some platforms. */+#if 0 && 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++/* If there are compiler intrinsics to detect over flow, do so */+#if __has_builtin(__builtin_add_overflow) && WANT_OVERFLOW+#define ADD_OVERFLOW(T, r, a, b) do { T vr; if (__builtin_add_overflow((T)(a), (T)(b), &(vr))) raise_rts(exn_overflow); (r) = vr; } while(0)+#endif+#if __has_builtin(__builtin_sub_overflow) && WANT_OVERFLOW+#define SUB_OVERFLOW(T, r, a, b) do { T vr; if (__builtin_sub_overflow((T)(a), (T)(b), &(vr))) raise_rts(exn_overflow); (r) = vr; } while(0)+#endif+#if __has_builtin(__builtin_mul_overflow) && WANT_OVERFLOW+#define MUL_OVERFLOW(T, r, a, b) do { T vr; if (__builtin_mul_overflow((T)(a), (T)(b), &(vr))) raise_rts(exn_overflow); (r) = vr; } while(0)+#endif++#endif++/* If we can't detect overflow, just ignore it. */+#if !defined(ADD_OVERFLOW)+#define ADD_OVERFLOW(T, r, a, b) ((r) = (a) + (b))+#endif+#if !defined(SUB_OVERFLOW)+#define SUB_OVERFLOW(T, r, a, b) ((r) = (a) - (b))+#endif+#if !defined(MUL_OVERFLOW)+#define MUL_OVERFLOW(T, r, a, b) ((r) = (a) * (b))+#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_ctzll)+#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 250000+#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_INT64, 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_L, T_KK, T_KA,+                T_T3, T_T4, T_T5, T_T6, T_T7, T_T8, T_T9, T_T10, T_T11, T_T12, T_T13, T_T14, T_T15, T_T16,+                T_TAG0, T_TAG1, T_TAG2, T_TAG3, T_TAG4, T_TAG5,  T_TAG6,  T_TAG7,  T_TAG8,  T_TAG9,+                T_TAG10, T_TAG11, T_TAG12, T_TAG13, T_TAG14, T_TAG15,  T_TAG16,  T_TAG17,  T_TAG18,  T_TAG19,+                T_TAG20, T_TAG21, T_TAG22, T_TAG23, T_TAG24, T_TAG25,  T_TAG26,  T_TAG27,  T_TAG28,  T_TAG29,+                T_TAG30, T_TAG31, T_TAG32,+                T_ADD, T_SUB, T_MUL, T_QUOT, T_REM, T_SUBR, T_NEG,+                T_UADD, T_USUB, T_UMUL, T_UQUOT, T_UREM, T_USUBR, T_UNEG,+                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_NEG64,+                T_UADD64, T_USUB64, T_UMUL64, T_UQUOT64, T_UREM64, T_USUBR64, T_UNEG64,+                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_FTOI, T_UTOF,+                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_DTOI, T_UTOD,+                T_DEQ, T_DNE, T_DLT, T_DLE, T_DGT, T_DGE,+                T_FTOD, T_DTOF,+                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_IO_LAZYBIND, T_IO_STRICT,+                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_BSGRABLEN,+                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_IO_WAITRDFD, T_IO_WAITWRFD,+                T_LAST_TAG,+};++/* 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]++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;+/*+ * Low bits encode the node type+ *  00 - T_AP  application+ *  01 - tag   upper bits are T_XXX+ *  10 - T_IND indirection+ *  11 - unused+ * Only the lower 2 bits are free on 32 bit platforms with 3 word nodes+ * (i.e. with WANT_DOUBLE or WANT_INT64).+ */+#define TAG_SHIFT 2+#define BIT_MASK  ((1 << TAG_SHIFT) - 1)+#define BIT_AP    0+#define BIT_TG    1+#define BIT_IN    2++static INLINE tag_t GETTAG(NODEPTR p)+{+  tag_t t = p->ufun.uutag;+  switch(t & BIT_MASK) {+  case BIT_AP: return T_AP;+  case BIT_IN: return T_IND;+  default:     return t >> TAG_SHIFT;+  }+}+static INLINE void SETTAG(NODEPTR p, tag_t t)+{+  switch(t) {+  case BIT_AP: break;           /* do nothing, bits are already 0 */+  case BIT_IN: p->ufun.uutag |= BIT_IN; break;+  default:     p->ufun.uutag = (t << TAG_SHIFT) | BIT_TG; break;+  }+}++#define NIL 0+#define HEAPREF(i) &cells[(i)]+// #define GETTAG(p) ( ? ( (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 ISINDIR(p) (GETTAG((p)) == T_IND)+#define WEAK(p) (p)->uarg.uuweak+//#define GETINDIR(p) ((struct node*) ((p)->ufun.uuifun & ~BIT_IND))+#define GETINDIR(p) ((struct node*) ((p)->ufun.uuifun & ~BIT_MASK))+#define SETINDIR(p,q) do { (p)->ufun.uuifun = (intptr_t)(q) | BIT_IN; } 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,+  ts_wait_io,   /* not visible to Haskell; must stay after 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 WANT_IO_POLL+  int             mt_fd;         /* The file descriptor that we are waiting on,+                                  * IO_POLL_WAITING_FOR_NONE, or IO_POLL_EVENT_HAS_HAPPENED */+#define             IO_POLL_WAITING_FOR_NONE (-1)+#define             IO_POLL_EVENT_HAS_HAPPENED (-2)+  int             mt_events;     /* POLLIN or POLLOUT */+#endif /* WANT_IO_POLL */+#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 }; /* runnable threads */+struct mqueue timeq = { 0, 0 }; /* waiting for a timer to expire, sorted in time order */+struct mqueue pollq = { 0, 0 }; /* waiting for I/O on a file descriptor */++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;         /* initial 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 >= sp_capacity || sp_table[sp] == NIL)+    ERR("deref_stableptr");+  return sp_table[sp];+}++static void+free_stableptr(uvalue_t sp)+{+  if (sp >= sp_capacity || sp_table[sp] == NIL)+    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, exn_overflow };++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, combA, combI, combCons, combPair;+NODEPTR combCC, combZ, combIOBIND, combIORETURN, combIOTHEN, combB, combC, combBB;+NODEPTR combKK, combKA;+NODEPTR combSETMASKINGSTATE;+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;+NODEPTR combFst, combSnd;+NODEPTR combFP2P;+NODEPTR spare_node;             /* an unused node in the heap, used in printrec */+#define combFalse combK+#define combTrue combA+#define combNothing combK+#define combUnit combI+#define combLT combK2+#define combEQ combKK+#define combGT combKA++/*******************************/++#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+check_pollq(int timeout)+{+#if WANT_IO_POLL+#define MAX_POLL_FDS 100+  struct pollfd fds[MAX_POLL_FDS];+  int nfds = 0;+  for(struct mthread *mt = pollq.mq_head; mt; mt = mt->mt_queue) {+    if (nfds >= MAX_POLL_FDS)+      ERR("check_pollq: too many FDs");+    fds[nfds].fd = mt->mt_fd;+    fds[nfds].events = mt->mt_events;+    nfds++;+  }+#if THREAD_DEBUG+  if (thread_trace)+    printf("check_pollq: enter poll(_, %d, %d)\n", nfds, timeout);+#endif  /* THREAD_DEBUG */+  int r = poll(fds, nfds, timeout);+  if (r < 0)+    return;                     /* silently ignore errors */+  nfds = 0;+  struct mthread *next;+  for(struct mthread *mt = pollq.mq_head; mt; mt = next) {+    next = mt->mt_queue;+    if (fds[nfds].revents & (mt->mt_events | POLLHUP)) {+      /* Some event has happened, move the thread back to the runq. */+      find_and_unlink(&pollq, mt); /* remove from I/O queue */+      add_runq_tail(mt);+#if THREAD_DEBUG+    if (thread_trace)+      printf("check_pollq: FD=%d thread=%d done\n", mt->mt_fd, (int)mt->mt_id);+#endif  /* THREAD_DEBUG */+      mt->mt_fd = IO_POLL_EVENT_HAS_HAPPENED;+    }+    nfds++;+  }+#if THREAD_DEBUG+  if (thread_trace) {+    printf("check_pollq: exit\n");+    dump_q("runq", runq);+  }+#endif  /* THREAD_DEBUG */+#endif  /* WANT_IO_POLL */+}++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++  YIELD_EXTRA;                  /* platform specific extra stuff */++  if (timeq.mq_head)+    check_timeq();+  check_thrown(false);+  check_sigint();++  if (pollq.mq_head) {+    /* Check if any threads blocked on IO can be scheduled. Since we pass in a delay of 0, checking+     * for the events will not block. */+    check_pollq(0);+  }++// 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 WANT_IO_POLL+  mt->mt_fd = IO_POLL_WAITING_FOR_NONE;+  mt->mt_events = 0;+#endif+#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 one thread waiting to put to the runq */+    struct mthread *mt;+    if((mt = remove_q_head(&mv->mv_takeput))) {+#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_read);+        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)+{+/*+ * We end up here if the run queue is empty. If there is no thread waiting for+ * a delay to expire, we will never resume operation and we are deadlocked. However, if+ * we compile with WANT_IO_POLL there might be threads waiting for IO events, so in+ * that case we check for them as well. If there is no thread waiting for a delay or an+ * IO event, we are deadlocked.+ */+#if WANT_IO_POLL+  /* Check for deadlock situation */+  if (!pollq.mq_head+#if defined(CLOCK_INIT)+     && !timeq.mq_head+#endif+    ) ERR("deadlock");++  /* Loop until at least one thread is runnable.*/+  while (!runq.mq_head) {+    int timeout_ms = -1; /* block indefinitely if only io_waiters */+#if defined(CLOCK_INIT)+    /* If there are threads blocked on delays, compute the timeout_ms to account for that. */+    if (timeq.mq_head) {+      CLOCK_T dly = timeq.mq_head->mt_at - CLOCK_GET();+      if (dly > 0) {+        /* poll() can be unreliable, so sleep shorter than the delay */+        dly /= 1100;            /* 1.1=sleep shorter, 1000=convert us to ms */+        timeout_ms = dly == 0 ? 1 : dly; /* sleep at least 1ms to avoid busy wait */+      } else {+        timeout_ms = 0;         /* delay has already expired */+      }+    }+    check_timeq();+#endif  /* defined(CLOCK_INIT) */+    check_pollq(timeout_ms);+    check_sigint();		/* if there is a SIGINT, this will put a thread on the runq */+  }++#else /* !WANT_IO_POLL */++#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 */+#endif /* !WANT_IO_POLL */+}++/* 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+    mt->mt_mval = NIL;          /* no longer waiting on the mvar */+    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_wait_io:+#if THREAD_DEBUG+    if (thread_trace) {+      printf("thread_intr: ts_wait_io 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(&pollq, mt))+      ERR("thread_intr: pollq");+    /* 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);+  }+}++/* Raise a RTS exception identified by a number rather than an exception value */+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 },+  { "L", T_L },+  { "KK", T_KK },+  { "KA", T_KA },+  { "T3", T_T3 },+  { "T4", T_T4 },+  { "T5", T_T5 },+  { "T6", T_T6 },+  { "T7", T_T7 },+  { "T8", T_T8 },+  { "T9", T_T9 },+  { "T10", T_T10 },+  { "T11", T_T11 },+  { "T12", T_T12 },+  { "T13", T_T13 },+  { "T14", T_T14 },+  { "T15", T_T15 },+  { "T16", T_T16 },+  { "TAG0", T_TAG0 },+  { "TAG1", T_TAG1 },+  { "TAG2", T_TAG2 },+  { "TAG3", T_TAG3 },+  { "TAG4", T_TAG4 },+  { "TAG5", T_TAG5 },+  { "TAG6", T_TAG6 },+  { "TAG7", T_TAG7 },+  { "TAG8", T_TAG8 },+  { "TAG9", T_TAG9 },+  { "TAG10", T_TAG10 },+  { "TAG11", T_TAG11 },+  { "TAG12", T_TAG12 },+  { "TAG13", T_TAG13 },+  { "TAG14", T_TAG14 },+  { "TAG15", T_TAG15 },+  { "TAG16", T_TAG16 },+  { "TAG17", T_TAG17 },+  { "TAG18", T_TAG18 },+  { "TAG19", T_TAG19 },+  { "TAG20", T_TAG20 },+  { "TAG21", T_TAG21 },+  { "TAG22", T_TAG22 },+  { "TAG23", T_TAG23 },+  { "TAG24", T_TAG24 },+  { "TAG25", T_TAG25 },+  { "TAG26", T_TAG26 },+  { "TAG27", T_TAG27 },+  { "TAG28", T_TAG28 },+  { "TAG29", T_TAG29 },+  { "TAG30", T_TAG30 },+  { "TAG31", T_TAG31 },+  { "TAG32", T_TAG32 },+/* primops */+  { "+", T_ADD, T_ADD },+  { "-", T_SUB, T_SUBR },+  { "*", T_MUL, T_MUL },+  { "quot", T_QUOT },+  { "rem", T_REM },+  { "u+", T_UADD, T_UADD },+  { "u-", T_USUB, T_USUBR },+  { "u*", T_UMUL, T_UMUL },+  { "uquot", T_UQUOT },+  { "urem", T_UREM },+  { "subtract", T_SUBR, T_SUB },+  { "usubtract", T_USUBR, T_USUB },+  { "neg", T_NEG },+  { "uneg", T_UNEG },+  { "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},+  { "utod", T_UTOD},+  { "dtoi", T_DTOI},+  { "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_FLOAT64 && WANT_FLOAT32+  { "dtof", T_DTOF },+  { "ftod", T_FTOD },+#endif  /* WANT_FLOAT64 && WANT_FLOAT32 */+#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},+  { "utof", T_UTOF},+  { "ftoi", T_FTOI},+  { "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 },+  { "IO.lazyBind", T_IO_LAZYBIND },+  { "IO.strict", T_IO_STRICT },+  { "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 },+  { "bsgrablen", T_BSGRABLEN },+  { "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 },+  { "IO.waitrdfd", T_IO_WAITRDFD},+  { "IO.waitwrfd", T_IO_WAITWRFD},+#if WANT_INT64+  { "I+", T_ADD64, T_ADD64 },+  { "I-", T_SUB64, T_SUBR64 },+  { "I*", T_MUL64, T_MUL64 },+  { "Iquot", T_QUOT64 },+  { "Irem", T_REM64 },+  { "Iu+", T_UADD64, T_UADD64 },+  { "Iu-", T_USUB64, T_USUBR64 },+  { "Iu*", T_UMUL64, T_UMUL64 },+  { "Iuquot", T_UQUOT64 },+  { "Iurem", T_UREM64 },+  { "Isubtract", T_SUBR64, T_SUB64 },+  { "Iusubtract", T_USUBR64, T_USUB64 },+  { "Ineg", T_NEG64 },+  { "Iuneg", T_UNEG64 },+  { "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  /* WANT_INT64 */+  { "tick", T_TICK },           /* fake op */+};++#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_KK: combKK = n; break;+    case T_KA: combKA = 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;+    case T_FP2P: combFP2P = 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)+  {+    /* 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);+  NEWAP(combFst, combU, combK);+  NEWAP(combSnd, combU, combA);+#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+  spare_node = HEAPREF(heap_start++);++  /* 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;		/* thread ID for mt */+  NODEPTR root = new_ap(new_ap(new_ap(combTHROWTO, thid), exn), combWorld); /* root = throwTo thid exn */+  (void)new_thread(root);       /* spawn and put on runq, i.e., forkIO root */+}++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_queue)+    mark_thread(mt);+  for (struct mthread *mt = mv->mv_read.mq_head; mt; mt = mt->mt_queue)+    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++ > 1000000000) {+        //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;+}++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;+}++#if WANT_INT64+static INLINE+uint64_t+peek_uint64(uint64_t *p)+{+  return *p;+}++static INLINE+void+poke_uint64(uint64_t *p, uint64_t w)+{+  *p = w;+}+#endif  /* WANT_INT64 */++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;+}++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;+}++#if WANT_INT64+static INLINE+int64_t+peek_int64(int64_t *p)+{+  return *p;+}++static INLINE+void+poke_int64(int64_t *p, int64_t w)+{+  *p = w;+}+#endif  /* WANT_INT64 */++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 WANT_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  /* WANT_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 < 0)+      ERR("parse string EOF");+    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 (gobble(f, '#')) {+#if WANT_INT64+        r = mkInt64(parse_int64(f));+#else+        ERR("no Int64");+#endif /* WANT_INT64 */+      } else {+        r = mkInt(parse_int(f));+      }+      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 WANT_INT64+  case T_INT64: putb('#', f); putb('#', f); putdecb64(GETINT64VALUE(n), f); break;+#endif  /* WANT_INT64 */+#if WANT_FLOAT64+case T_DBL: putb('&', f); putdblb(GETDBLVALUE(n), f); break;+#endif+#if WANT_FLOAT32+  case T_FLT32: putb('&', f); putb('&', f); putdblb((double)GETFLTVALUE(n), f); break;+#endif+  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(PTR(n) == NULL) {+      if (prefix) {+        putsb("(toPtr #0)", f);+      } else {+        putsb("toPtr #0 @", f);+      }+    } else+#if WANT_STDIO+    /* The pointer can be a forptr comb_std* that has been dereferenced */+    if (PTR(n) == FORPTR(comb_stdin)->payload.string) {+      SETTAG(spare_node, T_AP);+      FUN(spare_node) = combFP2P;+      ARG(spare_node) = comb_stdin;+      printrec(f, pb, spare_node, prefix);+    } else if (PTR(n) == FORPTR(comb_stdout)->payload.string) {+      SETTAG(spare_node, T_AP);+      FUN(spare_node) = combFP2P;+      ARG(spare_node) = comb_stdout;+      printrec(f, pb, spare_node, prefix);+    } else if (PTR(n) == FORPTR(comb_stderr)->payload.string) {+      SETTAG(spare_node, T_AP);+      FUN(spare_node) = combFP2P;+      ARG(spare_node) = comb_stderr;+      printrec(f, pb, spare_node, prefix);+    } else+#endif  /* WANT_STDIO */+    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");+    }+    break;+  case T_FORPTR:+#if WANT_STDIO+    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);+    else+#endif  /* WANT_STDIO */+#if WANT_GMP+    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);+    } else+#endif  /* WANT_GMP */+    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;+#if WANT_TICK+  case T_TICK:+    putb('!', f);+    print_string(f, tick_table[GETVALUE(n)].tick_name);+    break;+#endif+  default:+    if (0 <= tag && tag <= T_LAST_TAG) {+      if (tag_names[tag]) {+        putsb(tag_names[tag], f);+      } else {+        ERR1("TAG %d", tag);+      }+    } else {+      ERR1("TAG %d", tag);+    }+    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 WANT_INT64+NODEPTR+mkInt64(int64_t i)+{+  NODEPTR n;+  n = alloc_node(T_INT64);+  SETINT64VALUE(n, i);+  return n;+}+#endif  /* WANT_INT64 */++#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;+  bs.size = NOSIZE;+  bs.string = 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;+  bs.size = strlen(str);+  bs.string = 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_INT64+/* Evaluate to an INT */+static INLINE uint64_t+evalint64(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_INT64) {+    ERR1("evalint64, bad tag %s", TAGNAME(GETTAG(n)));+  }+#endif+  return GETINT64VALUE(n);+}+#endif  /* WANT_INT64 */++#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.+ */+int+bscompare(struct bytestring bsp, struct bytestring bsq)+{+  size_t len = bsp.size < bsq.size ? bsp.size : bsq.size;+  if (len) {+    int r = memcmp(bsp.string, bsq.string, len);+    if (r < 0)+      return -1;+    if (r > 0)+      return 1;+  }+  /* 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;+#if 0+  heapoffs_t l;+#endif+  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)+#define GOBOOL(b) do { if (b) goto lbltrue; else goto lblfalse; } 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();+#if 0+  /* This increases the cycle count */+  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+#endif+    {+    tag_t ut;+    /* first follow AP nodes down the spine */+    for(;;) {+      ut = n->ufun.uutag;+      if ((ut & BIT_MASK) != BIT_AP)+        break;+      PUSH(n);+      n = (NODEPTR)ut;+    }+    /* Skip idirections */+    if ((ut & BIT_MASK) == BIT_IN) {+      /* Follow and short-circuit the chain. */+      NODEPTR on = n;+      do {+        n = GETINDIR(n);+      } while(ISINDIR(n));+      SETINDIR(on, n);          /* and short-circuit them */+      tag = GETTAG(n);+    } else {+      /* The tag is the rest of the bits we fetched */+      tag = ut >> TAG_SHIFT;+    }+  }+  /* Invariant: at this point n=current node, 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;+  case T_INT64:  RET;+  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) */+  lblfalse:+    n = combFalse;+  case T_K:                CHKARG2; GOIND(x);                                             /* K x y = *x */+  lbltrue:+    n = combTrue;+  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 */+  case T_L:                CHKARG3; GOAP(y, x);                                           /* L x y z = y x */+  case T_KK:               CHKARG3; GOIND(y);                                             /* KK x y z = y */+  case T_KA:               CHKARG3; GOIND(z);                                             /* KA x y z = z */+  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) */++  case T_TAG0:+  case T_TAG1:+  case T_TAG2:+  case T_TAG3:+  case T_TAG4:+  case T_TAG5:+  case T_TAG6:+  case T_TAG7:+  case T_TAG8:+  case T_TAG9:+  case T_TAG10:+  case T_TAG11:+  case T_TAG12:+  case T_TAG13:+  case T_TAG14:+  case T_TAG15:+  case T_TAG16:+  case T_TAG17:+  case T_TAG18:+  case T_TAG19:+  case T_TAG20:+  case T_TAG21:+  case T_TAG22:+  case T_TAG23:+  case T_TAG24:+  case T_TAG25:+  case T_TAG26:+  case T_TAG27:+  case T_TAG28:+  case T_TAG29:+  case T_TAG30:+  case T_TAG31:+  case T_TAG32:+               GCCHECK(2); CHKARG2; GOAP2(y, mkInt(tag - T_TAG0), x);                     /* TAGN x y = y (INT N) x */++  case T_T3:   GCCHECK(2); CHECK(4); POP(4); n = TOP(-1); x = ARG(n);+               GOAP2(new_ap(x, ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));                /* T3 x1 x2 x3 f = x x1 x2 x3 */+  case T_T4:   GCCHECK(3); CHECK(5); POP(5); n = TOP(-1); x = ARG(n);+               GOAP2(new_ap(new_ap(x, ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));  /* T4 x1 x2 x3 x4 f = x x1 x2 x3 x4 */+  case T_T5:   GCCHECK(4); CHECK(6); POP(6); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(x, ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T6:   GCCHECK(5); CHECK(7); POP(7); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T7:   GCCHECK(6); CHECK(8); POP(8); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T8:   GCCHECK(7); CHECK(9); POP(9); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-9))), ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T9:   GCCHECK(8); CHECK(10); POP(10); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-10))), ARG(TOP(-9))), ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T10:   GCCHECK(9); CHECK(11); POP(11); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-11))), ARG(TOP(-10))), ARG(TOP(-9))), ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T11:   GCCHECK(10); CHECK(12); POP(12); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-12))), ARG(TOP(-11))), ARG(TOP(-10))), ARG(TOP(-9))), ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T12:   GCCHECK(11); CHECK(13); POP(13); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-13))), ARG(TOP(-12))), ARG(TOP(-11))), ARG(TOP(-10))), ARG(TOP(-9))), ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T13:   GCCHECK(12); CHECK(14); POP(14); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-14))), ARG(TOP(-13))), ARG(TOP(-12))), ARG(TOP(-11))), ARG(TOP(-10))), ARG(TOP(-9))), ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T14:   GCCHECK(13); CHECK(15); POP(15); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-15))), ARG(TOP(-14))), ARG(TOP(-13))), ARG(TOP(-12))), ARG(TOP(-11))), ARG(TOP(-10))), ARG(TOP(-9))), ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T15:   GCCHECK(14); CHECK(16); POP(16); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-16))), ARG(TOP(-15))), ARG(TOP(-14))), ARG(TOP(-13))), ARG(TOP(-12))), ARG(TOP(-11))), ARG(TOP(-10))), ARG(TOP(-9))), ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));+  case T_T16:   GCCHECK(15); CHECK(17); POP(17); n = TOP(-1); x = ARG(n);+    GOAP2(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(new_ap(x, ARG(TOP(-17))), ARG(TOP(-16))), ARG(TOP(-15))), ARG(TOP(-14))), ARG(TOP(-13))), ARG(TOP(-12))), ARG(TOP(-11))), ARG(TOP(-10))), ARG(TOP(-9))), ARG(TOP(-8))), ARG(TOP(-7))), ARG(TOP(-6))), ARG(TOP(-5))), ARG(TOP(-4))), ARG(TOP(-3)), ARG(TOP(-2)));++    /*+     * 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_UADD:+  case T_USUB:+  case T_UMUL:+  case T_UQUOT:+  case T_UREM:+  case T_USUBR:+  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_UNEG:+  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+    CHECK(1);+    flt32_t rf = (flt32_t)evalint64(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETFLT(n, rf);+    RET;+#else+    ERR("No Int64");+#endif+    }++  case T_ITOF:+    {+    CHECK(1);+    flt32_t rf = (flt32_t)evalint(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETFLT(n, rf);+    RET;+    }++  case T_UTOF:+    {+    CHECK(1);+    flt32_t rf = (flt32_t)(uvalue_t)evalint(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETFLT(n, rf);+    RET;+    }++  case T_FTOI:+    {+    CHECK(1);+    value_t i = (value_t)evalflt(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETINT(n, i);+    RET;+    }++#endif  /* WANT_FLOAT32 */++#if WANT_FLOAT64 && WANT_FLOAT32+  case T_DTOF:+    {+    float xf = (float)evaldbl(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETFLT(n, xf);+    RET;+    }+  case T_FTOD:+    {+    double xd = (double)evalflt(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETDBL(n, xd);+    RET;+    }+#endif  /* WANT_FLOAT64 && 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+  case T_I64TOD:+    {+    CHECK(1);+    flt64_t rd = (flt64_t)evalint64(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETDBL(n, rd);+    RET;+    }+#endif++  case T_ITOD:+    {+    CHECK(1);+    flt64_t rd = (flt64_t)evalint(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETDBL(n, rd);+    RET;+    }++  case T_UTOD:+    {+    CHECK(1);+    flt64_t rd = (flt64_t)(uvalue_t)evalint(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETDBL(n, rd);+    RET;+    }++  case T_DTOI:+    {+    CHECK(1);+    value_t i = (value_t)evaldbl(ARG(TOP(0)));+    POP(1);+    n = TOP(-1);+    SETINT(n, i);+    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 WANT_INT64+  case T_ADD64:+  case T_SUB64:+  case T_MUL64:+  case T_QUOT64:+  case T_REM64:+  case T_SUBR64:+  case T_UADD64:+  case T_USUB64:+  case T_UMUL64:+  case T_UQUOT64:+  case T_UREM64:+  case T_USUBR64:+  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);+    /*+    fprintf(stderr, "bin64 op=%s\n", TAGNAME(tag)); fflush(stderr);+    { NODEPTR x = evali(ARG(TOP(1)));+      fprintf(stderr, "x.tag=%s x.val=%lld\n", TAGNAME(GETTAG(x)), GETINT64VALUE(x)); fflush(stderr);+      NODEPTR y = evali(ARG(TOP(0)));+      fprintf(stderr, "y.tag=%s y.val=%ld\n", TAGNAME(GETTAG(y)), GETVALUE(y)); fflush(stderr);+    }+    */+    n = ARG(TOP(1));+    if (GETTAG(n) == T_INT64) {+      //fprintf(stderr, "push combBININT64_1\n"); fflush(stderr);+      n = ARG(TOP(0));+      PUSH(combBININT64_1);+      if (GETTAG(n) == T_INT64) {+        //fprintf(stderr, "goto binint64_1\n"); fflush(stderr);+        goto binint64_1;+      }+    } else {+      //fprintf(stderr, "push combBININT64_2\n"); fflush(stderr);+      PUSH(combBININT64_2);+    }+    goto top;+  case T_NEG64:+  case T_UNEG64:+  case T_INV64:+  case T_POPCOUNT64:+  case T_CLZ64:+  case T_CTZ64:+    CHECK(1);+    n = ARG(TOP(0));+    PUSH(combUNINT64_1);+    goto top;+#endif  /* WANT_INT64 */+++    /* Convert between different types. */+#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); /* raw double -> int64_t */+  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  /* WANT_INT64 */+#if WANT_FLOAT32+  case T_TOFLT:    CONV(T_FLT32,  SETINT32VALUE, GETINT32VALUE);+  case T_FROMFLT:  CONV(T_INT,    SETVALUE,      GETINT32VALUE);+#endif  /* WANT_FLOAT32 */+  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);+      GOBOOL(arr == ARR(y));+    }++  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));+  case T_IO_LAZYBIND:+    /* Lazy bind, used for the lazy ST monad.+     * DO NOT USE FOR IO, because effects are not guaranteed to happen.+     *   (x `lazyBind` y) z = let w = x z in y (fst w) (snd w)+     */+    GCCHECK(4);+    CHKARG3;+    w = new_ap(x, z);+    GOAP2(y, new_ap(combFst, w), new_ap(combSnd, w));+  case T_IO_STRICT:+    CHKARG2;+    /* Force the world argument before executing the IO.+     * IO.strict io World = seq World (io World)+     */+    (void)evali(y);             /* evaluate the world */+    GOAP(x, y);                 /* and run IO computation */+#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);+      struct bytestring bs;+      bs.size = strlen(cstr);+      bs.string = mmalloc(bs.size);;+      memcpy(bs.string, cstr, bs.size);+      NODEPTR res = mkStrNode(bs);+      GCCHECKSAVE(res, 1);+      POP(2);+      GOPAIR(res);+      }+    }+  case T_PACKCSTRINGLEN:+    {+      CHKARG3NP;                /* sets x,y,z,n */+      {+      char *cstr = evalptr(x);+      struct bytestring bs;+      bs.size = evalint(y);+      bs.string = mmalloc(bs.size);+      memcpy(bs.string, cstr, bs.size);+      NODEPTR res = mkStrNode(bs);+      POP(3);+      GCCHECKSAVE(res, 1);+      GOPAIR(res);+      }+    }+  case T_BSGRAB:+    {+      CHKARG2NP;                  /* sets x, y, n */+      {+      struct bytestring bs;+      bs.string = evalptr(x);+      bs.size = strlen(bs.string);+      NODEPTR res = mkStrNode(bs);+      GCCHECKSAVE(res, 1);+      POP(2);+      GOPAIR(res);+      }+    }+  case T_BSGRABLEN:+    {+      CHKARG3NP;                  /* sets x, y, z, n */+      {+      struct bytestring bs;+      bs.string = evalptr(x);+      bs.size = evalint(y);+      NODEPTR res = mkStrNode(bs);+      GCCHECKSAVE(res, 1);+      POP(3);+      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_WAITRDFD:+  case T_IO_WAITWRFD: {+#if WANT_IO_POLL+    CHKARG2NP; /* x = filedescriptor, y = RealWorld; no pop yet */++    /*+     * When the thread wakes up again it will re-execute that last op.+     * check_pollq() sets mt_fd=IO_POLL_EVENT_HAS_HAPPENED when waking the thread.+     * If we did not do this check we would just sleep again.+     */+    if (runq.mq_head->mt_fd == IO_POLL_EVENT_HAS_HAPPENED) {+      runq.mq_head->mt_fd = IO_POLL_WAITING_FOR_NONE;+      POP(2);+      GOPAIR(mkInt(0));+    }++    check_thrown(true);      /* check if we have a thrown exception */++    int fd = evalint(x);+    int events = tag == T_IO_WAITRDFD ? POLLIN : POLLOUT;++    /* Set up the waiting thread's state, preparing it to leave the run queue+     * until an event is ready for it.+     */+    struct mthread *mt = remove_q_head(&runq);+    mt->mt_fd     = fd;+    mt->mt_events = events;+    add_q_tail(&pollq, mt);     /* put it on the q of I/O waiters */+#if THREAD_DEBUG+      if (thread_trace) {+        printf("T_IO_WAITxxFD: wait for FD=%d, events=%x, thread=%d\n", fd, events, (int)mt->mt_id);+      }+#endif  /* THREAD_DEBUG */++    POP(2);+    resched(mt, ts_wait_io);    /* set the thread state and reschedule */+#else /* WANT_IO_POLL */+    CHKARG2;+#if WANT_ERRNO+    errno = EINVAL;+#endif+    GOPAIR(mkInt(-1));          /* cannot poll */+#endif /* WANT_IO_POLL */+  }+  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;+    // fprintf(stderr, "tick=%s\n", (char*)tick_table[xi].tick_name.string); fflush(stderr);+    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 WANT_INT64+    uint64_t x64u, y64u, r64u;+#endif  /* WANT_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:+/* if we don't need Int64 implementation, just make Int and Int64 the same */+      switch (GETTAG(p)) {+      case T_IND:   p = GETINDIR(p); goto binint;+      case T_ADD:   ADD_OVERFLOW(value_t, ru, xu, yu); break;+      case T_SUB:   SUB_OVERFLOW(value_t, ru, xu, yu); break;+      case T_MUL:   MUL_OVERFLOW(value_t, ru, xu, yu); break;+      case T_SUBR:  SUB_OVERFLOW(value_t, ru, yu, xu); break;+      case T_QUOT:  if (yu == 0)+                      raise_rts(exn_dividebyzero);+                    else if ((value_t)xu == VALUE_MIN && (value_t)yu == -1)+                      raise_rts(exn_overflow);+                    else+                      ru = (uvalue_t)((value_t)xu / (value_t)yu);+                    break;+      case T_REM:   if (yu == 0)+                      raise_rts(exn_dividebyzero);+                    else        /* this should not overflow under any circumstances */+                      ru = (uvalue_t)((value_t)xu % (value_t)yu);+                    break;+      case T_UADD:  ru = xu + yu; break;+      case T_USUB:  ru = xu - yu; break;+      case T_UMUL:  ru = xu * yu; break;+      case T_USUBR: ru = yu - xu; 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:    GOBOOL(xu == yu);+      case T_NE:    GOBOOL(xu != yu);+      case T_ULT:   GOBOOL(xu <  yu);+      case T_ULE:   GOBOOL(xu <= yu);+      case T_UGT:   GOBOOL(xu >  yu);+      case T_UGE:   GOBOOL(xu >= yu);+      case T_UCMP:  GOIND(xu <  yu ? combLT   : xu > yu ? combGT : combEQ);+      case T_LT:    GOBOOL((value_t)xu <  (value_t)yu);+      case T_LE:    GOBOOL((value_t)xu <= (value_t)yu);+      case T_GT:    GOBOOL((value_t)xu >  (value_t)yu);+      case T_GE:    GOBOOL((value_t)xu >= (value_t)yu);+      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:      if ((value_t)xu == VALUE_MIN) raise_rts(exn_overflow); ru = -xu; break;+      case T_UNEG:     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_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) {+        //fprintf(stderr, "tag=%s\n", TAGNAME(GETTAG(n))); fflush(stderr);+        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: ADD_OVERFLOW(int64_t, r64u, x64u, y64u); break;+      case T_SUB64: SUB_OVERFLOW(int64_t, r64u, x64u, y64u); break;+      case T_MUL64: MUL_OVERFLOW(int64_t, r64u, x64u, y64u); break;+      case T_SUBR64:SUB_OVERFLOW(int64_t, r64u, y64u, x64u); break;+      case T_QUOT64:if (y64u == 0)+                      raise_rts(exn_dividebyzero);+                    else if ((int64_t)x64u == INT64_MIN && (int64_t)y64u == -1)+                      raise_rts(exn_overflow);+                    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_UADD64:r64u = x64u + y64u; break;+      case T_USUB64:r64u = x64u - y64u; break;+      case T_UMUL64:r64u = x64u * y64u; break;+      case T_USUBR64:r64u = y64u - x64u; 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:  GOBOOL(x64u == y64u);+      case T_NE64:  GOBOOL(x64u != y64u);+      case T_ULT64: GOBOOL(x64u <  y64u);+      case T_ULE64: GOBOOL(x64u <= y64u);+      case T_UGT64: GOBOOL(x64u >  y64u);+      case T_UGE64: GOBOOL(x64u >= y64u);+      case T_UCMP64:GOIND(x64u <  y64u ? combLT   : x64u > y64u ? combGT : combEQ);+      case T_LT64:  GOBOOL((int64_t)x64u <  (int64_t)y64u);+      case T_LE64:  GOBOOL((int64_t)x64u <= (int64_t)y64u);+      case T_GT64:  GOBOOL((int64_t)x64u >  (int64_t)y64u);+      case T_GE64:  GOBOOL((int64_t)x64u >= (int64_t)y64u);+      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:      if ((int64_t)x64u == INT64_MIN) raise_rts(exn_overflow); r64u = -x64u; break;+      case T_UNEG64:     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  /* WANT_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:   GOBOOL(xf == yf);+      case T_FNE:   GOBOOL(xf != yf);+      case T_FLT:   GOBOOL(xf <  yf);+      case T_FLE:   GOBOOL(xf <= yf);+      case T_FGT:   GOBOOL(xf >  yf);+      case T_FGE:   GOBOOL(xf >= yf);++      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:   GOBOOL(xd == yd);+      case T_DNE:   GOBOOL(xd != yd);+      case T_DLT:   GOBOOL(xd <  yd);+      case T_DLE:   GOBOOL(xd <= yd);+      case T_DGT:   GOBOOL(xd >  yd);+      case T_DGE:   GOBOOL(xd >= yd);++      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:   GOBOOL(bscompare(xbs, ybs) == 0);+      case T_BSNE:   GOBOOL(bscompare(xbs, ybs) != 0);+      case T_BSLT:   GOBOOL(bscompare(xbs, ybs) <  0);+      case T_BSLE:   GOBOOL(bscompare(xbs, ybs) <= 0);+      case T_BSGT:   GOBOOL(bscompare(xbs, ybs) >  0);+      case T_BSGE:   GOBOOL(bscompare(xbs, ybs) >= 0);+      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;+    case 7: msg = "arithmetic overflow"; 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++#if WANT_ARGS+  #if WANT_STDIO+  #define MHS_INIT_ARGS(a,b,c,d) mhs_init_args(a,b,c,d)+  #else+  #define MHS_INIT_ARGS(a,b,c,d) mhs_init_args(a,b)+  #endif+#else  /* WANT_ARGS */+  #if WANT_STDIO+  #define MHS_INIT_ARGS(a,b,c,d) mhs_init_args(c,d)+  #else+  #define MHS_INIT_ARGS(a,b,c,d) mhs_init_args()+  #endif+#endif  /* WANT_ARGS */++NODEPTR+MHS_INIT_ARGS(+              int argc, char **argv,+              char **outnamep,+              size_t *file_sizep+)+{+  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 & WANT_ARGS+      /* 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 decompressor transducer */+      bf = add_lzma_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);+#if WANT_INT64+MHS_FROM(mhs_from_Int64, SETINT64, int64_t);+#endif+MHS_FROM(mhs_from_Word, SETINT, uvalue_t);+MHS_FROM(mhs_from_Word8, SETINT, uvalue_t);+#if WANT_INT64+MHS_FROM(mhs_from_Word64, SETINT64, uint64_t);+#endif+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);+#if WANT_INT64+MHS_TO(mhs_to_Int64, evalint64, int64_t);+#endif+MHS_TO(mhs_to_Word, evalint, uvalue_t);+MHS_TO(mhs_to_Word8, evalint, uint8_t);+#if WANT_INT64+MHS_TO(mhs_to_Word64, evalint64, uint64_t);+#endif+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_remove(int s) { return mhs_from_Int(s, 1, remove(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_LZMA+from_t mhs_add_lzma_compressor(int s) { return mhs_from_Ptr(s, 1, add_lzma_compressor(mhs_to_Ptr(s, 0))); }+from_t mhs_add_lzma_decompressor(int s) { return mhs_from_Ptr(s, 1, add_lzma_decompressor(mhs_to_Ptr(s, 0))); }+#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_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); }+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); }+#if WANT_INT64+from_t mhs_peek_uint64(int s) { return mhs_from_Word64(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_Word64(s, 1)); return mhs_from_Unit(s, 2); }+#endif  /* WANT_INT64 */++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); }+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); }+#if WANT_INT64+from_t mhs_peek_int64(int s) { return mhs_from_Int64(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_Int64(s, 1)); return mhs_from_Unit(s, 2); }+#endif  /* WANT_INT64 */+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))); }+from_t mhs_get_permissions(int s) { return mhs_from_Int(s, 1, get_permissions(mhs_to_Ptr(s, 0))); }+from_t mhs_set_permissions(int s) { return mhs_from_Int(s, 2, set_permissions(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); }+#if WANT_ENV+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_unsetenv(int s) { return mhs_from_Int(s, 1, unsetenv(mhs_to_Ptr(s, 0))); }+from_t mhs_setenv(int s) { return mhs_from_Int(s, 3, setenv(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2))); }+#endif  /* WANT_ENV */++/* 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 WANT_INT64 && WORD_SIZE < 64+/* GMP lacks 64 bit support on 32 bit platforms */+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);+}+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);+  }+}+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  /* WANT_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_+#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+from_t mhs_get_executable_path(int s) { return mhs_from_Ptr(s, 0, get_executable_path()); }++#if WANT_SOCKET+#include <sys/socket.h>+from_t mhs_F_SETFL(int s) { return mhs_from_Int(s, 0, F_SETFL); }+from_t mhs_O_NONBLOCK(int s) { return mhs_from_Int(s, 0, O_NONBLOCK); }+from_t mhs_SOL_SOCKET(int s) { return mhs_from_Int(s, 0, SOL_SOCKET); }+from_t mhs_SO_DEBUG(int s) { return mhs_from_Int(s, 0, SO_DEBUG); }+from_t mhs_SO_ERROR(int s) { return mhs_from_Int(s, 0, SO_ERROR); }+from_t mhs_SO_REUSEADDR(int s) { return mhs_from_Int(s, 0, SO_REUSEADDR); }+from_t mhs_SO_TYPE(int s) { return mhs_from_Int(s, 0, SO_TYPE); }+from_t mhs_accept(int s) { return mhs_from_Int(s, 3, accept(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2))); }+from_t mhs_bind(int s) { return mhs_from_Int(s, 3, bind(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2))); }+from_t mhs_close(int s) { return mhs_from_Int(s, 1, close(mhs_to_Int(s, 0))); }+from_t mhs_connect(int s) { return mhs_from_Int(s, 3, connect(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1), mhs_to_Int(s, 2))); }+from_t mhs_fcntl(int s) { return mhs_from_Int(s, 3, fcntl(mhs_to_Int(s, 0), mhs_to_Int(s, 1), mhs_to_Int(s, 2))); }+from_t mhs_getsockopt(int s) { return mhs_from_Int(s, 5, getsockopt(mhs_to_Int(s, 0), mhs_to_Int(s, 1), mhs_to_Int(s, 2), mhs_to_Ptr(s, 3), mhs_to_Ptr(s, 4))); }+from_t mhs_listen(int s) { return mhs_from_Int(s, 2, listen(mhs_to_Int(s, 0), mhs_to_Int(s, 1))); }+from_t mhs_recv(int s) { return mhs_from_Int(s, 4, recv(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1), mhs_to_Word(s, 2), mhs_to_Int(s, 3))); }+from_t mhs_send(int s) { return mhs_from_Int(s, 4, send(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1), mhs_to_Word(s, 2), mhs_to_Int(s, 3))); }+from_t mhs_setsockopt(int s) { return mhs_from_Int(s, 5, setsockopt(mhs_to_Int(s, 0), mhs_to_Int(s, 1), mhs_to_Int(s, 2), mhs_to_Ptr(s, 3), mhs_to_Int(s, 4))); }+from_t mhs_socket(int s) { return mhs_from_Int(s, 3, socket(mhs_to_Int(s, 0), mhs_to_Int(s, 1), mhs_to_Int(s, 2))); }+#endif  /* WANT_SOCKET */++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},+  { "remove", 1, mhs_remove},+  { "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_LZMA+  { "add_lzma_compressor", 1, mhs_add_lzma_compressor},+  { "add_lzma_decompressor", 1, mhs_add_lzma_decompressor},+#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},+  { "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},+  { "peek_uint32", 1, mhs_peek_uint32},+  { "poke_uint32", 2, mhs_poke_uint32},+#if WANT_INT64+  { "peek_uint64", 1, mhs_peek_uint64},+  { "poke_uint64", 2, mhs_poke_uint64},+#endif  /* WANT_INT64 */+  { "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},+  { "peek_int32", 1, mhs_peek_int32},+  { "poke_int32", 2, mhs_poke_int32},+#if WANT_INT64+  { "peek_int64", 1, mhs_peek_int64},+  { "poke_int64", 2, mhs_poke_int64},+#endif  /* WANT_INT64 */+  { "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},+  { "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},+  { "set_permissions", 2, mhs_set_permissions},+  { "get_permissions", 1, mhs_get_permissions},+#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},+  { "EACCES", 0, mhs_EACCES},+  { "EADDRINUSE", 0, mhs_EADDRINUSE},+  { "EADDRNOTAVAIL", 0, mhs_EADDRNOTAVAIL},+  { "EADV", 0, mhs_EADV},+  { "EAFNOSUPPORT", 0, mhs_EAFNOSUPPORT},+  { "EAGAIN", 0, mhs_EAGAIN},+  { "EALREADY", 0, mhs_EALREADY},+  { "EBADF", 0, mhs_EBADF},+  { "EBADMSG", 0, mhs_EBADMSG},+  { "EBADRPC", 0, mhs_EBADRPC},+  { "EBUSY", 0, mhs_EBUSY},+  { "ECHILD", 0, mhs_ECHILD},+  { "ECOMM", 0, mhs_ECOMM},+  { "ECONNABORTED", 0, mhs_ECONNABORTED},+  { "ECONNREFUSED", 0, mhs_ECONNREFUSED},+  { "ECONNRESET", 0, mhs_ECONNRESET},+  { "EDEADLK", 0, mhs_EDEADLK},+  { "EDESTADDRREQ", 0, mhs_EDESTADDRREQ},+  { "EDIRTY", 0, mhs_EDIRTY},+  { "EDOM", 0, mhs_EDOM},+  { "EDQUOT", 0, mhs_EDQUOT},+  { "EEXIST", 0, mhs_EEXIST},+  { "EFAULT", 0, mhs_EFAULT},+  { "EFBIG", 0, mhs_EFBIG},+  { "EFTYPE", 0, mhs_EFTYPE},+  { "EHOSTDOWN", 0, mhs_EHOSTDOWN},+  { "EHOSTUNREACH", 0, mhs_EHOSTUNREACH},+  { "EIDRM", 0, mhs_EIDRM},+  { "EILSEQ", 0, mhs_EILSEQ},+  { "EINPROGRESS", 0, mhs_EINPROGRESS},+  { "EINTR", 0, mhs_EINTR},+  { "EINVAL", 0, mhs_EINVAL},+  { "EIO", 0, mhs_EIO},+  { "EISCONN", 0, mhs_EISCONN},+  { "EISDIR", 0, mhs_EISDIR},+  { "ELOOP", 0, mhs_ELOOP},+  { "EMFILE", 0, mhs_EMFILE},+  { "EMLINK", 0, mhs_EMLINK},+  { "EMSGSIZE", 0, mhs_EMSGSIZE},+  { "EMULTIHOP", 0, mhs_EMULTIHOP},+  { "ENAMETOOLONG", 0, mhs_ENAMETOOLONG},+  { "ENETDOWN", 0, mhs_ENETDOWN},+  { "ENETRESET", 0, mhs_ENETRESET},+  { "ENETUNREACH", 0, mhs_ENETUNREACH},+  { "ENFILE", 0, mhs_ENFILE},+  { "ENOBUFS", 0, mhs_ENOBUFS},+  { "ENODATA", 0, mhs_ENODATA},+  { "ENODEV", 0, mhs_ENODEV},+  { "ENOENT", 0, mhs_ENOENT},+  { "ENOEXEC", 0, mhs_ENOEXEC},+  { "ENOLCK", 0, mhs_ENOLCK},+  { "ENOLINK", 0, mhs_ENOLINK},+  { "ENOMEM", 0, mhs_ENOMEM},+  { "ENOMSG", 0, mhs_ENOMSG},+  { "ENONET", 0, mhs_ENONET},+  { "ENOPROTOOPT", 0, mhs_ENOPROTOOPT},+  { "ENOSPC", 0, mhs_ENOSPC},+  { "ENOSR", 0, mhs_ENOSR},+  { "ENOSTR", 0, mhs_ENOSTR},+  { "ENOSYS", 0, mhs_ENOSYS},+  { "ENOTBLK", 0, mhs_ENOTBLK},+  { "ENOTCONN", 0, mhs_ENOTCONN},+  { "ENOTDIR", 0, mhs_ENOTDIR},+  { "ENOTEMPTY", 0, mhs_ENOTEMPTY},+  { "ENOTSOCK", 0, mhs_ENOTSOCK},+  { "ENOTSUP", 0, mhs_ENOTSUP},+  { "ENOTTY", 0, mhs_ENOTTY},+  { "ENXIO", 0, mhs_ENXIO},+  { "EOPNOTSUPP", 0, mhs_EOPNOTSUPP},+  { "EPERM", 0, mhs_EPERM},+  { "EPFNOSUPPORT", 0, mhs_EPFNOSUPPORT},+  { "EPIPE", 0, mhs_EPIPE},+  { "EPROCLIM", 0, mhs_EPROCLIM},+  { "EPROCUNAVAIL", 0, mhs_EPROCUNAVAIL},+  { "EPROGMISMATCH", 0, mhs_EPROGMISMATCH},+  { "EPROGUNAVAIL", 0, mhs_EPROGUNAVAIL},+  { "EPROTO", 0, mhs_EPROTO},+  { "EPROTONOSUPPORT", 0, mhs_EPROTONOSUPPORT},+  { "EPROTOTYPE", 0, mhs_EPROTOTYPE},+  { "ERANGE", 0, mhs_ERANGE},+  { "EREMCHG", 0, mhs_EREMCHG},+  { "EREMOTE", 0, mhs_EREMOTE},+  { "EROFS", 0, mhs_EROFS},+  { "ERPCMISMATCH", 0, mhs_ERPCMISMATCH},+  { "ERREMOTE", 0, mhs_ERREMOTE},+  { "ESHUTDOWN", 0, mhs_ESHUTDOWN},+  { "ESOCKTNOSUPPORT", 0, mhs_ESOCKTNOSUPPORT},+  { "ESPIPE", 0, mhs_ESPIPE},+  { "ESRCH", 0, mhs_ESRCH},+  { "ESRMNT", 0, mhs_ESRMNT},+  { "ESTALE", 0, mhs_ESTALE},+  { "ETIME", 0, mhs_ETIME},+  { "ETIMEDOUT", 0, mhs_ETIMEDOUT},+  { "ETOOMANYREFS", 0, mhs_ETOOMANYREFS},+  { "ETXTBSY", 0, mhs_ETXTBSY},+  { "EUSERS", 0, mhs_EUSERS},+  { "EWOULDBLOCK", 0, mhs_EWOULDBLOCK},+  { "EXDEV", 0, mhs_EXDEV},+  { "&errno", 0, mhs_addr_errno},+  { "strerror_r", 3, mhs_strerror_r},+#endif+  { "get_executable_path", 0, mhs_get_executable_path},+#if WANT_ENV+  { "getenv", 1, mhs_getenv},+  { "environ", 0, mhs_environ},+  { "unsetenv", 1, mhs_unsetenv},+  { "setenv", 3, mhs_setenv},+#endif  /* WANT_ENV */+#if WANT_SOCKET+  { "F_SETFL", 0, mhs_F_SETFL},+  { "O_NONBLOCK", 0, mhs_O_NONBLOCK},+  { "SOL_SOCKET", 0, mhs_SOL_SOCKET},+  { "SO_DEBUG", 0, mhs_SO_DEBUG},+  { "SO_ERROR", 0, mhs_SO_ERROR},+  { "SO_REUSEADDR", 0, mhs_SO_REUSEADDR},+  { "SO_TYPE", 0, mhs_SO_TYPE},+  { "accept", 3, mhs_accept},+  { "bind", 3, mhs_bind},+  { "close", 1, mhs_close},+  { "connect", 3, mhs_connect},+  { "fcntl", 3, mhs_fcntl},+  { "getsockopt", 5, mhs_getsockopt},+  { "listen", 2, mhs_listen},+  { "recv", 4, mhs_recv},+  { "send", 4, mhs_send},+  { "setsockopt", 5, mhs_setsockopt},+  { "socket", 3, mhs_socket},+#endif  /* WANT_SOCKET */+  { 0,0 }+};++int num_ffi = sizeof(ffi_table) / sizeof(ffi_table[0]);++++/*******************************/+/* HsFFI.h API */++void+hs_init(int *argc, char **argv[])+{+  (void)mhs_main(*argc, *argv);+}++void+hs_exit(void)+{+  _exit(0);+}++void+hs_set_argv(int argc, char *argv[])+{+  ERR("hs_set_argv not implemented");+}++void+hs_perform_gc(void)+{+  gc();+}++void+hs_free_stable_ptr(void *sp)+{+  free_stableptr((uvalue_t)sp);+}++void+hs_free_fun_ptr(HsFunPtr fp)+{+  ERR("hs_free_fun_ptr not implemented");+}
+ src/runtime/ffi_errno.c view
@@ -0,0 +1,404 @@+#include <errno.h>++#include "mhsffi.h"++#ifndef E2BIG+#define E2BIG -1+#endif+#ifndef EACCES+#define EACCES -1+#endif+#ifndef EADDRINUSE+#define EADDRINUSE -1+#endif+#ifndef EADDRNOTAVAIL+#define EADDRNOTAVAIL -1+#endif+#ifndef EADV+#define EADV -1+#endif+#ifndef EAFNOSUPPORT+#define EAFNOSUPPORT -1+#endif+#ifndef EAGAIN+#define EAGAIN -1+#endif+#ifndef EALREADY+#define EALREADY -1+#endif+#ifndef EBADF+#define EBADF -1+#endif+#ifndef EBADMSG+#define EBADMSG -1+#endif+#ifndef EBADRPC+#define EBADRPC -1+#endif+#ifndef EBUSY+#define EBUSY -1+#endif+#ifndef ECHILD+#define ECHILD -1+#endif+#ifndef ECOMM+#define ECOMM -1+#endif+#ifndef ECONNABORTED+#define ECONNABORTED -1+#endif+#ifndef ECONNREFUSED+#define ECONNREFUSED -1+#endif+#ifndef ECONNRESET+#define ECONNRESET -1+#endif+#ifndef EDEADLK+#define EDEADLK -1+#endif+#ifndef EDESTADDRREQ+#define EDESTADDRREQ -1+#endif+#ifndef EDIRTY+#define EDIRTY -1+#endif+#ifndef EDOM+#define EDOM -1+#endif+#ifndef EDQUOT+#define EDQUOT -1+#endif+#ifndef EEXIST+#define EEXIST -1+#endif+#ifndef EFAULT+#define EFAULT -1+#endif+#ifndef EFBIG+#define EFBIG -1+#endif+#ifndef EFTYPE+#define EFTYPE -1+#endif+#ifndef EHOSTDOWN+#define EHOSTDOWN -1+#endif+#ifndef EHOSTUNREACH+#define EHOSTUNREACH -1+#endif+#ifndef EIDRM+#define EIDRM -1+#endif+#ifndef EILSEQ+#define EILSEQ -1+#endif+#ifndef EINPROGRESS+#define EINPROGRESS -1+#endif+#ifndef EINTR+#define EINTR -1+#endif+#ifndef EINVAL+#define EINVAL -1+#endif+#ifndef EIO+#define EIO -1+#endif+#ifndef EISCONN+#define EISCONN -1+#endif+#ifndef EISDIR+#define EISDIR -1+#endif+#ifndef ELOOP+#define ELOOP -1+#endif+#ifndef EMFILE+#define EMFILE -1+#endif+#ifndef EMLINK+#define EMLINK -1+#endif+#ifndef EMSGSIZE+#define EMSGSIZE -1+#endif+#ifndef EMULTIHOP+#define EMULTIHOP -1+#endif+#ifndef ENAMETOOLONG+#define ENAMETOOLONG -1+#endif+#ifndef ENETDOWN+#define ENETDOWN -1+#endif+#ifndef ENETRESET+#define ENETRESET -1+#endif+#ifndef ENETUNREACH+#define ENETUNREACH -1+#endif+#ifndef ENFILE+#define ENFILE -1+#endif+#ifndef ENOBUFS+#define ENOBUFS -1+#endif+#ifndef ENODATA+#define ENODATA -1+#endif+#ifndef ENODEV+#define ENODEV -1+#endif+#ifndef ENOENT+#define ENOENT -1+#endif+#ifndef ENOEXEC+#define ENOEXEC -1+#endif+#ifndef ENOLCK+#define ENOLCK -1+#endif+#ifndef ENOLINK+#define ENOLINK -1+#endif+#ifndef ENOMEM+#define ENOMEM -1+#endif+#ifndef ENOMSG+#define ENOMSG -1+#endif+#ifndef ENONET+#define ENONET -1+#endif+#ifndef ENOPROTOOPT+#define ENOPROTOOPT -1+#endif+#ifndef ENOSPC+#define ENOSPC -1+#endif+#ifndef ENOSR+#define ENOSR -1+#endif+#ifndef ENOSTR+#define ENOSTR -1+#endif+#ifndef ENOSYS+#define ENOSYS -1+#endif+#ifndef ENOTBLK+#define ENOTBLK -1+#endif+#ifndef ENOTCONN+#define ENOTCONN -1+#endif+#ifndef ENOTDIR+#define ENOTDIR -1+#endif+#ifndef ENOTEMPTY+#define ENOTEMPTY -1+#endif+#ifndef ENOTSOCK+#define ENOTSOCK -1+#endif+#ifndef ENOTSUP+#define ENOTSUP -1+#endif+#ifndef ENOTTY+#define ENOTTY -1+#endif+#ifndef ENXIO+#define ENXIO -1+#endif+#ifndef EOPNOTSUPP+#define EOPNOTSUPP -1+#endif+#ifndef EPERM+#define EPERM -1+#endif+#ifndef EPFNOSUPPORT+#define EPFNOSUPPORT -1+#endif+#ifndef EPIPE+#define EPIPE -1+#endif+#ifndef EPROCLIM+#define EPROCLIM -1+#endif+#ifndef EPROCUNAVAIL+#define EPROCUNAVAIL -1+#endif+#ifndef EPROGMISMATCH+#define EPROGMISMATCH -1+#endif+#ifndef EPROGUNAVAIL+#define EPROGUNAVAIL -1+#endif+#ifndef EPROTO+#define EPROTO -1+#endif+#ifndef EPROTONOSUPPORT+#define EPROTONOSUPPORT -1+#endif+#ifndef EPROTOTYPE+#define EPROTOTYPE -1+#endif+#ifndef ERANGE+#define ERANGE -1+#endif+#ifndef EREMCHG+#define EREMCHG -1+#endif+#ifndef EREMOTE+#define EREMOTE -1+#endif+#ifndef EROFS+#define EROFS -1+#endif+#ifndef ERPCMISMATCH+#define ERPCMISMATCH -1+#endif+#ifndef ERREMOTE+#define ERREMOTE -1+#endif+#ifndef ESHUTDOWN+#define ESHUTDOWN -1+#endif+#ifndef ESOCKTNOSUPPORT+#define ESOCKTNOSUPPORT -1+#endif+#ifndef ESPIPE+#define ESPIPE -1+#endif+#ifndef ESRCH+#define ESRCH -1+#endif+#ifndef ESRMNT+#define ESRMNT -1+#endif+#ifndef ESTALE+#define ESTALE -1+#endif+#ifndef ETIME+#define ETIME -1+#endif+#ifndef ETIMEDOUT+#define ETIMEDOUT -1+#endif+#ifndef ETOOMANYREFS+#define ETOOMANYREFS -1+#endif+#ifndef ETXTBSY+#define ETXTBSY -1+#endif+#ifndef EUSERS+#define EUSERS -1+#endif+#ifndef EWOULDBLOCK+#define EWOULDBLOCK -1+#endif+#ifndef EXDEV+#define EXDEV -1+#endif++from_t mhs_E2BIG(int s) { return mhs_from_CInt(s, 0, E2BIG); }+from_t mhs_EACCES(int s) { return mhs_from_CInt(s, 0, EACCES); }+from_t mhs_EADDRINUSE(int s) { return mhs_from_CInt(s, 0, EADDRINUSE); }+from_t mhs_EADDRNOTAVAIL(int s) { return mhs_from_CInt(s, 0, EADDRNOTAVAIL); }+from_t mhs_EADV(int s) { return mhs_from_CInt(s, 0, EADV); }+from_t mhs_EAFNOSUPPORT(int s) { return mhs_from_CInt(s, 0, EAFNOSUPPORT); }+from_t mhs_EAGAIN(int s) { return mhs_from_CInt(s, 0, EAGAIN); }+from_t mhs_EALREADY(int s) { return mhs_from_CInt(s, 0, EALREADY); }+from_t mhs_EBADF(int s) { return mhs_from_CInt(s, 0, EBADF); }+from_t mhs_EBADMSG(int s) { return mhs_from_CInt(s, 0, EBADMSG); }+from_t mhs_EBADRPC(int s) { return mhs_from_CInt(s, 0, EBADRPC); }+from_t mhs_EBUSY(int s) { return mhs_from_CInt(s, 0, EBUSY); }+from_t mhs_ECHILD(int s) { return mhs_from_CInt(s, 0, ECHILD); }+from_t mhs_ECOMM(int s) { return mhs_from_CInt(s, 0, ECOMM); }+from_t mhs_ECONNABORTED(int s) { return mhs_from_CInt(s, 0, ECONNABORTED); }+from_t mhs_ECONNREFUSED(int s) { return mhs_from_CInt(s, 0, ECONNREFUSED); }+from_t mhs_ECONNRESET(int s) { return mhs_from_CInt(s, 0, ECONNRESET); }+from_t mhs_EDEADLK(int s) { return mhs_from_CInt(s, 0, EDEADLK); }+from_t mhs_EDESTADDRREQ(int s) { return mhs_from_CInt(s, 0, EDESTADDRREQ); }+from_t mhs_EDIRTY(int s) { return mhs_from_CInt(s, 0, EDIRTY); }+from_t mhs_EDOM(int s) { return mhs_from_CInt(s, 0, EDOM); }+from_t mhs_EDQUOT(int s) { return mhs_from_CInt(s, 0, EDQUOT); }+from_t mhs_EEXIST(int s) { return mhs_from_CInt(s, 0, EEXIST); }+from_t mhs_EFAULT(int s) { return mhs_from_CInt(s, 0, EFAULT); }+from_t mhs_EFBIG(int s) { return mhs_from_CInt(s, 0, EFBIG); }+from_t mhs_EFTYPE(int s) { return mhs_from_CInt(s, 0, EFTYPE); }+from_t mhs_EHOSTDOWN(int s) { return mhs_from_CInt(s, 0, EHOSTDOWN); }+from_t mhs_EHOSTUNREACH(int s) { return mhs_from_CInt(s, 0, EHOSTUNREACH); }+from_t mhs_EIDRM(int s) { return mhs_from_CInt(s, 0, EIDRM); }+from_t mhs_EILSEQ(int s) { return mhs_from_CInt(s, 0, EILSEQ); }+from_t mhs_EINPROGRESS(int s) { return mhs_from_CInt(s, 0, EINPROGRESS); }+from_t mhs_EINTR(int s) { return mhs_from_CInt(s, 0, EINTR); }+from_t mhs_EINVAL(int s) { return mhs_from_CInt(s, 0, EINVAL); }+from_t mhs_EIO(int s) { return mhs_from_CInt(s, 0, EIO); }+from_t mhs_EISCONN(int s) { return mhs_from_CInt(s, 0, EISCONN); }+from_t mhs_EISDIR(int s) { return mhs_from_CInt(s, 0, EISDIR); }+from_t mhs_ELOOP(int s) { return mhs_from_CInt(s, 0, ELOOP); }+from_t mhs_EMFILE(int s) { return mhs_from_CInt(s, 0, EMFILE); }+from_t mhs_EMLINK(int s) { return mhs_from_CInt(s, 0, EMLINK); }+from_t mhs_EMSGSIZE(int s) { return mhs_from_CInt(s, 0, EMSGSIZE); }+from_t mhs_EMULTIHOP(int s) { return mhs_from_CInt(s, 0, EMULTIHOP); }+from_t mhs_ENAMETOOLONG(int s) { return mhs_from_CInt(s, 0, ENAMETOOLONG); }+from_t mhs_ENETDOWN(int s) { return mhs_from_CInt(s, 0, ENETDOWN); }+from_t mhs_ENETRESET(int s) { return mhs_from_CInt(s, 0, ENETRESET); }+from_t mhs_ENETUNREACH(int s) { return mhs_from_CInt(s, 0, ENETUNREACH); }+from_t mhs_ENFILE(int s) { return mhs_from_CInt(s, 0, ENFILE); }+from_t mhs_ENOBUFS(int s) { return mhs_from_CInt(s, 0, ENOBUFS); }+from_t mhs_ENODATA(int s) { return mhs_from_CInt(s, 0, ENODATA); }+from_t mhs_ENODEV(int s) { return mhs_from_CInt(s, 0, ENODEV); }+from_t mhs_ENOENT(int s) { return mhs_from_CInt(s, 0, ENOENT); }+from_t mhs_ENOEXEC(int s) { return mhs_from_CInt(s, 0, ENOEXEC); }+from_t mhs_ENOLCK(int s) { return mhs_from_CInt(s, 0, ENOLCK); }+from_t mhs_ENOLINK(int s) { return mhs_from_CInt(s, 0, ENOLINK); }+from_t mhs_ENOMEM(int s) { return mhs_from_CInt(s, 0, ENOMEM); }+from_t mhs_ENOMSG(int s) { return mhs_from_CInt(s, 0, ENOMSG); }+from_t mhs_ENONET(int s) { return mhs_from_CInt(s, 0, ENONET); }+from_t mhs_ENOPROTOOPT(int s) { return mhs_from_CInt(s, 0, ENOPROTOOPT); }+from_t mhs_ENOSPC(int s) { return mhs_from_CInt(s, 0, ENOSPC); }+from_t mhs_ENOSR(int s) { return mhs_from_CInt(s, 0, ENOSR); }+from_t mhs_ENOSTR(int s) { return mhs_from_CInt(s, 0, ENOSTR); }+from_t mhs_ENOSYS(int s) { return mhs_from_CInt(s, 0, ENOSYS); }+from_t mhs_ENOTBLK(int s) { return mhs_from_CInt(s, 0, ENOTBLK); }+from_t mhs_ENOTCONN(int s) { return mhs_from_CInt(s, 0, ENOTCONN); }+from_t mhs_ENOTDIR(int s) { return mhs_from_CInt(s, 0, ENOTDIR); }+from_t mhs_ENOTEMPTY(int s) { return mhs_from_CInt(s, 0, ENOTEMPTY); }+from_t mhs_ENOTSOCK(int s) { return mhs_from_CInt(s, 0, ENOTSOCK); }+from_t mhs_ENOTSUP(int s) { return mhs_from_CInt(s, 0, ENOTSUP); }+from_t mhs_ENOTTY(int s) { return mhs_from_CInt(s, 0, ENOTTY); }+from_t mhs_ENXIO(int s) { return mhs_from_CInt(s, 0, ENXIO); }+from_t mhs_EOPNOTSUPP(int s) { return mhs_from_CInt(s, 0, EOPNOTSUPP); }+from_t mhs_EPERM(int s) { return mhs_from_CInt(s, 0, EPERM); }+from_t mhs_EPFNOSUPPORT(int s) { return mhs_from_CInt(s, 0, EPFNOSUPPORT); }+from_t mhs_EPIPE(int s) { return mhs_from_CInt(s, 0, EPIPE); }+from_t mhs_EPROCLIM(int s) { return mhs_from_CInt(s, 0, EPROCLIM); }+from_t mhs_EPROCUNAVAIL(int s) { return mhs_from_CInt(s, 0, EPROCUNAVAIL); }+from_t mhs_EPROGMISMATCH(int s) { return mhs_from_CInt(s, 0, EPROGMISMATCH); }+from_t mhs_EPROGUNAVAIL(int s) { return mhs_from_CInt(s, 0, EPROGUNAVAIL); }+from_t mhs_EPROTO(int s) { return mhs_from_CInt(s, 0, EPROTO); }+from_t mhs_EPROTONOSUPPORT(int s) { return mhs_from_CInt(s, 0, EPROTONOSUPPORT); }+from_t mhs_EPROTOTYPE(int s) { return mhs_from_CInt(s, 0, EPROTOTYPE); }+from_t mhs_ERANGE(int s) { return mhs_from_CInt(s, 0, ERANGE); }+from_t mhs_EREMCHG(int s) { return mhs_from_CInt(s, 0, EREMCHG); }+from_t mhs_EREMOTE(int s) { return mhs_from_CInt(s, 0, EREMOTE); }+from_t mhs_EROFS(int s) { return mhs_from_CInt(s, 0, EROFS); }+from_t mhs_ERPCMISMATCH(int s) { return mhs_from_CInt(s, 0, ERPCMISMATCH); }+from_t mhs_ERREMOTE(int s) { return mhs_from_CInt(s, 0, ERREMOTE); }+from_t mhs_ESHUTDOWN(int s) { return mhs_from_CInt(s, 0, ESHUTDOWN); }+from_t mhs_ESOCKTNOSUPPORT(int s) { return mhs_from_CInt(s, 0, ESOCKTNOSUPPORT); }+from_t mhs_ESPIPE(int s) { return mhs_from_CInt(s, 0, ESPIPE); }+from_t mhs_ESRCH(int s) { return mhs_from_CInt(s, 0, ESRCH); }+from_t mhs_ESRMNT(int s) { return mhs_from_CInt(s, 0, ESRMNT); }+from_t mhs_ESTALE(int s) { return mhs_from_CInt(s, 0, ESTALE); }+from_t mhs_ETIME(int s) { return mhs_from_CInt(s, 0, ETIME); }+from_t mhs_ETIMEDOUT(int s) { return mhs_from_CInt(s, 0, ETIMEDOUT); }+from_t mhs_ETOOMANYREFS(int s) { return mhs_from_CInt(s, 0, ETOOMANYREFS); }+from_t mhs_ETXTBSY(int s) { return mhs_from_CInt(s, 0, ETXTBSY); }+from_t mhs_EUSERS(int s) { return mhs_from_CInt(s, 0, EUSERS); }+from_t mhs_EWOULDBLOCK(int s) { return mhs_from_CInt(s, 0, EWOULDBLOCK); }+from_t mhs_EXDEV(int s) { return mhs_from_CInt(s, 0, EXDEV); }++from_t mhs_addr_errno(int s) { return mhs_from_Ptr(s, 0, &errno); }+from_t mhs_strerror_r(int s) { return mhs_from_CInt(s, 3, strerror_r(mhs_to_CInt(s, 0), mhs_to_Ptr(s, 1), mhs_to_CSize(s, 2))); }
+ src/runtime/lzma.h view
@@ -0,0 +1,10542 @@+#ifndef _LZMA_H_+#define _LZMA_H_++#define LZMA_HEADER_SIZE 13++#ifndef __APPLE__+#ifndef _7ZIP_AFFINITY_DISABLE+// _GNU_SOURCE can be required for pthread_setaffinity_np() / CPU_ZERO / CPU_SET+#define _GNU_SOURCE+#endif+#endif++/* LzmaDec.h -- LZMA Decoder+2020-03-19 : Igor Pavlov : Public domain */++#ifndef __LZMA_DEC_H+#define __LZMA_DEC_H++/* 7zTypes.h -- Basic types+2022-04-01 : Igor Pavlov : Public domain */++#ifndef __7Z_TYPES_H+#define __7Z_TYPES_H++#ifdef _WIN32+/* #include <windows.h> */+#else+#include <errno.h>+#endif++#include <stddef.h>+#include <string.h>++#ifndef EXTERN_C_BEGIN+#ifdef __cplusplus+#define EXTERN_C_BEGIN \+    extern "C"         \+    {+#define EXTERN_C_END }+#else+#define EXTERN_C_BEGIN+#define EXTERN_C_END+#endif+#endif++EXTERN_C_BEGIN++#define SZ_OK 0++#define SZ_ERROR_DATA 1+#define SZ_ERROR_MEM 2+#define SZ_ERROR_CRC 3+#define SZ_ERROR_UNSUPPORTED 4+#define SZ_ERROR_PARAM 5+#define SZ_ERROR_INPUT_EOF 6+#define SZ_ERROR_OUTPUT_EOF 7+#define SZ_ERROR_READ 8+#define SZ_ERROR_WRITE 9+#define SZ_ERROR_PROGRESS 10+#define SZ_ERROR_FAIL 11+#define SZ_ERROR_THREAD 12++#define SZ_ERROR_ARCHIVE 16+#define SZ_ERROR_NO_ARCHIVE 17++typedef int SRes;++#ifdef _MSC_VER+#if _MSC_VER > 1200+#define MY_ALIGN(n) __declspec(align(n))+#else+#define MY_ALIGN(n)+#endif+#else+#define MY_ALIGN(n) __attribute__((aligned(n)))+#endif++#ifdef _WIN32++/* typedef DWORD WRes; */+typedef unsigned WRes;+#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x)++// #define MY_HRES_ERROR__INTERNAL_ERROR  MY_SRes_HRESULT_FROM_WRes(ERROR_INTERNAL_ERROR)++#else // _WIN32++// #define ENV_HAVE_LSTAT+typedef int WRes;++// (FACILITY_ERRNO = 0x800) is 7zip's FACILITY constant to represent (errno) errors in HRESULT+#define MY__FACILITY_ERRNO 0x800+#define MY__FACILITY_WIN32 7+#define MY__FACILITY__WRes MY__FACILITY_ERRNO++#define MY_HRESULT_FROM_errno_CONST_ERROR(x) ((HRESULT)(((HRESULT)(x)&0x0000FFFF) | (MY__FACILITY__WRes << 16) | (HRESULT)0x80000000))++#define MY_SRes_HRESULT_FROM_WRes(x) \+    ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : MY_HRESULT_FROM_errno_CONST_ERROR(x))++// we call macro HRESULT_FROM_WIN32 for system errors (WRes) that are (errno)+#define HRESULT_FROM_WIN32(x) MY_SRes_HRESULT_FROM_WRes(x)++/*+#define ERROR_FILE_NOT_FOUND             2L+#define ERROR_ACCESS_DENIED              5L+#define ERROR_NO_MORE_FILES              18L+#define ERROR_LOCK_VIOLATION             33L+#define ERROR_FILE_EXISTS                80L+#define ERROR_DISK_FULL                  112L+#define ERROR_NEGATIVE_SEEK              131L+#define ERROR_ALREADY_EXISTS             183L+#define ERROR_DIRECTORY                  267L+#define ERROR_TOO_MANY_POSTS             298L++#define ERROR_INTERNAL_ERROR             1359L+#define ERROR_INVALID_REPARSE_DATA       4392L+#define ERROR_REPARSE_TAG_INVALID        4393L+#define ERROR_REPARSE_TAG_MISMATCH       4394L+*/++// we use errno equivalents for some WIN32 errors:++#define ERROR_INVALID_PARAMETER EINVAL+#define ERROR_INVALID_FUNCTION EINVAL+#define ERROR_ALREADY_EXISTS EEXIST+#define ERROR_FILE_EXISTS EEXIST+#define ERROR_PATH_NOT_FOUND ENOENT+#define ERROR_FILE_NOT_FOUND ENOENT+#define ERROR_DISK_FULL ENOSPC+// #define ERROR_INVALID_HANDLE        EBADF++// we use FACILITY_WIN32 for errors that has no errno equivalent+// Too many posts were made to a semaphore.+#define ERROR_TOO_MANY_POSTS ((HRESULT)0x8007012AL)+#define ERROR_INVALID_REPARSE_DATA ((HRESULT)0x80071128L)+#define ERROR_REPARSE_TAG_INVALID ((HRESULT)0x80071129L)++// if (MY__FACILITY__WRes != FACILITY_WIN32),+// we use FACILITY_WIN32 for COM errors:+#define E_OUTOFMEMORY ((HRESULT)0x8007000EL)+#define E_INVALIDARG ((HRESULT)0x80070057L)+#define MY__E_ERROR_NEGATIVE_SEEK ((HRESULT)0x80070083L)++/*+// we can use FACILITY_ERRNO for some COM errors, that have errno equivalents:+#define E_OUTOFMEMORY             MY_HRESULT_FROM_errno_CONST_ERROR(ENOMEM)+#define E_INVALIDARG              MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL)+#define MY__E_ERROR_NEGATIVE_SEEK MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL)+*/++#define TEXT(quote) quote++#define FILE_ATTRIBUTE_READONLY 0x0001+#define FILE_ATTRIBUTE_HIDDEN 0x0002+#define FILE_ATTRIBUTE_SYSTEM 0x0004+#define FILE_ATTRIBUTE_DIRECTORY 0x0010+#define FILE_ATTRIBUTE_ARCHIVE 0x0020+#define FILE_ATTRIBUTE_DEVICE 0x0040+#define FILE_ATTRIBUTE_NORMAL 0x0080+#define FILE_ATTRIBUTE_TEMPORARY 0x0100+#define FILE_ATTRIBUTE_SPARSE_FILE 0x0200+#define FILE_ATTRIBUTE_REPARSE_POINT 0x0400+#define FILE_ATTRIBUTE_COMPRESSED 0x0800+#define FILE_ATTRIBUTE_OFFLINE 0x1000+#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x2000+#define FILE_ATTRIBUTE_ENCRYPTED 0x4000++#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */++#endif++#ifndef RINOK+#define RINOK(x)               \+    {                          \+        int __result__ = (x);  \+        if (__result__ != 0)   \+            return __result__; \+    }+#endif++#ifndef RINOK_WRes+#define RINOK_WRes(x)          \+    {                          \+        WRes __result__ = (x); \+        if (__result__ != 0)   \+            return __result__; \+    }+#endif++typedef unsigned char Byte;+typedef short Int16;+typedef unsigned short UInt16;++#ifdef _LZMA_UINT32_IS_ULONG+typedef long Int32;+typedef unsigned long UInt32;+#else+typedef int Int32;+typedef unsigned int UInt32;+#endif++#ifndef _WIN32++typedef int INT;+typedef Int32 INT32;+typedef unsigned int UINT;+typedef UInt32 UINT32;+typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit for _WIN32 compatibility+typedef UINT32 ULONG;++#undef DWORD+typedef UINT32 DWORD;++#define VOID void++#define HRESULT LONG++typedef void *LPVOID;+// typedef void VOID;+// typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;+// gcc / clang on Unix  : sizeof(long==sizeof(void*) in 32 or 64 bits)+typedef long INT_PTR;+typedef unsigned long UINT_PTR;+typedef long LONG_PTR;+typedef unsigned long DWORD_PTR;++typedef size_t SIZE_T;++#endif //  _WIN32++#define MY_HRES_ERROR__INTERNAL_ERROR ((HRESULT)0x8007054FL)++#ifdef _SZ_NO_INT_64++/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.+   NOTES: Some code will work incorrectly in that case! */++typedef long Int64;+typedef unsigned long UInt64;++#else++#if defined(_MSC_VER) || defined(__BORLANDC__)+typedef __int64 Int64;+typedef unsigned __int64 UInt64;+#define UINT64_CONST(n) n+#else+typedef long long int Int64;+typedef unsigned long long int UInt64;+#define UINT64_CONST(n) n##ULL+#endif++#endif++#ifdef _LZMA_NO_SYSTEM_SIZE_T+typedef UInt32 SizeT;+#else+typedef size_t SizeT;+#endif++typedef int BoolInt;+/* typedef BoolInt Bool; */+#define True 1+#define False 0++#ifdef _WIN32+#define MY_STD_CALL __stdcall+#else+#define MY_STD_CALL+#endif++#ifdef _MSC_VER++#if _MSC_VER >= 1300+#define MY_NO_INLINE __declspec(noinline)+#else+#define MY_NO_INLINE+#endif++#define MY_FORCE_INLINE __forceinline++#define MY_CDECL __cdecl+#define MY_FAST_CALL __fastcall++#else //  _MSC_VER++#if (defined(__GNUC__) && (__GNUC__ >= 4)) || (defined(__clang__) && (__clang_major__ >= 4)) || defined(__INTEL_COMPILER) || defined(__xlC__)+#define MY_NO_INLINE __attribute__((noinline))+// #define MY_FORCE_INLINE __attribute__((always_inline)) inline+#else+#define MY_NO_INLINE+#endif++#define MY_FORCE_INLINE++#define MY_CDECL++#if defined(_M_IX86) || defined(__i386__)+// #define MY_FAST_CALL __attribute__((fastcall))+// #define MY_FAST_CALL __attribute__((cdecl))+#define MY_FAST_CALL+#elif defined(MY_CPU_AMD64)+// #define MY_FAST_CALL __attribute__((ms_abi))+#define MY_FAST_CALL+#else+#define MY_FAST_CALL+#endif++#endif //  _MSC_VER++/* The following interfaces use first parameter as pointer to structure */++typedef struct IByteIn IByteIn;+struct IByteIn+{+    Byte (*Read)(const IByteIn *p); /* reads one byte, returns 0 in case of EOF or error */+};+#define IByteIn_Read(p) (p)->Read(p)++typedef struct IByteOut IByteOut;+struct IByteOut+{+    void (*Write)(const IByteOut *p, Byte b);+};+#define IByteOut_Write(p, b) (p)->Write(p, b)++typedef struct ISeqInStream ISeqInStream;+struct ISeqInStream+{+    SRes (*Read)(const ISeqInStream *p, void *buf, size_t *size);+    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.+       (output(*size) < input(*size)) is allowed */+};+#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size)++/* it can return SZ_ERROR_INPUT_EOF */+SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size);+SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType);+SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf);++typedef struct ISeqOutStream ISeqOutStream;+struct ISeqOutStream+{+    size_t (*Write)(const ISeqOutStream *p, const void *buf, size_t size);+    /* Returns: result - the number of actually written bytes.+       (result < size) means error */+};+#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size)++typedef enum+{+    SZ_SEEK_SET = 0,+    SZ_SEEK_CUR = 1,+    SZ_SEEK_END = 2+} ESzSeek;++typedef struct ISeekInStream ISeekInStream;+struct ISeekInStream+{+    SRes (*Read)(const ISeekInStream *p, void *buf, size_t *size); /* same as ISeqInStream::Read */+    SRes (*Seek)(const ISeekInStream *p, Int64 *pos, ESzSeek origin);+};+#define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size)+#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)++typedef struct ILookInStream ILookInStream;+struct ILookInStream+{+    SRes (*Look)(const ILookInStream *p, const void **buf, size_t *size);+    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.+       (output(*size) > input(*size)) is not allowed+       (output(*size) < input(*size)) is allowed */+    SRes (*Skip)(const ILookInStream *p, size_t offset);+    /* offset must be <= output(*size) of Look */++    SRes (*Read)(const ILookInStream *p, void *buf, size_t *size);+    /* reads directly (without buffer). It's same as ISeqInStream::Read */+    SRes (*Seek)(const ILookInStream *p, Int64 *pos, ESzSeek origin);+};++#define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size)+#define ILookInStream_Skip(p, offset) (p)->Skip(p, offset)+#define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size)+#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)++SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size);+SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset);++/* reads via ILookInStream::Read */+SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType);+SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size);++typedef struct+{+    ILookInStream vt;+    const ISeekInStream *realStream;++    size_t pos;+    size_t size; /* it's data size */++    /* the following variables must be set outside */+    Byte *buf;+    size_t bufSize;+} CLookToRead2;++void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead);++#define LookToRead2_Init(p)       \+    {                             \+        (p)->pos = (p)->size = 0; \+    }++typedef struct+{+    ISeqInStream vt;+    const ILookInStream *realStream;+} CSecToLook;++void SecToLook_CreateVTable(CSecToLook *p);++typedef struct+{+    ISeqInStream vt;+    const ILookInStream *realStream;+} CSecToRead;++void SecToRead_CreateVTable(CSecToRead *p);++typedef struct ICompressProgress ICompressProgress;++struct ICompressProgress+{+    SRes (*Progress)(const ICompressProgress *p, UInt64 inSize, UInt64 outSize);+    /* Returns: result. (result != SZ_OK) means break.+       Value (UInt64)(Int64)-1 for size means unknown value. */+};+#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize)++typedef struct ISzAlloc ISzAlloc;+typedef const ISzAlloc *ISzAllocPtr;++struct ISzAlloc+{+    void *(*Alloc)(ISzAllocPtr p, size_t size);+    void (*Free)(ISzAllocPtr p, void *address); /* address can be 0 */+};++#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size)+#define ISzAlloc_Free(p, a) (p)->Free(p, a)++/* deprecated */+#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size)+#define IAlloc_Free(p, a) ISzAlloc_Free(p, a)++#ifndef MY_offsetof+#ifdef offsetof+#define MY_offsetof(type, m) offsetof(type, m)+/*+#define MY_offsetof(type, m) FIELD_OFFSET(type, m)+*/+#else+#define MY_offsetof(type, m) ((size_t) & (((type *)0)->m))+#endif+#endif++#ifndef MY_container_of++/*+#define MY_container_of(ptr, type, m) container_of(ptr, type, m)+#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m)+#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m)))+#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m))))+*/++/*+  GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly"+    GCC 3.4.4 : classes with constructor+    GCC 4.8.1 : classes with non-public variable members"+*/++#define MY_container_of(ptr, type, m) ((type *)(void *)((char *)(void *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m)))++#endif++#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(void *)(ptr))++/*+#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)+*/+#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m)++#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)+/*+#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m)+*/++#define MY_memset_0_ARRAY(a) memset((a), 0, sizeof(a))++#ifdef _WIN32++#define CHAR_PATH_SEPARATOR '\\'+#define WCHAR_PATH_SEPARATOR L'\\'+#define STRING_PATH_SEPARATOR "\\"+#define WSTRING_PATH_SEPARATOR L"\\"++#else++#define CHAR_PATH_SEPARATOR '/'+#define WCHAR_PATH_SEPARATOR L'/'+#define STRING_PATH_SEPARATOR "/"+#define WSTRING_PATH_SEPARATOR L"/"++#endif++#define k_PropVar_TimePrec_0 0+#define k_PropVar_TimePrec_Unix 1+#define k_PropVar_TimePrec_DOS 2+#define k_PropVar_TimePrec_HighPrec 3+#define k_PropVar_TimePrec_Base 16+#define k_PropVar_TimePrec_100ns (k_PropVar_TimePrec_Base + 7)+#define k_PropVar_TimePrec_1ns (k_PropVar_TimePrec_Base + 9)++EXTERN_C_END++#endif++EXTERN_C_BEGIN++/* #define _LZMA_PROB32 */+/* _LZMA_PROB32 can increase the speed on some CPUs,+   but memory usage for CLzmaDec::probs will be doubled in that case */++typedef+#ifdef _LZMA_PROB32+    UInt32+#else+    UInt16+#endif+        CLzmaProb;++/* ---------- LZMA Properties ---------- */++#define LZMA_PROPS_SIZE 5++typedef struct _CLzmaProps+{+    Byte lc;+    Byte lp;+    Byte pb;+    Byte _pad_;+    UInt32 dicSize;+} CLzmaProps;++/* LzmaProps_Decode - decodes properties+Returns:+  SZ_OK+  SZ_ERROR_UNSUPPORTED - Unsupported properties+*/++SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);++/* ---------- LZMA Decoder state ---------- */++/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.+   Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */++#define LZMA_REQUIRED_INPUT_MAX 20++typedef struct+{+    /* Don't change this structure. ASM code can use it. */+    CLzmaProps prop;+    CLzmaProb *probs;+    CLzmaProb *probs_1664;+    Byte *dic;+    SizeT dicBufSize;+    SizeT dicPos;+    const Byte *buf;+    UInt32 range;+    UInt32 code;+    UInt32 processedPos;+    UInt32 checkDicSize;+    UInt32 reps[4];+    UInt32 state;+    UInt32 remainLen;++    UInt32 numProbs;+    unsigned tempBufSize;+    Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];+} CLzmaDec;++#define LzmaDec_Construct(p) \+    {                        \+        (p)->dic = NULL;     \+        (p)->probs = NULL;   \+    }++void LzmaDec_Init(CLzmaDec *p);++/* There are two types of LZMA streams:+     - Stream with end mark. That end mark adds about 6 bytes to compressed size.+     - Stream without end mark. You must know exact uncompressed size to decompress such stream. */++typedef enum+{+    LZMA_FINISH_ANY, /* finish at any point */+    LZMA_FINISH_END  /* block must be finished at the end */+} ELzmaFinishMode;++/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!++   You must use LZMA_FINISH_END, when you know that current output buffer+   covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.++   If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,+   and output value of destLen will be less than output buffer size limit.+   You can check status result also.++   You can use multiple checks to test data integrity after full decompression:+     1) Check Result and "status" variable.+     2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.+     3) Check that output(srcLen) = compressedSize, if you know real compressedSize.+        You must use correct finish mode in that case. */++typedef enum+{+    LZMA_STATUS_NOT_SPECIFIED,              /* use main error code instead */+    LZMA_STATUS_FINISHED_WITH_MARK,         /* stream was finished with end mark. */+    LZMA_STATUS_NOT_FINISHED,               /* stream was not finished */+    LZMA_STATUS_NEEDS_MORE_INPUT,           /* you must provide more input bytes */+    LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */+} ELzmaStatus;++/* ELzmaStatus is used only as output value for function call */++/* ---------- Interfaces ---------- */++/* There are 3 levels of interfaces:+     1) Dictionary Interface+     2) Buffer Interface+     3) One Call Interface+   You can select any of these interfaces, but don't mix functions from different+   groups for same object. */++/* There are two variants to allocate state for Dictionary Interface:+     1) LzmaDec_Allocate / LzmaDec_Free+     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs+   You can use variant 2, if you set dictionary buffer manually.+   For Buffer Interface you must always use variant 1.++LzmaDec_Allocate* can return:+  SZ_OK+  SZ_ERROR_MEM         - Memory allocation error+  SZ_ERROR_UNSUPPORTED - Unsupported properties+*/++SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc);+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc);++SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc);+void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc);++/* ---------- Dictionary Interface ---------- */++/* You can use it, if you want to eliminate the overhead for data copying from+   dictionary to some other external buffer.+   You must work with CLzmaDec variables directly in this interface.++   STEPS:+     LzmaDec_Construct()+     LzmaDec_Allocate()+     for (each new stream)+     {+       LzmaDec_Init()+       while (it needs more decompression)+       {+         LzmaDec_DecodeToDic()+         use data from CLzmaDec::dic and update CLzmaDec::dicPos+       }+     }+     LzmaDec_Free()+*/++/* LzmaDec_DecodeToDic++   The decoding to internal dictionary buffer (CLzmaDec::dic).+   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!++finishMode:+  It has meaning only if the decoding reaches output limit (dicLimit).+  LZMA_FINISH_ANY - Decode just dicLimit bytes.+  LZMA_FINISH_END - Stream must be finished after dicLimit.++Returns:+  SZ_OK+    status:+      LZMA_STATUS_FINISHED_WITH_MARK+      LZMA_STATUS_NOT_FINISHED+      LZMA_STATUS_NEEDS_MORE_INPUT+      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK+  SZ_ERROR_DATA - Data error+  SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure+*/++SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,+                         const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);++/* ---------- Buffer Interface ---------- */++/* It's zlib-like interface.+   See LzmaDec_DecodeToDic description for information about STEPS and return results,+   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need+   to work with CLzmaDec variables manually.++finishMode:+  It has meaning only if the decoding reaches output limit (*destLen).+  LZMA_FINISH_ANY - Decode just destLen bytes.+  LZMA_FINISH_END - Stream must be finished after (*destLen).+*/++SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,+                         const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);++/* ---------- One Call Interface ---------- */++/* LzmaDecode++finishMode:+  It has meaning only if the decoding reaches output limit (*destLen).+  LZMA_FINISH_ANY - Decode just destLen bytes.+  LZMA_FINISH_END - Stream must be finished after (*destLen).++Returns:+  SZ_OK+    status:+      LZMA_STATUS_FINISHED_WITH_MARK+      LZMA_STATUS_NOT_FINISHED+      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK+  SZ_ERROR_DATA - Data error+  SZ_ERROR_MEM  - Memory allocation error+  SZ_ERROR_UNSUPPORTED - Unsupported properties+  SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).+  SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure+*/++int lzma_uncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen);++SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,+                const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,+                ELzmaStatus *status, ISzAllocPtr alloc);++EXTERN_C_END++#endif++/*  LzmaEnc.h -- LZMA Encoder+2019-10-30 : Igor Pavlov : Public domain */++#ifndef __LZMA_ENC_H+#define __LZMA_ENC_H++EXTERN_C_BEGIN++#define LZMA_PROPS_SIZE 5++typedef struct _CLzmaEncProps+{+    int level;             /* 0 <= level <= 9 */+    UInt32 dictSize;       /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version+                              (1 << 12) <= dictSize <= (3 << 29) for 64-bit version+                              default = (1 << 24) */+    int lc;                /* 0 <= lc <= 8, default = 3 */+    int lp;                /* 0 <= lp <= 4, default = 0 */+    int pb;                /* 0 <= pb <= 4, default = 2 */+    int algo;              /* 0 - fast, 1 - normal, default = 1 */+    int fb;                /* 5 <= fb <= 273, default = 32 */+    int btMode;            /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */+    int numHashBytes;      /* 2, 3 or 4, default = 4 */+    UInt32 mc;             /* 1 <= mc <= (1 << 30), default = 32 */+    unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */+    int numThreads;        /* 1 or 2, default = 2 */++    UInt64 reduceSize; /* estimated size of data that will be compressed. default = (UInt64)(Int64)-1.+                          Encoder uses this value to reduce dictionary size */++    UInt64 affinity;+} CLzmaEncProps;++void LzmaEncProps_Init(CLzmaEncProps *p);+void LzmaEncProps_Normalize(CLzmaEncProps *p);+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);++/* ---------- CLzmaEncHandle Interface ---------- */++/* LzmaEnc* functions can return the following exit codes:+SRes:+  SZ_OK           - OK+  SZ_ERROR_MEM    - Memory allocation error+  SZ_ERROR_PARAM  - Incorrect paramater in props+  SZ_ERROR_WRITE  - ISeqOutStream write callback error+  SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output+  SZ_ERROR_PROGRESS - some break from progress callback+  SZ_ERROR_THREAD - error in multithreading functions (only for Mt version)+*/++typedef void *CLzmaEncHandle;++CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc);+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig);++SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);+void LzmaEnc_SetDataSize(CLzmaEncHandle p, UInt64 expectedDataSiize);+SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);+unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle p);++SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,+                    ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig);+SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,+                       int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig);++/* ---------- One Call Interface ---------- */++SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,+                const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,+                ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig);++int lzma_compress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen);++EXTERN_C_END++#endif++#ifdef LZMA_IMPLEMENTATION++#ifndef NOSTDLIB+#ifndef LZMA_ALLOC++#include <stdlib.h>+#define LZMA_ALLOC g_Alloc++static void *SzAlloc(ISzAllocPtr p, size_t size)+{+    (void)p;+    return malloc(size);+}++static void SzFree(ISzAllocPtr p, void *address)+{+    (void)p;+    free(address);+}++static const ISzAlloc g_Alloc = {SzAlloc, SzFree};++#endif // LZMA_ALLOC+#endif // NOSTDLIB++/* LzmaEnc.c -- LZMA Encoder+2022-07-15: Igor Pavlov : Public domain */++/* Compiler.h+2021-01-05 : Igor Pavlov : Public domain */++#ifndef __7Z_COMPILER_H+#define __7Z_COMPILER_H++#ifdef __clang__+#pragma clang diagnostic ignored "-Wunused-private-field"+#endif++#ifdef _MSC_VER++#ifdef UNDER_CE+#define RPC_NO_WINDOWS_H+/* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */+#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union+#pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int+#endif++#if _MSC_VER >= 1300+#pragma warning(disable : 4996) // This function or variable may be unsafe+#else+#pragma warning(disable : 4511) // copy constructor could not be generated+#pragma warning(disable : 4512) // assignment operator could not be generated+#pragma warning(disable : 4514) // unreferenced inline function has been removed+#pragma warning(disable : 4702) // unreachable code+#pragma warning(disable : 4710) // not inlined+#pragma warning(disable : 4714) // function marked as __forceinline not inlined+#pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information+#endif++#ifdef __clang__+#pragma clang diagnostic ignored "-Wdeprecated-declarations"+#pragma clang diagnostic ignored "-Wmicrosoft-exception-spec"+// #pragma clang diagnostic ignored "-Wreserved-id-macro"+#endif++#endif++#define UNUSED_VAR(x) (void)x;+/* #define UNUSED_VAR(x) x=x; */++#endif++#include <string.h>++/* #define SHOW_STAT */+/* #define SHOW_STAT2 */++#if defined(SHOW_STAT) || defined(SHOW_STAT2)+#include <stdio.h>+#endif++/* CpuArch.h -- CPU specific code+2022-07-15 : Igor Pavlov : Public domain */++#ifndef __CPU_ARCH_H+#define __CPU_ARCH_H++EXTERN_C_BEGIN++/*+MY_CPU_LE means that CPU is LITTLE ENDIAN.+MY_CPU_BE means that CPU is BIG ENDIAN.+If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform.++MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses.++MY_CPU_64BIT means that processor can work with 64-bit registers.+  MY_CPU_64BIT can be used to select fast code branch+  MY_CPU_64BIT doesn't mean that (sizeof(void *) == 8)+*/++#if defined(_M_X64) || defined(_M_AMD64) || defined(__x86_64__) || defined(__AMD64__) || defined(__amd64__)+#define MY_CPU_AMD64+#ifdef __ILP32__+#define MY_CPU_NAME "x32"+#define MY_CPU_SIZEOF_POINTER 4+#else+#define MY_CPU_NAME "x64"+#define MY_CPU_SIZEOF_POINTER 8+#endif+#define MY_CPU_64BIT+#endif++#if defined(_M_IX86) || defined(__i386__)+#define MY_CPU_X86+#define MY_CPU_NAME "x86"+/* #define MY_CPU_32BIT */+#define MY_CPU_SIZEOF_POINTER 4+#endif++#if defined(_M_ARM64) || defined(__AARCH64EL__) || defined(__AARCH64EB__) || defined(__aarch64__)+#define MY_CPU_ARM64+#define MY_CPU_NAME "arm64"+#define MY_CPU_64BIT+#endif++#if defined(_M_ARM) || defined(_M_ARM_NT) || defined(_M_ARMT) || defined(__arm__) || defined(__thumb__) || defined(__ARMEL__) || defined(__ARMEB__) || defined(__THUMBEL__) || defined(__THUMBEB__)+#define MY_CPU_ARM++#if defined(__thumb__) || defined(__THUMBEL__) || defined(_M_ARMT)+#define MY_CPU_NAME "armt"+#else+#define MY_CPU_NAME "arm"+#endif+/* #define MY_CPU_32BIT */+#define MY_CPU_SIZEOF_POINTER 4+#endif++#if defined(_M_IA64) || defined(__ia64__)+#define MY_CPU_IA64+#define MY_CPU_NAME "ia64"+#define MY_CPU_64BIT+#endif++#if defined(__mips64) || defined(__mips64__) || (defined(__mips) && (__mips == 64 || __mips == 4 || __mips == 3))+#define MY_CPU_NAME "mips64"+#define MY_CPU_64BIT+#elif defined(__mips__)+#define MY_CPU_NAME "mips"+/* #define MY_CPU_32BIT */+#endif++#if defined(__ppc64__) || defined(__powerpc64__) || defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) || defined(_POWER)++#if defined(__ppc64__) || defined(__powerpc64__) || defined(_LP64) || defined(__64BIT__)+#ifdef __ILP32__+#define MY_CPU_NAME "ppc64-32"+#define MY_CPU_SIZEOF_POINTER 4+#else+#define MY_CPU_NAME "ppc64"+#define MY_CPU_SIZEOF_POINTER 8+#endif+#define MY_CPU_64BIT+#else+#define MY_CPU_NAME "ppc"+#define MY_CPU_SIZEOF_POINTER 4+/* #define MY_CPU_32BIT */+#endif+#endif++#if defined(__riscv) || defined(__riscv__)+#if __riscv_xlen == 32+#define MY_CPU_NAME "riscv32"+#elif __riscv_xlen == 64+#define MY_CPU_NAME "riscv64"+#else+#define MY_CPU_NAME "riscv"+#endif+#endif++#if defined(MY_CPU_X86) || defined(MY_CPU_AMD64)+#define MY_CPU_X86_OR_AMD64+#endif++#if defined(MY_CPU_ARM) || defined(MY_CPU_ARM64)+#define MY_CPU_ARM_OR_ARM64+#endif++#ifdef _WIN32++#ifdef MY_CPU_ARM+#define MY_CPU_ARM_LE+#endif++#ifdef MY_CPU_ARM64+#define MY_CPU_ARM64_LE+#endif++#ifdef _M_IA64+#define MY_CPU_IA64_LE+#endif++#endif++#if defined(MY_CPU_X86_OR_AMD64) || defined(MY_CPU_ARM_LE) || defined(MY_CPU_ARM64_LE) || defined(MY_CPU_IA64_LE) || defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || defined(__THUMBEL__) || defined(__AARCH64EL__) || defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(__BFIN__) || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))+#define MY_CPU_LE+#endif++#if defined(__BIG_ENDIAN__) || defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(__m68k__) || defined(__s390__) || defined(__s390x__) || defined(__zarch__) || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))+#define MY_CPU_BE+#endif++#if defined(MY_CPU_LE) && defined(MY_CPU_BE)+#error Stop_Compiling_Bad_Endian+#endif++#if defined(MY_CPU_32BIT) && defined(MY_CPU_64BIT)+#error Stop_Compiling_Bad_32_64_BIT+#endif++#ifdef __SIZEOF_POINTER__+#ifdef MY_CPU_SIZEOF_POINTER+#if MY_CPU_SIZEOF_POINTER != __SIZEOF_POINTER__+#error Stop_Compiling_Bad_MY_CPU_PTR_SIZE+#endif+#else+#define MY_CPU_SIZEOF_POINTER __SIZEOF_POINTER__+#endif+#endif++#if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4)+#if defined(_LP64)+#error Stop_Compiling_Bad_MY_CPU_PTR_SIZE+#endif+#endif++#ifdef _MSC_VER+#if _MSC_VER >= 1300+#define MY_CPU_pragma_pack_push_1 __pragma(pack(push, 1))+#define MY_CPU_pragma_pop __pragma(pack(pop))+#else+#define MY_CPU_pragma_pack_push_1+#define MY_CPU_pragma_pop+#endif+#else+#ifdef __xlC__+#define MY_CPU_pragma_pack_push_1 _Pragma("pack(1)")+#define MY_CPU_pragma_pop _Pragma("pack()")+#else+#define MY_CPU_pragma_pack_push_1 _Pragma("pack(push, 1)")+#define MY_CPU_pragma_pop _Pragma("pack(pop)")+#endif+#endif++#ifndef MY_CPU_NAME+#ifdef MY_CPU_LE+#define MY_CPU_NAME "LE"+#elif defined(MY_CPU_BE)+#define MY_CPU_NAME "BE"+#else+/*+#define MY_CPU_NAME ""+*/+#endif+#endif++#ifdef MY_CPU_LE+#if defined(MY_CPU_X86_OR_AMD64) || defined(MY_CPU_ARM64)+#define MY_CPU_LE_UNALIGN+#define MY_CPU_LE_UNALIGN_64+#elif defined(__ARM_FEATURE_UNALIGNED)+/* gcc9 for 32-bit arm can use LDRD instruction that requires 32-bit alignment.+   So we can't use unaligned 64-bit operations. */+#define MY_CPU_LE_UNALIGN+#endif+#endif++#ifdef MY_CPU_LE_UNALIGN++#define GetUi16(p) (*(const UInt16 *)(const void *)(p))+#define GetUi32(p) (*(const UInt32 *)(const void *)(p))+#ifdef MY_CPU_LE_UNALIGN_64+#define GetUi64(p) (*(const UInt64 *)(const void *)(p))+#endif++#define SetUi16(p, v)                 \+    {                                 \+        *(UInt16 *)(void *)(p) = (v); \+    }+#define SetUi32(p, v)                 \+    {                                 \+        *(UInt32 *)(void *)(p) = (v); \+    }+#ifdef MY_CPU_LE_UNALIGN_64+#define SetUi64(p, v)                 \+    {                                 \+        *(UInt64 *)(void *)(p) = (v); \+    }+#endif++#else++#define GetUi16(p) ((UInt16)(((const Byte *)(p))[0] | \+                             ((UInt16)((const Byte *)(p))[1] << 8)))++#define GetUi32(p) (                         \+    ((const Byte *)(p))[0] |                 \+    ((UInt32)((const Byte *)(p))[1] << 8) |  \+    ((UInt32)((const Byte *)(p))[2] << 16) | \+    ((UInt32)((const Byte *)(p))[3] << 24))++#define SetUi16(p, v)                  \+    {                                  \+        Byte *_ppp_ = (Byte *)(p);     \+        UInt32 _vvv_ = (v);            \+        _ppp_[0] = (Byte)_vvv_;        \+        _ppp_[1] = (Byte)(_vvv_ >> 8); \+    }++#define SetUi32(p, v)                   \+    {                                   \+        Byte *_ppp_ = (Byte *)(p);      \+        UInt32 _vvv_ = (v);             \+        _ppp_[0] = (Byte)_vvv_;         \+        _ppp_[1] = (Byte)(_vvv_ >> 8);  \+        _ppp_[2] = (Byte)(_vvv_ >> 16); \+        _ppp_[3] = (Byte)(_vvv_ >> 24); \+    }++#endif++#ifndef MY_CPU_LE_UNALIGN_64++#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32))++#define SetUi64(p, v)                                \+    {                                                \+        Byte *_ppp2_ = (Byte *)(p);                  \+        UInt64 _vvv2_ = (v);                         \+        SetUi32(_ppp2_, (UInt32)_vvv2_);             \+        SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)); \+    }++#endif++#ifdef __has_builtin+#define MY__has_builtin(x) __has_builtin(x)+#else+#define MY__has_builtin(x) 0+#endif++#if defined(MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ defined(_MSC_VER) && (_MSC_VER >= 1300)++/* Note: we use bswap instruction, that is unsupported in 386 cpu */++#include <stdlib.h>++#pragma intrinsic(_byteswap_ushort)+#pragma intrinsic(_byteswap_ulong)+#pragma intrinsic(_byteswap_uint64)++/* #define GetBe16(p) _byteswap_ushort(*(const UInt16 *)(const Byte *)(p)) */+#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const void *)(p))+#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const void *)(p))++#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v)++#elif defined(MY_CPU_LE_UNALIGN) && ((defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) || (defined(__clang__) && MY__has_builtin(__builtin_bswap16)))++/* #define GetBe16(p) __builtin_bswap16(*(const UInt16 *)(const void *)(p)) */+#define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const void *)(p))+#define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const void *)(p))++#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = __builtin_bswap32(v)++#else++#define GetBe32(p) (                         \+    ((UInt32)((const Byte *)(p))[0] << 24) | \+    ((UInt32)((const Byte *)(p))[1] << 16) | \+    ((UInt32)((const Byte *)(p))[2] << 8) |  \+    ((const Byte *)(p))[3])++#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4))++#define SetBe32(p, v)                   \+    {                                   \+        Byte *_ppp_ = (Byte *)(p);      \+        UInt32 _vvv_ = (v);             \+        _ppp_[0] = (Byte)(_vvv_ >> 24); \+        _ppp_[1] = (Byte)(_vvv_ >> 16); \+        _ppp_[2] = (Byte)(_vvv_ >> 8);  \+        _ppp_[3] = (Byte)_vvv_;         \+    }++#endif++#ifndef GetBe16++#define GetBe16(p) ((UInt16)(((UInt16)((const Byte *)(p))[0] << 8) | \+                             ((const Byte *)(p))[1]))++#endif++#ifdef MY_CPU_X86_OR_AMD64++typedef struct+{+    UInt32 maxFunc;+    UInt32 vendor[3];+    UInt32 ver;+    UInt32 b;+    UInt32 c;+    UInt32 d;+} Cx86cpuid;++enum+{+    CPU_FIRM_INTEL,+    CPU_FIRM_AMD,+    CPU_FIRM_VIA+};++void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d);++BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p);+int x86cpuid_GetFirm(const Cx86cpuid *p);++#define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF))+#define x86cpuid_GetModel(ver) (((ver >> 12) & 0xF0) | ((ver >> 4) & 0xF))+#define x86cpuid_GetStepping(ver) (ver & 0xF)++BoolInt CPU_Is_InOrder(void);++BoolInt CPU_IsSupported_AES(void);+BoolInt CPU_IsSupported_AVX2(void);+BoolInt CPU_IsSupported_VAES_AVX2(void);+BoolInt CPU_IsSupported_SSSE3(void);+BoolInt CPU_IsSupported_SSE41(void);+BoolInt CPU_IsSupported_SHA(void);+BoolInt CPU_IsSupported_PageGB(void);++#elif defined(MY_CPU_ARM_OR_ARM64)++BoolInt CPU_IsSupported_CRC32(void);+BoolInt CPU_IsSupported_NEON(void);++#if defined(_WIN32)+BoolInt CPU_IsSupported_CRYPTO(void);+#define CPU_IsSupported_SHA1 CPU_IsSupported_CRYPTO+#define CPU_IsSupported_SHA2 CPU_IsSupported_CRYPTO+#define CPU_IsSupported_AES CPU_IsSupported_CRYPTO+#else+BoolInt CPU_IsSupported_SHA1(void);+BoolInt CPU_IsSupported_SHA2(void);+BoolInt CPU_IsSupported_AES(void);+#endif++#endif++#if defined(__APPLE__)+int My_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize);+int My_sysctlbyname_Get_UInt32(const char *name, UInt32 *val);+#endif++EXTERN_C_END++#endif++/* CpuArch.c -- CPU specific code+2021-07-13 : Igor Pavlov : Public domain */++#ifdef MY_CPU_X86_OR_AMD64++#if (defined(_MSC_VER) && !defined(MY_CPU_AMD64)) || defined(__GNUC__)+#define USE_ASM+#endif++#if !defined(USE_ASM) && _MSC_VER >= 1500+#include <intrin.h>+#endif++#if defined(USE_ASM) && !defined(MY_CPU_AMD64)+static UInt32 CheckFlag(UInt32 flag)+{+#ifdef _MSC_VER+    __asm pushfd;+    __asm pop EAX;+    __asm mov EDX, EAX;+    __asm xor EAX, flag;+    __asm push EAX;+    __asm popfd;+    __asm pushfd;+    __asm pop EAX;+    __asm xor EAX, EDX;+    __asm push EDX;+    __asm popfd;+    __asm and flag, EAX;+#else+    __asm__ __volatile__(+        "pushf\n\t"+        "pop  %%EAX\n\t"+        "movl %%EAX,%%EDX\n\t"+        "xorl %0,%%EAX\n\t"+        "push %%EAX\n\t"+        "popf\n\t"+        "pushf\n\t"+        "pop  %%EAX\n\t"+        "xorl %%EDX,%%EAX\n\t"+        "push %%EDX\n\t"+        "popf\n\t"+        "andl %%EAX, %0\n\t"+        : "=c"(flag)+        : "c"(flag)+        : "%eax", "%edx");+#endif+    return flag;+}+#define CHECK_CPUID_IS_SUPPORTED                            \+    if (CheckFlag(1 << 18) == 0 || CheckFlag(1 << 21) == 0) \+        return False;+#else+#define CHECK_CPUID_IS_SUPPORTED+#endif++#ifndef USE_ASM+#ifdef _MSC_VER+#if _MSC_VER >= 1600+#define MY__cpuidex __cpuidex+#else++/*+ __cpuid (function == 4) requires subfunction number in ECX.+  MSDN: The __cpuid intrinsic clears the ECX register before calling the cpuid instruction.+   __cpuid() in new MSVC clears ECX.+   __cpuid() in old MSVC (14.00) doesn't clear ECX+ We still can use __cpuid for low (function) values that don't require ECX,+ but __cpuid() in old MSVC will be incorrect for some function values: (function == 4).+ So here we use the hack for old MSVC to send (subFunction) in ECX register to cpuid instruction,+ where ECX value is first parameter for FAST_CALL / NO_INLINE function,+ So the caller of MY__cpuidex_HACK() sets ECX as subFunction, and+ old MSVC for __cpuid() doesn't change ECX and cpuid instruction gets (subFunction) value.++ DON'T remove MY_NO_INLINE and MY_FAST_CALL for MY__cpuidex_HACK() !!!+*/++static MY_NO_INLINE void MY_FAST_CALL MY__cpuidex_HACK(UInt32 subFunction, int *CPUInfo, UInt32 function)+{+    UNUSED_VAR(subFunction);+    __cpuid(CPUInfo, function);+}++#define MY__cpuidex(info, func, func2) MY__cpuidex_HACK(func2, info, func)+#pragma message("======== MY__cpuidex_HACK WAS USED ========")+#endif+#else+#define MY__cpuidex(info, func, func2) __cpuid(info, func)+#pragma message("======== (INCORRECT ?) cpuid WAS USED ========")+#endif+#endif++void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d)+{+#ifdef USE_ASM++#ifdef _MSC_VER++    UInt32 a2, b2, c2, d2;+    __asm xor EBX, EBX;+    __asm xor ECX, ECX;+    __asm xor EDX, EDX;+    __asm mov EAX, function;+    __asm cpuid;+    __asm mov a2, EAX;+    __asm mov b2, EBX;+    __asm mov c2, ECX;+    __asm mov d2, EDX;++    *a = a2;+    *b = b2;+    *c = c2;+    *d = d2;++#else++    __asm__ __volatile__(+#if defined(MY_CPU_AMD64) && defined(__PIC__)+        "mov %%rbx, %%rdi;"+        "cpuid;"+        "xchg %%rbx, %%rdi;"+        : "=a"(*a),+          "=D"(*b),+#elif defined(MY_CPU_X86) && defined(__PIC__)+        "mov %%ebx, %%edi;"+        "cpuid;"+        "xchgl %%ebx, %%edi;"+        : "=a"(*a),+          "=D"(*b),+#else+        "cpuid"+        : "=a"(*a),+          "=b"(*b),+#endif+          "=c"(*c),+          "=d"(*d)+        : "0"(function), "c"(0));++#endif++#else++    int CPUInfo[4];++    MY__cpuidex(CPUInfo, (int)function, 0);++    *a = (UInt32)CPUInfo[0];+    *b = (UInt32)CPUInfo[1];+    *c = (UInt32)CPUInfo[2];+    *d = (UInt32)CPUInfo[3];++#endif+}++BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p)+{+    CHECK_CPUID_IS_SUPPORTED+    MyCPUID(0, &p->maxFunc, &p->vendor[0], &p->vendor[2], &p->vendor[1]);+    MyCPUID(1, &p->ver, &p->b, &p->c, &p->d);+    return True;+}++static const UInt32 kVendors[][3] =+    {+        {0x756E6547, 0x49656E69, 0x6C65746E},+        {0x68747541, 0x69746E65, 0x444D4163},+        {0x746E6543, 0x48727561, 0x736C7561}};++int x86cpuid_GetFirm(const Cx86cpuid *p)+{+    unsigned i;+    for (i = 0; i < sizeof(kVendors) / sizeof(kVendors[i]); i++)+    {+        const UInt32 *v = kVendors[i];+        if (v[0] == p->vendor[0] &&+            v[1] == p->vendor[1] &&+            v[2] == p->vendor[2])+            return (int)i;+    }+    return -1;+}++BoolInt CPU_Is_InOrder()+{+    Cx86cpuid p;+    int firm;+    UInt32 family, model;+    if (!x86cpuid_CheckAndRead(&p))+        return True;++    family = x86cpuid_GetFamily(p.ver);+    model = x86cpuid_GetModel(p.ver);++    firm = x86cpuid_GetFirm(&p);++    switch (firm)+    {+    case CPU_FIRM_INTEL:+        return (family < 6 || (family == 6 && (+                                                  /* In-Order Atom CPU */+                                                  model == 0x1C    /* 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 */+                                                  || model == 0x26 /* 45 nm, Z6xx */+                                                  || model == 0x27 /* 32 nm, Z2460 */+                                                  || model == 0x35 /* 32 nm, Z2760 */+                                                  || model == 0x36 /* 32 nm, N2xxx, D2xxx */+                                                  )));+    case CPU_FIRM_AMD:+        return (family < 5 || (family == 5 && (model < 6 || model == 0xA)));+    case CPU_FIRM_VIA:+        return (family < 6 || (family == 6 && model < 0xF));+    }+    return True;+}++#if !defined(MY_CPU_AMD64) && defined(_WIN32)+#include <Windows.h>+static BoolInt CPU_Sys_Is_SSE_Supported()+{+    OSVERSIONINFO vi;+    vi.dwOSVersionInfoSize = sizeof(vi);+    if (!GetVersionEx(&vi))+        return False;+    return (vi.dwMajorVersion >= 5);+}+#define CHECK_SYS_SSE_SUPPORT        \+    if (!CPU_Sys_Is_SSE_Supported()) \+        return False;+#else+#define CHECK_SYS_SSE_SUPPORT+#endif++static UInt32 X86_CPUID_ECX_Get_Flags()+{+    Cx86cpuid p;+    CHECK_SYS_SSE_SUPPORT+    if (!x86cpuid_CheckAndRead(&p))+        return 0;+    return p.c;+}++BoolInt CPU_IsSupported_AES()+{+    return (X86_CPUID_ECX_Get_Flags() >> 25) & 1;+}++BoolInt CPU_IsSupported_SSSE3()+{+    return (X86_CPUID_ECX_Get_Flags() >> 9) & 1;+}++BoolInt CPU_IsSupported_SSE41()+{+    return (X86_CPUID_ECX_Get_Flags() >> 19) & 1;+}++BoolInt CPU_IsSupported_SHA()+{+    Cx86cpuid p;+    CHECK_SYS_SSE_SUPPORT+    if (!x86cpuid_CheckAndRead(&p))+        return False;++    if (p.maxFunc < 7)+        return False;+    {+        UInt32 d[4] = {0};+        MyCPUID(7, &d[0], &d[1], &d[2], &d[3]);+        return (d[1] >> 29) & 1;+    }+}++// #include <stdio.h>++#ifdef _WIN32+#include <Windows.h>+#endif++BoolInt CPU_IsSupported_AVX2()+{+    Cx86cpuid p;+    CHECK_SYS_SSE_SUPPORT++#ifdef _WIN32+#define MY__PF_XSAVE_ENABLED 17+    if (!IsProcessorFeaturePresent(MY__PF_XSAVE_ENABLED))+        return False;+#endif++    if (!x86cpuid_CheckAndRead(&p))+        return False;+    if (p.maxFunc < 7)+        return False;+    {+        UInt32 d[4] = {0};+        MyCPUID(7, &d[0], &d[1], &d[2], &d[3]);+        // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]);+        return 1 & (d[1] >> 5); // avx2+    }+}++BoolInt CPU_IsSupported_VAES_AVX2()+{+    Cx86cpuid p;+    CHECK_SYS_SSE_SUPPORT++#ifdef _WIN32+#define MY__PF_XSAVE_ENABLED 17+    if (!IsProcessorFeaturePresent(MY__PF_XSAVE_ENABLED))+        return False;+#endif++    if (!x86cpuid_CheckAndRead(&p))+        return False;+    if (p.maxFunc < 7)+        return False;+    {+        UInt32 d[4] = {0};+        MyCPUID(7, &d[0], &d[1], &d[2], &d[3]);+        // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]);+        return 1 & (d[1] >> 5) // avx2+                               // & (d[1] >> 31) // avx512vl+               & (d[2] >> 9); // vaes // VEX-256/EVEX+    }+}++BoolInt CPU_IsSupported_PageGB()+{+    Cx86cpuid cpuid;+    if (!x86cpuid_CheckAndRead(&cpuid))+        return False;+    {+        UInt32 d[4] = {0};+        MyCPUID(0x80000000, &d[0], &d[1], &d[2], &d[3]);+        if (d[0] < 0x80000001)+            return False;+    }+    {+        UInt32 d[4] = {0};+        MyCPUID(0x80000001, &d[0], &d[1], &d[2], &d[3]);+        return (d[3] >> 26) & 1;+    }+}++#elif defined(MY_CPU_ARM_OR_ARM64)++#ifdef _WIN32++#include <Windows.h>++BoolInt CPU_IsSupported_CRC32()+{+    return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) ? 1 : 0;+}+BoolInt CPU_IsSupported_CRYPTO()+{+    return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) ? 1 : 0;+}+BoolInt CPU_IsSupported_NEON()+{+    return IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) ? 1 : 0;+}++#else++#if defined(__APPLE__)++/*+#include <stdio.h>+#include <string.h>+static void Print_sysctlbyname(const char *name)+{+  size_t bufSize = 256;+  char buf[256];+  int res = sysctlbyname(name, &buf, &bufSize, NULL, 0);+  {+    int i;+    printf("\nres = %d : %s : '%s' : bufSize = %d, numeric", res, name, buf, (unsigned)bufSize);+    for (i = 0; i < 20; i++)+      printf(" %2x", (unsigned)(Byte)buf[i]);++  }+}+*/++static BoolInt My_sysctlbyname_Get_BoolInt(const char *name)+{+    UInt32 val = 0;+    if (My_sysctlbyname_Get_UInt32(name, &val) == 0 && val == 1)+        return 1;+    return 0;+}++/*+Print_sysctlbyname("hw.pagesize");+Print_sysctlbyname("machdep.cpu.brand_string");+*/++BoolInt CPU_IsSupported_CRC32(void)+{+    return My_sysctlbyname_Get_BoolInt("hw.optional.armv8_crc32");+}++BoolInt CPU_IsSupported_NEON(void)+{+    return My_sysctlbyname_Get_BoolInt("hw.optional.neon");+}++#ifdef MY_CPU_ARM64+#define APPLE_CRYPTO_SUPPORT_VAL 1+#else+#define APPLE_CRYPTO_SUPPORT_VAL 0+#endif++BoolInt CPU_IsSupported_SHA1(void)+{+    return APPLE_CRYPTO_SUPPORT_VAL;+}+BoolInt CPU_IsSupported_SHA2(void)+{+    return APPLE_CRYPTO_SUPPORT_VAL;+}+BoolInt CPU_IsSupported_AES(void)+{+    return APPLE_CRYPTO_SUPPORT_VAL;+}++#else // __APPLE__++#include <sys/auxv.h>++// Don't use asm/hwcap.h, it does not seem to exist on all platforms.+// #define USE_HWCAP++#ifdef USE_HWCAP++#include <asm/hwcap.h>++#define MY_HWCAP_CHECK_FUNC_2(name1, name2)                     \+    BoolInt CPU_IsSupported_##name1()                           \+    {                                                           \+        return (getauxval(AT_HWCAP) & (HWCAP_##name2)) ? 1 : 0; \+    }++#ifdef MY_CPU_ARM64+#define MY_HWCAP_CHECK_FUNC(name) \+    MY_HWCAP_CHECK_FUNC_2(name, name)+MY_HWCAP_CHECK_FUNC_2(NEON, ASIMD)+// MY_HWCAP_CHECK_FUNC (ASIMD)+#elif defined(MY_CPU_ARM)+#define MY_HWCAP_CHECK_FUNC(name)                                \+    BoolInt CPU_IsSupported_##name()                             \+    {                                                            \+        return (getauxval(AT_HWCAP2) & (HWCAP2_##name)) ? 1 : 0; \+    }+MY_HWCAP_CHECK_FUNC_2(NEON, NEON)+#endif++#else // USE_HWCAP++#define MY_HWCAP_CHECK_FUNC(name)    \+    BoolInt CPU_IsSupported_##name() \+    {                                \+        return 0;                    \+    }+MY_HWCAP_CHECK_FUNC(NEON)++#endif // USE_HWCAP++MY_HWCAP_CHECK_FUNC(CRC32)+MY_HWCAP_CHECK_FUNC(SHA1)+MY_HWCAP_CHECK_FUNC(SHA2)+MY_HWCAP_CHECK_FUNC(AES)++#endif // __APPLE__+#endif // _WIN32++#endif // MY_CPU_ARM_OR_ARM64++#ifdef __APPLE__++#include <sys/sysctl.h>++int My_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize)+{+    return sysctlbyname(name, buf, bufSize, NULL, 0);+}++int My_sysctlbyname_Get_UInt32(const char *name, UInt32 *val)+{+    size_t bufSize = sizeof(*val);+    int res = My_sysctlbyname_Get(name, val, &bufSize);+    if (res == 0 && bufSize != sizeof(*val))+        return EFAULT;+    return res;+}++#endif++/* LzFind.h -- Match finder for LZ algorithms+2021-07-13 : Igor Pavlov : Public domain */++#ifndef __LZ_FIND_H+#define __LZ_FIND_H++EXTERN_C_BEGIN++typedef UInt32 CLzRef;++typedef struct _CMatchFinder+{+    Byte *buffer;+    UInt32 pos;+    UInt32 posLimit;+    UInt32 streamPos; /* wrap over Zero is allowed (streamPos < pos). Use (UInt32)(streamPos - pos) */+    UInt32 lenLimit;++    UInt32 cyclicBufferPos;+    UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */++    Byte streamEndWasReached;+    Byte btMode;+    Byte bigHash;+    Byte directInput;++    UInt32 matchMaxLen;+    CLzRef *hash;+    CLzRef *son;+    UInt32 hashMask;+    UInt32 cutValue;++    Byte *bufferBase;+    ISeqInStream *stream;++    UInt32 blockSize;+    UInt32 keepSizeBefore;+    UInt32 keepSizeAfter;++    UInt32 numHashBytes;+    size_t directInputRem;+    UInt32 historySize;+    UInt32 fixedHashSize;+    UInt32 hashSizeSum;+    SRes result;+    UInt32 crc[256];+    size_t numRefs;++    UInt64 expectedDataSize;+} CMatchFinder;++#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((const Byte *)(p)->buffer)++#define Inline_MatchFinder_GetNumAvailableBytes(p) ((UInt32)((p)->streamPos - (p)->pos))++/*+#define Inline_MatchFinder_IsFinishedOK(p) \+    ((p)->streamEndWasReached \+        && (p)->streamPos == (p)->pos \+        && (!(p)->directInput || (p)->directInputRem == 0))+*/++int MatchFinder_NeedMove(CMatchFinder *p);+/* Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); */+void MatchFinder_MoveBlock(CMatchFinder *p);+void MatchFinder_ReadIfRequired(CMatchFinder *p);++void MatchFinder_Construct(CMatchFinder *p);++/* Conditions:+     historySize <= 3 GB+     keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB+*/+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,+                       UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,+                       ISzAllocPtr alloc);+void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc);+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems);+// void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);++/*+#define Inline_MatchFinder_InitPos(p, val) \+    (p)->pos = (val); \+    (p)->streamPos = (val);+*/++#define Inline_MatchFinder_ReduceOffsets(p, subValue) \+    (p)->pos -= (subValue);                           \+    (p)->streamPos -= (subValue);++UInt32 *GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,+                        size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,+                        UInt32 *distances, UInt32 maxLen);++/*+Conditions:+  Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.+  Mf_GetPointerToCurrentPos_Func's result must be used only before any other function+*/++typedef void (*Mf_Init_Func)(void *object);+typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object);+typedef const Byte *(*Mf_GetPointerToCurrentPos_Func)(void *object);+typedef UInt32 *(*Mf_GetMatches_Func)(void *object, UInt32 *distances);+typedef void (*Mf_Skip_Func)(void *object, UInt32);++typedef struct _IMatchFinder+{+    Mf_Init_Func Init;+    Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;+    Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;+    Mf_GetMatches_Func GetMatches;+    Mf_Skip_Func Skip;+} IMatchFinder2;++void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder2 *vTable);++void MatchFinder_Init_LowHash(CMatchFinder *p);+void MatchFinder_Init_HighHash(CMatchFinder *p);+void MatchFinder_Init_4(CMatchFinder *p);+void MatchFinder_Init(CMatchFinder *p);++UInt32 *Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);+UInt32 *Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);++void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);++void LzFindPrepare(void);++EXTERN_C_END++#endif++/* LzFindOpt.c -- multithreaded Match finder for LZ algorithms+2021-07-13 : Igor Pavlov : Public domain */++// #include "LzFindMt.h"++// #define LOG_ITERS++// #define LOG_THREAD++#ifdef LOG_THREAD+#include <stdio.h>+#define PRF(x) x+#else+#define PRF(x)+#endif++#ifdef LOG_ITERS+#include <stdio.h>+UInt64 g_NumIters_Tree;+UInt64 g_NumIters_Loop;+UInt64 g_NumIters_Bytes;+#define LOG_ITER(x) x+#else+#define LOG_ITER(x)+#endif++// ---------- BT THREAD ----------++#define USE_SON_PREFETCH+#define USE_LONG_MATCH_OPT++#define kEmptyHashValue 0++UInt32 *MY_FAST_CALL GetMatchesSpecN_2(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son,+                                       UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size,+                                       size_t _cyclicBufferPos, UInt32 _cyclicBufferSize,+                                       UInt32 *posRes);++MY_NO_INLINE+UInt32 *MY_FAST_CALL GetMatchesSpecN_2(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son,+                                       UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size,+                                       size_t _cyclicBufferPos, UInt32 _cyclicBufferSize,+                                       UInt32 *posRes)+{+    do // while (hash != size)+    {+        UInt32 delta;++#ifndef cbs+        UInt32 cbs;+#endif++        if (hash == size)+            break;++        delta = *hash++;++        if (delta == 0)+            return NULL;++        lenLimit++;++#ifndef cbs+        cbs = _cyclicBufferSize;+        if ((UInt32)pos < cbs)+        {+            if (delta > (UInt32)pos)+                return NULL;+            cbs = (UInt32)pos;+        }+#endif++        if (delta >= cbs)+        {+            CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1);+            *d++ = 0;+            ptr1[0] = kEmptyHashValue;+            ptr1[1] = kEmptyHashValue;+        }+        else+        {+            UInt32 *_distances = ++d;++            CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1;+            CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1);++            UInt32 cutValue = _cutValue;+            const Byte *len0 = cur, *len1 = cur;+            const Byte *maxLen = cur + _maxLen;++            // if (cutValue == 0) { *ptr0 = *ptr1 = kEmptyHashValue; } else+            for (LOG_ITER(g_NumIters_Tree++);;)+            {+                LOG_ITER(g_NumIters_Loop++);+                {+                    // SPEC code+                    CLzRef *pair = son + ((size_t)((ptrdiff_t)_cyclicBufferPos - (ptrdiff_t)delta + (ptrdiff_t)(UInt32)(_cyclicBufferPos < delta ? cbs : 0)) << 1);++                    const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)delta;+                    const Byte *len = (len0 < len1 ? len0 : len1);++#ifdef USE_SON_PREFETCH+                    const UInt32 pair0 = *pair;+#endif++                    if (len[diff] == len[0])+                    {+                        if (++len != lenLimit && len[diff] == len[0])+                            while (++len != lenLimit)+                            {+                                LOG_ITER(g_NumIters_Bytes++);+                                if (len[diff] != len[0])+                                    break;+                            }+                        if (maxLen < len)+                        {+                            maxLen = len;+                            *d++ = (UInt32)(len - cur);+                            *d++ = delta - 1;++                            if (len == lenLimit)+                            {+                                const UInt32 pair1 = pair[1];+                                *ptr1 =+#ifdef USE_SON_PREFETCH+                                    pair0;+#else+                                    pair[0];+#endif+                                *ptr0 = pair1;++                                _distances[-1] = (UInt32)(d - _distances);++#ifdef USE_LONG_MATCH_OPT++                                if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit)+                                    break;++                                {+                                    for (;;)+                                    {+                                        *d++ = 2;+                                        *d++ = (UInt32)(lenLimit - cur);+                                        *d++ = delta - 1;+                                        cur++;+                                        lenLimit++;+                                        // SPEC+                                        _cyclicBufferPos++;+                                        {+                                            // SPEC code+                                            CLzRef *dest = son + ((size_t)(_cyclicBufferPos) << 1);+                                            const CLzRef *src = dest + ((diff + (ptrdiff_t)(UInt32)((_cyclicBufferPos < delta) ? cbs : 0)) << 1);+// CLzRef *ptr = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2;+#if 0+                                            *(UInt64 *)(void *)dest = *((const UInt64 *)(const void *)src);+#else+                                            const UInt32 p0 = src[0];+                                            const UInt32 p1 = src[1];+                                            dest[0] = p0;+                                            dest[1] = p1;+#endif+                                        }+                                        pos++;+                                        hash++;+                                        if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit)+                                            break;+                                    } // for() end for long matches+                                }+#endif++                                break; // break from TREE iterations+                            }+                        }+                    }+                    {+                        const UInt32 curMatch = (UInt32)pos - delta; // (UInt32)(pos + diff);+                        if (len[diff] < len[0])+                        {+                            delta = pair[1];+                            *ptr1 = curMatch;+                            ptr1 = pair + 1;+                            len1 = len;+                            if (delta >= curMatch)+                                return NULL;+                        }+                        else+                        {+                            delta = *pair;+                            *ptr0 = curMatch;+                            ptr0 = pair;+                            len0 = len;+                            if (delta >= curMatch)+                                return NULL;+                        }+                        delta = (UInt32)pos - delta;++                        if (--cutValue == 0 || delta >= cbs)+                        {+                            *ptr0 = *ptr1 = kEmptyHashValue;+                            _distances[-1] = (UInt32)(d - _distances);+                            break;+                        }+                    }+                }+            } // for (tree iterations)+        }+        pos++;+        _cyclicBufferPos++;+        cur++;+    } while (d < limit);+    *posRes = (UInt32)pos;+    return d;+}++/* LzFind.c -- Match finder for LZ algorithms+2021-11-29 : Igor Pavlov : Public domain */++#include <string.h>+// #include <stdio.h>++/* LzHash.h -- HASH functions for LZ algorithms+2019-10-30 : Igor Pavlov : Public domain */++#ifndef __LZ_HASH_H+#define __LZ_HASH_H++/*+  (kHash2Size >= (1 <<  8)) : Required+  (kHash3Size >= (1 << 16)) : Required+*/++#define kHash2Size (1 << 10)+#define kHash3Size (1 << 16)+// #define kHash4Size (1 << 20)++#define kFix3HashSize (kHash2Size)+#define kFix4HashSize (kHash2Size + kHash3Size)+// #define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)++/*+  We use up to 3 crc values for hash:+    crc0+    crc1 << Shift_1+    crc2 << Shift_2+  (Shift_1 = 5) and (Shift_2 = 10) is good tradeoff.+  Small values for Shift are not good for collision rate.+  Big value for Shift_2 increases the minimum size+  of hash table, that will be slow for small files.+*/++#define kLzHash_CrcShift_1 5+#define kLzHash_CrcShift_2 10++#endif++#define kBlockMoveAlign (1 << 7)       // alignment for memmove()+#define kBlockSizeAlign (1 << 16)      // alignment for block allocation+#define kBlockSizeReserveMin (1 << 24) // it's 1/256 from 4 GB dictinary++#define kEmptyHashValue 0++#define kMaxValForNormalize ((UInt32)0)+// #define kMaxValForNormalize ((UInt32)(1 << 20) + 0xFFF) // for debug++// #define kNormalizeAlign (1 << 7) // alignment for speculated accesses++#define GET_AVAIL_BYTES(p) \+    Inline_MatchFinder_GetNumAvailableBytes(p)++// #define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)+#define kFix5HashSize kFix4HashSize++/*+ HASH2_CALC:+   if (hv) match, then cur[0] and cur[1] also match+*/+#define HASH2_CALC hv = GetUi16(cur);++// (crc[0 ... 255] & 0xFF) provides one-to-one correspondence to [0 ... 255]++/*+ HASH3_CALC:+   if (cur[0]) and (h2) match, then cur[1]            also match+   if (cur[0]) and (hv) match, then cur[1] and cur[2] also match+*/+#define HASH3_CALC                                         \+    {                                                      \+        UInt32 temp = p->crc[cur[0]] ^ cur[1];             \+        h2 = temp & (kHash2Size - 1);                      \+        hv = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; \+    }++#define HASH4_CALC                                                          \+    {                                                                       \+        UInt32 temp = p->crc[cur[0]] ^ cur[1];                              \+        h2 = temp & (kHash2Size - 1);                                       \+        temp ^= ((UInt32)cur[2] << 8);                                      \+        h3 = temp & (kHash3Size - 1);                                       \+        hv = (temp ^ (p->crc[cur[3]] << kLzHash_CrcShift_1)) & p->hashMask; \+    }++#define HASH5_CALC                                                          \+    {                                                                       \+        UInt32 temp = p->crc[cur[0]] ^ cur[1];                              \+        h2 = temp & (kHash2Size - 1);                                       \+        temp ^= ((UInt32)cur[2] << 8);                                      \+        h3 = temp & (kHash3Size - 1);                                       \+        temp ^= (p->crc[cur[3]] << kLzHash_CrcShift_1);                     \+        /* h4 = temp & p->hash4Mask; */ /* (kHash4Size - 1); */             \+        hv = (temp ^ (p->crc[cur[4]] << kLzHash_CrcShift_2)) & p->hashMask; \+    }++#define HASH_ZIP_CALC hv = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF;++static void LzInWindow_Free(CMatchFinder *p, ISzAllocPtr alloc)+{+    if (!p->directInput)+    {+        ISzAlloc_Free(alloc, p->bufferBase);+        p->bufferBase = NULL;+    }+}++static int LzInWindow_Create2(CMatchFinder *p, UInt32 blockSize, ISzAllocPtr alloc)+{+    if (blockSize == 0)+        return 0;+    if (!p->bufferBase || p->blockSize != blockSize)+    {+        // size_t blockSizeT;+        LzInWindow_Free(p, alloc);+        p->blockSize = blockSize;+        // blockSizeT = blockSize;++        // printf("\nblockSize = 0x%x\n", blockSize);+        /*+        #if defined _WIN64+        // we can allocate 4GiB, but still use UInt32 for (p->blockSize)+        // we use UInt32 type for (p->blockSize), because+        // we don't want to wrap over 4 GiB,+        // when we use (p->streamPos - p->pos) that is UInt32.+        if (blockSize >= (UInt32)0 - (UInt32)kBlockSizeAlign)+        {+          blockSizeT = ((size_t)1 << 32);+          printf("\nchanged to blockSizeT = 4GiB\n");+        }+        #endif+        */++        p->bufferBase = (Byte *)ISzAlloc_Alloc(alloc, blockSize);+        // printf("\nbufferBase = %p\n", p->bufferBase);+        // return 0; // for debug+    }+    return (p->bufferBase != NULL);+}++static const Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p)+{+    return p->buffer;+}++static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p)+{+    return GET_AVAIL_BYTES(p);+}++MY_NO_INLINE+static void MatchFinder_ReadBlock(CMatchFinder *p)+{+    if (p->streamEndWasReached || p->result != SZ_OK)+        return;++    /* We use (p->streamPos - p->pos) value.+       (p->streamPos < p->pos) is allowed. */++    if (p->directInput)+    {+        UInt32 curSize = 0xFFFFFFFF - GET_AVAIL_BYTES(p);+        if (curSize > p->directInputRem)+            curSize = (UInt32)p->directInputRem;+        p->directInputRem -= curSize;+        p->streamPos += curSize;+        if (p->directInputRem == 0)+            p->streamEndWasReached = 1;+        return;+    }++    for (;;)+    {+        Byte *dest = p->buffer + GET_AVAIL_BYTES(p);+        size_t size = (size_t)(p->bufferBase + p->blockSize - dest);+        if (size == 0)+        {+            /* we call ReadBlock() after NeedMove() and MoveBlock().+               NeedMove() and MoveBlock() povide more than (keepSizeAfter)+               to the end of (blockSize).+               So we don't execute this branch in normal code flow.+               We can go here, if we will call ReadBlock() before NeedMove(), MoveBlock().+            */+            // p->result = SZ_ERROR_FAIL; // we can show error here+            return;+        }++        // #define kRead 3+        // if (size > kRead) size = kRead; // for debug++        p->result = ISeqInStream_Read(p->stream, dest, &size);+        if (p->result != SZ_OK)+            return;+        if (size == 0)+        {+            p->streamEndWasReached = 1;+            return;+        }+        p->streamPos += (UInt32)size;+        if (GET_AVAIL_BYTES(p) > p->keepSizeAfter)+            return;+        /* here and in another (p->keepSizeAfter) checks we keep on 1 byte more than was requested by Create() function+             (GET_AVAIL_BYTES(p) >= p->keepSizeAfter) - minimal required size */+    }++    // on exit: (p->result != SZ_OK || p->streamEndWasReached || GET_AVAIL_BYTES(p) > p->keepSizeAfter)+}++MY_NO_INLINE+void MatchFinder_MoveBlock(CMatchFinder *p)+{+    const size_t offset = (size_t)(p->buffer - p->bufferBase) - p->keepSizeBefore;+    const size_t keepBefore = (offset & (kBlockMoveAlign - 1)) + p->keepSizeBefore;+    p->buffer = p->bufferBase + keepBefore;+    memmove(p->bufferBase,+            p->bufferBase + (offset & ~((size_t)kBlockMoveAlign - 1)),+            keepBefore + (size_t)GET_AVAIL_BYTES(p));+}++/* We call MoveBlock() before ReadBlock().+   So MoveBlock() can be wasteful operation, if the whole input data+   can fit in current block even without calling MoveBlock().+   in important case where (dataSize <= historySize)+     condition (p->blockSize > dataSize + p->keepSizeAfter) is met+     So there is no MoveBlock() in that case case.+*/++int MatchFinder_NeedMove(CMatchFinder *p)+{+    if (p->directInput)+        return 0;+    if (p->streamEndWasReached || p->result != SZ_OK)+        return 0;+    return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);+}++void MatchFinder_ReadIfRequired(CMatchFinder *p)+{+    if (p->keepSizeAfter >= GET_AVAIL_BYTES(p))+        MatchFinder_ReadBlock(p);+}++static void MatchFinder_SetDefaultSettings(CMatchFinder *p)+{+    p->cutValue = 32;+    p->btMode = 1;+    p->numHashBytes = 4;+    p->bigHash = 0;+}++#define kCrcPoly 0xEDB88320++void MatchFinder_Construct(CMatchFinder *p)+{+    unsigned i;+    p->bufferBase = NULL;+    p->directInput = 0;+    p->hash = NULL;+    p->expectedDataSize = (UInt64)(Int64)-1;+    MatchFinder_SetDefaultSettings(p);++    for (i = 0; i < 256; i++)+    {+        UInt32 r = (UInt32)i;+        unsigned j;+        for (j = 0; j < 8; j++)+            r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1)));+        p->crc[i] = r;+    }+}++static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAllocPtr alloc)+{+    ISzAlloc_Free(alloc, p->hash);+    p->hash = NULL;+}++void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc)+{+    MatchFinder_FreeThisClassMemory(p, alloc);+    LzInWindow_Free(p, alloc);+}++static CLzRef *AllocRefs(size_t num, ISzAllocPtr alloc)+{+    size_t sizeInBytes = (size_t)num * sizeof(CLzRef);+    if (sizeInBytes / sizeof(CLzRef) != num)+        return NULL;+    return (CLzRef *)ISzAlloc_Alloc(alloc, sizeInBytes);+}++#if (kBlockSizeReserveMin < kBlockSizeAlign * 2)+#error Stop_Compiling_Bad_Reserve+#endif++static UInt32 GetBlockSize(CMatchFinder *p, UInt32 historySize)+{+    UInt32 blockSize = (p->keepSizeBefore + p->keepSizeAfter);+    /*+    if (historySize > kMaxHistorySize)+      return 0;+    */+    // printf("\nhistorySize == 0x%x\n", historySize);++    if (p->keepSizeBefore < historySize || blockSize < p->keepSizeBefore) // if 32-bit overflow+        return 0;++    {+        const UInt32 kBlockSizeMax = (UInt32)0 - (UInt32)kBlockSizeAlign;+        const UInt32 rem = kBlockSizeMax - blockSize;+        const UInt32 reserve = (blockSize >> (blockSize < ((UInt32)1 << 30) ? 1 : 2)) + (1 << 12) + kBlockMoveAlign + kBlockSizeAlign; // do not overflow 32-bit here+        if (blockSize >= kBlockSizeMax || rem < kBlockSizeReserveMin)                                                                  // we reject settings that will be slow+            return 0;+        if (reserve >= rem)+            blockSize = kBlockSizeMax;+        else+        {+            blockSize += reserve;+            blockSize &= ~(UInt32)(kBlockSizeAlign - 1);+        }+    }+    // printf("\n LzFind_blockSize = %x\n", blockSize);+    // printf("\n LzFind_blockSize = %d\n", blockSize >> 20);+    return blockSize;+}++int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,+                       UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,+                       ISzAllocPtr alloc)+{+    /* we need one additional byte in (p->keepSizeBefore),+       since we use MoveBlock() after (p->pos++) and before dictionary using */+    // keepAddBufferBefore = (UInt32)0xFFFFFFFF - (1 << 22); // for debug+    p->keepSizeBefore = historySize + keepAddBufferBefore + 1;++    keepAddBufferAfter += matchMaxLen;+    /* we need (p->keepSizeAfter >= p->numHashBytes) */+    if (keepAddBufferAfter < p->numHashBytes)+        keepAddBufferAfter = p->numHashBytes;+    // keepAddBufferAfter -= 2; // for debug+    p->keepSizeAfter = keepAddBufferAfter;++    if (p->directInput)+        p->blockSize = 0;+    if (p->directInput || LzInWindow_Create2(p, GetBlockSize(p, historySize), alloc))+    {+        const UInt32 newCyclicBufferSize = historySize + 1; // do not change it+        UInt32 hs;+        p->matchMaxLen = matchMaxLen;+        {+            // UInt32 hs4;+            p->fixedHashSize = 0;+            hs = (1 << 16) - 1;+            if (p->numHashBytes != 2)+            {+                hs = historySize;+                if (hs > p->expectedDataSize)+                    hs = (UInt32)p->expectedDataSize;+                if (hs != 0)+                    hs--;+                hs |= (hs >> 1);+                hs |= (hs >> 2);+                hs |= (hs >> 4);+                hs |= (hs >> 8);+                // we propagated 16 bits in (hs). Low 16 bits must be set later+                hs >>= 1;+                if (hs >= (1 << 24))+                {+                    if (p->numHashBytes == 3)+                        hs = (1 << 24) - 1;+                    else+                        hs >>= 1;+                    /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */+                }++                // hs = ((UInt32)1 << 25) - 1; // for test++                // (hash_size >= (1 << 16)) : Required for (numHashBytes > 2)+                hs |= (1 << 16) - 1; /* don't change it! */++                // bt5: we adjust the size with recommended minimum size+                if (p->numHashBytes >= 5)+                    hs |= (256 << kLzHash_CrcShift_2) - 1;+            }+            p->hashMask = hs;+            hs++;++            /*+            hs4 = (1 << 20);+            if (hs4 > hs)+              hs4 = hs;+            // hs4 = (1 << 16); // for test+            p->hash4Mask = hs4 - 1;+            */++            if (p->numHashBytes > 2)+                p->fixedHashSize += kHash2Size;+            if (p->numHashBytes > 3)+                p->fixedHashSize += kHash3Size;+            // if (p->numHashBytes > 4) p->fixedHashSize += hs4; // kHash4Size;+            hs += p->fixedHashSize;+        }++        {+            size_t newSize;+            size_t numSons;+            p->historySize = historySize;+            p->hashSizeSum = hs;+            p->cyclicBufferSize = newCyclicBufferSize; // it must be = (historySize + 1)++            numSons = newCyclicBufferSize;+            if (p->btMode)+                numSons <<= 1;+            newSize = hs + numSons;++// aligned size is not required here, but it can be better for some loops+#define NUM_REFS_ALIGN_MASK 0xF+            newSize = (newSize + NUM_REFS_ALIGN_MASK) & ~(size_t)NUM_REFS_ALIGN_MASK;++            if (p->hash && p->numRefs == newSize)+                return 1;++            MatchFinder_FreeThisClassMemory(p, alloc);+            p->numRefs = newSize;+            p->hash = AllocRefs(newSize, alloc);++            if (p->hash)+            {+                p->son = p->hash + p->hashSizeSum;+                return 1;+            }+        }+    }++    MatchFinder_Free(p, alloc);+    return 0;+}++static void MatchFinder_SetLimits(CMatchFinder *p)+{+    UInt32 k;+    UInt32 n = kMaxValForNormalize - p->pos;+    if (n == 0)+        n = (UInt32)(Int32)-1; // we allow (pos == 0) at start even with (kMaxValForNormalize == 0)++    k = p->cyclicBufferSize - p->cyclicBufferPos;+    if (k < n)+        n = k;++    k = GET_AVAIL_BYTES(p);+    {+        const UInt32 ksa = p->keepSizeAfter;+        UInt32 mm = p->matchMaxLen;+        if (k > ksa)+            k -= ksa; // we must limit exactly to keepSizeAfter for ReadBlock+        else if (k >= mm)+        {+            // the limitation for (p->lenLimit) update+            k -= mm; // optimization : to reduce the number of checks+            k++;+            // k = 1; // non-optimized version : for debug+        }+        else+        {+            mm = k;+            if (k != 0)+                k = 1;+        }+        p->lenLimit = mm;+    }+    if (k < n)+        n = k;++    p->posLimit = p->pos + n;+}++void MatchFinder_Init_LowHash(CMatchFinder *p)+{+    size_t i;+    CLzRef *items = p->hash;+    const size_t numItems = p->fixedHashSize;+    for (i = 0; i < numItems; i++)+        items[i] = kEmptyHashValue;+}++void MatchFinder_Init_HighHash(CMatchFinder *p)+{+    size_t i;+    CLzRef *items = p->hash + p->fixedHashSize;+    const size_t numItems = (size_t)p->hashMask + 1;+    for (i = 0; i < numItems; i++)+        items[i] = kEmptyHashValue;+}++void MatchFinder_Init_4(CMatchFinder *p)+{+    p->buffer = p->bufferBase;+    {+        /* kEmptyHashValue = 0 (Zero) is used in hash tables as NO-VALUE marker.+           the code in CMatchFinderMt expects (pos = 1) */+        p->pos =+            p->streamPos =+                1; // it's smallest optimal value. do not change it+        // 0; // for debug+    }+    p->result = SZ_OK;+    p->streamEndWasReached = 0;+}++// (CYC_TO_POS_OFFSET == 0) is expected by some optimized code+#define CYC_TO_POS_OFFSET 0+// #define CYC_TO_POS_OFFSET 1 // for debug++void MatchFinder_Init(CMatchFinder *p)+{+    MatchFinder_Init_HighHash(p);+    MatchFinder_Init_LowHash(p);+    MatchFinder_Init_4(p);+    // if (readData)+    MatchFinder_ReadBlock(p);++    /* if we init (cyclicBufferPos = pos), then we can use one variable+       instead of both (cyclicBufferPos) and (pos) : only before (cyclicBufferPos) wrapping */+    p->cyclicBufferPos = (p->pos - CYC_TO_POS_OFFSET); // init with relation to (pos)+    // p->cyclicBufferPos = 0; // smallest value+    // p->son[0] = p->son[1] = 0; // unused: we can init skipped record for speculated accesses.+    MatchFinder_SetLimits(p);+}++#ifdef MY_CPU_X86_OR_AMD64+#if defined(__clang__) && (__clang_major__ >= 8) || defined(__GNUC__) && (__GNUC__ >= 8) || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1900)+#define USE_SATUR_SUB_128+#define USE_AVX2+#define ATTRIB_SSE41 __attribute__((__target__("sse4.1")))+#define ATTRIB_AVX2 __attribute__((__target__("avx2")))+#elif defined(_MSC_VER)+#if (_MSC_VER >= 1600)+#define USE_SATUR_SUB_128+#if (_MSC_VER >= 1900)+#define USE_AVX2+#include <immintrin.h> // avx+#endif+#endif+#endif++// #elif defined(MY_CPU_ARM_OR_ARM64)+#elif defined(MY_CPU_ARM64)++#if defined(__clang__) && (__clang_major__ >= 8) || defined(__GNUC__) && (__GNUC__ >= 8)+#define USE_SATUR_SUB_128+#ifdef MY_CPU_ARM64+// #define ATTRIB_SSE41 __attribute__((__target__("")))+#else+// #define ATTRIB_SSE41 __attribute__((__target__("fpu=crypto-neon-fp-armv8")))+#endif++#elif defined(_MSC_VER)+#if (_MSC_VER >= 1910)+#define USE_SATUR_SUB_128+#endif+#endif++#if defined(_MSC_VER) && defined(MY_CPU_ARM64)+#include <arm64_neon.h>+#else+#include <arm_neon.h>+#endif++#endif++/*+#ifndef ATTRIB_SSE41+  #define ATTRIB_SSE41+#endif+#ifndef ATTRIB_AVX2+  #define ATTRIB_AVX2+#endif+*/++#ifdef USE_SATUR_SUB_128++// #define _SHOW_HW_STATUS++#ifdef _SHOW_HW_STATUS+#include <stdio.h>+#define _PRF(x) x+_PRF(;)+#else+#define _PRF(x)+#endif++#ifdef MY_CPU_ARM_OR_ARM64++#ifdef MY_CPU_ARM64+// #define FORCE_SATUR_SUB_128+#endif++typedef uint32x4_t v128;+#define SASUB_128(i)                   \+    *(v128 *)(void *)(items + (i)*4) = \+        vsubq_u32(vmaxq_u32(*(const v128 *)(const void *)(items + (i)*4), sub2), sub2);++#else++#include <smmintrin.h> // sse4.1++typedef __m128i v128;+#define SASUB_128(i)                   \+    *(v128 *)(void *)(items + (i)*4) = \+        _mm_sub_epi32(_mm_max_epu32(*(const v128 *)(const void *)(items + (i)*4), sub2), sub2); // SSE 4.1++#endif++MY_NO_INLINE+static+#ifdef ATTRIB_SSE41+    ATTRIB_SSE41+#endif+    void+        MY_FAST_CALL+        LzFind_SaturSub_128(UInt32 subValue, CLzRef *items, const CLzRef *lim)+{+    v128 sub2 =+#ifdef MY_CPU_ARM_OR_ARM64+        vdupq_n_u32(subValue);+#else+        _mm_set_epi32((Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue);+#endif+    do+    {+        SASUB_128(0)+        SASUB_128(1)+        SASUB_128(2)+        SASUB_128(3)+        items += 4 * 4;+    } while (items != lim);+}++#ifdef USE_AVX2++#include <immintrin.h> // avx++#define SASUB_256(i) *(__m256i *)(void *)(items + (i)*8) = _mm256_sub_epi32(_mm256_max_epu32(*(const __m256i *)(const void *)(items + (i)*8), sub2), sub2); // AVX2++MY_NO_INLINE+static+#ifdef ATTRIB_AVX2+    ATTRIB_AVX2+#endif+    void+        MY_FAST_CALL+        LzFind_SaturSub_256(UInt32 subValue, CLzRef *items, const CLzRef *lim)+{+    __m256i sub2 = _mm256_set_epi32(+        (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue,+        (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue);+    do+    {+        SASUB_256(0)+        SASUB_256(1)+        items += 2 * 8;+    } while (items != lim);+}+#endif // USE_AVX2++#ifndef FORCE_SATUR_SUB_128+typedef void(MY_FAST_CALL *LZFIND_SATUR_SUB_CODE_FUNC)(+    UInt32 subValue, CLzRef *items, const CLzRef *lim);+static LZFIND_SATUR_SUB_CODE_FUNC g_LzFind_SaturSub;+#endif // FORCE_SATUR_SUB_128++#endif // USE_SATUR_SUB_128++// kEmptyHashValue must be zero+// #define SASUB_32(i) v = items[i];  m = v - subValue;  if (v < subValue) m = kEmptyHashValue;  items[i] = m;+#define SASUB_32(i)   \+    v = items[i];     \+    if (v < subValue) \+        v = subValue; \+    items[i] = v - subValue;++#ifdef FORCE_SATUR_SUB_128++#define DEFAULT_SaturSub LzFind_SaturSub_128++#else++#define DEFAULT_SaturSub LzFind_SaturSub_32++MY_NO_INLINE+static void+    MY_FAST_CALL+    LzFind_SaturSub_32(UInt32 subValue, CLzRef *items, const CLzRef *lim)+{+    do+    {+        UInt32 v;+        SASUB_32(0)+        SASUB_32(1)+        SASUB_32(2)+        SASUB_32(3)+        SASUB_32(4)+        SASUB_32(5)+        SASUB_32(6)+        SASUB_32(7)+        items += 8;+    } while (items != lim);+}++#endif++MY_NO_INLINE+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems)+{+#define K_NORM_ALIGN_BLOCK_SIZE (1 << 6)++    CLzRef *lim;++    for (; numItems != 0 && ((unsigned)(ptrdiff_t)items & (K_NORM_ALIGN_BLOCK_SIZE - 1)) != 0; numItems--)+    {+        UInt32 v;+        SASUB_32(0);+        items++;+    }++    {+#define K_NORM_ALIGN_MASK (K_NORM_ALIGN_BLOCK_SIZE / 4 - 1)+        lim = items + (numItems & ~(size_t)K_NORM_ALIGN_MASK);+        numItems &= K_NORM_ALIGN_MASK;+        if (items != lim)+        {+#if defined(USE_SATUR_SUB_128) && !defined(FORCE_SATUR_SUB_128)+            if (g_LzFind_SaturSub)+                g_LzFind_SaturSub(subValue, items, lim);+            else+#endif+                DEFAULT_SaturSub(subValue, items, lim);+        }+        items = lim;+    }++    for (; numItems != 0; numItems--)+    {+        UInt32 v;+        SASUB_32(0);+        items++;+    }+}++// call MatchFinder_CheckLimits() only after (p->pos++) update++MY_NO_INLINE+static void MatchFinder_CheckLimits(CMatchFinder *p)+{+    if ( // !p->streamEndWasReached && p->result == SZ_OK &&+        p->keepSizeAfter == GET_AVAIL_BYTES(p))+    {+        // we try to read only in exact state (p->keepSizeAfter == GET_AVAIL_BYTES(p))+        if (MatchFinder_NeedMove(p))+            MatchFinder_MoveBlock(p);+        MatchFinder_ReadBlock(p);+    }++    if (p->pos == kMaxValForNormalize)+        if (GET_AVAIL_BYTES(p) >= p->numHashBytes) // optional optimization for last bytes of data.+        /*+           if we disable normalization for last bytes of data, and+           if (data_size == 4 GiB), we don't call wastfull normalization,+           but (pos) will be wrapped over Zero (0) in that case.+           And we cannot resume later to normal operation+        */+        {+            // MatchFinder_Normalize(p);+            /* after normalization we need (p->pos >= p->historySize + 1); */+            /* we can reduce subValue to aligned value, if want to keep alignment+               of (p->pos) and (p->buffer) for speculated accesses. */+            const UInt32 subValue = (p->pos - p->historySize - 1) /* & ~(UInt32)(kNormalizeAlign - 1) */;+            // const UInt32 subValue = (1 << 15); // for debug+            // printf("\nMatchFinder_Normalize() subValue == 0x%x\n", subValue);+            size_t numSonRefs = p->cyclicBufferSize;+            if (p->btMode)+                numSonRefs <<= 1;+            Inline_MatchFinder_ReduceOffsets(p, subValue);+            MatchFinder_Normalize3(subValue, p->hash, (size_t)p->hashSizeSum + numSonRefs);+        }++    if (p->cyclicBufferPos == p->cyclicBufferSize)+        p->cyclicBufferPos = 0;++    MatchFinder_SetLimits(p);+}++/*+  (lenLimit > maxLen)+*/+MY_FORCE_INLINE+static UInt32 *Hc_GetMatchesSpec(size_t lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,+                                 size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,+                                 UInt32 *d, unsigned maxLen)+{+    const Byte *lim = cur + lenLimit;+    son[_cyclicBufferPos] = curMatch;++    do+    {+        UInt32 delta;++        if (curMatch == 0)+            break;+        // if (curMatch2 >= curMatch) return NULL;+        delta = pos - curMatch;+        if (delta >= _cyclicBufferSize)+            break;+        {+            ptrdiff_t diff;+            curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];+            diff = (ptrdiff_t)0 - (ptrdiff_t)delta;+            if (cur[maxLen] == cur[(ptrdiff_t)maxLen + diff])+            {+                const Byte *c = cur;+                while (*c == c[diff])+                {+                    if (++c == lim)+                    {+                        d[0] = (UInt32)(lim - cur);+                        d[1] = delta - 1;+                        return d + 2;+                    }+                }+                {+                    const unsigned len = (unsigned)(c - cur);+                    if (maxLen < len)+                    {+                        maxLen = len;+                        d[0] = (UInt32)len;+                        d[1] = delta - 1;+                        d += 2;+                    }+                }+            }+        }+    } while (--cutValue);++    return d;+}++MY_FORCE_INLINE+UInt32 *GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,+                        size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,+                        UInt32 *d, UInt32 maxLen)+{+    CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1;+    CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1);+    unsigned len0 = 0, len1 = 0;++    UInt32 cmCheck;++    // if (curMatch >= pos) { *ptr0 = *ptr1 = kEmptyHashValue; return NULL; }++    cmCheck = (UInt32)(pos - _cyclicBufferSize);+    if ((UInt32)pos <= _cyclicBufferSize)+        cmCheck = 0;++    if (cmCheck < curMatch)+        do+        {+            const UInt32 delta = pos - curMatch;+            {+                CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);+                const Byte *pb = cur - delta;+                unsigned len = (len0 < len1 ? len0 : len1);+                const UInt32 pair0 = pair[0];+                if (pb[len] == cur[len])+                {+                    if (++len != lenLimit && pb[len] == cur[len])+                        while (++len != lenLimit)+                            if (pb[len] != cur[len])+                                break;+                    if (maxLen < len)+                    {+                        maxLen = (UInt32)len;+                        *d++ = (UInt32)len;+                        *d++ = delta - 1;+                        if (len == lenLimit)+                        {+                            *ptr1 = pair0;+                            *ptr0 = pair[1];+                            return d;+                        }+                    }+                }+                if (pb[len] < cur[len])+                {+                    *ptr1 = curMatch;+                    // const UInt32 curMatch2 = pair[1];+                    // if (curMatch2 >= curMatch) { *ptr0 = *ptr1 = kEmptyHashValue;  return NULL; }+                    // curMatch = curMatch2;+                    curMatch = pair[1];+                    ptr1 = pair + 1;+                    len1 = len;+                }+                else+                {+                    *ptr0 = curMatch;+                    curMatch = pair[0];+                    ptr0 = pair;+                    len0 = len;+                }+            }+        } while (--cutValue && cmCheck < curMatch);++    *ptr0 = *ptr1 = kEmptyHashValue;+    return d;+}++static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,+                            size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue)+{+    CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1;+    CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1);+    unsigned len0 = 0, len1 = 0;++    UInt32 cmCheck;++    cmCheck = (UInt32)(pos - _cyclicBufferSize);+    if ((UInt32)pos <= _cyclicBufferSize)+        cmCheck = 0;++    if ( // curMatch >= pos ||  // failure+        cmCheck < curMatch)+        do+        {+            const UInt32 delta = pos - curMatch;+            {+                CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);+                const Byte *pb = cur - delta;+                unsigned len = (len0 < len1 ? len0 : len1);+                if (pb[len] == cur[len])+                {+                    while (++len != lenLimit)+                        if (pb[len] != cur[len])+                            break;+                    {+                        if (len == lenLimit)+                        {+                            *ptr1 = pair[0];+                            *ptr0 = pair[1];+                            return;+                        }+                    }+                }+                if (pb[len] < cur[len])+                {+                    *ptr1 = curMatch;+                    curMatch = pair[1];+                    ptr1 = pair + 1;+                    len1 = len;+                }+                else+                {+                    *ptr0 = curMatch;+                    curMatch = pair[0];+                    ptr0 = pair;+                    len0 = len;+                }+            }+        } while (--cutValue && cmCheck < curMatch);++    *ptr0 = *ptr1 = kEmptyHashValue;+    return;+}++#define MOVE_POS                        \+    ++p->cyclicBufferPos;               \+    p->buffer++;                        \+    {                                   \+        const UInt32 pos1 = p->pos + 1; \+        p->pos = pos1;                  \+        if (pos1 == p->posLimit)        \+            MatchFinder_CheckLimits(p); \+    }++#define MOVE_POS_RET MOVE_POS return distances;++MY_NO_INLINE+static void MatchFinder_MovePos(CMatchFinder *p)+{+    /* we go here at the end of stream data, when (avail < num_hash_bytes)+       We don't update sons[cyclicBufferPos << btMode].+       So (sons) record will contain junk. And we cannot resume match searching+       to normal operation, even if we will provide more input data in buffer.+       p->sons[p->cyclicBufferPos << p->btMode] = 0;  // kEmptyHashValue+       if (p->btMode)+          p->sons[(p->cyclicBufferPos << p->btMode) + 1] = 0;  // kEmptyHashValue+    */+    MOVE_POS;+}++#define GET_MATCHES_HEADER2(minLen, ret_op) \+    unsigned lenLimit;                      \+    UInt32 hv;                              \+    Byte *cur;                              \+    UInt32 curMatch;                        \+    lenLimit = (unsigned)p->lenLimit;       \+    {                                       \+        if (lenLimit < minLen)              \+        {                                   \+            MatchFinder_MovePos(p);         \+            ret_op;                         \+        }                                   \+    }                                       \+    cur = p->buffer;++#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return distances)+#define SKIP_HEADER(minLen) \+    do                      \+    {                       \+    GET_MATCHES_HEADER2(minLen, continue)++#define MF_PARAMS(p) lenLimit, curMatch, p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue++#define SKIP_FOOTER                \+    SkipMatchesSpec(MF_PARAMS(p)); \+    MOVE_POS;                      \+    }                              \+    while (--num)                  \+        ;++#define GET_MATCHES_FOOTER_BASE(_maxLen_, func)    \+    distances = func(MF_PARAMS(p),                 \+                     distances, (UInt32)_maxLen_); \+    MOVE_POS_RET;++#define GET_MATCHES_FOOTER_BT(_maxLen_) \+    GET_MATCHES_FOOTER_BASE(_maxLen_, GetMatchesSpec1)++#define GET_MATCHES_FOOTER_HC(_maxLen_) \+    GET_MATCHES_FOOTER_BASE(_maxLen_, Hc_GetMatchesSpec)++#define UPDATE_maxLen                                        \+    {                                                        \+        const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)d2; \+        const Byte *c = cur + maxLen;                        \+        const Byte *lim = cur + lenLimit;                    \+        for (; c != lim; c++)                                \+            if (*(c + diff) != *c)                           \+                break;                                       \+        maxLen = (unsigned)(c - cur);                        \+    }++static UInt32 *Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)+{+    GET_MATCHES_HEADER(2)+    HASH2_CALC;+    curMatch = p->hash[hv];+    p->hash[hv] = p->pos;+    GET_MATCHES_FOOTER_BT(1)+}++UInt32 *Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)+{+    GET_MATCHES_HEADER(3)+    HASH_ZIP_CALC;+    curMatch = p->hash[hv];+    p->hash[hv] = p->pos;+    GET_MATCHES_FOOTER_BT(2)+}++#define SET_mmm                \+    mmm = p->cyclicBufferSize; \+    if (pos < mmm)             \+        mmm = pos;++static UInt32 *Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)+{+    UInt32 mmm;+    UInt32 h2, d2, pos;+    unsigned maxLen;+    UInt32 *hash;+    GET_MATCHES_HEADER(3)++    HASH3_CALC;++    hash = p->hash;+    pos = p->pos;++    d2 = pos - hash[h2];++    curMatch = (hash + kFix3HashSize)[hv];++    hash[h2] = pos;+    (hash + kFix3HashSize)[hv] = pos;++    SET_mmm++        maxLen = 2;++    if (d2 < mmm && *(cur - d2) == *cur)+    {+        UPDATE_maxLen+            distances[0] = (UInt32)maxLen;+        distances[1] = d2 - 1;+        distances += 2;+        if (maxLen == lenLimit)+        {+            SkipMatchesSpec(MF_PARAMS(p));+            MOVE_POS_RET;+        }+    }++    GET_MATCHES_FOOTER_BT(maxLen)+}++static UInt32 *Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)+{+    UInt32 mmm;+    UInt32 h2, h3, d2, d3, pos;+    unsigned maxLen;+    UInt32 *hash;+    GET_MATCHES_HEADER(4)++    HASH4_CALC;++    hash = p->hash;+    pos = p->pos;++    d2 = pos - hash[h2];+    d3 = pos - (hash + kFix3HashSize)[h3];+    curMatch = (hash + kFix4HashSize)[hv];++    hash[h2] = pos;+    (hash + kFix3HashSize)[h3] = pos;+    (hash + kFix4HashSize)[hv] = pos;++    SET_mmm++        maxLen = 3;++    for (;;)+    {+        if (d2 < mmm && *(cur - d2) == *cur)+        {+            distances[0] = 2;+            distances[1] = d2 - 1;+            distances += 2;+            if (*(cur - d2 + 2) == cur[2])+            {+                // distances[-2] = 3;+            }+            else if (d3 < mmm && *(cur - d3) == *cur)+            {+                d2 = d3;+                distances[1] = d3 - 1;+                distances += 2;+            }+            else+                break;+        }+        else if (d3 < mmm && *(cur - d3) == *cur)+        {+            d2 = d3;+            distances[1] = d3 - 1;+            distances += 2;+        }+        else+            break;++        UPDATE_maxLen+            distances[-2] = (UInt32)maxLen;+        if (maxLen == lenLimit)+        {+            SkipMatchesSpec(MF_PARAMS(p));+            MOVE_POS_RET+        }+        break;+    }++    GET_MATCHES_FOOTER_BT(maxLen)+}++static UInt32 *Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)+{+    UInt32 mmm;+    UInt32 h2, h3, d2, d3, maxLen, pos;+    UInt32 *hash;+    GET_MATCHES_HEADER(5)++    HASH5_CALC;++    hash = p->hash;+    pos = p->pos;++    d2 = pos - hash[h2];+    d3 = pos - (hash + kFix3HashSize)[h3];+    // d4 = pos - (hash + kFix4HashSize)[h4];++    curMatch = (hash + kFix5HashSize)[hv];++    hash[h2] = pos;+    (hash + kFix3HashSize)[h3] = pos;+    // (hash + kFix4HashSize)[h4] = pos;+    (hash + kFix5HashSize)[hv] = pos;++    SET_mmm++        maxLen = 4;++    for (;;)+    {+        if (d2 < mmm && *(cur - d2) == *cur)+        {+            distances[0] = 2;+            distances[1] = d2 - 1;+            distances += 2;+            if (*(cur - d2 + 2) == cur[2])+            {+            }+            else if (d3 < mmm && *(cur - d3) == *cur)+            {+                distances[1] = d3 - 1;+                distances += 2;+                d2 = d3;+            }+            else+                break;+        }+        else if (d3 < mmm && *(cur - d3) == *cur)+        {+            distances[1] = d3 - 1;+            distances += 2;+            d2 = d3;+        }+        else+            break;++        distances[-2] = 3;+        if (*(cur - d2 + 3) != cur[3])+            break;+        UPDATE_maxLen+            distances[-2] = (UInt32)maxLen;+        if (maxLen == lenLimit)+        {+            SkipMatchesSpec(MF_PARAMS(p));+            MOVE_POS_RET;+        }+        break;+    }++    GET_MATCHES_FOOTER_BT(maxLen)+}++static UInt32 *Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)+{+    UInt32 mmm;+    UInt32 h2, h3, d2, d3, pos;+    unsigned maxLen;+    UInt32 *hash;+    GET_MATCHES_HEADER(4)++    HASH4_CALC;++    hash = p->hash;+    pos = p->pos;++    d2 = pos - hash[h2];+    d3 = pos - (hash + kFix3HashSize)[h3];+    curMatch = (hash + kFix4HashSize)[hv];++    hash[h2] = pos;+    (hash + kFix3HashSize)[h3] = pos;+    (hash + kFix4HashSize)[hv] = pos;++    SET_mmm++        maxLen = 3;++    for (;;)+    {+        if (d2 < mmm && *(cur - d2) == *cur)+        {+            distances[0] = 2;+            distances[1] = d2 - 1;+            distances += 2;+            if (*(cur - d2 + 2) == cur[2])+            {+                // distances[-2] = 3;+            }+            else if (d3 < mmm && *(cur - d3) == *cur)+            {+                d2 = d3;+                distances[1] = d3 - 1;+                distances += 2;+            }+            else+                break;+        }+        else if (d3 < mmm && *(cur - d3) == *cur)+        {+            d2 = d3;+            distances[1] = d3 - 1;+            distances += 2;+        }+        else+            break;++        UPDATE_maxLen+            distances[-2] = (UInt32)maxLen;+        if (maxLen == lenLimit)+        {+            p->son[p->cyclicBufferPos] = curMatch;+            MOVE_POS_RET;+        }+        break;+    }++    GET_MATCHES_FOOTER_HC(maxLen);+}++static UInt32 *Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)+{+    UInt32 mmm;+    UInt32 h2, h3, d2, d3, maxLen, pos;+    UInt32 *hash;+    GET_MATCHES_HEADER(5)++    HASH5_CALC;++    hash = p->hash;+    pos = p->pos;++    d2 = pos - hash[h2];+    d3 = pos - (hash + kFix3HashSize)[h3];+    // d4 = pos - (hash + kFix4HashSize)[h4];++    curMatch = (hash + kFix5HashSize)[hv];++    hash[h2] = pos;+    (hash + kFix3HashSize)[h3] = pos;+    // (hash + kFix4HashSize)[h4] = pos;+    (hash + kFix5HashSize)[hv] = pos;++    SET_mmm++        maxLen = 4;++    for (;;)+    {+        if (d2 < mmm && *(cur - d2) == *cur)+        {+            distances[0] = 2;+            distances[1] = d2 - 1;+            distances += 2;+            if (*(cur - d2 + 2) == cur[2])+            {+            }+            else if (d3 < mmm && *(cur - d3) == *cur)+            {+                distances[1] = d3 - 1;+                distances += 2;+                d2 = d3;+            }+            else+                break;+        }+        else if (d3 < mmm && *(cur - d3) == *cur)+        {+            distances[1] = d3 - 1;+            distances += 2;+            d2 = d3;+        }+        else+            break;++        distances[-2] = 3;+        if (*(cur - d2 + 3) != cur[3])+            break;+        UPDATE_maxLen+            distances[-2] = maxLen;+        if (maxLen == lenLimit)+        {+            p->son[p->cyclicBufferPos] = curMatch;+            MOVE_POS_RET;+        }+        break;+    }++    GET_MATCHES_FOOTER_HC(maxLen);+}++UInt32 *Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)+{+    GET_MATCHES_HEADER(3)+    HASH_ZIP_CALC;+    curMatch = p->hash[hv];+    p->hash[hv] = p->pos;+    GET_MATCHES_FOOTER_HC(2)+}++static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)+{+    SKIP_HEADER(2)+    {+        HASH2_CALC;+        curMatch = p->hash[hv];+        p->hash[hv] = p->pos;+    }+    SKIP_FOOTER+}++void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)+{+    SKIP_HEADER(3)+    {+        HASH_ZIP_CALC;+        curMatch = p->hash[hv];+        p->hash[hv] = p->pos;+    }+    SKIP_FOOTER+}++static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)+{+    SKIP_HEADER(3)+    {+        UInt32 h2;+        UInt32 *hash;+        HASH3_CALC;+        hash = p->hash;+        curMatch = (hash + kFix3HashSize)[hv];+        hash[h2] =+            (hash + kFix3HashSize)[hv] = p->pos;+    }+    SKIP_FOOTER+}++static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)+{+    SKIP_HEADER(4)+    {+        UInt32 h2, h3;+        UInt32 *hash;+        HASH4_CALC;+        hash = p->hash;+        curMatch = (hash + kFix4HashSize)[hv];+        hash[h2] =+            (hash + kFix3HashSize)[h3] =+                (hash + kFix4HashSize)[hv] = p->pos;+    }+    SKIP_FOOTER+}++static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num)+{+    SKIP_HEADER(5)+    {+        UInt32 h2, h3;+        UInt32 *hash;+        HASH5_CALC;+        hash = p->hash;+        curMatch = (hash + kFix5HashSize)[hv];+        hash[h2] =+            (hash + kFix3HashSize)[h3] =+                // (hash + kFix4HashSize)[h4] =+            (hash + kFix5HashSize)[hv] = p->pos;+    }+    SKIP_FOOTER+}++#define HC_SKIP_HEADER(minLen)                                    \+    do                                                            \+    {                                                             \+        if (p->lenLimit < minLen)                                 \+        {                                                         \+            MatchFinder_MovePos(p);                               \+            num--;                                                \+            continue;                                             \+        }                                                         \+        {                                                         \+            Byte *cur;                                            \+            UInt32 *hash;                                         \+            UInt32 *son;                                          \+            UInt32 pos = p->pos;                                  \+            UInt32 num2 = num;                                    \+            /* (p->pos == p->posLimit) is not allowed here !!! */ \+            {                                                     \+                const UInt32 rem = p->posLimit - pos;             \+                if (num2 > rem)                                   \+                    num2 = rem;                                   \+            }                                                     \+            num -= num2;                                          \+            {                                                     \+                const UInt32 cycPos = p->cyclicBufferPos;         \+                son = p->son + cycPos;                            \+                p->cyclicBufferPos = cycPos + num2;               \+            }                                                     \+            cur = p->buffer;                                      \+            hash = p->hash;                                       \+            do                                                    \+            {                                                     \+                UInt32 curMatch;                                  \+                UInt32 hv;++#define HC_SKIP_FOOTER              \+    cur++;                          \+    pos++;                          \+    *son++ = curMatch;              \+    }                               \+    while (--num2)                  \+        ;                           \+    p->buffer = cur;                \+    p->pos = pos;                   \+    if (pos == p->posLimit)         \+        MatchFinder_CheckLimits(p); \+    }                               \+    }                               \+    while (num)                     \+        ;++static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)+{+    HC_SKIP_HEADER(4)++    UInt32 h2, h3;+    HASH4_CALC;+    curMatch = (hash + kFix4HashSize)[hv];+    hash[h2] =+        (hash + kFix3HashSize)[h3] =+            (hash + kFix4HashSize)[hv] = pos;++    HC_SKIP_FOOTER+}++static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num)+{+    HC_SKIP_HEADER(5)++    UInt32 h2, h3;+    HASH5_CALC+    curMatch = (hash + kFix5HashSize)[hv];+    hash[h2] =+        (hash + kFix3HashSize)[h3] =+            // (hash + kFix4HashSize)[h4] =+        (hash + kFix5HashSize)[hv] = pos;++    HC_SKIP_FOOTER+}++void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)+{+    HC_SKIP_HEADER(3)++    HASH_ZIP_CALC;+    curMatch = hash[hv];+    hash[hv] = pos;++    HC_SKIP_FOOTER+}++void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder2 *vTable)+{+    vTable->Init = (Mf_Init_Func)MatchFinder_Init;+    vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;+    vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;+    if (!p->btMode)+    {+        if (p->numHashBytes <= 4)+        {+            vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;+            vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;+        }+        else+        {+            vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches;+            vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip;+        }+    }+    else if (p->numHashBytes == 2)+    {+        vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;+        vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;+    }+    else if (p->numHashBytes == 3)+    {+        vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;+        vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;+    }+    else if (p->numHashBytes == 4)+    {+        vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;+        vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;+    }+    else+    {+        vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches;+        vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip;+    }+}++void LzFindPrepare()+{+#ifndef FORCE_SATUR_SUB_128+#ifdef USE_SATUR_SUB_128+    LZFIND_SATUR_SUB_CODE_FUNC f = NULL;+#ifdef MY_CPU_ARM_OR_ARM64+    {+        if (CPU_IsSupported_NEON())+        {+            // #pragma message ("=== LzFind NEON")+            _PRF(printf("\n=== LzFind NEON\n"));+            f = LzFind_SaturSub_128;+        }+        // f = 0; // for debug+    }+#else // MY_CPU_ARM_OR_ARM64+    if (CPU_IsSupported_SSE41())+    {+        // #pragma message ("=== LzFind SSE41")+        _PRF(printf("\n=== LzFind SSE41\n"));+        f = LzFind_SaturSub_128;++#ifdef USE_AVX2+        if (CPU_IsSupported_AVX2())+        {+            // #pragma message ("=== LzFind AVX2")+            _PRF(printf("\n=== LzFind AVX2\n"));+            f = LzFind_SaturSub_256;+        }+#endif+    }+#endif // MY_CPU_ARM_OR_ARM64+    g_LzFind_SaturSub = f;+#endif // USE_SATUR_SUB_128+#endif // FORCE_SATUR_SUB_128+}++#ifndef _7ZIP_ST+/* LzFindMt.h -- multithreaded Match finder for LZ algorithms+2021-07-12 : Igor Pavlov : Public domain */++#ifndef __LZ_FIND_MT_H+#define __LZ_FIND_MT_H++/* Threads.h -- multithreading library+2021-12-21 : Igor Pavlov : Public domain */++#ifndef __7Z_THREADS_H+#define __7Z_THREADS_H++#ifdef _WIN32+#include <Windows.h>+#else++#if defined(__linux__)+#if !defined(__APPLE__) && !defined(_AIX) && !defined(__ANDROID__)+#ifndef _7ZIP_AFFINITY_DISABLE+#define _7ZIP_AFFINITY_SUPPORTED+// #pragma message(" ==== _7ZIP_AFFINITY_SUPPORTED")+// #define _GNU_SOURCE+#endif+#endif+#endif++#include <pthread.h>++#endif++EXTERN_C_BEGIN++#ifdef _WIN32++WRes HandlePtr_Close(HANDLE *h);+WRes Handle_WaitObject(HANDLE h);++typedef HANDLE CThread;++#define Thread_Construct(p) \+    {                       \+        *(p) = NULL;        \+    }+#define Thread_WasCreated(p) (*(p) != NULL)+#define Thread_Close(p) HandlePtr_Close(p)+// #define Thread_Wait(p) Handle_WaitObject(*(p))++#ifdef UNDER_CE+// if (USE_THREADS_CreateThread is      defined), we use _beginthreadex()+// if (USE_THREADS_CreateThread is not definned), we use CreateThread()+#define USE_THREADS_CreateThread+#endif++typedef+#ifdef USE_THREADS_CreateThread+    DWORD+#else+    unsigned+#endif+        THREAD_FUNC_RET_TYPE;++typedef DWORD_PTR CAffinityMask;+typedef DWORD_PTR CCpuSet;++#define CpuSet_Zero(p) \+    {                  \+        *(p) = 0;      \+    }+#define CpuSet_Set(p, cpu)               \+    {                                    \+        *(p) |= ((DWORD_PTR)1 << (cpu)); \+    }++#else //  _WIN32++typedef struct _CThread+{+    pthread_t _tid;+    int _created;+} CThread;++#define Thread_Construct(p) \+    {                       \+        (p)->_tid = 0;      \+        (p)->_created = 0;  \+    }+#define Thread_WasCreated(p) ((p)->_created != 0)+WRes Thread_Close(CThread *p);+// #define Thread_Wait Thread_Wait_Close++typedef void *THREAD_FUNC_RET_TYPE;++typedef UInt64 CAffinityMask;++#ifdef _7ZIP_AFFINITY_SUPPORTED++typedef cpu_set_t CCpuSet;+#define CpuSet_Zero(p) CPU_ZERO(p)+#define CpuSet_Set(p, cpu) CPU_SET(cpu, p)+#define CpuSet_IsSet(p, cpu) CPU_ISSET(cpu, p)++#else++typedef UInt64 CCpuSet;+#define CpuSet_Zero(p) \+    {                  \+        *(p) = 0;      \+    }+#define CpuSet_Set(p, cpu)            \+    {                                 \+        *(p) |= ((UInt64)1 << (cpu)); \+    }+#define CpuSet_IsSet(p, cpu) ((*(p) & ((UInt64)1 << (cpu))) != 0)++#endif++#endif //  _WIN32++#define THREAD_FUNC_CALL_TYPE MY_STD_CALL++#if defined(_WIN32) && defined(__GNUC__)+/* GCC compiler for x86 32-bit uses the rule:+   the stack is 16-byte aligned before CALL instruction for function calling.+   But only root function main() contains instructions that+   set 16-byte alignment for stack pointer. And another functions+   just keep alignment, if it was set in some parent function.++   The problem:+    if we create new thread in MinGW (GCC) 32-bit x86 via _beginthreadex() or CreateThread(),+       the root function of thread doesn't set 16-byte alignment.+       And stack frames in all child functions also will be unaligned in that case.++   Here we set (force_align_arg_pointer) attribute for root function of new thread.+   Do we need (force_align_arg_pointer) also for another systems?  */++#define THREAD_FUNC_ATTRIB_ALIGN_ARG __attribute__((force_align_arg_pointer))+// #define THREAD_FUNC_ATTRIB_ALIGN_ARG // for debug : bad alignment in SSE functions+#else+#define THREAD_FUNC_ATTRIB_ALIGN_ARG+#endif++#define THREAD_FUNC_DECL THREAD_FUNC_ATTRIB_ALIGN_ARG THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE++typedef THREAD_FUNC_RET_TYPE(THREAD_FUNC_CALL_TYPE *THREAD_FUNC_TYPE)(void *);+WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param);+WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity);+WRes Thread_Wait_Close(CThread *p);++#ifdef _WIN32+#define Thread_Create_With_CpuSet(p, func, param, cs) \+    Thread_Create_With_Affinity(p, func, param, *cs)+#else+WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet);+#endif++#ifdef _WIN32++typedef HANDLE CEvent;+typedef CEvent CAutoResetEvent;+typedef CEvent CManualResetEvent;+#define Event_Construct(p) *(p) = NULL+#define Event_IsCreated(p) (*(p) != NULL)+#define Event_Close(p) HandlePtr_Close(p)+#define Event_Wait(p) Handle_WaitObject(*(p))+WRes Event_Set(CEvent *p);+WRes Event_Reset(CEvent *p);+WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled);+WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p);+WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled);+WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p);++typedef HANDLE CSemaphore;+#define Semaphore_Construct(p) *(p) = NULL+#define Semaphore_IsCreated(p) (*(p) != NULL)+#define Semaphore_Close(p) HandlePtr_Close(p)+#define Semaphore_Wait(p) Handle_WaitObject(*(p))+WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount);+WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount);+WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num);+WRes Semaphore_Release1(CSemaphore *p);++typedef CRITICAL_SECTION CCriticalSection;+WRes CriticalSection_Init(CCriticalSection *p);+#define CriticalSection_Delete(p) DeleteCriticalSection(p)+#define CriticalSection_Enter(p) EnterCriticalSection(p)+#define CriticalSection_Leave(p) LeaveCriticalSection(p)++#else // _WIN32++typedef struct _CEvent+{+    int _created;+    int _manual_reset;+    int _state;+    pthread_mutex_t _mutex;+    pthread_cond_t _cond;+} CEvent;++typedef CEvent CAutoResetEvent;+typedef CEvent CManualResetEvent;++#define Event_Construct(p) (p)->_created = 0+#define Event_IsCreated(p) ((p)->_created)++WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled);+WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p);+WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled);+WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p);+WRes Event_Set(CEvent *p);+WRes Event_Reset(CEvent *p);+WRes Event_Wait(CEvent *p);+WRes Event_Close(CEvent *p);++typedef struct _CSemaphore+{+    int _created;+    UInt32 _count;+    UInt32 _maxCount;+    pthread_mutex_t _mutex;+    pthread_cond_t _cond;+} CSemaphore;++#define Semaphore_Construct(p) (p)->_created = 0+#define Semaphore_IsCreated(p) ((p)->_created)++WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount);+WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount);+WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num);+#define Semaphore_Release1(p) Semaphore_ReleaseN(p, 1)+WRes Semaphore_Wait(CSemaphore *p);+WRes Semaphore_Close(CSemaphore *p);++typedef struct _CCriticalSection+{+    pthread_mutex_t _mutex;+} CCriticalSection;++WRes CriticalSection_Init(CCriticalSection *p);+void CriticalSection_Delete(CCriticalSection *cs);+void CriticalSection_Enter(CCriticalSection *cs);+void CriticalSection_Leave(CCriticalSection *cs);++LONG InterlockedIncrement(LONG volatile *addend);++#endif // _WIN32++EXTERN_C_END++#endif++/* Threads.c -- multithreading library+2021-12-21 : Igor Pavlov : Public domain */++#ifdef _WIN32++#ifndef USE_THREADS_CreateThread+#include <process.h>+#endif++static WRes GetError()+{+    DWORD res = GetLastError();+    return res ? (WRes)res : 1;+}++static WRes HandleToWRes(HANDLE h)+{+    return (h != NULL) ? 0 : GetError();+}+static WRes BOOLToWRes(BOOL v)+{+    return v ? 0 : GetError();+}++WRes HandlePtr_Close(HANDLE *p)+{+    if (*p != NULL)+    {+        if (!CloseHandle(*p))+            return GetError();+        *p = NULL;+    }+    return 0;+}++WRes Handle_WaitObject(HANDLE h)+{+    DWORD dw = WaitForSingleObject(h, INFINITE);+    /*+      (dw) result:+      WAIT_OBJECT_0  // 0+      WAIT_ABANDONED // 0x00000080 : is not compatible with Win32 Error space+      WAIT_TIMEOUT   // 0x00000102 : is     compatible with Win32 Error space+      WAIT_FAILED    // 0xFFFFFFFF+    */+    if (dw == WAIT_FAILED)+    {+        dw = GetLastError();+        if (dw == 0)+            return WAIT_FAILED;+    }+    return (WRes)dw;+}++#define Thread_Wait(p) Handle_WaitObject(*(p))++WRes Thread_Wait_Close(CThread *p)+{+    WRes res = Thread_Wait(p);+    WRes res2 = Thread_Close(p);+    return (res != 0 ? res : res2);+}++WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param)+{+    /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */++#ifdef USE_THREADS_CreateThread++    DWORD threadId;+    *p = CreateThread(NULL, 0, func, param, 0, &threadId);++#else++    unsigned threadId;+    *p = (HANDLE)(_beginthreadex(NULL, 0, func, param, 0, &threadId));++#endif++    /* maybe we must use errno here, but probably GetLastError() is also OK. */+    return HandleToWRes(*p);+}++WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity)+{+#ifdef USE_THREADS_CreateThread++    UNUSED_VAR(affinity)+    return Thread_Create(p, func, param);++#else++    /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */+    HANDLE h;+    WRes wres;+    unsigned threadId;+    h = (HANDLE)(_beginthreadex(NULL, 0, func, param, CREATE_SUSPENDED, &threadId));+    *p = h;+    wres = HandleToWRes(h);+    if (h)+    {+        {+            // DWORD_PTR prevMask =+            SetThreadAffinityMask(h, (DWORD_PTR)affinity);+            /*+            if (prevMask == 0)+            {+              // affinity change is non-critical error, so we can ignore it+              // wres = GetError();+            }+            */+        }+        {+            DWORD prevSuspendCount = ResumeThread(h);+            /* ResumeThread() returns:+               0 : was_not_suspended+               1 : was_resumed+              -1 : error+            */+            if (prevSuspendCount == (DWORD)-1)+                wres = GetError();+        }+    }++    /* maybe we must use errno here, but probably GetLastError() is also OK. */+    return wres;++#endif+}++static WRes Event_Create(CEvent *p, BOOL manualReset, int signaled)+{+    *p = CreateEvent(NULL, manualReset, (signaled ? TRUE : FALSE), NULL);+    return HandleToWRes(*p);+}++WRes Event_Set(CEvent *p)+{+    return BOOLToWRes(SetEvent(*p));+}+WRes Event_Reset(CEvent *p)+{+    return BOOLToWRes(ResetEvent(*p));+}++WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled)+{+    return Event_Create(p, TRUE, signaled);+}+WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled)+{+    return Event_Create(p, FALSE, signaled);+}+WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p)+{+    return ManualResetEvent_Create(p, 0);+}+WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p)+{+    return AutoResetEvent_Create(p, 0);+}++WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount)+{+    // negative ((LONG)maxCount) is not supported in WIN32::CreateSemaphore()+    *p = CreateSemaphore(NULL, (LONG)initCount, (LONG)maxCount, NULL);+    return HandleToWRes(*p);+}++WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount)+{+    // if (Semaphore_IsCreated(p))+    {+        WRes wres = Semaphore_Close(p);+        if (wres != 0)+            return wres;+    }+    return Semaphore_Create(p, initCount, maxCount);+}++static WRes Semaphore_Release(CSemaphore *p, LONG releaseCount, LONG *previousCount)+{+    return BOOLToWRes(ReleaseSemaphore(*p, releaseCount, previousCount));+}+WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num)+{+    return Semaphore_Release(p, (LONG)num, NULL);+}+WRes Semaphore_Release1(CSemaphore *p)+{+    return Semaphore_ReleaseN(p, 1);+}++WRes CriticalSection_Init(CCriticalSection *p)+{+    /* InitializeCriticalSection() can raise exception:+       Windows XP, 2003 : can raise a STATUS_NO_MEMORY exception+       Windows Vista+   : no exceptions */+#ifdef _MSC_VER+    __try+#endif+    {+        InitializeCriticalSection(p);+        /* InitializeCriticalSectionAndSpinCount(p, 0); */+    }+#ifdef _MSC_VER+    __except (EXCEPTION_EXECUTE_HANDLER)+    {+        return ERROR_NOT_ENOUGH_MEMORY;+    }+#endif+    return 0;+}++#else // _WIN32++// ---------- POSIX ----------++#include <errno.h>+#include <stdlib.h>+#include <string.h>+#ifdef _7ZIP_AFFINITY_SUPPORTED+// #include <sched.h>+#endif++#define Print(s) PRF(printf("\n%s\n", s))++// #include <stdio.h>++WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet)+{+    // new thread in Posix probably inherits affinity from parrent thread+    Print("Thread_Create_With_CpuSet");++    pthread_attr_t attr;+    int ret;+    // int ret2;++    p->_created = 0;++    RINOK(pthread_attr_init(&attr));++    ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);++    if (!ret)+    {+        if (cpuSet)+        {+#ifdef _7ZIP_AFFINITY_SUPPORTED++            /*+            printf("\n affinity :");+            unsigned i;+            for (i = 0; i < sizeof(*cpuSet) && i < 8; i++)+            {+              Byte b = *((const Byte *)cpuSet + i);+              char temp[32];+  #define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10)))))+              temp[0] = GET_HEX_CHAR((b & 0xF));+              temp[1] = GET_HEX_CHAR((b >> 4));+              // temp[0] = GET_HEX_CHAR((b >> 4));  // big-endian+              // temp[1] = GET_HEX_CHAR((b & 0xF));  // big-endian+              temp[2] = 0;+              printf("%s", temp);+            }+            printf("\n");+            */++            // ret2 =+            pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet);+// if (ret2) ret = ret2;+#endif+        }++        ret = pthread_create(&p->_tid, &attr, func, param);++        if (!ret)+        {+            p->_created = 1;+            /*+            if (cpuSet)+            {+              // ret2 =+              pthread_setaffinity_np(p->_tid, sizeof(*cpuSet), cpuSet);+              // if (ret2) ret = ret2;+            }+            */+        }+    }+    // ret2 =+    pthread_attr_destroy(&attr);+    // if (ret2 != 0) ret = ret2;+    return ret;+}++WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param)+{+    return Thread_Create_With_CpuSet(p, func, param, NULL);+}++WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity)+{+    Print("Thread_Create_WithAffinity");+    CCpuSet cs;+    unsigned i;+    CpuSet_Zero(&cs);+    for (i = 0; i < sizeof(affinity) * 8; i++)+    {+        if (affinity == 0)+            break;+        if (affinity & 1)+        {+            CpuSet_Set(&cs, i);+        }+        affinity >>= 1;+    }+    return Thread_Create_With_CpuSet(p, func, param, &cs);+}++WRes Thread_Close(CThread *p)+{+    // Print("Thread_Close");+    int ret;+    if (!p->_created)+        return 0;++    ret = pthread_detach(p->_tid);+    p->_tid = 0;+    p->_created = 0;+    return ret;+}++WRes Thread_Wait_Close(CThread *p)+{+    // Print("Thread_Wait_Close");+    void *thread_return;+    int ret;+    if (!p->_created)+        return EINVAL;++    ret = pthread_join(p->_tid, &thread_return);+    // probably we can't use that (_tid) after pthread_join(), so we close thread here+    p->_created = 0;+    p->_tid = 0;+    return ret;+}++static WRes Event_Create(CEvent *p, int manualReset, int signaled)+{+    RINOK(pthread_mutex_init(&p->_mutex, NULL));+    RINOK(pthread_cond_init(&p->_cond, NULL));+    p->_manual_reset = manualReset;+    p->_state = (signaled ? True : False);+    p->_created = 1;+    return 0;+}++WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled)+{+    return Event_Create(p, True, signaled);+}+WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p)+{+    return ManualResetEvent_Create(p, 0);+}+WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled)+{+    return Event_Create(p, False, signaled);+}+WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p)+{+    return AutoResetEvent_Create(p, 0);+}++WRes Event_Set(CEvent *p)+{+    RINOK(pthread_mutex_lock(&p->_mutex));+    p->_state = True;+    int res1 = pthread_cond_broadcast(&p->_cond);+    int res2 = pthread_mutex_unlock(&p->_mutex);+    return (res2 ? res2 : res1);+}++WRes Event_Reset(CEvent *p)+{+    RINOK(pthread_mutex_lock(&p->_mutex));+    p->_state = False;+    return pthread_mutex_unlock(&p->_mutex);+}++WRes Event_Wait(CEvent *p)+{+    RINOK(pthread_mutex_lock(&p->_mutex));+    while (p->_state == False)+    {+        // ETIMEDOUT+        // ret =+        pthread_cond_wait(&p->_cond, &p->_mutex);+        // if (ret != 0) break;+    }+    if (p->_manual_reset == False)+    {+        p->_state = False;+    }+    return pthread_mutex_unlock(&p->_mutex);+}++WRes Event_Close(CEvent *p)+{+    if (!p->_created)+        return 0;+    p->_created = 0;+    {+        int res1 = pthread_mutex_destroy(&p->_mutex);+        int res2 = pthread_cond_destroy(&p->_cond);+        return (res1 ? res1 : res2);+    }+}++WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount)+{+    if (initCount > maxCount || maxCount < 1)+        return EINVAL;+    RINOK(pthread_mutex_init(&p->_mutex, NULL));+    RINOK(pthread_cond_init(&p->_cond, NULL));+    p->_count = initCount;+    p->_maxCount = maxCount;+    p->_created = 1;+    return 0;+}++WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount)+{+    if (Semaphore_IsCreated(p))+    {+        /*+        WRes wres = Semaphore_Close(p);+        if (wres != 0)+          return wres;+        */+        if (initCount > maxCount || maxCount < 1)+            return EINVAL;+        // return EINVAL; // for debug+        p->_count = initCount;+        p->_maxCount = maxCount;+        return 0;+    }+    return Semaphore_Create(p, initCount, maxCount);+}++WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount)+{+    UInt32 newCount;+    int ret;++    if (releaseCount < 1)+        return EINVAL;++    RINOK(pthread_mutex_lock(&p->_mutex));++    newCount = p->_count + releaseCount;+    if (newCount > p->_maxCount)+        ret = ERROR_TOO_MANY_POSTS; // EINVAL;+    else+    {+        p->_count = newCount;+        ret = pthread_cond_broadcast(&p->_cond);+    }+    RINOK(pthread_mutex_unlock(&p->_mutex));+    return ret;+}++WRes Semaphore_Wait(CSemaphore *p)+{+    RINOK(pthread_mutex_lock(&p->_mutex));+    while (p->_count < 1)+    {+        pthread_cond_wait(&p->_cond, &p->_mutex);+    }+    p->_count--;+    return pthread_mutex_unlock(&p->_mutex);+}++WRes Semaphore_Close(CSemaphore *p)+{+    if (!p->_created)+        return 0;+    p->_created = 0;+    {+        int res1 = pthread_mutex_destroy(&p->_mutex);+        int res2 = pthread_cond_destroy(&p->_cond);+        return (res1 ? res1 : res2);+    }+}++WRes CriticalSection_Init(CCriticalSection *p)+{+    // Print("CriticalSection_Init");+    if (!p)+        return EINTR;+    return pthread_mutex_init(&p->_mutex, NULL);+}++void CriticalSection_Enter(CCriticalSection *p)+{+    // Print("CriticalSection_Enter");+    if (p)+    {+        // int ret =+        pthread_mutex_lock(&p->_mutex);+    }+}++void CriticalSection_Leave(CCriticalSection *p)+{+    // Print("CriticalSection_Leave");+    if (p)+    {+        // int ret =+        pthread_mutex_unlock(&p->_mutex);+    }+}++void CriticalSection_Delete(CCriticalSection *p)+{+    // Print("CriticalSection_Delete");+    if (p)+    {+        // int ret =+        pthread_mutex_destroy(&p->_mutex);+    }+}++LONG InterlockedIncrement(LONG volatile *addend)+{+// Print("InterlockedIncrement");+#ifdef USE_HACK_UNSAFE_ATOMIC+    LONG val = *addend + 1;+    *addend = val;+    return val;+#else+    return __sync_add_and_fetch(addend, 1);+#endif+}++#endif // _WIN32++EXTERN_C_BEGIN++typedef struct _CMtSync+{+    UInt32 numProcessedBlocks;+    CThread thread;+    UInt64 affinity;++    BoolInt wasCreated;+    BoolInt needStart;+    BoolInt csWasInitialized;+    BoolInt csWasEntered;++    BoolInt exit;+    BoolInt stopWriting;++    CAutoResetEvent canStart;+    CAutoResetEvent wasStopped;+    CSemaphore freeSemaphore;+    CSemaphore filledSemaphore;+    CCriticalSection cs;+    // UInt32 numBlocks_Sent;+} CMtSync;++typedef UInt32 *(*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances);++/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */+#define kMtCacheLineDummy 128++typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos,+                            UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc);++typedef struct _CMatchFinderMt+{+    /* LZ */+    const Byte *pointerToCurPos;+    UInt32 *btBuf;+    const UInt32 *btBufPos;+    const UInt32 *btBufPosLimit;+    UInt32 lzPos;+    UInt32 btNumAvailBytes;++    UInt32 *hash;+    UInt32 fixedHashSize;+    // UInt32 hash4Mask;+    UInt32 historySize;+    const UInt32 *crc;++    Mf_Mix_Matches MixMatchesFunc;+    UInt32 failure_LZ_BT; // failure in BT transfered to LZ+    // UInt32 failure_LZ_LZ; // failure in LZ tables+    UInt32 failureBuf[1];+    // UInt32 crc[256];++    /* LZ + BT */+    CMtSync btSync;+    Byte btDummy[kMtCacheLineDummy];++    /* BT */+    UInt32 *hashBuf;+    UInt32 hashBufPos;+    UInt32 hashBufPosLimit;+    UInt32 hashNumAvail;+    UInt32 failure_BT;++    CLzRef *son;+    UInt32 matchMaxLen;+    UInt32 numHashBytes;+    UInt32 pos;+    const Byte *buffer;+    UInt32 cyclicBufferPos;+    UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */+    UInt32 cutValue;++    /* BT + Hash */+    CMtSync hashSync;+    /* Byte hashDummy[kMtCacheLineDummy]; */++    /* Hash */+    Mf_GetHeads GetHeadsFunc;+    CMatchFinder *MatchFinder;+    // CMatchFinder MatchFinder;+} CMatchFinderMt;++// only for Mt part+void MatchFinderMt_Construct(CMatchFinderMt *p);+void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc);++SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,+                          UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc);+void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder2 *vTable);++/* call MatchFinderMt_InitMt() before IMatchFinder::Init() */+SRes MatchFinderMt_InitMt(CMatchFinderMt *p);+void MatchFinderMt_ReleaseStream(CMatchFinderMt *p);++EXTERN_C_END++#endif++/* LzFindMt.c -- multithreaded Match finder for LZ algorithms+2021-12-21 : Igor Pavlov : Public domain */++// #include <stdio.h>++// #define LOG_ITERS++// #define LOG_THREAD++#ifdef LOG_ITERS+#include <stdio.h>+extern UInt64 g_NumIters_Tree;+extern UInt64 g_NumIters_Loop;+extern UInt64 g_NumIters_Bytes;+#define LOG_ITER(x) x+#else+#define LOG_ITER(x)+#endif++#define kMtHashBlockSize ((UInt32)1 << 17)+#define kMtHashNumBlocks (1 << 1)++#define GET_HASH_BLOCK_OFFSET(i) (((i) & (kMtHashNumBlocks - 1)) * kMtHashBlockSize)++#define kMtBtBlockSize ((UInt32)1 << 16)+#define kMtBtNumBlocks (1 << 4)++#define GET_BT_BLOCK_OFFSET(i) (((i) & (kMtBtNumBlocks - 1)) * (size_t)kMtBtBlockSize)++/*+  HASH functions:+  We use raw 8/16 bits from a[1] and a[2],+  xored with crc(a[0]) and crc(a[3]).+  We check a[0], a[3] only. We don't need to compare a[1] and a[2] in matches.+  our crc() function provides one-to-one correspondence for low 8-bit values:+    (crc[0...0xFF] & 0xFF) <-> [0...0xFF]+*/++#define MF(mt) ((mt)->MatchFinder)+#define MF_CRC (p->crc)++// #define MF(mt) (&(mt)->MatchFinder)+// #define MF_CRC (p->MatchFinder.crc)++#define MT_HASH2_CALC \+    h2 = (MF_CRC[cur[0]] ^ cur[1]) & (kHash2Size - 1);++#define MT_HASH3_CALC                                           \+    {                                                           \+        UInt32 temp = MF_CRC[cur[0]] ^ cur[1];                  \+        h2 = temp & (kHash2Size - 1);                           \+        h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \+    }++/*+#define MT_HASH3_CALC__NO_2 { \+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \+  h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); }++#define __MT_HASH4_CALC { \+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \+  h2 = temp & (kHash2Size - 1); \+  temp ^= ((UInt32)cur[2] << 8); \+  h3 = temp & (kHash3Size - 1); \+  h4 = (temp ^ (p->crc[cur[3]] << kLzHash_CrcShift_1)) & p->hash4Mask; }+  // (kHash4Size - 1);+*/++MY_NO_INLINE+static void MtSync_Construct(CMtSync *p)+{+    p->affinity = 0;+    p->wasCreated = False;+    p->csWasInitialized = False;+    p->csWasEntered = False;+    Thread_Construct(&p->thread);+    Event_Construct(&p->canStart);+    Event_Construct(&p->wasStopped);+    Semaphore_Construct(&p->freeSemaphore);+    Semaphore_Construct(&p->filledSemaphore);+}++#define DEBUG_BUFFER_LOCK // define it to debug lock state++#ifdef DEBUG_BUFFER_LOCK+#include <stdlib.h>+#define BUFFER_MUST_BE_LOCKED(p) \+    if (!(p)->csWasEntered)      \+        exit(1);+#define BUFFER_MUST_BE_UNLOCKED(p) \+    if ((p)->csWasEntered)         \+        exit(1);+#else+#define BUFFER_MUST_BE_LOCKED(p)+#define BUFFER_MUST_BE_UNLOCKED(p)+#endif++#define LOCK_BUFFER(p)                   \+    {                                    \+        BUFFER_MUST_BE_UNLOCKED(p);      \+        CriticalSection_Enter(&(p)->cs); \+        (p)->csWasEntered = True;        \+    }++#define UNLOCK_BUFFER(p)                 \+    {                                    \+        BUFFER_MUST_BE_LOCKED(p);        \+        CriticalSection_Leave(&(p)->cs); \+        (p)->csWasEntered = False;       \+    }++MY_NO_INLINE+static UInt32 MtSync_GetNextBlock(CMtSync *p)+{+    UInt32 numBlocks = 0;+    if (p->needStart)+    {+        BUFFER_MUST_BE_UNLOCKED(p)+        p->numProcessedBlocks = 1;+        p->needStart = False;+        p->stopWriting = False;+        p->exit = False;+        Event_Reset(&p->wasStopped);+        Event_Set(&p->canStart);+    }+    else+    {+        UNLOCK_BUFFER(p)+        // we free current block+        numBlocks = p->numProcessedBlocks++;+        Semaphore_Release1(&p->freeSemaphore);+    }++    // buffer is UNLOCKED here+    Semaphore_Wait(&p->filledSemaphore);+    LOCK_BUFFER(p);+    return numBlocks;+}++/* if Writing (Processing) thread was started, we must call MtSync_StopWriting() */++MY_NO_INLINE+static void MtSync_StopWriting(CMtSync *p)+{+    if (!Thread_WasCreated(&p->thread) || p->needStart)+        return;++    PRF(printf("\nMtSync_StopWriting %p\n", p));++    if (p->csWasEntered)+    {+        /* we don't use buffer in this thread after StopWriting().+           So we UNLOCK buffer.+           And we restore default UNLOCKED state for stopped thread */+        UNLOCK_BUFFER(p)+    }++    /* We send (p->stopWriting) message and release freeSemaphore+       to free current block.+       So the thread will see (p->stopWriting) at some+       iteration after Wait(freeSemaphore).+       The thread doesn't need to fill all avail free blocks,+       so we can get fast thread stop.+    */++    p->stopWriting = True;+    Semaphore_Release1(&p->freeSemaphore); // check semaphore count !!!++    PRF(printf("\nMtSync_StopWriting %p : Event_Wait(&p->wasStopped)\n", p));+    Event_Wait(&p->wasStopped);+    PRF(printf("\nMtSync_StopWriting %p : Event_Wait() finsihed\n", p));++    /* 21.03 : we don't restore samaphore counters here.+       We will recreate and reinit samaphores in next start */++    p->needStart = True;+}++MY_NO_INLINE+static void MtSync_Destruct(CMtSync *p)+{+    PRF(printf("\nMtSync_Destruct %p\n", p));++    if (Thread_WasCreated(&p->thread))+    {+        /* we want thread to be in Stopped state before sending EXIT command.+           note: stop(btSync) will stop (htSync) also */+        MtSync_StopWriting(p);+        /* thread in Stopped state here : (p->needStart == true) */+        p->exit = True;+        // if (p->needStart)  // it's (true)+        Event_Set(&p->canStart);       // we send EXIT command to thread+        Thread_Wait_Close(&p->thread); // we wait thread finishing+    }++    if (p->csWasInitialized)+    {+        CriticalSection_Delete(&p->cs);+        p->csWasInitialized = False;+    }+    p->csWasEntered = False;++    Event_Close(&p->canStart);+    Event_Close(&p->wasStopped);+    Semaphore_Close(&p->freeSemaphore);+    Semaphore_Close(&p->filledSemaphore);++    p->wasCreated = False;+}++// #define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; }+// we want to get real system error codes here instead of SZ_ERROR_THREAD+#define RINOK_THREAD(x) RINOK(x)++// call it before each new file (when new starting is required):+MY_NO_INLINE+static SRes MtSync_Init(CMtSync *p, UInt32 numBlocks)+{+    WRes wres;+    // BUFFER_MUST_BE_UNLOCKED(p)+    if (!p->needStart || p->csWasEntered)+        return SZ_ERROR_FAIL;+    wres = Semaphore_OptCreateInit(&p->freeSemaphore, numBlocks, numBlocks);+    if (wres == 0)+        wres = Semaphore_OptCreateInit(&p->filledSemaphore, 0, numBlocks);+    return MY_SRes_HRESULT_FROM_WRes(wres);+}++static WRes MtSync_Create_WRes(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj)+{+    WRes wres;++    if (p->wasCreated)+        return SZ_OK;++    RINOK_THREAD(CriticalSection_Init(&p->cs));+    p->csWasInitialized = True;+    p->csWasEntered = False;++    RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canStart));+    RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStopped));++    p->needStart = True;+    p->exit = True; /* p->exit is unused before (canStart) Event.+      But in case of some unexpected code failure we will get fast exit from thread */++    // return ERROR_TOO_MANY_POSTS; // for debug+    // return EINVAL; // for debug++    if (p->affinity != 0)+        wres = Thread_Create_With_Affinity(&p->thread, startAddress, obj, (CAffinityMask)p->affinity);+    else+        wres = Thread_Create(&p->thread, startAddress, obj);++    RINOK_THREAD(wres);+    p->wasCreated = True;+    return SZ_OK;+}++MY_NO_INLINE+static SRes MtSync_Create(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj)+{+    const WRes wres = MtSync_Create_WRes(p, startAddress, obj);+    if (wres == 0)+        return 0;+    MtSync_Destruct(p);+    return MY_SRes_HRESULT_FROM_WRes(wres);+}++// ---------- HASH THREAD ----------++#define kMtMaxValForNormalize 0xFFFFFFFF+// #define kMtMaxValForNormalize ((1 << 21)) // for debug+// #define kNormalizeAlign (1 << 7) // alignment for speculated accesses++#ifdef MY_CPU_LE_UNALIGN+#define GetUi24hi_from32(p) ((UInt32)GetUi32(p) >> 8)+#else+#define GetUi24hi_from32(p) ((p)[1] ^ ((UInt32)(p)[2] << 8) ^ ((UInt32)(p)[3] << 16))+#endif++#define GetHeads_DECL(name)                               \+    static void GetHeads##name(const Byte *p, UInt32 pos, \+                               UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc)++#define GetHeads_LOOP(v)              \+    for (; numHeads != 0; numHeads--) \+    {                                 \+        const UInt32 value = (v);     \+        p++;                          \+        *heads++ = pos - hash[value]; \+        hash[value] = pos++;          \+    }++#define DEF_GetHeads2(name, v, action) \+    GetHeads_DECL(name)                \+    {                                  \+        action                         \+        GetHeads_LOOP(v)               \+    }++#define DEF_GetHeads(name, v) DEF_GetHeads2(name, v, ;)++DEF_GetHeads2(2, GetUi16(p), UNUSED_VAR(hashMask); UNUSED_VAR(crc);)+    DEF_GetHeads(3, (crc[p[0]] ^ GetUi16(p + 1)) & hashMask)+        DEF_GetHeads2(3b, GetUi16(p) ^ ((UInt32)(p)[2] << 16), UNUSED_VAR(hashMask); UNUSED_VAR(crc);)+// BT3 is not good for crc collisions for big hashMask values.++/*+GetHeads_DECL(3b)+{+  UNUSED_VAR(hashMask);+  UNUSED_VAR(crc);+  {+  const Byte *pLim = p + numHeads;+  if (numHeads == 0)+    return;+  pLim--;+  while (p < pLim)+  {+    UInt32 v1 = GetUi32(p);+    UInt32 v0 = v1 & 0xFFFFFF;+    UInt32 h0, h1;+    p += 2;+    v1 >>= 8;+    h0 = hash[v0]; hash[v0] = pos; heads[0] = pos - h0; pos++;+    h1 = hash[v1]; hash[v1] = pos; heads[1] = pos - h1; pos++;+    heads += 2;+  }+  if (p == pLim)+  {+    UInt32 v0 = GetUi16(p) ^ ((UInt32)(p)[2] << 16);+    *heads = pos - hash[v0];+    hash[v0] = pos;+  }+  }+}+*/++/*+GetHeads_DECL(4)+{+  unsigned sh = 0;+  UNUSED_VAR(crc)+  while ((hashMask & 0x80000000) == 0)+  {+    hashMask <<= 1;+    sh++;+  }+  GetHeads_LOOP((GetUi32(p) * 0xa54a1) >> sh)+}+#define GetHeads4b GetHeads4+*/++#define USE_GetHeads_LOCAL_CRC++#ifdef USE_GetHeads_LOCAL_CRC++            GetHeads_DECL(4)+{+    UInt32 crc0[256];+    UInt32 crc1[256];+    {+        unsigned i;+        for (i = 0; i < 256; i++)+        {+            UInt32 v = crc[i];+            crc0[i] = v & hashMask;+            crc1[i] = (v << kLzHash_CrcShift_1) & hashMask;+            // crc1[i] = rotlFixed(v, 8) & hashMask;+        }+    }+    GetHeads_LOOP(crc0[p[0]] ^ crc1[p[3]] ^ (UInt32)GetUi16(p + 1))+}++GetHeads_DECL(4b)+{+    UInt32 crc0[256];+    {+        unsigned i;+        for (i = 0; i < 256; i++)+            crc0[i] = crc[i] & hashMask;+    }+    GetHeads_LOOP(crc0[p[0]] ^ GetUi24hi_from32(p))+}++GetHeads_DECL(5)+{+    UInt32 crc0[256];+    UInt32 crc1[256];+    UInt32 crc2[256];+    {+        unsigned i;+        for (i = 0; i < 256; i++)+        {+            UInt32 v = crc[i];+            crc0[i] = v & hashMask;+            crc1[i] = (v << kLzHash_CrcShift_1) & hashMask;+            crc2[i] = (v << kLzHash_CrcShift_2) & hashMask;+        }+    }+    GetHeads_LOOP(crc0[p[0]] ^ crc1[p[3]] ^ crc2[p[4]] ^ (UInt32)GetUi16(p + 1))+}++GetHeads_DECL(5b)+{+    UInt32 crc0[256];+    UInt32 crc1[256];+    {+        unsigned i;+        for (i = 0; i < 256; i++)+        {+            UInt32 v = crc[i];+            crc0[i] = v & hashMask;+            crc1[i] = (v << kLzHash_CrcShift_1) & hashMask;+        }+    }+    GetHeads_LOOP(crc0[p[0]] ^ crc1[p[4]] ^ GetUi24hi_from32(p))+}++#else++            DEF_GetHeads(4, (crc[p[0]] ^ (crc[p[3]] << kLzHash_CrcShift_1) ^ (UInt32)GetUi16(p + 1)) & hashMask)+                DEF_GetHeads(4b, (crc[p[0]] ^ GetUi24hi_from32(p)) & hashMask)+                    DEF_GetHeads(5, (crc[p[0]] ^ (crc[p[3]] << kLzHash_CrcShift_1) ^ (crc[p[4]] << kLzHash_CrcShift_2) ^ (UInt32)GetUi16(p + 1)) & hashMask)+                        DEF_GetHeads(5b, (crc[p[0]] ^ (crc[p[4]] << kLzHash_CrcShift_1) ^ GetUi24hi_from32(p)) & hashMask)++#endif++static void HashThreadFunc(CMatchFinderMt *mt)+{+    CMtSync *p = &mt->hashSync;+    PRF(printf("\nHashThreadFunc\n"));++    for (;;)+    {+        UInt32 blockIndex = 0;+        PRF(printf("\nHashThreadFunc : Event_Wait(&p->canStart)\n"));+        Event_Wait(&p->canStart);+        PRF(printf("\nHashThreadFunc : Event_Wait(&p->canStart) : after \n"));+        if (p->exit)+        {+            PRF(printf("\nHashThreadFunc : exit \n"));+            return;+        }++        MatchFinder_Init_HighHash(MF(mt));++        for (;;)+        {+            PRF(printf("Hash thread block = %d pos = %d\n", (unsigned)blockIndex, mt->MatchFinder->pos));++            {+                CMatchFinder *mf = MF(mt);+                if (MatchFinder_NeedMove(mf))+                {+                    CriticalSection_Enter(&mt->btSync.cs);+                    CriticalSection_Enter(&mt->hashSync.cs);+                    {+                        const Byte *beforePtr = Inline_MatchFinder_GetPointerToCurrentPos(mf);+                        ptrdiff_t offset;+                        MatchFinder_MoveBlock(mf);+                        offset = beforePtr - Inline_MatchFinder_GetPointerToCurrentPos(mf);+                        mt->pointerToCurPos -= offset;+                        mt->buffer -= offset;+                    }+                    CriticalSection_Leave(&mt->hashSync.cs);+                    CriticalSection_Leave(&mt->btSync.cs);+                    continue;+                }++                Semaphore_Wait(&p->freeSemaphore);++                if (p->exit) // exit is unexpected here. But we check it here for some failure case+                    return;++                // for faster stop : we check (p->stopWriting) after Wait(freeSemaphore)+                if (p->stopWriting)+                    break;++                MatchFinder_ReadIfRequired(mf);+                {+                    UInt32 *heads = mt->hashBuf + GET_HASH_BLOCK_OFFSET(blockIndex++);+                    UInt32 num = Inline_MatchFinder_GetNumAvailableBytes(mf);+                    heads[0] = 2;+                    heads[1] = num;++                    /* heads[1] contains the number of avail bytes:+                       if (avail < mf->numHashBytes) :+                       {+                         it means that stream was finished+                         HASH_THREAD and BT_TREAD must move position for heads[1] (avail) bytes.+                         HASH_THREAD doesn't stop,+                         HASH_THREAD fills only the header (2 numbers) for all next blocks:+                         {2, NumHashBytes - 1}, {2,0}, {2,0}, ... , {2,0}+                       }+                       else+                       {+                         HASH_THREAD and BT_TREAD must move position for (heads[0] - 2) bytes;+                       }+                    */++                    if (num >= mf->numHashBytes)+                    {+                        num = num - mf->numHashBytes + 1;+                        if (num > kMtHashBlockSize - 2)+                            num = kMtHashBlockSize - 2;++                        if (mf->pos > (UInt32)kMtMaxValForNormalize - num)+                        {+                            const UInt32 subValue = (mf->pos - mf->historySize - 1); // & ~(UInt32)(kNormalizeAlign - 1);+                            Inline_MatchFinder_ReduceOffsets(mf, subValue);+                            MatchFinder_Normalize3(subValue, mf->hash + mf->fixedHashSize, (size_t)mf->hashMask + 1);+                        }++                        heads[0] = 2 + num;+                        mt->GetHeadsFunc(mf->buffer, mf->pos, mf->hash + mf->fixedHashSize, mf->hashMask, heads + 2, num, mf->crc);+                    }++                    mf->pos += num; // wrap over zero is allowed at the end of stream+                    mf->buffer += num;+                }+            }++            Semaphore_Release1(&p->filledSemaphore);+        } // for() processing end++        // p->numBlocks_Sent = blockIndex;+        Event_Set(&p->wasStopped);+    } // for() thread end+}++// ---------- BT THREAD ----------++/* we use one variable instead of two (cyclicBufferPos == pos) before CyclicBuf wrap.+   here we define fixed offset of (p->pos) from (p->cyclicBufferPos) */+#define CYC_TO_POS_OFFSET 0+// #define CYC_TO_POS_OFFSET 1 // for debug++#define MFMT_GM_INLINE++#ifdef MFMT_GM_INLINE++/*+  we use size_t for (pos) instead of UInt32+  to eliminate "movsx" BUG in old MSVC x64 compiler.+*/++UInt32 *MY_FAST_CALL GetMatchesSpecN_2(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son,+                                       UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size,+                                       size_t _cyclicBufferPos, UInt32 _cyclicBufferSize,+                                       UInt32 *posRes);++#endif++static void BtGetMatches(CMatchFinderMt *p, UInt32 *d)+{+    UInt32 numProcessed = 0;+    UInt32 curPos = 2;++    /* GetMatchesSpec() functions don't create (len = 1)+       in [len, dist] match pairs, if (p->numHashBytes >= 2)+       Also we suppose here that (matchMaxLen >= 2).+       So the following code for (reserve) is not required+       UInt32 reserve = (p->matchMaxLen * 2);+       const UInt32 kNumHashBytes_Max = 5; // BT_HASH_BYTES_MAX+       if (reserve < kNumHashBytes_Max - 1)+          reserve = kNumHashBytes_Max - 1;+       const UInt32 limit = kMtBtBlockSize - (reserve);+    */++    const UInt32 limit = kMtBtBlockSize - (p->matchMaxLen * 2);++    d[1] = p->hashNumAvail;++    if (p->failure_BT)+    {+        // printf("\n == 1 BtGetMatches() p->failure_BT\n");+        d[0] = 0;+        // d[1] = 0;+        return;+    }++    while (curPos < limit)+    {+        if (p->hashBufPos == p->hashBufPosLimit)+        {+            // MatchFinderMt_GetNextBlock_Hash(p);+            UInt32 avail;+            {+                const UInt32 bi = MtSync_GetNextBlock(&p->hashSync);+                const UInt32 k = GET_HASH_BLOCK_OFFSET(bi);+                const UInt32 *h = p->hashBuf + k;+                avail = h[1];+                p->hashBufPosLimit = k + h[0];+                p->hashNumAvail = avail;+                p->hashBufPos = k + 2;+            }++            {+                /* we must prevent UInt32 overflow for avail total value,+                   if avail was increased with new hash block */+                UInt32 availSum = numProcessed + avail;+                if (availSum < numProcessed)+                    availSum = (UInt32)(Int32)-1;+                d[1] = availSum;+            }++            if (avail >= p->numHashBytes)+                continue;++            // if (p->hashBufPos != p->hashBufPosLimit) exit(1);++            /* (avail < p->numHashBytes)+               It means that stream was finished.+               And (avail) - is a number of remaining bytes,+               we fill (d) for (avail) bytes for LZ_THREAD (receiver).+               but we don't update (p->pos) and (p->cyclicBufferPos) here in BT_THREAD */++            /* here we suppose that we have space enough:+               (kMtBtBlockSize - curPos >= p->hashNumAvail) */+            p->hashNumAvail = 0;+            d[0] = curPos + avail;+            d += curPos;+            for (; avail != 0; avail--)+                *d++ = 0;+            return;+        }+        {+            UInt32 size = p->hashBufPosLimit - p->hashBufPos;+            UInt32 pos = p->pos;+            UInt32 cyclicBufferPos = p->cyclicBufferPos;+            UInt32 lenLimit = p->matchMaxLen;+            if (lenLimit >= p->hashNumAvail)+                lenLimit = p->hashNumAvail;+            {+                UInt32 size2 = p->hashNumAvail - lenLimit + 1;+                if (size2 < size)+                    size = size2;+                size2 = p->cyclicBufferSize - cyclicBufferPos;+                if (size2 < size)+                    size = size2;+            }++            if (pos > (UInt32)kMtMaxValForNormalize - size)+            {+                const UInt32 subValue = (pos - p->cyclicBufferSize); // & ~(UInt32)(kNormalizeAlign - 1);+                pos -= subValue;+                p->pos = pos;+                MatchFinder_Normalize3(subValue, p->son, (size_t)p->cyclicBufferSize * 2);+            }++#ifndef MFMT_GM_INLINE+            while (curPos < limit && size-- != 0)+            {+                UInt32 *startDistances = d + curPos;+                UInt32 num = (UInt32)(GetMatchesSpec1(lenLimit, pos - p->hashBuf[p->hashBufPos++],+                                                      pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue,+                                                      startDistances + 1, p->numHashBytes - 1) -+                                      startDistances);+                *startDistances = num - 1;+                curPos += num;+                cyclicBufferPos++;+                pos++;+                p->buffer++;+            }+#else+            {+                UInt32 posRes = pos;+                const UInt32 *d_end;+                {+                    d_end = GetMatchesSpecN_2(+                        p->buffer + lenLimit - 1,+                        pos, p->buffer, p->son, p->cutValue, d + curPos,+                        p->numHashBytes - 1, p->hashBuf + p->hashBufPos,+                        d + limit, p->hashBuf + p->hashBufPos + size,+                        cyclicBufferPos, p->cyclicBufferSize,+                        &posRes);+                }+                {+                    if (!d_end)+                    {+                        // printf("\n == 2 BtGetMatches() p->failure_BT\n");+                        // internal data failure+                        p->failure_BT = True;+                        d[0] = 0;+                        // d[1] = 0;+                        return;+                    }+                }+                curPos = (UInt32)(d_end - d);+                {+                    const UInt32 processed = posRes - pos;+                    pos = posRes;+                    p->hashBufPos += processed;+                    cyclicBufferPos += processed;+                    p->buffer += processed;+                }+            }+#endif++            {+                const UInt32 processed = pos - p->pos;+                numProcessed += processed;+                p->hashNumAvail -= processed;+                p->pos = pos;+            }+            if (cyclicBufferPos == p->cyclicBufferSize)+                cyclicBufferPos = 0;+            p->cyclicBufferPos = cyclicBufferPos;+        }+    }++    d[0] = curPos;+}++static void BtFillBlock(CMatchFinderMt *p, UInt32 globalBlockIndex)+{+    CMtSync *sync = &p->hashSync;++    BUFFER_MUST_BE_UNLOCKED(sync)++    if (!sync->needStart)+    {+        LOCK_BUFFER(sync)+    }++    BtGetMatches(p, p->btBuf + GET_BT_BLOCK_OFFSET(globalBlockIndex));++    /* We suppose that we have called GetNextBlock() from start.+       So buffer is LOCKED */++    UNLOCK_BUFFER(sync)+}++MY_NO_INLINE+static void BtThreadFunc(CMatchFinderMt *mt)+{+    CMtSync *p = &mt->btSync;+    for (;;)+    {+        UInt32 blockIndex = 0;+        Event_Wait(&p->canStart);++        for (;;)+        {+            PRF(printf("  BT thread block = %d  pos = %d\n", (unsigned)blockIndex, mt->pos));+            /* (p->exit == true) is possible after (p->canStart) at first loop iteration+               and is unexpected after more Wait(freeSemaphore) iterations */+            if (p->exit)+                return;++            Semaphore_Wait(&p->freeSemaphore);++            // for faster stop : we check (p->stopWriting) after Wait(freeSemaphore)+            if (p->stopWriting)+                break;++            BtFillBlock(mt, blockIndex++);++            Semaphore_Release1(&p->filledSemaphore);+        }++        // we stop HASH_THREAD here+        MtSync_StopWriting(&mt->hashSync);++        // p->numBlocks_Sent = blockIndex;+        Event_Set(&p->wasStopped);+    }+}++void MatchFinderMt_Construct(CMatchFinderMt *p)+{+    p->hashBuf = NULL;+    MtSync_Construct(&p->hashSync);+    MtSync_Construct(&p->btSync);+}++static void MatchFinderMt_FreeMem(CMatchFinderMt *p, ISzAllocPtr alloc)+{+    ISzAlloc_Free(alloc, p->hashBuf);+    p->hashBuf = NULL;+}++void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc)+{+    /*+       HASH_THREAD can use CriticalSection(s) btSync.cs and hashSync.cs.+       So we must be sure that HASH_THREAD will not use CriticalSection(s)+       after deleting CriticalSection here.++       we call ReleaseStream(p)+         that calls StopWriting(btSync)+           that calls StopWriting(hashSync), if it's required to stop HASH_THREAD.+       after StopWriting() it's safe to destruct MtSync(s) in any order */++    MatchFinderMt_ReleaseStream(p);++    MtSync_Destruct(&p->btSync);+    MtSync_Destruct(&p->hashSync);++    LOG_ITER(+        printf("\nTree %9d * %7d iter = %9d = sum  :  bytes = %9d\n",+               (UInt32)(g_NumIters_Tree / 1000),+               (UInt32)(((UInt64)g_NumIters_Loop * 1000) / (g_NumIters_Tree + 1)),+               (UInt32)(g_NumIters_Loop / 1000),+               (UInt32)(g_NumIters_Bytes / 1000)));++    MatchFinderMt_FreeMem(p, alloc);+}++#define kHashBufferSize (kMtHashBlockSize * kMtHashNumBlocks)+#define kBtBufferSize (kMtBtBlockSize * kMtBtNumBlocks)++static THREAD_FUNC_DECL HashThreadFunc2(void *p)+{+    HashThreadFunc((CMatchFinderMt *)p);+    return 0;+}+static THREAD_FUNC_DECL BtThreadFunc2(void *p)+{+    Byte allocaDummy[0x180];+    unsigned i = 0;+    for (i = 0; i < 16; i++)+        allocaDummy[i] = (Byte)0;+    if (allocaDummy[0] == 0)+        BtThreadFunc((CMatchFinderMt *)p);+    return 0;+}++SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,+                          UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc)+{+    CMatchFinder *mf = MF(p);+    p->historySize = historySize;+    if (kMtBtBlockSize <= matchMaxLen * 4)+        return SZ_ERROR_PARAM;+    if (!p->hashBuf)+    {+        p->hashBuf = (UInt32 *)ISzAlloc_Alloc(alloc, ((size_t)kHashBufferSize + (size_t)kBtBufferSize) * sizeof(UInt32));+        if (!p->hashBuf)+            return SZ_ERROR_MEM;+        p->btBuf = p->hashBuf + kHashBufferSize;+    }+    keepAddBufferBefore += (kHashBufferSize + kBtBufferSize);+    keepAddBufferAfter += kMtHashBlockSize;+    if (!MatchFinder_Create(mf, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, alloc))+        return SZ_ERROR_MEM;++    RINOK(MtSync_Create(&p->hashSync, HashThreadFunc2, p));+    RINOK(MtSync_Create(&p->btSync, BtThreadFunc2, p));+    return SZ_OK;+}++SRes MatchFinderMt_InitMt(CMatchFinderMt *p)+{+    RINOK(MtSync_Init(&p->hashSync, kMtHashNumBlocks));+    return MtSync_Init(&p->btSync, kMtBtNumBlocks);+}++static void MatchFinderMt_Init(CMatchFinderMt *p)+{+    CMatchFinder *mf = MF(p);++    p->btBufPos =+        p->btBufPosLimit = NULL;+    p->hashBufPos =+        p->hashBufPosLimit = 0;+    p->hashNumAvail = 0; // 21.03++    p->failure_BT = False;++    /* Init without data reading. We don't want to read data in this thread */+    MatchFinder_Init_4(mf);++    MatchFinder_Init_LowHash(mf);++    p->pointerToCurPos = Inline_MatchFinder_GetPointerToCurrentPos(mf);+    p->btNumAvailBytes = 0;+    p->failure_LZ_BT = False;+    // p->failure_LZ_LZ = False;++    p->lzPos =+        1; // optimal smallest value+    // 0; // for debug: ignores match to start+    // kNormalizeAlign; // for debug++    p->hash = mf->hash;+    p->fixedHashSize = mf->fixedHashSize;+    // p->hash4Mask = mf->hash4Mask;+    p->crc = mf->crc;+    // memcpy(p->crc, mf->crc, sizeof(mf->crc));++    p->son = mf->son;+    p->matchMaxLen = mf->matchMaxLen;+    p->numHashBytes = mf->numHashBytes;++    /* (mf->pos) and (mf->streamPos) were already initialized to 1 in MatchFinder_Init_4() */+    // mf->streamPos = mf->pos = 1; // optimal smallest value+    // 0; // for debug: ignores match to start+    // kNormalizeAlign; // for debug++    /* we must init (p->pos = mf->pos) for BT, because+       BT code needs (p->pos == delta_value_for_empty_hash_record == mf->pos) */+    p->pos = mf->pos; // do not change it++    p->cyclicBufferPos = (p->pos - CYC_TO_POS_OFFSET);+    p->cyclicBufferSize = mf->cyclicBufferSize;+    p->buffer = mf->buffer;+    p->cutValue = mf->cutValue;+    // p->son[0] = p->son[1] = 0; // unused: to init skipped record for speculated accesses.+}++/* ReleaseStream is required to finish multithreading */+void MatchFinderMt_ReleaseStream(CMatchFinderMt *p)+{+    // Sleep(1); // for debug+    MtSync_StopWriting(&p->btSync);+    // Sleep(200); // for debug+    /* p->MatchFinder->ReleaseStream(); */+}++MY_NO_INLINE+static UInt32 MatchFinderMt_GetNextBlock_Bt(CMatchFinderMt *p)+{+    if (p->failure_LZ_BT)+        p->btBufPos = p->failureBuf;+    else+    {+        const UInt32 bi = MtSync_GetNextBlock(&p->btSync);+        const UInt32 *bt = p->btBuf + GET_BT_BLOCK_OFFSET(bi);+        {+            const UInt32 numItems = bt[0];+            p->btBufPosLimit = bt + numItems;+            p->btNumAvailBytes = bt[1];+            p->btBufPos = bt + 2;+            if (numItems < 2 || numItems > kMtBtBlockSize)+            {+                p->failureBuf[0] = 0;+                p->btBufPos = p->failureBuf;+                p->btBufPosLimit = p->failureBuf + 1;+                p->failure_LZ_BT = True;+                // p->btNumAvailBytes = 0;+                /* we don't want to decrease AvailBytes, that was load before.+                    that can be unxepected for the code that have loaded anopther value before */+            }+        }++        if (p->lzPos >= (UInt32)kMtMaxValForNormalize - (UInt32)kMtBtBlockSize)+        {+            /* we don't check (lzPos) over exact avail bytes in (btBuf).+               (fixedHashSize) is small, so normalization is fast */+            const UInt32 subValue = (p->lzPos - p->historySize - 1); // & ~(UInt32)(kNormalizeAlign - 1);+            p->lzPos -= subValue;+            MatchFinder_Normalize3(subValue, p->hash, p->fixedHashSize);+        }+    }+    return p->btNumAvailBytes;+}++static const Byte *MatchFinderMt_GetPointerToCurrentPos(CMatchFinderMt *p)+{+    return p->pointerToCurPos;+}++#define GET_NEXT_BLOCK_IF_REQUIRED       \+    if (p->btBufPos == p->btBufPosLimit) \+        MatchFinderMt_GetNextBlock_Bt(p);++static UInt32 MatchFinderMt_GetNumAvailableBytes(CMatchFinderMt *p)+{+    if (p->btBufPos != p->btBufPosLimit)+        return p->btNumAvailBytes;+    return MatchFinderMt_GetNextBlock_Bt(p);+}++// #define CHECK_FAILURE_LZ(_match_, _pos_) if (_match_ >= _pos_) { p->failure_LZ_LZ = True;  return d; }+#define CHECK_FAILURE_LZ(_match_, _pos_)++static UInt32 *MixMatches2(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d)+{+    UInt32 h2, c2;+    UInt32 *hash = p->hash;+    const Byte *cur = p->pointerToCurPos;+    const UInt32 m = p->lzPos;+    MT_HASH2_CALC++    c2 = hash[h2];+    hash[h2] = m;++    if (c2 >= matchMinPos)+    {+        CHECK_FAILURE_LZ(c2, m)+        if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0])+        {+            *d++ = 2;+            *d++ = m - c2 - 1;+        }+    }++    return d;+}++static UInt32 *MixMatches3(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d)+{+    UInt32 h2, h3, c2, c3;+    UInt32 *hash = p->hash;+    const Byte *cur = p->pointerToCurPos;+    const UInt32 m = p->lzPos;+    MT_HASH3_CALC++    c2 = hash[h2];+    c3 = (hash + kFix3HashSize)[h3];++    hash[h2] = m;+    (hash + kFix3HashSize)[h3] = m;++    if (c2 >= matchMinPos)+    {+        CHECK_FAILURE_LZ(c2, m)+        if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0])+        {+            d[1] = m - c2 - 1;+            if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2])+            {+                d[0] = 3;+                return d + 2;+            }+            d[0] = 2;+            d += 2;+        }+    }++    if (c3 >= matchMinPos)+    {+        CHECK_FAILURE_LZ(c3, m)+        if (cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0])+        {+            *d++ = 3;+            *d++ = m - c3 - 1;+        }+    }++    return d;+}++#define INCREASE_LZ_POS \+    p->lzPos++;         \+    p->pointerToCurPos++;++static UInt32 *MixMatches4(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d)+{+    UInt32 h2, h3, /* h4, */ c2, c3 /* , c4 */;+    UInt32 *hash = p->hash;+    const Byte *cur = p->pointerToCurPos;+    const UInt32 m = p->lzPos;+    MT_HASH3_CALC+    // MT_HASH4_CALC+    c2 = hash[h2];+    c3 = (hash + kFix3HashSize)[h3];+    // c4 = (hash + kFix4HashSize)[h4];++    hash[h2] = m;+    (hash + kFix3HashSize)[h3] = m;+    // (hash + kFix4HashSize)[h4] = m;++#define _USE_H2++#ifdef _USE_H2+    if (c2 >= matchMinPos && cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0])+    {+        d[1] = m - c2 - 1;+        if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2])+        {+            // d[0] = (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 3] == cur[3]) ? 4 : 3;+            // return d + 2;++            if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 3] == cur[3])+            {+                d[0] = 4;+                return d + 2;+            }+            d[0] = 3;+            d += 2;++#ifdef _USE_H4+            if (c4 >= matchMinPos)+                if (+                    cur[(ptrdiff_t)c4 - (ptrdiff_t)m] == cur[0] &&+                    cur[(ptrdiff_t)c4 - (ptrdiff_t)m + 3] == cur[3])+                {+                    *d++ = 4;+                    *d++ = m - c4 - 1;+                }+#endif+            return d;+        }+        d[0] = 2;+        d += 2;+    }+#endif++    if (c3 >= matchMinPos && cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0])+    {+        d[1] = m - c3 - 1;+        if (cur[(ptrdiff_t)c3 - (ptrdiff_t)m + 3] == cur[3])+        {+            d[0] = 4;+            return d + 2;+        }+        d[0] = 3;+        d += 2;+    }++#ifdef _USE_H4+    if (c4 >= matchMinPos)+        if (+            cur[(ptrdiff_t)c4 - (ptrdiff_t)m] == cur[0] &&+            cur[(ptrdiff_t)c4 - (ptrdiff_t)m + 3] == cur[3])+        {+            *d++ = 4;+            *d++ = m - c4 - 1;+        }+#endif++    return d;+}++static UInt32 *MatchFinderMt2_GetMatches(CMatchFinderMt *p, UInt32 *d)+{+    const UInt32 *bt = p->btBufPos;+    const UInt32 len = *bt++;+    const UInt32 *btLim = bt + len;+    p->btBufPos = btLim;+    p->btNumAvailBytes--;+    INCREASE_LZ_POS+    {+        while (bt != btLim)+        {+            const UInt32 v0 = bt[0];+            const UInt32 v1 = bt[1];+            bt += 2;+            d[0] = v0;+            d[1] = v1;+            d += 2;+        }+    }+    return d;+}++static UInt32 *MatchFinderMt_GetMatches(CMatchFinderMt *p, UInt32 *d)+{+    const UInt32 *bt = p->btBufPos;+    UInt32 len = *bt++;+    const UInt32 avail = p->btNumAvailBytes - 1;+    p->btNumAvailBytes = avail;+    p->btBufPos = bt + len;+    if (len == 0)+    {+#define BT_HASH_BYTES_MAX 5+        if (avail >= (BT_HASH_BYTES_MAX - 1) - 1)+        {+            UInt32 m = p->lzPos;+            if (m > p->historySize)+                m -= p->historySize;+            else+                m = 1;+            d = p->MixMatchesFunc(p, m, d);+        }+    }+    else+    {+        /*+          first match pair from BinTree: (match_len, match_dist),+          (match_len >= numHashBytes).+          MixMatchesFunc() inserts only hash matches that are nearer than (match_dist)+        */+        d = p->MixMatchesFunc(p, p->lzPos - bt[1], d);+        // if (d) // check for failure+        do+        {+            const UInt32 v0 = bt[0];+            const UInt32 v1 = bt[1];+            bt += 2;+            d[0] = v0;+            d[1] = v1;+            d += 2;+        } while (len -= 2);+    }+    INCREASE_LZ_POS+    return d;+}++#define SKIP_HEADER2_MT \+    do                  \+    {                   \+    GET_NEXT_BLOCK_IF_REQUIRED+#define SKIP_HEADER_MT(n)                            \+    SKIP_HEADER2_MT if (p->btNumAvailBytes-- >= (n)) \+    {                                                \+        const Byte *cur = p->pointerToCurPos;        \+        UInt32 *hash = p->hash;+#define SKIP_FOOTER_MT                                       \+    }                                                        \+    INCREASE_LZ_POS p->btBufPos += (size_t)*p->btBufPos + 1; \+    }                                                        \+    while (--num != 0)                                       \+        ;++static void MatchFinderMt0_Skip(CMatchFinderMt *p, UInt32 num)+{+    SKIP_HEADER2_MT+    {+        p->btNumAvailBytes--;+        SKIP_FOOTER_MT+    }++    static void MatchFinderMt2_Skip(CMatchFinderMt * p, UInt32 num)+    {+        SKIP_HEADER_MT(2)+        UInt32 h2;+        MT_HASH2_CALC+        hash[h2] = p->lzPos;+        SKIP_FOOTER_MT+    }++    static void MatchFinderMt3_Skip(CMatchFinderMt * p, UInt32 num)+    {+        SKIP_HEADER_MT(3)+        UInt32 h2, h3;+        MT_HASH3_CALC(hash + kFix3HashSize)+        [h3] =+            hash[h2] =+                p->lzPos;+        SKIP_FOOTER_MT+    }++    /*+    // MatchFinderMt4_Skip() is similar to MatchFinderMt3_Skip().+    // The difference is that MatchFinderMt3_Skip() updates hash for last 3 bytes of stream.++    static void MatchFinderMt4_Skip(CMatchFinderMt *p, UInt32 num)+    {+      SKIP_HEADER_MT(4)+          UInt32 h2, h3; // h4+          MT_HASH3_CALC+          // MT_HASH4_CALC+          // (hash + kFix4HashSize)[h4] =+          (hash + kFix3HashSize)[h3] =+          hash[                h2] =+            p->lzPos;+      SKIP_FOOTER_MT+    }+    */++    void MatchFinderMt_CreateVTable(CMatchFinderMt * p, IMatchFinder2 * vTable)+    {+        vTable->Init = (Mf_Init_Func)MatchFinderMt_Init;+        vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinderMt_GetNumAvailableBytes;+        vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinderMt_GetPointerToCurrentPos;+        vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches;++        switch (MF(p)->numHashBytes)+        {+        case 2:+            p->GetHeadsFunc = GetHeads2;+            p->MixMatchesFunc = (Mf_Mix_Matches)NULL;+            vTable->Skip = (Mf_Skip_Func)MatchFinderMt0_Skip;+            vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt2_GetMatches;+            break;+        case 3:+            p->GetHeadsFunc = MF(p)->bigHash ? GetHeads3b : GetHeads3;+            p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches2;+            vTable->Skip = (Mf_Skip_Func)MatchFinderMt2_Skip;+            break;+        case 4:+            p->GetHeadsFunc = MF(p)->bigHash ? GetHeads4b : GetHeads4;++            // it's fast inline version of GetMatches()+            // vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches_Bt4;++            p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches3;+            vTable->Skip = (Mf_Skip_Func)MatchFinderMt3_Skip;+            break;+        default:+            p->GetHeadsFunc = MF(p)->bigHash ? GetHeads5b : GetHeads5;+            p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches4;+            vTable->Skip =+                (Mf_Skip_Func)MatchFinderMt3_Skip;+            // (Mf_Skip_Func)MatchFinderMt4_Skip;+            break;+        }+    }++#endif++    /* the following LzmaEnc_* declarations is internal LZMA interface for LZMA2 encoder */++    SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream * inStream, UInt32 keepWindowSize,+                                 ISzAllocPtr alloc, ISzAllocPtr allocBig);+    SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,+                            UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig);+    SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit,+                                 Byte * dest, size_t * destLen, UInt32 desiredPackSize, UInt32 * unpackSize);+    const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp);+    void LzmaEnc_Finish(CLzmaEncHandle pp);+    void LzmaEnc_SaveState(CLzmaEncHandle pp);+    void LzmaEnc_RestoreState(CLzmaEncHandle pp);++#ifdef SHOW_STAT+    static unsigned g_STAT_OFFSET = 0;+#endif++    /* for good normalization speed we still reserve 256 MB before 4 GB range */+#define kLzmaMaxHistorySize ((UInt32)15 << 28)++#define kNumTopBits 24+#define kTopValue ((UInt32)1 << kNumTopBits)++#define kNumBitModelTotalBits 11+#define kBitModelTotal (1 << kNumBitModelTotalBits)+#define kNumMoveBits 5+#define kProbInitValue (kBitModelTotal >> 1)++#define kNumMoveReducingBits 4+#define kNumBitPriceShiftBits 4+    // #define kBitPrice (1 << kNumBitPriceShiftBits)++#define REP_LEN_COUNT 64++    void LzmaEncProps_Init(CLzmaEncProps * p)+    {+        p->level = 5;+        p->dictSize = p->mc = 0;+        p->reduceSize = (UInt64)(Int64)-1;+        p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;+        p->writeEndMark = 0;+        p->affinity = 0;+    }++    void LzmaEncProps_Normalize(CLzmaEncProps * p)+    {+        int level = p->level;+        if (level < 0)+            level = 5;+        p->level = level;++        if (p->dictSize == 0)+            p->dictSize =+                (level <= 3 ? ((UInt32)1 << (level * 2 + 16)) : (level <= 6 ? ((UInt32)1 << (level + 19)) : (level <= 7 ? ((UInt32)1 << 25) : ((UInt32)1 << 26))));++        if (p->dictSize > p->reduceSize)+        {+            UInt32 v = (UInt32)p->reduceSize;+            const UInt32 kReduceMin = ((UInt32)1 << 12);+            if (v < kReduceMin)+                v = kReduceMin;+            if (p->dictSize > v)+                p->dictSize = v;+        }++        if (p->lc < 0)+            p->lc = 3;+        if (p->lp < 0)+            p->lp = 0;+        if (p->pb < 0)+            p->pb = 2;++        if (p->algo < 0)+            p->algo = (level < 5 ? 0 : 1);+        if (p->fb < 0)+            p->fb = (level < 7 ? 32 : 64);+        if (p->btMode < 0)+            p->btMode = (p->algo == 0 ? 0 : 1);+        if (p->numHashBytes < 0)+            p->numHashBytes = (p->btMode ? 4 : 5);+        if (p->mc == 0)+            p->mc = (16 + ((unsigned)p->fb >> 1)) >> (p->btMode ? 0 : 1);++        if (p->numThreads < 0)+            p->numThreads =+#ifndef _7ZIP_ST+                ((p->btMode && p->algo) ? 2 : 1);+#else+            1;+#endif+    }++    UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)+    {+        CLzmaEncProps props = *props2;+        LzmaEncProps_Normalize(&props);+        return props.dictSize;+    }++    /*+    x86/x64:++    BSR:+      IF (SRC == 0) ZF = 1, DEST is undefined;+                      AMD : DEST is unchanged;+      IF (SRC != 0) ZF = 0; DEST is index of top non-zero bit+      BSR is slow in some processors++    LZCNT:+      IF (SRC  == 0) CF = 1, DEST is size_in_bits_of_register(src) (32 or 64)+      IF (SRC  != 0) CF = 0, DEST = num_lead_zero_bits+      IF (DEST == 0) ZF = 1;++    LZCNT works only in new processors starting from Haswell.+    if LZCNT is not supported by processor, then it's executed as BSR.+    LZCNT can be faster than BSR, if supported.+    */++    // #define LZMA_LOG_BSR++#if defined(MY_CPU_ARM_OR_ARM64) /* || defined(MY_CPU_X86_OR_AMD64) */++#if (defined(__clang__) && (__clang_major__ >= 6)) || (defined(__GNUC__) && (__GNUC__ >= 6))+#define LZMA_LOG_BSR+#elif defined(_MSC_VER) && (_MSC_VER >= 1300)+    // #if defined(MY_CPU_ARM_OR_ARM64)+#define LZMA_LOG_BSR+    // #endif+#endif+#endif++    // #include <intrin.h>++#ifdef LZMA_LOG_BSR++#if defined(__clang__) || defined(__GNUC__)++    /*+      C code:                  : (30 - __builtin_clz(x))+        gcc9/gcc10 for x64 /x86  : 30 - (bsr(x) xor 31)+        clang10 for x64          : 31 + (bsr(x) xor -32)+    */++#define MY_clz(x) ((unsigned)__builtin_clz(x))+    // __lzcnt32+    // __builtin_ia32_lzcnt_u32++#else // #if defined(_MSC_VER)++#ifdef MY_CPU_ARM_OR_ARM64++#define MY_clz _CountLeadingZeros++#else // if defined(MY_CPU_X86_OR_AMD64)++// #define MY_clz  __lzcnt  // we can use lzcnt (unsupported by old CPU)+// _BitScanReverse code is not optimal for some MSVC compilers+#define BSR2_RET(pos, res)             \+    {                                  \+        unsigned long zz;              \+        _BitScanReverse(&zz, (pos));   \+        zz--;                          \+        res = (zz + zz) + (pos >> zz); \+    }++#endif // MY_CPU_X86_OR_AMD64++#endif // _MSC_VER++#ifndef BSR2_RET++#define BSR2_RET(pos, res)              \+    {                                   \+        unsigned zz = 30 - MY_clz(pos); \+        res = (zz + zz) + (pos >> zz);  \+    }++#endif++    unsigned GetPosSlot1(UInt32 pos);+    unsigned GetPosSlot1(UInt32 pos)+    {+        unsigned res;+        BSR2_RET(pos, res);+        return res;+    }+#define GetPosSlot2(pos, res) \+    {                         \+        BSR2_RET(pos, res);   \+    }+#define GetPosSlot(pos, res)    \+    {                           \+        if (pos < 2)            \+            res = pos;          \+        else                    \+            BSR2_RET(pos, res); \+    }++#else // ! LZMA_LOG_BSR++#define kNumLogBits (11 + sizeof(size_t) / 8 * 3)++#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)++static void LzmaEnc_FastPosInit(Byte *g_FastPos)+{+    unsigned slot;+    g_FastPos[0] = 0;+    g_FastPos[1] = 1;+    g_FastPos += 2;++    for (slot = 2; slot < kNumLogBits * 2; slot++)+    {+        size_t k = ((size_t)1 << ((slot >> 1) - 1));+        size_t j;+        for (j = 0; j < k; j++)+            g_FastPos[j] = (Byte)slot;+        g_FastPos += k;+    }+}++/* we can use ((limit - pos) >> 31) only if (pos < ((UInt32)1 << 31)) */+/*+#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \+(0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \+res = p->g_FastPos[pos >> zz] + (zz * 2); }+*/++/*+#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \+(0 - (((((UInt32)1 << (kNumLogBits)) - 1) - (pos >> 6)) >> 31))); \+res = p->g_FastPos[pos >> zz] + (zz * 2); }+*/++#define BSR2_RET(pos, res)                                                        \+    {                                                                             \+        unsigned zz = (pos < (1 << (kNumLogBits + 6))) ? 6 : 6 + kNumLogBits - 1; \+        res = p->g_FastPos[pos >> zz] + (zz * 2);                                 \+    }++/*+#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \+p->g_FastPos[pos >> 6] + 12 : \+p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; }+*/++#define GetPosSlot1(pos) p->g_FastPos[pos]+#define GetPosSlot2(pos, res) \+    {                         \+        BSR2_RET(pos, res);   \+    }+#define GetPosSlot(pos, res)                                   \+    {                                                          \+        if (pos < kNumFullDistances)                           \+            res = p->g_FastPos[pos & (kNumFullDistances - 1)]; \+        else                                                   \+            BSR2_RET(pos, res);                                \+    }++#endif // LZMA_LOG_BSR++#define LZMA_NUM_REPS 4++    typedef UInt16 CState;+    typedef UInt16 CExtra;++    typedef struct+    {+        UInt32 price;+        CState state;+        CExtra extra;+        // 0   : normal+        // 1   : LIT : MATCH+        // > 1 : MATCH (extra-1) : LIT : REP0 (len)+        UInt32 len;+        UInt32 dist;+        UInt32 reps[LZMA_NUM_REPS];+    } COptimal;++// 18.06+#define kNumOpts (1 << 11)+#define kPackReserve (kNumOpts * 8)+    // #define kNumOpts (1 << 12)+    // #define kPackReserve (1 + kNumOpts * 2)++#define kNumLenToPosStates 4+#define kNumPosSlotBits 6+// #define kDicLogSizeMin 0+#define kDicLogSizeMax 32+#define kDistTableSizeMax (kDicLogSizeMax * 2)++#define kNumAlignBits 4+#define kAlignTableSize (1 << kNumAlignBits)+#define kAlignMask (kAlignTableSize - 1)++#define kStartPosModelIndex 4+#define kEndPosModelIndex 14+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))++#define LZMA_PB_MAX 4+#define LZMA_LC_MAX 8+#define LZMA_LP_MAX 4++#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX)++#define kLenNumLowBits 3+#define kLenNumLowSymbols (1 << kLenNumLowBits)+#define kLenNumHighBits 8+#define kLenNumHighSymbols (1 << kLenNumHighBits)+#define kLenNumSymbolsTotal (kLenNumLowSymbols * 2 + kLenNumHighSymbols)++#define LZMA_MATCH_LEN_MIN 2+#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1)++#define kNumStates 12++    typedef struct+    {+        CLzmaProb low[LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)];+        CLzmaProb high[kLenNumHighSymbols];+    } CLenEnc;++    typedef struct+    {+        unsigned tableSize;+        UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal];+        // UInt32 prices1[LZMA_NUM_PB_STATES_MAX][kLenNumLowSymbols * 2];+        // UInt32 prices2[kLenNumSymbolsTotal];+    } CLenPriceEnc;++#define GET_PRICE_LEN(p, posState, len) \+    ((p)->prices[posState][(size_t)(len)-LZMA_MATCH_LEN_MIN])++    /*+    #define GET_PRICE_LEN(p, posState, len) \+        ((p)->prices2[(size_t)(len) - 2] + ((p)->prices1[posState][((len) - 2) & (kLenNumLowSymbols * 2 - 1)] & (((len) - 2 - kLenNumLowSymbols * 2) >> 9)))+    */++    typedef struct+    {+        UInt32 range;+        unsigned cache;+        UInt64 low;+        UInt64 cacheSize;+        Byte *buf;+        Byte *bufLim;+        Byte *bufBase;+        ISeqOutStream *outStream;+        UInt64 processed;+        SRes res;+    } CRangeEnc;++    typedef struct+    {+        CLzmaProb *litProbs;++        unsigned state;+        UInt32 reps[LZMA_NUM_REPS];++        CLzmaProb posAlignEncoder[1 << kNumAlignBits];+        CLzmaProb isRep[kNumStates];+        CLzmaProb isRepG0[kNumStates];+        CLzmaProb isRepG1[kNumStates];+        CLzmaProb isRepG2[kNumStates];+        CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];+        CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];++        CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];+        CLzmaProb posEncoders[kNumFullDistances];++        CLenEnc lenProbs;+        CLenEnc repLenProbs;++    } CSaveState;++    typedef UInt32 CProbPrice;++    typedef struct+    {+        void *matchFinderObj;+        IMatchFinder2 matchFinder;++        unsigned optCur;+        unsigned optEnd;++        unsigned longestMatchLen;+        unsigned numPairs;+        UInt32 numAvail;++        unsigned state;+        unsigned numFastBytes;+        unsigned additionalOffset;+        UInt32 reps[LZMA_NUM_REPS];+        unsigned lpMask, pbMask;+        CLzmaProb *litProbs;+        CRangeEnc rc;++        UInt32 backRes;++        unsigned lc, lp, pb;+        unsigned lclp;++        BoolInt fastMode;+        BoolInt writeEndMark;+        BoolInt finished;+        BoolInt multiThread;+        BoolInt needInit;+        // BoolInt _maxMode;++        UInt64 nowPos64;++        unsigned matchPriceCount;+        // unsigned alignPriceCount;+        int repLenEncCounter;++        unsigned distTableSize;++        UInt32 dictSize;+        SRes result;++#ifndef _7ZIP_ST+        BoolInt mtMode;+        // begin of CMatchFinderMt is used in LZ thread+        CMatchFinderMt matchFinderMt;+// end of CMatchFinderMt is used in BT and HASH threads+// #else+// CMatchFinder matchFinderBase;+#endif+        CMatchFinder matchFinderBase;++        // we suppose that we have 8-bytes alignment after CMatchFinder++#ifndef _7ZIP_ST+        Byte pad[128];+#endif++        // LZ thread+        CProbPrice ProbPrices[kBitModelTotal >> kNumMoveReducingBits];++        // we want {len , dist} pairs to be 8-bytes aligned in matches array+        UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2];++        // we want 8-bytes alignment here+        UInt32 alignPrices[kAlignTableSize];+        UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];+        UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances];++        CLzmaProb posAlignEncoder[1 << kNumAlignBits];+        CLzmaProb isRep[kNumStates];+        CLzmaProb isRepG0[kNumStates];+        CLzmaProb isRepG1[kNumStates];+        CLzmaProb isRepG2[kNumStates];+        CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];+        CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];+        CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];+        CLzmaProb posEncoders[kNumFullDistances];++        CLenEnc lenProbs;+        CLenEnc repLenProbs;++#ifndef LZMA_LOG_BSR+        Byte g_FastPos[1 << kNumLogBits];+#endif++        CLenPriceEnc lenEnc;+        CLenPriceEnc repLenEnc;++        COptimal opt[kNumOpts];++        CSaveState saveState;++// BoolInt mf_Failure;+#ifndef _7ZIP_ST+        Byte pad2[128];+#endif+    } CLzmaEnc;++#define MFB (p->matchFinderBase)+    /*+    #ifndef _7ZIP_ST+    #define MFB (p->matchFinderMt.MatchFinder)+    #endif+    */++#define COPY_ARR(dest, src, arr) memcpy(dest->arr, src->arr, sizeof(src->arr));++    void LzmaEnc_SaveState(CLzmaEncHandle pp)+    {+        CLzmaEnc *p = (CLzmaEnc *)pp;+        CSaveState *dest = &p->saveState;++        dest->state = p->state;++        dest->lenProbs = p->lenProbs;+        dest->repLenProbs = p->repLenProbs;++        COPY_ARR(dest, p, reps);++        COPY_ARR(dest, p, posAlignEncoder);+        COPY_ARR(dest, p, isRep);+        COPY_ARR(dest, p, isRepG0);+        COPY_ARR(dest, p, isRepG1);+        COPY_ARR(dest, p, isRepG2);+        COPY_ARR(dest, p, isMatch);+        COPY_ARR(dest, p, isRep0Long);+        COPY_ARR(dest, p, posSlotEncoder);+        COPY_ARR(dest, p, posEncoders);++        memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << p->lclp) * sizeof(CLzmaProb));+    }++    void LzmaEnc_RestoreState(CLzmaEncHandle pp)+    {+        CLzmaEnc *dest = (CLzmaEnc *)pp;+        const CSaveState *p = &dest->saveState;++        dest->state = p->state;++        dest->lenProbs = p->lenProbs;+        dest->repLenProbs = p->repLenProbs;++        COPY_ARR(dest, p, reps);++        COPY_ARR(dest, p, posAlignEncoder);+        COPY_ARR(dest, p, isRep);+        COPY_ARR(dest, p, isRepG0);+        COPY_ARR(dest, p, isRepG1);+        COPY_ARR(dest, p, isRepG2);+        COPY_ARR(dest, p, isMatch);+        COPY_ARR(dest, p, isRep0Long);+        COPY_ARR(dest, p, posSlotEncoder);+        COPY_ARR(dest, p, posEncoders);++        memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << dest->lclp) * sizeof(CLzmaProb));+    }++    SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)+    {+        CLzmaEnc *p = (CLzmaEnc *)pp;+        CLzmaEncProps props = *props2;+        LzmaEncProps_Normalize(&props);++        if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX)+            return SZ_ERROR_PARAM;++        if (props.dictSize > kLzmaMaxHistorySize)+            props.dictSize = kLzmaMaxHistorySize;++#ifndef LZMA_LOG_BSR+        {+            const UInt64 dict64 = props.dictSize;+            if (dict64 > ((UInt64)1 << kDicLogSizeMaxCompress))+                return SZ_ERROR_PARAM;+        }+#endif++        p->dictSize = props.dictSize;+        {+            unsigned fb = (unsigned)props.fb;+            if (fb < 5)+                fb = 5;+            if (fb > LZMA_MATCH_LEN_MAX)+                fb = LZMA_MATCH_LEN_MAX;+            p->numFastBytes = fb;+        }+        p->lc = (unsigned)props.lc;+        p->lp = (unsigned)props.lp;+        p->pb = (unsigned)props.pb;+        p->fastMode = (props.algo == 0);+        // p->_maxMode = True;+        MFB.btMode = (Byte)(props.btMode ? 1 : 0);+        {+            unsigned numHashBytes = 4;+            if (props.btMode)+            {+                if (props.numHashBytes < 2)+                    numHashBytes = 2;+                else if (props.numHashBytes < 4)+                    numHashBytes = (unsigned)props.numHashBytes;+            }+            if (props.numHashBytes >= 5)+                numHashBytes = 5;++            MFB.numHashBytes = numHashBytes;+        }++        MFB.cutValue = props.mc;++        p->writeEndMark = (BoolInt)props.writeEndMark;++#ifndef _7ZIP_ST+        /*+        if (newMultiThread != _multiThread)+        {+          ReleaseMatchFinder();+          _multiThread = newMultiThread;+        }+        */+        p->multiThread = (props.numThreads > 1);+        p->matchFinderMt.btSync.affinity =+            p->matchFinderMt.hashSync.affinity = props.affinity;+#endif++        return SZ_OK;+    }++    void LzmaEnc_SetDataSize(CLzmaEncHandle pp, UInt64 expectedDataSiize)+    {+        CLzmaEnc *p = (CLzmaEnc *)pp;+        MFB.expectedDataSize = expectedDataSiize;+    }++#define kState_Start 0+#define kState_LitAfterMatch 4+#define kState_LitAfterRep 5+#define kState_MatchAfterLit 7+#define kState_RepAfterLit 8++    static const Byte kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5};+    static const Byte kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};+    static const Byte kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};+    static const Byte kShortRepNextStates[kNumStates] = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};++#define IsLitState(s) ((s) < 7)+#define GetLenToPosState2(len) (((len) < kNumLenToPosStates - 1) ? (len) : kNumLenToPosStates - 1)+#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len)-2 : kNumLenToPosStates - 1)++#define kInfinityPrice (1 << 30)++    static void RangeEnc_Construct(CRangeEnc * p)+    {+        p->outStream = NULL;+        p->bufBase = NULL;+    }++#define RangeEnc_GetProcessed(p) ((p)->processed + (size_t)((p)->buf - (p)->bufBase) + (p)->cacheSize)+#define RangeEnc_GetProcessed_sizet(p) ((size_t)(p)->processed + (size_t)((p)->buf - (p)->bufBase) + (size_t)(p)->cacheSize)++#define RC_BUF_SIZE (1 << 16)++    static int RangeEnc_Alloc(CRangeEnc * p, ISzAllocPtr alloc)+    {+        if (!p->bufBase)+        {+            p->bufBase = (Byte *)ISzAlloc_Alloc(alloc, RC_BUF_SIZE);+            if (!p->bufBase)+                return 0;+            p->bufLim = p->bufBase + RC_BUF_SIZE;+        }+        return 1;+    }++    static void RangeEnc_Free(CRangeEnc * p, ISzAllocPtr alloc)+    {+        ISzAlloc_Free(alloc, p->bufBase);+        p->bufBase = NULL;+    }++    static void RangeEnc_Init(CRangeEnc * p)+    {+        p->range = 0xFFFFFFFF;+        p->cache = 0;+        p->low = 0;+        p->cacheSize = 0;++        p->buf = p->bufBase;++        p->processed = 0;+        p->res = SZ_OK;+    }++    MY_NO_INLINE static void RangeEnc_FlushStream(CRangeEnc * p)+    {+        const size_t num = (size_t)(p->buf - p->bufBase);+        if (p->res == SZ_OK)+        {+            if (num != ISeqOutStream_Write(p->outStream, p->bufBase, num))+                p->res = SZ_ERROR_WRITE;+        }+        p->processed += num;+        p->buf = p->bufBase;+    }++    MY_NO_INLINE static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc * p)+    {+        UInt32 low = (UInt32)p->low;+        unsigned high = (unsigned)(p->low >> 32);+        p->low = (UInt32)(low << 8);+        if (low < (UInt32)0xFF000000 || high != 0)+        {+            {+                Byte *buf = p->buf;+                *buf++ = (Byte)(p->cache + high);+                p->cache = (unsigned)(low >> 24);+                p->buf = buf;+                if (buf == p->bufLim)+                    RangeEnc_FlushStream(p);+                if (p->cacheSize == 0)+                    return;+            }+            high += 0xFF;+            for (;;)+            {+                Byte *buf = p->buf;+                *buf++ = (Byte)(high);+                p->buf = buf;+                if (buf == p->bufLim)+                    RangeEnc_FlushStream(p);+                if (--p->cacheSize == 0)+                    return;+            }+        }+        p->cacheSize++;+    }++    static void RangeEnc_FlushData(CRangeEnc * p)+    {+        int i;+        for (i = 0; i < 5; i++)+            RangeEnc_ShiftLow(p);+    }++#define RC_NORM(p)            \+    if (range < kTopValue)    \+    {                         \+        range <<= 8;          \+        RangeEnc_ShiftLow(p); \+    }++#define RC_BIT_PRE(p, prob) \+    ttt = *(prob);          \+    newBound = (range >> kNumBitModelTotalBits) * ttt;++    // #define _LZMA_ENC_USE_BRANCH++#ifdef _LZMA_ENC_USE_BRANCH++#define RC_BIT(p, prob, bit)                               \+    {                                                      \+        RC_BIT_PRE(p, prob)                                \+        if (bit == 0)                                      \+        {                                                  \+            range = newBound;                              \+            ttt += (kBitModelTotal - ttt) >> kNumMoveBits; \+        }                                                  \+        else                                               \+        {                                                  \+            (p)->low += newBound;                          \+            range -= newBound;                             \+            ttt -= ttt >> kNumMoveBits;                    \+        }                                                  \+        *(prob) = (CLzmaProb)ttt;                          \+        RC_NORM(p)                                         \+    }++#else++#define RC_BIT(p, prob, bit)                                  \+    {                                                         \+        UInt32 mask;                                          \+        RC_BIT_PRE(p, prob)                                   \+        mask = 0 - (UInt32)bit;                               \+        range &= mask;                                        \+        mask &= newBound;                                     \+        range -= mask;                                        \+        (p)->low += mask;                                     \+        mask = (UInt32)bit - 1;                               \+        range += newBound & mask;                             \+        mask &= (kBitModelTotal - ((1 << kNumMoveBits) - 1)); \+        mask += ((1 << kNumMoveBits) - 1);                    \+        ttt += (UInt32)((Int32)(mask - ttt) >> kNumMoveBits); \+        *(prob) = (CLzmaProb)ttt;                             \+        RC_NORM(p)                                            \+    }++#endif++#define RC_BIT_0_BASE(p, prob) \+    range = newBound;          \+    *(prob) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));++#define RC_BIT_1_BASE(p, prob) \+    range -= newBound;         \+    (p)->low += newBound;      \+    *(prob) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));++#define RC_BIT_0(p, prob)  \+    RC_BIT_0_BASE(p, prob) \+    RC_NORM(p)++#define RC_BIT_1(p, prob)  \+    RC_BIT_1_BASE(p, prob) \+    RC_NORM(p)++    static void RangeEnc_EncodeBit_0(CRangeEnc * p, CLzmaProb * prob)+    {+        UInt32 range, ttt, newBound;+        range = p->range;+        RC_BIT_PRE(p, prob)+        RC_BIT_0(p, prob)+        p->range = range;+    }++    static void LitEnc_Encode(CRangeEnc * p, CLzmaProb * probs, UInt32 sym)+    {+        UInt32 range = p->range;+        sym |= 0x100;+        do+        {+            UInt32 ttt, newBound;+            // RangeEnc_EncodeBit(p, probs + (sym >> 8), (sym >> 7) & 1);+            CLzmaProb *prob = probs + (sym >> 8);+            UInt32 bit = (sym >> 7) & 1;+            sym <<= 1;+            RC_BIT(p, prob, bit);+        } while (sym < 0x10000);+        p->range = range;+    }++    static void LitEnc_EncodeMatched(CRangeEnc * p, CLzmaProb * probs, UInt32 sym, UInt32 matchByte)+    {+        UInt32 range = p->range;+        UInt32 offs = 0x100;+        sym |= 0x100;+        do+        {+            UInt32 ttt, newBound;+            CLzmaProb *prob;+            UInt32 bit;+            matchByte <<= 1;+            // RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (sym >> 8)), (sym >> 7) & 1);+            prob = probs + (offs + (matchByte & offs) + (sym >> 8));+            bit = (sym >> 7) & 1;+            sym <<= 1;+            offs &= ~(matchByte ^ sym);+            RC_BIT(p, prob, bit);+        } while (sym < 0x10000);+        p->range = range;+    }++    static void LzmaEnc_InitPriceTables(CProbPrice * ProbPrices)+    {+        UInt32 i;+        for (i = 0; i < (kBitModelTotal >> kNumMoveReducingBits); i++)+        {+            const unsigned kCyclesBits = kNumBitPriceShiftBits;+            UInt32 w = (i << kNumMoveReducingBits) + (1 << (kNumMoveReducingBits - 1));+            unsigned bitCount = 0;+            unsigned j;+            for (j = 0; j < kCyclesBits; j++)+            {+                w = w * w;+                bitCount <<= 1;+                while (w >= ((UInt32)1 << 16))+                {+                    w >>= 1;+                    bitCount++;+                }+            }+            ProbPrices[i] = (CProbPrice)(((unsigned)kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount);+            // printf("\n%3d: %5d", i, ProbPrices[i]);+        }+    }++#define GET_PRICE(prob, bit) \+    p->ProbPrices[((prob) ^ (unsigned)(((-(int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];++#define GET_PRICEa(prob, bit) \+    ProbPrices[((prob) ^ (unsigned)((-((int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];++#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits]+#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]++#define GET_PRICEa_0(prob) ProbPrices[(prob) >> kNumMoveReducingBits]+#define GET_PRICEa_1(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]++    static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 sym, const CProbPrice *ProbPrices)+    {+        UInt32 price = 0;+        sym |= 0x100;+        do+        {+            unsigned bit = sym & 1;+            sym >>= 1;+            price += GET_PRICEa(probs[sym], bit);+        } while (sym >= 2);+        return price;+    }++    static UInt32 LitEnc_Matched_GetPrice(const CLzmaProb *probs, UInt32 sym, UInt32 matchByte, const CProbPrice *ProbPrices)+    {+        UInt32 price = 0;+        UInt32 offs = 0x100;+        sym |= 0x100;+        do+        {+            matchByte <<= 1;+            price += GET_PRICEa(probs[offs + (matchByte & offs) + (sym >> 8)], (sym >> 7) & 1);+            sym <<= 1;+            offs &= ~(matchByte ^ sym);+        } while (sym < 0x10000);+        return price;+    }++    static void RcTree_ReverseEncode(CRangeEnc * rc, CLzmaProb * probs, unsigned numBits, unsigned sym)+    {+        UInt32 range = rc->range;+        unsigned m = 1;+        do+        {+            UInt32 ttt, newBound;+            unsigned bit = sym & 1;+            // RangeEnc_EncodeBit(rc, probs + m, bit);+            sym >>= 1;+            RC_BIT(rc, probs + m, bit);+            m = (m << 1) | bit;+        } while (--numBits);+        rc->range = range;+    }++    static void LenEnc_Init(CLenEnc * p)+    {+        unsigned i;+        for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)); i++)+            p->low[i] = kProbInitValue;+        for (i = 0; i < kLenNumHighSymbols; i++)+            p->high[i] = kProbInitValue;+    }++    static void LenEnc_Encode(CLenEnc * p, CRangeEnc * rc, unsigned sym, unsigned posState)+    {+        UInt32 range, ttt, newBound;+        CLzmaProb *probs = p->low;+        range = rc->range;+        RC_BIT_PRE(rc, probs);+        if (sym >= kLenNumLowSymbols)+        {+            RC_BIT_1(rc, probs);+            probs += kLenNumLowSymbols;+            RC_BIT_PRE(rc, probs);+            if (sym >= kLenNumLowSymbols * 2)+            {+                RC_BIT_1(rc, probs);+                rc->range = range;+                // RcTree_Encode(rc, p->high, kLenNumHighBits, sym - kLenNumLowSymbols * 2);+                LitEnc_Encode(rc, p->high, sym - kLenNumLowSymbols * 2);+                return;+            }+            sym -= kLenNumLowSymbols;+        }++        // RcTree_Encode(rc, probs + (posState << kLenNumLowBits), kLenNumLowBits, sym);+        {+            unsigned m;+            unsigned bit;+            RC_BIT_0(rc, probs);+            probs += (posState << (1 + kLenNumLowBits));+            bit = (sym >> 2);+            RC_BIT(rc, probs + 1, bit);+            m = (1 << 1) + bit;+            bit = (sym >> 1) & 1;+            RC_BIT(rc, probs + m, bit);+            m = (m << 1) + bit;+            bit = sym & 1;+            RC_BIT(rc, probs + m, bit);+            rc->range = range;+        }+    }++    static void SetPrices_3(const CLzmaProb *probs, UInt32 startPrice, UInt32 *prices, const CProbPrice *ProbPrices)+    {+        unsigned i;+        for (i = 0; i < 8; i += 2)+        {+            UInt32 price = startPrice;+            UInt32 prob;+            price += GET_PRICEa(probs[1], (i >> 2));+            price += GET_PRICEa(probs[2 + (i >> 2)], (i >> 1) & 1);+            prob = probs[4 + (i >> 1)];+            prices[i] = price + GET_PRICEa_0(prob);+            prices[i + 1] = price + GET_PRICEa_1(prob);+        }+    }++    MY_NO_INLINE static void MY_FAST_CALL LenPriceEnc_UpdateTables(+        CLenPriceEnc * p,+        unsigned numPosStates,+        const CLenEnc *enc,+        const CProbPrice *ProbPrices)+    {+        UInt32 b;++        {+            unsigned prob = enc->low[0];+            UInt32 a, c;+            unsigned posState;+            b = GET_PRICEa_1(prob);+            a = GET_PRICEa_0(prob);+            c = b + GET_PRICEa_0(enc->low[kLenNumLowSymbols]);+            for (posState = 0; posState < numPosStates; posState++)+            {+                UInt32 *prices = p->prices[posState];+                const CLzmaProb *probs = enc->low + (posState << (1 + kLenNumLowBits));+                SetPrices_3(probs, a, prices, ProbPrices);+                SetPrices_3(probs + kLenNumLowSymbols, c, prices + kLenNumLowSymbols, ProbPrices);+            }+        }++        /*+        {+          unsigned i;+          UInt32 b;+          a = GET_PRICEa_0(enc->low[0]);+          for (i = 0; i < kLenNumLowSymbols; i++)+            p->prices2[i] = a;+          a = GET_PRICEa_1(enc->low[0]);+          b = a + GET_PRICEa_0(enc->low[kLenNumLowSymbols]);+          for (i = kLenNumLowSymbols; i < kLenNumLowSymbols * 2; i++)+            p->prices2[i] = b;+          a += GET_PRICEa_1(enc->low[kLenNumLowSymbols]);+        }+        */++        // p->counter = numSymbols;+        // p->counter = 64;++        {+            unsigned i = p->tableSize;++            if (i > kLenNumLowSymbols * 2)+            {+                const CLzmaProb *probs = enc->high;+                UInt32 *prices = p->prices[0] + kLenNumLowSymbols * 2;+                i -= kLenNumLowSymbols * 2 - 1;+                i >>= 1;+                b += GET_PRICEa_1(enc->low[kLenNumLowSymbols]);+                do+                {+                    /*+                    p->prices2[i] = a ++                    // RcTree_GetPrice(enc->high, kLenNumHighBits, i - kLenNumLowSymbols * 2, ProbPrices);+                    LitEnc_GetPrice(probs, i - kLenNumLowSymbols * 2, ProbPrices);+                    */+                    // UInt32 price = a + RcTree_GetPrice(probs, kLenNumHighBits - 1, sym, ProbPrices);+                    unsigned sym = --i + (1 << (kLenNumHighBits - 1));+                    UInt32 price = b;+                    do+                    {+                        unsigned bit = sym & 1;+                        sym >>= 1;+                        price += GET_PRICEa(probs[sym], bit);+                    } while (sym >= 2);++                    {+                        unsigned prob = probs[(size_t)i + (1 << (kLenNumHighBits - 1))];+                        prices[(size_t)i * 2] = price + GET_PRICEa_0(prob);+                        prices[(size_t)i * 2 + 1] = price + GET_PRICEa_1(prob);+                    }+                } while (i);++                {+                    unsigned posState;+                    size_t num = (p->tableSize - kLenNumLowSymbols * 2) * sizeof(p->prices[0][0]);+                    for (posState = 1; posState < numPosStates; posState++)+                        memcpy(p->prices[posState] + kLenNumLowSymbols * 2, p->prices[0] + kLenNumLowSymbols * 2, num);+                }+            }+        }+    }++    /*+      #ifdef SHOW_STAT+      g_STAT_OFFSET += num;+      printf("\n MovePos %u", num);+      #endif+    */++#define MOVE_POS_2(p, num)                                     \+    {                                                          \+        p->additionalOffset += (num);                          \+        p->matchFinder.Skip(p->matchFinderObj, (UInt32)(num)); \+    }++    static unsigned ReadMatchDistances(CLzmaEnc * p, unsigned *numPairsRes)+    {+        unsigned numPairs;++        p->additionalOffset++;+        p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);+        {+            const UInt32 *d = p->matchFinder.GetMatches(p->matchFinderObj, p->matches);+            // if (!d) { p->mf_Failure = True; *numPairsRes = 0;  return 0; }+            numPairs = (unsigned)(d - p->matches);+        }+        *numPairsRes = numPairs;++#ifdef SHOW_STAT+        printf("\n i = %u numPairs = %u    ", g_STAT_OFFSET, numPairs / 2);+        g_STAT_OFFSET++;+        {+            unsigned i;+            for (i = 0; i < numPairs; i += 2)+                printf("%2u %6u   | ", p->matches[i], p->matches[i + 1]);+        }+#endif++        if (numPairs == 0)+            return 0;+        {+            const unsigned len = p->matches[(size_t)numPairs - 2];+            if (len != p->numFastBytes)+                return len;+            {+                UInt32 numAvail = p->numAvail;+                if (numAvail > LZMA_MATCH_LEN_MAX)+                    numAvail = LZMA_MATCH_LEN_MAX;+                {+                    const Byte *p1 = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;+                    const Byte *p2 = p1 + len;+                    const ptrdiff_t dif = (ptrdiff_t)-1 - (ptrdiff_t)p->matches[(size_t)numPairs - 1];+                    const Byte *lim = p1 + numAvail;+                    for (; p2 != lim && *p2 == p2[dif]; p2++)+                    {+                    }+                    return (unsigned)(p2 - p1);+                }+            }+        }+    }++#define MARK_LIT ((UInt32)(Int32)-1)++#define MakeAs_Lit(p)         \+    {                         \+        (p)->dist = MARK_LIT; \+        (p)->extra = 0;       \+    }+#define MakeAs_ShortRep(p) \+    {                      \+        (p)->dist = 0;     \+        (p)->extra = 0;    \+    }+#define IsShortRep(p) ((p)->dist == 0)++#define GetPrice_ShortRep(p, state, posState) \+    (GET_PRICE_0(p->isRepG0[state]) + GET_PRICE_0(p->isRep0Long[state][posState]))++#define GetPrice_Rep_0(p, state, posState) (                                                                                             \+                                               GET_PRICE_1(p->isMatch[state][posState]) + GET_PRICE_1(p->isRep0Long[state][posState])) + \+                                               GET_PRICE_1(p->isRep[state]) + GET_PRICE_0(p->isRepG0[state])++    MY_FORCE_INLINE+    static UInt32 GetPrice_PureRep(const CLzmaEnc *p, unsigned repIndex, size_t state, size_t posState)+    {+        UInt32 price;+        UInt32 prob = p->isRepG0[state];+        if (repIndex == 0)+        {+            price = GET_PRICE_0(prob);+            price += GET_PRICE_1(p->isRep0Long[state][posState]);+        }+        else+        {+            price = GET_PRICE_1(prob);+            prob = p->isRepG1[state];+            if (repIndex == 1)+                price += GET_PRICE_0(prob);+            else+            {+                price += GET_PRICE_1(prob);+                price += GET_PRICE(p->isRepG2[state], repIndex - 2);+            }+        }+        return price;+    }++    static unsigned Backward(CLzmaEnc * p, unsigned cur)+    {+        unsigned wr = cur + 1;+        p->optEnd = wr;++        for (;;)+        {+            UInt32 dist = p->opt[cur].dist;+            unsigned len = (unsigned)p->opt[cur].len;+            unsigned extra = (unsigned)p->opt[cur].extra;+            cur -= len;++            if (extra)+            {+                wr--;+                p->opt[wr].len = (UInt32)len;+                cur -= extra;+                len = extra;+                if (extra == 1)+                {+                    p->opt[wr].dist = dist;+                    dist = MARK_LIT;+                }+                else+                {+                    p->opt[wr].dist = 0;+                    len--;+                    wr--;+                    p->opt[wr].dist = MARK_LIT;+                    p->opt[wr].len = 1;+                }+            }++            if (cur == 0)+            {+                p->backRes = dist;+                p->optCur = wr;+                return len;+            }++            wr--;+            p->opt[wr].dist = dist;+            p->opt[wr].len = (UInt32)len;+        }+    }++#define LIT_PROBS(pos, prevByte) \+    (p->litProbs + (UInt32)3 * (((((pos) << 8) + (prevByte)) & p->lpMask) << p->lc))++    static unsigned GetOptimum(CLzmaEnc * p, UInt32 position)+    {+        unsigned last, cur;+        UInt32 reps[LZMA_NUM_REPS];+        unsigned repLens[LZMA_NUM_REPS];+        UInt32 *matches;++        {+            UInt32 numAvail;+            unsigned numPairs, mainLen, repMaxIndex, i, posState;+            UInt32 matchPrice, repMatchPrice;+            const Byte *data;+            Byte curByte, matchByte;++            p->optCur = p->optEnd = 0;++            if (p->additionalOffset == 0)+                mainLen = ReadMatchDistances(p, &numPairs);+            else+            {+                mainLen = p->longestMatchLen;+                numPairs = p->numPairs;+            }++            numAvail = p->numAvail;+            if (numAvail < 2)+            {+                p->backRes = MARK_LIT;+                return 1;+            }+            if (numAvail > LZMA_MATCH_LEN_MAX)+                numAvail = LZMA_MATCH_LEN_MAX;++            data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;+            repMaxIndex = 0;++            for (i = 0; i < LZMA_NUM_REPS; i++)+            {+                unsigned len;+                const Byte *data2;+                reps[i] = p->reps[i];+                data2 = data - reps[i];+                if (data[0] != data2[0] || data[1] != data2[1])+                {+                    repLens[i] = 0;+                    continue;+                }+                for (len = 2; len < numAvail && data[len] == data2[len]; len++)+                {+                }+                repLens[i] = len;+                if (len > repLens[repMaxIndex])+                    repMaxIndex = i;+                if (len == LZMA_MATCH_LEN_MAX) // 21.03 : optimization+                    break;+            }++            if (repLens[repMaxIndex] >= p->numFastBytes)+            {+                unsigned len;+                p->backRes = (UInt32)repMaxIndex;+                len = repLens[repMaxIndex];+                MOVE_POS_2(p, len - 1)+                return len;+            }++            matches = p->matches;+#define MATCHES matches+            // #define MATCHES  p->matches++            if (mainLen >= p->numFastBytes)+            {+                p->backRes = MATCHES[(size_t)numPairs - 1] + LZMA_NUM_REPS;+                MOVE_POS_2(p, mainLen - 1)+                return mainLen;+            }++            curByte = *data;+            matchByte = *(data - reps[0]);++            last = repLens[repMaxIndex];+            if (last <= mainLen)+                last = mainLen;++            if (last < 2 && curByte != matchByte)+            {+                p->backRes = MARK_LIT;+                return 1;+            }++            p->opt[0].state = (CState)p->state;++            posState = (position & p->pbMask);++            {+                const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));+                p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) ++                                  (!IsLitState(p->state) ? LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : LitEnc_GetPrice(probs, curByte, p->ProbPrices));+            }++            MakeAs_Lit(&p->opt[1]);++            matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]);+            repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]);++            // 18.06+            if (matchByte == curByte && repLens[0] == 0)+            {+                UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, p->state, posState);+                if (shortRepPrice < p->opt[1].price)+                {+                    p->opt[1].price = shortRepPrice;+                    MakeAs_ShortRep(&p->opt[1]);+                }+                if (last < 2)+                {+                    p->backRes = p->opt[1].dist;+                    return 1;+                }+            }++            p->opt[1].len = 1;++            p->opt[0].reps[0] = reps[0];+            p->opt[0].reps[1] = reps[1];+            p->opt[0].reps[2] = reps[2];+            p->opt[0].reps[3] = reps[3];++            // ---------- REP ----------++            for (i = 0; i < LZMA_NUM_REPS; i++)+            {+                unsigned repLen = repLens[i];+                UInt32 price;+                if (repLen < 2)+                    continue;+                price = repMatchPrice + GetPrice_PureRep(p, i, p->state, posState);+                do+                {+                    UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, repLen);+                    COptimal *opt = &p->opt[repLen];+                    if (price2 < opt->price)+                    {+                        opt->price = price2;+                        opt->len = (UInt32)repLen;+                        opt->dist = (UInt32)i;+                        opt->extra = 0;+                    }+                } while (--repLen >= 2);+            }++            // ---------- MATCH ----------+            {+                unsigned len = repLens[0] + 1;+                if (len <= mainLen)+                {+                    unsigned offs = 0;+                    UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]);++                    if (len < 2)+                        len = 2;+                    else+                        while (len > MATCHES[offs])+                            offs += 2;++                    for (;; len++)+                    {+                        COptimal *opt;+                        UInt32 dist = MATCHES[(size_t)offs + 1];+                        UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len);+                        unsigned lenToPosState = GetLenToPosState(len);++                        if (dist < kNumFullDistances)+                            price += p->distancesPrices[lenToPosState][dist & (kNumFullDistances - 1)];+                        else+                        {+                            unsigned slot;+                            GetPosSlot2(dist, slot);+                            price += p->alignPrices[dist & kAlignMask];+                            price += p->posSlotPrices[lenToPosState][slot];+                        }++                        opt = &p->opt[len];++                        if (price < opt->price)+                        {+                            opt->price = price;+                            opt->len = (UInt32)len;+                            opt->dist = dist + LZMA_NUM_REPS;+                            opt->extra = 0;+                        }++                        if (len == MATCHES[offs])+                        {+                            offs += 2;+                            if (offs == numPairs)+                                break;+                        }+                    }+                }+            }++            cur = 0;++#ifdef SHOW_STAT2+            /* if (position >= 0) */+            {+                unsigned i;+                printf("\n pos = %4X", position);+                for (i = cur; i <= last; i++)+                    printf("\nprice[%4X] = %u", position - cur + i, p->opt[i].price);+            }+#endif+        }++        // ---------- Optimal Parsing ----------++        for (;;)+        {+            unsigned numAvail;+            UInt32 numAvailFull;+            unsigned newLen, numPairs, prev, state, posState, startLen;+            UInt32 litPrice, matchPrice, repMatchPrice;+            BoolInt nextIsLit;+            Byte curByte, matchByte;+            const Byte *data;+            COptimal *curOpt, *nextOpt;++            if (++cur == last)+                break;++            // 18.06+            if (cur >= kNumOpts - 64)+            {+                unsigned j, best;+                UInt32 price = p->opt[cur].price;+                best = cur;+                for (j = cur + 1; j <= last; j++)+                {+                    UInt32 price2 = p->opt[j].price;+                    if (price >= price2)+                    {+                        price = price2;+                        best = j;+                    }+                }+                {+                    unsigned delta = best - cur;+                    if (delta != 0)+                    {+                        MOVE_POS_2(p, delta);+                    }+                }+                cur = best;+                break;+            }++            newLen = ReadMatchDistances(p, &numPairs);++            if (newLen >= p->numFastBytes)+            {+                p->numPairs = numPairs;+                p->longestMatchLen = newLen;+                break;+            }++            curOpt = &p->opt[cur];++            position++;++            // we need that check here, if skip_items in p->opt are possible+            /*+            if (curOpt->price >= kInfinityPrice)+              continue;+            */++            prev = cur - curOpt->len;++            if (curOpt->len == 1)+            {+                state = (unsigned)p->opt[prev].state;+                if (IsShortRep(curOpt))+                    state = kShortRepNextStates[state];+                else+                    state = kLiteralNextStates[state];+            }+            else+            {+                const COptimal *prevOpt;+                UInt32 b0;+                UInt32 dist = curOpt->dist;++                if (curOpt->extra)+                {+                    prev -= (unsigned)curOpt->extra;+                    state = kState_RepAfterLit;+                    if (curOpt->extra == 1)+                        state = (dist < LZMA_NUM_REPS ? kState_RepAfterLit : kState_MatchAfterLit);+                }+                else+                {+                    state = (unsigned)p->opt[prev].state;+                    if (dist < LZMA_NUM_REPS)+                        state = kRepNextStates[state];+                    else+                        state = kMatchNextStates[state];+                }++                prevOpt = &p->opt[prev];+                b0 = prevOpt->reps[0];++                if (dist < LZMA_NUM_REPS)+                {+                    if (dist == 0)+                    {+                        reps[0] = b0;+                        reps[1] = prevOpt->reps[1];+                        reps[2] = prevOpt->reps[2];+                        reps[3] = prevOpt->reps[3];+                    }+                    else+                    {+                        reps[1] = b0;+                        b0 = prevOpt->reps[1];+                        if (dist == 1)+                        {+                            reps[0] = b0;+                            reps[2] = prevOpt->reps[2];+                            reps[3] = prevOpt->reps[3];+                        }+                        else+                        {+                            reps[2] = b0;+                            reps[0] = prevOpt->reps[dist];+                            reps[3] = prevOpt->reps[dist ^ 1];+                        }+                    }+                }+                else+                {+                    reps[0] = (dist - LZMA_NUM_REPS + 1);+                    reps[1] = b0;+                    reps[2] = prevOpt->reps[1];+                    reps[3] = prevOpt->reps[2];+                }+            }++            curOpt->state = (CState)state;+            curOpt->reps[0] = reps[0];+            curOpt->reps[1] = reps[1];+            curOpt->reps[2] = reps[2];+            curOpt->reps[3] = reps[3];++            data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;+            curByte = *data;+            matchByte = *(data - reps[0]);++            posState = (position & p->pbMask);++            /*+            The order of Price checks:+               <  LIT+               <= SHORT_REP+               <  LIT : REP_0+               <  REP    [ : LIT : REP_0 ]+               <  MATCH  [ : LIT : REP_0 ]+            */++            {+                UInt32 curPrice = curOpt->price;+                unsigned prob = p->isMatch[state][posState];+                matchPrice = curPrice + GET_PRICE_1(prob);+                litPrice = curPrice + GET_PRICE_0(prob);+            }++            nextOpt = &p->opt[(size_t)cur + 1];+            nextIsLit = False;++            // here we can allow skip_items in p->opt, if we don't check (nextOpt->price < kInfinityPrice)+            // 18.new.06+            if ((nextOpt->price < kInfinityPrice+                 // && !IsLitState(state)+                 && matchByte == curByte) ||+                litPrice > nextOpt->price)+                litPrice = 0;+            else+            {+                const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));+                litPrice += (!IsLitState(state) ? LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : LitEnc_GetPrice(probs, curByte, p->ProbPrices));++                if (litPrice < nextOpt->price)+                {+                    nextOpt->price = litPrice;+                    nextOpt->len = 1;+                    MakeAs_Lit(nextOpt);+                    nextIsLit = True;+                }+            }++            repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]);++            numAvailFull = p->numAvail;+            {+                unsigned temp = kNumOpts - 1 - cur;+                if (numAvailFull > temp)+                    numAvailFull = (UInt32)temp;+            }++            // 18.06+            // ---------- SHORT_REP ----------+            if (IsLitState(state)) // 18.new+                if (matchByte == curByte)+                    if (repMatchPrice < nextOpt->price) // 18.new+                        // if (numAvailFull < 2 || data[1] != *(data - reps[0] + 1))+                        if (+                            // nextOpt->price >= kInfinityPrice ||+                            nextOpt->len < 2 // we can check nextOpt->len, if skip items are not allowed in p->opt+                            || (nextOpt->dist != 0+                                // && nextOpt->extra <= 1 // 17.old+                                ))+                        {+                            UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, state, posState);+                            // if (shortRepPrice <= nextOpt->price) // 17.old+                            if (shortRepPrice < nextOpt->price) // 18.new+                            {+                                nextOpt->price = shortRepPrice;+                                nextOpt->len = 1;+                                MakeAs_ShortRep(nextOpt);+                                nextIsLit = False;+                            }+                        }++            if (numAvailFull < 2)+                continue;+            numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes);++            // numAvail <= p->numFastBytes++            // ---------- LIT : REP_0 ----------++            if (!nextIsLit && litPrice != 0 // 18.new+                && matchByte != curByte && numAvailFull > 2)+            {+                const Byte *data2 = data - reps[0];+                if (data[1] == data2[1] && data[2] == data2[2])+                {+                    unsigned len;+                    unsigned limit = p->numFastBytes + 1;+                    if (limit > numAvailFull)+                        limit = numAvailFull;+                    for (len = 3; len < limit && data[len] == data2[len]; len++)+                    {+                    }++                    {+                        unsigned state2 = kLiteralNextStates[state];+                        unsigned posState2 = (position + 1) & p->pbMask;+                        UInt32 price = litPrice + GetPrice_Rep_0(p, state2, posState2);+                        {+                            unsigned offset = cur + len;++                            if (last < offset)+                                last = offset;++                            // do+                            {+                                UInt32 price2;+                                COptimal *opt;+                                len--;+                                // price2 = price + GetPrice_Len_Rep_0(p, len, state2, posState2);+                                price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len);++                                opt = &p->opt[offset];+                                // offset--;+                                if (price2 < opt->price)+                                {+                                    opt->price = price2;+                                    opt->len = (UInt32)len;+                                    opt->dist = 0;+                                    opt->extra = 1;+                                }+                            }+                            // while (len >= 3);+                        }+                    }+                }+            }++            startLen = 2; /* speed optimization */++            {+                // ---------- REP ----------+                unsigned repIndex = 0; // 17.old+                // unsigned repIndex = IsLitState(state) ? 0 : 1; // 18.notused+                for (; repIndex < LZMA_NUM_REPS; repIndex++)+                {+                    unsigned len;+                    UInt32 price;+                    const Byte *data2 = data - reps[repIndex];+                    if (data[0] != data2[0] || data[1] != data2[1])+                        continue;++                    for (len = 2; len < numAvail && data[len] == data2[len]; len++)+                    {+                    }++                    // if (len < startLen) continue; // 18.new: speed optimization++                    {+                        unsigned offset = cur + len;+                        if (last < offset)+                            last = offset;+                    }+                    {+                        unsigned len2 = len;+                        price = repMatchPrice + GetPrice_PureRep(p, repIndex, state, posState);+                        do+                        {+                            UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, len2);+                            COptimal *opt = &p->opt[cur + len2];+                            if (price2 < opt->price)+                            {+                                opt->price = price2;+                                opt->len = (UInt32)len2;+                                opt->dist = (UInt32)repIndex;+                                opt->extra = 0;+                            }+                        } while (--len2 >= 2);+                    }++                    if (repIndex == 0)+                        startLen = len + 1; // 17.old+                    // startLen = len + 1; // 18.new++                    /* if (_maxMode) */+                    {+                        // ---------- REP : LIT : REP_0 ----------+                        // numFastBytes + 1 + numFastBytes++                        unsigned len2 = len + 1;+                        unsigned limit = len2 + p->numFastBytes;+                        if (limit > numAvailFull)+                            limit = numAvailFull;++                        len2 += 2;+                        if (len2 <= limit)+                            if (data[len2 - 2] == data2[len2 - 2])+                                if (data[len2 - 1] == data2[len2 - 1])+                                {+                                    unsigned state2 = kRepNextStates[state];+                                    unsigned posState2 = (position + len) & p->pbMask;+                                    price += GET_PRICE_LEN(&p->repLenEnc, posState, len) + GET_PRICE_0(p->isMatch[state2][posState2]) + LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), data[len], data2[len], p->ProbPrices);++                                    // state2 = kLiteralNextStates[state2];+                                    state2 = kState_LitAfterRep;+                                    posState2 = (posState2 + 1) & p->pbMask;++                                    price += GetPrice_Rep_0(p, state2, posState2);++                                    for (; len2 < limit && data[len2] == data2[len2]; len2++)+                                    {+                                    }++                                    len2 -= len;+                                    // if (len2 >= 3)+                                    {+                                        {+                                            unsigned offset = cur + len + len2;++                                            if (last < offset)+                                                last = offset;+                                            // do+                                            {+                                                UInt32 price2;+                                                COptimal *opt;+                                                len2--;+                                                // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2);+                                                price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2);++                                                opt = &p->opt[offset];+                                                // offset--;+                                                if (price2 < opt->price)+                                                {+                                                    opt->price = price2;+                                                    opt->len = (UInt32)len2;+                                                    opt->extra = (CExtra)(len + 1);+                                                    opt->dist = (UInt32)repIndex;+                                                }+                                            }+                                            // while (len2 >= 3);+                                        }+                                    }+                                }+                    }+                }+            }++            // ---------- MATCH ----------+            /* for (unsigned len = 2; len <= newLen; len++) */+            if (newLen > numAvail)+            {+                newLen = numAvail;+                for (numPairs = 0; newLen > MATCHES[numPairs]; numPairs += 2)+                    ;+                MATCHES[numPairs] = (UInt32)newLen;+                numPairs += 2;+            }++            // startLen = 2; /* speed optimization */++            if (newLen >= startLen)+            {+                UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]);+                UInt32 dist;+                unsigned offs, posSlot, len;++                {+                    unsigned offset = cur + newLen;+                    if (last < offset)+                        last = offset;+                }++                offs = 0;+                while (startLen > MATCHES[offs])+                    offs += 2;+                dist = MATCHES[(size_t)offs + 1];++                // if (dist >= kNumFullDistances)+                GetPosSlot2(dist, posSlot);++                for (len = /*2*/ startLen;; len++)+                {+                    UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len);+                    {+                        COptimal *opt;+                        unsigned lenNorm = len - 2;+                        lenNorm = GetLenToPosState2(lenNorm);+                        if (dist < kNumFullDistances)+                            price += p->distancesPrices[lenNorm][dist & (kNumFullDistances - 1)];+                        else+                            price += p->posSlotPrices[lenNorm][posSlot] + p->alignPrices[dist & kAlignMask];++                        opt = &p->opt[cur + len];+                        if (price < opt->price)+                        {+                            opt->price = price;+                            opt->len = (UInt32)len;+                            opt->dist = dist + LZMA_NUM_REPS;+                            opt->extra = 0;+                        }+                    }++                    if (len == MATCHES[offs])+                    {+                        // if (p->_maxMode) {+                        // MATCH : LIT : REP_0++                        const Byte *data2 = data - dist - 1;+                        unsigned len2 = len + 1;+                        unsigned limit = len2 + p->numFastBytes;+                        if (limit > numAvailFull)+                            limit = numAvailFull;++                        len2 += 2;+                        if (len2 <= limit)+                            if (data[len2 - 2] == data2[len2 - 2])+                                if (data[len2 - 1] == data2[len2 - 1])+                                {+                                    for (; len2 < limit && data[len2] == data2[len2]; len2++)+                                    {+                                    }++                                    len2 -= len;++                                    // if (len2 >= 3)+                                    {+                                        unsigned state2 = kMatchNextStates[state];+                                        unsigned posState2 = (position + len) & p->pbMask;+                                        unsigned offset;+                                        price += GET_PRICE_0(p->isMatch[state2][posState2]);+                                        price += LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]),+                                                                         data[len], data2[len], p->ProbPrices);++                                        // state2 = kLiteralNextStates[state2];+                                        state2 = kState_LitAfterMatch;++                                        posState2 = (posState2 + 1) & p->pbMask;+                                        price += GetPrice_Rep_0(p, state2, posState2);++                                        offset = cur + len + len2;++                                        if (last < offset)+                                            last = offset;+                                        // do+                                        {+                                            UInt32 price2;+                                            COptimal *opt;+                                            len2--;+                                            // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2);+                                            price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2);+                                            opt = &p->opt[offset];+                                            // offset--;+                                            if (price2 < opt->price)+                                            {+                                                opt->price = price2;+                                                opt->len = (UInt32)len2;+                                                opt->extra = (CExtra)(len + 1);+                                                opt->dist = dist + LZMA_NUM_REPS;+                                            }+                                        }+                                        // while (len2 >= 3);+                                    }+                                }++                        offs += 2;+                        if (offs == numPairs)+                            break;+                        dist = MATCHES[(size_t)offs + 1];+                        // if (dist >= kNumFullDistances)+                        GetPosSlot2(dist, posSlot);+                    }+                }+            }+        }++        do+            p->opt[last].price = kInfinityPrice;+        while (--last);++        return Backward(p, cur);+    }++#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist))++    static unsigned GetOptimumFast(CLzmaEnc * p)+    {+        UInt32 numAvail, mainDist;+        unsigned mainLen, numPairs, repIndex, repLen, i;+        const Byte *data;++        if (p->additionalOffset == 0)+            mainLen = ReadMatchDistances(p, &numPairs);+        else+        {+            mainLen = p->longestMatchLen;+            numPairs = p->numPairs;+        }++        numAvail = p->numAvail;+        p->backRes = MARK_LIT;+        if (numAvail < 2)+            return 1;+        // if (mainLen < 2 && p->state == 0) return 1; // 18.06.notused+        if (numAvail > LZMA_MATCH_LEN_MAX)+            numAvail = LZMA_MATCH_LEN_MAX;+        data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;+        repLen = repIndex = 0;++        for (i = 0; i < LZMA_NUM_REPS; i++)+        {+            unsigned len;+            const Byte *data2 = data - p->reps[i];+            if (data[0] != data2[0] || data[1] != data2[1])+                continue;+            for (len = 2; len < numAvail && data[len] == data2[len]; len++)+            {+            }+            if (len >= p->numFastBytes)+            {+                p->backRes = (UInt32)i;+                MOVE_POS_2(p, len - 1)+                return len;+            }+            if (len > repLen)+            {+                repIndex = i;+                repLen = len;+            }+        }++        if (mainLen >= p->numFastBytes)+        {+            p->backRes = p->matches[(size_t)numPairs - 1] + LZMA_NUM_REPS;+            MOVE_POS_2(p, mainLen - 1)+            return mainLen;+        }++        mainDist = 0; /* for GCC */++        if (mainLen >= 2)+        {+            mainDist = p->matches[(size_t)numPairs - 1];+            while (numPairs > 2)+            {+                UInt32 dist2;+                if (mainLen != p->matches[(size_t)numPairs - 4] + 1)+                    break;+                dist2 = p->matches[(size_t)numPairs - 3];+                if (!ChangePair(dist2, mainDist))+                    break;+                numPairs -= 2;+                mainLen--;+                mainDist = dist2;+            }+            if (mainLen == 2 && mainDist >= 0x80)+                mainLen = 1;+        }++        if (repLen >= 2)+            if (repLen + 1 >= mainLen || (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || (repLen + 3 >= mainLen && mainDist >= (1 << 15)))+            {+                p->backRes = (UInt32)repIndex;+                MOVE_POS_2(p, repLen - 1)+                return repLen;+            }++        if (mainLen < 2 || numAvail <= 2)+            return 1;++        {+            unsigned len1 = ReadMatchDistances(p, &p->numPairs);+            p->longestMatchLen = len1;++            if (len1 >= 2)+            {+                UInt32 newDist = p->matches[(size_t)p->numPairs - 1];+                if ((len1 >= mainLen && newDist < mainDist) || (len1 == mainLen + 1 && !ChangePair(mainDist, newDist)) || (len1 > mainLen + 1) || (len1 + 1 >= mainLen && mainLen >= 3 && ChangePair(newDist, mainDist)))+                    return 1;+            }+        }++        data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;++        for (i = 0; i < LZMA_NUM_REPS; i++)+        {+            unsigned len, limit;+            const Byte *data2 = data - p->reps[i];+            if (data[0] != data2[0] || data[1] != data2[1])+                continue;+            limit = mainLen - 1;+            for (len = 2;; len++)+            {+                if (len >= limit)+                    return 1;+                if (data[len] != data2[len])+                    break;+            }+        }++        p->backRes = mainDist + LZMA_NUM_REPS;+        if (mainLen != 2)+        {+            MOVE_POS_2(p, mainLen - 2)+        }+        return mainLen;+    }++    static void WriteEndMarker(CLzmaEnc * p, unsigned posState)+    {+        UInt32 range;+        range = p->rc.range;+        {+            UInt32 ttt, newBound;+            CLzmaProb *prob = &p->isMatch[p->state][posState];+            RC_BIT_PRE(&p->rc, prob)+            RC_BIT_1(&p->rc, prob)+            prob = &p->isRep[p->state];+            RC_BIT_PRE(&p->rc, prob)+            RC_BIT_0(&p->rc, prob)+        }+        p->state = kMatchNextStates[p->state];++        p->rc.range = range;+        LenEnc_Encode(&p->lenProbs, &p->rc, 0, posState);+        range = p->rc.range;++        {+            // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[0], (1 << kNumPosSlotBits) - 1);+            CLzmaProb *probs = p->posSlotEncoder[0];+            unsigned m = 1;+            do+            {+                UInt32 ttt, newBound;+                RC_BIT_PRE(p, probs + m)+                RC_BIT_1(&p->rc, probs + m);+                m = (m << 1) + 1;+            } while (m < (1 << kNumPosSlotBits));+        }+        {+            // RangeEnc_EncodeDirectBits(&p->rc, ((UInt32)1 << (30 - kNumAlignBits)) - 1, 30 - kNumAlignBits);    UInt32 range = p->range;+            unsigned numBits = 30 - kNumAlignBits;+            do+            {+                range >>= 1;+                p->rc.low += range;+                RC_NORM(&p->rc)+            } while (--numBits);+        }++        {+            // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask);+            CLzmaProb *probs = p->posAlignEncoder;+            unsigned m = 1;+            do+            {+                UInt32 ttt, newBound;+                RC_BIT_PRE(p, probs + m)+                RC_BIT_1(&p->rc, probs + m);+                m = (m << 1) + 1;+            } while (m < kAlignTableSize);+        }+        p->rc.range = range;+    }++    static SRes CheckErrors(CLzmaEnc * p)+    {+        if (p->result != SZ_OK)+            return p->result;+        if (p->rc.res != SZ_OK)+            p->result = SZ_ERROR_WRITE;++#ifndef _7ZIP_ST+        if (+            // p->mf_Failure ||+            (p->mtMode &&+             ( // p->matchFinderMt.failure_LZ_LZ ||+                 p->matchFinderMt.failure_LZ_BT)))+        {+            p->result = MY_HRES_ERROR__INTERNAL_ERROR;+            // printf("\nCheckErrors p->matchFinderMt.failureLZ\n");+        }+#endif++        if (MFB.result != SZ_OK)+            p->result = SZ_ERROR_READ;++        if (p->result != SZ_OK)+            p->finished = True;+        return p->result;+    }++    MY_NO_INLINE static SRes Flush(CLzmaEnc * p, UInt32 nowPos)+    {+        /* ReleaseMFStream(); */+        p->finished = True;+        if (p->writeEndMark)+            WriteEndMarker(p, nowPos & p->pbMask);+        RangeEnc_FlushData(&p->rc);+        RangeEnc_FlushStream(&p->rc);+        return CheckErrors(p);+    }++    MY_NO_INLINE static void FillAlignPrices(CLzmaEnc * p)+    {+        unsigned i;+        const CProbPrice *ProbPrices = p->ProbPrices;+        const CLzmaProb *probs = p->posAlignEncoder;+        // p->alignPriceCount = 0;+        for (i = 0; i < kAlignTableSize / 2; i++)+        {+            UInt32 price = 0;+            unsigned sym = i;+            unsigned m = 1;+            unsigned bit;+            UInt32 prob;+            bit = sym & 1;+            sym >>= 1;+            price += GET_PRICEa(probs[m], bit);+            m = (m << 1) + bit;+            bit = sym & 1;+            sym >>= 1;+            price += GET_PRICEa(probs[m], bit);+            m = (m << 1) + bit;+            bit = sym & 1;+            sym >>= 1;+            price += GET_PRICEa(probs[m], bit);+            m = (m << 1) + bit;+            prob = probs[m];+            p->alignPrices[i] = price + GET_PRICEa_0(prob);+            p->alignPrices[i + 8] = price + GET_PRICEa_1(prob);+            // p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices);+        }+    }++    MY_NO_INLINE static void FillDistancesPrices(CLzmaEnc * p)+    {+        // int y; for (y = 0; y < 100; y++) {++        UInt32 tempPrices[kNumFullDistances];+        unsigned i, lps;++        const CProbPrice *ProbPrices = p->ProbPrices;+        p->matchPriceCount = 0;++        for (i = kStartPosModelIndex / 2; i < kNumFullDistances / 2; i++)+        {+            unsigned posSlot = GetPosSlot1(i);+            unsigned footerBits = (posSlot >> 1) - 1;+            unsigned base = ((2 | (posSlot & 1)) << footerBits);+            const CLzmaProb *probs = p->posEncoders + (size_t)base * 2;+            // tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base, footerBits, i - base, p->ProbPrices);+            UInt32 price = 0;+            unsigned m = 1;+            unsigned sym = i;+            unsigned offset = (unsigned)1 << footerBits;+            base += i;++            if (footerBits)+                do+                {+                    unsigned bit = sym & 1;+                    sym >>= 1;+                    price += GET_PRICEa(probs[m], bit);+                    m = (m << 1) + bit;+                } while (--footerBits);++            {+                unsigned prob = probs[m];+                tempPrices[base] = price + GET_PRICEa_0(prob);+                tempPrices[base + offset] = price + GET_PRICEa_1(prob);+            }+        }++        for (lps = 0; lps < kNumLenToPosStates; lps++)+        {+            unsigned slot;+            unsigned distTableSize2 = (p->distTableSize + 1) >> 1;+            UInt32 *posSlotPrices = p->posSlotPrices[lps];+            const CLzmaProb *probs = p->posSlotEncoder[lps];++            for (slot = 0; slot < distTableSize2; slot++)+            {+                // posSlotPrices[slot] = RcTree_GetPrice(encoder, kNumPosSlotBits, slot, p->ProbPrices);+                UInt32 price;+                unsigned bit;+                unsigned sym = slot + (1 << (kNumPosSlotBits - 1));+                unsigned prob;+                bit = sym & 1;+                sym >>= 1;+                price = GET_PRICEa(probs[sym], bit);+                bit = sym & 1;+                sym >>= 1;+                price += GET_PRICEa(probs[sym], bit);+                bit = sym & 1;+                sym >>= 1;+                price += GET_PRICEa(probs[sym], bit);+                bit = sym & 1;+                sym >>= 1;+                price += GET_PRICEa(probs[sym], bit);+                bit = sym & 1;+                sym >>= 1;+                price += GET_PRICEa(probs[sym], bit);+                prob = probs[(size_t)slot + (1 << (kNumPosSlotBits - 1))];+                posSlotPrices[(size_t)slot * 2] = price + GET_PRICEa_0(prob);+                posSlotPrices[(size_t)slot * 2 + 1] = price + GET_PRICEa_1(prob);+            }++            {+                UInt32 delta = ((UInt32)((kEndPosModelIndex / 2 - 1) - kNumAlignBits) << kNumBitPriceShiftBits);+                for (slot = kEndPosModelIndex / 2; slot < distTableSize2; slot++)+                {+                    posSlotPrices[(size_t)slot * 2] += delta;+                    posSlotPrices[(size_t)slot * 2 + 1] += delta;+                    delta += ((UInt32)1 << kNumBitPriceShiftBits);+                }+            }++            {+                UInt32 *dp = p->distancesPrices[lps];++                dp[0] = posSlotPrices[0];+                dp[1] = posSlotPrices[1];+                dp[2] = posSlotPrices[2];+                dp[3] = posSlotPrices[3];++                for (i = 4; i < kNumFullDistances; i += 2)+                {+                    UInt32 slotPrice = posSlotPrices[GetPosSlot1(i)];+                    dp[i] = slotPrice + tempPrices[i];+                    dp[i + 1] = slotPrice + tempPrices[i + 1];+                }+            }+        }+        // }+    }++    static void LzmaEnc_Construct(CLzmaEnc * p)+    {+        RangeEnc_Construct(&p->rc);+        MatchFinder_Construct(&MFB);++#ifndef _7ZIP_ST+        p->matchFinderMt.MatchFinder = &MFB;+        MatchFinderMt_Construct(&p->matchFinderMt);+#endif++        {+            CLzmaEncProps props;+            LzmaEncProps_Init(&props);+            LzmaEnc_SetProps(p, &props);+        }++#ifndef LZMA_LOG_BSR+        LzmaEnc_FastPosInit(p->g_FastPos);+#endif++        LzmaEnc_InitPriceTables(p->ProbPrices);+        p->litProbs = NULL;+        p->saveState.litProbs = NULL;+    }++    CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc)+    {+        void *p;+        p = ISzAlloc_Alloc(alloc, sizeof(CLzmaEnc));+        if (p)+            LzmaEnc_Construct((CLzmaEnc *)p);+        return p;+    }++    static void LzmaEnc_FreeLits(CLzmaEnc * p, ISzAllocPtr alloc)+    {+        ISzAlloc_Free(alloc, p->litProbs);+        ISzAlloc_Free(alloc, p->saveState.litProbs);+        p->litProbs = NULL;+        p->saveState.litProbs = NULL;+    }++    static void LzmaEnc_Destruct(CLzmaEnc * p, ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+#ifndef _7ZIP_ST+        MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);+#endif++        MatchFinder_Free(&MFB, allocBig);+        LzmaEnc_FreeLits(p, alloc);+        RangeEnc_Free(&p->rc, alloc);+    }++    void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+        LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig);+        ISzAlloc_Free(alloc, p);+    }++    MY_NO_INLINE+    static SRes LzmaEnc_CodeOneBlock(CLzmaEnc * p, UInt32 maxPackSize, UInt32 maxUnpackSize)+    {+        UInt32 nowPos32, startPos32;+        if (p->needInit)+        {+#ifndef _7ZIP_ST+            if (p->mtMode)+            {+                RINOK(MatchFinderMt_InitMt(&p->matchFinderMt));+            }+#endif+            p->matchFinder.Init(p->matchFinderObj);+            p->needInit = 0;+        }++        if (p->finished)+            return p->result;+        RINOK(CheckErrors(p));++        nowPos32 = (UInt32)p->nowPos64;+        startPos32 = nowPos32;++        if (p->nowPos64 == 0)+        {+            unsigned numPairs;+            Byte curByte;+            if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)+                return Flush(p, nowPos32);+            ReadMatchDistances(p, &numPairs);+            RangeEnc_EncodeBit_0(&p->rc, &p->isMatch[kState_Start][0]);+            // p->state = kLiteralNextStates[p->state];+            curByte = *(p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset);+            LitEnc_Encode(&p->rc, p->litProbs, curByte);+            p->additionalOffset--;+            nowPos32++;+        }++        if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0)++            for (;;)+            {+                UInt32 dist;+                unsigned len, posState;+                UInt32 range, ttt, newBound;+                CLzmaProb *probs;++                if (p->fastMode)+                    len = GetOptimumFast(p);+                else+                {+                    unsigned oci = p->optCur;+                    if (p->optEnd == oci)+                        len = GetOptimum(p, nowPos32);+                    else+                    {+                        const COptimal *opt = &p->opt[oci];+                        len = opt->len;+                        p->backRes = opt->dist;+                        p->optCur = oci + 1;+                    }+                }++                posState = (unsigned)nowPos32 & p->pbMask;+                range = p->rc.range;+                probs = &p->isMatch[p->state][posState];++                RC_BIT_PRE(&p->rc, probs)++                dist = p->backRes;++#ifdef SHOW_STAT2+                printf("\n pos = %6X, len = %3u  pos = %6u", nowPos32, len, dist);+#endif++                if (dist == MARK_LIT)+                {+                    Byte curByte;+                    const Byte *data;+                    unsigned state;++                    RC_BIT_0(&p->rc, probs);+                    p->rc.range = range;+                    data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;+                    probs = LIT_PROBS(nowPos32, *(data - 1));+                    curByte = *data;+                    state = p->state;+                    p->state = kLiteralNextStates[state];+                    if (IsLitState(state))+                        LitEnc_Encode(&p->rc, probs, curByte);+                    else+                        LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0]));+                }+                else+                {+                    RC_BIT_1(&p->rc, probs);+                    probs = &p->isRep[p->state];+                    RC_BIT_PRE(&p->rc, probs)++                    if (dist < LZMA_NUM_REPS)+                    {+                        RC_BIT_1(&p->rc, probs);+                        probs = &p->isRepG0[p->state];+                        RC_BIT_PRE(&p->rc, probs)+                        if (dist == 0)+                        {+                            RC_BIT_0(&p->rc, probs);+                            probs = &p->isRep0Long[p->state][posState];+                            RC_BIT_PRE(&p->rc, probs)+                            if (len != 1)+                            {+                                RC_BIT_1_BASE(&p->rc, probs);+                            }+                            else+                            {+                                RC_BIT_0_BASE(&p->rc, probs);+                                p->state = kShortRepNextStates[p->state];+                            }+                        }+                        else+                        {+                            RC_BIT_1(&p->rc, probs);+                            probs = &p->isRepG1[p->state];+                            RC_BIT_PRE(&p->rc, probs)+                            if (dist == 1)+                            {+                                RC_BIT_0_BASE(&p->rc, probs);+                                dist = p->reps[1];+                            }+                            else+                            {+                                RC_BIT_1(&p->rc, probs);+                                probs = &p->isRepG2[p->state];+                                RC_BIT_PRE(&p->rc, probs)+                                if (dist == 2)+                                {+                                    RC_BIT_0_BASE(&p->rc, probs);+                                    dist = p->reps[2];+                                }+                                else+                                {+                                    RC_BIT_1_BASE(&p->rc, probs);+                                    dist = p->reps[3];+                                    p->reps[3] = p->reps[2];+                                }+                                p->reps[2] = p->reps[1];+                            }+                            p->reps[1] = p->reps[0];+                            p->reps[0] = dist;+                        }++                        RC_NORM(&p->rc)++                        p->rc.range = range;++                        if (len != 1)+                        {+                            LenEnc_Encode(&p->repLenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState);+                            --p->repLenEncCounter;+                            p->state = kRepNextStates[p->state];+                        }+                    }+                    else+                    {+                        unsigned posSlot;+                        RC_BIT_0(&p->rc, probs);+                        p->rc.range = range;+                        p->state = kMatchNextStates[p->state];++                        LenEnc_Encode(&p->lenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState);+                        // --p->lenEnc.counter;++                        dist -= LZMA_NUM_REPS;+                        p->reps[3] = p->reps[2];+                        p->reps[2] = p->reps[1];+                        p->reps[1] = p->reps[0];+                        p->reps[0] = dist + 1;++                        p->matchPriceCount++;+                        GetPosSlot(dist, posSlot);+                        // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], posSlot);+                        {+                            UInt32 sym = (UInt32)posSlot + (1 << kNumPosSlotBits);+                            range = p->rc.range;+                            probs = p->posSlotEncoder[GetLenToPosState(len)];+                            do+                            {+                                CLzmaProb *prob = probs + (sym >> kNumPosSlotBits);+                                UInt32 bit = (sym >> (kNumPosSlotBits - 1)) & 1;+                                sym <<= 1;+                                RC_BIT(&p->rc, prob, bit);+                            } while (sym < (1 << kNumPosSlotBits * 2));+                            p->rc.range = range;+                        }++                        if (dist >= kStartPosModelIndex)+                        {+                            unsigned footerBits = ((posSlot >> 1) - 1);++                            if (dist < kNumFullDistances)+                            {+                                unsigned base = ((2 | (posSlot & 1)) << footerBits);+                                RcTree_ReverseEncode(&p->rc, p->posEncoders + base, footerBits, (unsigned)(dist /* - base */));+                            }+                            else+                            {+                                UInt32 pos2 = (dist | 0xF) << (32 - footerBits);+                                range = p->rc.range;+                                // RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits);+                                /*+                                do+                                {+                                  range >>= 1;+                                  p->rc.low += range & (0 - ((dist >> --footerBits) & 1));+                                  RC_NORM(&p->rc)+                                }+                                while (footerBits > kNumAlignBits);+                                */+                                do+                                {+                                    range >>= 1;+                                    p->rc.low += range & (0 - (pos2 >> 31));+                                    pos2 += pos2;+                                    RC_NORM(&p->rc)+                                } while (pos2 != 0xF0000000);++                                // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask);++                                {+                                    unsigned m = 1;+                                    unsigned bit;+                                    bit = dist & 1;+                                    dist >>= 1;+                                    RC_BIT(&p->rc, p->posAlignEncoder + m, bit);+                                    m = (m << 1) + bit;+                                    bit = dist & 1;+                                    dist >>= 1;+                                    RC_BIT(&p->rc, p->posAlignEncoder + m, bit);+                                    m = (m << 1) + bit;+                                    bit = dist & 1;+                                    dist >>= 1;+                                    RC_BIT(&p->rc, p->posAlignEncoder + m, bit);+                                    m = (m << 1) + bit;+                                    bit = dist & 1;+                                    RC_BIT(&p->rc, p->posAlignEncoder + m, bit);+                                    p->rc.range = range;+                                    // p->alignPriceCount++;+                                }+                            }+                        }+                    }+                }++                nowPos32 += (UInt32)len;+                p->additionalOffset -= len;++                if (p->additionalOffset == 0)+                {+                    UInt32 processed;++                    if (!p->fastMode)+                    {+                        /*+                        if (p->alignPriceCount >= 16) // kAlignTableSize+                          FillAlignPrices(p);+                        if (p->matchPriceCount >= 128)+                          FillDistancesPrices(p);+                        if (p->lenEnc.counter <= 0)+                          LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, &p->lenProbs, p->ProbPrices);+                        */+                        if (p->matchPriceCount >= 64)+                        {+                            FillAlignPrices(p);+                            // { int y; for (y = 0; y < 100; y++) {+                            FillDistancesPrices(p);+                            // }}+                            LenPriceEnc_UpdateTables(&p->lenEnc, (unsigned)1 << p->pb, &p->lenProbs, p->ProbPrices);+                        }+                        if (p->repLenEncCounter <= 0)+                        {+                            p->repLenEncCounter = REP_LEN_COUNT;+                            LenPriceEnc_UpdateTables(&p->repLenEnc, (unsigned)1 << p->pb, &p->repLenProbs, p->ProbPrices);+                        }+                    }++                    if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)+                        break;+                    processed = nowPos32 - startPos32;++                    if (maxPackSize)+                    {+                        if (processed + kNumOpts + 300 >= maxUnpackSize || RangeEnc_GetProcessed_sizet(&p->rc) + kPackReserve >= maxPackSize)+                            break;+                    }+                    else if (processed >= (1 << 17))+                    {+                        p->nowPos64 += nowPos32 - startPos32;+                        return CheckErrors(p);+                    }+                }+            }++        p->nowPos64 += nowPos32 - startPos32;+        return Flush(p, nowPos32);+    }++#define kBigHashDicLimit ((UInt32)1 << 24)++    static SRes LzmaEnc_Alloc(CLzmaEnc * p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+        UInt32 beforeSize = kNumOpts;+        UInt32 dictSize;++        if (!RangeEnc_Alloc(&p->rc, alloc))+            return SZ_ERROR_MEM;++#ifndef _7ZIP_ST+        p->mtMode = (p->multiThread && !p->fastMode && (MFB.btMode != 0));+#endif++        {+            unsigned lclp = p->lc + p->lp;+            if (!p->litProbs || !p->saveState.litProbs || p->lclp != lclp)+            {+                LzmaEnc_FreeLits(p, alloc);+                p->litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb));+                p->saveState.litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb));+                if (!p->litProbs || !p->saveState.litProbs)+                {+                    LzmaEnc_FreeLits(p, alloc);+                    return SZ_ERROR_MEM;+                }+                p->lclp = lclp;+            }+        }++        MFB.bigHash = (Byte)(p->dictSize > kBigHashDicLimit ? 1 : 0);++        dictSize = p->dictSize;+        if (dictSize == ((UInt32)2 << 30) ||+            dictSize == ((UInt32)3 << 30))+        {+            /* 21.03 : here we reduce the dictionary for 2 reasons:+               1) we don't want 32-bit back_distance matches in decoder for 2 GB dictionary.+               2) we want to elimate useless last MatchFinder_Normalize3() for corner cases,+                  where data size is aligned for 1 GB: 5/6/8 GB.+                  That reducing must be >= 1 for such corner cases. */+            dictSize -= 1;+        }++        if (beforeSize + dictSize < keepWindowSize)+            beforeSize = keepWindowSize - dictSize;++            /* in worst case we can look ahead for+                  max(LZMA_MATCH_LEN_MAX, numFastBytes + 1 + numFastBytes) bytes.+               we send larger value for (keepAfter) to MantchFinder_Create():+                  (numFastBytes + LZMA_MATCH_LEN_MAX + 1)+            */++#ifndef _7ZIP_ST+        if (p->mtMode)+        {+            RINOK(MatchFinderMt_Create(&p->matchFinderMt, dictSize, beforeSize,+                                       p->numFastBytes, LZMA_MATCH_LEN_MAX + 1 /* 18.04 */+                                       ,+                                       allocBig));+            p->matchFinderObj = &p->matchFinderMt;+            MFB.bigHash = (Byte)((p->dictSize > kBigHashDicLimit && MFB.hashMask >= 0xFFFFFF) ? 1 : 0);+            MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder);+        }+        else+#endif+        {+            if (!MatchFinder_Create(&MFB, dictSize, beforeSize,+                                    p->numFastBytes, LZMA_MATCH_LEN_MAX + 1 /* 21.03 */+                                    ,+                                    allocBig))+                return SZ_ERROR_MEM;+            p->matchFinderObj = &MFB;+            MatchFinder_CreateVTable(&MFB, &p->matchFinder);+        }++        return SZ_OK;+    }++    static void LzmaEnc_Init(CLzmaEnc * p)+    {+        unsigned i;+        p->state = 0;+        p->reps[0] =+            p->reps[1] =+                p->reps[2] =+                    p->reps[3] = 1;++        RangeEnc_Init(&p->rc);++        for (i = 0; i < (1 << kNumAlignBits); i++)+            p->posAlignEncoder[i] = kProbInitValue;++        for (i = 0; i < kNumStates; i++)+        {+            unsigned j;+            for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++)+            {+                p->isMatch[i][j] = kProbInitValue;+                p->isRep0Long[i][j] = kProbInitValue;+            }+            p->isRep[i] = kProbInitValue;+            p->isRepG0[i] = kProbInitValue;+            p->isRepG1[i] = kProbInitValue;+            p->isRepG2[i] = kProbInitValue;+        }++        {+            for (i = 0; i < kNumLenToPosStates; i++)+            {+                CLzmaProb *probs = p->posSlotEncoder[i];+                unsigned j;+                for (j = 0; j < (1 << kNumPosSlotBits); j++)+                    probs[j] = kProbInitValue;+            }+        }+        {+            for (i = 0; i < kNumFullDistances; i++)+                p->posEncoders[i] = kProbInitValue;+        }++        {+            UInt32 num = (UInt32)0x300 << (p->lp + p->lc);+            UInt32 k;+            CLzmaProb *probs = p->litProbs;+            for (k = 0; k < num; k++)+                probs[k] = kProbInitValue;+        }++        LenEnc_Init(&p->lenProbs);+        LenEnc_Init(&p->repLenProbs);++        p->optEnd = 0;+        p->optCur = 0;++        {+            for (i = 0; i < kNumOpts; i++)+                p->opt[i].price = kInfinityPrice;+        }++        p->additionalOffset = 0;++        p->pbMask = ((unsigned)1 << p->pb) - 1;+        p->lpMask = ((UInt32)0x100 << p->lp) - ((unsigned)0x100 >> p->lc);++        // p->mf_Failure = False;+    }++    static void LzmaEnc_InitPrices(CLzmaEnc * p)+    {+        if (!p->fastMode)+        {+            FillDistancesPrices(p);+            FillAlignPrices(p);+        }++        p->lenEnc.tableSize =+            p->repLenEnc.tableSize =+                p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN;++        p->repLenEncCounter = REP_LEN_COUNT;++        LenPriceEnc_UpdateTables(&p->lenEnc, (unsigned)1 << p->pb, &p->lenProbs, p->ProbPrices);+        LenPriceEnc_UpdateTables(&p->repLenEnc, (unsigned)1 << p->pb, &p->repLenProbs, p->ProbPrices);+    }++    static SRes LzmaEnc_AllocAndInit(CLzmaEnc * p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+        unsigned i;+        for (i = kEndPosModelIndex / 2; i < kDicLogSizeMax; i++)+            if (p->dictSize <= ((UInt32)1 << i))+                break;+        p->distTableSize = i * 2;++        p->finished = False;+        p->result = SZ_OK;+        RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig));+        LzmaEnc_Init(p);+        LzmaEnc_InitPrices(p);+        p->nowPos64 = 0;+        return SZ_OK;+    }++    static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream * outStream, ISeqInStream * inStream,+                                ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+        CLzmaEnc *p = (CLzmaEnc *)pp;+        MFB.stream = inStream;+        p->needInit = 1;+        p->rc.outStream = outStream;+        return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);+    }++    SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,+                                 ISeqInStream * inStream, UInt32 keepWindowSize,+                                 ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+        CLzmaEnc *p = (CLzmaEnc *)pp;+        MFB.stream = inStream;+        p->needInit = 1;+        return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);+    }++    static void LzmaEnc_SetInputBuf(CLzmaEnc * p, const Byte *src, SizeT srcLen)+    {+        MFB.directInput = 1;+        MFB.bufferBase = (Byte *)src;+        MFB.directInputRem = srcLen;+    }++    SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,+                            UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+        CLzmaEnc *p = (CLzmaEnc *)pp;+        LzmaEnc_SetInputBuf(p, src, srcLen);+        p->needInit = 1;++        LzmaEnc_SetDataSize(pp, srcLen);+        return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);+    }++    void LzmaEnc_Finish(CLzmaEncHandle pp)+    {+#ifndef _7ZIP_ST+        CLzmaEnc *p = (CLzmaEnc *)pp;+        if (p->mtMode)+            MatchFinderMt_ReleaseStream(&p->matchFinderMt);+#else+    UNUSED_VAR(pp);+#endif+    }++    typedef struct+    {+        ISeqOutStream vt;+        Byte *data;+        SizeT rem;+        BoolInt overflow;+    } CLzmaEnc_SeqOutStreamBuf;++    static size_t SeqOutStreamBuf_Write(const ISeqOutStream *pp, const void *data, size_t size)+    {+        CLzmaEnc_SeqOutStreamBuf *p = CONTAINER_FROM_VTBL(pp, CLzmaEnc_SeqOutStreamBuf, vt);+        if (p->rem < size)+        {+            size = p->rem;+            p->overflow = True;+        }+        if (size != 0)+        {+            memcpy(p->data, data, size);+            p->rem -= size;+            p->data += size;+        }+        return size;+    }++    /*+    UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)+    {+      const CLzmaEnc *p = (CLzmaEnc *)pp;+      return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);+    }+    */++    const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)+    {+        const CLzmaEnc *p = (CLzmaEnc *)pp;+        return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;+    }++    // (desiredPackSize == 0) is not allowed+    SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit,+                                 Byte * dest, size_t * destLen, UInt32 desiredPackSize, UInt32 * unpackSize)+    {+        CLzmaEnc *p = (CLzmaEnc *)pp;+        UInt64 nowPos64;+        SRes res;+        CLzmaEnc_SeqOutStreamBuf outStream;++        outStream.vt.Write = SeqOutStreamBuf_Write;+        outStream.data = dest;+        outStream.rem = *destLen;+        outStream.overflow = False;++        p->writeEndMark = False;+        p->finished = False;+        p->result = SZ_OK;++        if (reInit)+            LzmaEnc_Init(p);+        LzmaEnc_InitPrices(p);+        RangeEnc_Init(&p->rc);+        p->rc.outStream = &outStream.vt;+        nowPos64 = p->nowPos64;++        res = LzmaEnc_CodeOneBlock(p, desiredPackSize, *unpackSize);++        *unpackSize = (UInt32)(p->nowPos64 - nowPos64);+        *destLen -= outStream.rem;+        if (outStream.overflow)+            return SZ_ERROR_OUTPUT_EOF;++        return res;+    }++    MY_NO_INLINE+    static SRes LzmaEnc_Encode2(CLzmaEnc * p, ICompressProgress * progress)+    {+        SRes res = SZ_OK;++#ifndef _7ZIP_ST+        Byte allocaDummy[0x300];+        allocaDummy[0] = 0;+        allocaDummy[1] = allocaDummy[0];+#endif++        for (;;)+        {+            res = LzmaEnc_CodeOneBlock(p, 0, 0);+            if (res != SZ_OK || p->finished)+                break;+            if (progress)+            {+                res = ICompressProgress_Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc));+                if (res != SZ_OK)+                {+                    res = SZ_ERROR_PROGRESS;+                    break;+                }+            }+        }++        LzmaEnc_Finish(p);++        /*+        if (res == SZ_OK && !Inline_MatchFinder_IsFinishedOK(&MFB))+          res = SZ_ERROR_FAIL;+        }+        */++        return res;+    }++    SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream * outStream, ISeqInStream * inStream, ICompressProgress * progress,+                        ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+        RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));+        return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);+    }++    SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte * props, SizeT * size)+    {+        if (*size < LZMA_PROPS_SIZE)+            return SZ_ERROR_PARAM;+        *size = LZMA_PROPS_SIZE;+        {+            const CLzmaEnc *p = (const CLzmaEnc *)pp;+            const UInt32 dictSize = p->dictSize;+            UInt32 v;+            props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc);++            // we write aligned dictionary value to properties for lzma decoder+            if (dictSize >= ((UInt32)1 << 21))+            {+                const UInt32 kDictMask = ((UInt32)1 << 20) - 1;+                v = (dictSize + kDictMask) & ~kDictMask;+                if (v < dictSize)+                    v = dictSize;+            }+            else+            {+                unsigned i = 11 * 2;+                do+                {+                    v = (UInt32)(2 + (i & 1)) << (i >> 1);+                    i++;+                } while (v < dictSize);+            }++            SetUi32(props + 1, v);+            return SZ_OK;+        }+    }++    unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle pp)+    {+        return (unsigned)((CLzmaEnc *)pp)->writeEndMark;+    }++    SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte * dest, SizeT * destLen, const Byte *src, SizeT srcLen,+                           int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+        SRes res;+        CLzmaEnc *p = (CLzmaEnc *)pp;++        CLzmaEnc_SeqOutStreamBuf outStream;++        outStream.vt.Write = SeqOutStreamBuf_Write;+        outStream.data = dest;+        outStream.rem = *destLen;+        outStream.overflow = False;++        p->writeEndMark = writeEndMark;+        p->rc.outStream = &outStream.vt;++        res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig);++        if (res == SZ_OK)+        {+            res = LzmaEnc_Encode2(p, progress);+            if (res == SZ_OK && p->nowPos64 != srcLen)+                res = SZ_ERROR_FAIL;+        }++        *destLen -= outStream.rem;+        if (outStream.overflow)+            return SZ_ERROR_OUTPUT_EOF;+        return res;+    }++    SRes LzmaEncode(Byte * dest, SizeT * destLen, const Byte *src, SizeT srcLen,+                    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,+                    ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig)+    {+        CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);+        SRes res;+        if (!p)+            return SZ_ERROR_MEM;++        res = LzmaEnc_SetProps(p, props);+        if (res == SZ_OK)+        {+            res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);+            if (res == SZ_OK)+                res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,+                                        writeEndMark, progress, alloc, allocBig);+        }++        LzmaEnc_Destroy(p, alloc, allocBig);+        return res;+    }++    int lzma_compress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen)+    {+        size_t outPropsSize = LZMA_PROPS_SIZE;+        CLzmaEncProps props;+        LzmaEncProps_Init(&props);+        SRes res = LzmaEncode(&dest[LZMA_HEADER_SIZE], destLen, src, srcLen, &props, dest, &outPropsSize, 0, NULL, &g_Alloc, &g_Alloc);+        if (res == SZ_OK)+            *destLen += LZMA_HEADER_SIZE;+        return res;+    }++    /*+    #ifndef _7ZIP_ST+    void LzmaEnc_GetLzThreads(CLzmaEncHandle pp, HANDLE lz_threads[2])+    {+      const CLzmaEnc *p = (CLzmaEnc *)pp;+      lz_threads[0] = p->matchFinderMt.hashSync.thread;+      lz_threads[1] = p->matchFinderMt.btSync.thread;+    }+    #endif+    */++#define kNumTopBits 24+#define kTopValue ((UInt32)1 << kNumTopBits)++#define kNumBitModelTotalBits 11+#define kBitModelTotal (1 << kNumBitModelTotalBits)++#define RC_INIT_SIZE 5++#ifndef _LZMA_DEC_OPT++#define kNumMoveBits 5+#define NORMALIZE                      \+    if (range < kTopValue)             \+    {                                  \+        range <<= 8;                   \+        code = (code << 8) | (*buf++); \+    }++#define IF_BIT_0(p)                                         \+    ttt = *(p);                                             \+    NORMALIZE;                                              \+    bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; \+    if (code < bound)+#define UPDATE_0(p) \+    range = bound;  \+    *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));+#define UPDATE_1(p) \+    range -= bound; \+    code -= bound;  \+    *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));+#define GET_BIT2(p, i, A0, A1) \+    IF_BIT_0(p)                \+    {                          \+        UPDATE_0(p);           \+        i = (i + i);           \+        A0;                    \+    }                          \+    else                       \+    {                          \+        UPDATE_1(p);           \+        i = (i + i) + 1;       \+        A1;                    \+    }++#define TREE_GET_BIT(probs, i)        \+    {                                 \+        GET_BIT2(probs + i, i, ;, ;); \+    }++#define REV_BIT(p, i, A0, A1) \+    IF_BIT_0(p + i)           \+    {                         \+        UPDATE_0(p + i);      \+        A0;                   \+    }                         \+    else                      \+    {                         \+        UPDATE_1(p + i);      \+        A1;                   \+    }+#define REV_BIT_VAR(p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m;)+#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m;, i += m * 2;)+#define REV_BIT_LAST(p, i, m) REV_BIT(p, i, i -= m, ;)++#define TREE_DECODE(probs, limit, i) \+    {                                \+        i = 1;                       \+        do                           \+        {                            \+            TREE_GET_BIT(probs, i);  \+        } while (i < limit);         \+        i -= limit;                  \+    }++    /* #define _LZMA_SIZE_OPT */++#ifdef _LZMA_SIZE_OPT+#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)+#else+#define TREE_6_DECODE(probs, i) \+    {                           \+        i = 1;                  \+        TREE_GET_BIT(probs, i); \+        TREE_GET_BIT(probs, i); \+        TREE_GET_BIT(probs, i); \+        TREE_GET_BIT(probs, i); \+        TREE_GET_BIT(probs, i); \+        TREE_GET_BIT(probs, i); \+        i -= 0x40;              \+    }+#endif++#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol)+#define MATCHED_LITER_DEC                   \+    matchByte += matchByte;                 \+    bit = offs;                             \+    offs &= matchByte;                      \+    probLit = prob + (offs + bit + symbol); \+    GET_BIT2(probLit, symbol, offs ^= bit;, ;)++#endif // _LZMA_DEC_OPT++#define NORMALIZE_CHECK                \+    if (range < kTopValue)             \+    {                                  \+        if (buf >= bufLimit)           \+            return DUMMY_INPUT_EOF;    \+        range <<= 8;                   \+        code = (code << 8) | (*buf++); \+    }++#define IF_BIT_0_CHECK(p)                                   \+    ttt = *(p);                                             \+    NORMALIZE_CHECK;                                        \+    bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; \+    if (code < bound)+#define UPDATE_0_CHECK range = bound;+#define UPDATE_1_CHECK \+    range -= bound;    \+    code -= bound;+#define GET_BIT2_CHECK(p, i, A0, A1) \+    IF_BIT_0_CHECK(p)                \+    {                                \+        UPDATE_0_CHECK;              \+        i = (i + i);                 \+        A0;                          \+    }                                \+    else                             \+    {                                \+        UPDATE_1_CHECK;              \+        i = (i + i) + 1;             \+        A1;                          \+    }+#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ;, ;)+#define TREE_DECODE_CHECK(probs, limit, i) \+    {                                      \+        i = 1;                             \+        do                                 \+        {                                  \+            GET_BIT_CHECK(probs + i, i)    \+        } while (i < limit);               \+        i -= limit;                        \+    }++#define REV_BIT_CHECK(p, i, m) \+    IF_BIT_0_CHECK(p + i)      \+    {                          \+        UPDATE_0_CHECK;        \+        i += m;                \+        m += m;                \+    }                          \+    else                       \+    {                          \+        UPDATE_1_CHECK;        \+        m += m;                \+        i += m;                \+    }++#define kNumPosBitsMax 4+#define kNumPosStatesMax (1 << kNumPosBitsMax)++#define kLenNumLowBits 3+#define kLenNumLowSymbols (1 << kLenNumLowBits)+#define kLenNumHighBits 8+#define kLenNumHighSymbols (1 << kLenNumHighBits)++#define LenLow 0+#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits))+#define kNumLenProbs (LenHigh + kLenNumHighSymbols)++#define LenChoice LenLow+#define LenChoice2 (LenLow + (1 << kLenNumLowBits))++#define kNumStates 12+#define kNumStates2 16+#define kNumLitStates 7++#define kStartPosModelIndex 4+#define kEndPosModelIndex 14+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))++#define kNumPosSlotBits 6+#define kNumLenToPosStates 4++#define kNumAlignBits 4+#define kAlignTableSize (1 << kNumAlignBits)++#define kMatchMinLen 2+#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols)++#define kMatchSpecLen_Error_Data (1 << 9)+#define kMatchSpecLen_Error_Fail (kMatchSpecLen_Error_Data - 1)++    /* External ASM code needs same CLzmaProb array layout. So don't change it. */++    /* (probs_1664) is faster and better for code size at some platforms */+    /*+    #ifdef MY_CPU_X86_OR_AMD64+    */+#define kStartOffset 1664+#define GET_PROBS p->probs_1664+    /*+    #define GET_PROBS p->probs + kStartOffset+    #else+    #define kStartOffset 0+    #define GET_PROBS p->probs+    #endif+    */++#define SpecPos (-kStartOffset)+#define IsRep0Long (SpecPos + kNumFullDistances)+#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax))+#define LenCoder (RepLenCoder + kNumLenProbs)+#define IsMatch (LenCoder + kNumLenProbs)+#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax))+#define IsRep (Align + kAlignTableSize)+#define IsRepG0 (IsRep + kNumStates)+#define IsRepG1 (IsRepG0 + kNumStates)+#define IsRepG2 (IsRepG1 + kNumStates)+#define PosSlot (IsRepG2 + kNumStates)+#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))+#define NUM_BASE_PROBS (Literal + kStartOffset)++#if Align != 0 && kStartOffset != 0+#error Stop_Compiling_Bad_LZMA_kAlign+#endif++#if NUM_BASE_PROBS != 1984+#error Stop_Compiling_Bad_LZMA_PROBS+#endif++#define LZMA_LIT_SIZE 0x300++#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))++#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4)+#define COMBINED_PS_STATE (posState + state)+#define GET_LEN_STATE (posState)++#define LZMA_DIC_MIN (1 << 12)++    /*+    p->remainLen : shows status of LZMA decoder:+        < kMatchSpecLenStart  : the number of bytes to be copied with (p->rep0) offset+        = kMatchSpecLenStart  : the LZMA stream was finished with end mark+        = kMatchSpecLenStart + 1  : need init range coder+        = kMatchSpecLenStart + 2  : need init range coder and state+        = kMatchSpecLen_Error_Fail                : Internal Code Failure+        = kMatchSpecLen_Error_Data + [0 ... 273]  : LZMA Data Error+    */++    /* ---------- LZMA_DECODE_REAL ---------- */+    /*+    LzmaDec_DecodeReal_3() can be implemented in external ASM file.+    3 - is the code compatibility version of that function for check at link time.+    */++#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3++    /*+    LZMA_DECODE_REAL()+    In:+      RangeCoder is normalized+      if (p->dicPos == limit)+      {+        LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases.+        So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol+        is not END_OF_PAYALOAD_MARKER, then the function doesn't write any byte to dictionary,+        the function returns SZ_OK, and the caller can use (p->remainLen) and (p->reps[0]) later.+      }++    Processing:+      The first LZMA symbol will be decoded in any case.+      All main checks for limits are at the end of main loop,+      It decodes additional LZMA-symbols while (p->buf < bufLimit && dicPos < limit),+      RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked.+      But if (p->buf < bufLimit), the caller provided at least (LZMA_REQUIRED_INPUT_MAX + 1) bytes for+      next iteration  before limit (bufLimit + LZMA_REQUIRED_INPUT_MAX),+      that is enough for worst case LZMA symbol with one additional RangeCoder normalization for one bit.+      So that function never reads bufLimit [LZMA_REQUIRED_INPUT_MAX] byte.++    Out:+      RangeCoder is normalized+      Result:+        SZ_OK - OK+          p->remainLen:+            < kMatchSpecLenStart : the number of bytes to be copied with (p->reps[0]) offset+            = kMatchSpecLenStart : the LZMA stream was finished with end mark++        SZ_ERROR_DATA - error, when the MATCH-Symbol refers out of dictionary+          p->remainLen : undefined+          p->reps[*]    : undefined+    */++#ifdef _LZMA_DEC_OPT++    int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec * p, SizeT limit, const Byte *bufLimit);++#else++static int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit)+{+    CLzmaProb *probs = GET_PROBS;+    unsigned state = (unsigned)p->state;+    UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];+    unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;+    unsigned lc = p->prop.lc;+    unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc);++    Byte *dic = p->dic;+    SizeT dicBufSize = p->dicBufSize;+    SizeT dicPos = p->dicPos;++    UInt32 processedPos = p->processedPos;+    UInt32 checkDicSize = p->checkDicSize;+    unsigned len = 0;++    const Byte *buf = p->buf;+    UInt32 range = p->range;+    UInt32 code = p->code;++    do+    {+        CLzmaProb *prob;+        UInt32 bound;+        unsigned ttt;+        unsigned posState = CALC_POS_STATE(processedPos, pbMask);++        prob = probs + IsMatch + COMBINED_PS_STATE;+        IF_BIT_0(prob)+        {+            unsigned symbol;+            UPDATE_0(prob);+            prob = probs + Literal;+            if (processedPos != 0 || checkDicSize != 0)+                prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc);+            processedPos++;++            if (state < kNumLitStates)+            {+                state -= (state < 4) ? state : 3;+                symbol = 1;+#ifdef _LZMA_SIZE_OPT+                do+                {+                    NORMAL_LITER_DEC+                } while (symbol < 0x100);+#else+                NORMAL_LITER_DEC+                NORMAL_LITER_DEC+                NORMAL_LITER_DEC+                NORMAL_LITER_DEC+                NORMAL_LITER_DEC+                NORMAL_LITER_DEC+                NORMAL_LITER_DEC+                NORMAL_LITER_DEC+#endif+            }+            else+            {+                unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];+                unsigned offs = 0x100;+                state -= (state < 10) ? 3 : 6;+                symbol = 1;+#ifdef _LZMA_SIZE_OPT+                do+                {+                    unsigned bit;+                    CLzmaProb *probLit;+                    MATCHED_LITER_DEC+                } while (symbol < 0x100);+#else+                {+                    unsigned bit;+                    CLzmaProb *probLit;+                    MATCHED_LITER_DEC+                    MATCHED_LITER_DEC+                    MATCHED_LITER_DEC+                    MATCHED_LITER_DEC+                    MATCHED_LITER_DEC+                    MATCHED_LITER_DEC+                    MATCHED_LITER_DEC+                    MATCHED_LITER_DEC+                }+#endif+            }++            dic[dicPos++] = (Byte)symbol;+            continue;+        }++        {+            UPDATE_1(prob);+            prob = probs + IsRep + state;+            IF_BIT_0(prob)+            {+                UPDATE_0(prob);+                state += kNumStates;+                prob = probs + LenCoder;+            }+            else+            {+                UPDATE_1(prob);+                prob = probs + IsRepG0 + state;+                IF_BIT_0(prob)+                {+                    UPDATE_0(prob);+                    prob = probs + IsRep0Long + COMBINED_PS_STATE;+                    IF_BIT_0(prob)+                    {+                        UPDATE_0(prob);++                        // that case was checked before with kBadRepCode+                        // if (checkDicSize == 0 && processedPos == 0) { len = kMatchSpecLen_Error_Data + 1; break; }+                        // The caller doesn't allow (dicPos == limit) case here+                        // so we don't need the following check:+                        // if (dicPos == limit) { state = state < kNumLitStates ? 9 : 11; len = 1; break; }++                        dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];+                        dicPos++;+                        processedPos++;+                        state = state < kNumLitStates ? 9 : 11;+                        continue;+                    }+                    UPDATE_1(prob);+                }+                else+                {+                    UInt32 distance;+                    UPDATE_1(prob);+                    prob = probs + IsRepG1 + state;+                    IF_BIT_0(prob)+                    {+                        UPDATE_0(prob);+                        distance = rep1;+                    }+                    else+                    {+                        UPDATE_1(prob);+                        prob = probs + IsRepG2 + state;+                        IF_BIT_0(prob)+                        {+                            UPDATE_0(prob);+                            distance = rep2;+                        }+                        else+                        {+                            UPDATE_1(prob);+                            distance = rep3;+                            rep3 = rep2;+                        }+                        rep2 = rep1;+                    }+                    rep1 = rep0;+                    rep0 = distance;+                }+                state = state < kNumLitStates ? 8 : 11;+                prob = probs + RepLenCoder;+            }++#ifdef _LZMA_SIZE_OPT+            {+                unsigned lim, offset;+                CLzmaProb *probLen = prob + LenChoice;+                IF_BIT_0(probLen)+                {+                    UPDATE_0(probLen);+                    probLen = prob + LenLow + GET_LEN_STATE;+                    offset = 0;+                    lim = (1 << kLenNumLowBits);+                }+                else+                {+                    UPDATE_1(probLen);+                    probLen = prob + LenChoice2;+                    IF_BIT_0(probLen)+                    {+                        UPDATE_0(probLen);+                        probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);+                        offset = kLenNumLowSymbols;+                        lim = (1 << kLenNumLowBits);+                    }+                    else+                    {+                        UPDATE_1(probLen);+                        probLen = prob + LenHigh;+                        offset = kLenNumLowSymbols * 2;+                        lim = (1 << kLenNumHighBits);+                    }+                }+                TREE_DECODE(probLen, lim, len);+                len += offset;+            }+#else+            {+                CLzmaProb *probLen = prob + LenChoice;+                IF_BIT_0(probLen)+                {+                    UPDATE_0(probLen);+                    probLen = prob + LenLow + GET_LEN_STATE;+                    len = 1;+                    TREE_GET_BIT(probLen, len);+                    TREE_GET_BIT(probLen, len);+                    TREE_GET_BIT(probLen, len);+                    len -= 8;+                }+                else+                {+                    UPDATE_1(probLen);+                    probLen = prob + LenChoice2;+                    IF_BIT_0(probLen)+                    {+                        UPDATE_0(probLen);+                        probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);+                        len = 1;+                        TREE_GET_BIT(probLen, len);+                        TREE_GET_BIT(probLen, len);+                        TREE_GET_BIT(probLen, len);+                    }+                    else+                    {+                        UPDATE_1(probLen);+                        probLen = prob + LenHigh;+                        TREE_DECODE(probLen, (1 << kLenNumHighBits), len);+                        len += kLenNumLowSymbols * 2;+                    }+                }+            }+#endif++            if (state >= kNumStates)+            {+                UInt32 distance;+                prob = probs + PosSlot ++                       ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);+                TREE_6_DECODE(prob, distance);+                if (distance >= kStartPosModelIndex)+                {+                    unsigned posSlot = (unsigned)distance;+                    unsigned numDirectBits = (unsigned)(((distance >> 1) - 1));+                    distance = (2 | (distance & 1));+                    if (posSlot < kEndPosModelIndex)+                    {+                        distance <<= numDirectBits;+                        prob = probs + SpecPos;+                        {+                            UInt32 m = 1;+                            distance++;+                            do+                            {+                                REV_BIT_VAR(prob, distance, m);+                            } while (--numDirectBits);+                            distance -= m;+                        }+                    }+                    else+                    {+                        numDirectBits -= kNumAlignBits;+                        do+                        {+                            NORMALIZE+                            range >>= 1;++                            {+                                UInt32 t;+                                code -= range;+                                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */+                                distance = (distance << 1) + (t + 1);+                                code += range & t;+                            }+                            /*+                            distance <<= 1;+                            if (code >= range)+                            {+                              code -= range;+                              distance |= 1;+                            }+                            */+                        } while (--numDirectBits);+                        prob = probs + Align;+                        distance <<= kNumAlignBits;+                        {+                            unsigned i = 1;+                            REV_BIT_CONST(prob, i, 1);+                            REV_BIT_CONST(prob, i, 2);+                            REV_BIT_CONST(prob, i, 4);+                            REV_BIT_LAST(prob, i, 8);+                            distance |= i;+                        }+                        if (distance == (UInt32)0xFFFFFFFF)+                        {+                            len = kMatchSpecLenStart;+                            state -= kNumStates;+                            break;+                        }+                    }+                }++                rep3 = rep2;+                rep2 = rep1;+                rep1 = rep0;+                rep0 = distance + 1;+                state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;+                if (distance >= (checkDicSize == 0 ? processedPos : checkDicSize))+                {+                    len += kMatchSpecLen_Error_Data + kMatchMinLen;+                    // len = kMatchSpecLen_Error_Data;+                    // len += kMatchMinLen;+                    break;+                }+            }++            len += kMatchMinLen;++            {+                SizeT rem;+                unsigned curLen;+                SizeT pos;++                if ((rem = limit - dicPos) == 0)+                {+                    /*+                    We stop decoding and return SZ_OK, and we can resume decoding later.+                    Any error conditions can be tested later in caller code.+                    For more strict mode we can stop decoding with error+                    // len += kMatchSpecLen_Error_Data;+                    */+                    break;+                }++                curLen = ((rem < len) ? (unsigned)rem : len);+                pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0);++                processedPos += (UInt32)curLen;++                len -= curLen;+                if (curLen <= dicBufSize - pos)+                {+                    Byte *dest = dic + dicPos;+                    ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;+                    const Byte *lim = dest + curLen;+                    dicPos += (SizeT)curLen;+                    do+                        *(dest) = (Byte) * (dest + src);+                    while (++dest != lim);+                }+                else+                {+                    do+                    {+                        dic[dicPos++] = dic[pos];+                        if (++pos == dicBufSize)+                            pos = 0;+                    } while (--curLen != 0);+                }+            }+        }+    } while (dicPos < limit && buf < bufLimit);++    NORMALIZE;++    p->buf = buf;+    p->range = range;+    p->code = code;+    p->remainLen = (UInt32)len; // & (kMatchSpecLen_Error_Data - 1); // we can write real length for error matches too.+    p->dicPos = dicPos;+    p->processedPos = processedPos;+    p->reps[0] = rep0;+    p->reps[1] = rep1;+    p->reps[2] = rep2;+    p->reps[3] = rep3;+    p->state = (UInt32)state;+    if (len >= kMatchSpecLen_Error_Data)+        return SZ_ERROR_DATA;+    return SZ_OK;+}+#endif++    static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec * p, SizeT limit)+    {+        unsigned len = (unsigned)p->remainLen;+        if (len == 0 /* || len >= kMatchSpecLenStart */)+            return;+        {+            SizeT dicPos = p->dicPos;+            Byte *dic;+            SizeT dicBufSize;+            SizeT rep0; /* we use SizeT to avoid the BUG of VC14 for AMD64 */+            {+                SizeT rem = limit - dicPos;+                if (rem < len)+                {+                    len = (unsigned)(rem);+                    if (len == 0)+                        return;+                }+            }++            if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)+                p->checkDicSize = p->prop.dicSize;++            p->processedPos += (UInt32)len;+            p->remainLen -= (UInt32)len;+            dic = p->dic;+            rep0 = p->reps[0];+            dicBufSize = p->dicBufSize;+            do+            {+                dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];+                dicPos++;+            } while (--len);+            p->dicPos = dicPos;+        }+    }++    /*+    At staring of new stream we have one of the following symbols:+      - Literal        - is allowed+      - Non-Rep-Match  - is allowed only if it's end marker symbol+      - Rep-Match      - is not allowed+    We use early check of (RangeCoder:Code) over kBadRepCode to simplify main decoding code+    */++#define kRange0 0xFFFFFFFF+#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))+#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)))+#if kBadRepCode != (0xC0000000 - 0x400)+#error Stop_Compiling_Bad_LZMA_Check+#endif++    /*+    LzmaDec_DecodeReal2():+      It calls LZMA_DECODE_REAL() and it adjusts limit according (p->checkDicSize).++    We correct (p->checkDicSize) after LZMA_DECODE_REAL() and in LzmaDec_WriteRem(),+    and we support the following state of (p->checkDicSize):+      if (total_processed < p->prop.dicSize) then+      {+        (total_processed == p->processedPos)+        (p->checkDicSize == 0)+      }+      else+        (p->checkDicSize == p->prop.dicSize)+    */++    static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec * p, SizeT limit, const Byte *bufLimit)+    {+        if (p->checkDicSize == 0)+        {+            UInt32 rem = p->prop.dicSize - p->processedPos;+            if (limit - p->dicPos > rem)+                limit = p->dicPos + rem;+        }+        {+            int res = LZMA_DECODE_REAL(p, limit, bufLimit);+            if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize)+                p->checkDicSize = p->prop.dicSize;+            return res;+        }+    }++    typedef enum+    {+        DUMMY_INPUT_EOF, /* need more input data */+        DUMMY_LIT,+        DUMMY_MATCH,+        DUMMY_REP+    } ELzmaDummy;++#define IS_DUMMY_END_MARKER_POSSIBLE(dummyRes) ((dummyRes) == DUMMY_MATCH)++    static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, const Byte **bufOut)+    {+        UInt32 range = p->range;+        UInt32 code = p->code;+        const Byte *bufLimit = *bufOut;+        const CLzmaProb *probs = GET_PROBS;+        unsigned state = (unsigned)p->state;+        ELzmaDummy res;++        for (;;)+        {+            const CLzmaProb *prob;+            UInt32 bound;+            unsigned ttt;+            unsigned posState = CALC_POS_STATE(p->processedPos, ((unsigned)1 << p->prop.pb) - 1);++            prob = probs + IsMatch + COMBINED_PS_STATE;+            IF_BIT_0_CHECK(prob)+            {+                UPDATE_0_CHECK++                prob = probs + Literal;+                if (p->checkDicSize != 0 || p->processedPos != 0)+                    prob += ((UInt32)LZMA_LIT_SIZE *+                             ((((p->processedPos) & (((unsigned)1 << (p->prop.lp)) - 1)) << p->prop.lc) ++                              ((unsigned)p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));++                if (state < kNumLitStates)+                {+                    unsigned symbol = 1;+                    do+                    {+                        GET_BIT_CHECK(prob + symbol, symbol)+                    } while (symbol < 0x100);+                }+                else+                {+                    unsigned matchByte = p->dic[p->dicPos - p->reps[0] ++                                                (p->dicPos < p->reps[0] ? p->dicBufSize : 0)];+                    unsigned offs = 0x100;+                    unsigned symbol = 1;+                    do+                    {+                        unsigned bit;+                        const CLzmaProb *probLit;+                        matchByte += matchByte;+                        bit = offs;+                        offs &= matchByte;+                        probLit = prob + (offs + bit + symbol);+                        GET_BIT2_CHECK(probLit, symbol, offs ^= bit;, ;)+                    } while (symbol < 0x100);+                }+                res = DUMMY_LIT;+            }+            else+            {+                unsigned len;+                UPDATE_1_CHECK;++                prob = probs + IsRep + state;+                IF_BIT_0_CHECK(prob)+                {+                    UPDATE_0_CHECK;+                    state = 0;+                    prob = probs + LenCoder;+                    res = DUMMY_MATCH;+                }+                else+                {+                    UPDATE_1_CHECK;+                    res = DUMMY_REP;+                    prob = probs + IsRepG0 + state;+                    IF_BIT_0_CHECK(prob)+                    {+                        UPDATE_0_CHECK;+                        prob = probs + IsRep0Long + COMBINED_PS_STATE;+                        IF_BIT_0_CHECK(prob)+                        {+                            UPDATE_0_CHECK;+                            break;+                        }+                        else+                        {+                            UPDATE_1_CHECK;+                        }+                    }+                    else+                    {+                        UPDATE_1_CHECK;+                        prob = probs + IsRepG1 + state;+                        IF_BIT_0_CHECK(prob)+                        {+                            UPDATE_0_CHECK;+                        }+                        else+                        {+                            UPDATE_1_CHECK;+                            prob = probs + IsRepG2 + state;+                            IF_BIT_0_CHECK(prob)+                            {+                                UPDATE_0_CHECK;+                            }+                            else+                            {+                                UPDATE_1_CHECK;+                            }+                        }+                    }+                    state = kNumStates;+                    prob = probs + RepLenCoder;+                }+                {+                    unsigned limit, offset;+                    const CLzmaProb *probLen = prob + LenChoice;+                    IF_BIT_0_CHECK(probLen)+                    {+                        UPDATE_0_CHECK;+                        probLen = prob + LenLow + GET_LEN_STATE;+                        offset = 0;+                        limit = 1 << kLenNumLowBits;+                    }+                    else+                    {+                        UPDATE_1_CHECK;+                        probLen = prob + LenChoice2;+                        IF_BIT_0_CHECK(probLen)+                        {+                            UPDATE_0_CHECK;+                            probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);+                            offset = kLenNumLowSymbols;+                            limit = 1 << kLenNumLowBits;+                        }+                        else+                        {+                            UPDATE_1_CHECK;+                            probLen = prob + LenHigh;+                            offset = kLenNumLowSymbols * 2;+                            limit = 1 << kLenNumHighBits;+                        }+                    }+                    TREE_DECODE_CHECK(probLen, limit, len);+                    len += offset;+                }++                if (state < 4)+                {+                    unsigned posSlot;+                    prob = probs + PosSlot ++                           ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);+                    TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);+                    if (posSlot >= kStartPosModelIndex)+                    {+                        unsigned numDirectBits = ((posSlot >> 1) - 1);++                        if (posSlot < kEndPosModelIndex)+                        {+                            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits);+                        }+                        else+                        {+                            numDirectBits -= kNumAlignBits;+                            do+                            {+                                NORMALIZE_CHECK+                                range >>= 1;+                                code -= range & (((code - range) >> 31) - 1);+                                /* if (code >= range) code -= range; */+                            } while (--numDirectBits);+                            prob = probs + Align;+                            numDirectBits = kNumAlignBits;+                        }+                        {+                            unsigned i = 1;+                            unsigned m = 1;+                            do+                            {+                                REV_BIT_CHECK(prob, i, m);+                            } while (--numDirectBits);+                        }+                    }+                }+            }+            break;+        }+        NORMALIZE_CHECK;++        *bufOut = buf;+        return res;+    }++    void LzmaDec_InitDicAndState(CLzmaDec * p, BoolInt initDic, BoolInt initState);+    void LzmaDec_InitDicAndState(CLzmaDec * p, BoolInt initDic, BoolInt initState)+    {+        p->remainLen = kMatchSpecLenStart + 1;+        p->tempBufSize = 0;++        if (initDic)+        {+            p->processedPos = 0;+            p->checkDicSize = 0;+            p->remainLen = kMatchSpecLenStart + 2;+        }+        if (initState)+            p->remainLen = kMatchSpecLenStart + 2;+    }++    void LzmaDec_Init(CLzmaDec * p)+    {+        p->dicPos = 0;+        LzmaDec_InitDicAndState(p, True, True);+    }++    /*+    LZMA supports optional end_marker.+    So the decoder can lookahead for one additional LZMA-Symbol to check end_marker.+    That additional LZMA-Symbol can require up to LZMA_REQUIRED_INPUT_MAX bytes in input stream.+    When the decoder reaches dicLimit, it looks (finishMode) parameter:+      if (finishMode == LZMA_FINISH_ANY), the decoder doesn't lookahead+      if (finishMode != LZMA_FINISH_ANY), the decoder lookahead, if end_marker is possible for current position++    When the decoder lookahead, and the lookahead symbol is not end_marker, we have two ways:+      1) Strict mode (default) : the decoder returns SZ_ERROR_DATA.+      2) The relaxed mode (alternative mode) : we could return SZ_OK, and the caller+         must check (status) value. The caller can show the error,+         if the end of stream is expected, and the (status) is noit+         LZMA_STATUS_FINISHED_WITH_MARK or LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK.+    */++#define RETURN__NOT_FINISHED__FOR_FINISH \+    *status = LZMA_STATUS_NOT_FINISHED;  \+    return SZ_ERROR_DATA; // for strict mode+    // return SZ_OK; // for relaxed mode++    SRes LzmaDec_DecodeToDic(CLzmaDec * p, SizeT dicLimit, const Byte *src, SizeT *srcLen,+                             ELzmaFinishMode finishMode, ELzmaStatus *status)+    {+        SizeT inSize = *srcLen;+        (*srcLen) = 0;+        *status = LZMA_STATUS_NOT_SPECIFIED;++        if (p->remainLen > kMatchSpecLenStart)+        {+            if (p->remainLen > kMatchSpecLenStart + 2)+                return p->remainLen == kMatchSpecLen_Error_Fail ? SZ_ERROR_FAIL : SZ_ERROR_DATA;++            for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)+                p->tempBuf[p->tempBufSize++] = *src++;+            if (p->tempBufSize != 0 && p->tempBuf[0] != 0)+                return SZ_ERROR_DATA;+            if (p->tempBufSize < RC_INIT_SIZE)+            {+                *status = LZMA_STATUS_NEEDS_MORE_INPUT;+                return SZ_OK;+            }+            p->code =+                ((UInt32)p->tempBuf[1] << 24) | ((UInt32)p->tempBuf[2] << 16) | ((UInt32)p->tempBuf[3] << 8) | ((UInt32)p->tempBuf[4]);++            if (p->checkDicSize == 0 && p->processedPos == 0 && p->code >= kBadRepCode)+                return SZ_ERROR_DATA;++            p->range = 0xFFFFFFFF;+            p->tempBufSize = 0;++            if (p->remainLen > kMatchSpecLenStart + 1)+            {+                SizeT numProbs = LzmaProps_GetNumProbs(&p->prop);+                SizeT i;+                CLzmaProb *probs = p->probs;+                for (i = 0; i < numProbs; i++)+                    probs[i] = kBitModelTotal >> 1;+                p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;+                p->state = 0;+            }++            p->remainLen = 0;+        }++        for (;;)+        {+            if (p->remainLen == kMatchSpecLenStart)+            {+                if (p->code != 0)+                    return SZ_ERROR_DATA;+                *status = LZMA_STATUS_FINISHED_WITH_MARK;+                return SZ_OK;+            }++            LzmaDec_WriteRem(p, dicLimit);++            {+                // (p->remainLen == 0 || p->dicPos == dicLimit)++                int checkEndMarkNow = 0;++                if (p->dicPos >= dicLimit)+                {+                    if (p->remainLen == 0 && p->code == 0)+                    {+                        *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;+                        return SZ_OK;+                    }+                    if (finishMode == LZMA_FINISH_ANY)+                    {+                        *status = LZMA_STATUS_NOT_FINISHED;+                        return SZ_OK;+                    }+                    if (p->remainLen != 0)+                    {+                        RETURN__NOT_FINISHED__FOR_FINISH;+                    }+                    checkEndMarkNow = 1;+                }++                // (p->remainLen == 0)++                if (p->tempBufSize == 0)+                {+                    const Byte *bufLimit;+                    int dummyProcessed = -1;++                    if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)+                    {+                        const Byte *bufOut = src + inSize;++                        ELzmaDummy dummyRes = LzmaDec_TryDummy(p, src, &bufOut);++                        if (dummyRes == DUMMY_INPUT_EOF)+                        {+                            size_t i;+                            if (inSize >= LZMA_REQUIRED_INPUT_MAX)+                                break;+                            (*srcLen) += inSize;+                            p->tempBufSize = (unsigned)inSize;+                            for (i = 0; i < inSize; i++)+                                p->tempBuf[i] = src[i];+                            *status = LZMA_STATUS_NEEDS_MORE_INPUT;+                            return SZ_OK;+                        }++                        dummyProcessed = (int)(bufOut - src);+                        if ((unsigned)dummyProcessed > LZMA_REQUIRED_INPUT_MAX)+                            break;++                        if (checkEndMarkNow && !IS_DUMMY_END_MARKER_POSSIBLE(dummyRes))+                        {+                            unsigned i;+                            (*srcLen) += (unsigned)dummyProcessed;+                            p->tempBufSize = (unsigned)dummyProcessed;+                            for (i = 0; i < (unsigned)dummyProcessed; i++)+                                p->tempBuf[i] = src[i];+                            // p->remainLen = kMatchSpecLen_Error_Data;+                            RETURN__NOT_FINISHED__FOR_FINISH;+                        }++                        bufLimit = src;+                        // we will decode only one iteration+                    }+                    else+                        bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;++                    p->buf = src;++                    {+                        int res = LzmaDec_DecodeReal2(p, dicLimit, bufLimit);++                        SizeT processed = (SizeT)(p->buf - src);++                        if (dummyProcessed < 0)+                        {+                            if (processed > inSize)+                                break;+                        }+                        else if ((unsigned)dummyProcessed != processed)+                            break;++                        src += processed;+                        inSize -= processed;+                        (*srcLen) += processed;++                        if (res != SZ_OK)+                        {+                            p->remainLen = kMatchSpecLen_Error_Data;+                            return SZ_ERROR_DATA;+                        }+                    }+                    continue;+                }++                {+                    // we have some data in (p->tempBuf)+                    // in strict mode: tempBufSize is not enough for one Symbol decoding.+                    // in relaxed mode: tempBufSize not larger than required for one Symbol decoding.++                    unsigned rem = p->tempBufSize;+                    unsigned ahead = 0;+                    int dummyProcessed = -1;++                    while (rem < LZMA_REQUIRED_INPUT_MAX && ahead < inSize)+                        p->tempBuf[rem++] = src[ahead++];++                    // ahead - the size of new data copied from (src) to (p->tempBuf)+                    // rem   - the size of temp buffer including new data from (src)++                    if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)+                    {+                        const Byte *bufOut = p->tempBuf + rem;++                        ELzmaDummy dummyRes = LzmaDec_TryDummy(p, p->tempBuf, &bufOut);++                        if (dummyRes == DUMMY_INPUT_EOF)+                        {+                            if (rem >= LZMA_REQUIRED_INPUT_MAX)+                                break;+                            p->tempBufSize = rem;+                            (*srcLen) += (SizeT)ahead;+                            *status = LZMA_STATUS_NEEDS_MORE_INPUT;+                            return SZ_OK;+                        }++                        dummyProcessed = (int)(bufOut - p->tempBuf);++                        if ((unsigned)dummyProcessed < p->tempBufSize)+                            break;++                        if (checkEndMarkNow && !IS_DUMMY_END_MARKER_POSSIBLE(dummyRes))+                        {+                            (*srcLen) += (unsigned)dummyProcessed - p->tempBufSize;+                            p->tempBufSize = (unsigned)dummyProcessed;+                            // p->remainLen = kMatchSpecLen_Error_Data;+                            RETURN__NOT_FINISHED__FOR_FINISH;+                        }+                    }++                    p->buf = p->tempBuf;++                    {+                        // we decode one symbol from (p->tempBuf) here, so the (bufLimit) is equal to (p->buf)+                        int res = LzmaDec_DecodeReal2(p, dicLimit, p->buf);++                        SizeT processed = (SizeT)(p->buf - p->tempBuf);+                        rem = p->tempBufSize;++                        if (dummyProcessed < 0)+                        {+                            if (processed > LZMA_REQUIRED_INPUT_MAX)+                                break;+                            if (processed < rem)+                                break;+                        }+                        else if ((unsigned)dummyProcessed != processed)+                            break;++                        processed -= rem;++                        src += processed;+                        inSize -= processed;+                        (*srcLen) += processed;+                        p->tempBufSize = 0;++                        if (res != SZ_OK)+                        {+                            p->remainLen = kMatchSpecLen_Error_Data;+                            return SZ_ERROR_DATA;+                        }+                    }+                }+            }+        }++        /*  Some unexpected error: internal error of code, memory corruption or hardware failure */+        p->remainLen = kMatchSpecLen_Error_Fail;+        return SZ_ERROR_FAIL;+    }++    SRes LzmaDec_DecodeToBuf(CLzmaDec * p, Byte * dest, SizeT * destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)+    {+        SizeT outSize = *destLen;+        SizeT inSize = *srcLen;+        *srcLen = *destLen = 0;+        for (;;)+        {+            SizeT inSizeCur = inSize, outSizeCur, dicPos;+            ELzmaFinishMode curFinishMode;+            SRes res;+            if (p->dicPos == p->dicBufSize)+                p->dicPos = 0;+            dicPos = p->dicPos;+            if (outSize > p->dicBufSize - dicPos)+            {+                outSizeCur = p->dicBufSize;+                curFinishMode = LZMA_FINISH_ANY;+            }+            else+            {+                outSizeCur = dicPos + outSize;+                curFinishMode = finishMode;+            }++            res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);+            src += inSizeCur;+            inSize -= inSizeCur;+            *srcLen += inSizeCur;+            outSizeCur = p->dicPos - dicPos;+            memcpy(dest, p->dic + dicPos, outSizeCur);+            dest += outSizeCur;+            outSize -= outSizeCur;+            *destLen += outSizeCur;+            if (res != 0)+                return res;+            if (outSizeCur == 0 || outSize == 0)+                return SZ_OK;+        }+    }++    void LzmaDec_FreeProbs(CLzmaDec * p, ISzAllocPtr alloc)+    {+        ISzAlloc_Free(alloc, p->probs);+        p->probs = NULL;+    }++    static void LzmaDec_FreeDict(CLzmaDec * p, ISzAllocPtr alloc)+    {+        ISzAlloc_Free(alloc, p->dic);+        p->dic = NULL;+    }++    void LzmaDec_Free(CLzmaDec * p, ISzAllocPtr alloc)+    {+        LzmaDec_FreeProbs(p, alloc);+        LzmaDec_FreeDict(p, alloc);+    }++    SRes LzmaProps_Decode(CLzmaProps * p, const Byte *data, unsigned size)+    {+        UInt32 dicSize;+        Byte d;++        if (size < LZMA_PROPS_SIZE)+            return SZ_ERROR_UNSUPPORTED;+        else+            dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);++        if (dicSize < LZMA_DIC_MIN)+            dicSize = LZMA_DIC_MIN;+        p->dicSize = dicSize;++        d = data[0];+        if (d >= (9 * 5 * 5))+            return SZ_ERROR_UNSUPPORTED;++        p->lc = (Byte)(d % 9);+        d /= 9;+        p->pb = (Byte)(d / 5);+        p->lp = (Byte)(d % 5);++        return SZ_OK;+    }++    static SRes LzmaDec_AllocateProbs2(CLzmaDec * p, const CLzmaProps *propNew, ISzAllocPtr alloc)+    {+        UInt32 numProbs = LzmaProps_GetNumProbs(propNew);+        if (!p->probs || numProbs != p->numProbs)+        {+            LzmaDec_FreeProbs(p, alloc);+            p->probs = (CLzmaProb *)ISzAlloc_Alloc(alloc, numProbs * sizeof(CLzmaProb));+            if (!p->probs)+                return SZ_ERROR_MEM;+            p->probs_1664 = p->probs + 1664;+            p->numProbs = numProbs;+        }+        return SZ_OK;+    }++    SRes LzmaDec_AllocateProbs(CLzmaDec * p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc)+    {+        CLzmaProps propNew;+        RINOK(LzmaProps_Decode(&propNew, props, propsSize));+        RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));+        p->prop = propNew;+        return SZ_OK;+    }++    SRes LzmaDec_Allocate(CLzmaDec * p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc)+    {+        CLzmaProps propNew;+        SizeT dicBufSize;+        RINOK(LzmaProps_Decode(&propNew, props, propsSize));+        RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));++        {+            UInt32 dictSize = propNew.dicSize;+            SizeT mask = ((UInt32)1 << 12) - 1;+            if (dictSize >= ((UInt32)1 << 30))+                mask = ((UInt32)1 << 22) - 1;+            else if (dictSize >= ((UInt32)1 << 22))+                mask = ((UInt32)1 << 20) - 1;+            ;+            dicBufSize = ((SizeT)dictSize + mask) & ~mask;+            if (dicBufSize < dictSize)+                dicBufSize = dictSize;+        }++        if (!p->dic || dicBufSize != p->dicBufSize)+        {+            LzmaDec_FreeDict(p, alloc);+            p->dic = (Byte *)ISzAlloc_Alloc(alloc, dicBufSize);+            if (!p->dic)+            {+                LzmaDec_FreeProbs(p, alloc);+                return SZ_ERROR_MEM;+            }+        }+        p->dicBufSize = dicBufSize;+        p->prop = propNew;+        return SZ_OK;+    }++    SRes LzmaDecode(Byte * dest, SizeT * destLen, const Byte *src, SizeT *srcLen,+                    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,+                    ELzmaStatus *status, ISzAllocPtr alloc)+    {+        CLzmaDec p;+        SRes res;+        SizeT outSize = *destLen, inSize = *srcLen;+        *destLen = *srcLen = 0;+        *status = LZMA_STATUS_NOT_SPECIFIED;+        if (inSize < RC_INIT_SIZE)+            return SZ_ERROR_INPUT_EOF;+        LzmaDec_Construct(&p);+        RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc));+        p.dic = dest;+        p.dicBufSize = outSize;+        LzmaDec_Init(&p);+        *srcLen = inSize;+        res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);+        *destLen = p.dicPos;+        if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)+            res = SZ_ERROR_INPUT_EOF;+        LzmaDec_FreeProbs(&p, alloc);+        return res;+    }++    int lzma_uncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen)+    {+        ELzmaStatus status;+        *srcLen -= LZMA_HEADER_SIZE;+        return LzmaDecode(dest, destLen, &src[LZMA_HEADER_SIZE], srcLen, src, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &LZMA_ALLOC);+    }++#endif // LZMA_IMPLEMENTATION+#endif // _LZMA_H_
src/runtime/mhsffi.h view
@@ -1,3 +1,5 @@+#pragma once+ #include "config.h"  #include <inttypes.h>@@ -27,6 +29,8 @@ typedef struct node* NODEPTR; typedef void (*HsFunPtr)(void); +#define VALUE_MIN INTPTR_MIN+ typedef int from_t; typedef from_t (*funptr_t)(int); struct ffi_entry {@@ -45,8 +49,10 @@ 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_Int64(intptr_t, int, int64_t); from_t mhs_from_Word(intptr_t, int, uintptr_t); from_t mhs_from_Word8(intptr_t, int, uintptr_t);+from_t mhs_from_Word64(intptr_t, int, uint64_t); from_t mhs_from_Ptr(intptr_t, int, void *); from_t mhs_from_FunPtr(intptr_t, int, HsFunPtr); from_t mhs_from_CChar(intptr_t, int, char);@@ -70,8 +76,10 @@ flt64_t            mhs_to_Double(intptr_t, int); flt32_t            mhs_to_Float(intptr_t, int); intptr_t           mhs_to_Int(intptr_t, int);+int64_t            mhs_to_Int64(intptr_t, int); uintptr_t          mhs_to_Word(intptr_t, int); uint8_t            mhs_to_Word8(intptr_t, int);+uint64_t           mhs_to_Word64(intptr_t, int); void*              mhs_to_Ptr(intptr_t, int); HsFunPtr           mhs_to_FunPtr(intptr_t, int); char               mhs_to_CChar(intptr_t, int);
src/runtime/micro/config.h view
@@ -42,9 +42,16 @@  /*  * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Float type.+ */+#define WANT_FLOAT32 0++/*+ * 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_FLOAT 0+#define WANT_FLOAT64 0  /*  * Include <math.h>@@ -68,6 +75,11 @@ #define WANT_ARGS 0  /*+ * Environment+ */+#define WANT_ENV 0++/*  * Number of bits in a word.  Only 32 and 64 are supported.  */ //#define WORD_SIZE 64@@ -111,3 +123,5 @@ #define INTTABLE 0              /* use fixed table of small INT nodes */ #define SANITY   0              /* do some sanity checks */ #define STACKOVL 0              /* check for stack overflow */++#include <stdbool.h>
src/runtime/mingw/config.h view
@@ -10,9 +10,16 @@  /*  * 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_FLOAT 1+#define WANT_FLOAT64 0  /*  * Include <math.h>@@ -47,13 +54,13 @@  #include <inttypes.h> -static inline uint64_t clz(uint64_t x) {+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) {+static INLINE uint64_t ctz(uint64_t x) {   if (x == 0) return 64;   return __builtin_ctzll(x); }
src/runtime/stm32f4/config.h view
@@ -10,9 +10,16 @@  /*  * 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_FLOAT 1+#define WANT_FLOAT64 0  /*  * Include <math.h>
src/runtime/unix/config.h view
@@ -80,6 +80,21 @@ #define WANT_ERRNO 1  /*+ * overflow detection in arithmetic+ */+#define WANT_OVERFLOW 1++/*+ * Enable non-blocking IO polling.+ */+#define WANT_IO_POLL 1++/*+ * Include socket() & co+ */+#define WANT_SOCKET 1++/*  * Use CPU counters.  * Only available on:  *  - MacOS with M4 CPU@@ -122,6 +137,7 @@ #include <stdio.h> #include <locale.h> #include <limits.h>+#include <stdbool.h>  #if defined(__APPLE__) && defined(__MACH__)   // any Darwin (macOS, iOS, tvOS, watchOS)   #include <TargetConditionals.h>
src/runtime/unix/extra.c view
@@ -27,7 +27,81 @@ #endif  /* if defined(...) */ #endif  /* INTPTR_MAX == 0x7fffffff */ +#if defined(USE_WEB_INPUT)+#include <emscripten.h> /*+ * When using mhs interactively on the web, we need a special input routine.+ */++/* A circular buffer.  The characters can arrive quicker than getraw consumes them.+ * This happens both for cursore keys and pasting.+ * We don't check for buffer overflow.+ */+#define IN_BUF_SIZE 16384+volatile int getraw_last_chars[IN_BUF_SIZE];+volatile int getraw_last_char_in = 0;+volatile int getraw_last_char_out = 0;+volatile int getraw_waiting = 0;++void handle_sigint(int);++/* JavaScript pushes the input character by calling this function */+EMSCRIPTEN_KEEPALIVE+void set_input_char(int c) {+  if (!getraw_waiting && c == 3) { /* CTRL-C */+    handle_sigint(0);+  }+  getraw_last_chars[getraw_last_char_in] = c;+  getraw_last_char_in = (getraw_last_char_in + 1) % IN_BUF_SIZE;+}++static int+getraw(void)+{+  getraw_waiting = 1;+  for(;;) {+    /* Busy-wait for a character to appear */+    if (getraw_last_char_in != getraw_last_char_out) {+      int ch = getraw_last_chars[getraw_last_char_out];+      getraw_last_char_out = (getraw_last_char_out + 1) % IN_BUF_SIZE;++      getraw_waiting = 0;+      return ch;+    }+    emscripten_sleep(10);+  }+}++/* While we are drawing we don't want to emscripten_sleep(),+ * because that may yield inside the renering loop and can+ * cause a premature transfer of the drawing buffer and flickering.+ */+int is_drawing = 0;++void c_begin_draw(void) {+    is_drawing = 1;+}++void c_end_draw(void) {+    is_drawing = 0;+}++/* Allow a thread switch in yield() */+#define YIELD_EXTRA do { if (!is_drawing) emscripten_sleep(0); } while(0)++// Create a C function called c_waitForFrame+// that executes the JavaScript inside the block.+EM_ASYNC_JS(void, c_waitForFrame, (), {+    return new Promise(function(resolve) {+        requestAnimationFrame(function() {+            resolve();+        });+    });+});++#else  /* USE_WEB_INPUT */++/*  * Set the terminal in raw mode and read a single character.  * Return this character, or -1 on any kind of failure.  */@@ -35,7 +109,7 @@ getraw(void) {   struct termios old, new;-  char c;+  unsigned char c;   int r;  #if defined(USE_SYSTEM_RAW)@@ -85,6 +159,8 @@     return -1;   } }+#endif  /* USE_WEB_INPUT */+ /*  * Get a raw input character.  * If undefined, the default always returns -1@@ -155,7 +231,7 @@ { #if WANT_TIME   struct timespec ts;-  +   if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) == 0) {     *sec = ts.tv_sec;     *nsec = ts.tv_nsec;@@ -182,3 +258,118 @@ #endif  /* apple-arm */  #endif  /* WANT_KPERF */++#include <stdlib.h>++#if defined(__linux__)+#include <unistd.h>+#include <limits.h>+#elif defined(__APPLE__) && defined(__MACH__)+#include <mach-o/dyld.h>+#include <limits.h>+#endif++/* Return path to executable as a null-terminated UTF-8 string. */+char*+get_executable_path(void)+{+#if defined(__linux__)+    return realpath("/proc/self/exe", NULL);++#elif defined(__APPLE__) && defined(__MACH__)+    uint32_t size = 0;+    _NSGetExecutablePath(NULL, &size);+    char *buf = malloc(size);+    if (!buf)+      return NULL;++    if (_NSGetExecutablePath(buf, &size) == 0) {+        char *canonical = realpath(buf, NULL);+        free(buf);+        return canonical;+    }+    free(buf);+    return NULL;++#else  /* Unsupported */+    return NULL;+#endif+}+#define GET_EXECUTABLE_PATH get_executable_path++#if defined(WANT_DIR)+#include <sys/stat.h>+#include <sys/types.h>+#include <unistd.h>+#include <fcntl.h>+#include <dirent.h>++/* Encoding shared with the Haskell side */+#define PERM_SEARCH 8+#define PERM_READ   4+#define PERM_WRITE  2+#define PERM_EXEC   1++int+get_permissions(const char *path)+{+  struct stat st;+  int perms = 0;++  if (stat(path, &st) == -1) {+    return -1;+  }++  if (st.st_mode & S_IRUSR)+    perms |= PERM_READ;+  if (st.st_mode & S_IWUSR)+    perms |= PERM_WRITE;+  if (st.st_mode & S_IXUSR) {+    if (S_ISDIR(st.st_mode)) {+      perms |= PERM_SEARCH;+    } else {+      perms |= PERM_EXEC;+    }+  }++  return perms;+}++int+set_permissions(const char *path, int perms)+{+  struct stat st;+  mode_t uperms;+  mode_t mask;+  int result;++  int fd = open(path, O_RDONLY | O_NONBLOCK);+  if (fd == -1) {+    return -1;+  }++  if (fstat(fd, &st) == -1) {+    close(fd);+    return -1;+  }++  uperms = 0;+  if (perms & PERM_READ)+    uperms |= S_IRUSR;+  if (perms & PERM_WRITE)+    uperms |= S_IWUSR;+  if ((perms & PERM_EXEC) || (perms & PERM_SEARCH)) {+    uperms |= S_IXUSR;+  }+  uperms |= (uperms >> 3) | (uperms >> 6); /* copy user permissions to all field */+  mask = umask(0);                         /* grab current umask */+  umask(mask);+  uperms &= ~mask;                         /* mask new permission according to umask */++  uperms |= st.st_mode & ~0777;            /* copy other mode bits */+  result = fchmod(fd, uperms);++  close(fd);+  return result;+}+#endif  /* WANT_DIR */
src/runtime/windows/config.h view
@@ -49,11 +49,67 @@ #define WANT_TICK 1  /*+ * Include directory manipulation+ */+#define WANT_DIR 1++/*  * This is Windows  */ #define ISWINDOWS 1 -#include <inttypes.h>+#if defined(_MSC_VER) && (_MSC_VER < 1800)+    /* Fix missing inttypes.h */+    #if _MSC_VER >= 1600+        #include <stdint.h>+    #else  /* _MSC_VER >= 1600 */+        typedef signed char        int8_t;+        typedef short              int16_t;+        typedef int                int32_t;+        typedef __int64            int64_t;+        typedef unsigned char      uint8_t;+        typedef unsigned short     uint16_t;+        typedef unsigned int       uint32_t;+        typedef unsigned __int64   uint64_t;+        #ifdef _WIN64+            typedef __int64        intptr_t;+            typedef unsigned __int64 uintptr_t;+        #else  /* _WIN64 */+            typedef int            intptr_t;+            typedef unsigned int   uintptr_t;+        #endif  /* _WIN64 */+    #endif  /* _MSC_VER >= 1600 */++    /* Fix missing stdbool.h */+    typedef unsigned char bool;+    #define true  1+    #define false 0++    /* Fix missing inttypes.h PRI macros */+    #define PRId64 "I64d"+    #define PRIu64 "I64u"+    #define PRIx64 "I64x"++    #ifdef _WIN64+        #define PRIdPTR "I64d"+        #define PRIuPTR "I64u"+        #define PRIxPTR "I64x"+    #else  /* _WIN64 */+        #define PRIdPTR "d"+        #define PRIuPTR "u"+        #define PRIxPTR "x"+    #endif  /* _WIN64 */++#else  /* defined(_MSC_VER) && (_MSC_VER < 1800) */+    /* Modern Compiler (VS 2013+, GCC, Clang) */+    #include <stdbool.h>+    #include <inttypes.h>+#endif  /* defined(_MSC_VER) && (_MSC_VER < 1800) */++#if defined(_MSC_VER) && _MSC_VER < 1900+    #define snprintf _snprintf+#endif+ #define WIN32_LEAN_AND_MEAN #include <Windows.h> #include <intrin.h>@@ -65,9 +121,15 @@ #include <fcntl.h> #include <sys/stat.h> +#include <direct.h>+#define getcwd _getcwd+ /* Make these empty */ #define NORETURN #define PACKED++/* This is a safe way to inline */+#define INLINE __inline  /*  * The ERR macro should report an error and exit.
src/runtime/windows/extra.c view
@@ -3,6 +3,9 @@  */ #include <conio.h> #include <io.h>+#include <stdlib.h>+#include <windows.h>+#include <string.h>  /*  * Find First Set@@ -11,9 +14,10 @@  * Numberings starts from 1.  If no bit is set, it should return 0.  */ //#pragma warning(disable : 4996)+#if defined(_M_X64) || defined(_M_ARM64) #pragma intrinsic(_BitScanForward64) #pragma intrinsic(_BitScanReverse64)-static inline int+static INLINE int ffs(int64_t arg) {   unsigned long r;@@ -30,7 +34,7 @@ #define POPCOUNT __popcnt #endif -static inline uint64_t clz(uint64_t x) {+static INLINE uint64_t clz(uint64_t x) {   unsigned long count;   if (_BitScanReverse64(&count, x)) {     return 63 - (uint64_t)count;@@ -40,7 +44,7 @@ } #define CLZ clz -static inline uint64_t ctz(uint64_t x) {+static INLINE uint64_t ctz(uint64_t x) {   unsigned long count;   if (_BitScanForward64(&count, x)) {     return (uint64_t)count;@@ -49,6 +53,7 @@   } } #define CTZ ctz+#endif  /* #if defined(_M_X64) || defined(_M_ARM64) */  /*  * This is the character used for comma-separation in printf.@@ -154,3 +159,188 @@   return filename; } #define TMPNAME tmpname++/* Return path to executable as a null-terminated UTF-8 string. */+char*+get_executable_path(void)+{+    DWORD size = MAX_PATH;+    WCHAR *wbuf = malloc(size * sizeof(WCHAR));+    if (!wbuf) return NULL;++    DWORD len = GetModuleFileNameW(NULL, wbuf, size);+    while (len == size && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {+        size *= 2;+        WCHAR *new_buf = realloc(wbuf, size * sizeof(WCHAR));+        if (!new_buf) { free(wbuf); return NULL; }+        wbuf = new_buf;+        len = GetModuleFileNameW(NULL, wbuf, size);+    }++    int utf8_len = WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, NULL, 0, NULL, NULL);+    char *utf8_buf = malloc(utf8_len);+    if (utf8_buf) {+        WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, utf8_buf, utf8_len, NULL, NULL);+    }+    free(wbuf);+    return utf8_buf;+}+#define GET_EXECUTABLE_PATH get_executable_path++/* Emulate directory functions, partially written by Gemini */++struct dirent {+  char d_name[MAX_PATH * 3];+};++typedef struct {+  HANDLE hFind;+  WIN32_FIND_DATAW findData;+  struct dirent entry;+  int first;+} DIR;++DIR*+opendir(const char *path)+{+  DIR *d = (DIR*)malloc(sizeof(DIR));+  if (!d)+    return NULL;++  WCHAR wpath[MAX_PATH];+  MultiByteToWideChar(CP_UTF8, 0, path, -1, wpath, MAX_PATH);+  wcscat_s(wpath, MAX_PATH, L"\\*");++  d->hFind = FindFirstFileW(wpath, &d->findData);+  if (d->hFind == INVALID_HANDLE_VALUE) {+    free(d);+    return NULL;+  }+  d->first = 1;+  return d;+}++struct dirent*+readdir(DIR *d)+{+  if (d->hFind == INVALID_HANDLE_VALUE)+    return NULL;++  if (d->first) {+    d->first = 0;+  } else {+    if (!FindNextFileW(d->hFind, &d->findData))+      return NULL;+  }++  WideCharToMultiByte(CP_UTF8, 0, d->findData.cFileName, -1, +                      d->entry.d_name, sizeof(d->entry.d_name), NULL, NULL);+  return &d->entry;+}++int+closedir(DIR *d)+{+  if (!d)+    return -1;+  if (d->hFind != INVALID_HANDLE_VALUE)+    FindClose(d->hFind);+  free(d);+  return 0;+}++#define MKDIR(s, m) mkdir(s)++int+setenv(const char *name, const char *value, int overwrite)+{+  // POSIX specifies that if name is NULL, points to an empty string, +  // or contains an '=', the function should fail with EINVAL.+  if (name == NULL || name[0] == '\0' || strchr(name, '=') != NULL) {+    errno = EINVAL;+    return -1;+  }++  // If overwrite is 0, we must check if the variable already exists.+  // If it does, we successfully do nothing.+  if (overwrite == 0 && getenv(name) != NULL) {+    return 0; +  }++  // _putenv_s returns 0 on success, and an error code on failure.+  if (_putenv_s(name, value) != 0) {+    // _putenv_s sets its own error codes, but we return -1 to match POSIX+    return -1; +  }++  return 0;+}++int+unsetenv(const char *name)+{+  // Standard POSIX validation for the name+  if (name == NULL || name[0] == '\0' || strchr(name, '=') != NULL) {+    errno = EINVAL;+    return -1;+  }++  // In the Windows C Runtime, setting a variable to an empty string ("") +  // effectively deletes it from the environment.+  if (_putenv_s(name, "") != 0) {+    return -1;+  }++  return 0;+}+++#if defined(WANT_DIR)+#include <sys/stat.h>+#include <sys/types.h>+#include <io.h>++#define PERM_SEARCH 8+#define PERM_READ   4+#define PERM_WRITE  2+#define PERM_EXEC   1++int+get_permissions(const char *path)+{+  struct _stat st;+  int perms = 0;+    +  if (_stat(path, &st) == -1) {+    return -1;+  }++  if (st.st_mode & _S_IREAD)+    perms |= PERM_READ;+  if (st.st_mode & _S_IWRITE)+    perms |= PERM_WRITE;+  if (st.st_mode & _S_IFDIR) {+    perms |= PERM_SEARCH; +  } else {+    if (st.st_mode & _S_IEXEC) {+      perms |= PERM_EXEC; +    }+  }+  return perms;+}++int+set_permissions(const char *path, int perms)+{+  int wperms = 0;+    +  if (perms & PERM_READ)+    wperms |= _S_IREAD;+  if (perms & PERM_WRITE)+    wperms |= _S_IWRITE;+  if ((perms & PERM_EXEC) || (perms & PERM_SEARCH))+    wperms |= _S_IEXEC;++  return _chmod(path, wperms);+}+#endif  /* defined(WANT_DIR) */
+ src/runtime/windows/posix_emul.c view
@@ -0,0 +1,398 @@+#include <windows.h>+#include <winsock2.h>+#include <io.h>+#include <fcntl.h>+#include <stdio.h>+#include <errno.h>+#include <stdint.h>++typedef int posix_fd_t;+typedef int32_t ssize_t;+typedef size_t nfds_t;++#ifndef STDIN_FILENO+#define STDIN_FILENO  0+#define STDOUT_FILENO 1+#define STDERR_FILENO 2+#endif++#ifndef O_ACCMODE+#define O_ACCMODE 3+#endif++#define MAX_FD 1024++typedef enum {+    FD_FREE = 0,+    FD_CONSOLE,+    FD_FILE,+    FD_SOCKET,+    FD_PIPE+} fd_type_t;++typedef struct {+    fd_type_t type;+    HANDLE os_handle;     +    SOCKET os_sock;       +    WSAEVENT os_event;    +    long pending_events;  +} fd_entry_t;++static fd_entry_t fd_table[MAX_FD] = {0};+static int initialized = 0; ++void uni_init(void) {+    if (initialized) return;++    WSADATA wsa;+    WSAStartup(MAKEWORD(2, 2), &wsa);++    fd_table[STDIN_FILENO]  = (fd_entry_t){FD_CONSOLE, GetStdHandle(STD_INPUT_HANDLE),  INVALID_SOCKET, WSA_INVALID_EVENT, 0};+    fd_table[STDOUT_FILENO] = (fd_entry_t){FD_CONSOLE, GetStdHandle(STD_OUTPUT_HANDLE), INVALID_SOCKET, WSA_INVALID_EVENT, 0};+    fd_table[STDERR_FILENO] = (fd_entry_t){FD_CONSOLE, GetStdHandle(STD_ERROR_HANDLE),  INVALID_SOCKET, WSA_INVALID_EVENT, 0};++    initialized = 1;+}++static int alloc_fd(fd_type_t type) {+    for (int i = 3; i < MAX_FD; i++) {+        if (fd_table[i].type == FD_FREE) {+            fd_table[i].type = type;+            fd_table[i].os_handle = INVALID_HANDLE_VALUE;+            fd_table[i].os_sock = INVALID_SOCKET;+            fd_table[i].os_event = WSA_INVALID_EVENT;+            fd_table[i].pending_events = 0;+            return i;+        }+    }+    return -1;+}++posix_fd_t uni_open(const char *pathname, int flags, ...) {+    DWORD access = GENERIC_READ;+    if ((flags & O_ACCMODE) == O_WRONLY) access = GENERIC_WRITE;+    else if ((flags & O_ACCMODE) == O_RDWR) access = GENERIC_READ | GENERIC_WRITE;+    +    DWORD creation = (flags & O_CREAT) ? OPEN_ALWAYS : OPEN_EXISTING;+    +    HANDLE h = CreateFileA(pathname, access, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, +                           creation, FILE_ATTRIBUTE_NORMAL, NULL);+    if (h == INVALID_HANDLE_VALUE) return -1;++    int fd = alloc_fd(FD_FILE);+    if (fd < 0) {+        CloseHandle(h);+        return -1;+    }+    fd_table[fd].os_handle = h;+    return fd;+}++int uni_pipe(posix_fd_t pipefd[2]) {+    static volatile long pipe_counter = 0;+    char pipe_name[128];+    sprintf(pipe_name, "\\\\.\\pipe\\uni_pipe_%08lx_%08lx", GetCurrentProcessId(), InterlockedIncrement(&pipe_counter));++    // Ensure pipes can be inherited by child processes (standard POSIX behavior)+    SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };++    HANDLE r_handle = CreateNamedPipeA(+        pipe_name, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,+        PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,+        1, 4096, 4096, 0, &sa+    );+    if (r_handle == INVALID_HANDLE_VALUE) return -1;++    HANDLE w_handle = CreateFileA(+        pipe_name, GENERIC_WRITE, 0, &sa, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL+    );+    if (w_handle == INVALID_HANDLE_VALUE) {+        CloseHandle(r_handle);+        return -1;+    }++    OVERLAPPED ov = {0};+    ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);+    if (!ConnectNamedPipe(r_handle, &ov)) {+        DWORD err = GetLastError();+        if (err == ERROR_IO_PENDING) {+            DWORD dummy;+            GetOverlappedResult(r_handle, &ov, &dummy, TRUE); +        }+    }+    CloseHandle(ov.hEvent);++    int fd_r = alloc_fd(FD_PIPE);+    int fd_w = alloc_fd(FD_PIPE);+    if (fd_r < 0 || fd_w < 0) {+        if (fd_r >= 0) fd_table[fd_r].type = FD_FREE;+        if (fd_w >= 0) fd_table[fd_w].type = FD_FREE;+        CloseHandle(r_handle);+        CloseHandle(w_handle);+        return -1;+    }++    fd_table[fd_r].os_handle = r_handle;+    fd_table[fd_w].os_handle = w_handle;++    pipefd[0] = fd_r;+    pipefd[1] = fd_w;+    return 0;+}++posix_fd_t uni_socket(int domain, int type, int protocol) {+    SOCKET s = socket(domain, type, protocol);+    if (s == INVALID_SOCKET) return -1;++    int fd = alloc_fd(FD_SOCKET);+    if (fd < 0) {+        closesocket(s);+        return -1;+    }+    +    fd_table[fd].os_sock = s;+    fd_table[fd].os_event = WSACreateEvent();+    fd_table[fd].pending_events = FD_WRITE; ++    WSAEventSelect(s, fd_table[fd].os_event, FD_READ | FD_WRITE | FD_ACCEPT | FD_CLOSE | FD_CONNECT);+    return fd;+}++posix_fd_t uni_accept(posix_fd_t sockfd, struct sockaddr *addr, socklen_t *addrlen) {+    if (sockfd < 0 || sockfd >= MAX_FD || fd_table[sockfd].type != FD_SOCKET) return -1;++    SOCKET client_s = accept(fd_table[sockfd].os_sock, addr, addrlen);+    if (client_s == INVALID_SOCKET) {+        if (WSAGetLastError() == WSAEWOULDBLOCK) errno = EAGAIN;+        return -1;+    }++    int fd = alloc_fd(FD_SOCKET);+    if (fd < 0) {+        closesocket(client_s);+        return -1;+    }+    +    fd_table[fd].os_sock = client_s;+    fd_table[fd].os_event = WSACreateEvent();+    fd_table[fd].pending_events = FD_WRITE;++    WSAEventSelect(client_s, fd_table[fd].os_event, FD_READ | FD_WRITE | FD_ACCEPT | FD_CLOSE | FD_CONNECT);+    return fd;+}++int uni_connect(posix_fd_t sockfd, const struct sockaddr *addr, socklen_t addrlen) {+    if (sockfd < 0 || sockfd >= MAX_FD || fd_table[sockfd].type != FD_SOCKET) return -1;+    int ret = connect(fd_table[sockfd].os_sock, addr, (int)addrlen);+    if (ret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) {+        errno = EINPROGRESS;+    }+    return ret;+}++int uni_close(posix_fd_t fd) {+    if (fd < 0 || fd >= MAX_FD) return -1;+    +    int ret = 0;+    if (fd_table[fd].type == FD_FILE || fd_table[fd].type == FD_CONSOLE || fd_table[fd].type == FD_PIPE) {+        ret = CloseHandle(fd_table[fd].os_handle) ? 0 : -1;+    } else if (fd_table[fd].type == FD_SOCKET) {+        WSAEventSelect(fd_table[fd].os_sock, NULL, 0);+        WSACloseEvent(fd_table[fd].os_event);+        ret = closesocket(fd_table[fd].os_sock);+    }+    fd_table[fd].type = FD_FREE;+    return ret;+}++ssize_t uni_read(posix_fd_t fd, void *buf, size_t count) {+    if (fd < 0 || fd >= MAX_FD) return -1;++    if (fd_table[fd].type == FD_SOCKET) {+        int ret = recv(fd_table[fd].os_sock, buf, (int)count, 0);+        if (ret == SOCKET_ERROR) {+            if (WSAGetLastError() == WSAEWOULDBLOCK) {+                fd_table[fd].pending_events &= ~(FD_READ | FD_ACCEPT);+                errno = EAGAIN;+            }+            return -1;+        }+        return ret;+    } else if (fd_table[fd].type == FD_PIPE) {+        DWORD avail = 0;+        if (!PeekNamedPipe(fd_table[fd].os_handle, NULL, 0, NULL, &avail, NULL)) {+            if (GetLastError() == ERROR_BROKEN_PIPE) return 0; +            errno = EIO; return -1;+        }+        if (avail == 0) {+            errno = EAGAIN;+            return -1;+        }++        OVERLAPPED ov = {0};+        DWORD read_bytes = 0;+        if (!ReadFile(fd_table[fd].os_handle, buf, (DWORD)count, &read_bytes, &ov)) {+            if (GetLastError() == ERROR_IO_PENDING) {+                // Safely cancel and wait if the read unexpectedly blocks+                if (!GetOverlappedResult(fd_table[fd].os_handle, &ov, &read_bytes, FALSE)) {+                    if (GetLastError() == ERROR_IO_INCOMPLETE) {+                        CancelIoEx(fd_table[fd].os_handle, &ov);+                        GetOverlappedResult(fd_table[fd].os_handle, &ov, &read_bytes, TRUE);+                        errno = EAGAIN;+                        return -1;+                    }+                }+            } else {+                return -1;+            }+        }+        return (ssize_t)read_bytes;+    } else {+        DWORD read_bytes = 0;+        if (!ReadFile(fd_table[fd].os_handle, buf, (DWORD)count, &read_bytes, NULL)) return -1;+        return (ssize_t)read_bytes;+    }+}++ssize_t uni_write(posix_fd_t fd, const void *buf, size_t count) {+    if (fd < 0 || fd >= MAX_FD) return -1;++    if (fd_table[fd].type == FD_SOCKET) {+        int ret = send(fd_table[fd].os_sock, buf, (int)count, 0);+        if (ret == SOCKET_ERROR) {+            if (WSAGetLastError() == WSAEWOULDBLOCK) {+                fd_table[fd].pending_events &= ~FD_WRITE;+                errno = EAGAIN;+            }+            return -1;+        }+        return ret;+    } else if (fd_table[fd].type == FD_PIPE) {+        OVERLAPPED ov = {0};+        DWORD written_bytes = 0;+        if (!WriteFile(fd_table[fd].os_handle, buf, (DWORD)count, &written_bytes, &ov)) {+            if (GetLastError() == ERROR_IO_PENDING) {+                if (!GetOverlappedResult(fd_table[fd].os_handle, &ov, &written_bytes, FALSE)) {+                    if (GetLastError() == ERROR_IO_INCOMPLETE) {+                        CancelIoEx(fd_table[fd].os_handle, &ov);+                        GetOverlappedResult(fd_table[fd].os_handle, &ov, &written_bytes, TRUE);+                        errno = EAGAIN;+                        return -1;+                    }+                }+            } else {+                return -1;+            }+        }+        return (ssize_t)written_bytes;+    } else {+        DWORD written_bytes = 0;+        if (!WriteFile(fd_table[fd].os_handle, buf, (DWORD)count, &written_bytes, NULL)) return -1;+        return (ssize_t)written_bytes;+    }+}++int uni_poll(struct pollfd *fds, nfds_t nfds, int timeout) {+    if (nfds <= 0 || nfds > MAXIMUM_WAIT_OBJECTS) return -1;++    ULONGLONG start_time = GetTickCount64();+    DWORD dw_timeout = (timeout < 0) ? INFINITE : (DWORD)timeout;++    while (1) {+        int active_count = 0;+        HANDLE socket_events[MAXIMUM_WAIT_OBJECTS];+        DWORD socket_count = 0;++        for (nfds_t i = 0; i < nfds; i++) {+            int fd = fds[i].fd;+            if (fd < 0) {+                fds[i].revents = 0;+                continue;+            }+            +            if (fd >= MAX_FD || fd_table[fd].type == FD_FREE) {+                fds[i].revents = POLLNVAL;+                continue;+            }++            if (fd_table[fd].type == FD_SOCKET) {+                WSANETWORKEVENTS net_events;+                if (WSAEnumNetworkEvents(fd_table[fd].os_sock, fd_table[fd].os_event, &net_events) == 0) {+                    fd_table[fd].pending_events |= net_events.lNetworkEvents;+                }+                if (socket_count < MAXIMUM_WAIT_OBJECTS) {+                    socket_events[socket_count++] = fd_table[fd].os_event;+                }+            }+        }++        for (nfds_t i = 0; i < nfds; i++) {+            int fd = fds[i].fd;+            if (fd < 0 || fd >= MAX_FD || fd_table[fd].type == FD_FREE) continue;++            fds[i].revents = 0;++            if (fd_table[fd].type == FD_SOCKET) {+                long evs = fd_table[fd].pending_events;+                if ((fds[i].events & POLLIN) && (evs & (FD_READ | FD_ACCEPT | FD_CLOSE))) fds[i].revents |= POLLIN;+                if ((fds[i].events & POLLOUT) && (evs & (FD_WRITE | FD_CONNECT))) fds[i].revents |= POLLOUT;+                if (evs & FD_CLOSE) fds[i].revents |= POLLHUP;+            } +            else if (fd_table[fd].type == FD_PIPE) {+                DWORD avail = 0;+                if (!PeekNamedPipe(fd_table[fd].os_handle, NULL, 0, NULL, &avail, NULL)) {+                    DWORD err = GetLastError();+                    if (err == ERROR_BROKEN_PIPE || err == ERROR_PIPE_NOT_CONNECTED) {+                        fds[i].revents |= POLLHUP;+                    }+                } else {+                    if ((fds[i].events & POLLIN) && avail > 0) fds[i].revents |= POLLIN;+                    if (fds[i].events & POLLOUT) fds[i].revents |= POLLOUT;+                }+            } +            else if (fd_table[fd].type == FD_CONSOLE) {+                if (fd == STDIN_FILENO) {+                    DWORD events = 0;+                    GetNumberOfConsoleInputEvents(fd_table[fd].os_handle, &events);+                    if (events > 0) {+                        // Filter out mouse/focus events to prevent thread blocking on read()+                        INPUT_RECORD ir[128];+                        DWORD read_ir = 0;+                        if (PeekConsoleInput(fd_table[fd].os_handle, ir, 128, &read_ir)) {+                            for (DWORD k = 0; k < read_ir; k++) {+                                if (ir[k].EventType == KEY_EVENT && ir[k].Event.KeyEvent.bKeyDown) {+                                    if (fds[i].events & POLLIN) fds[i].revents |= POLLIN;+                                    break;+                                }+                            }+                        }+                    }+                } else {+                    if (fds[i].events & POLLOUT) fds[i].revents |= POLLOUT;+                }+            } +            else if (fd_table[fd].type == FD_FILE) {+                if (fds[i].events & POLLIN)  fds[i].revents |= POLLIN;+                if (fds[i].events & POLLOUT) fds[i].revents |= POLLOUT;+            }++            if (fds[i].revents) active_count++;+        }++        if (active_count > 0 || dw_timeout == 0) return active_count;++        if (dw_timeout != INFINITE) {+            ULONGLONG elapsed = GetTickCount64() - start_time;+            if (elapsed >= dw_timeout) return 0; +            dw_timeout -= (DWORD)elapsed;+            start_time = GetTickCount64();+        }++        if (socket_count > 0) {+            DWORD chunk = (dw_timeout == INFINITE) ? 10 : (dw_timeout < 10 ? dw_timeout : 10);+            WaitForMultipleObjects(socket_count, socket_events, FALSE, chunk);+        } else {+            Sleep(1);+        }+    }+}
− targets.conf
@@ -1,37 +0,0 @@-[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/BSCompress.hs view
@@ -0,0 +1,15 @@+module BSCompress where+import System.IO.Serialize+import qualified Data.ByteString as BS++someText :: String+someText = unlines $ replicate 10 "hello, cruel world!"++main :: IO ()+main = do+  print $ length someText  -- force evaluation+  bs <- writeSerializedCompressedBS someText+  print bs+  print (BS.length bs)+  txt <- readSerializedBS bs+  print $ someText == txt
tests/Builder.hs view
@@ -12,19 +12,19 @@     <> byteString (B.pack [32..64])     <> lazyByteString (L.pack [65..126])     <> shortByteString (S.pack [0xff, 0xfe])-    <> int8 0xf0+    <> int8 0x70     <> word8 0xf0-    <> int16BE 0xf063-    <> int32BE 0xf063481a-    <> int64BE 0xf063481acbd25901+    <> int16BE 0x7063+    <> int32BE 0x7063481a+    <> int64BE 0x7063481acbd25901     <> word16BE 0x63f0     <> word32BE 0x1a4863f0     <> word64BE 0x0159d2cb1a4863f0     <> floatBE (sqrt 2)     <> doubleBE (sqrt 2)-    <> int16LE 0xf063-    <> int32LE 0xf063481a-    <> int64LE 0xf063481acbd25901+    <> int16LE 0x7063+    <> int32LE 0x7063481a+    <> int64LE 0x7063481acbd25901     <> word16LE 0x63f0     <> word32LE 0x1a4863f0     <> word64LE 0x0159d2cb1a4863f0
tests/Builder.ref view
@@ -1,1 +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"+" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\255\254p\240pcpcH\SUBpcH\SUB\203\210Y\SOHc\240\SUBHc\240\SOHY\210\203\SUBHc\240?\181\EOT\243?\246\160\158f\DEL;\205cp\SUBHcp\SOHY\210\203\SUBHcp\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/Class.hs view
@@ -35,6 +35,21 @@ h :: forall a b . (Eqq a, Eqq b) => a -> b -> Bool h a b = a === a && b === b +class A a b where+  a :: a -> b++class (A a a, A a a) => B1 a where+  b :: a -> a+  -- Multiple solutions+  b = a++class A a b => B a b+class A a b => C a b+class (B a b, C a b) => D a b where+  d :: a -> b+  -- Multiple solutions+  d = a+ main :: IO () main = do   print $ f (5::Int)
tests/Concur.hs view
@@ -7,7 +7,7 @@ -- (32 vs 64 bit, with or without GMP).  delay :: Int -> IO ()-delay i = loop i `seq` return ()+delay i = loop (i*100) `seq` return ()  loop :: Int -> Int loop i = if i == (0::Int) then (0::Int) else loop (i - (1::Int))
tests/Concur.ref view
@@ -2,5 +2,5 @@ thread ThreadId#1: "a" thread ThreadId#2: "b" thread ThreadId#3: "c"-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc done
tests/DataData.hs view
@@ -5,6 +5,9 @@ data T a = C0 | C1 a | C2 Int a | C3 { x,y,z :: a } | Int `C4` Int   deriving (Data, Show) +newtype TT a b = TT a+  deriving (Data, Show)+ showConstr' :: Constr -> String showConstr' c =   "Constr { conrep=" ++ show (constrRep c)@@ -30,3 +33,4 @@   print (arity (C4 1 2 :: T ()))   let AlgRep cs = dataTypeRep (dataTypeOf (C1 ()))   mapM_ (putStrLn . showConstr') cs+  print $ dataTypeOf (TT () :: TT () Char)
tests/DataData.ref view
@@ -7,3 +7,4 @@ 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+DataType {tycon = "DataData.TT", datarep = AlgRep [TT]}
tests/Deriving.hs view
@@ -70,6 +70,22 @@  newtype Op = (:::) () deriving (Read, Show) +class MonadError e m++data AA = AA Int | AA1 deriving anyclass (MonadError e)+newtype AB = AB Int deriving (MonadError e)++newtype NT1 a b = NT1 b deriving (Ord)++instance (Num a, Enum b) => Eq (NT1 a b) where+  NT1 b == NT1 b'  =  fromEnum b == fromEnum b'++class (Monoid w, Monad m) => MW w m | m -> w+type ComposeT :: ((Type -> Type) -> Type -> Type) -> ((Type -> Type) -> Type -> Type) -> (Type -> Type) -> Type -> Type+newtype ComposeT cf cg cm ca+    = ComposeT { getComposeT :: cf (cg cm) ca }+    deriving (Functor, Applicative, Monad, MW cw)+ main :: IO () main = do   print $ A 'a' == (A 'a' :: T Char () ())@@ -113,8 +129,8 @@    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@@ -203,3 +219,5 @@    -- Check that they all have Typeable   print (typeOf (R True 1), X)++  print (NT1 'a' < (NT1 'b' :: NT1 Int Char))
tests/Deriving.ref view
@@ -106,3 +106,4 @@ (:::) () Nothing (Rec Bool,X)+True
+ tests/DerivingBuiltin.hs view
@@ -0,0 +1,29 @@+module DerivingBuiltin (main) where++import Prelude (Bounded, Enum, Eq, Foldable, Functor, Ord, Int, Read, Show, Traversable)+import Data.Data (Data)+import Data.Ix (Ix)+import Data.Typeable (Typeable)++data T a b c = A a | B b | C a Int | D+    deriving (Bounded, Data, Eq, Ord, Read, Show, Typeable)++data Rec a = R { x :: a, y :: Int }+  deriving (Bounded, Data, Eq, Ord, Read, Show, Typeable)++data E = X | Y | Z+    deriving (Bounded, Data, Enum, Eq, Ix, Ord, Read, Show, Typeable)++data U a = U1 | U2 Int | U3 a | U4 a Int (a, a) | U5 [U a]+    deriving (Functor, Foldable, Traversable)++data V a = V a a a+    deriving (Bounded, Data, Eq, Ix, Ord, Read, Show, Typeable)++data These1 f g a+    = This1 (f a)+    | That1 (g a)+    | These1 (f a) (g a)+  deriving (Functor, Foldable, Traversable, Typeable, Data)++main = main
+ tests/Errno.hs view
@@ -0,0 +1,19 @@+module Errno where++import Foreign.C.Error++main :: IO ()+main = print $ any isValidErrno [eOK, e2BIG, eACCES, eADDRINUSE, eADDRNOTAVAIL, eADV, eAFNOSUPPORT, eAGAIN,+  eALREADY, eBADF, eBADMSG, eBADRPC, eBUSY, eCHILD, eCOMM, eCONNABORTED,+  eCONNREFUSED, eCONNRESET, eDEADLK, eDESTADDRREQ, eDIRTY, eDOM, eDQUOT,+  eEXIST, eFAULT, eFBIG, eFTYPE, eHOSTDOWN, eHOSTUNREACH, eIDRM, eILSEQ,+  eINPROGRESS, eINTR, eINVAL, eIO, eISCONN, eISDIR, eLOOP, eMFILE, eMLINK,+  eMSGSIZE, eMULTIHOP, eNAMETOOLONG, eNETDOWN, eNETRESET, eNETUNREACH,+  eNFILE, eNOBUFS, eNODATA, eNODEV, eNOENT, eNOEXEC, eNOLCK, eNOLINK,+  eNOMEM, eNOMSG, eNONET, eNOPROTOOPT, eNOSPC, eNOSR, eNOSTR, eNOSYS,+  eNOTBLK, eNOTCONN, eNOTDIR, eNOTEMPTY, eNOTSOCK, eNOTSUP, eNOTTY, eNXIO,+  eOPNOTSUPP, ePERM, ePFNOSUPPORT, ePIPE, ePROCLIM, ePROCUNAVAIL,+  ePROGMISMATCH, ePROGUNAVAIL, ePROTO, ePROTONOSUPPORT, ePROTOTYPE,+  eRANGE, eREMCHG, eREMOTE, eROFS, eRPCMISMATCH, eRREMOTE, eSHUTDOWN,+  eSOCKTNOSUPPORT, eSPIPE, eSRCH, eSRMNT, eSTALE, eTIME, eTIMEDOUT,+  eTOOMANYREFS, eTXTBSY, eUSERS, eWOULDBLOCK, eXDEV]
+ tests/Errno.ref view
@@ -0,0 +1,1 @@+True
tests/Info.hs view
@@ -1,20 +1,17 @@ module Info(main) where+import Data.Version+import Data.Word import Foreign.Storable import Foreign.Marshal.Utils import Foreign.Ptr-import Data.Word+import System.Info as I  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 " ++ thisOS+  putStrLn $ "Running on " ++ I.os ++ ", " ++ I.arch+  putStrLn $ "Compiler " ++ I.compilerName ++ "-" ++ showVersion I.fullCompilerVersion   putStr $ show _wordSize ++ " bit words, "    let@@ -26,6 +23,6 @@     case b of       1 -> "big endian"       2 -> "little endian"-      _ -> "Mystery Endian"+      _ -> "mystery endian"    putStrLn $ "GMP: " ++ if want_gmp /= 0 then "yes" else "no"
tests/Integer.hs view
@@ -31,7 +31,7 @@     iMaxU64 = 18446744073709551615   putStrLn "fromInteger"   print $ (fromInteger iMinI64 :: Int64) == (minBound :: Int64)-  print $ (fromInteger iMinI64 :: Int32) == 0+  -- overflow 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)@@ -55,15 +55,15 @@   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+  -- overflow 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+  -- overflow 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+  -- overflow print $ (fromInteger iMaxU64 :: Int64) == -1+  -- overflow print $ (fromInteger iMaxU64 :: Int32) == -1   print $ (fromInteger iMaxU64 :: Word64) == (maxBound :: Word64)   print $ (fromInteger iMaxU64 :: Word32) == (maxBound :: Word32)   putStrLn "toInteger"
tests/Integer.ref view
@@ -35,11 +35,6 @@ True True True-True-True-True-True-True toInteger True True
+ tests/LazyST.hs view
@@ -0,0 +1,125 @@+-- taken from https://gitlab.haskell.org/ghc/ghc/-/blob/c94aaacd4c4e31a2fe2cb8dadcdd14c7621d27c5/libraries/base/tests/lazySTexamples.hs+module LazyST where+import Data.STRef.Lazy+import Control.Monad.ST.Lazy as L+import Control.Monad.ST as S+import qualified Data.STRef as S+import Data.Function (fix)+--import System.IO (hPutStrLn, stderr)+--import Debug.Trace (trace)+import System.IO.Unsafe(unsafePerformIO)++-- Make a trace that prints on stdout, otherwise example5+-- mixes printing on stderr and stdout.+trace :: String -> a -> a+trace s a = unsafePerformIO $ do+  putStrLn s+  return a++-- The following implements `fix` using lazy `ST`. It is based on code+-- by Oleg Kiselyov (source: http://okmij.org/ftp/Haskell/Fix.hs) which is+-- in the public domain according to the main page (http://okmij.org/ftp/).++fact :: (Int -> Int) -> Int -> Int+fact self 0 = 1+fact self n = n * self (pred n)++-- Test liftM style (Oleg's original style)+fix1 :: (a -> a) -> a+fix1 f = L.runST $ do+  wrap <- newSTRef (error "black hole")+  let aux = readSTRef wrap >>= (\x -> x >>= pure . f)+  writeSTRef wrap aux+  aux++-- Test fmap style+fix2 :: (a -> a) -> a+fix2 f = L.runST $ do+  wrap <- newSTRef (error "black hole")+  let aux = readSTRef wrap >>= \x -> f <$> x+  writeSTRef wrap aux+  aux++-- The following examples are by Albert Y. C. Lai, and included (under the+-- GHC license) with his permission:+-- https://mail.haskell.org/pipermail/haskell-cafe/2017-January/126182.html++example1 :: [Int]+example1 = L.runST $ do+    v <- strictToLazyST (S.newSTRef 0)+    fix (\loop -> do+            n <- strictToLazyST (do n <- S.readSTRef v+                                    S.writeSTRef v (n+1)+                                    return n+                                )+            ns <- loop+            return (n : ns))++example2 :: [Int]+example2 = L.runST $ do+    v <- strictToLazyST (S.newSTRef 0)+    sequence (repeat (strictToLazyST (do n <- S.readSTRef v+                                         S.writeSTRef v (n+1)+                                         return n+                                     )))++example3 :: L.ST s [Integer]+example3 = do+    r <- newSTRef 0+    let loop = do+            x <- readSTRef r+            writeSTRef r $ x + 1+            xs <- loop+            writeSTRef r $ x + 2+            return $ x : xs+    loop++example4 :: L.ST s [Integer]+example4 = do+    r <- newSTRef 0+    let loop = do+            x <- readSTRef r+            writeSTRef r $ x + 1+            xs <- loop+            error "this line is dead code"+            return $ x : xs+    loop++star n s = trace ("<" ++ s ++ show n ++ ">") (return ())++-- Albert called this "Sprinkle sprinkle little stars, how+-- I wonder when you are"+example5 :: L.ST s [Integer]+example5 = do+    star 0 "init begin"+    r <- newSTRef 0+    star 0 "init end"+    let loop n = do+            star n "A"+            x <- readSTRef r+            star n "B"+            writeSTRef r $ x + 1+            star n "C"+            xs <- loop (n+1)+            star n "D"+            writeSTRef r $ x + 2+            star n "E"+            return $ x : xs+    loop 0++main :: IO ()+main = do+  print $ fix fact 5+  print $ fix fact 6+  print $ take 5 example1+  print $ take 5 example2+  print $ take 10 (L.runST example3)+  print $ take 10 (L.runST example4)+  print $ take 5 (L.runST example5)++  print $ S.runST $ do+    ref <- lazyToStrictST $ newSTRef 0+    let action = lazyToStrictST $ modifySTRef ref (+ 1)+    action+    action+    lazyToStrictST $ readSTRef ref
+ tests/LazyST.ref view
@@ -0,0 +1,23 @@+120+720+[0,1,2,3,4]+[0,1,2,3,4]+[0,1,2,3,4,5,6,7,8,9]+[0,1,2,3,4,5,6,7,8,9]+[<A0>+<init end0>+<init begin0>+0,<A1>+<C0>+<B0>+1,<A2>+<C1>+<B1>+2,<A3>+<C2>+<B2>+3,<A4>+<C3>+<B3>+4]+2
tests/Makefile view
@@ -1,11 +1,11 @@ MHSTARGET= MHSOUTPUT= MHS=../bin/gmhs-TMHS=$(MHS) $(MHSTARGET) $(MHSOUTPUT) -i../lib+TMHS=$(MHS) $(MHSTARGET) $(MHSOUTPUT) EVAL=../bin/mhseval +RTS -H1M -RTS .PHONY: test nfib clean errtest alltest cache info -alltest:	info test errtest testforimp testforexp testforimpexp testapplysp+alltest: info test errtest testforimp testforexp testforimpexp testapplysp testpipenonblockio # interactivetest  cache:@@ -104,7 +104,7 @@ 	$(TMHS) Forall     && $(EVAL) > Forall.out     && diff Forall.ref Forall.out 	$(TMHS) Block      && $(EVAL) > Block.out      && diff Block.ref Block.out 	$(TMHS) Fork       && $(EVAL) > Fork.out       && diff Fork.ref Fork.out-	$(TMHS) Concur     && $(EVAL) > Concur.out     && diff Concur.ref Concur.out+#	$(TMHS) Concur     && $(EVAL) > Concur.out     && diff Concur.ref Concur.out 	$(TMHS) MVar       && $(EVAL) > MVar.out       && diff MVar.ref MVar.out 	$(TMHS) Delay      && $(EVAL) > Delay.out      && diff Delay.ref Delay.out 	$(TMHS) ThrSt      && $(EVAL) > ThrSt.out      && diff ThrSt.ref ThrSt.out@@ -118,27 +118,37 @@ 	$(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+	$(TMHS) Unboxed    && $(EVAL) > Unboxed.out    && diff Unboxed.ref Unboxed.out+	$(TMHS) LazyST     && $(EVAL) > LazyST.out     && diff LazyST.ref LazyST.out+	$(TMHS) Errno      && $(EVAL) > Errno.out      && diff Errno.ref Errno.out+	$(TMHS) DerivingBuiltin  testforimp:-	MHSDIR=.. $(TMHS) ForeignC -of.exe && ./f.exe > ForeignC.out && diff ForeignC.ref ForeignC.out+	$(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+	$(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+	$(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+	$(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+	$(TMHS) -optc -I. ApplySP hsasp.c -oApplySP.exe && ./ApplySP.exe > ApplySP.out && diff ApplySP.ref ApplySP.out +testpipenonblockio:+	MHSDIR=.. $(TMHS) -oPipeNonBlockIO.exe PipeNonBlockIO && ./PipeNonBlockIO.exe > PipeNonBlockIO.out && diff PipeNonBlockIO.ref PipeNonBlockIO.out++testpipenonblockioem:+	$(TMHS) PipeNonBlockIO && $(EVAL) > PipeNonBlockIO.out && diff PipeNonBlockIO.ref PipeNonBlockIO.out+ errtest: 	sh errtester.sh $(MHS) < errmsg.test  interactivetest:-	$(TMHS) < itest.in | sed -e '1,/^>/d' > itest.out && diff itest.ref itest.out+	$(TMHS) --stdin < itest.in | sed -e '1,/^>/d' > itest.out && diff itest.ref itest.out  nfib: 	$(TMHS) Nfib && $(EVAL)
tests/PatBind.hs view
@@ -8,6 +8,8 @@ u :: Int (u, v) = (40, True) +a@b = 55 :: Int+ main :: IO () main = do   print x@@ -15,3 +17,5 @@   print z   print u   print v+  print a+  print b
tests/PatBind.ref view
@@ -3,3 +3,5 @@ 30 40 True+55+55
+ tests/PipeNonBlockIO.hs view
@@ -0,0 +1,77 @@+module PipeNonBlockIO where++import Control.Monad (void)+import Control.Concurrent+import Control.Concurrent.MVar+import Data.Word+import Foreign.C.Error+import Foreign.C.Types+import Foreign.Marshal.Alloc+import Foreign.Marshal.Array+import Foreign.Ptr+import Foreign.Storable+import System.IO.FD++foreign import ccall "unistd.h pipe"  c_pipe  :: Ptr CInt -> IO CInt+foreign import ccall "unistd.h read"  c_read  :: CInt -> Ptr Word8 -> CInt -> IO CInt+foreign import ccall "unistd.h write" c_write :: CInt -> Ptr Word8 -> CInt -> IO CInt+foreign import ccall "fcntl.h fcntl"  c_fcntl :: CInt -> CInt -> CInt -> IO CInt+foreign import capi "fcntl.h value F_SETFL"    fSETFL    :: CInt+foreign import capi "fcntl.h value O_NONBLOCK" oNONBLOCK :: CInt++setNonBlocking :: CInt -> IO ()+setNonBlocking fd = throwErrnoIfMinus1_ "fcntl" $ c_fcntl fd fSETFL oNONBLOCK++blockOnRead :: CInt -> IO Word8+blockOnRead fd = alloca go+  where+    go p = do+      r <- c_read fd p 1+      if r == 1+        then peek p+        else do+          errno <- getErrno+          if errno == eAGAIN || errno == eWOULDBLOCK+            then do+              putStrLn "entering waitForReadFD"+              waitForReadFD (fromIntegral fd)+              go p+            else throwErrno "read"++reader :: CInt -> MVar () -> IO ()+reader fd done = do+  putStrLn "reader: waiting for data"+  b1 <- blockOnRead fd+  putStrLn $ "reader: received " ++ show b1+  b2 <- blockOnRead fd+  putStrLn $ "reader: received " ++ show b2+  putMVar done ()++pipe :: IO (CInt, CInt)+pipe = do+  allocaArray 2 $ \ fds -> do+    c_pipe fds+    rd <- peekElemOff fds 0+    wr <- peekElemOff fds 1+    return (rd, wr)++main :: IO ()+main = do+  (readFd, writeFd) <- pipe+  setNonBlocking readFd+--  print (readFd, writeFd)++  done <- newEmptyMVar :: IO (MVar ())+  forkIO $ reader readFd done++  threadDelay 1000000 -- let the other thread reach its blocking state++  alloca $ \ p -> do+    putStrLn "main: writing to pipe"+    poke p 42+    c_write writeFd p 1+    threadDelay 1000000+    poke p 43+    c_write writeFd p 1++  takeMVar done
+ tests/PipeNonBlockIO.ref view
@@ -0,0 +1,6 @@+reader: waiting for data+entering waitForReadFD+main: writing to pipe+reader: received 42+entering waitForReadFD+reader: received 43
tests/Read.hs view
@@ -2,6 +2,9 @@ import Text.Read import Data.Int +roundTrip :: (Read a, Show a, Eq a) => a -> Bool+roundTrip x = read (show x) == x+ main :: IO () main = do   print (read "123"   :: Int)@@ -16,6 +19,12 @@   print (read "-2147483648" :: Int)   print (read "9223372036854775807" :: Int64)   print (read "-9223372036854775808" :: Int64)+  print (roundTrip (minBound :: Int))+  print (roundTrip (maxBound :: Int))+  print (roundTrip (minBound :: Int8))+  print (roundTrip (maxBound :: Int8))+  print (roundTrip (minBound :: Int64))+  print (roundTrip (maxBound :: Int64))   print (read "123"   :: Integer)   print (read " 123"  :: Integer)   print (read "123 "  :: Integer)
tests/Read.ref view
@@ -10,6 +10,12 @@ -2147483648 9223372036854775807 -9223372036854775808+True+True+True+True+True+True 123 123 123
tests/Record.hs view
@@ -1,4 +1,5 @@ module Record(main) where+import Data.Records  -- HasField instances are derived automatically 
tests/Storable.hs view
@@ -1,10 +1,15 @@ module Storable(main) where+import Data.Int import Data.Word+import Foreign.Marshal.Alloc import Foreign.Marshal.Array import Foreign.Marshal.Utils import Foreign.Ptr import Foreign.Storable +pokePeek :: (Storable a, Bounded a) => IO a+pokePeek = alloca (\p -> poke p maxBound >> peek p)+ main :: IO () main = do   let w1 = 0x01020304 :: Word@@ -28,3 +33,12 @@   b2 <- peek (p3 `plusPtr` 1)   print [b1, b2] -}++  pokePeek @Word8  >>= print+  pokePeek @Word16 >>= print+  pokePeek @Word32 >>= print+  pokePeek @Word64 >>= print+  pokePeek @Int8   >>= print+  pokePeek @Int16  >>= print+  pokePeek @Int32  >>= print+  pokePeek @Int64  >>= print
tests/Storable.ref view
@@ -1,3 +1,11 @@ True True True+255+65535+4294967295+18446744073709551615+127+32767+2147483647+9223372036854775807
tests/TypeApp.hs view
@@ -16,6 +16,15 @@ inci :: forall a . Num a => a -> forall b . (Num b, Integral b) => b -> a inci x = (+) x . fromIntegral +sizeOf :: forall a -> Int+sizeOf _ = 0++constT :: forall a b -> a -> b -> a+constT _ _ a b = a++constT2 :: forall a -> a -> forall b -> b -> a+constT2 _ a _ b = a+ main :: IO () main = do   print $ read @Int "123"@@ -25,4 +34,7 @@   print (incr Int 41)   print (incu () 41) --  print (inci 1 41 :: Double)+  print (sizeOf Bool)+  print (constT Int Bool 1 False)+  print (constT2 Int 2 Bool True)   return @IO ()
tests/TypeApp.ref view
@@ -3,3 +3,6 @@ Bool 42 42+0+1+2
tests/TypeOp.hs view
@@ -1,5 +1,7 @@-module TypeOp where+module TypeOp (x, type (~)(), type ($%), default (:%), default ($%)) where import Data.Coerce+-- import and export types (with class syntax)+import Primitives (type (~)(..))  data a + b = Plus a b type Foo = Int + Bool@@ -18,3 +20,58 @@  main :: IO () main = print (f x :: Either Int Bool)++-- Check that various combinations parse.+type (:$$) = Maybe+type (:+) a = Maybe a+type (a :$) = a+type a :++ b = Either a b+type (a :+++ b) c = (a,b,c)++type ($$$) = Maybe+type ($+) a = Maybe a+type (a $$) = a+type a $++ b = Either a b+type (a $+++ b) c = (a,b,c)++data (:$%$)+data (:$$%) a+data (a :$$$%)+data a :$%% b+data (a :$%%% b) c++class (:%$) where+class (:%) a where+class (a :$%) where+class a :%% b where+class (a :%%% b) c where++class (%$%) where+class ($%) a where+class (a $$%) where+class a $%% b where+class (a $%%% b) c where++x1 :: ($%) a => a+x1 = undefined+x2 :: ($%%) a b => a+x2 = undefined+x3 :: a $%% b => a+x3 = undefined+x4 :: ($%%%) a b c => a+x4 = undefined+x5 :: (a $%%% b) c => a+x5 = undefined+x6 :: (a $$%) => a+x6 = undefined++instance ($%) Int+instance (Int $$%)+instance Int $%% Int+instance ($%%) Bool Bool+instance (Int $%%% Int) Int++default (:%) (Int)+default ($%) (Int)+default ((:$%$))+default ($$%) ((:$%$))
− tests/TypeSyn.hs
@@ -1,19 +0,0 @@-module TypeSyn where--type Foo a = a -> a -> Bool--foo :: Foo (forall b. b->b)-foo f g = f 'a' == g 'a' && f () == g ()--type Generic i o = forall x. i x -> o x-type Id x = x--bar :: Generic Id []-bar x = [x]--type S a = Int-instance Functor S--main :: IO ()-main = do-  print (foo id id)
+ tests/Unboxed.hs view
@@ -0,0 +1,36 @@+-- Test fake unboxed tuples and sums+module Unboxed where++f# :: Int -> (# Int, Int #)+f# x = (# x , x+1 #)++type T# = (# Int | Bool #)++g :: Int -> T#+g x = (# x | #)++h :: Bool -> Unboxed.T#+h x = (# | x #)++d :: (# Int | Bool #) -> String+d (# x | #) = show x+d (# | x #) = show x++{-+-- Test that regular # still work+(#) :: Int -> Int -> Int+x # y = 2*x - y+-}++main :: IO ()+main = do+  case Unboxed.f# 2 of+    (# x, y #) -> print (x, y)+  putStrLn $ d $ g 2+  putStrLn $ d $ h True+{-+  print $ 3 # 2+  print $ (#) 3 2+  print $ (3 #) 2+  print $ (# 2) 3+-}
+ tests/Unboxed.ref view
@@ -0,0 +1,3 @@+(2,3)+2+True
tests/Unicode.hs view
@@ -23,5 +23,17 @@   printCases '\x2168' -- IX   printCases '\x2178' -- ix +data Option a where+  Some ∷ a ⇒ Option a+  None ∷ Option a+ foo ∷ ∀ α . Eq α ⇒ α → α-foo x = if x == x then x else undefined+foo x = if+  | x == x → x+  | otherwise → undefined++bar ∷ ∀ α → (→) α α+bar _ = id++pattern Sings ∷ a → [a] → [a]+pattern Sings a as ← as@[a]
tests/Via.hs view
@@ -139,6 +139,19 @@  ------- +class Contravariant f where+  contramap :: (a' -> a) -> (f a -> f a')++newtype Predicate a = Predicate { getPredicate :: a -> Bool }+  deriving (Contravariant) via Op Bool++newtype Op a b = Op { getOp :: b -> a }++instance Contravariant (Op a) where+  contramap f g = Op (getOp g . f)++-------+ main :: IO () main = do   print $ B True == B True@@ -167,5 +180,11 @@   print $ mc (I 1)    print $ mm (II 99) ()++  let pos :: Predicate Int+      pos = Predicate (>0)+      neg :: Predicate Int+      neg = contramap negate pos+  print $ getPredicate neg (-5)    putStrLn "done"
tests/Via.ref view
@@ -12,4 +12,5 @@ M "ababab" I 2 II 100+True done
tests/View.hs view
@@ -19,6 +19,9 @@ f6 y (compare y -> GT) = 1 f6 _ _ = 0 +f7 :: (Int, Int) -> Int+f7 (negate -> x, negate -> y) = x + y+ main :: IO () main = do   print (f1 20)@@ -28,3 +31,4 @@   print (f3 4 5)   print (f4 5)   print [f6 2 3, f6 3 3, f6 4 3]+  print (f7 (2, 3))
tests/View.ref view
@@ -5,3 +5,4 @@ 0 5 [-1,0,1]+-5
tests/itest.ref view
@@ -1,2 +1,5 @@ > 3+> > > 120+> 30414093201713378043612608166064768844377641568960512000000000000+> 3.0414093201713376e64 > Bye