diff options
Diffstat (limited to 'testsuite/tests/programs')
185 files changed, 45319 insertions, 0 deletions
diff --git a/testsuite/tests/programs/10queens/10queens.stdout b/testsuite/tests/programs/10queens/10queens.stdout new file mode 100644 index 0000000000..67adbdb354 --- /dev/null +++ b/testsuite/tests/programs/10queens/10queens.stdout @@ -0,0 +1 @@ +724 diff --git a/testsuite/tests/programs/10queens/Main.hs b/testsuite/tests/programs/10queens/Main.hs new file mode 100644 index 0000000000..6e2fdc0469 --- /dev/null +++ b/testsuite/tests/programs/10queens/Main.hs @@ -0,0 +1,30 @@ +module Main (main) -- q +where { +--import Fast2haskell; + + f_queens a_n=f_queens' (enumFromTo (1 :: Int) a_n) a_n; + f_queens' a_positions 0=(:) [] []; + f_queens' a_positions a_n=c_concat (f_map (f_place (f_queens' a_positions (((-) :: (Int -> Int -> Int)) a_n (1 :: Int)))) a_positions); + f_place a_boards a_q=[(:) a_q a_bs|a_bs<-a_boards,f_safe (1 :: Int) a_q a_bs]; + f_safe a_d a_q []=True; + f_safe a_d a_q (a_h:a_t)= + if (((==) :: (Int -> Int -> Bool)) a_q a_h) + then False + else + if (((==) :: (Int -> Int -> Bool)) (f_absi (((-) :: (Int -> Int -> Int)) a_q a_h)) a_d) + then False + else + (f_safe (((+) :: (Int -> Int -> Int)) a_d (1 :: Int)) a_q a_t); + f_absi a_n= + if (((<) :: (Int -> Int -> Bool)) a_n (0 :: Int)) + then (((negate) :: (Int -> Int)) a_n) + else + a_n; + f_main a_n=(++) (show (length (f_queens a_n))) "\n"; + c_input=(10 :: Int); + c_concat=f_foldr (++) []; + f_foldr a_op a_r []=a_r; + f_foldr a_op a_r (a_a:a_x)=a_op a_a (f_foldr a_op a_r a_x); + f_map a_f a_x=[a_f a_a|a_a<-a_x]; + main = putStr (f_main c_input) +} diff --git a/testsuite/tests/programs/10queens/Makefile b/testsuite/tests/programs/10queens/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/10queens/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/10queens/test.T b/testsuite/tests/programs/10queens/test.T new file mode 100644 index 0000000000..4d2b7579ba --- /dev/null +++ b/testsuite/tests/programs/10queens/test.T @@ -0,0 +1,6 @@ + +test('10queens', + [skip_if_fast, + extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) diff --git a/testsuite/tests/programs/Makefile b/testsuite/tests/programs/Makefile new file mode 100644 index 0000000000..9a36a1c5fe --- /dev/null +++ b/testsuite/tests/programs/Makefile @@ -0,0 +1,3 @@ +TOP=../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/Makefile-OLD b/testsuite/tests/programs/Makefile-OLD new file mode 100644 index 0000000000..0fab32f683 --- /dev/null +++ b/testsuite/tests/programs/Makefile-OLD @@ -0,0 +1,43 @@ +#----------------------------------------------------------------------------- +# $Id: Makefile-OLD,v 1.1 2001/07/11 16:06:23 sewardj Exp $ +# +# (c) The GHC Team, 1999-2000 +# + +TOP = . +include $(TOP)/mk/boilerplate.mk + +NOT_THESE = CVS mk + +NOT_THESE += hill_stk_oflow +# Correctly fails to terminate + +NOT_THESE += ipoole_spec_class +# Dialogue style IO + +NOT_THESE += areid_pass +# Old-style I/O + +NOT_THESE += north_lias +# Deliberately causes divide by zero, and +# we can't catch that yet + +NOT_THESE += andy_cherry barton-mangler-bug cvh_unboxing dmgob_native1 dmgob_native2 fast2haskell fexport jtod_circint okeefe_neural +# doesn't compile + +NOT_THESE += jeff-bug lennart_array +# compiles but doesn't run + +NOT_THESE += dmgob_native1 dmgob_native2 +# Native library doens't exist + +ifneq "$(HWL_NOFIB_HACK)" "" +NOT_THESE += callback zhang_ccall +# HWL: tmp disabled for testing GUM-merged version (20/3/01) +# don't compile: failed to load interface for `IOExts' +endif + +SUBDIRS = $(filter-out $(patsubst %, %/, $(NOT_THESE)), $(wildcard */)) + +include $(TOP)/mk/test.mk + diff --git a/testsuite/tests/programs/Queens/Makefile b/testsuite/tests/programs/Queens/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/Queens/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/Queens/queens.hs b/testsuite/tests/programs/Queens/queens.hs new file mode 100644 index 0000000000..548e20cb8d --- /dev/null +++ b/testsuite/tests/programs/Queens/queens.hs @@ -0,0 +1,50 @@ +-- The classic 8-queens problem made famous by Wirth. +-- This version Colin Runciman, March 2000. + +main = + if null solutions then putStrLn "no solution!" + else putStr (board (head solutions)) + where + solutions = queens 8 + +queens :: Int -> [[Int]] +queens n = valid n n + +valid :: Int -> Int -> [[Int]] +valid 0 n = [[]] +valid m n = filter safe (extend n (valid (m-1) n)) + +extend n b = cp (fromTo 1 n) b + +cp :: [a] -> [[a]] -> [[a]] +cp [] y = [] +cp (a:x) y = map (a:) y ++ cp x y + +safe (a:b) = no_threat a b 1 + +no_threat a [] m = True +no_threat a (b:y) m = + a /= b && a+m /= b && a-m /= b && no_threat a y (m+1) + +board :: [Int] -> String +board b = + unlines (concat (zipWith rank (from 1) b)) + where + rank r qcol = + map line ["o o o", " \\|/ ", " === "] + where + line crown_slice = + concat (zipWith square (from 1) b) + where + square scol _ = + if scol == qcol then crown_slice + else if (scol `rem` (2::Int)) == (r `rem` (2::Int)) then "....." + else " " + +-- in place of .. + +from :: Int -> [Int] +from n = n : from (n+1) + +fromTo :: Int -> Int -> [Int] +fromTo m n = if m > n then [] else m : fromTo (m+1) n diff --git a/testsuite/tests/programs/Queens/queens.stdout b/testsuite/tests/programs/Queens/queens.stdout new file mode 100644 index 0000000000..95eafd8a49 --- /dev/null +++ b/testsuite/tests/programs/Queens/queens.stdout @@ -0,0 +1,24 @@ +o o o ..... ..... ..... + \|/ ..... ..... ..... + === ..... ..... ..... + ..... .....o o o..... ..... + ..... ..... \|/ ..... ..... + ..... ..... === ..... ..... +..... ..... ..... .....o o o +..... ..... ..... ..... \|/ +..... ..... ..... ..... === + ..... ..... o o o ..... + ..... ..... \|/ ..... + ..... ..... === ..... +..... o o o ..... ..... +..... \|/ ..... ..... +..... === ..... ..... + ..... ..... .....o o o..... + ..... ..... ..... \|/ ..... + ..... ..... ..... === ..... +.....o o o..... ..... ..... +..... \|/ ..... ..... ..... +..... === ..... ..... ..... + ..... o o o ..... ..... + ..... \|/ ..... ..... + ..... === ..... ..... diff --git a/testsuite/tests/programs/Queens/test.T b/testsuite/tests/programs/Queens/test.T new file mode 100644 index 0000000000..044ebf6a2c --- /dev/null +++ b/testsuite/tests/programs/Queens/test.T @@ -0,0 +1,6 @@ + +test('queens', + [skip_if_fast, + extra_clean(['Main.hi', 'Main.o'])], + compile_and_run, + ['']) diff --git a/testsuite/tests/programs/andre_monad/Main.hs b/testsuite/tests/programs/andre_monad/Main.hs new file mode 100644 index 0000000000..7e3dda6362 --- /dev/null +++ b/testsuite/tests/programs/andre_monad/Main.hs @@ -0,0 +1,89 @@ +-- Evaluator in a monad: with execution counts +-- Phil Wadler, 11 October 1991 + +-- Types are optional. Some must be commented out to +-- work around a bug in Gofer. + +-- The count monad + +type M a = (a, Int) + +unit :: a -> M a +unit a = (a, 0) + +bind :: M a -> (a -> M b) -> M b +m `bind` k = case m of + (a,i) -> case k a of + (b,j) -> (b,i+j) + +-- disp :: Text a => M a -> String +disp (a,i) = show a ++ "\nCount: " ++ show i + +tick :: M () +tick = ((), 1) + +-- The evaluator +-- Lines with * are only change from evalIdent + +data Op = Add | Sub | Mul | Quo +data Term = Con Int | Bin Op Term Term + +eval :: Term -> M Int +eval (Con i) = unit i +eval (Bin op u v) = eval u `bind` (\a -> + eval v `bind` (\b -> + go op a b `bind` (\c -> -- * + tick `bind` (\ () -> -- * + unit c)))) -- * + +go :: Op -> Int -> Int -> M Int +go Add a b = unit (a+b) +go Sub a b = unit (a-b) +go Mul a b = unit (a*b) +go Quo a b = unit (a `quot` b) -- WDP: was "div" + +test :: Term -> String +test t = disp (eval t) + +-- Test data + +add, sub, mul, quo :: Term -> Term -> Term +u `add` v = Bin Add u v +u `sub` v = Bin Sub u v +u `mul` v = Bin Mul u v +u `quo` v = Bin Quo u v + +term0,term1,term2 :: Term +term0 = Con 6 `mul` Con 9 +term1 = (Con 4 `mul` Con 13) `add` Con 2 +term2 = (Con 1 `quo` Con 2) `add` Con 2 +term3 = (((((((((((((((((((((((((((((((( + (((((((((((((((((((((((((((((( + Con 7777 `mul` Con 13) `quo` Con 13) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + `mul` Con 755) `quo` Con 755) `mul` Con 333) + `quo` Con 755) `mul` Con 755) `mul` Con 333) + +sb 0 = term2 +sb n = if (n `mod` 2) == 0 + then term2 `add` (sb (n-1)) + else term2 `sub` (sb (n-1)) + +main = print (show (eval (sb 5000))) diff --git a/testsuite/tests/programs/andre_monad/Makefile b/testsuite/tests/programs/andre_monad/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/andre_monad/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/andre_monad/andre_monad.stdout b/testsuite/tests/programs/andre_monad/andre_monad.stdout new file mode 100644 index 0000000000..7ea358a0c9 --- /dev/null +++ b/testsuite/tests/programs/andre_monad/andre_monad.stdout @@ -0,0 +1 @@ +"(2,15002)" diff --git a/testsuite/tests/programs/andre_monad/test.T b/testsuite/tests/programs/andre_monad/test.T new file mode 100644 index 0000000000..e5ad78feda --- /dev/null +++ b/testsuite/tests/programs/andre_monad/test.T @@ -0,0 +1,8 @@ +# exhausts Hugs's heap (CAF leak) +test('andre_monad', + [skip_if_fast, + extra_clean(['Main.hi', 'Main.o']), + omit_compiler_types(['hugs'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/andy_cherry/DataTypes.hs b/testsuite/tests/programs/andy_cherry/DataTypes.hs new file mode 100644 index 0000000000..9f7c5571ba --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/DataTypes.hs @@ -0,0 +1,622 @@ + + module DataTypes where + + import GenUtils + import Data.Array -- 1.3 + import Data.Ix + import Data.Char + infix 1 =: -- 1.3 + (=:) a b = (a,b) + + + + + + class Presentable a where + userFormat :: a -> String -- in prefered display format + + + + + + instance (Presentable a) => Presentable [a] where + userFormat xs = unlines (map userFormat xs) + + + + + data Piece + = King + | Queen + | Rook + | Knight + | Bishop + | Pawn deriving(Eq) + + instance Presentable Piece where + userFormat King = "K" + userFormat Queen = "Q" + userFormat Rook = "R" + userFormat Knight = "N" + userFormat Bishop = "B" + userFormat Pawn = "P" + + + + + castleK = "O-O" + castleQ = "O-O-O" + + + + + + data Colour = Black | White deriving (Eq) + + instance Presentable Colour where + userFormat White = "White" + userFormat Black = "Black" + + changeColour :: Colour -> Colour + changeColour White = Black + changeColour Black = White + + + + + + type ChessRank = Int -- 1-8 + type ChessFile = Int -- 1-8 + + type BoardPos = (ChessFile,ChessRank) -- ChessFile (0-7) and ChessRank (0-7) + type ExBoardPos = (Maybe ChessFile,Maybe ChessRank) + + extendBP :: BoardPos -> ExBoardPos + extendBP (a,b) = (Just a,Just b) + + compExBPandBP :: ExBoardPos -> BoardPos -> Bool + compExBPandBP (a,b) (c,d) = a `cmp` c && b `cmp` d + where + cmp Nothing _ = True + cmp (Just x) y = x == y + + userFormatBoardPos :: BoardPos -> String + userFormatBoardPos (f,r) = userFormatFile f ++ userFormatRank r + userFormatExBoardPos :: ExBoardPos -> String + userFormatExBoardPos (Just f,Just r) = userFormatFile f ++ userFormatRank r + userFormatExBoardPos (Just f,Nothing) = userFormatFile f + userFormatExBoardPos (Nothing,Just r) = userFormatRank r + userFormatExBoardPos _ = "" + userFormatRank r = [toEnum (r + 48)] + userFormatFile f = [toEnum (f + 96)] + + + + + + data MoveTok + = PieceTok Piece -- Q,K,R,B,N + | RankTok ChessRank -- 1 .. 8 + | FileTok ChessFile -- a .. h + | PartCastleTok -- 0 | O | o + | CaptureTok -- x + | MoveToTok -- - + | QueensWith -- = + | CheckTok -- + + | MateTok -- # + + charToMoveTok 'Q' = Just (PieceTok Queen) + charToMoveTok 'K' = Just (PieceTok King) + charToMoveTok 'R' = Just (PieceTok Rook) + charToMoveTok 'B' = Just (PieceTok Bishop) + charToMoveTok 'N' = Just (PieceTok Knight) + charToMoveTok '1' = Just (RankTok 1) + charToMoveTok '2' = Just (RankTok 2) + charToMoveTok '3' = Just (RankTok 3) + charToMoveTok '4' = Just (RankTok 4) + charToMoveTok '5' = Just (RankTok 5) + charToMoveTok '6' = Just (RankTok 6) + charToMoveTok '7' = Just (RankTok 7) + charToMoveTok '8' = Just (RankTok 8) + charToMoveTok 'a' = Just (FileTok 1) + charToMoveTok 'b' = Just (FileTok 2) + charToMoveTok 'c' = Just (FileTok 3) + charToMoveTok 'd' = Just (FileTok 4) + charToMoveTok 'e' = Just (FileTok 5) + charToMoveTok 'f' = Just (FileTok 6) + charToMoveTok 'g' = Just (FileTok 7) + charToMoveTok 'h' = Just (FileTok 8) + charToMoveTok '0' = Just (PartCastleTok) + charToMoveTok 'O' = Just (PartCastleTok) + charToMoveTok 'o' = Just (PartCastleTok) + charToMoveTok 'x' = Just (CaptureTok) + charToMoveTok '-' = Just (MoveToTok) + charToMoveTok '=' = Just (QueensWith) + charToMoveTok '+' = Just (CheckTok) + charToMoveTok '#' = Just (MateTok) + charToMoveTok _ = Nothing + + + + data Quantum + = QuantumMove String -- Short Description of move + String -- Check or Mate (+ or #) + String -- !,??,?!, etc + Board -- Snap Shot of Board + | QuantumNAG Int -- !,??,?! stuff + | QuantumComment [String] -- { comment } + | QuantumResult String -- 1-0, etc (marks end of game) + | QuantumAnalysis [Quantum] -- ( analysis ) + | QuantumPrintBoard -- {^D} + + instance Presentable Quantum where + userFormat (QuantumMove mv ch ann _) + = mv ++ ch ++ ann + userFormat (QuantumNAG nag) = "$" ++ show nag + userFormat (QuantumComment comment) + = "[" ++ unwords comment ++ "]" + --userFormat (QuantumNumber num) = userFormat num + userFormat (QuantumResult str) = str + userFormat (QuantumAnalysis anal) = + "( " ++ unwords (map userFormat anal) ++ " )" + + + + data Result = Win | Draw | Loss | Unknown + + instance Presentable Result where + userFormat Win = "1-0" + userFormat Draw = "1/2-1/2" + userFormat Loss = "0-1" + userFormat Unknown = "*" + + mkResult :: String -> Result + mkResult "1-0" = Win + mkResult "1/2-1/2" = Draw + mkResult "0-1" = Loss + mkResult _ = Unknown + + + + data TagStr = TagStr String String + + instance Presentable TagStr where + userFormat (TagStr tag str) = "[" ++ tag ++ " \"" ++ str ++ "\"]" + + getTagStr :: String -> String -> [TagStr] -> String + getTagStr str def [] = def + getTagStr str def (TagStr st ans:rest) + | str == st = ans + | otherwise = getTagStr str def rest + + getHeaderInfo + :: [TagStr] + -> ( + String, -- Date + String, -- Site + Maybe Int, -- Game Number + Result, -- W/D/L + String, -- White + String, -- Black + String -- Opening + ) + getHeaderInfo tags = ( + date, + site, + gameno, + result, + white `par` whiteElo, + black `par` blackElo, + opening) + where + date = case getTagStr "Date" "?" tags of + [a,b,c,d,'.','?','?','.','?','?'] -> [a,b,c,d] + [a,b,c,d,'.',x,y,'.','?','?'] -> getMonth [x,y] ++ " " ++ [a,b,c,d] + def -> "?" + site = getTagStr "Site" "?" tags + gameno = case getTagStr "GameNumber" "" tags of + xs | all isDigit xs && not (null xs) -> Just (read xs) + _ -> Nothing + result = mkResult (getTagStr "Result" "*" tags) + white = cannon (getTagStr "White" "?" tags) + whiteElo = getTagStr "WhiteElo" "" tags + black = cannon (getTagStr "Black" "?" tags) + blackElo = getTagStr "BlackElo" "" tags + opening = getOpening (getTagStr "ECO" "" tags) + + par xs "" = xs + par xs ys = xs ++ " (" ++ ys ++ ")" + + getMonth "01" = "Jan" + getMonth "02" = "Feb" + getMonth "03" = "Mar" + getMonth "04" = "Apr" + getMonth "05" = "May" + getMonth "06" = "Jun" + getMonth "07" = "Jul" + getMonth "08" = "Aug" + getMonth "09" = "Sep" + getMonth "10" = "Oct" + getMonth "11" = "Nov" + getMonth "12" = "Dec" + + cannon name = case span (/= ',') name of + (a,[',',' ',b]) -> b : ". " ++ a + (a,[',',b]) -> b : ". " ++ a + (a,',':' ':b) -> b ++ " " ++ a + (a,',':b) -> b ++ " " ++ a + _ -> name + + + getOpening eco@[a,b,c] | a >= 'A' && a <= 'E' && isDigit b && isDigit c + = getOpenName ((fromEnum a - fromEnum 'A') * 100 + + (fromEnum b - fromEnum '0') * 10 + + (fromEnum c - fromEnum '0')) ++ " " ++ eco + getOpening other = other + + getOpenName :: Int -> String + getOpenName eco + | otherwise = "Foo" + {- + | eco == 000 = "Irregular Openings" + | eco == 001 = "Larsen Opening" + | eco == 002 = "From's Gambit and Bird's Open" + | eco == 003 = "Bird's Opening" + | eco == 004 = "Dutch System" + | eco == 005 = "Transposition to various Open" + | eco == 006 = "Zukertort Opening" + | eco >= 007 && eco <= 008 + = "Barcza System" + | eco == 009 = "Reti Opening" + | eco == 010 = "Variations of Dutch, QI, KI" + | eco >= 011 && eco <= 014 + = "Reti Opening" + | eco == 015 = "English counter King's Fianch" + | eco >= 016 && eco <= 039 + = "English Opening" + | eco == 040 = "Unusual replies to 1.d4" + | eco == 041 = "Modern Defence counter 1.d4" + | eco == 042 = "Modern Defence with c2-c4" + | eco >= 043 && eco <= 044 + = "Old Benoni" + | eco == 045 = "Queen's Pawn-Trompowski Var" + | eco == 046 = "Queen's Pawn Opening" + | eco == 047 = "Queen's Indian" + | eco >= 048 && eco <= 049 + = "King's Indian" + | eco == 050 = "Queen's Indian" + | eco >= 051 && eco <= 052 + = "Budapest Defence" + | eco >= 053 && eco <= 056 + = "Old Indian Defence" + | eco >= 057 && eco <= 059 + = "Volga-Benko Gambit" + | eco >= 060 && eco <= 079 + = "Benoni" + | eco >= 080 && eco <= 099 + = "Dutch Defence" + | eco == 100 = "Owen Def, Nimzowitsch Def" + | eco == 101 = "Center Counter" + | eco >= 102 && eco <= 105 + = "Alekhine's Defence" + | eco == 106 = "Modern Defence" + | eco >= 107 && eco <= 109 + = "Pirc Defence" + | eco >= 110 && eco <= 119 + = "Caro-Kann Defence" + | eco >= 120 && eco <= 199 + = "Sicilian Defence" + | eco >= 200 && eco <= 219 + = "French Defence" + | eco == 220 = "Rare moves" + | eco == 221 = "Nordic Gambit" + | eco == 222 = "Central Gambit" + | eco >= 223 && eco <= 224 + = "Bishop's Opening" + | eco >= 225 && eco <= 229 + = "Vienna Game" + | eco == 230 = "King's Gambit Declined" + | eco >= 231 && eco <= 232 + = "Falkbeer Counter Gambit" + | eco >= 233 && eco <= 239 + = "King's Gambit" + | eco == 240 = "Latvian Gambit" + | eco == 241 = "Philidor Defence" + | eco >= 242 && eco <= 243 + = "Russian Defence-Petrov" + | eco >= 244 && eco <= 245 + = "Scotch Opening" + | eco >= 246 && eco <= 249 + = "Four Knight's" + | eco == 250 = "Italian Opening" + | eco >= 251 && eco <= 252 + = "Evans Gambit" + | eco >= 253 && eco <= 254 + = "Italian Opening" + | eco >= 255 && eco <= 259 + = "Two Knight's Play" + | eco >= 260 && eco <= 299 + = "Ruy Lopez" + | eco >= 300 && eco <= 305 + = "Queen Pawn's Opening" + | eco >= 306 && eco <= 307 + = "Queen's Gambit" + | eco >= 308 && eco <= 309 + = "Albins Counter Gambit" + | eco >= 310 && eco <= 319 + = "Slav Defence" + | eco >= 320 && eco <= 329 + = "Queen's Gambit Accepted" + | eco >= 330 && eco <= 369 + = "Queen's Gambit" + | eco >= 370 && eco <= 399 + = "Gruenfeld Defence" + | eco >= 400 && eco <= 409 + = "Catalan" + | eco == 410 = "Blumenfeld Gambit" + | eco >= 411 && eco <= 419 + = "Queen's Indian" + | eco >= 420 && eco <= 459 + = "Nimzo Indian" + | eco >= 460 && eco <= 499 + = "King's Indian" + -} + + + + data MoveNumber = MoveNumber Int Colour + instance Presentable MoveNumber where + userFormat (MoveNumber n White) = show n ++ "." + userFormat (MoveNumber n Black) = show n ++ "..." + + initMoveNumber = MoveNumber 1 White + incMove (MoveNumber i White) = MoveNumber i Black + incMove (MoveNumber i Black) = MoveNumber (i+1) White + decMove (MoveNumber i White) = MoveNumber (i-1) Black + decMove (MoveNumber i Black) = MoveNumber i White + getMoveColour :: MoveNumber -> Colour + getMoveColour (MoveNumber _ c) = c + + + + data Token + + + + = StringToken String + | AsterixToken + | LeftABToken -- ?? + | RightABToken -- ?? + | NAGToken Int -- `normal' NAGS + | NAGAnnToken Int String + -- `special' move annotating NAGS (1-6) + | SymbolToken String + | CommentToken [String] -- list of words + | LeftSBToken + | RightSBToken + | LeftRBToken + | RightRBToken + | IntToken Int + | PeriodToken + + + + | AnalToken [Token] + + instance Presentable Token where + userFormat (StringToken str) = show str + userFormat (IntToken n) = show n + userFormat (PeriodToken) = "." + userFormat (AsterixToken) = "*" + userFormat (LeftSBToken) = "[" + userFormat (RightSBToken) = "]" + userFormat (LeftRBToken) = "(" + userFormat (RightRBToken) = ")" + userFormat (LeftABToken) = "<" + userFormat (RightABToken) = ">" + userFormat (NAGToken i) = "$" ++ show i + userFormat (NAGAnnToken i s) = "$" ++ show i + userFormat (SymbolToken str) = str + userFormat (CommentToken str) = "{" ++ unwords str ++ "}" + userFormat (AnalToken toks) = "( " ++ unwords (map userFormat toks) + ++ " )" + + + + + + data Game a = Game [TagStr] [a] + + type AbsGame = Game Token + type RealGame = Game Quantum + + instance (Presentable a) => Presentable (Game a) where + userFormat (Game tags toks) = + unlines (map userFormat tags + ++ formatText 78 (map userFormat toks)) + + + + + + + data PlayMove + = PlayMove + Piece -- with this + BoardPos -- from here + BoardPos -- to here (possibly capturing) + SpecialMove + + mkPlayMove p f t = PlayMove p f t NothingSpecial + + data SpecialMove + = NothingSpecial + | BigPawnMove -- allows e.p. next move + | Queening Piece -- queen with this + | EnPassant -- capture e.p. + deriving (Eq) + + instance Presentable PlayMove where + userFormat (PlayMove piece pos pos' sp) = + userFormat piece ++ + userFormatBoardPos pos ++ "-" ++ + userFormatBoardPos pos' ++ + userFormat sp + + instance Presentable SpecialMove where + userFormat (NothingSpecial) = "" + userFormat (BigPawnMove) = "{b.p.m.}" + userFormat (Queening p) = "=" ++ userFormat p + userFormat (EnPassant) = "e.p." + + extractSrcFromPlayMove :: PlayMove -> BoardPos + extractSrcFromPlayMove (PlayMove _ src _ _) = src + + extractDestFromPlayMove :: PlayMove -> BoardPos + extractDestFromPlayMove (PlayMove _ _ dest _) = dest + + extractSpecialFromPlayMove :: PlayMove -> SpecialMove + extractSpecialFromPlayMove (PlayMove _ _ _ sp) = sp + + + + + + + data BoardSquare + = VacantSq + | WhitesSq Piece + | BlacksSq Piece + + data SquareContent + = Vacant + | Friendly + | Baddy + | OffBoard deriving (Eq) + + instance Presentable SquareContent where + userFormat Vacant = "." + userFormat Friendly = "*" + userFormat Baddy = "#" + userFormat OffBoard = "?" + + + + + + + data Board + = Board (Array BoardPos BoardSquare) + MoveNumber -- current player & and move + (Maybe ChessFile) -- e.p. possibilties. + + + + displayBoard :: Colour -> Board -> [String] + displayBoard col (Board arr _ ep) = + ([cjustify 33 (userFormat (changeColour col)),""] ++ + [ + concat [ (case (even x,even y) of + (True,True) -> showSq (x `div` 2) (y `div` 2) + (False,False) -> "+" + (True,False) -> "---" + (False,True) -> (if x == 17 then "| " ++ show (y `div` 2) else "|")) + | x <- [1..17::Int]] + | y <- reverse [1..17::Int]] ++ + [concat [ " " ++ [x] ++ " " | x <- "abcdefgh" ]] ++ + ["",cjustify 33 (userFormat col),"", + case ep of + Nothing -> "" + Just p -> "EnPassant:" ++ userFormatFile p ]) + where + make n str = take n (str ++ repeat ' ') + lookupPlace :: Int -> Int -> BoardSquare + lookupPlace x' y' = arr ! (x',y') + + bold :: String -> String + bold str = map toLower str + + showSq x y = case lookupPlace x y of + VacantSq -> [if_dot,if_dot,if_dot] + (WhitesSq p) -> (if_dot : userFormat p) ++ [if_dot] + (BlacksSq p) -> (if_dot : bold (userFormat p)) ++ [if_dot] + where + if_dot = if (x - y) `rem` 2 == 0 then '.' else ' ' + + instance Presentable Board where + userFormat = unlines . displayBoard White + + boardSize :: (BoardPos,BoardPos) + boardSize = ((1,1),(8,8)) + + + + + buildBoard :: String -> Board + buildBoard str = Board brd initMoveNumber Nothing + where + brd = array boardSize (zipWith (=:) allSq (mkPieces str)) + allSq = [ (x,y) | y <- reverse [1..8::Int],x <- [1..8::Int]] + mkPieces :: String -> [BoardSquare] + mkPieces (hd:rest) | hd `elem` "KQRNBPkqrnbp" = pc : mkPieces rest + where + pc = case hd of + 'K' -> WhitesSq King + 'Q' -> WhitesSq Queen + 'R' -> WhitesSq Rook + 'N' -> WhitesSq Knight + 'B' -> WhitesSq Bishop + 'P' -> WhitesSq Pawn + 'k' -> BlacksSq King + 'q' -> BlacksSq Queen + 'r' -> BlacksSq Rook + 'n' -> BlacksSq Knight + 'b' -> BlacksSq Bishop + 'p' -> BlacksSq Pawn + mkPieces ('/':rest) = mkPieces rest + mkPieces (c:rest) | isDigit c = + case span isDigit rest of + (cs,rest') -> take (read (c:cs)) (repeat VacantSq) + ++ mkPieces rest' + mkPieces [] = [] + + startBoard :: Board -- the uni before the big bang. + startBoard = buildBoard "rnbqkbnr/pppppppp/32/PPPPPPPP/RNBQKBNR" + + lookupSquare :: Colour -> BoardSquare -> SquareContent + lookupSquare _ VacantSq = Vacant + lookupSquare White (WhitesSq p) = Friendly + lookupSquare Black (WhitesSq p) = Baddy + lookupSquare White (BlacksSq p) = Baddy + lookupSquare Black (BlacksSq p) = Friendly + + lookupBoard :: Board -> BoardPos -> SquareContent + lookupBoard (Board arr col _) pos = + if inRange boardSize pos + then lookupSquare (getMoveColour col) (arr ! pos) + else OffBoard + + lookupBoardSquare :: Board -> BoardPos -> BoardSquare + lookupBoardSquare (Board arr _ _) pos = arr ! pos + + getSquarePiece :: BoardSquare -> Maybe Piece + getSquarePiece VacantSq = Nothing + getSquarePiece (WhitesSq p) = Just p + getSquarePiece (BlacksSq p) = Just p + + lookupBoardPiece :: Board -> BoardPos -> Maybe Piece + lookupBoardPiece (Board arr _ _) pos = + case arr ! pos of + VacantSq -> Nothing + WhitesSq piece -> Just piece + BlacksSq piece -> Just piece + + + + {-# INLINE mkColBoardSq #-} + mkColBoardSq :: Colour -> Piece -> BoardSquare + mkColBoardSq White p = WhitesSq p + mkColBoardSq Black p = BlacksSq p + + getBoardColour (Board _ mv _) = getMoveColour mv + diff --git a/testsuite/tests/programs/andy_cherry/GenUtils.hs b/testsuite/tests/programs/andy_cherry/GenUtils.hs new file mode 100644 index 0000000000..3e1de07fb8 --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/GenUtils.hs @@ -0,0 +1,244 @@ + + + + + + + + + +module GenUtils ( + + trace, + + assocMaybe, assocMaybeErr, + arrElem, + arrCond, + memoise, + Maybe(..), + MaybeErr(..), + mapMaybe, + mapMaybeFail, + maybeToBool, + maybeToObj, + maybeMap, + joinMaybe, + mkClosure, + foldb, + + mapAccumL, + + sortWith, + sort, + cjustify, + ljustify, + rjustify, + space, + copy, + combinePairs, + formatText ) where + +import Data.Array -- 1.3 +import Data.Ix -- 1.3 + +import Debug.Trace ( trace ) + + +-- ------------------------------------------------------------------------- + +-- Here are two defs that everyone seems to define ... +-- HBC has it in one of its builtin modules + +#if defined(__GLASGOW_HASKELL__) || defined(__GOFER__) + +--in 1.3: data Maybe a = Nothing | Just a deriving (Eq,Ord,Text) + +#endif + +infix 1 =: -- 1.3 +type Assoc a b = (a,b) -- 1.3 +(=:) a b = (a,b) + +mapMaybe :: (a -> Maybe b) -> [a] -> [b] +mapMaybe f [] = [] +mapMaybe f (a:r) = case f a of + Nothing -> mapMaybe f r + Just b -> b : mapMaybe f r + +-- This version returns nothing, if *any* one fails. + +mapMaybeFail f (x:xs) = case f x of + Just x' -> case mapMaybeFail f xs of + Just xs' -> Just (x':xs') + Nothing -> Nothing + Nothing -> Nothing +mapMaybeFail f [] = Just [] + +maybeToBool :: Maybe a -> Bool +maybeToBool (Just _) = True +maybeToBool _ = False + +maybeToObj :: Maybe a -> a +maybeToObj (Just a) = a +maybeToObj _ = error "Trying to extract object from a Nothing" + +maybeMap :: (a -> b) -> Maybe a -> Maybe b +maybeMap f (Just a) = Just (f a) +maybeMap f Nothing = Nothing + + +joinMaybe :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a +joinMaybe _ Nothing Nothing = Nothing +joinMaybe _ (Just g) Nothing = Just g +joinMaybe _ Nothing (Just g) = Just g +joinMaybe f (Just g) (Just h) = Just (f g h) + +data MaybeErr a err = Succeeded a | Failed err deriving (Eq,Show{-was:Text-}) + +-- @mkClosure@ makes a closure, when given a comparison and iteration loop. +-- Be careful, because if the functional always makes the object different, +-- This will never terminate. + +mkClosure :: (a -> a -> Bool) -> (a -> a) -> a -> a +mkClosure eq f = match . iterate f + where + match (a:b:c) | a `eq` b = a + match (_:c) = match c + +-- fold-binary. +-- It combines the element of the list argument in balanced mannerism. + +foldb :: (a -> a -> a) -> [a] -> a +foldb f [] = error "can't reduce an empty list using foldb" +foldb f [x] = x +foldb f l = foldb f (foldb' l) + where + foldb' (x:y:x':y':xs) = f (f x y) (f x' y') : foldb' xs + foldb' (x:y:xs) = f x y : foldb' xs + foldb' xs = xs + +-- Merge two ordered lists into one ordered list. + +mergeWith :: (a -> a -> Bool) -> [a] -> [a] -> [a] +mergeWith _ [] ys = ys +mergeWith _ xs [] = xs +mergeWith le (x:xs) (y:ys) + | x `le` y = x : mergeWith le xs (y:ys) + | otherwise = y : mergeWith le (x:xs) ys + +insertWith :: (a -> a -> Bool) -> a -> [a] -> [a] +insertWith _ x [] = [x] +insertWith le x (y:ys) + | x `le` y = x:y:ys + | otherwise = y:insertWith le x ys + +-- Sorting is something almost every program needs, and this is the +-- quickest sorting function I know of. + +sortWith :: (a -> a -> Bool) -> [a] -> [a] +sortWith le [] = [] +sortWith le lst = foldb (mergeWith le) (splitList lst) + where + splitList (a1:a2:a3:a4:a5:xs) = + insertWith le a1 + (insertWith le a2 + (insertWith le a3 + (insertWith le a4 [a5]))) : splitList xs + splitList [] = [] + splitList (r:rs) = [foldr (insertWith le) [r] rs] + +sort :: (Ord a) => [a] -> [a] +sort = sortWith (<=) + +-- Gofer-like stuff: + +cjustify, ljustify, rjustify :: Int -> String -> String +cjustify n s = space halfm ++ s ++ space (m - halfm) + where m = n - length s + halfm = m `div` 2 +ljustify n s = s ++ space (max 0 (n - length s)) +rjustify n s = space (max 0 (n - length s)) ++ s + +space :: Int -> String +space n = copy n ' ' + +copy :: Int -> a -> [a] -- make list of n copies of x +copy n x = take n xs where xs = x:xs + +combinePairs :: (Ord a) => [(a,b)] -> [(a,[b])] +combinePairs xs = + combine [ (a,[b]) | (a,b) <- sortWith (\ (a,_) (b,_) -> a <= b) xs] + where + combine [] = [] + combine ((a,b):(c,d):r) | a == c = combine ((a,b++d) : r) + combine (a:r) = a : combine r + +assocMaybe :: (Eq a) => [(a,b)] -> a -> Maybe b +assocMaybe env k = case [ val | (key,val) <- env, k == key] of + [] -> Nothing + (val:vs) -> Just val + +assocMaybeErr :: (Eq a) => [(a,b)] -> a -> MaybeErr b String +assocMaybeErr env k = case [ val | (key,val) <- env, k == key] of + [] -> Failed "assoc: " + (val:vs) -> Succeeded val + + +deSucc (Succeeded e) = e + +mapAccumL :: (a -> b -> (c,a)) -> a -> [b] -> ([c],a) +mapAccumL f s [] = ([],s) +mapAccumL f s (b:bs) = (c:cs,s'') + where + (c,s') = f s b + (cs,s'') = mapAccumL f s' bs + + + +-- Now some utilties involving arrays. +-- Here is a version of @elem@ that uses partual application +-- to optimise lookup. + +arrElem :: (Ix a) => [a] -> a -> Bool +arrElem obj = \x -> inRange size x && arr ! x + where + size = (maximum obj,minimum obj) + arr = listArray size [ i `elem` obj | i <- range size ] + +-- Here is the functional version of a multi-way conditional, +-- again using arrays, of course. Remember @b@ can be a function ! +-- Note again the use of partiual application. + +arrCond :: (Ix a) + => (a,a) -- the bounds + -> [(Assoc [a] b)] -- the simple lookups + -> [(Assoc (a -> Bool) b)] -- the functional lookups + -> b -- the default + -> a -> b -- the (functional) result + +arrCond bds pairs fnPairs def = (!) arr' + where + arr' = array bds [ t =: head + ([ r | (p, r) <- pairs, elem t p ] ++ + [ r | (f, r) <- fnPairs, f t ] ++ + [ def ]) + | t <- range bds ] + +memoise :: (Ix a) => (a,a) -> (a -> b) -> a -> b +memoise bds f = (!) arr + where arr = array bds [ t =: f t | t <- range bds ] + +-- Quite neat this. Formats text to fit in a column. + +formatText :: Int -> [String] -> [String] +formatText n = map unwords . cutAt n [] + where + cutAt :: Int -> [String] -> [String] -> [[String]] + cutAt m wds [] = [reverse wds] + cutAt m wds (wd:rest) = if len <= m || null wds + then cutAt (m-(len+1)) (wd:wds) rest + else reverse wds : cutAt n [] (wd:rest) + where len = length wd + + + diff --git a/testsuite/tests/programs/andy_cherry/Interp.hs b/testsuite/tests/programs/andy_cherry/Interp.hs new file mode 100644 index 0000000000..7d33e896cf --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/Interp.hs @@ -0,0 +1,262 @@ + + + module Interp (runInterp) where + + import GenUtils + import DataTypes + import InterpUtils + import Parser (pgnLexer) + + + + runInterp :: AbsGame -> RealGame + runInterp (Game tags toks) = Game tags (pgnInterp toks initParState) + + + + initParState = (FirstBoard startBoard) + + type Par a = StoreBoard -> a + thenP :: Par a -> (a -> Par b) -> Par b + returnP :: a -> Par a + + returnP a = \s -> a + thenP m k s = case m s of + r -> k r s + + failP a = \s -> error a + consP q rest = \s -> q : pgnInterp rest s + thenP' :: Par StoreBoard -> Par a -> Par a + thenP' m k s = case m s of + r -> k r + newGameP :: Par a -> Par a + newGameP m = \ _ -> m initParState + + getCurrColour :: Par Colour + getCurrColour = + getBoard `thenP` \ (Board _ (MoveNumber _ col) _) -> + returnP col + + checkColour :: MoveNumber -> Par () + checkColour (MoveNumber i col) = + getBoard `thenP` \ (Board _ (MoveNumber i' col') _) -> + if i == i' && col == col' + then returnP () + else failP ("number mis-match: " + ++ userFormat (MoveNumber i col) + ++ " (looking for " + ++ userFormat (MoveNumber i' col') + ++ ")\n") + + + + data StoreBoard + = FirstBoard Board + | UndoableBoard Board {- new -} Board {- back one -} + + updateBoard :: Board -> Par StoreBoard + updateBoard brd (FirstBoard old_brd) + = UndoableBoard brd old_brd + updateBoard brd (UndoableBoard old_brd _) + = UndoableBoard brd old_brd + + getBoard :: Par Board + getBoard s@(FirstBoard brd) + = brd + getBoard s@(UndoableBoard brd _) + = brd + + undoBoard :: Par StoreBoard + undoBoard (FirstBoard _) + = error "Incorrect start to some analysis" + undoBoard (UndoableBoard _ old_brd) + = FirstBoard old_brd + + + + pgnInterp :: [Token] -> Par [Quantum] + pgnInterp (IntToken n:PeriodToken:PeriodToken:PeriodToken:rest) = + checkColour (MoveNumber n Black) `thenP` \ () -> + pgnInterp rest + pgnInterp (IntToken n:PeriodToken:rest) = + checkColour (MoveNumber n White) `thenP` \ () -> + pgnInterp rest + + pgnInterp (SymbolToken str:CommentToken (ann:rs):r) + | all (flip elem "!?") ann = + pgnInterp (SymbolToken str:pgnLexer ann ++ (CommentToken rs:r)) + + + + + pgnInterp (CommentToken (n:tag:rest):r) + | head tag == '(' && take 2 (reverse tag) == ":)" && length rest > 1 = + getCurrColour `thenP` \ col -> + let + invert Black r = r -- because the move has *already* happend + invert _ "0.00" = "0.00" -- dont negate 0 + invert _ ('-':r) = r + invert _ r = '-':r + in + pgnInterp (LeftRBToken:map SymbolToken (take (length rest-1) rest) + ++ [CommentToken ["Score:",invert col n],RightRBToken] ++ r) + + + pgnInterp (CommentToken []:rest) = pgnInterp rest + pgnInterp (CommentToken comm:rest) = + consP (QuantumComment comm) rest + pgnInterp (NAGToken nag:rest) = + consP (QuantumNAG nag) rest + pgnInterp (NAGAnnToken nag _:rest) = + consP (QuantumNAG nag) rest + pgnInterp (SymbolToken "0-1":rest) = + consP (QuantumResult "0-1") rest + pgnInterp (SymbolToken "1-0":rest) = + consP (QuantumResult "1-0") rest + pgnInterp (SymbolToken "1/2-1/2":rest) = + consP (QuantumResult "1/2-1/2") rest + pgnInterp (AsterixToken:rest) = + consP (QuantumResult "*") rest + pgnInterp (SymbolToken move:rest@(NAGAnnToken _ str:_)) = + getBoard `thenP` \ brd -> + parseMove move brd `thenP` \ (mv,ch,corrMv,new_brd) -> + updateBoard new_brd `thenP'` + consP (QuantumMove mv ch str new_brd) rest + pgnInterp (SymbolToken move:rest) = + getBoard `thenP` \ brd -> + parseMove move brd `thenP` \ (mv,ch,corrMv,new_brd) -> + updateBoard new_brd `thenP'` + consP (QuantumMove mv ch "" new_brd) rest + pgnInterp (LeftRBToken:rest) = + getAnalysis rest 0 [] `thenP` \ (anal,rest) -> + (undoBoard `thenP'` + pgnInterp anal) `thenP` \ anal' -> + consP (QuantumAnalysis anal') rest + pgnInterp [] = returnP [] + pgnInterp toks = failP ("when reading: " + ++ unwords (map userFormat (take 10 toks))) + + + + getAnalysis (t@LeftRBToken:r) n anal = getAnalysis r (n+1) (t:anal) + getAnalysis (t@RightRBToken:r) n anal + | n == (0 :: Int) = returnP (reverse anal,r) + | otherwise = getAnalysis r (n-1) (t:anal) + getAnalysis (t:r) n anal = getAnalysis r n (t:anal) + getAnalysis [] n anal = failP "no closing ')'" + + + + + parseMove :: String -> Board -> Par (String,String,String,Board) + parseMove move brd@(Board _ (MoveNumber _ col) _) = + case mapMaybeFail charToMoveTok move of + Nothing -> failP ("strange move:" ++ move) + Just mv_toks -> + let + (chs,mv_toks') = getChecks (reverse mv_toks) + (queen,mv_toks'') = getQueen mv_toks' + in + case parseAlgMove mv_toks'' queen brd of + (the_mv,new_brd) -> returnP (the_mv,chs,"$$",new_brd) + + + + parseAlgMove + :: [MoveTok] + -> Maybe Piece + -> Board + -> (String,Board) + parseAlgMove [PartCastleTok,MoveToTok,PartCastleTok] Nothing + = findCastleKMove + parseAlgMove [PartCastleTok,MoveToTok,PartCastleTok, + MoveToTok,PartCastleTok] Nothing + = findCastleQMove + + parseAlgMove (PieceTok King:r) Nothing = parsePieceMove r King + parseAlgMove (PieceTok Queen:r) Nothing = parsePieceMove r Queen + parseAlgMove (PieceTok Rook:r) Nothing = parsePieceMove r Rook + parseAlgMove (PieceTok Knight:r) Nothing = parsePieceMove r Knight + parseAlgMove (PieceTok Bishop:r) Nothing = parsePieceMove r Bishop + + + + parseAlgMove [FileTok sf,RankTok sr,MoveToTok,FileTok df,RankTok dr] q = + findAPawnMove (extendBP (sf,sr)) (extendBP (df,dr)) q + parseAlgMove [FileTok sf,RankTok sr,CaptureTok,FileTok df,RankTok dr] q = + findAPawnMove (extendBP (sf,sr)) (extendBP (df,dr)) q + + + + parseAlgMove [FileTok sf,RankTok sr,FileTok df,RankTok dr] q = \ brd -> + case lookupBoardPiece brd (sf,sr) of + Nothing -> error ("cant find piece at: " ++ userFormatBoardPos (sf,sr)) + Just Pawn -> findAPawnMove (extendBP (sf,sr)) (extendBP (df,dr)) q brd + Just King | sf == 5 && df == 7 -> findCastleKMove brd + Just King | sf == 5 && df == 3 -> findCastleQMove brd + Just p -> findAMove p (extendBP (sf,sr)) (extendBP (df,dr)) brd + + -- later ! + + + + parseAlgMove [FileTok df,RankTok dr] q = + findAPawnMove (Nothing,Nothing) (extendBP (df,dr)) q + + + + parseAlgMove [FileTok sf,CaptureTok,FileTok df,RankTok dr] q = + findAPawnMove (Just sf,Nothing) (extendBP (df,dr)) q + + + + parseAlgMove [FileTok sf,FileTok df] q = + findAPawnMove (Just sf,Nothing) (Just df,Nothing) q + + + + parseAlgMove [FileTok sf,CaptureTok,FileTok df] q = + findAPawnMove (Just sf,Nothing) (Just df,Nothing) q + parseAlgMove _ _ = error "!>!" + + + + parsePieceMove [FileTok df,RankTok dr] p + = findAMove p (Nothing,Nothing) (extendBP (df,dr)) + + + + parsePieceMove [CaptureTok,FileTok df,RankTok dr] p + = findAMove p (Nothing,Nothing) (extendBP (df,dr)) + + + + parsePieceMove [RankTok sr,FileTok df,RankTok dr] p + = findAMove p (Nothing,Just sr) (extendBP (df,dr)) + parsePieceMove [RankTok sr,CaptureTok,FileTok df,RankTok dr] p + = findAMove p (Nothing,Just sr) (extendBP (df,dr)) + + + + parsePieceMove [FileTok sf,FileTok df,RankTok dr] p + = findAMove p (Just sf,Nothing) (extendBP (df,dr)) + parsePieceMove [FileTok sf,CaptureTok,FileTok df,RankTok dr] p + = findAMove p (Just sf,Nothing) (extendBP (df,dr)) + + + + parsePieceMove [FileTok sf,RankTok sr,MoveToTok,FileTok df,RankTok dr] p + = findAMove p (extendBP (sf,sr)) (extendBP (df,dr)) + parsePieceMove [FileTok sf,RankTok sr,CaptureTok,FileTok df,RankTok dr] p + = findAMove p (extendBP (sf,sr)) (extendBP (df,dr)) + parsePieceMove _ p = failP ("syntax error in move:") + + getChecks (CheckTok:CheckTok:r) = ("#",r) + getChecks (CheckTok:r) = ("+",r) + getChecks (MateTok:r) = ("#",r) + getChecks r = ("",r) + + getQueen (PieceTok p:QueensWith:r) = (Just p,reverse r) + getQueen r = (Nothing,reverse r) + + diff --git a/testsuite/tests/programs/andy_cherry/InterpUtils.hs b/testsuite/tests/programs/andy_cherry/InterpUtils.hs new file mode 100644 index 0000000000..820163e8fd --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/InterpUtils.hs @@ -0,0 +1,371 @@ + + module InterpUtils where + + import GenUtils + import DataTypes + import Data.Array -- 1.3 + + + + + + findCastleKMove brd = (castleK,makeACastleK brd) + findCastleQMove brd = (castleQ,makeACastleQ brd) + + findAPawnMove + :: ExBoardPos + -> ExBoardPos + -> Maybe Piece + -> Board + -> (String,Board) + + + + + + findAPawnMove move_src move_dest queen brd@(Board arr mv _) + = debug (move_txt,new_brd) + where + + move_colour = getMoveColour mv + + debug = {- trace ( + {- userFormat brd ++ -} + userFormat (getMoveColour mv) ++ + -- " (" ++ userFormat absmove ++ ")" ++ + "\nALL :" ++ unwords (map userFormat all_moves) ++ + "\n") -} id + + + + + correct_src = concat (map (getAllMovesFor brd) currPieces) + + currPieces = + [ (Pawn,x,y) | + (x,y) <- start_range, + r <- [arr ! (x,y)], + lookupSquare move_colour r == Friendly, + (Just Pawn) <- [getSquarePiece r]] + + + + start_range + = case (move_src,move_dest) of + ((Just f,Just r),_) -> [(f,r)] + ((Just f,_),_) -> [(f,r) | r <- [2..7]] + -- no capture ! + (_,(Just f,_)) -> [(f,r) | r <- [2..7]] + _ -> error "strange pawn move:" + + the_correct_move = if (length correct_move /= 1) + then error ("\nAmbiguous move:" + ++ show (unwords (map userFormat correct_move)) + ++ ":" ++ {- userFormat absmove ++ -} "\n" + ++ userFormat brd) + else head correct_move + + correct_move = + filter (sameQueening queen.extractSpecialFromPlayMove) + (filter (compExBPandBP move_dest.extractDestFromPlayMove) + correct_src) + sameQueening (Just p) (Queening p') = p == p' + sameQueening Nothing (Queening p') = Queen == p' + sameQueening _ _ = True + + move_txt = createShortMove the_correct_move "" brd + corr_txt = + userFormatBoardPos + (extractSrcFromPlayMove the_correct_move) ++ + userFormatBoardPos + (extractDestFromPlayMove the_correct_move) + {- queening ?? -} + new_brd = makeAMove brd the_correct_move + + + + + + findAMove + :: Piece + -> ExBoardPos + -> ExBoardPos + -> Board + -> (String,Board) + + findAMove move_piece move_src move_dest brd@(Board arr mv _) + = debug (move_txt,new_brd) + where + + + + move_colour = getMoveColour mv + + debug = {- trace ( + {- userFormat brd ++ -} + userFormat (getMoveColour mv) ++ + " (" ++ {- userFormat absmove ++ -} ")" ++ + "\nALL :" ++ unwords (map userFormat all_moves) ++ + "\nDEST :" ++ unwords (map userFormat correct_dest) ++ + "\nSRC :" ++ unwords (map userFormat correct_move) ++ + "\n") -} id + + + + + + all_moves = allValidMoves brd move_piece (const True) + + + + correct_dest = filter + (compExBPandBP move_dest.extractDestFromPlayMove) + all_moves + correct_move = filter + (compExBPandBP move_src.extractSrcFromPlayMove) + correct_dest + the_correct_move = if (length correct_move /= 1) + then error ("\nAmbiguous move:" + ++ show (unwords (map userFormat correct_move)) + ++ ":" {- ++ userFormat absmove -} ++ "\n" + ++ userFormat brd) + else head correct_move + disamb = case move_dest of + (Just _,Nothing) -> "" -- fg => fxg4, no disambig. + _ -> disAmb + (extractSrcFromPlayMove the_correct_move) + (map (extractSrcFromPlayMove) correct_dest) + + move_txt = createShortMove the_correct_move disamb brd + corr_txt = + userFormatBoardPos + (extractSrcFromPlayMove the_correct_move) ++ + userFormatBoardPos + (extractDestFromPlayMove the_correct_move) + {- queening -} + new_brd = makeAMove brd the_correct_move + --partain: findAMove _ _ _ brd = error ("strange move: ") + + allValidMoves :: Board -> Piece -> (ChessFile -> Bool) -> [PlayMove] + allValidMoves brd piece corr_file + = concat (map (getAllMovesFor brd) (getCurrPieces brd piece corr_file)) + + getCurrPieces + :: Board + -> Piece + -> (ChessFile -> Bool) + -> [(Piece,ChessFile,ChessRank)] + getCurrPieces (Board arr (MoveNumber _ col) _) pc corr_file = + [ (p,x,y) | + ((x,y), r) <- assocs arr, + lookupSquare col r == Friendly, + (Just p) <- [getSquarePiece r], + p == pc, + corr_file x + ] + + + + + + + getAllMovesFor :: Board -> (Piece,Int,Int) -> [PlayMove] + + + + getAllMovesFor brd (Rook,x,y) = + [ mkPlayMove Rook (x,y) (x',y') + | (x',y') <- ( + movePiece 0 1 brd x y ++ + movePiece 0 (-1) brd x y ++ + movePiece 1 0 brd x y ++ + movePiece (-1) 0 brd x y) ] + getAllMovesFor brd (Bishop,x,y) = + [ mkPlayMove Bishop (x,y) (x',y') + | (x',y') <- ( + movePiece 1 1 brd x y ++ + movePiece 1 (-1) brd x y ++ + movePiece (-1) 1 brd x y ++ + movePiece (-1) (-1) brd x y) ] + getAllMovesFor brd (Queen,x,y) = + [ mkPlayMove Queen (x,y) (x',y') + | (x',y') <- ( + movePiece 0 1 brd x y ++ + movePiece 0 (-1) brd x y ++ + movePiece 1 0 brd x y ++ + movePiece (-1) 0 brd x y ++ + movePiece 1 1 brd x y ++ + movePiece 1 (-1) brd x y ++ + movePiece (-1) 1 brd x y ++ + movePiece (-1) (-1) brd x y) ] + + + + getAllMovesFor brd (Knight,x,y) = + [ mkPlayMove Knight (x,y) (x',y') + | (xd,yd) <- concat + [ [(d1,d2 * 2),(d1 * 2,d2)] + | d1 <- [1,-1], d2 <- [1,-1]], + x' <- [xd + x], + y' <- [yd + y], + case lookupBoard brd (x',y') of + Vacant -> True + Friendly -> False + Baddy -> True + OffBoard -> False] + + getAllMovesFor brd (King,x,y) = + [ mkPlayMove King (x,y) (x',y') + | (xd,yd) <- [(1,1),(1,0),(1,-1),(0,1), + (0,-1),(-1,1),(-1,0),(-1,-1)], + x' <- [xd + x], + y' <- [yd + y], + case lookupBoard brd (x',y') of + Vacant -> True + Friendly -> False + Baddy -> True + OffBoard -> False] + + + + + getAllMovesFor brd@(Board _ (MoveNumber _ col) may_ep) (Pawn,x,y) + = real_pawn_moves + where + pawn_moves = + case lookupBoard brd (x,y+del) of + Friendly -> [] + Baddy -> [] + Vacant -> (mkPlayMove Pawn (x,y) (x,y+del) : + if y /= sta then [] else + case lookupBoard brd (x,y+del*2) of + Friendly -> [] + Baddy -> [] + Vacant -> + [ PlayMove Pawn (x,y) (x,y+del*2) BigPawnMove]) + left_pc = case lookupBoard brd (x-1,y+del) of + Baddy -> [mkPlayMove Pawn (x,y) (x-1,y+del) ] + _ -> [] + right_pc = case lookupBoard brd (x+1,y+del) of + Baddy -> [mkPlayMove Pawn (x,y) (x+1,y+del) ] + _ -> [] + all_pawn_moves = pawn_moves ++ left_pc ++ right_pc + real_pawn_moves = en_passant ++ + (if y + del == qn -- if can queens + then concat [ let fn = PlayMove Pawn f t . Queening + in + [ fn Queen, + fn Rook, + fn Bishop, + fn Knight ] + | PlayMove _ f t _ <- all_pawn_moves ] + else all_pawn_moves) + en_passant = + case (y == ep,may_ep) of + (True,Just f) | f == x+1 || f == x-1 + -> [PlayMove Pawn (x,y) (f,y+del) EnPassant] + _ -> [] + del,sta,qn,ep :: Int + (del,sta,qn,ep) -- delta (direction), start, Queening and E.P. Rank + = case col of + White -> (1,2,8,5) + Black -> (-1,7,1,4) + + movePiece xd yd brd x y = + case lookupBoard brd (x',y') of + OffBoard -> [] + Friendly -> [] + Baddy -> [(x',y')] + Vacant -> (x',y') : movePiece xd yd brd x' y' + where + x' = x + xd + y' = y + yd + + + + + makeAMove :: Board -> PlayMove -> Board + makeAMove board@(Board brd mv@(MoveNumber _ col) _) + move@(PlayMove piece pos pos' NothingSpecial) = + Board (brd // [ pos =: VacantSq, + pos' =: mkColBoardSq col piece ]) + (incMove mv) Nothing + makeAMove board@(Board brd mv@(MoveNumber _ col) _) + move@(PlayMove piece pos@(f,_) pos' BigPawnMove) = + Board (brd // [ pos =: VacantSq, + pos' =: mkColBoardSq col piece ]) + (incMove mv) (Just f) + makeAMove board@(Board brd mv@(MoveNumber _ col) _) + move@(PlayMove piece pos@(f,_) pos' (Queening q)) = + Board (brd // [ pos =: VacantSq, + pos' =: mkColBoardSq col q]) + (incMove mv) (Just f) + makeAMove board@(Board brd mv@(MoveNumber _ col) _) -- ASSERT ? + move@(PlayMove piece (f,_) (f',_) EnPassant) = + Board (brd // [ (f,st) =: VacantSq, + (f',fn) =: mkColBoardSq col Pawn, + (f',st) =: VacantSq ]) + (incMove mv) Nothing + where (st,fn) = case col of + White -> (5,6) + Black -> (4,3) + + makeACastleK (Board brd mv@(MoveNumber _ White) _) = + Board (brd // + [ (5,1) =: VacantSq, + (6,1) =: mkColBoardSq White Rook, + (7,1) =: mkColBoardSq White King, + (8,1) =: VacantSq ]) (incMove mv) Nothing + makeACastleK (Board brd mv@(MoveNumber _ Black) _) = + + Board (brd // + [ (5,8) =: VacantSq, + (6,8) =: mkColBoardSq Black Rook, + (7,8) =: mkColBoardSq Black King, + (8,8) =: VacantSq ]) (incMove mv) Nothing + makeACastleQ (Board brd mv@(MoveNumber _ White) _) = + Board (brd // + [ (5,1) =: VacantSq, + (4,1) =: mkColBoardSq White Rook, + (3,1) =: mkColBoardSq White King, + (1,1) =: VacantSq ]) (incMove mv) Nothing + makeACastleQ (Board brd mv@(MoveNumber _ Black) _) = + Board (brd // + [ (5,8) =: VacantSq, + (4,8) =: mkColBoardSq Black Rook, + (3,8) =: mkColBoardSq Black King, + (1,8) =: VacantSq ]) (incMove mv) Nothing + + disAmb _ [_] = "" + disAmb (a,b) t@[(n,m),(x,y)] + | n == x = userFormatRank b + | otherwise = userFormatFile a + disAmb src lst = error ("PANIC: cant disambiguate: " ++ show src ++ show lst) + + createShortMove :: PlayMove -> String -> Board -> String + createShortMove (PlayMove Pawn (f,r) dest q) "" brd = + (if lookupBoard brd dest == Baddy || EnPassant == q + then userFormatFile f ++ "x" ++ userFormatBoardPos dest + else userFormatBoardPos dest) ++ + case q of + Queening p -> "=" ++ userFormat p + _ -> "" + createShortMove (PlayMove p _ dest _) extra brd = + userFormat p ++ extra ++ capt ++ userFormatBoardPos dest + where + capt = if lookupBoard brd dest == Baddy + then "x" + else "" + + getEPStart :: Colour -> ChessFile + getEPStart White = 5 + getEPStart Black = 4 + + getEPEnd :: Colour -> ChessFile + getEPEnd White = 6 + getEPEnd Black = 3 + + getHomeRank :: Colour -> ChessRank + getHomeRank White = 1 + getHomeRank Black = 8 + diff --git a/testsuite/tests/programs/andy_cherry/Main.hs b/testsuite/tests/programs/andy_cherry/Main.hs new file mode 100644 index 0000000000..aa4274ec59 --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/Main.hs @@ -0,0 +1,204 @@ + + module Main (main) where + + import GenUtils + import DataTypes + import Parser + import Interp + import PrintTEX + + import System.Environment -- 1.3 (partain) + import Data.Char -- 1.3 + + --fakeArgs = "game001.txt" + --fakeArgs = "pca2.pgn" + --fakeArgs = "silly.pgn" + --fakeArgs = "small.pgn" + --fakeArgs = "sicil.pgn" + --fakeArgs = "badgame.pgn" + --fakeArgs = "mycgames.pgn" + fakeArgs = "rab.pgn" + + version = "0.3" + + + main = do + [test_dir] <- getArgs + let (style,fn,filename) = interpArgs (words "-d tex mygames.pgn") + file <- readFile (test_dir ++ "/" ++filename) + std_in <- getContents + let games = pgnParser fn file -- parse relavent pgn games + putStr (prog style std_in games) + +{- OLD 1.2: + main = + getArgs abort $ \ args -> + --let args = (words "-d tex analgames.pgn") in + let (style,fn,filename) = interpArgs args in + readFile filename abort $ \ file -> + readChan stdin abort $ \ std_in -> + let games = pgnParser fn file -- parse relavent pgn games + in + appendChan stdout (prog style std_in games) abort done +-} + + interpArgs :: [String] -> (OutputStyle,Int -> Bool,String) + --interpArgs [] = (ViewGame,const True,fakeArgs) + interpArgs [] = interpArgs (words "-d pgn analgames.pgn") + interpArgs files = interpArgs' OutputPGN (const True) files + + interpArgs' style fn ("-d":"pgn":xs) = interpArgs' OutputPGN fn xs + interpArgs' style fn ("-d":"rawpgn":xs) = interpArgs' OutputRawPGN fn xs + interpArgs' style fn ("-d":"play":xs) = interpArgs' ViewGame fn xs + interpArgs' style fn ("-d":"parser":xs) = interpArgs' OutputParser fn xs + interpArgs' style fn ("-d":"tex":xs) = interpArgs' OutputTEX fn xs + interpArgs' style fn ("-d":"head":xs) = interpArgs' OutputHeader fn xs + interpArgs' style fn ("-g":range:xs) + = interpArgs' style (changeFn (parse range)) xs + where + changeFn (Digit n:Line:Digit m:r) x = moreChangeFn r x || x >= n && x <= m + changeFn (Line:Digit m:r) x = moreChangeFn r x || x <= m + changeFn (Digit n:Line:r) x = moreChangeFn r x || x >= n + changeFn (Digit n:r) x = moreChangeFn r x || x == n + changeFn _ _ = rangeError + moreChangeFn [] = const False + moreChangeFn (Comma:r) = changeFn r + moreChangeFn _ = rangeError + parse xs@(n:_) + | isDigit n = case span isDigit xs of + (dig,rest) -> Digit (read dig) : parse rest + parse ('-':r) = Line : parse r + parse (',':r) = Comma : parse r + parse [] = [] + parse _ = rangeError + rangeError = error ("incorrect -g option (" ++ range ++ ")\n") + + interpArgs' style fn [file] = (style,fn,file) + interpArgs' style fn args = error ("bad args: " ++ unwords args) + + data Tok + = Digit Int -- n + | Line -- - + | Comma -- , + + data OutputStyle + + = OutputPGN -- pgn + | OutputRawPGN -- rawpgn + | OutputHeader -- header + | ViewGame -- play + | ViewGameEmacs -- emacs + | TwoColumn -- 2col + | TestGames -- test + | OutputTEX + + + + | OutputParser -- simply dump out the string read in. + | CmpGen -- cmp 2nd and 3rd generations of output + + + + prog :: OutputStyle -- style of action + -> String -- stdin (for interactive bits) + -> [AbsGame] -- input games + -> String -- result + prog OutputPGN _ + = pgnPrinter True -- print out game(s) + . map runInterp -- interprete all games + prog OutputRawPGN _ + = pgnPrinter False -- print out game(s) + . map runInterp -- interprete all games + prog OutputHeader _ + = pgnHeadPrinter -- print out game(s) headers + . map runInterp -- interprete all games + prog OutputTEX _ + = texPrinter -- print out game(s) + . map runInterp -- interprete all games + prog ViewGame std_in + = interactViewer std_in -- print out game(s) + . runInterp -- interprete the game + . head -- should check for only *one* object + prog OutputParser _ + = userFormat + + + + + + + + + + type PrintState = (Bool,MoveNumber) + + pgnPrinter :: Bool -> [RealGame] -> String + pgnPrinter detail = unlines . concat . map printGame + where + printMoveNumber :: Bool -> MoveNumber -> String + printMoveNumber False (MoveNumber _ Black) = "" + printMoveNumber _ mvnum = userFormat mvnum ++ " " + + printQuantums :: PrintState -> [Quantum] -> [String] + printQuantums ps = concat . fst . mapAccumL printQuantum ps + + printQuantum :: PrintState -> Quantum -> ([String],PrintState) + printQuantum (pnt,mv) (QuantumMove move ch an brd) = + ([printMoveNumber pnt mv ++ move ++ ch],(False,incMove mv)) + printQuantum (pnt,mv) (QuantumNAG i) = + if detail + then (["$" ++ show i],(False,mv)) + else ([],(False,mv)) + printQuantum (pnt,mv) (QuantumComment comms) = + if detail + then ("{" : comms ++ ["}"],(True,mv)) + else ([],(False,mv)) + printQuantum (pnt,mv) (QuantumAnalysis anal) = + if detail + then ("(" : printQuantums (True,decMove mv) anal ++ [")"], + (True,mv)) + else ([],(False,mv)) + printQuantum (pnt,mv) (QuantumResult str) = ([str],(True,mv)) + printQuantum _ _ = error "PANIC: strange Quantum" + + printGame :: RealGame -> [String] + printGame (Game tags qu) = + [ userFormat tag | tag <- tags] ++ + formatText 75 (printQuantums (False,initMoveNumber) qu) + + + + printHeadGame :: RealGame -> [String] + printHeadGame (Game tags qu) = [ + rjustify 4 gameno ++ " " ++ + take 20 (rjustify 20 white) ++ " - " ++ + take 20 (ljustify 20 black) ++ " " ++ + take 26 (ljustify 28 site) ++ " " ++ result ] + where + (date,site,game_no,res,white,black,opening) = getHeaderInfo tags + gameno = case game_no of + Nothing -> "" + Just n -> show n + result = userFormat res + + pgnHeadPrinter :: [RealGame] -> String + pgnHeadPrinter = unlines . concat . map printHeadGame + + + + + + interactViewer :: String -> RealGame -> String + interactViewer stdin (Game tags qu) = replayQ qu (lines stdin) + + replayQ (QuantumMove _ _ _ brd:rest) std_in + = "\027[H" ++ userFormat brd ++ waitQ rest std_in + replayQ (_:rest) std_in = replayQ rest std_in + replayQ [] _ = [] + + waitQ game std_in = ">>" ++ + (case std_in of + [] -> "" + (q:qs) -> replayQ game qs) + + diff --git a/testsuite/tests/programs/andy_cherry/Makefile b/testsuite/tests/programs/andy_cherry/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/andy_cherry/Parser.hs b/testsuite/tests/programs/andy_cherry/Parser.hs new file mode 100644 index 0000000000..6dddb64a0e --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/Parser.hs @@ -0,0 +1,98 @@ + + module Parser (pgnLexer,pgnParser) where + + import GenUtils + import DataTypes + import Data.Char -- 1.3 + + + + pgnLexer :: String -> [Token] + pgnLexer ('.':r) = PeriodToken : pgnLexer r + pgnLexer ('*':r) = AsterixToken : pgnLexer r + pgnLexer ('[':r) = LeftSBToken : pgnLexer r + pgnLexer (']':r) = RightSBToken : pgnLexer r + pgnLexer ('(':r) = LeftRBToken : pgnLexer r + pgnLexer (')':r) = RightRBToken : pgnLexer r + pgnLexer ('<':r) = LeftABToken : pgnLexer r + pgnLexer ('>':r) = RightABToken : pgnLexer r + pgnLexer ('"':r) = readString r "" + pgnLexer ('{':r) = readComment r "" + pgnLexer ('$':r) = readNAG r "" + pgnLexer ('!':'?':r) = mkNAGToken 5 : pgnLexer r + pgnLexer ('!':'!':r) = mkNAGToken 3 : pgnLexer r + pgnLexer ('!':r) = mkNAGToken 1 : pgnLexer r + pgnLexer ('?':'?':r) = mkNAGToken 4 : pgnLexer r + pgnLexer ('?':'!':r) = mkNAGToken 6 : pgnLexer r + pgnLexer ('?':r) = mkNAGToken 2 : pgnLexer r + pgnLexer ('%':r) = pgnLexer (dropWhile (/= '\n') r) + pgnLexer (c:r) + | isSpace c = pgnLexer r + | isAlpha c || isDigit c = pgnSymbolLexer r [c] + | otherwise = error ("Error lexing: " ++ takeWhile (/= '\n') (c:r)) + pgnLexer [] = [] + + pgnSymbolLexer (c:r) sym + | isAlpha c + || isDigit c + || elem c "_+#=:-/" = pgnSymbolLexer r (c:sym) + pgnSymbolLexer r sym + | all isDigit sym = IntToken (read (reverse sym)) : pgnLexer r + pgnSymbolLexer r sym = SymbolToken (reverse sym) : pgnLexer r + + readString ('\\':'\\':r) str = readString r ('\\':str) + readString ('\\':'"':r) str = readString r ('"':str) + readString ('"':r) str = StringToken (reverse str) : pgnLexer r + readString (c:r) str = readString r (c:str) + + readComment ('}':r) str = CommentToken (revwords str []) : pgnLexer r + readComment (c:r) str = readComment r (c:str) + + revwords (c:r) wds + | isSpace c = revwords r wds + | otherwise = revwords' r [c] wds + revwords [] wds = wds + revwords' (c:r) wd wds + | isSpace c = revwords r (wd:wds) + | otherwise = revwords' r (c:wd) wds + revwords' [] wd wds = wd : wds + + readNAG (c:r) str + | isDigit c = readNAG r (c:str) + readNAG r str = mkNAGToken (read (reverse str)) : pgnLexer r + + mkNAGToken 1 = NAGAnnToken 1 "!" + mkNAGToken 2 = NAGAnnToken 2 "?" + mkNAGToken 3 = NAGAnnToken 3 "!!" + mkNAGToken 4 = NAGAnnToken 4 "??" + mkNAGToken 5 = NAGAnnToken 5 "!?" + mkNAGToken 6 = NAGAnnToken 6 "?!" + mkNAGToken n = NAGToken n + + + + + pgnParser :: (Int -> Bool) -> String -> [AbsGame] + pgnParser fn str = + [ game | (no,game) <- zip [1..] (parseTags (pgnLexer str) id), + fn no] + + type FL a = [a] -> [a] + + parseTags :: [Token] -> FL TagStr -> [AbsGame] + parseTags (LeftSBToken:SymbolToken sym:StringToken str:RightSBToken:rest) + other_tags = parseTags rest (other_tags . ((:) (TagStr sym str))) + parseTags toks@(LeftSBToken:_) _ + = error ("BAD Token:" ++ unwords (map userFormat (take 10 toks))) + parseTags toks tags = parseToks toks id tags + + parseToks :: [Token] + -> FL Token + -> FL TagStr + -> [AbsGame] + parseToks next@(LeftSBToken:_) = \ toks tags -> + Game (tags []) (toks []) : parseTags next id + parseToks (tk:r) = pushToken tk r + parseToks [] = \ toks tags -> [Game (tags []) (toks [])] + + pushToken tok r toks = parseToks r (toks . ((:) tok)) diff --git a/testsuite/tests/programs/andy_cherry/PrintTEX.hs b/testsuite/tests/programs/andy_cherry/PrintTEX.hs new file mode 100644 index 0000000000..d8f253f6d4 --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/PrintTEX.hs @@ -0,0 +1,182 @@ + + module PrintTEX (texPrinter) where + + import GenUtils + import DataTypes + import Data.Array -- 1.3 + import Data.Char -- 1.3 + + + + + + + + splitUpQuantum :: [Quantum] -> [[Quantum]] + splitUpQuantum q = splitUpQuantums q [] + where + splitUpQuantums [] [] = [] + splitUpQuantums [] mvs = [reverse mvs] + splitUpQuantums (mv@(QuantumMove _ _ _ _):rest) mvs + = splitUpQuantums rest (mv:mvs) + splitUpQuantums (mv@(QuantumNAG _):rest) mvs + = splitUpQuantums rest mvs + splitUpQuantums (x:xs) [] = [x] : splitUpQuantums xs [] + splitUpQuantums (x:xs) mvs + = [reverse mvs,[x]] ++ splitUpQuantums xs [] + + type TeXState = + (Bool, -- if Top level ! + Board, -- current board + MoveNumber) -- the Current Move Number + + printTeXQuantums :: TeXState -> [Quantum] -> [String] + printTeXQuantums ps + = concat . fst . mapAccumL printTeXQuantum ps . splitUpQuantum + + printTeXQuantum :: TeXState -> [Quantum] -> ([String],TeXState) + printTeXQuantum state@(_,board,_) [QuantumComment ["\004"]] = + (mkTeXBoard board,state) + printTeXQuantum state@(_,board,_) [QuantumComment (('\004':comm):comms)] = + (mkTeXBoard board ++ formatText 70 (parseSquiggles (comm:comms)),state) + printTeXQuantum state [QuantumComment comms] = + (formatText 70 (parseSquiggles comms),state) + printTeXQuantum (pnt,brd,mv) [QuantumAnalysis anal] = + (printTeXQuantums (False,err,decMove mv) anal,(pnt,brd,mv)) + where err = error "Syntax error using ^D" + printTeXQuantum state@(_,board,_) [QuantumResult str] = + (mkTeXBoard board ++ [printTeXResult (mkResult str)],state) + printTeXQuantum state mvs@(QuantumMove _ _ _ _:_) = + printTeXMoves state mvs + printTeXQuantum _ _ = error "PANIC: strange Quantum" + + + parseSquiggles = map parseSquiggle + parseSquiggle ('<':'s':'a':'w':'>':r) = "\\wbetter{}" ++ r + parseSquiggle ('<':'a':'w':'>':r) = "\\wupperhand{}" ++ r + parseSquiggle ('<':'w':'a':'w':'>':r) = "\\wdecisive{}" ++ r + parseSquiggle ('<':'s':'a':'b':'>':r) = "\\bbetter{}" ++ r + parseSquiggle ('<':'a':'b':'>':r) = "\\bupperhand{}" ++ r + parseSquiggle ('<':'w':'a':'b':'>':r) = "\\bdecisive{}" ++ r + parseSquiggle wd = wd + + + printTeXResult :: Result -> String + printTeXResult Win = "$1\\!-\\!0$" + printTeXResult Loss = "$0\\!-\\!1$" + printTeXResult Draw = "${1 \\over 2}\\!-\\!{1 \\over 2}$" + printTeXResult Unknown = "$*$" + + printTeXMoves (tl,_,mv) mvs + = ([text],(True,brd,incMove last_mv_num)) + where + aux_mvs = zip3 mvs (iterate incMove mv) (False:repeat True) + + (QuantumMove _ _ _ brd,last_mv_num,_) = last aux_mvs + text = initText tl + ++ concat (fst (mapAccumL (pntMove tl) (mv,False) mvs)) + ++ endText tl + + initText False = + case mv of + MoveNumber i Black -> "|" ++ show i ++ "\\ldots~" + _ -> "|" + initText True = + "\\begin{center}|\n" ++ + "{\\bf" ++ + "\\begin{tabular}{rp{50pt}p{50pt}}\n" ++ + case mv of + MoveNumber i Black -> show i ++ " & \\ldots" + _ -> "" + + endText True = case getMoveColour last_mv_num of + White -> "&\\\\\n\\end{tabular}}|\n\\end{center}" + Black -> "\\end{tabular}}|\n\\end{center}" + endText False = "|" + + + + pntMove True (mv@(MoveNumber i White),bl) move + = (show i ++ " & " + ++ printableMove move, + (incMove mv,True)) + pntMove True (mv@(MoveNumber i Black),bl) move + = (" & " ++ printableMove move ++ "\\\\\n", + (incMove mv,True)) + pntMove False (mv@(MoveNumber i White),bl) move + = ((if bl then "; " else "") ++ show i ++ ".~" + ++ printableMove move, + (incMove mv,True)) + pntMove False (mv@(MoveNumber i Black),bl) move + = ((if bl then ", " else "") ++ printableMove move, + (incMove mv,True)) + + printableMove :: Quantum -> String + printableMove (QuantumMove move ch an _) = map fn move ++ rest + where + fn 'x' = '*' + fn 'O' = '0' + fn c = c + rest = case ch of + "#" -> an ++ " mate" + _ -> ch ++ an + + mkTeXBoard :: Board -> [String] + mkTeXBoard (Board arr _ _) = + ["\n\\board"] ++ + ["{" ++ [ fn ((x-y) `rem` 2 == 0) (arr ! (x,y)) | x <- [1..8]] ++ "}" + | y <- reverse [1..8]] ++ + ["$$\\showboard$$"] + where + fn _ (WhitesSq p) = head (userFormat p) + fn _ (BlacksSq p) = toLower (head (userFormat p)) + fn True VacantSq = '*' + fn False VacantSq = ' ' + + printTeXGame :: RealGame -> [String] + printTeXGame (Game tags qu) = [ + "\\clearpage", + "\\begin{center}", + "\\fbox{\\fbox{\\large\\begin{tabular}{l}", + ("Game " ++ gameno ++ " \\hspace{.3 in} " + ++ date + ++ " \\hspace{.3 in} " + ++ result + ++ "\\\\"), + "\\hline" ++ (if null opening then "" else "\n" ++ opening ++ "\\\\"), + "\\raisebox{2.5pt}[11pt]{\\framebox[11pt]{\\rule{0pt}{4.25pt}}} " + ++ white ++ "\\\\", + "\\rule[-1pt]{11pt}{11pt} "++ black ++ "\\\\", + site, + "\\end{tabular}}}", + "\\end{center}"] ++ + (printTeXQuantums (True,startBoard,initMoveNumber) qu) + where + (date,site,game_no,res,white,black,opening) = getHeaderInfo tags + gameno = case game_no of + Nothing -> "" + Just n -> show n + result = printTeXResult res + + texPrinter :: [RealGame] -> String + texPrinter games = + texHeader + ++ (unlines(concat(map printTeXGame games))) + ++ texFooter + + texHeader = + "\\documentstyle[twocolumn,a4wide,chess]{article}\n" ++ + "\\textwidth 7.0 in\n" ++ + "\\textheight 63\\baselineskip\n" ++ + "\\columnsep .4 in\n" ++ + "\\columnseprule .5 pt\n" ++ + "\\topmargin -0.5 in\n" ++ + "\\headheight 0 pt\n" ++ + "\\headsep 0 pt\n" ++ + "\\oddsidemargin -0.3 in\n" ++ + "\\font\\sc=cmcsc10\n\\pagestyle{empty}\n" ++ + "\\begin{document}\n\\thispagestyle{empty}\n\n" + + texFooter = "\n\\end{document}\n" + + diff --git a/testsuite/tests/programs/andy_cherry/andy_cherry.stdout b/testsuite/tests/programs/andy_cherry/andy_cherry.stdout new file mode 100644 index 0000000000..ef160b0325 --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/andy_cherry.stdout @@ -0,0 +1,7258 @@ +\documentstyle[twocolumn,a4wide,chess]{article} +\textwidth 7.0 in +\textheight 63\baselineskip +\columnsep .4 in +\columnseprule .5 pt +\topmargin -0.5 in +\headheight 0 pt +\headsep 0 pt +\oddsidemargin -0.3 in +\font\sc=cmcsc10 +\pagestyle{empty} +\begin{document} +\thispagestyle{empty} + +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Oct 1993 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C10\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} George Webb\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & Nf3 & d5\\ +2 & d4 & Nc6\\ +3 & Nc3 & Nf6\\ +\end{tabular}}| +\end{center} +|3\ldots~Bf5| +is more natural. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & e4?&\\ +\end{tabular}}| +\end{center} +|4.~Bf4| +is better. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & \ldots & e6?\\ +\end{tabular}}| +\end{center} +|4\ldots~d*e4; 5.~d5, e*f3; 6.~d*c6, Q*d1+; 7.~N*d1| +and black is a clear pawn up. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & e5 & Ne4\\ +\end{tabular}}| +\end{center} + +\board +{r*bqkb r} +{ppp *ppp} +{ *n*p* *} +{* *pP * } +{ * Pn* *} +{* N *N* } +{PPP* PPP} +{R BQKB*R} +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & N*e4?&\\ +\end{tabular}}| +\end{center} +Taking this knight looses a pawn +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & \ldots & d*e4\\ +7 & Nd2 & Q*d4\\ +8 & Nc4 & Q*d1+\\ +9 & K*d1 & Bd7\\ +\end{tabular}}| +\end{center} +|9\ldots~Bc5; 10.~f3, e*f3; 11.~g*f3, 0-0; 12.~Bd3| +White can get presure down the `g' file, but first needs to solve the +problem of the Bishop on c5 guarding g8. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & Bd2&\\ +\end{tabular}}| +\end{center} +|10.~Be3| +is better. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & \ldots & Bb4\\ +11 & c3 & Bc5\\ +12 & Ke1 & 0-0-0\\ +\end{tabular}}| +\end{center} +|12\ldots~b5; 13.~Ne3, B*e3; 14.~B*e3, N*e5| +wins a pawn, but black might have problems because of queenside +weaknesses. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & g3&\\ +\end{tabular}}| +\end{center} +|13.~Bg5, Be7; 14.~B*e7, N*e7; 15.~Rd1| +and white is starting to contest the `d' file. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & Rhf8\\ +14 & Bg2 & f5?\\ +\end{tabular}}| +\end{center} +black is throwing away a pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & e*f6 & g*f6\\ +\end{tabular}}| +\end{center} +|15\ldots~R*f6| +gives black more piece activity. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & B*e4&\\ +\end{tabular}}| +\end{center} +taking the weak pawn, and attacking h7. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & \ldots & e5?\\ +\end{tabular}}| +\end{center} +|16\ldots~Rh8| +is required to protect the weak h pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & B*h7&\\ +\end{tabular}}| +\end{center} + +\board +{ *kr r *} +{pppb* *B} +{ *n* p *} +{* b p * } +{ *N* * *} +{* P * P } +{PP B P P} +{R * K *R} +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & \ldots & f5\\ +\end{tabular}}| +\end{center} +|17\ldots~B*f2+; 18.~K*f2, Be6; 19.~N*e5, R*d2+; 20.~Ke1, R*b2| +winning material, and striping whites king of protection. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & b4 & Be6\\ +19 & b5&\\ +\end{tabular}}| +\end{center} +|19.~b*c5, B*c4| +and white has the two bishops. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & \ldots & B*c4\\ +20 & b*c6 & b*c6\\ +\end{tabular}}| +\end{center} +|20\ldots~B*f2+; 21.~K*f2, R*d2+; 22.~Ke1, Re2+; 23.~Kd1, b*c6; 24.~h4, Rd8+| +with a winning attack on whites exposed king. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & Rb1?&\\ +\end{tabular}}| +\end{center} +Throws away a pawn needlessly. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & \ldots & B*a2\\ +\end{tabular}}| +\end{center} +|21\ldots~B*f2+; 22.~K*f2, R*d2+; 23.~Ke1, R*a2| +winning two pawns rather than one. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & Rb2 & Bd5\\ +23 & Rg1 & e4\\ +\end{tabular}}| +\end{center} +|23\ldots~a5; 24.~h4, a4; 25.~Bh6, Bf3; 26.~Rd2, R*d2; 27.~B*d2| +is a better plan, with a dangerous passed `a' pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & Bh6? & Ba3\\ +\end{tabular}}| +\end{center} +|24\ldots~Rf7; 25.~Bg5, R*h7; 26.~B*d8, Ba3; 27.~Rd2, K*d8| +two bishops vs a rook, a difficult win for black. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & Rb1 & Rfe8?\\ +\end{tabular}}| +\end{center} +another missed opertunity. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & B*f5+ & Be6\\ +27 & Bg6 & Rh8\\ +28 & Be3&\\ +\end{tabular}}| +\end{center} + +\board +{ *kr * r} +{p p * * } +{ *p*b*B*} +{* * * * } +{ * *p* *} +{b P B P } +{ * * P P} +{*R* K R } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & \ldots & Rd3?\\ +\end{tabular}}| +\end{center} +|28\ldots~R*h2; 29.~B*e4, c5; 30.~Rb7, a5| +and black has a fighting chance +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & Bd4&\\ +\end{tabular}}| +\end{center} +|29.~B*e4, R*c3; 30.~Bd4, Rc4; 31.~B*h8, R*e4+| +and black is lost. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & \ldots & Bd5??\\ +30 & B*h8 & e3??\\ +31 & f3?&\\ +\end{tabular}}| +\end{center} +|31.~B*d3, e*f2+; 32.~K*f2, Bc5+; 33.~Bd4| +and white is two rooks up. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & \ldots & Rd2\\ +32 & Bf6 & Bb2\\ +33 & h4&\\ +\end{tabular}}| +\end{center} +|33.~Bf5+, Kb7; 34.~c4, B*c4; 35.~R*b2+, R*b2; 36.~B*b2| +winning. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & \ldots & Kb7\\ +34 & Bg5 & B*f3\\ +\end{tabular}}| +\end{center} +|34\ldots~Ba2; 35.~Bc2, B*b1; 36.~B*b1, Rh2; 37.~B*e3, B*c3+| +and black is just a bishop down in a pawn race. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +35 & B*e3 & Re2+\\ +36 & Kf1 & R*e3\\ +37 & Re1??&\\ +\end{tabular}}| +\end{center} +giving black a chance to equalize. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +37 & \ldots & Re2??\\ +\end{tabular}}| +\end{center} +Returning the complement. +|37\ldots~R*e1+; 38.~K*e1, B*c3+; 39.~Kf2, Bd4+; 40.~K*f3, B*g1| +and White still has the edge with 2 connected passed pawns, but black +has real chances. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +38 & R*e2&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{pkp * * } +{ *p* *B*} +{* * * * } +{ * * * P} +{* P *bP } +{ b *R* *} +{* * *KR } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Nov 1993 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C65\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Barry Dunne\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & Nf6\\ +4 & d3&\\ +\end{tabular}}| +\end{center} +|4.~0-0| +Ruy Lopez, Berlin Defence +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & \ldots & Be7\\ +\end{tabular}}| +\end{center} +|4\ldots~Bc5| +is better. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & 0-0&\\ +\end{tabular}}| +\end{center} +|5.~B*c6, d*c6; 6.~N*e5, Bd6; 7.~Nf3, 0-0; 8.~0-0, Be6| +and white is a pawn up, but black has a lead in development. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & \ldots & 0-0?\\ +\end{tabular}}| +\end{center} +|5\ldots~d6| +is needed to protect e5. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & Nc3&\\ +\end{tabular}}| +\end{center} +|6.~B*c6, d*c6; 7.~N*e5, Bd6; 8.~Nf3, Bg4; 9.~Be3| +and white is a clean pawn up. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & \ldots & b6?\\ +7 & a3 & Bb7\\ +8 & b4 & Nd4\\ +\end{tabular}}| +\end{center} + +\board +{r* q rk*} +{pbppbppp} +{ p * n *} +{*B* p * } +{ P nP* *} +{P NP*N* } +{ *P* PPP} +{R BQ*RK } +$$\showboard$$ +A bit ambitious. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & N*e5&\\ +\end{tabular}}| +\end{center} +|9.~N*d4, e*d4; 10.~Ne2, d5; 11.~e5, Nd7| +is whites best line. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & \ldots & N*b5\\ +\end{tabular}}| +\end{center} +|9\ldots~d5; 10.~Bb2, d*e4; 11.~d*e4, N*e4| +with equal chances. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & N*b5 & d5\\ +11 & Bb2 & d*e4\\ +12 & d*e4&\\ +\end{tabular}}| +\end{center} +|12.~f3| +is a better approach. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & \ldots & Q*d1\\ +13 & Ra*d1 & Bd6\\ +\end{tabular}}| +\end{center} + +\board +{r* * rk*} +{pbp *ppp} +{ p b n *} +{*N* N * } +{ P *P* *} +{P * * * } +{ BP* PPP} +{* *R*RK } +$$\showboard$$ +|13\ldots~B*e4; 14.~Nd7, B*c2; 15.~B*f6, g*f6; 16.~Rd2| +with a slight advantage for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & Nf3&\\ +\end{tabular}}| +\end{center} +|14.~N*d6, c*d6; 15.~R*d6, B*e4; 16.~c4, Rfd8; 17.~c5, b*c5; 18.~b*c5| +winning for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & \ldots & B*e4\\ +\end{tabular}}| +\end{center} +|14\ldots~N*e4| +is better. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & N*d6 & c*d6\\ +16 & B*f6 & g*f6\\ +17 & R*d6 & B*c2\\ +\end{tabular}}| +\end{center} +|17\ldots~B*f3; 18.~g*f3, Rac8; 19.~Rc1, Rc3; 20.~Rd3, R*d3; 21.~c*d3| +and whites passed pawn is a long way from queening. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & R*f6&\\ +\end{tabular}}| +\end{center} +|18.~Nd4, Ba4; 19.~R*f6, Rfd8; 20.~Rf4, Rd7; 21.~Re4| +a pawn up, but with chances for black, because of the powerful Bishop. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & Rfd8\\ +19 & Ne5 & Kg7\\ +\end{tabular}}| +\end{center} +|19\ldots~Bg6| +is better, defending the weak pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & R*f7+ & Kg8\\ +21 & Rc7&\\ +\end{tabular}}| +\end{center} +|21.~f4, a6; 22.~g3, Rd2; 23.~Rb7, b5| +and white should win. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & \ldots & Re8\\ +\end{tabular}}| +\end{center} +|21\ldots~Rdc8; 22.~Rb7, Be4; 23.~Rd7, Rc2; 24.~Rfd1| +with connected rooks for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & Re1&\\ +\end{tabular}}| +\end{center} +|22.~f4| +is better for protecting the knight. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & Rac8\\ +\end{tabular}}| +\end{center} +should have moved the `e' Rook. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & R*a7 & Bf5\\ +\end{tabular}}| +\end{center} +|23\ldots~Ra8!?| +planning to attack the weak `a' pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & f4 & Bg4\\ +\end{tabular}}| +\end{center} +|24\ldots~Rc2| +penatraiting the 7th. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & Kf2 & Rc2+\\ +26 & Kg3 & Re2\\ +27 & R*e2 & B*e2\\ +28 & Nc6?&\\ +\end{tabular}}| +\end{center} +where is that knight going ? +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & \ldots & Re3+\\ +29 & Kf2 & Re4\\ +\end{tabular}}| +\end{center} + +\board +{ * * *k*} +{R * * *p} +{ pN* * *} +{* * * * } +{ P *rP *} +{P * * * } +{ * *bKPP} +{* * * * } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & f5&\\ +\end{tabular}}| +\end{center} +|30.~Ne7+, Kf8; 31.~Nd5, Bd3; 32.~N*b6, Re7| +totally winning for white +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & Bg4\\ +31 & Ne7+&\\ +\end{tabular}}| +\end{center} +|31.~Kg3, h6; 32.~f6, Be6; 33.~Re7| +looking very good for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & \ldots & Kf8\\ +32 & f6 & Rf4+\\ +33 & Kg3 & Re4\\ +34 & h3&\\ +\end{tabular}}| +\end{center} +|34.~Nd5, Be6; 35.~N*b6, Rg4+; 36.~Kf3, Rg6; 37.~R*h7, R*f6+; 38.~Ke4| +and with 4 connected passed white will win. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +34 & \ldots & Bh5\\ +35 & Nd5 & b5\\ +36 & R*h7 & Bg6\\ +37 & Rh4&\\ +\end{tabular}}| +\end{center} +|37.~Rh8+, Kf7; 38.~Rb8, Bf5; 39.~R*b5, Be6; 40.~Rb7+, Kg6; 41.~Rg7+| +just look at whites advantage. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +37 & \ldots & R*h4\\ +38 & K*h4 & Be4\\ +39 & Nc3&\\ +\end{tabular}}| +\end{center} +|39.~Ne3, Kf7; 40.~Kg5, Bc6; 41.~g4, Be4; 42.~h4, Bd3; 43.~h5| +winning. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +39 & \ldots & Bc6\\ +\end{tabular}}| +\end{center} +|39\ldots~B*g2; 40.~N*b5, Kf7; 41.~Kg5, B*h3; 42.~Nd6+, Kg8; 43.~a4, Kh7| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +40 & g4 & Kf7\\ +41 & g5&\\ +\end{tabular}}| +\end{center} +|41.~Kg5, Kg8; 42.~h4, Bd7; 43.~h5, Kf7; 44.~Ne4, Kg8; 45.~Nd6| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +41 & \ldots & Kg6\\ +42 & Kg4? & Bd7+\\ +43 & Kf4 & B*h3\\ +44 & N*b5 & Bd7\\ +\end{tabular}}| +\end{center} +|44\ldots~Kf7; 45.~Nd6+, Ke6; 46.~f7, Ke7; 47.~g6, Kf8; 48.~a4, Kg7| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +45 & a4 & Bc6\\ +46 & Nc3 & Bd7\\ +47 & b5&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* *b* * } +{ * * Pk*} +{*P* * P } +{P* * K *} +{* N * * } +{ * * * *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Nov 1993 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo C65\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Rab Brown\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & Bc5\\ +4 & 0-0 & Nf6\\ +5 & Nc3 & d6\\ +6 & a3 & Ng4?\\ +7 & Qe1&\\ +\end{tabular}}| +\end{center} +|7.~h3| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & 0-0\\ +\end{tabular}}| +\end{center} + +\board +{r*bq rk*} +{ppp *ppp} +{ *np * *} +{*Bb p * } +{ * *P*n*} +{P N *N* } +{ PPP PPP} +{R B QRK } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & B*c6 & b*c6\\ +9 & b4 & Ba6\\ +10 & b*c5 & B*f1\\ +11 & K*f1&\\ +\end{tabular}}| +\end{center} +|11.~Q*f1, Qd7; 12.~Bb2, d*c5; 13.~d3, Rfb8; 14.~Rb1| +clearly winning for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & \ldots & Qf6\\ +\end{tabular}}| +\end{center} + +\board +{r* * rk*} +{p p *ppp} +{ *pp q *} +{* P p * } +{ * *P*n*} +{P N *N* } +{ *PP PPP} +{R B QK* } +$$\showboard$$ +|11\ldots~Rb8; 12.~Qe2, Qd7; 13.~Qa6, Ra8; 14.~h3, Nf6; 15.~d4, e*d4| +is a better plan. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & d3 & Qg6\\ +13 & Rb1&\\ +\end{tabular}}| +\end{center} +|13.~h3, Nh6| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & Qh5\\ +14 & Rb7&\\ +\end{tabular}}| +\end{center} +|14.~h3, Nf6; 15.~Rb7, Rfc8; 16.~Bg5, Qg6; 17.~Qe3, Ne8| +and white has a commanding lead. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & \ldots & N*h2+\\ +15 & N*h2 & Q*h2\\ +16 & R*c7 & Qh1+\\ +17 & Ke2 & Q*g2\\ +18 & R*c6&\\ +\end{tabular}}| +\end{center} +|18.~c*d6, Rfc8; 19.~R*c8+, R*c8; 20.~Be3, Rd8; 21.~Bc5, h5| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & d*c5\\ +\end{tabular}}| +\end{center} +|18\ldots~Qg4+; 19.~f3, Qg2+; 20.~Qf2, Q*f2+; 21.~K*f2, Rfc8; 22.~Nd5, R*c6; 23.~Ne7+| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & R*c5 & f5\\ +20 & Be3 & Qg4+\\ +21 & f3 & Qg2+\\ +22 & Qf2 & Qh1\\ +23 & R*e5 & Qa1\\ +\end{tabular}}| +\end{center} + +\board +{r* * rk*} +{p * * pp} +{ * * * *} +{* * Rp* } +{ * *P* *} +{P NPBP* } +{ *P*KQ *} +{q * * * } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & Bc5?&\\ +\end{tabular}}| +\end{center} +|24.~Qe1, Qb2; 25.~Qd2, Q*a3; 26.~Bc5, Qa5; 27.~e*f5| +white has the advantage. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & \ldots & Q*c3\\ +25 & R*f5&\\ +\end{tabular}}| +\end{center} +|25.~B*f8, Q*c2+; 26.~Kf1, Q*d3+; 27.~Qe2, Qb1+; 28.~Qe1, Q*e1+; 29.~K*e1| +now black has only a slight advantage. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & \ldots & Q*c2+\\ +\end{tabular}}| +\end{center} +|25\ldots~R*f5; 26.~e*f5, Q*c2+; 27.~Kf1, Q*d3+; 28.~Kg2, Rd8; 29.~f4| +and black has a clear lead. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & Ke3 & Q*f2+\\ +27 & K*f2 & R*f5\\ +28 & e*f5 & Rc8\\ +29 & d4 & a6\\ +30 & a4 & Kf7\\ +31 & Ke3&\\ +\end{tabular}}| +\end{center} +|31.~Kg3, Kf6; 32.~Kf4, g5+; 33.~f*g6, h*g6; 34.~a5, g5+; 35.~Kg4| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & \ldots & h5\\ +\end{tabular}}| +\end{center} +|31\ldots~Kf6; 32.~Kf4, Rd8; 33.~a5, Rd5; 34.~Ke4, R*f5| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +32 & Kf4 & h4\\ +33 & Kg4 & Rh8\\ +34 & d5 & h3\\ +35 & Bd6 & g6\\ +\end{tabular}}| +\end{center} +|35\ldots~h2; 36.~B*h2, R*h2; 37.~Kf4, Rh4+; 38.~Ke5, R*a4; 39.~d6, Rc4| +totaly won for black. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +36 & f*g6+ & K*g6\\ +37 & Bh2 & Kf6\\ +\end{tabular}}| +\end{center} + +\board +{ * * * r} +{* * * * } +{p* * k *} +{* *P* * } +{P* * *K*} +{* * *P*p} +{ * * * B} +{* * * * } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +38 & f4&\\ +\end{tabular}}| +\end{center} +|38.~a5, Ke7; 39.~Kf5, Rh5+; 40.~Ke4, Rh4+; 41.~f4, Kd6; 42.~Kd4| +holding the position. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +38 & \ldots & Ke7\\ +39 & f5 & a5\\ +\end{tabular}}| +\end{center} +|39\ldots~Kf6| +is needed. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +40 & d6+ & Kd7\\ +\end{tabular}}| +\end{center} +|40\ldots~Kf6| +is still needed. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +41 & Kg5 & Rb8\\ +\end{tabular}}| +\end{center} +|41\ldots~Ke8| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +42 & f6 & Rb2\\ +\end{tabular}}| +\end{center} +|42\ldots~Ke6; 43.~Kg4, Rb4+; 44.~K*h3, R*a4; 45.~d7, K*d7; 46.~Be5| +but black should still win. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +43 & Kg6&\\ +\end{tabular}}| +\end{center} +|43.~f7, Rg2+; 44.~Kh6, Rf2; 45.~Kg7, Rg2+; 46.~Kh7, Rf2; 47.~Kg7| +white has equalised! +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +43 & \ldots & Rf2\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* *k* * } +{ * P PK*} +{p * * * } +{P* * * *} +{* * * *p} +{ * * r B} +{* * * * } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Nov 1993 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo C60\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Ian Kennedy\\ +Dunfermline C vs Stirling B +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & Bd6\\ +4 & 0-0 & a6\\ +5 & Ba4 & b5\\ +6 & Bb3 & Bb7\\ +7 & d3 & Nf6\\ +\end{tabular}}| +\end{center} +|7\ldots~Na5; 8.~Nbd2, f6; 9.~a4, N*b3; 10.~N*b3, Bb4; 11.~a*b5, a*b5| +with equality. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & Nc3&\\ +\end{tabular}}| +\end{center} +|8.~a4, b4; 9.~Nbd2, Bc5; 10.~Nc4, d6| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & \ldots & 0-0\\ +\end{tabular}}| +\end{center} +|8\ldots~Na5; 9.~Bd2, N*b3; 10.~a*b3, 0-0; 11.~Bg5, Rb8| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & Be3 & Na5\\ +\end{tabular}}| +\end{center} + +\board +{r* q rk*} +{*bpp*ppp} +{p* b n *} +{np* p * } +{ * *P* *} +{*BNPBN* } +{PPP* PPP} +{R *Q*RK } +$$\showboard$$ +|9\ldots~Be7; 10.~a3, Ng4; 11.~Bd2| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & Bd5?!&\\ +\end{tabular}}| +\end{center} +where is that bishop going. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & \ldots & b4\\ +\end{tabular}}| +\end{center} +|10\ldots~c6; 11.~Bb3, Bc7; 12.~Bg5, N*b3; 13.~B*f6, Q*f6; 14.~a*b3| +\bbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & B*b7 & N*b7\\ +12 & Nd5&\\ +\end{tabular}}| +\end{center} +|12.~Ne2, Ng4; 13.~Bd2, f5; 14.~e*f5, R*f5; 15.~Ng3, Rf6| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & \ldots & c6\\ +\end{tabular}}| +\end{center} +|12\ldots~N*d5; 13.~e*d5, f6; 14.~c3, b*c3; 15.~b*c3, Be7; 16.~d4, d6| +\bbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & N*f6+&\\ +\end{tabular}}| +\end{center} +|13.~Bb6, Qc8; 14.~N*f6+, g*f6; 15.~d4, Bc7; 16.~B*c7, Q*c7| +\wbetter{} and the black king is exposed. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & Q*f6\\ +14 & Bb6?!&\\ +\end{tabular}}| +\end{center} +strange move. +|14.~Qd2, Be7; 15.~c3, a5; 16.~a3, b*a3; 17.~b*a3| +\wbetter{} with the plan ofs owning the `b' file. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & \ldots & Bc5\\ +\end{tabular}}| +\end{center} +|14\ldots~Be7| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & Bc7&\\ +\end{tabular}}| +\end{center} +|15.~N*e5| +but black can easly win back the pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & \ldots & Rac8?\\ +\end{tabular}}| +\end{center} +|15\ldots~d6; 16.~d4, e*d4; 17.~e5, Qe7; 18.~e*d6, N*d6; 19.~B*d6, Q*d6| +\bupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & B*e5 & Qg6\\ +17 & d4&\\ +\end{tabular}}| +\end{center} +|17.~Bg3, Rfe8; 18.~Ne5, Qf6; 19.~N*d7, Q*b2; 20.~Re1| +\wupperhand{} white should now try use his center pawns to push home +his advantage. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & \ldots & Bd6\\ +18 & B*d6&\\ +\end{tabular}}| +\end{center} +this is to early, leaving myself underdeveloped. +|18.~Re1, f6; 19.~B*d6, N*d6; 20.~Qd3| +\wupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & N*d6\\ +19 & Ne5&\\ +\end{tabular}}| +\end{center} +|19.~e5, Nc4; 20.~b3, Na3; 21.~Rc1, d6; 22.~Re1| +\wupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & \ldots & Q*e4\\ +20 & N*d7 & Rfe8\\ +21 & Nc5 & Qg6?\\ +\end{tabular}}| +\end{center} +|21\ldots~Qe2; 22.~Re1, Qc4; 23.~Qd2, Rcd8; 24.~Rad1, a5| +\wupperhand{} white is a clear pawn up. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & N*a6 & Nf5\\ +23 & N*b4&\\ +\end{tabular}}| +\end{center} + +\board +{ *r*r*k*} +{* * *ppp} +{ *p* *q*} +{* * *n* } +{ N P * *} +{* * * * } +{PPP* PPP} +{R *Q*RK } +$$\showboard$$ + white should now win the endgame quite comfortably. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & \ldots & Nh4\\ +\end{tabular}}| +\end{center} +|23\ldots~Rcd8; 24.~c3, c5; 25.~Nc2, c*d4; 26.~N*d4, Qf6; 27.~Qf3, N*d4| +\wupperhand{} though still two clear pawns up. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & g3&\\ +\end{tabular}}| +\end{center} +forced. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & \ldots & c5\\ +25 & d*c5 & R*c5\\ +\end{tabular}}| +\end{center} +|25\ldots~Qe4; 26.~g*h4, Q*b4; 27.~a4, Q*h4; 28.~Qd5, Re2| +\wupperhand{}, but whites king is dangerously exposed, and the `a' +rook is not (yet) part of the game. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & a4&\\ +\end{tabular}}| +\end{center} +crap plan! Its just too slow. +|26.~Nd3, Rf5; 27.~f4, Rd5; 28.~a4, Qb6+; 29.~Rf2, Nf5| +\wdecisive{} black will never stop 3 connected passed pawns! +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & \ldots & f5\\ +27 & Nd5 & Rd8??\\ +\end{tabular}}| +\end{center} +|27\ldots~Qd6; 28.~Nf4, Q*d1; 29.~Rf*d1, Nf3+; 30.~Kg2, Ne5| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & Ne7+! & Kf7\\ +29 & Q*d8 & Qg5\\ +\end{tabular}}| +\end{center} + +\board +{ * Q * *} +{* * Nkpp} +{ * * * *} +{* r *pq } +{P* * * n} +{* * * P } +{ PP* P P} +{R * *RK } +$$\showboard$$ +|29\ldots~Nf3+; 30.~Kg2| +is an idea. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & a5&\\ +\end{tabular}}| +\end{center} +this plan is still to slow. +|30.~Qg8+, K*e7; 31.~Rfe1+, Kd6; 32.~Qf8+, Kc6; 33.~Qc8+, Kb6; 34.~Re6+, Rc6; 35.~Q*c6+, Ka7; 36.~Qb6+, Ka8; 37.~Re8+, Qd8; 38.~R*d8 mate| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & f4\\ +\end{tabular}}| +\end{center} + +\board +{ * Q * *} +{* * Nkpp} +{ * * * *} +{P r * q } +{ * * p n} +{* * * P } +{ PP* P P} +{R * *RK } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & f3??&\\ +\end{tabular}}| +\end{center} +|31.~Nc6, Nf3+; 32.~Kg2, f*g3; 33.~Qd7+, Kf8; 34.~Qc8+, Kf7; 35.~f*g3| +\wdecisive{} but there are still some hairy tactics. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & \ldots & f*g3\\ +32 & h*g3??&\\ +\end{tabular}}| +\end{center} +|32.~Qg8+, K*e7; 33.~Rfe1+, Re5; 34.~R*e5+, Q*e5; 35.~h3, N*f3+; 36.~Kg2| +and white can still win! +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +32 & \ldots & Q*g3+\\ +33 & Kh1 & Qg2 mate\\ +\end{tabular}}| +\end{center} +painfull! + +\board +{ * Q * *} +{* * Nkpp} +{ * * * *} +{P r * * } +{ * * * n} +{* * *P* } +{ PP* *q*} +{R * *R*K} +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Nov 1993 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C41\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Neil Langham\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & d6\\ +3 & Nc3 & Nf6\\ +4 & Bc4 & h6\\ +\end{tabular}}| +\end{center} +|4\ldots~Bg4; 5.~d3, Nc6; 6.~h3, Bh5; 7.~0-0, B*f3; 8.~Q*f3| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & 0-0 & Bd7\\ +6 & d3 & Nc6\\ +7 & Bd2&\\ +\end{tabular}}| +\end{center} +|7.~Be3, Be7; 8.~Nd5, 0-0; 9.~h3, N*d5; 10.~B*d5, Bf6| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & Na5\\ +\end{tabular}}| +\end{center} + +\board +{r* qkb r} +{pppb*pp } +{ * p n p} +{n * p * } +{ *B*P* *} +{* NP*N* } +{PPPB PPP} +{R *Q*RK } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & b4&\\ +\end{tabular}}| +\end{center} +|8.~Bd5, Bg4; 9.~a3, c6; 10.~Ba2, d5; 11.~Be3, d*e4; 12.~N*e4| +but black is having the freer game +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & \ldots & N*c4\\ +9 & d*c4 & Be6\\ +\end{tabular}}| +\end{center} +|9\ldots~Be7; 10.~Qe2, 0-0; 11.~Rfd1, Be6; 12.~c5, c6; 13.~c*d6, Q*d6| +\bbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & Nd5? & N*e4\\ +11 & Qe2&\\ +\end{tabular}}| +\end{center} +|11.~Re1, N*d2; 12.~Q*d2, c6; 13.~Ne3, Be7; 14.~Rad1, 0-0| +\bupperhand{}, with white a pawn and position down. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & \ldots & N*d2\\ +12 & N*d2&\\ +\end{tabular}}| +\end{center} +|12.~Q*d2| +is better. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & \ldots & Qg5??\\ +\end{tabular}}| +\end{center} + +\board +{r* *kb r} +{ppp *pp } +{ * pb* p} +{* *Np q } +{ PP* * *} +{* * * * } +{P*PNQPPP} +{R * *RK } +$$\showboard$$ +|12\ldots~g6; 13.~Ne3, f5; 14.~c5, d*c5; 15.~b*c5, c6| +\bupperhand{}, ready for a pawn charge on white's king. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & N*c7+ & Ke7\\ +\end{tabular}}| +\end{center} +|13\ldots~Kd7| +is better, stoping the future escape of the white knight. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & N*a8 & Bh3\\ +\end{tabular}}| +\end{center} +going for the cheapo. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & f4! & Qg6\\ +16 & Nc7&\\ +\end{tabular}}| +\end{center} +|16.~f*e5, Kd8; 17.~Qe4, Be6; 18.~Q*g6, f*g6| +is the best line Fritz2 found. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & \ldots & Kd7\\ +17 & Nd5 & Bg4\\ +18 & Qf2 & f6\\ +\end{tabular}}| +\end{center} +|18\ldots~Q*c2; 19.~Ne3, Qg6; 20.~f*e5, Be6; 21.~Nf3| +rather cheeky, but still a rook down. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & Ne3 & Ke6?\\ +\end{tabular}}| +\end{center} + +\board +{ * * b r} +{pp* * p } +{ * pkpqp} +{* * p * } +{ PP* Pb*} +{* * N * } +{P*PN QPP} +{R * *RK } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & f5+ & B*f5\\ +21 & Q*f5+&\\ +\end{tabular}}| +\end{center} +|21.~N*f5, Qg5; 22.~h4, Qg4| +actually wins more material, but with this level of inequality, you +want to swap of queens. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & \ldots & Q*f5\\ +22 & N*f5 & g6\\ +23 & Ng3&\\ +\end{tabular}}| +\end{center} +At this point the score sheet goes wrong, but the game was won by now +anyway! + +\board +{ * * b r} +{pp* * * } +{ * pkppp} +{* * p * } +{ PP* * *} +{* * * N } +{P*PN *PP} +{R * *RK } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Nov 1993 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Dennis Duncan\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & d6\\ +3 & Bc4 & Bg4\\ +4 & 0-0 & Nf6\\ +5 & Nc3&\\ +\end{tabular}}| +\end{center} +|5.~d3, Nc6; 6.~Be3, d5; 7.~e*d5, N*d5; 8.~Nbd2, N*e3; 9.~f*e3| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & \ldots & c6\\ +\end{tabular}}| +\end{center} +|5\ldots~Nc6; 6.~Bb5, Qd7; 7.~h3, B*f3; 8.~Q*f3, 0-0-0| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & Bb3 & d5\\ +7 & d3&\\ +\end{tabular}}| +\end{center} +|7.~e*d5, c*d5; 8.~Re1, e4; 9.~d3, B*f3| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & b5\\ +\end{tabular}}| +\end{center} +|7\ldots~d*e4; 8.~d*e4, Q*d1; 9.~R*d1, B*f3| +\bbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & h3&\\ +\end{tabular}}| +\end{center} + +\board +{rn qkb r} +{p * *ppp} +{ *p* n *} +{*p*pp * } +{ * *P*b*} +{*BNP*N*P} +{PPP* PP*} +{R BQ*RK } +$$\showboard$$ +|8.~e*d5, b4; 9.~Ne4, c*d5; 10.~N*f6+, g*f6; 11.~d4, e*d4; 12.~Q*d4| +\wupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & \ldots & Bc8\\ +\end{tabular}}| +\end{center} +|8\ldots~B*f3; 9.~Q*f3, d4; 10.~Ne2, Nbd7; 11.~Bg5, Be7| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & N*e5&\\ +\end{tabular}}| +\end{center} +|9.~e*d5, N*d5; 10.~N*e5, Be6; 11.~N*d5| +\wupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & \ldots & Qc7\\ +\end{tabular}}| +\end{center} +|9\ldots~Bd6; 10.~Nf3, d*e4; 11.~N*e4, N*e4; 12.~Re1, B*h3; 13.~R*e4+, Be6| +\wupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & Nf3 & Nh5\\ +\end{tabular}}| +\end{center} +|10\ldots~Be6; 11.~Nd4, d*e4; 12.~B*e6| +\wupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & e*d5 & c5\\ +12 & N*b5&\\ +\end{tabular}}| +\end{center} +|12.~Re1+!, Be7; 13.~N*b5, Qb6; 14.~d6, Q*b5; 15.~R*e7+, Kd8; 16.~B*f7| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & \ldots & Qb6\\ +\end{tabular}}| +\end{center} +|12\ldots~Qb7; 13.~Re1+, Kd8; 14.~Ne5, Nf6; 15.~Bg5, Bf5; 16.~B*f6+, g*f6| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & Ba4&\\ +\end{tabular}}| +\end{center} +|13.~Re1+, Kd8; 14.~Ne5, Q*b5; 15.~N*f7+, Kc7; 16.~N*h8, Nf6; 17.~Bf4+| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & Bd7\\ +14 & Qe2+ & Be7\\ +\end{tabular}}| +\end{center} + +\board +{rn *k* r} +{p *bbppp} +{ q * * *} +{*NpP* *n} +{B* * * *} +{* *P*N*P} +{PPP*QPP*} +{R B *RK } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & d4&\\ +\end{tabular}}| +\end{center} +|15.~d6, 0-0; 16.~d*e7, Re8; 17.~d4, c*d4; 18.~Nf*d4| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & \ldots & B*b5\\ +16 & B*b5+ & Nd7\\ +\end{tabular}}| +\end{center} +|16\ldots~Kf8; 17.~Re1, Qd6; 18.~Nh4, Qf6; 19.~Q*h5| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & B*d7+ & K*d7\\ +18 & Ne5+ & Ke8\\ +19 & d*c5&\\ +\end{tabular}}| +\end{center} +|19.~Nc6, Qc7; 20.~Re1, c*d4; 21.~c4, Nf6| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & \ldots & Q*c5\\ +20 & Rd1&\\ +\end{tabular}}| +\end{center} +|20.~d6, Q*d6; 21.~Qf3, Rc8; 22.~N*f7, Qf6; 23.~Q*f6, N*f6; 24.~N*h8| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & \ldots & Ng3\\ +21 & Qe3&\\ +\end{tabular}}| +\end{center} +|21.~Qg4, Q*c2; 22.~Rd2, Qf5; 23.~Q*g3, Bf6| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & \ldots & Nf5\\ +22 & Q*c5&\\ +\end{tabular}}| +\end{center} +|22.~Qf3, Nd6; 23.~c4, Bf6; 24.~Re1, B*e5; 25.~R*e5+, Kf8| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & B*c5\\ +\end{tabular}}| +\end{center} + +\board +{r* *k* r} +{p * *ppp} +{ * * * *} +{* bPNn* } +{ * * * *} +{* * * *P} +{PPP* PP*} +{R BR* K } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & Be3?&\\ +\end{tabular}}| +\end{center} +|23.~Re1, Ne7; 24.~c4, f6; 25.~Nd3, Bd4| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & \ldots & N*e3\\ +\end{tabular}}| +\end{center} +|23\ldots~B*e3; 24.~f*e3, N*e3; 25.~Rd2, Rc8; 26.~Re2, N*d5; 27.~Ng6+, Kd7| +Blacks best line +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & f*e3 & B*e3+\\ +25 & Kf1 & Bf4\\ +26 & Re1&\\ +\end{tabular}}| +\end{center} +|26.~Nd3, Bd6; 27.~c4, Rc8; 28.~b3| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & \ldots & f6\\ +\end{tabular}}| +\end{center} + +\board +{r* *k* r} +{p * * pp} +{ * * p *} +{* *PN * } +{ * * b *} +{* * * *P} +{PPP* *P*} +{R * RK* } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & Ng6+ & Kf7\\ +28 & N*f4 & Rhe8\\ +29 & R*e8&\\ +\end{tabular}}| +\end{center} +|29.~c4, Rac8; 30.~b3, h6; 31.~Kf2, R*e1; 32.~R*e1, Rc5| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & \ldots & R*e8\\ +30 & d6&\\ +\end{tabular}}| +\end{center} +|30.~Kf2, Re5; 31.~Rd1, g5; 32.~Ne2| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & Rd8\\ +31 & Rd1 & g6\\ +32 & Nd5&\\ +\end{tabular}}| +\end{center} +|32.~c4, g5; 33.~Ne2, Ke6; 34.~Nd4+, Kd7; 35.~c5, h6| +\wdecisive{},5.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +32 & \ldots & R*d6\\ +33 & c4&\\ +\end{tabular}}| +\end{center} +|33.~Ke2, Ke6; 34.~c4, Rc6; 35.~Kd3, f5; 36.~b3| +\wdecisive{},4.53 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & \ldots & f5\\ +34 & Ke1&\\ +\end{tabular}}| +\end{center} +|34.~b3| +\wdecisive{},4.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +34 & \ldots & Ra6\\ +35 & a3 & f4??\\ +\end{tabular}}| +\end{center} +Simply throws away a pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +36 & c5&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{p * *k*p} +{r* * *p*} +{* PN* * } +{ * * p *} +{P * * *P} +{ P * *P*} +{* *RK * } +$$\showboard$$ + why not take the pawn? +|36.~N*f4, h6; 37.~g3, g5; 38.~Nd5, Re6+; 39.~Kd2, Re4| +\wdecisive{},5.06 looks good to me. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +36 & \ldots & Ke6?\\ +37 & Nc7+&\\ +\end{tabular}}| +\end{center} +Black resigns + +\board +{ * * * *} +{p N * *p} +{r* *k*p*} +{* P * * } +{ * * p *} +{P * * *P} +{ P * *P*} +{* *RK * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Nov 1993 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C70\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Adam Rintoul\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & a6\\ +4 & Ba4 & b5\\ +5 & Bb3 & Nf6\\ +6 & d3 & Bc5\\ +\end{tabular}}| +\end{center} +|6\ldots~Bb7; 7.~0-0, d5; 8.~e*d5, N*d5; 9.~Bg5, Be7; 10.~B*e7, Nd*e7| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & Be3?&\\ +\end{tabular}}| +\end{center} + +\board +{r*bqk* r} +{* pp*ppp} +{p*n* n *} +{*pb p * } +{ * *P* *} +{*B*PBN* } +{PPP* PPP} +{RN*QK *R} +$$\showboard$$ +|7.~Nc3| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & B*e3\\ +8 & f*e3 & 0-0\\ +9 & 0-0 & d6\\ +10 & Nbd2&\\ +\end{tabular}}| +\end{center} +|10.~a3, Bb7; 11.~Nc3, Rb8; 12.~Nd5, a5| +\bbetter{},0.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & \ldots & Bg4\\ +11 & d4?&\\ +\end{tabular}}| +\end{center} +|11.~a4, Rb8; 12.~a*b5, a*b5; 13.~h3, Bh5; 14.~Qe2, Nd7| +\bbetter{},-0.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & \ldots & B*f3\\ +\end{tabular}}| +\end{center} +|11\ldots~e*d4; 12.~Qe1, d*e3; 13.~Q*e3, Na5; 14.~Nd4, c6; 15.~c3, N*b3| +\bupperhand{} a pawn up. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & N*f3 & N*e4??\\ +\end{tabular}}| +\end{center} + +\board +{r* q rk*} +{* p *ppp} +{p*np * *} +{*p* p * } +{ * Pn* *} +{*B* PN* } +{PPP* *PP} +{R *Q*RK } +$$\showboard$$ +|12\ldots~Qe8; 13.~d5, Na5; 14.~Qd3, N*b3; 15.~a*b3, c6; 16.~Rad1| +\bupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & Bd5 & Qd7\\ +\end{tabular}}| +\end{center} +|13\ldots~Ng5; 14.~B*c6, N*f3+; 15.~B*f3, Rb8; 16.~d*e5, d*e5; 17.~a3| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & B*e4 & f5\\ +15 & Bd5+ & Kh8\\ +16 & Ng5 & e*d4\\ +17 & Qh5&\\ +\end{tabular}}| +\end{center} + +\board +{r* * r k} +{* pq* pp} +{p*np * *} +{*p*B*pNQ} +{ * p * *} +{* * P * } +{PPP* *PP} +{R * *RK } +$$\showboard$$ +|17.~N*h7, Rfb8; 18.~Ng5, g6; 19.~Qf3, Ne5; 20.~Qh3+, Kg7; 21.~B*a8| +\wdecisive{},4.44 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & \ldots & h6?\\ +\end{tabular}}| +\end{center} +|17\ldots~g6; 18.~B*c6, g*h5; 19.~B*d7, d*e3; 20.~R*f5, R*f5; 21.~B*f5| +\wdecisive{},4.90 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & e*d4&\\ +\end{tabular}}| +\end{center} +|18.~Qg6, Qe8; 19.~Qh7 mate| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & Rae8\\ +\end{tabular}}| +\end{center} +|18\ldots~Rf6; 19.~Rae1, Raf8; 20.~Ne6, Re8; 21.~Qf3| +\wdecisive{},2.66 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & Rae1 & R*e1\\ +20 & R*e1 & Nd8\\ +21 & Qg6&\\ +\end{tabular}}| +\end{center} +I finally find the two move mate! + +\board +{ * n r k} +{* pq* p } +{p* p *Qp} +{*p*B*pN } +{ * P * *} +{* * * * } +{PPP* *PP} +{* * R K } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Nov 1993 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C30\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Ian Robertson (2150)\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & f4 & d6\\ +3 & Nf3 & Nc6\\ +\end{tabular}}| +\end{center} +|3\ldots~e*f4| +Just take the pawn, and then follow the main line KG. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & Bb5 & Bd7\\ +5 & 0-0 & Nf6\\ +6 & Nc3 & Be7\\ +\end{tabular}}| +\end{center} +|6\ldots~a6; 7.~Ba4, e*f4; 8.~d3, b5; 9.~Bb3, b4| +Who knows? +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & d3&\\ +\end{tabular}}| +\end{center} + +\board +{r* qk* r} +{pppbbppp} +{ *np n *} +{*B* p * } +{ * *PP *} +{* NP*N* } +{PPP* *PP} +{R BQ*RK } +$$\showboard$$ + At this point white is winning. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & 0-0\\ +8 & Kh1!&\\ +\end{tabular}}| +\end{center} +A clever waiting move, to avoid temp gaining checks. +|8.~Ne2| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & \ldots & Nd4?\\ +\end{tabular}}| +\end{center} +losses a pawn +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & B*d7 & Q*d7\\ +\end{tabular}}| +\end{center} +|9\ldots~N*f3; 10.~Bh3, Nd4; 11.~Be3, c5; 12.~f*e5, d*e5| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & f*e5 & N*f3??\\ +\end{tabular}}| +\end{center} + +\board +{r* * rk*} +{pppqbppp} +{ * p n *} +{* * P * } +{ * *P* *} +{* NP*n* } +{PPP* *PP} +{R BQ*R*K} +$$\showboard$$ + Losses the piece. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & e*f6 & B*f6\\ +12 & Q*f3 & b5?\\ +\end{tabular}}| +\end{center} +what is this for? +|12\ldots~Rae8| +Planning taking control over the very white center. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & Nd5&\\ +\end{tabular}}| +\end{center} + +\board +{r* * rk*} +{p pq*ppp} +{ * p b *} +{*p*N* * } +{ * *P* *} +{* *P*Q* } +{PPP* *PP} +{R B *R*K} +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & Qd8??\\ +\end{tabular}}| +\end{center} +Losses another pawn, as well as weakening the kingside, and allowing +exchange of queens. +|13\ldots~Bd8| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & N*f6+ & Q*f6\\ +15 & Q*f6 & g*f6\\ +16 & R*f6 & Kg7\\ +17 & Bg5&\\ +\end{tabular}}| +\end{center} +Black is just out of good moves. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & \ldots & Rae8?\\ +\end{tabular}}| +\end{center} +Blocking in the f rook, allowing the skew. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & Raf1 & d5?\\ +\end{tabular}}| +\end{center} +again lack of vision +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & Bh6+ & Kg8\\ +20 & e*d5 & Rd8\\ +21 & B*f8 & R*f8\\ +22 & Rc6&\\ +\end{tabular}}| +\end{center} +Planning an invasion of the 7th. Textbook play. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & Rd8\\ +\end{tabular}}| +\end{center} + +\board +{ * r *k*} +{p p *p*p} +{ *R* * *} +{*p*P* * } +{ * * * *} +{* *P* * } +{PPP* *PP} +{* * *R*K} +$$\showboard$$ + Planing to remove the dangerous white pawn, but missing the connected +rooks that arrive on the 7th. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & R*c7 & R*d5\\ +24 & Rf*f7 & Rd8\\ +\end{tabular}}| +\end{center} +Silly, blocking the kings escape, athough its over anyway. I should +have tried for at least one cheapo. +|24\ldots~Re5| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & R*h7 & Rf8??\\ +\end{tabular}}| +\end{center} +Again just missing the action. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & Rcg7 mate&\\ +\end{tabular}}| +\end{center} + +\board +{ * * rk*} +{p * * RR} +{ * * * *} +{*p* * * } +{ * * * *} +{* *P* * } +{PPP* *PP} +{* * * *K} +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Dec 1993 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo B10\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Bob Colquhoun\\ +Dunfermline Club Knockout +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c6\\ +2 & Nf3 & d5\\ +3 & e*d5 & c*d5\\ +4 & c4&\\ +\end{tabular}}| +\end{center} +|4.~d4| +Score: 0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & \ldots & Nf6\\ +\end{tabular}}| +\end{center} +|4\ldots~d4; 5.~b3, Nc6; 6.~Bb2, Nf6; 7.~Na3, e5| +Score: -0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & c*d5&\\ +\end{tabular}}| +\end{center} +|5.~d4, e6; 6.~c*d5, N*d5; 7.~Nbd2, Bd6; 8.~Bc4| +Score: 0.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & \ldots & N*d5\\ +6 & Bc4 & e6\\ +\end{tabular}}| +\end{center} +|6\ldots~Nb6; 7.~Bb3, Nc6; 8.~d4, Bf5; 9.~Bg5, Be4| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & 0-0 & Nc6\\ +8 & d4 & a6\\ +\end{tabular}}| +\end{center} +|8\ldots~Bb4; 9.~Bd2, B*d2; 10.~Nb*d2, Nf4; 11.~Nb3, 0-0| +Score: -0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & Re1&\\ +\end{tabular}}| +\end{center} +|9.~Nc3| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & \ldots & b5\\ +\end{tabular}}| +\end{center} +|9\ldots~Be7; 10.~Nc3, 0-0; 11.~Qd3, Qd7; 12.~N*d5| +Score: -0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & B*d5 & Q*d5\\ +11 & Nc3 & Qf5\\ +\end{tabular}}| +\end{center} +|11\ldots~Qd8; 12.~d5, Ne7; 13.~d6, Nf5; 14.~Qd5, Bd7| +Score: 0.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & d5 & Nd8\\ +\end{tabular}}| +\end{center} +|12\ldots~Nb4; 13.~d6, Nd3; 14.~Re4, N*c1; 15.~R*c1, Rb8| +Score: 0.34 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & d*e6&\\ +\end{tabular}}| +\end{center} +|13.~d6, Nb7; 14.~Ne4, Nc5; 15.~Nd4| +Score: 0.34 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & B*e6\\ +14 & Qd5&\\ +\end{tabular}}| +\end{center} +|14.~Nd5, Rc8; 15.~Nd4, Qg6; 16.~Bf4, Bc5; 17.~Nc7, Kf8; 18.~N*a6| +Score: 0.75 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & \ldots & Q*d5\\ +15 & N*d5 & Bd6\\ +16 & Bg5&\\ +\end{tabular}}| +\end{center} +|16.~Nd4, Rb8; 17.~Bf4, B*f4; 18.~N*f4, Rb6; 19.~Nd*e6, N*e6; 20.~N*e6| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & \ldots & 0-0\\ +\end{tabular}}| +\end{center} +|16\ldots~h6; 17.~Bd2, 0-0; 18.~Bf4| +Score: -0.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & Rad1 & Nc6\\ +\end{tabular}}| +\end{center} +|17\ldots~Nb7; 18.~Be7, B*e7| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & Nd4&\\ +\end{tabular}}| +\end{center} +|18.~Nb6, Bb4; 19.~R*e6, f*e6; 20.~N*a8, R*a8| +Score: 0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & B*d5\\ +\end{tabular}}| +\end{center} +|18\ldots~N*d4; 19.~R*d4, h6; 20.~Ne7, Kh7; 21.~R*d6, h*g5; 22.~Nd5| +Score: -0.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & N*c6 & B*h2+\\ +\end{tabular}}| +\end{center} +|19\ldots~Rfe8; 20.~R*e8, R*e8; 21.~h3, Re6; 22.~Nd4, Re4| +Score: -0.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & K*h2 & B*c6\\ +21 & Rd6 & Rfe8\\ +\end{tabular}}| +\end{center} +|21\ldots~Rac8| +Score: -0.44 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & R*e8+&\\ +\end{tabular}}| +\end{center} +|22.~Rc1, Be4; 23.~Rc7, h6; 24.~Be3, Kf8| +Score: -0.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & B*e8\\ +23 & a3&\\ +\end{tabular}}| +\end{center} +|23.~Be3, h6; 24.~b3, Kh7; 25.~a3, g6; 26.~Bd4| +Score: -0.78 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & \ldots & a5\\ +\end{tabular}}| +\end{center} +|23\ldots~h6; 24.~Be3, Kh7; 25.~b3, f6; 26.~Bd4, Bf7; 27.~b4| +Score: -0.88 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & Kg3&\\ +\end{tabular}}| +\end{center} +|24.~b3, h6; 25.~Rd8, R*d8; 26.~B*d8, a4; 27.~b*a4, b*a4| +Score: -0.81 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & \ldots & a4\\ +\end{tabular}}| +\end{center} +|24\ldots~h6| +Score: -0.91 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & Bc1&\\ +\end{tabular}}| +\end{center} +|25.~Kh4, h6; 26.~Be3, Kh7; 27.~Bd4, Rc8; 28.~g3, Bc6| +Score: -1.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & \ldots & Rc8\\ +\end{tabular}}| +\end{center} +|25\ldots~h6; 26.~Be3, Kh7; 27.~Kh4, Rc8; 28.~Bd4, Bc6; 29.~f3| +Score: -1.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & Bd2&\\ +\end{tabular}}| +\end{center} +|26.~Be3, h6; 27.~Kh4, Kh7; 28.~Bd4, Bc6; 29.~f3| +Score: -1.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & \ldots & Rc4\\ +\end{tabular}}| +\end{center} +|26\ldots~Bc6; 27.~Be3, h6; 28.~f3, Kh7| +Score: -1.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & Rd8 & Re4\\ +28 & Bb4&\\ +\end{tabular}}| +\end{center} +|28.~f4| +Score: -0.88 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & \ldots & f6\\ +\end{tabular}}| +\end{center} +|28\ldots~h6; 29.~Kf3, Re6; 30.~Kg4, Kh7; 31.~f4, Re4; 32.~g3| +Score: -1.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & f4&\\ +\end{tabular}}| +\end{center} +|29.~Kf3, Re6; 30.~Kg4, Kf7; 31.~Kh4, Re2; 32.~Rd2| +Score: -0.91 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & \ldots & Kf7\\ +30 & Kf3&\\ +\end{tabular}}| +\end{center} +|30.~Rc8, Kg6; 31.~Kf3| +Score: -1.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & Bc6\\ +31 & Rc8&\\ +\end{tabular}}| +\end{center} +|31.~Kg3, Re2; 32.~Rd2, R*d2; 33.~B*d2, Ke6; 34.~Be3| +Score: -1.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & \ldots & R*b4+\\ +32 & R*c6 & R*b2\\ +33 & g4&\\ +\end{tabular}}| +\end{center} +|33.~Rb6| +Score: -2.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & \ldots & Rb3+\\ +34 & Ke4 & R*a3\\ +35 & Rc7+&\\ +\end{tabular}}| +\end{center} +|35.~f5, h6; 36.~Rc7, Kg8; 37.~Rb7, Rb3; 38.~Rd7, Rb4; 39.~Kf3| +Score: -3.28 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +35 & \ldots & Kg6\\ +36 & Rb7&\\ +\end{tabular}}| +\end{center} +|36.~f5, Kh6; 37.~Rc2, Rb3; 38.~g5, Kh5; 39.~g*f6, g*f6; 40.~Rh2| +Score: -3.34 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +36 & \ldots & Rb3\\ +37 & f5+&\\ +\end{tabular}}| +\end{center} +|37.~Kd4| +Score: -3.44 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +37 & \ldots & Kh6\\ +38 & g5+&\\ +\end{tabular}}| +\end{center} +|38.~Kd4, a3; 39.~Ra7, b4; 40.~Kc4, Rb2; 41.~Rb7, Rc2| +Score: -3.59 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +38 & \ldots & f*g5\\ +39 & Rb6+ & Kh5\\ +40 & Rb7 & Rb4+\\ +\end{tabular}}| +\end{center} +|40\ldots~Kg4; 41.~R*g7, Rb4; 42.~Ke5, Rf4; 43.~f6, h5; 44.~Ra7, h4| +Score: -4.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +41 & Ke5 & Rf4\\ +\end{tabular}}| +\end{center} +|41\ldots~Kg4; 42.~R*g7, Rf4; 43.~f6, h5; 44.~Ra7, Rf5; 45.~Ke6, h4| +Score: -4.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +42 & R*b5 & Kg4\\ +43 & Ke6 & R*f5\\ +\end{tabular}}| +\end{center} +|43\ldots~h5; 44.~Re5, h4; 45.~Re1, a3; 46.~Ra1, Rf3; 47.~Rg1, Kh5| +Score: -3.94 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +44 & R*f5&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * * pp} +{ * *K* *} +{* * *Rp } +{p* * *k*} +{* * * * } +{ * * * *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Dec 1993 \hspace{.3 in} $0\!-\!1$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} George Petrie\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & Nc6\\ +3 & Bc4 & d6\\ +\end{tabular}}| +\end{center} +|3\ldots~e6; 4.~Nc3, Nge7; 5.~d3, d5; 6.~Bb3, d4; 7.~Ne2, e5| +Score: 0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & 0-0&\\ +\end{tabular}}| +\end{center} +|4.~c3| +Score: 0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & \ldots & e6\\ +\end{tabular}}| +\end{center} +|4\ldots~g6; 5.~d4, c*d4; 6.~N*d4, Bg7; 7.~Be3, N*d4; 8.~B*d4, Nf6| +Score: -0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & d3&\\ +\end{tabular}}| +\end{center} +|5.~Bb5, Nf6; 6.~d3, Bd7; 7.~Nc3, Be7; 8.~Bg5, 0-0| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & \ldots & Be7\\ +\end{tabular}}| +\end{center} +|5\ldots~d5; 6.~Bb5, Nf6; 7.~Ne5, Bd7; 8.~N*d7, Q*d7; 9.~Bg5| +Score: 0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & Nc3 & Bd7\\ +\end{tabular}}| +\end{center} +|6\ldots~Bf6| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & Bf4&\\ +\end{tabular}}| +\end{center} +|7.~Re1, Nf6; 8.~Be3, 0-0; 9.~a3, Rc8; 10.~Bf4, Nd4; 11.~N*d4| +Score: 0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & a6\\ +\end{tabular}}| +\end{center} +|7\ldots~Na5; 8.~Nd2, N*c4; 9.~N*c4, e5; 10.~Bg3, Be6; 11.~Ne3| +Score: -0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & d4&\\ +\end{tabular}}| +\end{center} +|8.~a3, Nf6; 9.~Re1, 0-0; 10.~Be3, e5; 11.~Nd5, Be6; 12.~N*e7| +Score: 0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & \ldots & c*d4\\ +9 & Ne2 & e5\\ +\end{tabular}}| +\end{center} +|9\ldots~Na5| +Score: -0.94 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & Bg3 & Nf6\\ +11 & Bd5&\\ +\end{tabular}}| +\end{center} +|11.~c3, N*e4; 12.~c*d4, 0-0; 13.~Bd5, N*g3| +Score: -0.97 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & \ldots & 0-0\\ +\end{tabular}}| +\end{center} +|11\ldots~Nb4; 12.~c3, Nb*d5; 13.~e*d5, d3; 14.~Nc1, e4; 15.~Nd2| +Score: -1.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & c4&\\ +\end{tabular}}| +\end{center} +|12.~c3, d*c3; 13.~N*c3, b6; 14.~a3, Qc7; 15.~b3, Be6; 16.~B*e6| +Score: -0.63 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & \ldots & Qb6\\ +\end{tabular}}| +\end{center} +|12\ldots~Bg4; 13.~Qb3, Qc7; 14.~Rac1, Rac8; 15.~Qd3, b6| +Score: -1.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & Qd2&\\ +\end{tabular}}| +\end{center} +|13.~b3, Bg4; 14.~Nc1, Rac8; 15.~Nd3, Nh5; 16.~a3, N*g3; 17.~f*g3| +Score: -1.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & Rac8\\ +\end{tabular}}| +\end{center} +|13\ldots~Nb4; 14.~b3, Bg4; 15.~Rfd1, Nb*d5| +Score: -1.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & Bh4&\\ +\end{tabular}}| +\end{center} +|14.~Rac1| +Score: -1.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & \ldots & Nb4\\ +\end{tabular}}| +\end{center} +|14\ldots~Bg4; 15.~Bg3, Nb4; 16.~b3, Nb*d5; 17.~e*d5, B*f3; 18.~g*f3| +Score: -1.53 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & Ne*d4&\\ +\end{tabular}}| +\end{center} +|15.~B*f6, B*f6; 16.~h3, N*d5; 17.~c*d5| +Score: -1.44 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & \ldots & Nb*d5\\ +\end{tabular}}| +\end{center} +|15\ldots~e*d4; 16.~b3, Bg4; 17.~Qf4, Nd3| +Score: -3.34 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & B*f6&\\ +\end{tabular}}| +\end{center} +|16.~e*d5, e*d4; 17.~Rfe1, Bd8; 18.~b3, Ng4; 19.~B*d8, Rf*d8; 20.~N*d4| +Score: -1.94 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & \ldots & N*f6\\ +17 & Ne2&\\ +\end{tabular}}| +\end{center} +|17.~Nf5, B*f5; 18.~e*f5, R*c4; 19.~b3, Ne4; 20.~Qd5, Rb4| +Score: -4.75 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & \ldots & R*c4\\ +18 & b3&\\ +\end{tabular}}| +\end{center} +|18.~Nc3, Rb4; 19.~b3, N*e4; 20.~N*e4, R*e4; 21.~Rfd1| +Score: -5.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & R*e4\\ +19 & Nc3&\\ +\end{tabular}}| +\end{center} +|19.~Ng3, Rb4; 20.~Rfe1, Bg4; 21.~Qd3, Rf4; 22.~Qe3, Q*e3; 23.~f*e3| +Score: -5.38 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & \ldots & Rg4\\ +\end{tabular}}| +\end{center} +|19\ldots~Rf4; 20.~Qe3, Qc7| +Score: -5.34 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & Qd1&\\ +\end{tabular}}| +\end{center} +|20.~Rae1| +Score: -5.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & \ldots & Bc6\\ +21 & Na4&\\ +\end{tabular}}| +\end{center} +|21.~Rc1, Rf4; 22.~Re1, B*f3; 23.~g*f3, Re8; 24.~a3| +Score: -5.66 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & \ldots & Qb4\\ +\end{tabular}}| +\end{center} +|21\ldots~B*a4; 22.~b*a4, Qa5; 23.~Qb3, Rb4; 24.~Qc2, R*a4; 25.~Rfc1| +Score: -5.94 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & Rc1&\\ +\end{tabular}}| +\end{center} +|22.~h3, Rf4; 23.~Nb2, B*f3; 24.~g*f3, Rd4; 25.~Nd3, Qc3| +Score: -5.81 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & R*g2+\\ +23 & K*g2 & Qg4+\\ +24 & Kh1 & B*f3+\\ +25 & Q*f3 & Q*f3+\\ +26 & Kg1 & Nh5\\ +\end{tabular}}| +\end{center} +|26\ldots~Nd5; 27.~Rc4, b5; 28.~Rfc1, b*c4; 29.~R*c4, Bf6| +Score: -14.53 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & Rc3 & Qd5\\ +\end{tabular}}| +\end{center} +|27\ldots~Qg4; 28.~Kh1, b5; 29.~Rg1, Qd4; 30.~Rh3, Nf4; 31.~Rhg3, b*a4| +Score: -12.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & Nb6&\\ +\end{tabular}}| +\end{center} +|28.~h3, Nf4; 29.~Rg3, Ne2; 30.~Kh2, N*g3; 31.~K*g3, Qd3; 32.~Kg2| +Score: -11.94 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & \ldots & Qd4\\ +29 & Rfc1&\\ +\end{tabular}}| +\end{center} +|29.~Na4, b5; 30.~h3, Nf4; 31.~Kh2, b*a4; 32.~Rc7, Re8| +Score: -12.97 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & \ldots & Q*b6\\ +30 & Rc8&\\ +\end{tabular}}| +\end{center} +|30.~R1c2, d5; 31.~h3, Qg6; 32.~Kh2, Nf4; 33.~f3, b6| +Score: -13.97 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & Nf4\\ +31 & R1c7&\\ +\end{tabular}}| +\end{center} +|31.~R8c3, Ne2; 32.~Kf1, N*c1; 33.~R*c1, d5; 34.~h3, Bc5; 35.~f3| +Score: -15.63 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & \ldots & Bh4\\ +\end{tabular}}| +\end{center} +|31\ldots~Nh3; 32.~Kh1, Q*f2; 33.~Rc4, d5; 34.~Rc3, Qg1| +Score: -#4 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +32 & Rc2&\\ +\end{tabular}}| +\end{center} +|32.~R*f8, K*f8; 33.~Rc8, Ke7; 34.~Rc2, Qd4; 35.~h3, B*f2; 36.~Kh2| +Score: -18.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +32 & \ldots & Nd3\\ +\end{tabular}}| +\end{center} +|32\ldots~B*f2; 33.~Kf1, Qe3; 34.~R*f8, K*f8; 35.~Rc8, Ke7; 36.~Rc7, Kd8| +Score: -19.53 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & R*f8+&\\ +\end{tabular}}| +\end{center} +|33.~Kf1, B*f2; 34.~R*f8, K*f8; 35.~Rc8, Ke7; 36.~Rg8, Bg3; 37.~Ke2| +Score: -14.78 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & \ldots & K*f8\\ +\end{tabular}}| +\end{center} + +\board +{ * * k *} +{*p* *ppp} +{pq p * *} +{* * p * } +{ * * * b} +{*P*n* * } +{P*R* P P} +{* * * K } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Dec 1993 \hspace{.3 in} $0\!-\!1$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Peter Horne\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e6\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & a6\\ +\end{tabular}}| +\end{center} +|3\ldots~d5; 4.~d3, d*e4; 5.~B*c6, b*c6; 6.~d*e4, Q*d1; 7.~K*d1| +Score: 0.19 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & Ba4&\\ +\end{tabular}}| +\end{center} +|4.~B*c6, d*c6; 5.~0-0, Nf6; 6.~Re1, Be7; 7.~d4, c5; 8.~e5| +Score: 0.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & \ldots & b5\\ +5 & Bb3 & Bb7\\ +\end{tabular}}| +\end{center} +|5\ldots~Na5; 6.~d3, N*b3; 7.~a*b3, Bb7; 8.~0-0, Bc5; 9.~Nc3| +Score: -0.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & d4&\\ +\end{tabular}}| +\end{center} +|6.~c3, Nf6; 7.~d3, Be7; 8.~Be3, 0-0; 9.~Nbd2, d5| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & \ldots & Na5\\ +7 & Nbd2&\\ +\end{tabular}}| +\end{center} +|7.~e5, N*b3; 8.~a*b3, c5; 9.~Bg5, f6; 10.~Be3, c*d4; 11.~B*d4| +Score: -0.38 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & Nf6\\ +\end{tabular}}| +\end{center} +|7\ldots~N*b3; 8.~a*b3, c5; 9.~0-0, d5; 10.~e*d5, B*d5| +Score: -0.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & e5 & Nd5\\ +\end{tabular}}| +\end{center} +|8\ldots~N*b3; 9.~N*b3, Ne4; 10.~0-0, Be7; 11.~c3, 0-0; 12.~Be3, d5| +Score: -0.19 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & 0-0 & d6\\ +\end{tabular}}| +\end{center} +|9\ldots~Nf4| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & a4&\\ +\end{tabular}}| +\end{center} +|10.~B*d5, B*d5; 11.~a4, d*e5; 12.~a*b5, c5; 13.~b*a6, e*d4| +Score: 0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & \ldots & b4\\ +\end{tabular}}| +\end{center} +|10\ldots~d*e5; 11.~B*d5, Q*d5; 12.~d*e5, c5; 13.~a*b5, a*b5; 14.~b3| +Score: 0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & Nc4&\\ +\end{tabular}}| +\end{center} +|11.~B*d5, B*d5; 12.~c3, d*e5; 13.~N*e5, Bd6; 14.~c*b4, B*b4; 15.~Ndf3| +Score: 0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & \ldots & N*b3\\ +12 & c*b3 & a5\\ +\end{tabular}}| +\end{center} +|12\ldots~Rb8; 13.~Qc2, Be7; 14.~Na5, c5; 15.~e*d6, Q*d6; 16.~N*b7, R*b7| +Score: -0.34 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & Qe2&\\ +\end{tabular}}| +\end{center} +|13.~Bg5, Be7; 14.~B*e7, Q*e7; 15.~Re1, d*e5| +Score: -0.56 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & f6\\ +\end{tabular}}| +\end{center} +|13\ldots~Be7; 14.~Rd1, 0-0; 15.~Be3, d*e5; 16.~d*e5| +Score: -0.63 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & e*d6&\\ +\end{tabular}}| +\end{center} +|14.~e*f6, Bc8; 15.~f7, K*f7; 16.~Ng5, Ke7; 17.~Ne4, Qd7; 18.~Bg5| +Score: 0.47 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & \ldots & c*d6\\ +\end{tabular}}| +\end{center} +|14\ldots~B*d6; 15.~Q*e6, Be7; 16.~Bd2, Ra6; 17.~Qf5, c5; 18.~d*c5, B*c5| +Score: 0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & Q*e6+ & Qe7\\ +\end{tabular}}| +\end{center} +|15\ldots~Be7; 16.~Re1, Ra6; 17.~Nh4, Nc7; 18.~Q*e7, Q*e7; 19.~R*e7, K*e7| +Score: 0.72 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & Qh3&\\ +\end{tabular}}| +\end{center} +|16.~N*d6, Kd8; 17.~Q*e7, B*e7; 18.~N*b7, Kc8; 19.~Nc5, Re8; 20.~Re1| +Score: 4.66 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & \ldots & Qf7\\ +\end{tabular}}| +\end{center} +|16\ldots~Qc7; 17.~Re1, Be7; 18.~Qe6, Ra6; 19.~Bd2, Qc8; 20.~Q*c8, B*c8| +Score: 0.97 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & Re1+ & Kd8\\ +18 & Bd2 & Qg6\\ +\end{tabular}}| +\end{center} +|18\ldots~g6| +Score: 0.97 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & Re2&\\ +\end{tabular}}| +\end{center} +|19.~Rac1, Ra6; 20.~Ne3, N*e3; 21.~B*e3, d5; 22.~Bf4, Bd6| +Score: 0.88 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & \ldots & Be7\\ +\end{tabular}}| +\end{center} +|19\ldots~Ra6; 20.~Rae1, Be7; 21.~Qe6, Re8; 22.~Ne3, N*e3; 23.~B*e3, B*f3| +Score: 0.88 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & Rae1&\\ +\end{tabular}}| +\end{center} +|20.~Nh4, Qh5; 21.~Rae1, Bc8; 22.~Qg3, Qg4; 23.~Bf4, N*f4; 24.~Q*g4| +Score: 1.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & \ldots & Re8\\ +\end{tabular}}| +\end{center} +|20\ldots~Bc8; 21.~Qh4, Bb7; 22.~Bf4, Ba6; 23.~Qg3| +Score: 0.91 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & Nh4&\\ +\end{tabular}}| +\end{center} +|21.~N*d6, Bc8; 22.~Nh4, Qh5; 23.~Qg3, Rg8; 24.~Nf3, Bg4| +Score: 2.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & \ldots & Qh5\\ +22 & Nf5&\\ +\end{tabular}}| +\end{center} +|22.~N*d6, Ba6; 23.~Re6, Bc8; 24.~g4, B*e6; 25.~R*e6, Nf4; 26.~B*f4| +Score: 3.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & Q*h3\\ +23 & g*h3 & g6\\ +\end{tabular}}| +\end{center} +|23\ldots~Bc6; 24.~N*g7, Rg8; 25.~Bh6, Bd7; 26.~Nb6| +Score: 1.53 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & Nc*d6&\\ +\end{tabular}}| +\end{center} +|24.~Nf*d6, Bc6; 25.~N*e8, K*e8; 26.~Re6, Bd7; 27.~Nd6, Kd8; 28.~Nf7| +Score: 3.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & \ldots & g*f5\\ +25 & N*e8&\\ +\end{tabular}}| +\end{center} +|25.~N*b7, Kd7; 26.~Nc5, B*c5; 27.~d*c5, R*e2| +Score: 1.66 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & \ldots & K*e8\\ +26 & Bh6&\\ +\end{tabular}}| +\end{center} +|26.~f3, Kd7; 27.~Kf2, Rg8; 28.~Rd1, Bd6; 29.~Kf1, Bc6| +Score: -0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & \ldots & Kf7\\ +\end{tabular}}| +\end{center} +|26\ldots~Kd7; 27.~f3, Rg8; 28.~Kf2, Bd6; 29.~Rg1, Rg6; 30.~R*g6, h*g6| +Score: -0.47 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & Bf4&\\ +\end{tabular}}| +\end{center} +|27.~f3, Rg8; 28.~Kf2, Bd6; 29.~Rg1, Rg6; 30.~R*g6, h*g6; 31.~Ke1| +Score: -0.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & \ldots & Rg8+\\ +28 & Kf1 & Ba6\\ +29 & Bd2 & Bd6\\ +30 & f3&\\ +\end{tabular}}| +\end{center} +|30.~Rc1, B*h2; 31.~f3, Bg1; 32.~Rc4, B*c4; 33.~b*c4, B*d4; 34.~Rg2| +Score: -3.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & B*h2\\ +31 & Kf2&\\ +\end{tabular}}| +\end{center} +|31.~Rc1, Bg1; 32.~Rc4, B*c4; 33.~b*c4, B*d4; 34.~Re1, Ne7| +Score: -3.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & \ldots & Bg3+\\ +32 & Kf1 & B*e1\\ +33 & B*e1&\\ +\end{tabular}}| +\end{center} +|33.~K*e1, Rg1; 34.~Kf2, Rb1; 35.~Re1, R*b2; 36.~Rd1, Nc3; 37.~Ke1| +Score: -4.84 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & \ldots & Ne3+\\ +\end{tabular}}| +\end{center} +|33\ldots~Re8; 34.~Bg3, R*e2; 35.~Kg1, R*b2; 36.~Bd6, R*b3| +Score: -8.31 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +34 & Kf2 & f4\\ +\end{tabular}}| +\end{center} +|34\ldots~Nd1; 35.~Kf1, Re8; 36.~Kg1, B*e2; 37.~f4, Rd8; 38.~Kg2, R*d4| +Score: -7.81 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +35 & R*e3 & f*e3+\\ +36 & K*e3 & Re8+\\ +37 & Kd2 & Re2+\\ +38 & Kd1 & R*b2\\ +39 & d5&\\ +\end{tabular}}| +\end{center} +|39.~f4, R*b3; 40.~h4, Rd3; 41.~Kc1, R*d4; 42.~Bg3, Rd3; 43.~Bf2| +Score: -6.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +39 & \ldots & R*b3\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * *k*p} +{b* * p *} +{p *P* * } +{Pp * * *} +{*r* *P*P} +{ * * * *} +{* *KB * } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jan 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Brian Easton\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & Nf6\\ +2 & Nc3 & e6\\ +3 & d4 & d5\\ +4 & e5 & Ne4\\ +5 & N*e4 & d*e4\\ +6 & Bc4 & Nc6\\ +7 & Be3 & Bb4+\\ +8 & c3 & Be7\\ +9 & Ne2 & Bg5\\ +10 & Qd2 & Na5\\ +11 & B*g5 & N*c4\\ +12 & Qf4 & Qd5\\ +13 & b3 & Nb2\\ +14 & 0-0 & b6\\ +15 & Ng3 & Ba6\\ +16 & c4 & Nd3\\ +17 & Q*e4 & Q*e4\\ +18 & N*e4 & Bb7\\ +19 & f3 & 0-0\\ +20 & Nf2 & f6\\ +21 & e*f6 & g*f6\\ +22 & Bh6 & Rf7\\ +23 & N*d3 & Rd8\\ +24 & Nf4 & Re7\\ +25 & Rfe1 & Kf7\\ +26 & Rad1 & e5\\ +27 & d*e5 & R*d1\\ +28 & R*d1 & f*e5\\ +29 & Nd5 & Rd7\\ +30 & f4 & e4\\ +31 & f5 & c6\\ +32 & Nc3 & c5\\ +33 & R*d7+ & Kf6\\ +34 & R*b7 & K*f5\\ +35 & R*h7 & Kg6\\ +36 & Rh8&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * R} +{p * * * } +{ p * *kB} +{* p * * } +{ *P*p* *} +{*PN * * } +{P* * *PP} +{* * * K } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jan 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} George Plant\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Wester-Hailes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & a6\\ +4 & Ba4 & Nf6\\ +5 & d4 & b5\\ +6 & Bb3 & d6\\ +7 & Ng5 & Qd7\\ +8 & B*f7+ & Kd8\\ +9 & d5 & Nb4\\ +10 & c3 & N*e4\\ +11 & Be6 & Qe8\\ +12 & c*b4 & N*g5\\ +13 & B*g5+ & Be7\\ +14 & B*e7+ & Q*e7\\ +15 & B*c8 & R*c8\\ +16 & 0-0 & c6\\ +17 & d*c6 & R*c6\\ +18 & Re1 & h5\\ +19 & Nc3 & Rc4\\ +20 & a3 & g5\\ +21 & Nd5 & Qg7\\ +22 & Ne3 & Rc7\\ +23 & Nf5 & Qf6\\ +24 & Q*d6+ & Q*d6\\ +25 & N*d6 & Re7\\ +26 & R*e5 & R*e5\\ +27 & Nf7+ & Ke7\\ +28 & N*e5 & Rc8\\ +29 & Nd3 & Kd6\\ +30 & Kf1 & h4\\ +31 & h3 & Kd5\\ +32 & Ne1 & Ke4\\ +33 & Nf3 & Kf4\\ +34 & Nd4 & Re8\\ +35 & Re1 & R*e1+\\ +36 & K*e1 & Ke5\\ +37 & Nc2 & Ke4\\ +38 & Ke2 & Kf4\\ +39 & Kd3 & Ke5\\ +40 & Ne3 & Kf4\\ +41 & Nd5+ & Kf5\\ +42 & Nc7&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* N * * } +{p* * * *} +{*p* *kp } +{ P * * p} +{P *K* *P} +{ P * PP*} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jan 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} C. McIntee\\ +Wester-Hailes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & Nc6\\ +3 & Be2 & Nf6\\ +4 & Nc3 & e6\\ +5 & 0-0 & d5\\ +6 & e*d5 & N*d5\\ +7 & N*d5 & Q*d5\\ +8 & c4 & Qd8\\ +9 & Re1 & h5\\ +10 & b3 & f6\\ +11 & Bb2 & h4\\ +12 & h3 & Qc7\\ +13 & d4 & Qf4\\ +14 & d5 & e*d5\\ +15 & c*d5 & Nd8\\ +16 & Bb5+ & Kf7\\ +17 & Qc1 & Qd6\\ +18 & Qe3 & Be7\\ +19 & Qe4 & g5\\ +20 & Bd3 & Ke8\\ +21 & Qg6+ & Kd7\\ +22 & Bb5+ & Kc7\\ +23 & Ne5 & Q*d5\\ +24 & Rad1 & Qg8\\ +25 & Bc4 & Ne6\\ +26 & Q*g8 & R*g8\\ +27 & B*e6 & B*e6\\ +28 & Nf3 & Rad8\\ +29 & R*d8 & R*d8\\ +30 & R*e6 & Rd1+\\ +31 & Kh2 & Bd6+\\ +32 & g3 & f5\\ +33 & Be5 & h*g3+\\ +34 & f*g3 & B*e5\\ +35 & R*e5 & Ra1\\ +36 & R*c5+ & Kb6\\ +37 & Rc2 & g4\\ +38 & h*g4 & f*g4\\ +39 & Ne5 & Kb5\\ +40 & N*g4 & a5\\ +41 & Ne3 & Re1\\ +42 & Nc4 & Re6\\ +43 & g4 & Rh6+\\ +44 & Kg3 & Rg6\\ +45 & Rg2 & a4\\ +46 & Ne5 & Rg5\\ +47 & b*a4+ & K*a4\\ +48 & Kf4 & Rg7\\ +49 & g5 & b5\\ +50 & g6 & b4\\ +51 & Kf5 & Ka3\\ +52 & Kf6 & Rg8\\ +53 & g7&\\ +\end{tabular}}| +\end{center} + +\board +{ * * *r*} +{* * * P } +{ * * K *} +{* * N * } +{ p * * *} +{k * * * } +{P* * *R*} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jan 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} F. Robertson\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Wester-Hailes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & d4 & d5\\ +2 & Nf3 & e6\\ +3 & Bf4 & Be7\\ +4 & e3 & Nf6\\ +5 & Bd3 & b6\\ +6 & 0-0 & 0-0\\ +7 & Re1 & Bb7\\ +8 & Nbd2 & c5\\ +9 & c3 & Nc6\\ +10 & Ne5 & Rc8\\ +11 & Ndf3 & c4\\ +12 & Bc2 & b5\\ +13 & b3 & Qa5\\ +14 & b4 & Qd8\\ +15 & a4 & a6\\ +16 & a*b5 & a*b5\\ +17 & N*c6 & B*c6\\ +18 & Ne5 & Bb7\\ +19 & Ra5 & Qe8\\ +20 & Ra7 & Ba8\\ +21 & Ng4 & Bc6\\ +22 & Be5 & Qd8\\ +23 & Qf3 & Ra8\\ +24 & R*a8 & B*a8\\ +25 & N*f6+ & B*f6\\ +26 & e4 & B*e5\\ +27 & d*e5 & d*e4\\ +28 & B*e4 & B*e4\\ +29 & Q*e4 & Qd3\\ +30 & Q*d3 & c*d3\\ +31 & Rd1 & Rd8\\ +32 & f4 & f5\\ +33 & Kf2 & Kf8\\ +34 & Ke3 & Ke7\\ +35 & R*d3 & R*d3+\\ +36 & K*d3 & Kd7\\ +37 & h3 & g6\\ +38 & Kd4 & Kc6\\ +39 & g3 & Kb6\\ +40 & g4 & Kc6\\ +41 & c4 & Kb6\\ +42 & c5+ & Kc6\\ +43 & Ke3 & Kc7\\ +44 & Ke2 & Kc6\\ +45 & Kf3 & Kd5\\ +46 & g*f5 & g*f5\\ +47 & h4 & Kc4\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * * *p} +{ * *p* *} +{*pP Pp* } +{ Pk* P P} +{* * *K* } +{ * * * *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jan 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} A. McKerrow\\ +Wester-Hailes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & a6\\ +4 & Ba4 & Nf6\\ +5 & 0-0 & Be7\\ +6 & Nc3 & b5\\ +7 & Bb3 & 0-0\\ +8 & a3 & d6\\ +9 & Re1 & Rb8\\ +10 & d3 & Bg4\\ +11 & h3 & Bh5\\ +12 & Nd5 & N*d5\\ +13 & e*d5 & Nd4\\ +14 & g4 & N*f3+\\ +15 & Q*f3 & Bg6\\ +16 & a4 & b4\\ +17 & a5 & Qc8\\ +18 & Ba4 & f5\\ +19 & g*f5 & R*f5\\ +20 & Qg4 & Bh5\\ +21 & Qc4 & Rf6\\ +22 & Bg5 & Rg6\\ +23 & f4 & h6\\ +24 & R*e5 & d*e5\\ +25 & d6+ & Qe6\\ +26 & Q*e6+ & R*e6\\ +27 & Bb3 & h*g5\\ +28 & d*e7 & Bf7\\ +29 & f*g5 & Rg6\\ +30 & Rf1 & B*b3\\ +31 & c*b3 & R*g5+\\ +32 & Kh2 & Re8\\ +33 & h4 & Rg4\\ +34 & Kh3 & Rf4\\ +35 & R*f4 & e*f4\\ +36 & Kg4 & R*e7\\ +37 & K*f4 & Rd7\\ +38 & Ke4 & Rd6\\ +\end{tabular}}| +\end{center} + +\board +{ * * *k*} +{* p * p } +{p* r * *} +{P * * * } +{ p *K* P} +{*P*P* * } +{ P * * *} +{* * * * } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jan 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} S. McCluskey\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Wester-Hailes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & a6\\ +4 & B*c6 & d*c6\\ +5 & d3 & Bd6\\ +6 & 0-0 & Bg4\\ +7 & h3 & Bh5\\ +8 & Be3 & Qe7\\ +9 & Nc3 & Nf6\\ +10 & Re1 & 0-0-0\\ +11 & Nb1 & Bb4\\ +12 & c3 & Ba5\\ +13 & b4 & Bb6\\ +14 & a3 & N*e4\\ +15 & B*b6 & B*f3\\ +16 & Q*f3 & Ng5\\ +17 & Qe3 & c*b6\\ +18 & d4 & Rhe8\\ +19 & h4 & Ne6\\ +20 & g3 & e*d4\\ +21 & c*d4 & R*d4\\ +22 & Nc3 & c5\\ +23 & Rac1 & Red8\\ +24 & b*c5 & b*c5\\ +25 & Ne4 & R8d7\\ +26 & N*c5 & Rc7\\ +27 & N*e6 & Q*e6\\ +28 & Q*d4 & R*c1\\ +29 & R*c1+ & Kb8\\ +30 & Q*g7&\\ +\end{tabular}}| +\end{center} + +\board +{ k * * *} +{*p* *pQp} +{p* *q* *} +{* * * * } +{ * * * P} +{P * * P } +{ * * P *} +{* R * K } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jan 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Rab Brown\\ +Dunferline Club Knockout +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & d6\\ +3 & d4 & Nc6\\ +4 & d*e5 & N*e5\\ +5 & N*e5 & d*e5\\ +6 & Q*d8+ & K*d8\\ +7 & Bc4 & Bb4+\\ +8 & Nc3 & B*c3+\\ +9 & b*c3 & Be6\\ +10 & B*e6 & f*e6\\ +11 & 0-0 & Nf6\\ +12 & Bb2 & N*e4\\ +13 & c4 & Nd2\\ +14 & Rfd1 & Ke7\\ +15 & R*d2 & c5\\ +16 & B*e5 & Rhg8\\ +17 & Rad1 & g5\\ +18 & Rd7+ & Ke8\\ +19 & R*b7 & g4\\ +20 & R*h7 & Rd8\\ +21 & R*d8+ & K*d8\\ +22 & Rh8 & R*h8\\ +23 & B*h8 & Kd7\\ +24 & f3 & g*f3\\ +25 & g*f3 & Ke7\\ +26 & Be5 & Kd7\\ +27 & Kg2 & Ke7\\ +28 & Kg3 & Kf7\\ +29 & Bd6 & Kf6\\ +30 & B*c5 & a5\\ +31 & Kf4 & e5+\\ +32 & Ke4 & Ke6\\ +33 & f4 & a4\\ +34 & f*e5 & a3\\ +35 & B*a3 & Kd7\\ +36 & Kd5 & Ke8\\ +37 & Ke6 & Kd8\\ +38 & Kf7 & Kd7\\ +39 & e6+ & Kc6\\ +40 & e7 & Kc7\\ +41 & e8=Q & Kb7\\ +42 & Qe6 & Kc7\\ +43 & Qd6+ & Kb7\\ +44 & Ke7 & Ka7\\ +45 & Qb4 & Ka8\\ +46 & Kd7 & Ka7\\ +47 & Kc7 & Ka6\\ +48 & Qb6 mate&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* K * * } +{kQ * * *} +{* * * * } +{ *P* * *} +{B * * * } +{P*P* * P} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jan 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Dick Patterson\\ +Dunfermline C vs Grangemouth B +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & Nc6\\ +3 & Be2 & e6\\ +4 & b3 & a6\\ +5 & 0-0 & b5\\ +6 & Bb2 & Nf6\\ +7 & e5 & Nd5\\ +8 & d4 & Bb7\\ +9 & c4 & Nf4\\ +10 & c*b5 & N*e2+\\ +11 & Q*e2 & a*b5\\ +12 & Re1 & c*d4\\ +13 & N*d4 & N*d4\\ +14 & B*d4 & Qg5\\ +15 & g3 & Rc8\\ +16 & f4 & Qg6\\ +17 & Q*b5 & Bc6\\ +18 & Qe2 & Be7\\ +19 & a4 & 0-0\\ +20 & a5 & f6\\ +21 & e*f6 & B*f6\\ +22 & B*f6 & R*f6\\ +23 & b4 & R*f4\\ +24 & Qd2 & Rf3\\ +25 & Rf1 & R*f1+\\ +26 & K*f1 & Qf5+\\ +27 & Qf4 & Qd3+\\ +28 & Ke1 & Rf8\\ +29 & Q*f8+ & K*f8\\ +30 & a6 & Qd4\\ +31 & Ke2 & Q*a1\\ +32 & Nd2 & Q*a6+\\ +33 & Ke3 & Qa3+\\ +\end{tabular}}| +\end{center} + +\board +{ * * k *} +{* *p* pp} +{ *b*p* *} +{* * * * } +{ P * * *} +{q * K P } +{ * N * P} +{* * * * } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jan 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Ian Mitchell (1660)\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & f4 & e*f4\\ +3 & Nf3 & Nc6\\ +4 & d4 & Nf6\\ +5 & Bd3 & d5\\ +6 & e5 & Ne4\\ +7 & 0-0 & g5\\ +8 & c3 & Qe7\\ +9 & Nfd2 & Bf5\\ +10 & Qe2 & N*d2\\ +11 & N*d2 & B*d3\\ +12 & Q*d3 & 0-0-0\\ +13 & a4 & Rg8\\ +14 & a5 & a6\\ +15 & b4 & h6\\ +16 & b5 & Nb8\\ +17 & Nb3 & a*b5\\ +18 & Q*b5 & Qd7\\ +19 & Qd3 & f6\\ +20 & e*f6 & Bd6\\ +21 & Bd2 & Qg4\\ +22 & a6 & N*a6\\ +23 & R*a6 & b*a6\\ +24 & Q*a6+ & Kd7\\ +25 & Qb5+ & Ke6\\ +26 & c4 & f3\\ +27 & R*f3 & Rb8\\ +28 & Q*d5+ & Kd7\\ +29 & Nc5+ & Kd8\\ +30 & Q*g8+&\\ +\end{tabular}}| +\end{center} + +\board +{ r k *Q*} +{* p * * } +{ * b P p} +{* N * p } +{ *PP *q*} +{* * *R* } +{ * B *PP} +{* * * K } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Feb 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Paul Burtwistle\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & e6\\ +3 & Be2 & Nc6\\ +4 & 0-0 & Nf6\\ +5 & Nc3 & d5\\ +6 & e5 & Nd7\\ +7 & Re1 & Nd*e5\\ +8 & N*e5 & N*e5\\ +9 & Bb5+ & Nc6\\ +10 & d4 & a6\\ +11 & B*c6+ & b*c6\\ +12 & Be3 & c*d4\\ +13 & B*d4 & c5\\ +14 & Be5 & Bb7\\ +15 & Qd2 & f6\\ +16 & Bc7 & Q*c7\\ +17 & R*e6+ & Kf7\\ +18 & Rae1 & d4\\ +19 & Nd1 & Bd6\\ +20 & f4 & Rhe8\\ +21 & f5 & Bd5\\ +22 & R*e8 & R*e8\\ +23 & c3 & R*e1+\\ +24 & Q*e1 & B*h2+\\ +25 & Kh1 & Be5\\ +26 & c*d4 & c*d4\\ +27 & Qe2 & Qc4\\ +28 & Qh5+ & Kf8\\ +29 & Kg1 & Qc2\\ +\end{tabular}}| +\end{center} + +\board +{ * * k *} +{* * * pp} +{p* * p *} +{* *bbP*Q} +{ * p * *} +{* * * * } +{PPq* *P*} +{* *N* K } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Feb 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Jim O'Neill (1875)\\ +Dunfermline Club Knockout +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & d4 & c*d4\\ +4 & N*d4 & Nf6\\ +5 & Bd3 & a6\\ +6 & 0-0 & e5\\ +7 & Nf3 & Bg4\\ +8 & Nc3 & Nbd7\\ +9 & Re1 & Rc8\\ +10 & Be3 & b5\\ +11 & Nd5 & N*d5\\ +12 & e*d5 & Nf6\\ +13 & Bg5 & Be7\\ +14 & B*f6 & B*f6\\ +15 & Be4 & 0-0\\ +16 & c3 & Bh4\\ +17 & Qc2 & f5\\ +18 & N*h4 & Q*h4\\ +19 & g3 & Qh5\\ +20 & Bg2 & Rf6\\ +21 & f3 & B*f3\\ +22 & B*f3 & Q*f3\\ +23 & Rad1 & f4\\ +24 & g*f4 & Rg6+\\ +\end{tabular}}| +\end{center} + +\board +{ *r* *k*} +{* * * pp} +{p* p *r*} +{*p*Pp * } +{ * * P *} +{* P *q* } +{PPQ* * P} +{* *RR K } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Feb 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Bill Bell\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e6\\ +2 & d4 & d5\\ +3 & Nf3 & d*e4\\ +4 & Nfd2 & Q*d4\\ +5 & c3 & Qd5\\ +6 & Be2 & e3\\ +7 & Nf3 & Q*d1+\\ +8 & B*d1 & e*f2+\\ +9 & K*f2 & Nc6\\ +10 & Be3 & Bd7\\ +11 & Re1 & h6\\ +12 & Nbd2 & 0-0-0\\ +13 & Ba4 & Kb8\\ +14 & Rad1 & Bd6\\ +15 & b4 & a6\\ +16 & Nc4 & Be7\\ +17 & Nfe5 & Be8\\ +18 & R*d8+ & B*d8\\ +19 & B*c6 & B*c6\\ +20 & N*f7 & Rh7\\ +21 & N*d8 & Bd5\\ +22 & Nd2 & g5\\ +23 & Rd1 & Kc8\\ +24 & Nb3 & Rd7\\ +25 & N*b7 & B*b7\\ +26 & R*d7 & K*d7\\ +27 & Nc5+ & Kc6\\ +28 & N*e6 & Nf6\\ +29 & Nd8+ & Kd7\\ +30 & N*b7 & Ne4+\\ +31 & Kf3 & N*c3\\ +32 & Nc5+ & Kc6\\ +33 & N*a6 & N*a2\\ +34 & Bd2 & Kb6\\ +35 & Nc5 & Kc6\\ +36 & Nd3 & Kb5\\ +37 & Ke4 & Kc4\\ +38 & g3 & Kb3\\ +39 & h4 & g*h4\\ +40 & g*h4 & Nc3+\\ +41 & B*c3 & K*c3\\ +42 & h5 & Kc4\\ +43 & Ne5+ & K*b4\\ +44 & Kd5 & c5\\ +45 & Nd3+ & Kb5\\ +46 & N*c5 & Kb6\\ +47 & Ne6 & Kb7\\ +48 & Nf8 & Kc7\\ +49 & Ke6 & Kd8\\ +50 & Kf7 & Kc8\\ +51 & Kg6 & Kd8\\ +52 & K*h6 & Ke8\\ +53 & Kg7&\\ +\end{tabular}}| +\end{center} + +\board +{ * *kN *} +{* * * K } +{ * * * *} +{* * * *P} +{ * * * *} +{* * * * } +{ * * * *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Feb 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} John MacArthur (1725)\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & d4 & e6\\ +2 & Nf3 & Nf6\\ +3 & c4 & d5\\ +4 & Nc3 & Nc6\\ +5 & e3 & Be7\\ +6 & Be2 & 0-0\\ +7 & 0-0 & Qd6\\ +8 & c5 & Qd7\\ +9 & Ne5 & N*e5\\ +10 & d*e5 & Ne4\\ +11 & N*e4 & d*e4\\ +12 & Qc2 & Qc6\\ +13 & b4 & Rd8\\ +14 & Bb2 & a5\\ +15 & a3 & a*b4\\ +16 & a*b4 & R*a1\\ +17 & R*a1 & b6\\ +18 & Bd4 & b*c5\\ +19 & b*c5 & Bb7\\ +20 & Ra5 & Ra8\\ +21 & Bb5 & Qd5\\ +22 & Qa4 & R*a5\\ +23 & Q*a5 & B*c5\\ +24 & Q*c7 & Bf8\\ +25 & Be8 & h6\\ +26 & Q*f7+ & Kh7\\ +27 & Q*f8 & Bc6\\ +\end{tabular}}| +\end{center} + +\board +{ * *BQ *} +{* * * pk} +{ *b*p* p} +{* *qP * } +{ * Bp* *} +{* * P * } +{ * * PPP} +{* * * K } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Feb 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Ian Sneddon (1685)\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & c4 & e5\\ +2 & Nc3 & Nf6\\ +3 & Nf3 & Nc6\\ +4 & g3 & d5\\ +5 & c*d5 & N*d5\\ +6 & Bg2 & Be6\\ +7 & 0-0 & Bb4\\ +8 & Ne4 & Qd7\\ +9 & d4 & e*d4\\ +10 & N*d4 & 0-0-0\\ +11 & N*e6 & Q*e6\\ +12 & Qc2 & h6\\ +13 & Rd1 & f5\\ +14 & Nc5 & B*c5\\ +15 & Q*c5 & Nde7\\ +16 & Be3 & R*d1+\\ +17 & R*d1 & Rd8\\ +18 & R*d8+ & K*d8\\ +19 & b3 & a6\\ +20 & Qc3 & Qe5\\ +21 & Q*e5 & N*e5\\ +22 & B*b7 & N7c6\\ +23 & Bf4 & Na5\\ +24 & B*e5 & N*b7\\ +25 & B*g7 & h5\\ +26 & Kg2 & Nd6\\ +27 & f3 & Ne8\\ +28 & Be5 & c6\\ +29 & Kh3 & Ke7\\ +30 & Kh4 & Nf6\\ +31 & B*f6+ & K*f6\\ +32 & K*h5 & c5\\ +33 & g4 & f4\\ +34 & g5+ & Kg7\\ +35 & Kg4&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * * k } +{p* * * *} +{* p * P } +{ * * pK*} +{*P* *P* } +{P* *P* P} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo B70\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Paul Connally\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & d4 & c*d4\\ +4 & N*d4 & g6\\ +5 & Nc3 & Nf6\\ +6 & Bd3 & Bg7\\ +7 & 0-0 & 0-0\\ +8 & f4 & Nc6\\ +9 & N*c6 & b*c6\\ +10 & Kh1 & Rb8\\ +11 & Qe1 & Ng4\\ +12 & h3 & Nf6\\ +13 & b3 & e5\\ +14 & f*e5 & Nh5\\ +15 & Bb2 & d*e5\\ +16 & Rf3 & a5\\ +17 & g4 & Nf4\\ +18 & Rd1 & Qg5\\ +19 & Bc1 & B*g4\\ +20 & B*f4 & B*f3+\\ +\end{tabular}}| +\end{center} + +\board +{ r * rk*} +{* * *pbp} +{ *p* *p*} +{p * p q } +{ * *PB *} +{*PNB*b*P} +{P*P* * *} +{* *RQ *K} +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} ${1 \over 2}\!-\!{1 \over 2}$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Tom Hunt\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Glenrothes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & Nf3 & Nc6\\ +2 & g3 & e5\\ +3 & Nc3 & d5\\ +4 & d3 & Be6\\ +5 & Bg2 & Qd7\\ +6 & Ng5 & d4\\ +7 & Nce4 & Bf5\\ +8 & a3 & Be7\\ +9 & 0-0 & B*g5\\ +10 & N*g5 & f6\\ +11 & Ne4 & Bh3\\ +12 & Nc5 & Qc8\\ +13 & B*h3 & Q*h3\\ +14 & N*b7 & Rb8\\ +15 & Nc5 & h5\\ +16 & e4 & g5\\ +17 & Qf3 & g4\\ +18 & Qf5 & Kf7\\ +19 & Bg5 & Nce7\\ +20 & Qe6+ & Kg6\\ +21 & f4 & e*f4\\ +22 & R*f4 & K*g5\\ +23 & Raf1 & h4\\ +24 & Qf7 & h*g3\\ +25 & Ne6+ & Kh4\\ +26 & h*g3+ & Q*g3+\\ +\end{tabular}}| +\end{center} + +\board +{ r * *nr} +{p p nQ* } +{ * *Np *} +{* * * * } +{ * pPRpk} +{P *P* q } +{ PP* * *} +{* * *RK } +$$\showboard$$ +${1 \over 2}\!-\!{1 \over 2}$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Dan Husband\\ +Glenrothes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & Nc6\\ +3 & d4 & N*d4\\ +4 & N*d4 & c*d4\\ +5 & Q*d4 & e6\\ +6 & Nc3 & Qb6\\ +7 & Q*b6 & a*b6\\ +8 & Bb5 & Bc5\\ +9 & 0-0 & Nf6\\ +10 & Be3 & 0-0\\ +11 & Rfe1 & d6\\ +12 & a4 & Bd7\\ +13 & Bg5 & Bc6\\ +14 & B*f6 & g*f6\\ +15 & Rad1 & Kh8\\ +16 & Rd3 & Rad8\\ +17 & Rh3 & Rg8\\ +18 & Bd3 & Rg7\\ +19 & Nb5 & B*b5\\ +20 & a*b5 & Rdg8\\ +21 & Rg3 & R*g3\\ +22 & h*g3 & h6\\ +23 & Kf1 & Kg7\\ +24 & c3 & d5\\ +25 & e*d5 & e*d5\\ +26 & Ra1 & d4\\ +27 & Ra7 & d*c3\\ +28 & b*c3 & Rd8\\ +29 & Be4 & Rd1+\\ +30 & Ke2 & Rc1\\ +31 & R*b7 & R*c3\\ +32 & Kf1 & Rb3\\ +33 & R*f7+ & Kh8\\ +34 & R*f6 & R*b5\\ +35 & R*h6+ & Kg7\\ +36 & Rg6+ & Kh7\\ +37 & R*b6+&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * * *k} +{ R * * *} +{*rb * * } +{ * *B* *} +{* * * P } +{ * * PP*} +{* * *K* } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} ${1 \over 2}\!-\!{1 \over 2}$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Keith Chance\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Glenrothes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & Nf3 & Nc6\\ +2 & e4 & e5\\ +3 & d4 & e*d4\\ +4 & N*d4 & d6\\ +5 & N*c6 & b*c6\\ +6 & Bd3 & Bb7\\ +7 & 0-0 & Nf6\\ +8 & Re1 & Be7\\ +9 & e5 & d*e5\\ +10 & R*e5 & 0-0\\ +11 & h3 & Re8\\ +12 & Re1 & Qd7\\ +13 & Bg5 & Rad8\\ +14 & B*f6 & B*f6\\ +15 & R*e8+ & Q*e8\\ +16 & Nc3 & Ba6\\ +17 & Qe1 & Q*e1+\\ +18 & R*e1 & B*d3\\ +19 & c*d3 & g6\\ +20 & Rd1 & Rb8\\ +21 & Ne4 & B*b2\\ +22 & Rb1 & a5\\ +23 & Nc3 & Rb4\\ +24 & Nd1 & Ba3\\ +25 & R*b4 & B*b4\\ +26 & Kf1 & f5\\ +27 & Nb2 & Kf7\\ +28 & Nc4 & Ke6\\ +29 & Ke2 & Kd5\\ +30 & a3 & Bc5\\ +31 & N*a5 & B*a3\\ +32 & Nc4 & Bc5\\ +33 & f3 & h5\\ +34 & g4 & h*g4\\ +35 & h*g4 & f*g4\\ +36 & f*g4 & Ke6\\ +37 & Kf3 & Bd6\\ +38 & Ke4 & g5\\ +39 & Na5 & c5\\ +40 & Nc4 & Bf4\\ +41 & Na5 & Bd2\\ +42 & Nc4 & Bb4\\ +43 & Ne5 & Bd2\\ +44 & Nf3 & Bc1\\ +45 & Ne5 & Bf4\\ +46 & Ng6 & Bg3\\ +47 & Nf8+ & Kd6\\ +48 & Nh7 & Bf4\\ +49 & Kf5 & Kd5\\ +50 & N*g5 & B*g5\\ +51 & K*g5 & Kd4\\ +52 & Kf5 & K*d3\\ +53 & g5 & c4\\ +54 & g6 & c3\\ +55 & g7 & c2\\ +56 & g8=Q & c1=Q\\ +57 & Qd5+ & Ke2\\ +58 & Qg2+ & Kd1\\ +59 & Qg1+&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* p * * } +{ * * * *} +{* * *K* } +{ * * * *} +{* * * * } +{ * * * *} +{* qk* Q } +$$\showboard$$ +${1 \over 2}\!-\!{1 \over 2}$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} ${1 \over 2}\!-\!{1 \over 2}$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Jim King\\ +Glenrothes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & Nc6\\ +3 & d4 & c*d4\\ +4 & N*d4 & d6\\ +5 & Bb5 & Qc7\\ +6 & 0-0 & a6\\ +7 & Ba4 & b5\\ +8 & Bb3 & Nf6\\ +9 & Re1 & e6\\ +10 & Bg5 & Be7\\ +11 & c3 & 0-0\\ +12 & Nd2 & Bb7\\ +13 & Qe2 & Rfe8\\ +14 & Rac1 & d5\\ +15 & Bc2 & Rac8\\ +16 & e5 & Nd7\\ +17 & B*e7 & R*e7\\ +18 & N2f3 & h6\\ +19 & Qd3 & g6\\ +20 & Qe3 & Kg7\\ +21 & Nh4 & Nc*e5\\ +22 & b3 & Q*c3\\ +23 & Q*c3 & R*c3\\ +24 & Bb1 & b4\\ +25 & R*c3 & b*c3\\ +26 & Rc1 & g5\\ +27 & Nhf3 & N*f3+\\ +28 & N*f3 & g4\\ +29 & Nd4 & e5\\ +30 & Nf5+ & Kf6\\ +31 & N*e7 & K*e7\\ +32 & R*c3 & Kd6\\ +33 & h3 & Nf6\\ +34 & h*g4 & N*g4\\ +35 & Bf5 & Nf6\\ +36 & Bc8 & d4\\ +37 & Rc4 & Bd5\\ +38 & Rc2 & a5\\ +39 & f3 & Nh5\\ +40 & Ba6 & Nf4\\ +41 & Rd2 & f6\\ +42 & Bd3 & Bc6\\ +43 & Kf2 & h5\\ +44 & g3 & Ne6\\ +45 & a4 & Be8\\ +46 & Bb5 & Bg6\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * * * } +{ * knpb*} +{pB* p *p} +{P* p * *} +{*P* *PP } +{ * R K *} +{* * * * } +$$\showboard$$ +${1 \over 2}\!-\!{1 \over 2}$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} R. Gourley\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Glenrothes Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & Nf3 & Nc6\\ +2 & d4 & e6\\ +3 & c4 & d5\\ +4 & Nc3 & Bb4\\ +5 & e3 & Nf6\\ +6 & Bd2 & 0-0\\ +7 & Ne5 & N*e5\\ +8 & d*e5 & Ne4\\ +9 & N*e4 & d*e4\\ +10 & B*b4 & c5\\ +11 & B*c5 & Qa5+\\ +12 & b4 & Rd8\\ +13 & b*a5 & R*d1+\\ +14 & R*d1 & h6\\ +15 & Rd8+ & Kh7\\ +16 & Be7 & b6\\ +17 & a*b6 & a*b6\\ +\end{tabular}}| +\end{center} + +\board +{r*bR * *} +{* * Bppk} +{ p *p* p} +{* * P * } +{ *P*p* *} +{* * P * } +{P* * PPP} +{* * KB*R} +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Grant Glynis\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & d4 & c*d4\\ +4 & N*d4 & Nf6\\ +5 & Nc3 & a6\\ +6 & Bc4 & Nc6\\ +7 & N*c6 & b*c6\\ +8 & Be3 & e6\\ +9 & 0-0 & Be7\\ +10 & Bb3 & 0-0\\ +11 & Qe2 & Bb7\\ +12 & Rad1 & Qc7\\ +13 & f4 & e5\\ +14 & Kh1 & Rfd8\\ +15 & Qf3 & Qc8\\ +16 & f*e5 & d*e5\\ +17 & Qg3 & R*d1\\ +18 & N*d1 & Qg4\\ +19 & Q*e5 & Q*e4\\ +20 & Q*e4 & N*e4\\ +21 & R*f7 & Nd6\\ +22 & R*e7+ & Kh8\\ +23 & Re5 & Rf8\\ +24 & Kg1 & h6\\ +25 & Bc5 & Rf6\\ +26 & c3 & a5\\ +27 & g3 & Ba6\\ +28 & Bc2 & g5\\ +29 & Bd4 & Kg8\\ +30 & R*a5 & Rf1+\\ +31 & Kg2 & Rf8\\ +32 & R*a6 & Nc4\\ +33 & R*c6 & Na5\\ +34 & R*h6 & Rf7\\ +35 & Rh8 mate&\\ +\end{tabular}}| +\end{center} + +\board +{ * * *kR} +{* * *r* } +{ * * * *} +{n * * p } +{ * B * *} +{* P * P } +{PPB* *KP} +{* *N* * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo B20\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Alistair Welshman\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Bc4 & d6\\ +3 & Nc3 & Nf6\\ +4 & Nf3 & e6\\ +5 & 0-0 & Be7\\ +6 & d3 & 0-0\\ +7 & Bg5 & Nc6\\ +8 & B*f6 & B*f6\\ +9 & Bb5 & Bd7\\ +10 & B*c6 & B*c6\\ +11 & Qe2 & Re8\\ +12 & Rae1 & B*c3\\ +13 & b*c3 & Qa5\\ +14 & e5 & d5\\ +15 & d4 & Bb5\\ +16 & Qe3 & B*f1\\ +17 & R*f1 & c*d4\\ +18 & Q*d4 & Rac8\\ +19 & Qb4 & Q*b4\\ +20 & c*b4 & R*c2\\ +21 & Ra1 & Rec8\\ +22 & Kf1 & Rc1+\\ +23 & R*c1 & R*c1+\\ +24 & Ke2 & Rc2+\\ +25 & Nd2 & R*a2\\ +26 & g4 & Rb2\\ +\end{tabular}}| +\end{center} + +\board +{ * * *k*} +{pp* *ppp} +{ * *p* *} +{* *pP * } +{ P * *P*} +{* * * * } +{ r NKP P} +{* * * * } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C02\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Robin Taylor (1610)\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & d4 & e6\\ +2 & e4 & d5\\ +3 & e5 & c5\\ +4 & c3 & Nc6\\ +5 & Nf3 & Bd7\\ +6 & Bf4 & c*d4\\ +7 & c*d4 & Bb4+\\ +8 & Bd2 & B*d2+\\ +9 & Q*d2 & Nge7\\ +10 & Nc3 & a6\\ +11 & a3 & Qc7\\ +12 & Bd3 & 0-0-0\\ +13 & 0-0 & Rdf8\\ +14 & b4 & f6\\ +15 & b5 & N*d4\\ +16 & N*d4 & Q*e5\\ +17 & b*a6 & Q*d4\\ +18 & a*b7+ & Kb8\\ +19 & Ne2 & Qa7\\ +20 & Qb4 & Nf5\\ +21 & B*f5 & e*f5\\ +22 & Qd6+ & K*b7\\ +23 & Rab1+ & Kc8\\ +24 & Rfc1+ & Kd8\\ +25 & Rb8+ & Q*b8\\ +26 & Q*b8+ & Ke7\\ +27 & Qb4+ & Kf7\\ +28 & f4 & Rc8\\ +29 & R*c8 & R*c8\\ +30 & Qd6 & Be6\\ +31 & Nd4 & Rc1+\\ +32 & Kf2 & Rd1\\ +33 & Q*e6+ & Kf8\\ +34 & N*f5 & Rd2+\\ +35 & Ke3&\\ +\end{tabular}}| +\end{center} + +\board +{ * * k *} +{* * * pp} +{ * *Qp *} +{* *p*N* } +{ * * P *} +{P * K * } +{ * r *PP} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Mar 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo B92\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Steve Smith (1745)\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Dunfermline C vs Stirling A +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & d4 & c*d4\\ +4 & N*d4 & Nf6\\ +5 & Nc3 & a6\\ +6 & Be2 & e5\\ +7 & Nb3 & Be7\\ +8 & 0-0 & 0-0\\ +9 & a4 & Be6\\ +10 & f4 & B*b3\\ +11 & c*b3 & Nc6\\ +12 & Be3 & Qd7\\ +13 & Bc4 & Rad8\\ +14 & f5 & Kh8\\ +15 & Qf3 & Nb4\\ +16 & Rfd1 & Nc2\\ +17 & Rac1 & N*e3\\ +18 & Q*e3 & Qc6\\ +19 & Nd5 & N*d5\\ +20 & B*d5 & Qd7\\ +21 & Qb6 & Rb8\\ +22 & Rc7 & Bd8\\ +23 & R*d7 & B*b6+\\ +24 & Kf1 & f6\\ +25 & B*b7 & Bd4\\ +26 & Rc1 & B*b2\\ +27 & Rcc7 & Rg8\\ +28 & B*a6 & h5\\ +29 & Bc4 & Rgc8\\ +30 & R*g7 & R*c7\\ +31 & R*c7 & Bd4\\ +32 & Rf7 & Rg8\\ +33 & R*f6 & Rg4\\ +34 & Bd5 & Rf4+\\ +35 & Ke1 & Bc3+\\ +36 & Ke2 & Bd4\\ +37 & Rh6+ & Kg7\\ +38 & R*h5 & Rf2+\\ +39 & Kd3 & R*g2\\ +40 & Kc4 & Bg1\\ +41 & h4 & Rc2+\\ +42 & Kd3 & Rg2\\ +43 & Rg5+ & R*g5\\ +44 & h*g5 & Bb6\\ +45 & Kc4 & Bd8\\ +46 & f6+ & Kg6\\ +47 & f7 & Be7\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * bP* } +{ * p *k*} +{* *Bp P } +{P*K*P* *} +{*P* * * } +{ * * * *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Apr 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo C10\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Phillips Bill\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e6\\ +2 & d4 & d5\\ +3 & Nc3 & c5\\ +4 & e5 & Nc6\\ +5 & Nf3 & Qb6\\ +6 & Bb5 & Bd7\\ +7 & B*c6 & B*c6\\ +8 & 0-0 & Ne7\\ +9 & d*c5 & Q*c5\\ +10 & Be3 & Qa5\\ +11 & Qd3 & Nf5\\ +12 & Nd4 & N*e3\\ +13 & N*c6 & b*c6\\ +14 & Q*e3 & Bc5\\ +15 & Qd3 & 0-0\\ +16 & a3 & Qc7\\ +17 & b4 & Bb6\\ +18 & Rfe1 & a6\\ +19 & Na4 & Rfb8\\ +20 & N*b6 & R*b6\\ +21 & c4 & d*c4\\ +22 & Q*c4 & Rb5\\ +23 & Qe4 & Rd5\\ +24 & Rad1 & Rad8\\ +25 & R*d5 & c*d5\\ +26 & Qd4 & Rc8\\ +27 & f4 & g6\\ +28 & Re3 & h5\\ +29 & Kf2 & Qc2+\\ +30 & Kf3 & Rc4\\ +31 & Qd3 & Qc1\\ +32 & Qe2 & d4\\ +33 & Rd3 & Rc3\\ +34 & Ke4 & R*a3\\ +35 & R*a3 & Q*a3\\ +36 & Qc4 & Qe3 mate\\ +\end{tabular}}| +\end{center} + +\board +{ * * *k*} +{* * *p* } +{p* *p*p*} +{* * P *p} +{ PQpKP *} +{* * q * } +{ * * *PP} +{* * * * } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Apr 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo C97\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Andrew Watt\\ +Edinburgh Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & a6\\ +4 & Ba4 & Nf6\\ +5 & 0-0 & Be7\\ +6 & Re1 & b5\\ +7 & Bb3 & d6\\ +8 & c3 & 0-0\\ +9 & h3 & Na5\\ +10 & Bc2 & c5\\ +11 & d4 & Qc7\\ +12 & b4 & c*b4\\ +13 & c*b4 & Nc4\\ +14 & Nbd2 & Bb7\\ +15 & N*c4 & Q*c4\\ +16 & d*e5 & d*e5\\ +17 & a3 & Rac8\\ +18 & Bd3 & Qc3\\ +19 & Bg5 & Rfd8\\ +20 & Re3 & B*e4\\ +21 & Rc1 & Q*c1\\ +22 & Q*c1 & R*c1+\\ +23 & Re1 & R*e1+\\ +24 & N*e1 & B*d3\\ +25 & Nf3 & Be4\\ +26 & N*e5 & Rd1+\\ +27 & Kh2 & Bd6\\ +28 & f4 & h6\\ +29 & Bh4 & g5\\ +30 & Bg3 & B*e5\\ +31 & f*e5 & Nh5\\ +32 & e6 & N*g3\\ +33 & e7 & Nf1+\\ +34 & Kg1 & Bc6\\ +35 & Kf2 & f6\\ +36 & Ke2 & Ra1\\ +37 & Kd3 & Kf7\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * Pk* } +{p*b* p p} +{*p* * p } +{ P * * *} +{P *K* *P} +{ * * *P*} +{r * *n* } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Apr 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo B50\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Jake Milne\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Edinburgh Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & Bc4 & e6\\ +4 & d3 & Nf6\\ +5 & a3 & Nc6\\ +6 & Nc3 & Be7\\ +7 & 0-0 & 0-0\\ +8 & Be3 & b6\\ +9 & h3 & Bb7\\ +10 & Ne2 & d5\\ +11 & e*d5 & e*d5\\ +12 & Ba2 & Re8\\ +13 & c3 & Qc7\\ +14 & Bf4 & Bd6\\ +15 & B*d6 & Q*d6\\ +16 & d4 & c*d4\\ +17 & Ne*d4 & N*d4\\ +18 & N*d4 & Rad8\\ +19 & Qd2 & Ba6\\ +20 & Qg5 & Re5\\ +21 & Nf5 & R*f5\\ +22 & Q*f5 & B*f1\\ +23 & R*f1 & g6\\ +24 & Qf3 & Kg7\\ +25 & Rd1 & Qe5\\ +26 & g3 & a5\\ +27 & Kg2 & h5\\ +28 & h4 & Rd6\\ +29 & Bb1 & d4\\ +30 & Qd3 & Qd5+\\ +31 & Qf3 & Qb3\\ +32 & Qe2 & Qd5+\\ +33 & f3 & Qe6\\ +34 & Q*e6 & R*e6\\ +35 & Be4 & d*c3\\ +36 & b*c3 & N*e4\\ +37 & f*e4 & R*e4\\ +38 & Rd6 & Re2+\\ +39 & Kf3 & Rb2\\ +40 & Rd3 & a4\\ +41 & Ke4 & f5+\\ +42 & Kd5 & Re2\\ +43 & c4 & Re8\\ +44 & Kc6 & Rc8+\\ +45 & K*b6 & R*c4\\ +46 & Kb5 & Rg4\\ +47 & Rd7+ & Kf6\\ +48 & Ra7 & f4\\ +49 & g*f4 & R*f4\\ +50 & R*a4 & R*a4\\ +51 & K*a4 & g5\\ +52 & h*g5+ & K*g5\\ +53 & Kb5 & h4\\ +54 & a4 & h3\\ +55 & a5 & h2\\ +56 & a6 & h1=Q\\ +57 & Kb6 & Qb1+\\ +58 & Ka7 & Kf5\\ +59 & Ka8 & Qe4+\\ +60 & Kb8 & Qe8+\\ +61 & Kb7 & Qd7+\\ +62 & Kb6 & Qd8+\\ +63 & Kb7 & Qd5+\\ +64 & Kb6 & Qa8\\ +65 & Ka5 & Ke5\\ +66 & Kb6 & Kd5\\ +67 & Ka5 & Kc5\\ +68 & Ka4 & Q*a6+\\ +69 & Kb3 & Qc4+\\ +70 & Ka3 & Qb5\\ +71 & Ka2 & Kc4\\ +72 & Ka1 & Kc3\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * * * } +{ * * * *} +{*q* * * } +{ * * * *} +{* k * * } +{ * * * *} +{K * * * } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Apr 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo C54\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} John Bourke\\ +Edinburgh Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bc4 & Bc5\\ +4 & c3 & Nf6\\ +5 & d4 & e*d4\\ +6 & c*d4 & Bb4+\\ +7 & Bd2 & N*e4\\ +8 & B*b4 & N*b4\\ +9 & B*f7+ & K*f7\\ +10 & Qb3+ & d5\\ +11 & Q*b4 & Re8\\ +12 & 0-0 & Kg8\\ +13 & Nc3 & b6\\ +14 & Rfe1 & Bf5\\ +15 & Qb3 & c6\\ +16 & Rac1 & Qd6\\ +17 & Re3 & N*c3\\ +18 & Q*c3 & R*e3\\ +19 & Q*e3 & Rc8\\ +20 & Re1 & h6\\ +21 & Qe7 & Q*e7\\ +22 & R*e7 & a5\\ +23 & Rb7 & b5\\ +24 & Ne5 & c5\\ +25 & R*b5 & c*d4\\ +26 & f4 & Be4\\ +27 & R*a5 & Rc1+\\ +28 & Kf2 & Rc2+\\ +29 & Kg3 & R*g2+\\ +30 & Kh3 & R*b2\\ +31 & Ra3 & Rd2\\ +32 & Kg3 & Rg2+\\ +33 & Kh3 & Rd2\\ +34 & Kg3 & d3\\ +35 & Nf3 & Rb2\\ +36 & h4 & d2\\ +37 & N*d2 & R*d2\\ +38 & Kg4 & Rd3\\ +39 & R*d3 & B*d3\\ +40 & Kf3 & Bc4\\ +41 & a4 & Kf7\\ +42 & Ke3 & Ke6\\ +43 & Kd4 & Kf5\\ +44 & a5 & K*f4\\ +45 & a6 & B*a6\\ +46 & K*d5 & Kg4\\ +47 & Ke6 & K*h4\\ +48 & Kf7 & g5\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * *K* } +{b* * * p} +{* * * p } +{ * * * k} +{* * * * } +{ * * * *} +{* * * * } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Apr 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C70\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} David King\\ +Edinburgh Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & a6\\ +4 & Ba4 & b5\\ +5 & Bb3 & Bc5\\ +6 & 0-0 & Nge7\\ +7 & c3 & d6\\ +8 & d4 & e*d4\\ +9 & c*d4 & Ba7\\ +10 & Be3 & Na5\\ +11 & Bc2 & 0-0\\ +12 & Nbd2 & f5\\ +13 & Bg5 & Qe8\\ +14 & Re1 & h6\\ +15 & B*e7 & Q*e7\\ +16 & e*f5 & Qf6\\ +17 & Be4 & Bb7\\ +18 & B*b7 & N*b7\\ +19 & Qb3+ & Kh8\\ +20 & Qd5 & Rab8\\ +21 & Rac1 & Bb6\\ +22 & g4 & Nd8\\ +23 & Ne4 & Qf7\\ +24 & Q*f7 & R*f7\\ +25 & h3&\\ +\end{tabular}}| +\end{center} +At this point the score sheet goes wrong. Black eventually looses on +time! + +\board +{ r n * k} +{* p *rp } +{pb p * p} +{*p* *P* } +{ * PN*P*} +{* * *N*P} +{PP * P *} +{* R R K } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Apr 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo D20\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} C. Tait\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Edinburgh Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & d4 & d5\\ +2 & c4 & d*c4\\ +3 & e4 & c6\\ +4 & B*c4 & e6\\ +\end{tabular}}| +\end{center} +|4\ldots~Nf6; 5.~Nc3, e5; 6.~Be3, e*d4; 7.~B*d4, Bd6; 8.~f3| +Score: 0.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & Nf3 & Bb4+\\ +\end{tabular}}| +\end{center} +|5\ldots~Nf6; 6.~Qe2, Bb4; 7.~Bd2, Qb6; 8.~Nc3, 0-0; 9.~0-0, Nbd7| +Score: 0.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & Bd2 & B*d2+\\ +7 & Q*d2&\\ +\end{tabular}}| +\end{center} +|7.~Nb*d2, Nf6; 8.~0-0, 0-0; 9.~Rc1, Nbd7; 10.~Qe2, c5; 11.~Bd3| +Score: 0.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & Nf6\\ +8 & Nc3 & 0-0\\ +\end{tabular}}| +\end{center} +|8\ldots~Nbd7; 9.~0-0, 0-0; 10.~Rad1, Qe7; 11.~Rfe1, e5| +Score: 0.38 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & 0-0 & b6\\ +10 & e5&\\ +\end{tabular}}| +\end{center} +|10.~Rac1, Bb7; 11.~Rfd1, c5; 12.~d*c5, Q*d2; 13.~R*d2, b*c5| +Score: 0.28 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & \ldots & Nfd7\\ +\end{tabular}}| +\end{center} +|10\ldots~Nd5; 11.~Rfd1, Ba6; 12.~B*a6, N*a6; 13.~Rac1, Nac7; 14.~N*d5, c*d5| +Score: 0.28 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & Rfd1 & Ba6\\ +\end{tabular}}| +\end{center} +|11\ldots~Bb7; 12.~Ne4, c5; 13.~d5, b5; 14.~B*b5, B*d5; 15.~Qe3, Qe7| +Score: 0.34 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & Bb3&\\ +\end{tabular}}| +\end{center} +|12.~B*a6, N*a6; 13.~Rac1, Qe7; 14.~Ne4, c5; 15.~Qe2, Nb4; 16.~d*c5| +Score: 0.34 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & \ldots & Re8\\ +\end{tabular}}| +\end{center} +|12\ldots~h6; 13.~Rac1, Qe7; 14.~Ne4, Rd8; 15.~Nd6, Nf6; 16.~Qe3| +Score: 0.31 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & Ne4 & c5\\ +\end{tabular}}| +\end{center} +|13\ldots~h6; 14.~Nd6, Re7; 15.~Rac1, c5; 16.~Bc2, Nc6; 17.~Be4, Qc7| +Score: 0.44 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & Nd6&\\ +\end{tabular}}| +\end{center} +|14.~d*c5, Bb7; 15.~Qe3, Re7; 16.~Nd6, Bc6; 17.~Ne4, b*c5; 18.~N*c5| +Score: 1.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & \ldots & Rf8\\ +\end{tabular}}| +\end{center} +|14\ldots~Re7; 15.~N*f7, R*f7; 16.~B*e6, c*d4; 17.~Bd5, Nc6; 18.~B*c6| +Score: 0.44 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & d5 & b5\\ +\end{tabular}}| +\end{center} +|15\ldots~Qe7; 16.~N*f7, c4; 17.~d*e6, N*e5; 18.~N3*e5, c*b3; 19.~Qd5| +Score: 1.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & d*e6 & f*e6\\ +\end{tabular}}| +\end{center} +|16\ldots~c4; 17.~N*f7, Qb6; 18.~e*d7, N*d7; 19.~Q*d7, R*f7; 20.~Qd5| +Score: 3.75 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & B*e6+ & Kh8\\ +18 & Nf7+&\\ +\end{tabular}}| +\end{center} +|18.~Qd5, Qe7; 19.~Nf7, R*f7; 20.~B*f7, h6| +Score: 4.56 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & R*f7\\ +19 & B*f7 & Nc6\\ +\end{tabular}}| +\end{center} +|19\ldots~Bb7; 20.~Ng5, h6; 21.~Bd5| +Score: 3.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & e6&\\ +\end{tabular}}| +\end{center} +|20.~Q*d7, Nd4; 21.~Qg4, Qe7; 22.~N*d4, Q*f7; 23.~e6, Qf6| +Score: 5.84 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & \ldots & Qe7\\ +\end{tabular}}| +\end{center} +|20\ldots~Nf6; 21.~Rac1, c4; 22.~b3, Q*d2; 23.~R*d2, Rd8; 24.~R*d8, N*d8| +Score: 3.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & Q*d7 & Bc8\\ +\end{tabular}}| +\end{center} +|21\ldots~Bb7; 22.~Q*e7, N*e7; 23.~Rd7, B*f3; 24.~g*f3, Nc6; 25.~e7, N*e7| +Score: 7.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & Q*c6&\\ +\end{tabular}}| +\end{center} +|22.~Q*e7, B*e6; 23.~Q*e6, Nd4; 24.~N*d4, c*d4; 25.~R*d4, a6| +Score: 17.72 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & Rb8\\ +\end{tabular}}| +\end{center} +|22\ldots~Bb7; 23.~Qd7, Q*d7; 24.~e*d7, Rd8; 25.~Re1, g6; 26.~Re8, Kg7| +Score: 10.66 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & Qe8+&\\ +\end{tabular}}| +\end{center} +|23.~Q*c5, B*e6; 24.~Q*e7, B*f7; 25.~Q*a7, Rf8; 26.~Q*f7, Rc8| +Score: 18.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & \ldots & Q*e8\\ +24 & B*e8 & Bb7\\ +\end{tabular}}| +\end{center} +|24\ldots~B*e6; 25.~Bd7, Bg8; 26.~Ne5, g6; 27.~Rac1, c4; 28.~a4, b*a4| +Score: 7.88 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & Bf7&\\ +\end{tabular}}| +\end{center} +|25.~B*b5, B*f3; 26.~g*f3, Kg8; 27.~e7, Kf7; 28.~Rd8, K*e7; 29.~R*b8| +Score: 12.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & \ldots & Bc6\\ +\end{tabular}}| +\end{center} +|25\ldots~g5; 26.~e7, Kg7; 27.~Rd8, Bc6; 28.~R*b8, K*f7; 29.~Ne5, K*e7| +Score: 12.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & Rd2&\\ +\end{tabular}}| +\end{center} +|26.~Ne5, B*g2; 27.~e7, g6; 28.~K*g2| +Score: 15.75 + +\board +{ r * * k} +{p * *Bpp} +{ *b*P* *} +{*pp * * } +{ * * * *} +{* * *N* } +{PP R PPP} +{R * * K } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Apr 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo B50\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} J. Comrie\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Dunfermline C vs Alloa +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & Bc4 & e6\\ +4 & Nc3 & Be7\\ +5 & d4 & c*d4\\ +6 & Q*d4 & Nf6\\ +7 & e5 & d*e5\\ +8 & Q*d8+ & B*d8\\ +9 & N*e5 & 0-0\\ +10 & 0-0 & Nbd7\\ +11 & N*d7 & B*d7\\ +12 & Be3 & a6\\ +13 & a4 & Ba5\\ +14 & Ne2 & Bc6\\ +15 & Nd4 & Nd5\\ +16 & N*c6 & b*c6\\ +17 & B*d5 & c*d5\\ +18 & c3 & Rab8\\ +19 & b4 & Bc7\\ +20 & Rfd1 & Rfd8\\ +21 & Rac1 & Bb6\\ +22 & Kf1 & B*e3\\ +23 & f*e3 & f5\\ +24 & Rc2 & g5\\ +25 & Kf2 & Kf7\\ +26 & Kf3 & Rdc8\\ +27 & g4 & R*b4\\ +28 & g*f5 & Kf6\\ +29 & f*e6 & K*e6\\ +30 & Rd4 & R*d4\\ +31 & e*d4 & Rf8+\\ +32 & Kg4 & h6\\ +33 & Re2+ & Kd6\\ +34 & Rb2 & Rc8\\ +35 & Kh5 & R*c3\\ +36 & Rb6+ & Rc6\\ +37 & R*c6+ & K*c6\\ +38 & K*h6 & g4\\ +39 & Kg5 & Kd6\\ +40 & K*g4 & Ke6\\ +41 & Kg5 & Ke7\\ +42 & h4 & Kf7\\ +43 & h5 & Kg7\\ +44 & Kf5&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * * k } +{p* * * *} +{* *p*K*P} +{P* P * *} +{* * * * } +{ * * * *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Apr 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C65\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Scott Hunter\\ +Dunfermline Club Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & Nf6\\ +4 & d3 & Bc5\\ +5 & 0-0 & 0-0\\ +6 & Re1 & d5\\ +7 & Be3 & B*e3\\ +8 & e*d5 & Q*d5\\ +9 & B*c6 & Q*c6\\ +10 & R*e3 & e4\\ +11 & d*e4 & N*e4\\ +12 & Nc3 & N*c3\\ +13 & R*c3 & Qd6\\ +14 & Q*d6 & c*d6\\ +15 & Rd1 & Re8\\ +16 & R*d6 & g5\\ +17 & g4 & B*g4\\ +18 & N*g5 & Re1+\\ +19 & Kg2 & Rae8\\ +20 & Rg3 & f5\\ +21 & h3 & Be2\\ +22 & Nf3+ & Kf7\\ +23 & N*e1 & f4\\ +24 & Rf3 & B*f3+\\ +25 & N*f3 & Re2\\ +26 & Rd7+ & Kf8\\ +27 & R*b7 & R*c2\\ +28 & R*a7 & R*b2\\ +29 & Ra4 & Kf7\\ +30 & R*f4+ & Kg6\\ +31 & a4 & h5\\ +32 & h4 & Ra2\\ +33 & Kg3 & Ra3\\ +34 & Rc4 & Rd3\\ +35 & Kf4 & Rd5\\ +36 & Ne5+ & Kf6\\ +37 & Re4 & Ra5\\ +38 & Nd7+ & Kg6\\ +39 & f3 & Rf5+\\ +40 & Ke3&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* *N* * } +{ * * *k*} +{* * *r*p} +{P* *R* P} +{* * KP* } +{ * * * *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} May 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo B20\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} James Hepburn\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Under 1500 Final +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Bc4 & d6\\ +3 & d3 & e6\\ +4 & Nc3 & Nf6\\ +5 & Nf3 & a6\\ +6 & Bd2 & Nc6\\ +7 & 0-0 & Be7\\ +8 & Re1 & 0-0\\ +9 & a3 & e5\\ +10 & h3 & b5\\ +11 & Bb3 & Bb7\\ +12 & Nd5 & N*d5\\ +13 & B*d5 & Qd7\\ +14 & c3 & Na5\\ +15 & b4 & B*d5\\ +16 & e*d5 & Nb7\\ +17 & Re4 & f5\\ +18 & Re2 & c*b4\\ +19 & a*b4 & Bf6\\ +20 & Qb3 & a5\\ +21 & Rae1 & a*b4\\ +22 & c*b4 & Rfe8\\ +23 & Bg5 & B*g5\\ +24 & N*g5 & Nd8\\ +25 & f4 & Nf7\\ +26 & N*f7 & Q*f7\\ +27 & f*e5 & d*e5\\ +28 & R*e5 & R*e5\\ +29 & R*e5 & Ra1+\\ +30 & Kh2 & g5\\ +31 & d4 & Kg7\\ +32 & Qd3 & Qd7\\ +33 & R*f5 & Qd6+\\ +34 & Re5 & Q*b4\\ +35 & R*g5+ & Kf7\\ +36 & Q*h7+ & Kf6\\ +37 & Qh6+ & Ke7\\ +38 & Rg7+ & Kd8\\ +39 & Qh8+&\\ +\end{tabular}}| +\end{center} + +\board +{ * k * Q} +{* * * R } +{ * * * *} +{*p*P* * } +{ q P * *} +{* * * *P} +{ * * *PK} +{r * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} May 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo D02\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} D. Heron (1790)\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +East of Scotland Championship +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & Nf3 & Nc6\\ +2 & d4 & d5\\ +3 & Bf4 & Bf5\\ +4 & e3 & a6\\ +5 & c4 & e6\\ +6 & Nc3 & Nf6\\ +7 & a3 & Qd7\\ +8 & b4 & Bd6\\ +9 & B*d6 & Q*d6\\ +10 & Be2 & 0-0\\ +11 & 0-0 & Ne4\\ +12 & N*e4 & B*e4\\ +13 & Nd2 & Bg6\\ +14 & Qb3 & Ne7\\ +15 & c5 & Qd7\\ +16 & a4 & c6\\ +17 & b5 & Nf5\\ +18 & Ra3 & Rfe8\\ +19 & Qb2 & Kh8\\ +20 & Rb3 & Nh6\\ +21 & b*c6 & b*c6\\ +22 & Rb7 & Qc8\\ +23 & Nf3 & Rb8\\ +24 & B*a6 & R*b7\\ +25 & Q*b7 & Q*b7\\ +26 & B*b7 & f6\\ +27 & B*c6 & Rb8\\ +28 & Bb5 & Bc2\\ +29 & Rc1 & Be4\\ +30 & Nd2 & Bg6\\ +31 & Nb1 & Ng8\\ +32 & Nc3 & Ne7\\ +33 & a5 & Nc8\\ +34 & Bd7 & Bf5\\ +35 & N*d5 & e*d5\\ +36 & B*f5 & Ne7\\ +37 & Bd3 & Nc6\\ +38 & Rb1 & R*b1+\\ +39 & B*b1 & N*a5\\ +40 & Ba2&\\ +\end{tabular}}| +\end{center} + +\board +{ * * * k} +{* * * pp} +{ * * p *} +{n Pp* * } +{ * P * *} +{* * P * } +{B* * PPP} +{* * * K } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} May 1994 \hspace{.3 in} ${1 \over 2}\!-\!{1 \over 2}$\\ +\hline +Foo A15\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} W. Falconer\\ +East of Scotland Chalengers +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & c4 & Nf6\\ +2 & d3 & e6\\ +3 & Nf3 & d5\\ +4 & c*d5 & N*d5\\ +5 & a3 & Bd6\\ +6 & e3 & Nc6\\ +7 & Nbd2 & 0-0\\ +8 & Nc4 & Bd7\\ +9 & Be2 & b5\\ +10 & N*d6 & c*d6\\ +11 & 0-0 & Rc8\\ +12 & Bd2 & Qb6\\ +13 & Qb3 & Ne5\\ +14 & Rac1 & a6\\ +15 & Rc2 & R*c2\\ +16 & Q*c2 & Rc8\\ +17 & Qb1 & N*f3+\\ +18 & B*f3 & Bc6\\ +19 & Rc1 & Qd8\\ +20 & B*d5 & B*d5\\ +21 & Ba5 & Qd7\\ +22 & R*c8+ & Q*c8\\ +23 & Bb4 & Qc6\\ +24 & f3 & Bb3\\ +25 & Qe1 & Qc2\\ +26 & Qc3 & Q*c3\\ +27 & B*c3 & d5\\ +28 & Kf2 & f6\\ +29 & d4&\\ +\end{tabular}}| +\end{center} + +\board +{ * * *k*} +{* * * pp} +{p* *pp *} +{*p*p* * } +{ * P * *} +{PbB PP* } +{ P * KPP} +{* * * * } +$$\showboard$$ +${1 \over 2}\!-\!{1 \over 2}$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} May 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo A20\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Walter Pearson (1650)\\ +East of Scotland Chalengers +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & c4 & e5\\ +2 & d3 & Ne7\\ +3 & Nf3 & d6\\ +4 & e3 & g6\\ +5 & Be2 & Bg7\\ +6 & 0-0 & 0-0\\ +7 & Nbd2 & Nd7\\ +8 & Nb3 & b6\\ +9 & d4 & e*d4\\ +10 & Nf*d4 & Bb7\\ +\end{tabular}}| +\end{center} + +\board +{r* q rk*} +{pbpnnpbp} +{ p p *p*} +{* * * * } +{ *PN * *} +{*N* P * } +{PP *BPPP} +{R BQ*RK } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} May 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo D61\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Douglas Heatlie (1650)\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +East of Scotland Chalengers +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & d4 & e6\\ +2 & c4 & d5\\ +3 & Nc3 & Nf6\\ +4 & Bg5 & Be7\\ +5 & e3 & Nbd7\\ +6 & Qc2 & 0-0\\ +7 & Nf3 & Re8\\ +8 & h4 & Nb6\\ +9 & b3 & d*c4\\ +10 & b*c4 & Bd7\\ +11 & Bd3 & g6\\ +12 & B*f6 & B*f6\\ +13 & h5 & B*d4\\ +14 & e*d4 & Qf6\\ +15 & h*g6 & f*g6\\ +16 & Ne4 & Qg7\\ +17 & Nc5 & Bc6\\ +18 & Ne5 & Nd5\\ +19 & c*d5 & e*d5\\ +20 & 0-0-0 & R*e5\\ +21 & d*e5 & Q*e5\\ +22 & g3 & Qg5+\\ +23 & Qd2 & Qe5\\ +24 & Nb3 & Ba4\\ +25 & Qh6 & Qc3+\\ +26 & Bc2 & B*b3\\ +27 & Q*h7+ & Kf8\\ +28 & Qh8+&\\ +\end{tabular}}| +\end{center} + +\board +{r* * k Q} +{ppp * * } +{ * * *p*} +{* *p* * } +{ * * * *} +{*bq * P } +{P*B* P *} +{* KR* *R} +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jul 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo B50\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Graham Mill\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Scottish Chess Minor +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & Bc4&\\ +\end{tabular}}| +\end{center} +This is an unusual way of opening, but is common at the Minor level. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +3 & \ldots & e6\\ +4 & Nc3 & Nf6\\ +5 & d3&\\ +\end{tabular}}| +\end{center} +|5.~0-0| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & \ldots & Nc6\\ +\end{tabular}}| +\end{center} +|5\ldots~d5; 6.~Bb3, d*e4; 7.~N*e4, N*e4; 8.~d*e4, Q*d1+; 9.~K*d1| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & Bf4&\\ +\end{tabular}}| +\end{center} +|6.~0-0, Be7| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & \ldots & a6\\ +7 & 0-0 & Be7\\ +\end{tabular}}| +\end{center} +|7\ldots~Na5; 8.~Bb3, N*b3; 9.~a*b3, Be7; 10.~Re1, 0-0; 11.~Qd2| +\bbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & Re1 & 0-0\\ +\end{tabular}}| +\end{center} + +\board +{r*bq rk*} +{*p* bppp} +{p*nppn *} +{* p * * } +{ *B*PB *} +{* NP*N* } +{PPP* PPP} +{R *QR K } +$$\showboard$$ + I often find this sort of position when playing the sicilian, where +white has the e file, pushes his pawn, and gains a winning advantage. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & e5 & d*e5\\ +10 & N*e5 & Bd7\\ +\end{tabular}}| +\end{center} +|10\ldots~N*e5| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & Ne4&\\ +\end{tabular}}| +\end{center} +|11.~Bb3| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & \ldots & N*e5\\ +12 & B*e5 & Bc6\\ +\end{tabular}}| +\end{center} + +\board +{r* q rk*} +{*p* bppp} +{p*b*pn *} +{* p B * } +{ *B*N* *} +{* *P* * } +{PPP* PPP} +{R *QR K } +$$\showboard$$ +|12\ldots~N*e4; 13.~d*e4, b5; 14.~Bb3, Bc6; 15.~Qh5, Re8| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & B*f6&\\ +\end{tabular}}| +\end{center} +|13.~Qf3, N*e4; 14.~d*e4, b6; 15.~Rad1, Qe8| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & B*e4??\\ +\end{tabular}}| +\end{center} +|13\ldots~B*f6; 14.~N*f6+, Q*f6; 15.~c3, b6; 16.~Qe2| +\bbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & B*e7 & Q*e7\\ +15 & R*e4 & Rac8\\ +16 & f4&\\ +\end{tabular}}| +\end{center} +|16.~a4, Qf6; 17.~c3, Rfd8; 18.~Qe2, h6; 19.~Re1| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & \ldots & b5\\ +17 & Bb3 & Rc6\\ +\end{tabular}}| +\end{center} +|17\ldots~a5| +and I might be able to stir up a queenside pawn charge. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & c4&\\ +\end{tabular}}| +\end{center} +|18.~a4| +striking at the ambushing pawns. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & Rd8\\ +\end{tabular}}| +\end{center} +|18\ldots~Rd6; 19.~c*b5, a*b5; 20.~a4, c4| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & Qe2&\\ +\end{tabular}}| +\end{center} +|19.~c*b5, a*b5; 20.~a4, b*a4; 21.~Ra*a4, Rcd6; 22.~d4, c*d4; 23.~Re*d4| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & \ldots & Rd4\\ +\end{tabular}}| +\end{center} +|19\ldots~b4| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & R*d4&\\ +\end{tabular}}| +\end{center} +|20.~c*b5, a*b5; 21.~a4, b*a4; 22.~R*a4, Rd8; 23.~d4, c*d4; 24.~Re*d4| +All variations just win for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & \ldots & c*d4\\ +21 & Re1&\\ +\end{tabular}}| +\end{center} +|21.~c*b5| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & \ldots & Rc5\\ +22 & Qe4&\\ +\end{tabular}}| +\end{center} +|22.~Qf2, b*c4; 23.~B*c4, Qd6| +Blacks score is rapidly going down. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & Rh5\\ +\end{tabular}}| +\end{center} +|22\ldots~Qd7; 23.~Qa8+, Qc8; 24.~Q*c8+, R*c8; 25.~g3, b*c4; 26.~d*c4| +a passed pawn for white! Blacks passed pawn will not live long. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & g4&\\ +\end{tabular}}| +\end{center} +|23.~f5, Rh6; 24.~c*b5, a*b5| +Totally won for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & \ldots & Rh4\\ +24 & Qa8+ & Qf8\\ +25 & Q*f8+ & K*f8\\ +\end{tabular}}| +\end{center} + +\board +{ * * k *} +{* * *ppp} +{p* *p* *} +{*p* * * } +{ *Pp PPr} +{*B*P* * } +{PP * * P} +{* * R K } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & h3?&\\ +\end{tabular}}| +\end{center} +|26.~Bd1, Rh3; 27.~Be2, Ke7; 28.~Kg2, Re3; 29.~h3, Kd6| +Just a piece up. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & \ldots & R*h3\\ +27 & Bc2 & Rg3+\\ +28 & Kf2 & R*g4\\ +29 & Kf3 & h5\\ +\end{tabular}}| +\end{center} +|29\ldots~Rh4; 30.~Kg3, Rh6; 31.~Re4, Rg6+; 32.~Kh3, Rh6+; 33.~Kg2| +And black has drawing chances. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & Re4&\\ +\end{tabular}}| +\end{center} +|30.~Re5, g6; 31.~Re4, Rh4; 32.~R*d4, g5| +Black is only a pawn or so down. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & Ke7\\ +31 & R*d4&\\ +\end{tabular}}| +\end{center} +|31.~c*b5, a*b5; 32.~Re5, g6; 33.~R*b5, Kd6; 34.~Ke4| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & \ldots & e5\\ +\end{tabular}}| +\end{center} +|31\ldots~g5; 32.~c*b5, a*b5; 33.~a4, e5; 34.~Re4, R*f4+; 35.~R*f4, e*f4| +Blacks is a `pawn` down, with 3 connected passed pawns. Not so bad, +but still winning for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +32 & Re4 & R*f4+\\ +33 & R*f4 & e*f4\\ +34 & K*f4 & Kf6\\ +35 & c5 & Ke7\\ +36 & b4 & f6\\ +37 & d4 & g5+\\ +38 & Kg3 & h4+\\ +39 & Kg4 & Ke6\\ +40 & c6 & Kd6\\ +41 & d5 & Kc7\\ +42 & Be4 & Kd6\\ +43 & Bg2 & Kc7\\ +44 & Bh3 & Kd6\\ +45 & Kf5 & Kc7\\ +46 & K*f6 & Kb6\\ +47 & K*g5&\\ +\end{tabular}}| +\end{center} +I finally resigned here. + +\board +{ * * * *} +{* * * * } +{pkP* * *} +{*p*P* K } +{ P * * p} +{* * * *B} +{P* * * *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jul 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C67\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} A. McMonigle\\ +Scottish Chess Minor +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & Nf6\\ +4 & 0-0 & N*e4\\ +\end{tabular}}| +\end{center} + +\board +{r*bqkb r} +{pppp*ppp} +{ *n* * *} +{*B* p * } +{ * *n* *} +{* * *N* } +{PPPP PPP} +{RNBQ*RK } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & Re1&\\ +\end{tabular}}| +\end{center} +|5.~d4, Be7; 6.~d*e5, 0-0; 7.~Be3, a6| +and white has the edge. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & \ldots & d5\\ +\end{tabular}}| +\end{center} +|5\ldots~Nd6; 6.~B*c6, d*c6; 7.~N*e5, Be6; 8.~Nc3, Be7; 9.~Kh1| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & N*e5&\\ +\end{tabular}}| +\end{center} +|6.~d3| +is a killer move. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & \ldots & Qf6\\ +7 & Nf3&\\ +\end{tabular}}| +\end{center} +|7.~N*c6, b*c6; 8.~Qf3, Qg6; 9.~Bd3, Bf5; 10.~B*e4| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & Be7\\ +8 & d3! & Nd6\\ +\end{tabular}}| +\end{center} + +\board +{r*b*k* r} +{ppp bppp} +{ *nn q *} +{*B*p* * } +{ * * * *} +{* *P*N* } +{PPP* PPP} +{RNBQR K } +$$\showboard$$ +|8\ldots~N*f2; 9.~K*f2, Bg4; 10.~Nbd2, 0-0; 11.~B*c6, b*c6| +\wupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & B*c6+&\\ +\end{tabular}}| +\end{center} +|9.~Bg5, Q*b2; 10.~B*c6+, b*c6; 11.~R*e7+, Kf8; 12.~Nbd2, h6| +White is a couple of pawns up, but the tactices are hairy! +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & \ldots & b*c6\\ +10 & c3 & 0-0\\ +\end{tabular}}| +\end{center} + +\board +{r*b* rk*} +{p p bppp} +{ *pn q *} +{* *p* * } +{ * * * *} +{* PP*N* } +{PP * PPP} +{RNBQR K } +$$\showboard$$ +|10\ldots~h6; 11.~Be3, Nf5; 12.~Bf4, Rb8; 13.~Be5, Qg6| +\wbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & Bg5 & Qg6\\ +\end{tabular}}| +\end{center} +|11\ldots~Q*f3; 12.~Q*f3, B*g5; 13.~b3, Bb7; 14.~Qg3, Bf6| +Is blacks best line. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & B*e7 & Re8\\ +13 & B*d6 & R*e1+\\ +14 & Q*e1 & Q*d6\\ +15 & Qe8+ & Qf8\\ +16 & Q*f8+&\\ +\end{tabular}}| +\end{center} +|16.~Q*c6, Rb8; 17.~Q*c7, R*b2; 18.~Q*a7, Bf5; 19.~Qd4, Qb8; 20.~Nfd2| +\wdecisive{} The proper continuation, and well winning for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & \ldots & K*f8\\ +17 & Ne5&\\ +\end{tabular}}| +\end{center} +|17.~h3| +Still a \wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & \ldots & Bf5\\ +\end{tabular}}| +\end{center} +|17\ldots~c5; 18.~h3, f6; 19.~Nf3| +and white moving the knight was a waste of two tempi. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & \ldots & Rb8\\ +20 & b3 & Bf5\\ +\end{tabular}}| +\end{center} +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & d4&\\ +\end{tabular}}| +\end{center} +|18.~Nd2, Re8; 19.~Ndf3, c5; 20.~g4, f6; 21.~Kg2, f*e5; 22.~g*f5| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & Re8\\ +19 & Nd2 & Re6\\ +\end{tabular}}| +\end{center} + +\board +{ * * k *} +{p p *ppp} +{ *p*r* *} +{* *pNb* } +{ * P * *} +{* P * * } +{PP N PPP} +{R * * K } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & Re1&\\ +\end{tabular}}| +\end{center} +|20.~g4, B*g4; 21.~N*g4, Rg6; 22.~h3, h5; 23.~f3, h*g4; 24.~h*g4| +\wdecisive{} what a cou. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & \ldots & f6\\ +21 & Nd7+ & Ke7\\ +22 & R*e6+ & B*e6\\ +23 & Nc5 & Bf5\\ +24 & f3&\\ +\end{tabular}}| +\end{center} +|24.~h3, h6; 25.~Kh2, Kd6; 26.~Nb7+, Ke7; 27.~g4, Bd3| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & \ldots & Bc8\\ +25 & g4&\\ +\end{tabular}}| +\end{center} +|25.~Kf2, Kd6; 26.~f4, g6; 27.~Kf3, h6; 28.~g3, f5| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & \ldots & Kf7\\ +26 & Kg2&\\ +\end{tabular}}| +\end{center} +|26.~Kf2, Ke7; 27.~Ke3, Kd6; 28.~Kd3, h6; 29.~c4, d*c4+; 30.~N*c4+| +\wdecisive{} with a plan +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & \ldots & f5\\ +27 & Kg3 & Kg6\\ +28 & Nd3&\\ +\end{tabular}}| +\end{center} +|28.~g*f5+, B*f5; 29.~Na6, Kf6; 30.~h3, h6; 31.~N*c7| +Attacking the weak backwards pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & \ldots & f*g4\\ +\end{tabular}}| +\end{center} + +\board +{ *b* * *} +{p p * pp} +{ *p* *k*} +{* *p* * } +{ * P *p*} +{* PN*PK } +{PP N * P} +{* * * * } +$$\showboard$$ +|28\ldots~Kf6; 29.~g*f5, K*f5; 30.~Ne5, Bb7| +Score: 3.19 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & Ne5+ & Kf6\\ +30 & N*c6 & a6\\ +31 & f*g4 & g5\\ +32 & h4&\\ +\end{tabular}}| +\end{center} +|32.~Nb3, Bb7; 33.~Nb8, h6; 34.~Nc5, Bc8; 35.~b4, Kg6; 36.~Nb*a6| +Successfully ganing up on the `a` pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +32 & \ldots & g*h4+\\ +33 & K*h4 & Bd7\\ +34 & g5+&\\ +\end{tabular}}| +\end{center} +|34.~Nb4, c6; 35.~N*a6, h6; 36.~Kh5, Kg7| +Totally won. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +34 & \ldots & Kg7\\ +35 & Ne5&\\ +\end{tabular}}| +\end{center} +|35.~Nb4, c6; 36.~N*a6, h6; 37.~Nc5, Bf5; 38.~a4, Kg6; 39.~g*h6| +And either the 'a' or 'b' pawn will queen. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +35 & \ldots & Be8\\ +36 & Nb3 & Bg6\\ +\end{tabular}}| +\end{center} +At this point black resigned. + +\board +{ * * * *} +{* p * kp} +{p* * *b*} +{* *pN P } +{ * P * K} +{*NP * * } +{PP * * *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jul 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo B86\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Brian Swanson\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Scottish Chess Minor +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & d4 & c*d4\\ +4 & N*d4 & Nf6\\ +5 & Nc3 & a6\\ +6 & Bc4 & e6\\ +\end{tabular}}| +\end{center} +|6\ldots~e5; 7.~Nf3, Qc7; 8.~Bd5, Bg4; 9.~0-0, N*d5; 10.~N*d5| +Is another line of the Sicilian. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & Bg5&\\ +\end{tabular}}| +\end{center} +|7.~0-0, Qc7; 8.~Qd3, e5; 9.~Nf3, Bg4; 10.~Bg5| +\wbetter{},0.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & Be7\\ +8 & f4 & b5\\ +\end{tabular}}| +\end{center} + +\board +{rnbqk* r} +{* * bppp} +{p* ppn *} +{*p* * B } +{ *BNPP *} +{* N * * } +{PPP* *PP} +{R *QK *R} +$$\showboard$$ +|8\ldots~d5; 9.~B*f6, B*f6; 10.~e*d5, Qc7; 11.~Be2, Q*f4| +\bupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & Bd3?&\\ +\end{tabular}}| +\end{center} +|9.~Bb3, h6; 10.~B*f6, B*f6; 11.~0-0, B*d4+; 12.~Q*d4| +\bbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & \ldots & Bb7\\ +10 & b4&\\ +\end{tabular}}| +\end{center} +|10.~Qf3, Qb6; 11.~Nde2, d5| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & \ldots & Nc6\\ +11 & Nf3?&\\ +\end{tabular}}| +\end{center} +|11.~N*c6, B*c6; 12.~0-0, d5; 13.~e*d5, N*d5; 14.~B*e7, Q*e7| +\bbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & \ldots & N*b4\\ +12 & Qe2 & 0-0\\ +13 & 0-0&\\ +\end{tabular}}| +\end{center} +|13.~a3, Qc7; 14.~Qd2| +\bupperhand{},by a pawn or so. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & Rc8\\ +\end{tabular}}| +\end{center} +|13\ldots~Qc7; 14.~Qd2, d5; 15.~B*f6, B*f6| +\bupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & Nd1 & d5\\ +15 & e*d5&\\ +\end{tabular}}| +\end{center} +|15.~e5, Ne4; 16.~B*e7, Q*e7; 17.~B*e4, d*e4; 18.~Nd4| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & \ldots & B*d5\\ +16 & Ne3&\\ +\end{tabular}}| +\end{center} + +\board +{ *rq rk*} +{* * bppp} +{p* *pn *} +{*p*b* B } +{ n * P *} +{* *BNN* } +{P*P*Q*PP} +{R * *RK } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & \ldots & Bc5\\ +\end{tabular}}| +\end{center} +|16\ldots~B*a2; 17.~Rad1, N*d3; 18.~c*d3, Nd5| +\bdecisive{},2+ pawns up, but getting a bit tactical. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & Kh1 & B*e3\\ +18 & Q*e3 & N*c2\\ +19 & B*c2 & R*c2\\ +20 & a4 & Ra2\\ +\end{tabular}}| +\end{center} +|20\ldots~h6| +\bdecisive{}, just winning. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & R*a2 & B*a2\\ +22 & a*b5&\\ +\end{tabular}}| +\end{center} +|22.~Ra1, Bd5; 23.~a*b5, a*b5; 24.~Rb1, Ng4| +\bdecisive{}, to or so pawns up. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & Bc4\\ +\end{tabular}}| +\end{center} +|22\ldots~a*b5; 23.~Ra1, Bd5; 24.~Ra7, h6| +\bupperhand{}, even with the rook on blacks 2nd. This rook should be +able to get to 'b' pawn, though. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & Rc1 & B*b5\\ +24 & Ne5&\\ +\end{tabular}}| +\end{center} + +\board +{ * q rk*} +{* * *ppp} +{p* *pn *} +{*b* N B } +{ * * P *} +{* * Q * } +{ * * *PP} +{* R * *K} +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & \ldots & Nd5?\\ +\end{tabular}}| +\end{center} +A bit wild. +|24\ldots~h6; 25.~B*f6, Q*f6; 26.~Rc7, a5; 27.~Qc5, Be2; 28.~Q*a5, Q*f4| +\bdecisive{}, almost three pawns up, and threating the forced queen +exchage on f1. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & Qg3&\\ +\end{tabular}}| +\end{center} +Alarms bells !!!, the bishop is going to h6. Remember. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & \ldots & f6\\ +\end{tabular}}| +\end{center} +I though I was going to win a piece for a pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & Bh6 & g6??\\ +\end{tabular}}| +\end{center} +|26\ldots~Qe7; 27.~Nc6, Qc7; 28.~Rc2, Ba4; 29.~Rc4, Nb6| +Black still leads (two pawns up), but the tactics are hairy. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & B*f8?&\\ +\end{tabular}}| +\end{center} +|27.~N*g6, Kf7; 28.~N*f8, Ke8; 29.~N*e6, Qd7; 30.~Re1| +\wdecisive{},5.47 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & \ldots & f*e5\\ +\end{tabular}}| +\end{center} +|27\ldots~K*f8; 28.~Qh4, a5; 29.~g3, a4| +\bbetter{}, but critically depending on the weak a pawn. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & Bh6 & e*f4\\ +29 & Qe1&\\ +\end{tabular}}| +\end{center} + +\board +{ * q *k*} +{* * * *p} +{p* *p*pB} +{*b*n* * } +{ * * p *} +{* * * * } +{ * * *PP} +{* R Q *K} +$$\showboard$$ +|29.~B*f4, N*f4; 30.~Q*f4, a5; 31.~h3, g5; 32.~Qe5| +\wupperhand{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & \ldots & g5??\\ +\end{tabular}}| +\end{center} +My major blunder. +|29\ldots~Kf7; 30.~g3, f3; 31.~Qf2, Qf6| +\bupperhand{}, but tricky. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & Q*e6+ & Kh8\\ +31 & Rc8&\\ +\end{tabular}}| +\end{center} +Mate is in a couple of moves. + +\board +{ *Rq * k} +{* * * *p} +{p* *Q* B} +{*b*n* p } +{ * * p *} +{* * * * } +{ * * *PP} +{* * * *K} +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jul 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo B54\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Brian Thomson\\ +Scottish Chess Minor +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & d4 & c*d4\\ +4 & N*d4 & Nc6\\ +5 & Bb5 & Bd7\\ +6 & Nc3&\\ +\end{tabular}}| +\end{center} +|6.~N*c6| +Score: 0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & \ldots & Nf6\\ +\end{tabular}}| +\end{center} +|6\ldots~N*d4; 7.~Q*d4, B*b5; 8.~N*b5, Qa5; 9.~Nc3, e5; 10.~Qd5, Qc7| +Score: -0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & Bg5 & h6\\ +\end{tabular}}| +\end{center} +|7\ldots~N*d4; 8.~B*d7, N*d7; 9.~Q*d4, e5; 10.~Qd2, Be7; 11.~Be3| +Score: -0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & Bh4&\\ +\end{tabular}}| +\end{center} +|8.~B*f6, e*f6; 9.~f4, N*d4; 10.~B*d7, Q*d7; 11.~Q*d4, Be7| +Score: 0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & \ldots & Qb6\\ +\end{tabular}}| +\end{center} +|8\ldots~g5; 9.~Bg3, N*d4; 10.~Q*d4, Bg7; 11.~0-0, 0-0| +Score: -0.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & N*c6&\\ +\end{tabular}}| +\end{center} +|9.~B*f6, g*f6; 10.~B*c6, b*c6; 11.~Na4, Qa5; 12.~c3, Bg7| +Score: 0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & \ldots & b*c6\\ +10 & B*f6&\\ +\end{tabular}}| +\end{center} +|10.~Bd3, Q*b2; 11.~B*f6, e*f6; 12.~Na4, Qd4; 13.~c3| +Score: -1.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & \ldots & e*f6\\ +11 & Ba4&\\ +\end{tabular}}| +\end{center} +|11.~Bd3, Q*b2; 12.~Na4, Qa3; 13.~c3, Be6; 14.~Qc2, 0-0-0| +Score: -1.31 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & \ldots & Qc7\\ +\end{tabular}}| +\end{center} +|11\ldots~Q*b2; 12.~Kd2, Qb6; 13.~Qf3, Be6; 14.~e5, Qd4| +Score: -1.44 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & 0-0 & Be7\\ +13 & Re1&\\ +\end{tabular}}| +\end{center} +|13.~Rb1, 0-0; 14.~Qd3, Be6; 15.~f4, f5| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & 0-0\\ +14 & Qd4&\\ +\end{tabular}}| +\end{center} +|14.~Bb3| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & \ldots & Be6\\ +\end{tabular}}| +\end{center} +|14\ldots~Rab8; 15.~b3, Be6; 16.~Rad1, Rb6; 17.~f4, Re8| +Score: -0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & Nd1&\\ +\end{tabular}}| +\end{center} +|15.~f4, Rab8; 16.~Bb3, f5; 17.~e5, B*b3; 18.~a*b3| +Score: -0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & \ldots & Qa5\\ +\end{tabular}}| +\end{center} +|15\ldots~Rab8; 16.~Qc3, Rb6; 17.~Ne3, Qb7; 18.~f4| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & Nc3 & Qc7\\ +\end{tabular}}| +\end{center} +|16\ldots~Rab8; 17.~b3, Qc7; 18.~Rad1, Rfe8; 19.~f4, Rb6| +Score: -0.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & Ne2&\\ +\end{tabular}}| +\end{center} +|17.~Nd1| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & \ldots & Rab8\\ +\end{tabular}}| +\end{center} +|17\ldots~Rfb8; 18.~Nf4, Rb6; 19.~N*e6, f*e6; 20.~Bb3, d5; 21.~e*d5, c*d5| +Score: -0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & b3&\\ +\end{tabular}}| +\end{center} +|18.~Nf4| +Score: -0.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & a5\\ +\end{tabular}}| +\end{center} +|18\ldots~f5; 19.~Rad1, f*e4; 20.~Q*e4, Bd5; 21.~Qd4| +Score: -0.41 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & Nf4&\\ +\end{tabular}}| +\end{center} +|19.~Qc3, c5; 20.~Nd4, Rb7; 21.~Nc6, Ra8; 22.~Rad1| +Score: 0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & \ldots & Bd7\\ +\end{tabular}}| +\end{center} +|19\ldots~Rfc8; 20.~c4, Rd8; 21.~f3, Rd7| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & Qd2&\\ +\end{tabular}}| +\end{center} +|20.~Qc3, Rb7; 21.~a3, Re8; 22.~Nd3, Reb8; 23.~f4| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +20 & \ldots & g5\\ +\end{tabular}}| +\end{center} +|20\ldots~Rfe8| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & Nh5&\\ +\end{tabular}}| +\end{center} +|21.~Ne2, Rb7; 22.~Nd4, Re8; 23.~Qc3, c5; 24.~B*d7, Q*d7| +Score: 0.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & \ldots & Qb6\\ +\end{tabular}}| +\end{center} +|21\ldots~Bg4; 22.~Ng3, Rfe8; 23.~c4, Bf8; 24.~f3, Be6| +Score: 0.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & Qc3 & Qd8\\ +23 & Rad1&\\ +\end{tabular}}| +\end{center} +|23.~a3, Rc8; 24.~Ng3, Re8; 25.~Rad1, Bg4; 26.~B*c6, B*d1; 27.~R*d1| +Score: 0.31 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & \ldots & Bg4\\ +24 & Ng3 & B*d1\\ +25 & R*d1 & c5\\ +26 & Nh5&\\ +\end{tabular}}| +\end{center} +|26.~Nf5, h5; 27.~a3, Rb7; 28.~Qd3, Rb6; 29.~Qd2| +Score: -0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & \ldots & Kh8\\ +\end{tabular}}| +\end{center} +|26\ldots~Rb4; 27.~Ng3, Qa8; 28.~a3, Rb6| +Score: -0.75 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & Rd3&\\ +\end{tabular}}| +\end{center} +|27.~Ng3, Rg8; 28.~Nf5, Bf8; 29.~Qd2, Qc7| +Score: -0.34 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & \ldots & Rg8\\ +\end{tabular}}| +\end{center} +|27\ldots~Rb4; 28.~Ng3, c4; 29.~Rd5, c*b3; 30.~c*b3, Qb6; 31.~Bc6| +Score: -0.88 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & Rf3&\\ +\end{tabular}}| +\end{center} +|28.~Ng3, Rg6; 29.~Nf5, Rb4; 30.~Bc6, Qc7; 31.~a3, Rb6| +Score: -0.81 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & \ldots & Rg6\\ +\end{tabular}}| +\end{center} +|28\ldots~d5; 29.~e*d5, Q*d5; 30.~Re3, Qd1; 31.~Re1, Qd8; 32.~Ng3| +Score: -1.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & Bc6&\\ +\end{tabular}}| +\end{center} +|29.~Rd3, Rb4; 30.~f3, c4; 31.~Re3, c*b3; 32.~c*b3| +Score: -0.97 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & \ldots & Kg8\\ +30 & Bd5&\\ +\end{tabular}}| +\end{center} +|30.~Ng3, Qc7; 31.~Nf5, Bf8; 32.~Bd5, Bg7; 33.~Rd3, Bh8| +Score: -1.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & a4\\ +31 & Qc4 & Qe8\\ +32 & Qd3&\\ +\end{tabular}}| +\end{center} +|32.~Qc3, a*b3; 33.~c*b3, Qd8; 34.~a4, Rb6; 35.~Rd3| +Score: -0.78 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +32 & \ldots & Rb4\\ +\end{tabular}}| +\end{center} +|32\ldots~Qb5; 33.~Ng3, a*b3; 34.~Nf5, Bf8| +Score: -0.97 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & e5&\\ +\end{tabular}}| +\end{center} +|33.~c3, Rb6; 34.~e5, Kf8; 35.~N*f6| +Score: -0.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & \ldots & d*e5\\ +\end{tabular}}| +\end{center} +|33\ldots~Kh8; 34.~c3, Rh4; 35.~e*f6, Bd8; 36.~Re3, Qd7| +Score: -0.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +34 & Q*g6+&\\ +\end{tabular}}| +\end{center} + +\board +{ * *q*k*} +{* * bp* } +{ * * pQp} +{* pBp pN} +{pr * * *} +{*P* *R* } +{P*P* PPP} +{* * * K } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Jul 1994 \hspace{.3 in} ${1 \over 2}\!-\!{1 \over 2}$\\ +\hline +Foo B50\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} M. Navmann\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Scottish Chess Minor +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & c5\\ +2 & Nf3 & d6\\ +3 & Bc4 & e6\\ +\end{tabular}}| +\end{center} +|3\ldots~Nc6| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +4 & Nc3 & a6\\ +\end{tabular}}| +\end{center} +|4\ldots~Nf6; 5.~d3, d5; 6.~Bb3, d*e4; 7.~N*e4, N*e4; 8.~d*e4, Q*d1| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & a4&\\ +\end{tabular}}| +\end{center} +|5.~d3, Nc6; 6.~Bf4, Na5; 7.~e5, d5; 8.~Bg5, Ne7| +Score: 0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +5 & \ldots & Nf6\\ +6 & d3&\\ +\end{tabular}}| +\end{center} +|6.~d4| +Score: 0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & \ldots & Be7\\ +\end{tabular}}| +\end{center} +|6\ldots~d5; 7.~Ba2, d*e4; 8.~N*e4, N*e4; 9.~d*e4, Q*d1; 10.~K*d1| +Score: 0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & b3&\\ +\end{tabular}}| +\end{center} +|7.~Bg5, h6; 8.~Bh4, d5; 9.~e*d5, N*d5; 10.~N*d5, e*d5| +Score: 0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +7 & \ldots & 0-0\\ +\end{tabular}}| +\end{center} +|7\ldots~d5; 8.~e*d5, e*d5; 9.~N*d5, N*d5; 10.~0-0, 0-0| +Score: -1.59 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & d4&\\ +\end{tabular}}| +\end{center} +|8.~Qe2, Nc6; 9.~0-0, d5; 10.~e*d5, e*d5| +Score: 0.06 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & \ldots & c*d4\\ +\end{tabular}}| +\end{center} +|8\ldots~d5; 9.~e*d5, e*d5; 10.~Bd3, b6; 11.~0-0, Nc6| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & N*d4&\\ +\end{tabular}}| +\end{center} +|9.~Q*d4| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +9 & \ldots & d5\\ +\end{tabular}}| +\end{center} +|9\ldots~Qa5; 10.~Qd2, b5; 11.~Bd3, e5; 12.~Nf3, Bg4| +Score: -0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +10 & e*d5 & e*d5\\ +11 & Bd3 & Re8\\ +\end{tabular}}| +\end{center} +|11\ldots~Nc6; 12.~Nce2, N*d4; 13.~N*d4, Bb4; 14.~Bd2, Qa5; 15.~Ne2, B*d2| +Score: -0.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +12 & 0-0 & Bb4\\ +\end{tabular}}| +\end{center} +|12\ldots~Nc6; 13.~Nce2, Bg4; 14.~f3, Bc5; 15.~c3| +Score: -0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & Bd2&\\ +\end{tabular}}| +\end{center} +|13.~Nce2, Nc6; 14.~Bb2, Bg4; 15.~f3, N*d4; 16.~N*d4| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & Qa5\\ +\end{tabular}}| +\end{center} +|13\ldots~b6| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & Nb1 & Kh8\\ +\end{tabular}}| +\end{center} +|14\ldots~Nc6; 15.~B*b4, N*b4; 16.~Re1, Bg4; 17.~Be2, Rad8| +Score: -0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & B*b4 & Q*b4\\ +16 & c3 & Qe7\\ +\end{tabular}}| +\end{center} +|16\ldots~Qc5; 17.~Re1, R*e1; 18.~Q*e1, Nc6; 19.~Nf5, b6| +Score: 0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & Nd2&\\ +\end{tabular}}| +\end{center} +|17.~Ra2, Qc7; 18.~Re2, R*e2; 19.~Q*e2, Nc6; 20.~Rd1, N*d4; 21.~c*d4| +Score: 0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +17 & \ldots & Bg4\\ +\end{tabular}}| +\end{center} +|17\ldots~Qc5; 18.~Qc2, Nc6; 19.~N2f3, N*d4; 20.~N*d4, Ne4| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & Qc1&\\ +\end{tabular}}| +\end{center} +|18.~N2f3, Qc7; 19.~Qd2, Nc6; 20.~Rfe1, Rad8; 21.~R*e8, R*e8| +Score: 0.00 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & Nc6\\ +19 & N*c6&\\ +\end{tabular}}| +\end{center} +|19.~Re1, Ne5; 20.~Qc2, Qc7; 21.~c4, N*d3; 22.~Q*d3| +Score: 0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & \ldots & b*c6\\ +20 & Re1 & Qd7\\ +\end{tabular}}| +\end{center} +|20\ldots~Qb7; 21.~Qc2, Rad8; 22.~h3, Bh5; 23.~c4, R*e1; 24.~R*e1| +Score: 0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & R*e8+ & Q*e8\\ +22 & Qe1&\\ +\end{tabular}}| +\end{center} +|22.~Qc2, c5; 23.~h3, Bh5; 24.~b4, c4; 25.~Bf5| +Score: 0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +22 & \ldots & a5\\ +\end{tabular}}| +\end{center} +|22\ldots~Qd7| +Score: 0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +23 & h3 & Bd7\\ +\end{tabular}}| +\end{center} +|23\ldots~Bh5; 24.~g4, Bg6; 25.~B*g6, h*g6; 26.~Rd1, Rd8; 27.~Q*e8, N*e8| +Score: 0.19 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & Nf3&\\ +\end{tabular}}| +\end{center} +|24.~Rd1, Rb8; 25.~c4, h6; 26.~Q*e8, R*e8; 27.~c*d5, c*d5| +Score: 0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & \ldots & Q*e1+\\ +\end{tabular}}| +\end{center} +|24\ldots~Rb8; 25.~Bc2, c5; 26.~c4, Q*e1; 27.~R*e1, d4| +Score: 0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & R*e1 & Re8\\ +\end{tabular}}| +\end{center} +|25\ldots~Rb8; 26.~Bc2, g6; 27.~Re7, Kg7; 28.~Ne5, Be8| +Score: 0.44 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & R*e8+&\\ +\end{tabular}}| +\end{center} +|26.~Ne5| +Score: 0.53 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +26 & \ldots & B*e8\\ +27 & c4&\\ +\end{tabular}}| +\end{center} +|27.~g3| +Score: 0.28 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & \ldots & h6\\ +\end{tabular}}| +\end{center} +|27\ldots~g6; 28.~g3, Kg7; 29.~Kg2, h6; 30.~Ne5, d4; 31.~f4, c5| +Score: 0.13 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & Kf1&\\ +\end{tabular}}| +\end{center} +|28.~g3, g6; 29.~Ne5, Kg7; 30.~Kg2, d4; 31.~Kf3, c5| +Score: 0.25 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +28 & \ldots & g6\\ +29 & Ke2&\\ +\end{tabular}}| +\end{center} +|29.~c*d5| +Score: 0.31 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +29 & \ldots & Kg7\\ +30 & Ke3&\\ +\end{tabular}}| +\end{center} +|30.~Ne5| +Score: 0.31 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & Nd7\\ +\end{tabular}}| +\end{center} +|30\ldots~c5; 31.~Ne5, d4; 32.~Kd2, Bd7; 33.~N*d7, N*d7; 34.~Be4, Ne5| +Score: 0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & Kd4&\\ +\end{tabular}}| +\end{center} +|31.~c*d5, c*d5; 32.~Kd4, Nf6; 33.~Ne5, Kf8; 34.~g3, Kg7; 35.~f4| +Score: 0.59 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & \ldots & d*c4\\ +32 & B*c4&\\ +\end{tabular}}| +\end{center} +|32.~K*c4, f5; 33.~Kc3, Bf7; 34.~g3, Nc5; 35.~Bc2, Bd5| +Score: 0.16 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +32 & \ldots & Kf6\\ +\end{tabular}}| +\end{center} +|32\ldots~f5; 33.~Ke3, Bf7; 34.~B*f7, K*f7; 35.~Kf4, Ke6; 36.~Nd4, Kd5| +Score: -0.03 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & Bd3&\\ +\end{tabular}}| +\end{center} +|33.~Nd2, Nb6; 34.~Ne4, Ke7; 35.~Bd3, f5; 36.~Nc5, Bf7| +Score: 0.22 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +33 & \ldots & Ke6\\ +34 & Kc4&\\ +\end{tabular}}| +\end{center} +|34.~Ke3, Nb6; 35.~Nd4, Kd6; 36.~Kf3, Ke5; 37.~Ne2, f5| +Score: 0.09 +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +34 & \ldots & f6\\ +\end{tabular}}| +\end{center} +|34\ldots~f5; 35.~g4, f*g4; 36.~h*g4, Ne5; 37.~N*e5, K*e5; 38.~Kc3| +Score: -0.13 + +\board +{ * *b* *} +{* *n* * } +{ *p*kppp} +{p * * * } +{P*K* * *} +{*P*B*N*P} +{ * * PP*} +{* * * * } +$$\showboard$$ +${1 \over 2}\!-\!{1 \over 2}$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Sep 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo B01\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Stewart McKay\\ +Grangemouth Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & d5\\ +2 & e*d5 & Nf6\\ +3 & Bb5+ & Bd7\\ +4 & B*d7+ & Q*d7\\ +5 & Nf3 & N*d5\\ +6 & 0-0 & Nc6\\ +7 & Re1 & e6\\ +8 & d3 & g6\\ +9 & Bg5 & Bg7\\ +10 & c3 & Nf6\\ +11 & d4 & h6\\ +12 & B*f6 & B*f6\\ +13 & d5 & Rd8\\ +14 & Qd2 & Q*d5\\ +15 & Qf4 & Bg7\\ +16 & Q*c7 & 0-0\\ +17 & Qf4 & g5\\ +18 & Qd2 & Qf5\\ +19 & Qe3 & Rd3\\ +20 & Qe4 & Q*e4\\ +21 & R*e4 & Rd1+\\ +22 & Re1 & Rfd8\\ +23 & h3 & Ne5\\ +24 & Na3 & N*f3+\\ +25 & g*f3 & R1d3\\ +26 & Kg2 & a6\\ +27 & Rac1 & b5\\ +28 & Re2 & Bf8\\ +29 & Nc2 & Bc5\\ +30 & Ne1 & Rd2\\ +31 & R*d2 & R*d2\\ +32 & Rc2 & Rd1\\ +33 & Kf1 & Be7\\ +34 & a3 & Bf6\\ +35 & Ke2 & Rd5\\ +36 & Nd3 & Rd8\\ +37 & Kd2 & Rc8\\ +38 & Ke3 & Bg7\\ +39 & f4 & Bf6\\ +40 & Ne5 & Rc5\\ +41 & Nd7 & g*f4+\\ +42 & K*f4 & Bg5+\\ +43 & Ke4 & f5+\\ +44 & Kf3 & Rd5\\ +45 & Nb8 & Rd6\\ +46 & c4 & b*c4\\ +47 & R*c4 & Rb6\\ +48 & Rb4 & Rd6\\ +49 & Ra4 & Rb6\\ +50 & N*a6 & R*b2\\ +51 & Nc7 & Rb3+\\ +52 & Kg2 & Be7\\ +53 & N*e6 & R*a3\\ +54 & R*a3 & B*a3\\ +55 & Kg3 & Kf7\\ +56 & Nd4 & Kg6\\ +57 & Kf4 & Kh5\\ +58 & N*f5&\\ +\end{tabular}}| +\end{center} +And White won by queening the f pawn. + +\board +{ * * * *} +{* * * * } +{ * * * p} +{* * *N*k} +{ * * K *} +{b * * *P} +{ * * P *} +{* * * * } +$$\showboard$$ +$1\!-\!0$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Sep 1994 \hspace{.3 in} $0\!-\!1$\\ +\hline +Foo D02\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Harward Shaughan\\ +\rule[-1pt]{11pt}{11pt} Andy Gill\\ +Grangemouth Minor Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & d4 & e6\\ +2 & Bf4 & d5\\ +3 & Nf3 & Nf6\\ +4 & Nbd2 & c5\\ +5 & e3 & a6\\ +6 & c4 & Nc6\\ +7 & Ne5 & c*d4\\ +8 & N*c6 & b*c6\\ +9 & e*d4 & Qb6\\ +10 & c*d5 & c*d5\\ +11 & Qc2 & Bd7\\ +12 & Be3 & Bb4\\ +13 & a3 & B*d2+\\ +14 & Q*d2 & 0-0\\ +15 & Bd3 & Rfc8\\ +16 & 0-0 & Bb5\\ +17 & b3 & Rc6\\ +18 & f3 & Rac8\\ +19 & Rfc1 & B*d3\\ +20 & R*c6 & R*c6\\ +21 & Q*d3 & Qc7\\ +22 & Bd2 & h6\\ +23 & Rb1 & Nh5\\ +24 & b4 & Nf4\\ +25 & B*f4 & Q*f4\\ +26 & b5 & Rc1+\\ +27 & R*c1 & Q*c1+\\ +28 & Kf2 & Qb2+\\ +29 & Kg3 & Q*b5\\ +30 & Q*b5 & a*b5\\ +31 & Kf2 & Kf8\\ +32 & Ke3 & Ke7\\ +33 & Kd3 & Kd6\\ +34 & f4 & f6\\ +35 & h4 & e5\\ +36 & d*e5+ & f*e5\\ +37 & f5 & e4+\\ +38 & Kd4 & Ke7\\ +39 & g4 & Kf6\\ +40 & Ke3 & g6\\ +41 & g5+ & h*g5\\ +42 & h*g5+ & K*f5\\ +\end{tabular}}| +\end{center} + +\board +{ * * * *} +{* * * * } +{ * * *p*} +{*p*p*kP } +{ * *p* *} +{P * K * } +{ * * * *} +{* * * * } +$$\showboard$$ +$0\!-\!1$ +\clearpage +\begin{center} +\fbox{\fbox{\large\begin{tabular}{l} +Game \hspace{.3 in} Sep 1994 \hspace{.3 in} $1\!-\!0$\\ +\hline +Foo C65\\ +\raisebox{2.5pt}[11pt]{\framebox[11pt]{\rule{0pt}{4.25pt}}} Andy Gill\\ +\rule[-1pt]{11pt}{11pt} Lindsay Ridland\\ +Grangemouth Minor Congress +\end{tabular}}} +\end{center} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +1 & e4 & e5\\ +2 & Nf3 & Nc6\\ +3 & Bb5 & Nf6\\ +4 & 0-0 & Bc5\\ +5 & Re1 & a6\\ +\end{tabular}}| +\end{center} +|5\ldots~Ng4; 6.~Re2, 0-0; 7.~d3, Nd4; 8.~N*d4, B*d4; 9.~Nd2| +\wbetter{},0.13 but a bit messy for white. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & Ba4&\\ +\end{tabular}}| +\end{center} +|6.~B*c6, d*c6; 7.~h3, Qe7; 8.~d3, 0-0; 9.~Bg5, h6; 10.~Bh4| +=, taking the exchange way out. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +6 & \ldots & b5\\ +7 & Bb3 & d6\\ +\end{tabular}}| +\end{center} + +\board +{r*bqk* r} +{* p *ppp} +{p*np n *} +{*pb p * } +{ * *P* *} +{*B* *N* } +{PPPP PPP} +{RNBQR K } +$$\showboard$$ + We have now reached a main line of the Ruy Lopez. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & c3&\\ +\end{tabular}}| +\end{center} +|8.~a4, Ng4; 9.~Re2, Bb7; 10.~a*b5, a*b5| +=, and very like Game 7 of the Short-Kasparov WC, where Kasparov as +white scored a decisive victory. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +8 & \ldots & Bg4\\ +9 & d3 & h6\\ +10 & Be3 & 0-0\\ +\end{tabular}}| +\end{center} +|10\ldots~B*e3; 11.~R*e3, 0-0; 12.~a4, b4; 13.~h3, Bh5; 14.~Nbd2, Rb8| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +11 & B*c5 & d*c5\\ +12 & Bc2 & Qd7\\ +13 & Nbd2&\\ +\end{tabular}}| +\end{center} +|13.~h3, Bh5; 14.~Nbd2, Rfd8; 15.~Nb3, Qd6; 16.~Qe2, Rab8; 17.~Red1| +Fritz is deperate to put h3, but I dont see why. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +13 & \ldots & Nh5\\ +\end{tabular}}| +\end{center} + +\board +{r* * rk*} +{* pq*pp } +{p*n* * p} +{*pp p *n} +{ * *P*b*} +{* PP*N* } +{PPBN PPP} +{R *QR K } +$$\showboard$$ +|13\ldots~Rad8| +is an idea. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & Nb3&\\ +\end{tabular}}| +\end{center} +|14.~h3| +\wbetter{},0.33 I now agree with this, because the knight block the h5 +retreat square. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +14 & \ldots & Nf4?\\ +\end{tabular}}| +\end{center} +|14\ldots~Qd6; 15.~h3, Be6; 16.~Ng5, B*b3; 17.~a*b3, Nf4; 18.~Nf3| +\bbetter{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +15 & N*c5 & Qc8\\ +\end{tabular}}| +\end{center} +|15\ldots~Qe7; 16.~Nb3, Rfd8; 17.~h3, Be6; 18.~d4, Qf6; 19.~Rc1, e*d4| += +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & Re3&\\ +\end{tabular}}| +\end{center} +|16.~b4| +White is just a pawn up. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +16 & \ldots & Rd8\\ +17 & Qd2 & Rd6\\ +\end{tabular}}| +\end{center} +|17\ldots~B*f3!; 18.~R*f3, Qg4; 19.~R*f4, e*f4; 20.~h3, Qh4; 21.~d4| +and black has equalised! +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & Bd1&\\ +\end{tabular}}| +\end{center} + +\board +{r*q* *k*} +{* p *pp } +{p*nr * p} +{*pN p * } +{ * *Pnb*} +{* PPRN* } +{PP Q PPP} +{R *B* K } +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +18 & \ldots & N*g2??\\ +\end{tabular}}| +\end{center} +Throws away a piece for a very temp. inititive. +|18\ldots~Rb8; 19.~d4, e*d4; 20.~c*d4, Ne6; 21.~N*e6, Q*e6| +and white is starting to push home his advantage. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +19 & K*g2 & Bh3+\\ +20 & Kh1 & Qg4\\ +\end{tabular}}| +\end{center} +|20\ldots~Rg6| +is another idea, but the whole plan is conceptually flawed. +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +21 & Ne1 & Qg5\\ +22 & Qe2 & Be6\\ +23 & Rg3 & Qf6\\ +24 & N*e6&\\ +\end{tabular}}| +\end{center} + +\board +{r* * *k*} +{* p *pp } +{p*nrNq p} +{*p* p * } +{ * *P* *} +{* PP* R } +{PP *QP P} +{R *BN *K} +$$\showboard$$ +|24.~Nf3, Ne7; 25.~N*e6, Q*e6; 26.~Bb3, Qf6; 27.~Rag1| +\wdecisive{} +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +24 & \ldots & R*e6\\ +\end{tabular}}| +\end{center} +|24\ldots~Q*e6; 25.~Bb3, Qe7; 26.~Bd5, Rad8; 27.~Nf3, R8d7; 28.~Rd1| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & Qf3&\\ +\end{tabular}}| +\end{center} +Crude plan of exchanging queens to avoid `acidents`. +|25.~Bb3| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +25 & \ldots & Qe7\\ +26 & Bb3 & Rf6\\ +27 & Qe3&\\ +\end{tabular}}| +\end{center} +|27.~Qg2| +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +27 & \ldots & Rd8\\ +28 & Nc2 & Kh7\\ +29 & Rag1 & g6\\ +30 & Rf3&\\ +\end{tabular}}| +\end{center} + +\board +{ * r * *} +{* p qp*k} +{p*n* rpp} +{*p* p * } +{ * *P* *} +{*BPPQR* } +{PPN* P P} +{* * * RK} +$$\showboard$$ +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +30 & \ldots & R*f3\\ +\end{tabular}}| +\end{center} +|30\ldots~Rfd6??; 31.~R*f7+| +Trying to avoid the exchance, but black loses his Queen! Black +actually moved his rook to d6, but before letting it go, spotted the +danger, and then took the exchange. Shame... +\begin{center}| +{\bf\begin{tabular}{rp{50pt}p{50pt}} +31 & Q*f3 & Rd7\\ +32 & Ne3 & h5?\\ +33 & Nd5!&\\ +\end{tabular}}| +\end{center} +At least winning the exchange. Black resigned here. + +\board +{ * * * *} +{* prqp*k} +{p*n* *p*} +{*p*Np *p} +{ * *P* *} +{*BPP*Q* } +{PP * P P} +{* * * RK} +$$\showboard$$ +$1\!-\!0$ + +\end{document} diff --git a/testsuite/tests/programs/andy_cherry/mygames.pgn b/testsuite/tests/programs/andy_cherry/mygames.pgn new file mode 100644 index 0000000000..3d2e46fa1b --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/mygames.pgn @@ -0,0 +1,1323 @@ +% -------------- +% Season 93/94 +% -------------- + +[Site "Dunfermline Club Championship"] +[Date "1993.10.??"] +[Round "1"] +[White "Webb, George"] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "C10"] + +1. Nf3 d5 2. d4 Nc6 3. Nc3 Nf6 (3... Bf5 {is more natural.}) 4. e4? ( +4. Bf4 {is better.}) 4... e6? (4... dxe4 5. d5 exf3 6. dxc6 Qxd1+ 7. +Nxd1 {and black is a clear pawn up.}) 5. e5 Ne4 {} 6. Nxe4? { Taking +this knight looses a pawn} 6... dxe4 7. Nd2 Qxd4 8. Nc4 Qxd1+ 9. Kxd1 +Bd7 (9... Bc5 10. f3 exf3 11. gxf3 O-O 12. Bd3 {White can get presure +down the `g' file, but first needs to solve the problem of the Bishop on +c5 guarding g8.}) 10. Bd2 (10. Be3 {is better.}) 10... Bb4 11. c3 Bc5 12. +Ke1 O-O-O (12... b5 13. Ne3 Bxe3 14. Bxe3 Nxe5 {wins a pawn, but black +might have problems because of queenside weaknesses.}) 13. g3 (13. Bg5 +Be7 14. Bxe7 Nxe7 15. Rd1 {and white is starting to contest the `d' +file.}) 13... Rhf8 14. Bg2 f5? {black is throwing away a pawn.} 15. +exf6 gxf6 (15... Rxf6 {gives black more piece activity.}) 16. Bxe4 { +taking the weak pawn, and attacking h7.} 16... e5? (16... Rh8 {is +required to protect the weak h pawn.}) 17. Bxh7 {} 17... f5 (17... Bxf2+ +18. Kxf2 Be6 19. Nxe5 Rxd2+ 20. Ke1 Rxb2 {winning material, and striping +whites king of protection.}) 18. b4 Be6 19. b5 (19. bxc5 Bxc4 {and white +has the two bishops.}) 19... Bxc4 20. bxc6 bxc6 (20... Bxf2+ 21. Kxf2 +Rxd2+ 22. Ke1 Re2+ 23. Kd1 bxc6 24. h4 Rd8+ {with a winning attack on +whites exposed king.}) 21. Rb1? {Throws away a pawn needlessly.} 21... +Bxa2 (21... Bxf2+ 22. Kxf2 Rxd2+ 23. Ke1 Rxa2 {winning two pawns rather +than one.}) 22. Rb2 Bd5 23. Rg1 e4 (23... a5 24. h4 a4 25. Bh6 Bf3 26. +Rd2 Rxd2 27. Bxd2 {is a better plan, with a dangerous passed `a' pawn.}) +24. Bh6? 24... Ba3 (24... Rf7 25. Bg5 Rxh7 26. Bxd8 Ba3 27. Rd2 Kxd8 { +two bishops vs a rook, a difficult win for black.}) 25. Rb1 Rfe8? { +another missed opertunity.} 26. Bxf5+ Be6 27. Bg6 Rh8 28. Be3 {} +28... Rd3? (28... Rxh2 29. Bxe4 c5 30. Rb7 a5 {and black has a +fighting chance}) 29. Bd4 (29. Bxe4 Rxc3 30. Bd4 Rc4 31. Bxh8 Rxe4+ {and +black is lost.}) 29... Bd5?? 30. Bxh8 e3?? 31. f3? (31. Bxd3 +exf2+ 32. Kxf2 Bc5+ 33. Bd4 {and white is two rooks up.}) 31... Rd2 32. +Bf6 Bb2 33. h4 (33. Bf5+ Kb7 34. c4 Bxc4 35. Rxb2+ Rxb2 36. Bxb2 { +winning.}) 33... Kb7 34. Bg5 Bxf3 (34... Ba2 35. Bc2 Bxb1 36. Bxb1 Rh2 +37. Bxe3 Bxc3+ {and black is just a bishop down in a pawn race.}) 35. +Bxe3 Re2+ 36. Kf1 Rxe3 37. Re1?? {giving black a chance to equalize.} +37... Re2?? {Returning the complement.} (37... Rxe1+ 38. Kxe1 Bxc3+ +39. Kf2 Bd4+ 40. Kxf3 Bxg1 {and White still has the edge with 2 +connected passed pawns, but black has real chances.}) 38. Rxe2 1-0 + + +[Site "Dunfermline Club Championship"] +[Date "1993.11.??"] +[Round "2"] +[White "Gill, Andy"] +[Black "Dunne, Barry"] +[Result "1-0"] +[ECO "C65"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 Nf6 4. d3 (4. O-O {Ruy Lopez, Berlin Defence}) +4... Be7 (4... Bc5 {is better.}) 5. O-O (5. Bxc6 dxc6 6. Nxe5 Bd6 7. Nf3 +O-O 8. O-O Be6 {and white is a pawn up, but black has a lead in +development.}) 5... O-O $2 (5... d6 {is needed to protect e5.}) 6. Nc3 (6. +Bxc6 dxc6 7. Nxe5 Bd6 8. Nf3 Bg4 9. Be3 {and white is a clean pawn up.}) +6... b6 $2 7. a3 Bb7 8. b4 Nd4 {A bit ambitious.} 9. Nxe5 (9. Nxd4 exd4 +10. Ne2 d5 11. e5 Nd7 {is whites best line.}) 9... Nxb5 (9... d5 10. Bb2 +dxe4 11. dxe4 Nxe4 {with equal chances.}) 10. Nxb5 d5 11. Bb2 dxe4 12. +dxe4 (12. f3 {is a better approach.}) 12... Qxd1 13. Raxd1 Bd6 {} (13... +Bxe4 14. Nd7 Bxc2 15. Bxf6 gxf6 16. Rd2 {with a slight advantage for +white.}) 14. Nf3 (14. Nxd6 cxd6 15. Rxd6 Bxe4 16. c4 Rfd8 17. c5 bxc5 +18. bxc5 {winning for white.}) 14... Bxe4 (14... Nxe4 {is better.}) 15. +Nxd6 cxd6 16. Bxf6 gxf6 17. Rxd6 Bxc2 (17... Bxf3 18. gxf3 Rac8 19. Rc1 +Rc3 20. Rd3 Rxd3 21. cxd3 {and whites passed pawn is a long way from +queening.}) 18. Rxf6 (18. Nd4 Ba4 19. Rxf6 Rfd8 20. Rf4 Rd7 21. Re4 {a +pawn up, but with chances for black, because of the powerful Bishop.}) +18... Rfd8 19. Ne5 Kg7 (19... Bg6 {is better, defending the weak pawn.}) +20. Rxf7+ Kg8 21. Rc7 (21. f4 a6 22. g3 Rd2 23. Rb7 b5 {and white should +win.}) 21... Re8 (21... Rdc8 22. Rb7 Be4 23. Rd7 Rc2 24. Rfd1 {with +connected rooks for white.}) 22. Re1 (22. f4 {is better for protecting the +knight.}) 22... Rac8 {should have moved the `e' Rook.} 23. Rxa7 Bf5 ( +23... Ra8 $5 {planning to attack the weak `a' pawn.}) 24. f4 Bg4 (24... +Rc2 {penatraiting the 7th.}) 25. Kf2 Rc2+ 26. Kg3 Re2 27. Rxe2 Bxe2 28. +Nc6 $2 {where is that knight going ?} 28... Re3+ 29. Kf2 Re4 {} 30. f5 ( +30. Ne7+ Kf8 31. Nd5 Bd3 32. Nxb6 Re7 {totally winning for white}) +30... Bg4 31. Ne7+ (31. Kg3 h6 32. f6 Be6 33. Re7 {looking very good for +white.}) 31... Kf8 32. f6 Rf4+ 33. Kg3 Re4 34. h3 (34. Nd5 Be6 35. Nxb6 +Rg4+ 36. Kf3 Rg6 37. Rxh7 Rxf6+ 38. Ke4 {and with 4 connected passed +white will win.}) 34... Bh5 35. Nd5 b5 36. Rxh7 Bg6 37. Rh4 (37. Rh8+ Kf7 +38. Rb8 Bf5 39. Rxb5 Be6 40. Rb7+ Kg6 41. Rg7+ {just look at whites +advantage.}) 37... Rxh4 38. Kxh4 Be4 39. Nc3 (39. Ne3 Kf7 40. Kg5 Bc6 +41. g4 Be4 42. h4 Bd3 43. h5 {winning.}) 39... Bc6 (39... Bxg2 40. Nxb5 +Kf7 41. Kg5 Bxh3 42. Nd6+ Kg8 43. a4 Kh7) 40. g4 Kf7 41. g5 (41. Kg5 Kg8 +42. h4 Bd7 43. h5 Kf7 44. Ne4 Kg8 45. Nd6) 41... Kg6 42. Kg4? 42... +Bd7+ 43. Kf4 Bxh3 44. Nxb5 Bd7 (44... Kf7 45. Nd6+ Ke6 46. f7 Ke7 47. g6 +Kf8 48. a4 Kg7) 45. a4 Bc6 46. Nc3 Bd7 47. b5 1-0 + +[Site "Dunfermline Club Championship"] +[Date "1993.11.??"] +[Round "3"] +[White "Gill, Andy"] +[Black "Brown, Rab"] +[Result "0-1"] +[ECO "C65"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 Bc5 4. O-O Nf6 5. Nc3 d6 6. a3 Ng4? 7. +Qe1 (7. h3) 7... O-O {} 8. Bxc6 bxc6 9. b4 Ba6 10. bxc5 Bxf1 11. Kxf1 ( +11. Qxf1 Qd7 12. Bb2 dxc5 13. d3 Rfb8 14. Rb1 {clearly winning for +white.}) 11... Qf6 {} (11... Rb8 12. Qe2 Qd7 13. Qa6 Ra8 14. h3 Nf6 15. +d4 exd4 {is a better plan.}) 12. d3 Qg6 13. Rb1 (13. h3 Nh6) 13... Qh5 +14. Rb7 (14. h3 Nf6 15. Rb7 Rfc8 16. Bg5 Qg6 17. Qe3 Ne8 {and white has a +commanding lead.}) 14... Nxh2+ 15. Nxh2 Qxh2 16. Rxc7 Qh1+ 17. Ke2 Qxg2 +18. Rxc6 (18. cxd6 Rfc8 19. Rxc8+ Rxc8 20. Be3 Rd8 21. Bc5 h5) 18... dxc5 ( +18... Qg4+ 19. f3 Qg2+ 20. Qf2 Qxf2+ 21. Kxf2 Rfc8 22. Nd5 Rxc6 23. +Ne7+) 19. Rxc5 f5 20. Be3 Qg4+ 21. f3 Qg2+ 22. Qf2 Qh1 23. Rxe5 Qa1 {} +24. Bc5? (24. Qe1 Qb2 25. Qd2 Qxa3 26. Bc5 Qa5 27. exf5 {white has the +advantage.}) 24... Qxc3 25. Rxf5 (25. Bxf8 Qxc2+ 26. Kf1 Qxd3+ 27. Qe2 +Qb1+ 28. Qe1 Qxe1+ 29. Kxe1 {now black has only a slight advantage.}) +25... Qxc2+ (25... Rxf5 26. exf5 Qxc2+ 27. Kf1 Qxd3+ 28. Kg2 Rd8 29. f4 { +and black has a clear lead.}) 26. Ke3 Qxf2+ 27. Kxf2 Rxf5 28. exf5 Rc8 +29. d4 a6 30. a4 Kf7 31. Ke3 (31. Kg3 Kf6 32. Kf4 g5+ 33. fxg6 hxg6 34. +a5 g5+ 35. Kg4) 31... h5 (31... Kf6 32. Kf4 Rd8 33. a5 Rd5 34. Ke4 Rxf5) +32. Kf4 h4 33. Kg4 Rh8 34. d5 h3 35. Bd6 g6 (35... h2 36. Bxh2 Rxh2 37. +Kf4 Rh4+ 38. Ke5 Rxa4 39. d6 Rc4 {totaly won for black.}) 36. fxg6+ Kxg6 +37. Bh2 Kf6 {} 38. f4 (38. a5 Ke7 39. Kf5 Rh5+ 40. Ke4 Rh4+ 41. f4 Kd6 +42. Kd4 {holding the position.}) 38... Ke7 39. f5 a5 (39... Kf6 {is +needed.}) 40. d6+ Kd7 (40... Kf6 {is still needed.}) 41. Kg5 Rb8 (41... Ke8) +42. f6 Rb2 (42... Ke6 43. Kg4 Rb4+ 44. Kxh3 Rxa4 45. d7 Kxd7 46. Be5 { +but black should still win.}) 43. Kg6 (43. f7 Rg2+ 44. Kh6 Rf2 45. Kg7 +Rg2+ 46. Kh7 Rf2 47. Kg7 {white has equalised!}) 43... Rf2 0-1 + +[Site "Dunfermline C vs Stirling B"] +[Date "1993.11.??"] +[Round "4"] +[White "Gill, Andy"] +[Black "Kennedy, Ian"] +[Result "0-1"] +[ECO "C60"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 Bd6 4. O-O a6 5. Ba4 b5 6. Bb3 Bb7 7. d3 Nf6 ( +7... Na5 8. Nbd2 f6 9. a4 Nxb3 10. Nxb3 Bb4 11. axb5 axb5 {with +equality.}) 8. Nc3 (8. a4 b4 9. Nbd2 Bc5 10. Nc4 d6 {<saw>}) 8... O-O ( +8... Na5 9. Bd2 Nxb3 10. axb3 O-O 11. Bg5 Rb8 {=}) 9. Be3 Na5 {} (9... +Be7 10. a3 Ng4 11. Bd2 {<saw>}) 10. Bd5?! {where is that bishop going.} +10... b4 (10... c6 11. Bb3 Bc7 12. Bg5 Nxb3 13. Bxf6 Qxf6 14. axb3 { +<sab>}) 11. Bxb7 Nxb7 12. Nd5 (12. Ne2 Ng4 13. Bd2 f5 14. exf5 Rxf5 15. +Ng3 Rf6 {<saw>}) 12... c6 (12... Nxd5 13. exd5 f6 14. c3 bxc3 15. bxc3 +Be7 16. d4 d6 {<sab>}) 13. Nxf6+ (13. Bb6 Qc8 14. Nxf6+ gxf6 15. d4 Bc7 +16. Bxc7 Qxc7 {<saw> and the black king is exposed.}) 13... Qxf6 14. Bb6 { +?! strange move.} (14. Qd2 Be7 15. c3 a5 16. a3 bxa3 17. bxa3 {<saw> with +the plan ofs owning the `b' file.}) 14... Bc5 (14... Be7) 15. Bc7 (15. Nxe5 { +but black can easly win back the pawn.}) 15... Rac8? (15... d6 16. d4 +exd4 17. e5 Qe7 18. exd6 Nxd6 19. Bxd6 Qxd6 {<ab>}) 16. Bxe5 Qg6 17. d4 ( +17. Bg3 Rfe8 18. Ne5 Qf6 19. Nxd7 Qxb2 20. Re1 {<aw> white should now +try use his center pawns to push home his advantage.}) 17... Bd6 18. +Bxd6 {this is to early, leaving myself underdeveloped.} (18. Re1 f6 19. +Bxd6 Nxd6 20. Qd3 {<aw>}) 18... Nxd6 19. Ne5 (19. e5 Nc4 20. b3 Na3 21. +Rc1 d6 22. Re1 {<aw>}) 19... Qxe4 20. Nxd7 Rfe8 21. Nc5 Qg6? (21... +Qe2 22. Re1 Qc4 23. Qd2 Rcd8 24. Rad1 a5 {<aw> white is a clear pawn up.}) +22. Nxa6 Nf5 23. Nxb4 { white should now win the endgame quite +comfortably.} 23... Nh4 (23... Rcd8 24. c3 c5 25. Nc2 cxd4 26. Nxd4 Qf6 +27. Qf3 Nxd4 {<aw> though still two clear pawns up.}) 24. g3 {forced.} +24... c5 25. dxc5 Rxc5 (25... Qe4 26. gxh4 Qxb4 27. a4 Qxh4 28. Qd5 Re2 { +<aw>, but whites king is dangerously exposed, and the `a' rook is not +(yet) part of the game.}) 26. a4 {crap plan! Its just too slow.} (26. Nd3 +Rf5 27. f4 Rd5 28. a4 Qb6+ 29. Rf2 Nf5 {<waw> black will never stop 3 +connected passed pawns!}) 26... f5 27. Nd5 Rd8?? (27... Qd6 28. Nf4 +Qxd1 29. Rfxd1 Nf3+ 30. Kg2 Ne5 {<waw>}) 28. Ne7+! 28... Kf7 29. Qxd8 +Qg5 {} (29... Nf3+ 30. Kg2 {is an idea.}) 30. a5 {this plan is still to +slow.} (30. Qg8+ Kxe7 31. Rfe1+ Kd6 32. Qf8+ Kc6 33. Qc8+ Kb6 34. Re6+ +Rc6 35. Qxc6+ Ka7 36. Qb6+ Ka8 37. Re8+ Qd8 38. Rxd8#) 30... f4 {} 31. +f3?? (31. Nc6 Nf3+ 32. Kg2 fxg3 33. Qd7+ Kf8 34. Qc8+ Kf7 35. fxg3 { +<waw> but there are still some hairy tactics.}) 31... fxg3 32. hxg3?? ( +32. Qg8+ Kxe7 33. Rfe1+ Re5 34. Rxe5+ Qxe5 35. h3 Nxf3+ 36. Kg2 {and +white can still win!}) 32... Qxg3+ 33. Kh1 Qg2# {painfull!} 0-1 + +[Site "Dunfermline Club Championship"] +[Date "1993.11.??"] +[Round "5"] +[White "Gill, Andy"] +[Black "Langham, Neil"] +[Result "1-0"] +[ECO "C41"] + +1. e4 e5 2. Nf3 d6 3. Nc3 Nf6 4. Bc4 h6 ( 4... Bg4 5. d3 Nc6 6. h3 Bh5 7. O-O +Bxf3 8. Qxf3 { = } ) 5. O-O Bd7 6. d3 Nc6 7. Bd2 ( 7. Be3 Be7 8. Nd5 O-O 9. h3 +Nxd5 10. Bxd5 Bf6 ) 7... Na5 { } 8. b4 ( 8. Bd5 Bg4 9. a3 c6 10. Ba2 d5 +11. Be3 dxe4 12. Nxe4 { but black is having the freer game } ) 8... Nxc4 +9. dxc4 Be6 ( 9... Be7 10. Qe2 O-O 11. Rfd1 Be6 12. c5 c6 13. cxd6 Qxd6 { <sab> +} ) 10. Nd5 $2 Nxe4 11. Qe2 ( 11. Re1 Nxd2 12. Qxd2 c6 13. Ne3 Be7 14. Rad1 O-O +{ <ab>, with white a pawn and position down. } ) 11... Nxd2 12. Nxd2 ( 12. Qxd2 +{ is better. } ) 12... Qg5 $4 { } ( 12... g6 13. Ne3 f5 14. c5 dxc5 15. bxc5 +c6 { <ab>, ready for a pawn charge on white's king. } ) 13. Nxc7+ Ke7 ( +13... Kd7 { is better, stoping the future escape of the white knight. } ) +14. Nxa8 Bh3 { going for the cheapo. } 15. f4 $1 Qg6 16. Nc7 ( 16. fxe5 Kd8 +17. Qe4 Be6 18. Qxg6 fxg6 { is the best line Fritz2 found. } ) 16... Kd7 +17. Nd5 Bg4 18. Qf2 f6 ( 18... Qxc2 19. Ne3 Qg6 20. fxe5 Be6 21. Nf3 { rather +cheeky, but still a rook down. } ) 19. Ne3 Ke6 $2 { } 20. f5+ Bxf5 21. Qxf5+ +( 21. Nxf5 Qg5 22. h4 Qg4 { actually wins more material, but with this level of +inequality, you want to swap of queens. } ) 21... Qxf5 22. Nxf5 g6 23. Ng3 { At +this point the score sheet goes wrong, but the game was won by now anyway! } +1-0 + +[Site "Dunfermline Club Championship"] +[Date "1993.11.??"] +[Round "6"] +[White "Gill, Andy"] +[Black "Duncan, Dennis"] +[Result "1-0"] + +1. e4 e5 2. Nf3 d6 3. Bc4 Bg4 4. O-O Nf6 5. Nc3 ( 5. d3 Nc6 6. Be3 d5 7. exd5 +Nxd5 8. Nbd2 Nxe3 9. fxe3 { = } ) 5... c6 ( 5... Nc6 6. Bb5 Qd7 7. h3 Bxf3 +8. Qxf3 O-O-O { = } ) 6. Bb3 d5 7. d3 ( 7. exd5 cxd5 8. Re1 e4 9. d3 Bxf3 { = } +) 7... b5 ( 7... dxe4 8. dxe4 Qxd1 9. Rxd1 Bxf3 { <sab> } ) 8. h3 { } ( +8. exd5 b4 9. Ne4 cxd5 10. Nxf6+ gxf6 11. d4 exd4 12. Qxd4 { <aw> } ) 8... Bc8 +( 8... Bxf3 9. Qxf3 d4 10. Ne2 Nbd7 11. Bg5 Be7 { <saw> } ) 9. Nxe5 ( 9. exd5 +Nxd5 10. Nxe5 Be6 11. Nxd5 { <aw> } ) 9... Qc7 ( 9... Bd6 10. Nf3 dxe4 11. Nxe4 +Nxe4 12. Re1 Bxh3 13. Rxe4+ Be6 { <aw> } ) 10. Nf3 Nh5 ( 10... Be6 11. Nd4 dxe4 +12. Bxe6 { <aw> } ) 11. exd5 c5 12. Nxb5 ( 12. Re1+ $1 Be7 13. Nxb5 Qb6 14. d6 +Qxb5 15. Rxe7+ Kd8 16. Bxf7 { <waw> } ) 12... Qb6 ( 12... Qb7 13. Re1+ Kd8 +14. Ne5 Nf6 15. Bg5 Bf5 16. Bxf6+ gxf6 { <waw> } ) 13. Ba4 ( 13. Re1+ Kd8 +14. Ne5 Qxb5 15. Nxf7+ Kc7 16. Nxh8 Nf6 17. Bf4+ { <waw> } ) 13... Bd7 14. Qe2+ +Be7 { } 15. d4 ( 15. d6 O-O 16. dxe7 Re8 17. d4 cxd4 18. Nfxd4 { <waw> } ) +15... Bxb5 16. Bxb5+ Nd7 ( 16... Kf8 17. Re1 Qd6 18. Nh4 Qf6 19. Qxh5 { <waw> } +) 17. Bxd7+ Kxd7 18. Ne5+ Ke8 19. dxc5 ( 19. Nc6 Qc7 20. Re1 cxd4 21. c4 Nf6 { +<waw> } ) 19... Qxc5 20. Rd1 ( 20. d6 Qxd6 21. Qf3 Rc8 22. Nxf7 Qf6 23. Qxf6 +Nxf6 24. Nxh8 { <waw> } ) 20... Ng3 21. Qe3 ( 21. Qg4 Qxc2 22. Rd2 Qf5 23. Qxg3 +Bf6 { <waw> } ) 21... Nf5 22. Qxc5 ( 22. Qf3 Nd6 23. c4 Bf6 24. Re1 Bxe5 +25. Rxe5+ Kf8 { <waw> } ) 22... Bxc5 { } 23. Be3 $2 ( 23. Re1 Ne7 24. c4 f6 +25. Nd3 Bd4 { <waw> } ) 23... Nxe3 ( 23... Bxe3 24. fxe3 Nxe3 25. Rd2 Rc8 +26. Re2 Nxd5 27. Ng6+ Kd7 { Blacks best line } ) 24. fxe3 Bxe3+ 25. Kf1 Bf4 +26. Re1 ( 26. Nd3 Bd6 27. c4 Rc8 28. b3 { <waw> } ) 26... f6 { } 27. Ng6+ Kf7 +28. Nxf4 Rhe8 29. Rxe8 ( 29. c4 Rac8 30. b3 h6 31. Kf2 Rxe1 32. Rxe1 Rc5 { +<waw> } ) 29... Rxe8 30. d6 ( 30. Kf2 Re5 31. Rd1 g5 32. Ne2 { <waw> } ) +30... Rd8 31. Rd1 g6 32. Nd5 ( 32. c4 g5 33. Ne2 Ke6 34. Nd4+ Kd7 35. c5 h6 { +<waw>,5.25 } ) 32... Rxd6 33. c4 ( 33. Ke2 Ke6 34. c4 Rc6 35. Kd3 f5 36. b3 { +<waw>,4.53 } ) 33... f5 34. Ke1 ( 34. b3 { <waw>,4.22 } ) 34... Ra6 35. a3 f4 +$4 { Simply throws away a pawn. } 36. c5 { why not take the pawn? } ( +36. Nxf4 h6 37. g3 g5 38. Nd5 Re6+ 39. Kd2 Re4 { <waw>,5.06 looks good to me. } +) 36... Ke6 $2 37. Nc7+ { Black resigns } 1-0 + +[Site "Dunfermline Club Championship"] +[Date "1993.11.??"] +[Round "7"] +[White "Gill, Andy"] +[Black "Rintoul, Adam"] +[Result "1-0"] +[ECO "C70"] +1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 b5 5. Bb3 Nf6 6. d3 Bc5 ( 6... Bb7 7. O-O +d5 8. exd5 Nxd5 9. Bg5 Be7 10. Bxe7 Ndxe7 { = } ) 7. Be3 $2 { } ( 7. Nc3 ) +7... Bxe3 8. fxe3 O-O 9. O-O d6 10. Nbd2 ( 10. a3 Bb7 11. Nc3 Rb8 12. Nd5 a5 { +<sab>,0.13 } ) 10... Bg4 11. d4 $2 ( 11. a4 Rb8 12. axb5 axb5 13. h3 Bh5 +14. Qe2 Nd7 { <sab>,-0.22 } ) 11... Bxf3 ( 11... exd4 12. Qe1 dxe3 13. Qxe3 Na5 +14. Nd4 c6 15. c3 Nxb3 { <ab> a pawn up. } ) 12. Nxf3 Nxe4 $4 { } ( 12... Qe8 +13. d5 Na5 14. Qd3 Nxb3 15. axb3 c6 16. Rad1 { <ab> } ) 13. Bd5 Qd7 ( 13... Ng5 +14. Bxc6 Nxf3+ 15. Bxf3 Rb8 16. dxe5 dxe5 17. a3 { <waw> } ) 14. Bxe4 f5 +15. Bd5+ Kh8 16. Ng5 exd4 17. Qh5 { } ( 17. Nxh7 Rfb8 18. Ng5 g6 19. Qf3 Ne5 +20. Qh3+ Kg7 21. Bxa8 { <waw>,4.44 } ) 17... h6 $2 ( 17... g6 18. Bxc6 gxh5 +19. Bxd7 dxe3 20. Rxf5 Rxf5 21. Bxf5 { <waw>,4.90 } ) 18. exd4 ( 18. Qg6 Qe8 +19. Qh7# ) 18... Rae8 ( 18... Rf6 19. Rae1 Raf8 20. Ne6 Re8 21. Qf3 { +<waw>,2.66 } ) 19. Rae1 Rxe1 20. Rxe1 Nd8 21. Qg6 { I finally find the two move +mate! } 1-0 + +[Site "Dunfermline Club Championship"] +[Date "1993.11.??"] +[Round "8"] +[White "Robertson, Ian"] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "C30"] +[WhiteElo "2150"] + +1. e4 e5 2. f4 d6 3. Nf3 Nc6 (3... exf4 {Just take the pawn, and then +follow the main line KG.}) 4. Bb5 Bd7 5. O-O Nf6 6. Nc3 Be7 (6... a6 7. +Ba4 exf4 8. d3 b5 9. Bb3 b4 {Who knows?}) 7. d3 { At this point white is +winning.} 7... O-O 8. Kh1 {! A clever waiting move, to avoid temp +gaining checks.} (8. Ne2) 8... Nd4 {? losses a pawn} 9. Bxd7 Qxd7 (9... +Nxf3 10. Bh3 Nd4 11. Be3 c5 12. fxe5 dxe5 {<saw>}) 10. fxe5 Nxf3 {?? +Losses the piece.} 11. exf6 Bxf6 12. Qxf3 b5 {? what is this for?} ( +12... Rae8 {Planning taking control over the very white center.}) 13. +Nd5 {} 13... Qd8 {?? Losses another pawn, as well as weakening the +kingside, and allowing exchange of queens.} (13... Bd8) 14. Nxf6+ Qxf6 +15. Qxf6 gxf6 16. Rxf6 Kg7 17. Bg5 {Black is just out of good moves.} +17... Rae8 {? Blocking in the f rook, allowing the skew.} 18. Raf1 d5 { +? again lack of vision} 19. Bh6+ Kg8 20. exd5 Rd8 21. Bxf8 Rxf8 22. Rc6 { +Planning an invasion of the 7th. Textbook play.} 22... Rd8 { Planing to +remove the dangerous white pawn, but missing the connected rooks that +arrive on the 7th.} 23. Rxc7 Rxd5 24. Rfxf7 Rd8 {Silly, blocking the +kings escape, athough its over anyway. I should have tried for at least +one cheapo.} (24... Re5) 25. Rxh7 Rf8 {?? Again just missing the action.} +26. Rcg7# 1-0 + +[Site "Dunfermline Club Knockout"] +[Date "1993.12.??"] +[Round "9"] +[White "Gill, Andy"] +[Black "Colquhoun, Bob"] +[Result "1-0"] +[ECO "B10"] + +1. e4 c6 2. Nf3 d5 3. exd5 cxd5 4. c4 ( 4. d4 { Score: 0.06 } ) 4... Nf6 ( +4... d4 5. b3 Nc6 6. Bb2 Nf6 7. Na3 e5 { Score: -0.03 } ) 5. cxd5 ( 5. d4 e6 +6. cxd5 Nxd5 7. Nbd2 Bd6 8. Bc4 { Score: 0.13 } ) 5... Nxd5 6. Bc4 e6 ( +6... Nb6 7. Bb3 Nc6 8. d4 Bf5 9. Bg5 Be4 { Score: 0.00 } ) 7. O-O Nc6 8. d4 a6 +( 8... Bb4 9. Bd2 Bxd2 10. Nbxd2 Nf4 11. Nb3 O-O { Score: -0.16 } ) 9. Re1 ( +9. Nc3 { Score: -0.09 } ) 9... b5 ( 9... Be7 10. Nc3 O-O 11. Qd3 Qd7 12. Nxd5 { +Score: -0.03 } ) 10. Bxd5 Qxd5 11. Nc3 Qf5 ( 11... Qd8 12. d5 Ne7 13. d6 Nf5 +14. Qd5 Bd7 { Score: 0.41 } ) 12. d5 Nd8 ( 12... Nb4 13. d6 Nd3 14. Re4 Nxc1 +15. Rxc1 Rb8 { Score: 0.34 } ) 13. dxe6 ( 13. d6 Nb7 14. Ne4 Nc5 15. Nd4 { +Score: 0.34 } ) 13... Bxe6 14. Qd5 ( 14. Nd5 Rc8 15. Nd4 Qg6 16. Bf4 Bc5 +17. Nc7 Kf8 18. Nxa6 { Score: 0.75 } ) 14... Qxd5 15. Nxd5 Bd6 16. Bg5 ( +16. Nd4 Rb8 17. Bf4 Bxf4 18. Nxf4 Rb6 19. Ndxe6 Nxe6 20. Nxe6 { Score: 0.00 } ) +16... O-O ( 16... h6 17. Bd2 O-O 18. Bf4 { Score: -0.25 } ) 17. Rad1 Nc6 ( +17... Nb7 18. Be7 Bxe7 { Score: 0.00 } ) 18. Nd4 ( 18. Nb6 Bb4 19. Rxe6 fxe6 +20. Nxa8 Rxa8 { Score: 0.16 } ) 18... Bxd5 ( 18... Nxd4 19. Rxd4 h6 20. Ne7 Kh7 +21. Rxd6 hxg5 22. Nd5 { Score: -0.25 } ) 19. Nxc6 Bxh2+ ( 19... Rfe8 20. Rxe8 +Rxe8 21. h3 Re6 22. Nd4 Re4 { Score: -0.13 } ) 20. Kxh2 Bxc6 21. Rd6 Rfe8 ( +21... Rac8 { Score: -0.44 } ) 22. Rxe8+ ( 22. Rc1 Be4 23. Rc7 h6 24. Be3 Kf8 { +Score: -0.41 } ) 22... Bxe8 23. a3 ( 23. Be3 h6 24. b3 Kh7 25. a3 g6 26. Bd4 { +Score: -0.78 } ) 23... a5 ( 23... h6 24. Be3 Kh7 25. b3 f6 26. Bd4 Bf7 27. b4 { +Score: -0.88 } ) 24. Kg3 ( 24. b3 h6 25. Rd8 Rxd8 26. Bxd8 a4 27. bxa4 bxa4 { +Score: -0.81 } ) 24... a4 ( 24... h6 { Score: -0.91 } ) 25. Bc1 ( 25. Kh4 h6 +26. Be3 Kh7 27. Bd4 Rc8 28. g3 Bc6 { Score: -1.03 } ) 25... Rc8 ( 25... h6 +26. Be3 Kh7 27. Kh4 Rc8 28. Bd4 Bc6 29. f3 { Score: -1.09 } ) 26. Bd2 ( 26. Be3 +h6 27. Kh4 Kh7 28. Bd4 Bc6 29. f3 { Score: -1.13 } ) 26... Rc4 ( 26... Bc6 +27. Be3 h6 28. f3 Kh7 { Score: -1.16 } ) 27. Rd8 Re4 28. Bb4 ( 28. f4 { Score: +-0.88 } ) 28... f6 ( 28... h6 29. Kf3 Re6 30. Kg4 Kh7 31. f4 Re4 32. g3 { +Score: -1.13 } ) 29. f4 ( 29. Kf3 Re6 30. Kg4 Kf7 31. Kh4 Re2 32. Rd2 { Score: +-0.91 } ) 29... Kf7 30. Kf3 ( 30. Rc8 Kg6 31. Kf3 { Score: -1.16 } ) 30... Bc6 +31. Rc8 ( 31. Kg3 Re2 32. Rd2 Rxd2 33. Bxd2 Ke6 34. Be3 { Score: -1.25 } ) +31... Rxb4+ 32. Rxc6 Rxb2 33. g4 ( 33. Rb6 { Score: -2.06 } ) 33... Rb3+ +34. Ke4 Rxa3 35. Rc7+ ( 35. f5 h6 36. Rc7 Kg8 37. Rb7 Rb3 38. Rd7 Rb4 39. Kf3 { +Score: -3.28 } ) 35... Kg6 36. Rb7 ( 36. f5 Kh6 37. Rc2 Rb3 38. g5 Kh5 39. gxf6 +gxf6 40. Rh2 { Score: -3.34 } ) 36... Rb3 37. f5+ ( 37. Kd4 { Score: -3.44 } ) +37... Kh6 38. g5+ ( 38. Kd4 a3 39. Ra7 b4 40. Kc4 Rb2 41. Rb7 Rc2 { Score: +-3.59 } ) 38... fxg5 39. Rb6+ Kh5 40. Rb7 Rb4+ ( 40... Kg4 41. Rxg7 Rb4 42. Ke5 +Rf4 43. f6 h5 44. Ra7 h4 { Score: -4.09 } ) 41. Ke5 Rf4 ( 41... Kg4 42. Rxg7 +Rf4 43. f6 h5 44. Ra7 Rf5 45. Ke6 h4 { Score: -4.22 } ) 42. Rxb5 Kg4 43. Ke6 +Rxf5 ( 43... h5 44. Re5 h4 45. Re1 a3 46. Ra1 Rf3 47. Rg1 Kh5 { Score: -3.94 } +) 44. Rxf5 1-0 + + +[Site "Dunfermline Club Championship"] +[Date "1993.12.??"] +[Round "10"] +[White "Gill, Andy"] +[Black "Petrie, George"] +[Result "0-1"] + +1. e4 c5 2. Nf3 Nc6 3. Bc4 d6 ( 3... e6 4. Nc3 Nge7 5. d3 d5 6. Bb3 d4 7. Ne2 +e5 { Score: 0.09 } ) 4. O-O ( 4. c3 { Score: 0.03 } ) 4... e6 ( 4... g6 5. d4 +cxd4 6. Nxd4 Bg7 7. Be3 Nxd4 8. Bxd4 Nf6 { Score: -0.16 } ) 5. d3 ( 5. Bb5 Nf6 +6. d3 Bd7 7. Nc3 Be7 8. Bg5 O-O { Score: 0.00 } ) 5... Be7 ( 5... d5 6. Bb5 Nf6 +7. Ne5 Bd7 8. Nxd7 Qxd7 9. Bg5 { Score: 0.03 } ) 6. Nc3 Bd7 ( 6... Bf6 { Score: +0.00 } ) 7. Bf4 ( 7. Re1 Nf6 8. Be3 O-O 9. a3 Rc8 10. Bf4 Nd4 11. Nxd4 { Score: +0.06 } ) 7... a6 ( 7... Na5 8. Nd2 Nxc4 9. Nxc4 e5 10. Bg3 Be6 11. Ne3 { Score: +-0.06 } ) 8. d4 ( 8. a3 Nf6 9. Re1 O-O 10. Be3 e5 11. Nd5 Be6 12. Nxe7 { Score: +0.06 } ) 8... cxd4 9. Ne2 e5 ( 9... Na5 { Score: -0.94 } ) 10. Bg3 Nf6 11. Bd5 +( 11. c3 Nxe4 12. cxd4 O-O 13. Bd5 Nxg3 { Score: -0.97 } ) 11... O-O ( +11... Nb4 12. c3 Nbxd5 13. exd5 d3 14. Nc1 e4 15. Nd2 { Score: -1.16 } ) 12. c4 +( 12. c3 dxc3 13. Nxc3 b6 14. a3 Qc7 15. b3 Be6 16. Bxe6 { Score: -0.63 } ) +12... Qb6 ( 12... Bg4 13. Qb3 Qc7 14. Rac1 Rac8 15. Qd3 b6 { Score: -1.13 } ) +13. Qd2 ( 13. b3 Bg4 14. Nc1 Rac8 15. Nd3 Nh5 16. a3 Nxg3 17. fxg3 { Score: +-1.22 } ) 13... Rac8 ( 13... Nb4 14. b3 Bg4 15. Rfd1 Nbxd5 { Score: -1.22 } ) +14. Bh4 ( 14. Rac1 { Score: -1.25 } ) 14... Nb4 ( 14... Bg4 15. Bg3 Nb4 16. b3 +Nbxd5 17. exd5 Bxf3 18. gxf3 { Score: -1.53 } ) 15. Nexd4 ( 15. Bxf6 Bxf6 +16. h3 Nxd5 17. cxd5 { Score: -1.44 } ) 15... Nbxd5 ( 15... exd4 16. b3 Bg4 +17. Qf4 Nd3 { Score: -3.34 } ) 16. Bxf6 ( 16. exd5 exd4 17. Rfe1 Bd8 18. b3 Ng4 +19. Bxd8 Rfxd8 20. Nxd4 { Score: -1.94 } ) 16... Nxf6 17. Ne2 ( 17. Nf5 Bxf5 +18. exf5 Rxc4 19. b3 Ne4 20. Qd5 Rb4 { Score: -4.75 } ) 17... Rxc4 18. b3 ( +18. Nc3 Rb4 19. b3 Nxe4 20. Nxe4 Rxe4 21. Rfd1 { Score: -5.13 } ) 18... Rxe4 +19. Nc3 ( 19. Ng3 Rb4 20. Rfe1 Bg4 21. Qd3 Rf4 22. Qe3 Qxe3 23. fxe3 { Score: +-5.38 } ) 19... Rg4 ( 19... Rf4 20. Qe3 Qc7 { Score: -5.34 } ) 20. Qd1 ( +20. Rae1 { Score: -5.41 } ) 20... Bc6 21. Na4 ( 21. Rc1 Rf4 22. Re1 Bxf3 +23. gxf3 Re8 24. a3 { Score: -5.66 } ) 21... Qb4 ( 21... Bxa4 22. bxa4 Qa5 +23. Qb3 Rb4 24. Qc2 Rxa4 25. Rfc1 { Score: -5.94 } ) 22. Rc1 ( 22. h3 Rf4 +23. Nb2 Bxf3 24. gxf3 Rd4 25. Nd3 Qc3 { Score: -5.81 } ) 22... Rxg2+ 23. Kxg2 +Qg4+ 24. Kh1 Bxf3+ 25. Qxf3 Qxf3+ 26. Kg1 Nh5 ( 26... Nd5 27. Rc4 b5 28. Rfc1 +bxc4 29. Rxc4 Bf6 { Score: -14.53 } ) 27. Rc3 Qd5 ( 27... Qg4 28. Kh1 b5 +29. Rg1 Qd4 30. Rh3 Nf4 31. Rhg3 bxa4 { Score: -12.00 } ) 28. Nb6 ( 28. h3 Nf4 +29. Rg3 Ne2 30. Kh2 Nxg3 31. Kxg3 Qd3 32. Kg2 { Score: -11.94 } ) 28... Qd4 +29. Rfc1 ( 29. Na4 b5 30. h3 Nf4 31. Kh2 bxa4 32. Rc7 Re8 { Score: -12.97 } ) +29... Qxb6 30. Rc8 ( 30. R1c2 d5 31. h3 Qg6 32. Kh2 Nf4 33. f3 b6 { Score: +-13.97 } ) 30... Nf4 31. R1c7 ( 31. R8c3 Ne2 32. Kf1 Nxc1 33. Rxc1 d5 34. h3 +Bc5 35. f3 { Score: -15.63 } ) 31... Bh4 ( 31... Nh3 32. Kh1 Qxf2 33. Rc4 d5 +34. Rc3 Qg1 { Score: -#4 } ) 32. Rc2 ( 32. Rxf8 Kxf8 33. Rc8 Ke7 34. Rc2 Qd4 +35. h3 Bxf2 36. Kh2 { Score: -18.41 } ) 32... Nd3 ( 32... Bxf2 33. Kf1 Qe3 +34. Rxf8 Kxf8 35. Rc8 Ke7 36. Rc7 Kd8 { Score: -19.53 } ) 33. Rxf8+ ( 33. Kf1 +Bxf2 34. Rxf8 Kxf8 35. Rc8 Ke7 36. Rg8 Bg3 37. Ke2 { Score: -14.78 } ) +33... Kxf8 0-1 + +[Site "Dunfermline Club Championship"] +[Date "1993.12.??"] +[Round "11"] +[White "Gill, Andy"] +[Black "Horne, Peter"] +[Result "0-1"] + +1. e4 e6 2. Nf3 Nc6 3. Bb5 a6 ( 3... d5 4. d3 dxe4 5. Bxc6 bxc6 6. dxe4 Qxd1 +7. Kxd1 { Score: 0.19 } ) 4. Ba4 ( 4. Bxc6 dxc6 5. O-O Nf6 6. Re1 Be7 7. d4 c5 +8. e5 { Score: 0.22 } ) 4... b5 5. Bb3 Bb7 ( 5... Na5 6. d3 Nxb3 7. axb3 Bb7 +8. O-O Bc5 9. Nc3 { Score: -0.13 } ) 6. d4 ( 6. c3 Nf6 7. d3 Be7 8. Be3 O-O +9. Nbd2 d5 { Score: -0.09 } ) 6... Na5 7. Nbd2 ( 7. e5 Nxb3 8. axb3 c5 9. Bg5 +f6 10. Be3 cxd4 11. Bxd4 { Score: -0.38 } ) 7... Nf6 ( 7... Nxb3 8. axb3 c5 +9. O-O d5 10. exd5 Bxd5 { Score: -0.41 } ) 8. e5 Nd5 ( 8... Nxb3 9. Nxb3 Ne4 +10. O-O Be7 11. c3 O-O 12. Be3 d5 { Score: -0.19 } ) 9. O-O d6 ( 9... Nf4 { +Score: -0.09 } ) 10. a4 ( 10. Bxd5 Bxd5 11. a4 dxe5 12. axb5 c5 13. bxa6 exd4 { +Score: 0.09 } ) 10... b4 ( 10... dxe5 11. Bxd5 Qxd5 12. dxe5 c5 13. axb5 axb5 +14. b3 { Score: 0.06 } ) 11. Nc4 ( 11. Bxd5 Bxd5 12. c3 dxe5 13. Nxe5 Bd6 +14. cxb4 Bxb4 15. Ndf3 { Score: 0.03 } ) 11... Nxb3 12. cxb3 a5 ( 12... Rb8 +13. Qc2 Be7 14. Na5 c5 15. exd6 Qxd6 16. Nxb7 Rxb7 { Score: -0.34 } ) 13. Qe2 ( +13. Bg5 Be7 14. Bxe7 Qxe7 15. Re1 dxe5 { Score: -0.56 } ) 13... f6 ( 13... Be7 +14. Rd1 O-O 15. Be3 dxe5 16. dxe5 { Score: -0.63 } ) 14. exd6 ( 14. exf6 Bc8 +15. f7 Kxf7 16. Ng5 Ke7 17. Ne4 Qd7 18. Bg5 { Score: 0.47 } ) 14... cxd6 ( +14... Bxd6 15. Qxe6 Be7 16. Bd2 Ra6 17. Qf5 c5 18. dxc5 Bxc5 { Score: 0.03 } ) +15. Qxe6+ Qe7 ( 15... Be7 16. Re1 Ra6 17. Nh4 Nc7 18. Qxe7 Qxe7 19. Rxe7 Kxe7 { +Score: 0.72 } ) 16. Qh3 ( 16. Nxd6 Kd8 17. Qxe7 Bxe7 18. Nxb7 Kc8 19. Nc5 Re8 +20. Re1 { Score: 4.66 } ) 16... Qf7 ( 16... Qc7 17. Re1 Be7 18. Qe6 Ra6 19. Bd2 +Qc8 20. Qxc8 Bxc8 { Score: 0.97 } ) 17. Re1+ Kd8 18. Bd2 Qg6 ( 18... g6 { +Score: 0.97 } ) 19. Re2 ( 19. Rac1 Ra6 20. Ne3 Nxe3 21. Bxe3 d5 22. Bf4 Bd6 { +Score: 0.88 } ) 19... Be7 ( 19... Ra6 20. Rae1 Be7 21. Qe6 Re8 22. Ne3 Nxe3 +23. Bxe3 Bxf3 { Score: 0.88 } ) 20. Rae1 ( 20. Nh4 Qh5 21. Rae1 Bc8 22. Qg3 Qg4 +23. Bf4 Nxf4 24. Qxg4 { Score: 1.06 } ) 20... Re8 ( 20... Bc8 21. Qh4 Bb7 +22. Bf4 Ba6 23. Qg3 { Score: 0.91 } ) 21. Nh4 ( 21. Nxd6 Bc8 22. Nh4 Qh5 +23. Qg3 Rg8 24. Nf3 Bg4 { Score: 2.06 } ) 21... Qh5 22. Nf5 ( 22. Nxd6 Ba6 +23. Re6 Bc8 24. g4 Bxe6 25. Rxe6 Nf4 26. Bxf4 { Score: 3.06 } ) 22... Qxh3 +23. gxh3 g6 ( 23... Bc6 24. Nxg7 Rg8 25. Bh6 Bd7 26. Nb6 { Score: 1.53 } ) +24. Ncxd6 ( 24. Nfxd6 Bc6 25. Nxe8 Kxe8 26. Re6 Bd7 27. Nd6 Kd8 28. Nf7 { +Score: 3.41 } ) 24... gxf5 25. Nxe8 ( 25. Nxb7 Kd7 26. Nc5 Bxc5 27. dxc5 Rxe2 { +Score: 1.66 } ) 25... Kxe8 26. Bh6 ( 26. f3 Kd7 27. Kf2 Rg8 28. Rd1 Bd6 29. Kf1 +Bc6 { Score: -0.16 } ) 26... Kf7 ( 26... Kd7 27. f3 Rg8 28. Kf2 Bd6 29. Rg1 Rg6 +30. Rxg6 hxg6 { Score: -0.47 } ) 27. Bf4 ( 27. f3 Rg8 28. Kf2 Bd6 29. Rg1 Rg6 +30. Rxg6 hxg6 31. Ke1 { Score: -0.41 } ) 27... Rg8+ 28. Kf1 Ba6 29. Bd2 Bd6 +30. f3 ( 30. Rc1 Bxh2 31. f3 Bg1 32. Rc4 Bxc4 33. bxc4 Bxd4 34. Rg2 { Score: +-3.00 } ) 30... Bxh2 31. Kf2 ( 31. Rc1 Bg1 32. Rc4 Bxc4 33. bxc4 Bxd4 34. Re1 +Ne7 { Score: -3.13 } ) 31... Bg3+ 32. Kf1 Bxe1 33. Bxe1 ( 33. Kxe1 Rg1 34. Kf2 +Rb1 35. Re1 Rxb2 36. Rd1 Nc3 37. Ke1 { Score: -4.84 } ) 33... Ne3+ ( 33... Re8 +34. Bg3 Rxe2 35. Kg1 Rxb2 36. Bd6 Rxb3 { Score: -8.31 } ) 34. Kf2 f4 ( +34... Nd1 35. Kf1 Re8 36. Kg1 Bxe2 37. f4 Rd8 38. Kg2 Rxd4 { Score: -7.81 } ) +35. Rxe3 fxe3+ 36. Kxe3 Re8+ 37. Kd2 Re2+ 38. Kd1 Rxb2 39. d5 ( 39. f4 Rxb3 +40. h4 Rd3 41. Kc1 Rxd4 42. Bg3 Rd3 43. Bf2 { Score: -6.09 } ) 39... Rxb3 0-1 + +[Site "Dunfermline Club Championship"] +[Date "1994.01.??"] +[Round "12"] +[White "Gill, Andy"] +[Black "Easton, Brian"] +[Result "1-0"] + +1. e4 Nf6 2. Nc3 e6 3. d4 d5 4. e5 Ne4 5. Nxe4 dxe4 6. Bc4 Nc6 7. Be3 +Bb4+ 8. c3 Be7 9. Ne2 Bg5 10. Qd2 Na5 11. Bxg5 Nxc4 12. Qf4 Qd5 13. b3 +Nb2 14. O-O b6 15. Ng3 Ba6 16. c4 Nd3 17. Qxe4 Qxe4 18. Nxe4 Bb7 19. f3 +O-O 20. Nf2 f6 21. exf6 gxf6 22. Bh6 Rf7 23. Nxd3 Rd8 24. Nf4 Re7 25. +Rfe1 Kf7 26. Rad1 e5 27. dxe5 Rxd1 28. Rxd1 fxe5 29. Nd5 Rd7 30. f4 e4 +31. f5 c6 32. Nc3 c5 33. Rxd7+ Kf6 34. Rxb7 Kxf5 35. Rxh7 Kg6 36. Rh8 +1-0 + +[Site "Wester-Hailes Congress"] +[Date "1994.01.??"] +[Round "13"] +[White "Plant, George"] +[Black "Gill, Andy"] +[Result "1-0"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6 5. d4 b5 6. Bb3 d6 7. Ng5 Qd7 +8. Bxf7+ Kd8 9. d5 Nb4 10. c3 Nxe4 11. Be6 Qe8 12. cxb4 Nxg5 13. Bxg5+ +Be7 14. Bxe7+ Qxe7 15. Bxc8 Rxc8 16. O-O c6 17. dxc6 Rxc6 18. Re1 h5 +19. Nc3 Rc4 20. a3 g5 21. Nd5 Qg7 22. Ne3 Rc7 23. Nf5 Qf6 24. Qxd6+ +Qxd6 25. Nxd6 Re7 26. Rxe5 Rxe5 27. Nf7+ Ke7 28. Nxe5 Rc8 29. Nd3 Kd6 +30. Kf1 h4 31. h3 Kd5 32. Ne1 Ke4 33. Nf3 Kf4 34. Nd4 Re8 35. Re1 Rxe1+ +36. Kxe1 Ke5 37. Nc2 Ke4 38. Ke2 Kf4 39. Kd3 Ke5 40. Ne3 Kf4 41. Nd5+ +Kf5 42. Nc7 1-0 + +[Site "Wester-Hailes Congress"] +[Date "1994.01.??"] +[Round "14"] +[White "Gill, Andy"] +[Black "McIntee, C."] +[Result "1-0"] + +1. e4 c5 2. Nf3 Nc6 3. Be2 Nf6 4. Nc3 e6 5. O-O d5 6. exd5 Nxd5 7. Nxd5 +Qxd5 8. c4 Qd8 9. Re1 h5 10. b3 f6 11. Bb2 h4 12. h3 Qc7 13. d4 Qf4 +14. d5 exd5 15. cxd5 Nd8 16. Bb5+ Kf7 17. Qc1 Qd6 18. Qe3 Be7 19. Qe4 +g5 20. Bd3 Ke8 21. Qg6+ Kd7 22. Bb5+ Kc7 23. Ne5 Qxd5 24. Rad1 Qg8 25. +Bc4 Ne6 26. Qxg8 Rxg8 27. Bxe6 Bxe6 28. Nf3 Rad8 29. Rxd8 Rxd8 30. Rxe6 +Rd1+ 31. Kh2 Bd6+ 32. g3 f5 33. Be5 hxg3+ 34. fxg3 Bxe5 35. Rxe5 Ra1 +36. Rxc5+ Kb6 37. Rc2 g4 38. hxg4 fxg4 39. Ne5 Kb5 40. Nxg4 a5 41. Ne3 +Re1 42. Nc4 Re6 43. g4 Rh6+ 44. Kg3 Rg6 45. Rg2 a4 46. Ne5 Rg5 47. +bxa4+ Kxa4 48. Kf4 Rg7 49. g5 b5 50. g6 b4 51. Kf5 Ka3 52. Kf6 Rg8 53. +g7 1-0 + +[Site "Wester-Hailes Congress"] +[Date "1994.01.??"] +[Round "15"] +[White "Robertson, F."] +[Black "Gill, Andy"] +[Result "1-0"] + +1. d4 d5 2. Nf3 e6 3. Bf4 Be7 4. e3 Nf6 5. Bd3 b6 6. O-O O-O 7. Re1 Bb7 +8. Nbd2 c5 9. c3 Nc6 10. Ne5 Rc8 11. Ndf3 c4 12. Bc2 b5 13. b3 Qa5 14. +b4 Qd8 15. a4 a6 16. axb5 axb5 17. Nxc6 Bxc6 18. Ne5 Bb7 19. Ra5 Qe8 +20. Ra7 Ba8 21. Ng4 Bc6 22. Be5 Qd8 23. Qf3 Ra8 24. Rxa8 Bxa8 25. Nxf6+ +Bxf6 26. e4 Bxe5 27. dxe5 dxe4 28. Bxe4 Bxe4 29. Qxe4 Qd3 30. Qxd3 cxd3 +31. Rd1 Rd8 32. f4 f5 33. Kf2 Kf8 34. Ke3 Ke7 35. Rxd3 Rxd3+ 36. Kxd3 +Kd7 37. h3 g6 38. Kd4 Kc6 39. g3 Kb6 40. g4 Kc6 41. c4 Kb6 42. c5+ Kc6 +43. Ke3 Kc7 44. Ke2 Kc6 45. Kf3 Kd5 46. gxf5 gxf5 47. h4 Kc4 1-0 + +[Site "Wester-Hailes Congress"] +[Date "1994.01.??"] +[Round "16"] +[White "Gill, Andy"] +[Black "McKerrow, A."] +[Result "0-1"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6 5. O-O Be7 6. Nc3 b5 7. Bb3 +O-O 8. a3 d6 9. Re1 Rb8 10. d3 Bg4 11. h3 Bh5 12. Nd5 Nxd5 13. exd5 Nd4 +14. g4 Nxf3+ 15. Qxf3 Bg6 16. a4 b4 17. a5 Qc8 18. Ba4 f5 19. gxf5 Rxf5 +20. Qg4 Bh5 21. Qc4 Rf6 22. Bg5 Rg6 23. f4 h6 24. Rxe5 dxe5 25. d6+ Qe6 +26. Qxe6+ Rxe6 27. Bb3 hxg5 28. dxe7 Bf7 29. fxg5 Rg6 30. Rf1 Bxb3 31. +cxb3 Rxg5+ 32. Kh2 Re8 33. h4 Rg4 34. Kh3 Rf4 35. Rxf4 exf4 36. Kg4 +Rxe7 37. Kxf4 Rd7 38. Ke4 Rd6 0-1 + +[Site "Wester-Hailes Congress"] +[Date "1994.01.??"] +[Round "17"] +[White "McCluskey, S."] +[Black "Gill, Andy"] +[Result "1-0"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Bxc6 dxc6 5. d3 Bd6 6. O-O Bg4 7. h3 +Bh5 8. Be3 Qe7 9. Nc3 Nf6 10. Re1 O-O-O 11. Nb1 Bb4 12. c3 Ba5 13. b4 +Bb6 14. a3 Nxe4 15. Bxb6 Bxf3 16. Qxf3 Ng5 17. Qe3 cxb6 18. d4 Rhe8 +19. h4 Ne6 20. g3 exd4 21. cxd4 Rxd4 22. Nc3 c5 23. Rac1 Red8 24. bxc5 +bxc5 25. Ne4 R8d7 26. Nxc5 Rc7 27. Nxe6 Qxe6 28. Qxd4 Rxc1 29. Rxc1+ +Kb8 30. Qxg7 1-0 + +[Site "Dunferline Club Knockout"] +[Date "1994.01.??"] +[Round "18"] +[White "Gill, Andy"] +[Black "Brown, Rab"] +[Result "1-0"] + +1. e4 e5 2. Nf3 d6 3. d4 Nc6 4. dxe5 Nxe5 5. Nxe5 dxe5 6. Qxd8+ Kxd8 +7. Bc4 Bb4+ 8. Nc3 Bxc3+ 9. bxc3 Be6 10. Bxe6 fxe6 11. O-O Nf6 12. Bb2 +Nxe4 13. c4 Nd2 14. Rfd1 Ke7 15. Rxd2 c5 16. Bxe5 Rhg8 17. Rad1 g5 18. +Rd7+ Ke8 19. Rxb7 g4 20. Rxh7 Rd8 21. Rxd8+ Kxd8 22. Rh8 Rxh8 23. Bxh8 +Kd7 24. f3 gxf3 25. gxf3 Ke7 26. Be5 Kd7 27. Kg2 Ke7 28. Kg3 Kf7 29. +Bd6 Kf6 30. Bxc5 a5 31. Kf4 e5+ 32. Ke4 Ke6 33. f4 a4 34. fxe5 a3 35. +Bxa3 Kd7 36. Kd5 Ke8 37. Ke6 Kd8 38. Kf7 Kd7 39. e6+ Kc6 40. e7 Kc7 +41. e8=Q Kb7 42. Qe6 Kc7 43. Qd6+ Kb7 44. Ke7 Ka7 45. Qb4 Ka8 46. Kd7 +Ka7 47. Kc7 Ka6 48. Qb6# 1-0 + +[Site "Dunfermline C vs Grangemouth B"] +[Date "1994.01.??"] +[Round "19"] +[White "Gill, Andy"] +[Black "Patterson, Dick"] +[Result "0-1"] + +1. e4 c5 2. Nf3 Nc6 3. Be2 e6 4. b3 a6 5. O-O b5 6. Bb2 Nf6 7. e5 Nd5 +8. d4 Bb7 9. c4 Nf4 10. cxb5 Nxe2+ 11. Qxe2 axb5 12. Re1 cxd4 13. Nxd4 +Nxd4 14. Bxd4 Qg5 15. g3 Rc8 16. f4 Qg6 17. Qxb5 Bc6 18. Qe2 Be7 19. a4 +O-O 20. a5 f6 21. exf6 Bxf6 22. Bxf6 Rxf6 23. b4 Rxf4 24. Qd2 Rf3 25. +Rf1 Rxf1+ 26. Kxf1 Qf5+ 27. Qf4 Qd3+ 28. Ke1 Rf8 29. Qxf8+ Kxf8 30. a6 +Qd4 31. Ke2 Qxa1 32. Nd2 Qxa6+ 33. Ke3 Qa3+ 0-1 + +[Site "Dunfermline Club Championship"] +[Date "1994.01.??"] +[Round "20"] +[White "Mitchell, Ian"] +[Black "Gill, Andy"] +[Result "1-0"] +[WhiteElo "1660"] + +1. e4 e5 2. f4 exf4 3. Nf3 Nc6 4. d4 Nf6 5. Bd3 d5 6. e5 Ne4 7. O-O g5 +8. c3 Qe7 9. Nfd2 Bf5 10. Qe2 Nxd2 11. Nxd2 Bxd3 12. Qxd3 O-O-O 13. a4 +Rg8 14. a5 a6 15. b4 h6 16. b5 Nb8 17. Nb3 axb5 18. Qxb5 Qd7 19. Qd3 f6 +20. exf6 Bd6 21. Bd2 Qg4 22. a6 Nxa6 23. Rxa6 bxa6 24. Qxa6+ Kd7 25. +Qb5+ Ke6 26. c4 f3 27. Rxf3 Rb8 28. Qxd5+ Kd7 29. Nc5+ Kd8 30. Qxg8+ +1-0 + +[Site "Dunfermline Club Championship"] +[Date "1994.02.??"] +[Round "21"] +[White "Gill, Andy"] +[Black "Burtwistle, Paul"] +[Result "0-1"] + +1. e4 c5 2. Nf3 e6 3. Be2 Nc6 4. O-O Nf6 5. Nc3 d5 6. e5 Nd7 7. Re1 +Ndxe5 8. Nxe5 Nxe5 9. Bb5+ Nc6 10. d4 a6 11. Bxc6+ bxc6 12. Be3 cxd4 +13. Bxd4 c5 14. Be5 Bb7 15. Qd2 f6 16. Bc7 Qxc7 17. Rxe6+ Kf7 18. Rae1 +d4 19. Nd1 Bd6 20. f4 Rhe8 21. f5 Bd5 22. Rxe8 Rxe8 23. c3 Rxe1+ 24. +Qxe1 Bxh2+ 25. Kh1 Be5 26. cxd4 cxd4 27. Qe2 Qc4 28. Qh5+ Kf8 29. Kg1 +Qc2 0-1 + +[Site "Dunfermline Club Knockout"] +[Date "1994.02.??"] +[Round "22"] +[White "Gill, Andy"] +[Black "O'Neill, Jim"] +[Result "0-1"] +[BlackElo "1875"] + +1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nf6 5. Bd3 a6 6. O-O e5 7. Nf3 +Bg4 8. Nc3 Nbd7 9. Re1 Rc8 10. Be3 b5 11. Nd5 Nxd5 12. exd5 Nf6 13. Bg5 +Be7 14. Bxf6 Bxf6 15. Be4 O-O 16. c3 Bh4 17. Qc2 f5 18. Nxh4 Qxh4 19. +g3 Qh5 20. Bg2 Rf6 21. f3 Bxf3 22. Bxf3 Qxf3 23. Rad1 f4 24. gxf4 Rg6+ +0-1 + +[Site "Dunfermline Club Championship"] +[Date "1994.02.??"] +[Round "23"] +[White "Gill, Andy"] +[Black "Bell, Bill"] +[Result "1-0"] + +1. e4 e6 2. d4 d5 3. Nf3 dxe4 4. Nfd2 Qxd4 5. c3 Qd5 6. Be2 e3 7. Nf3 +Qxd1+ 8. Bxd1 exf2+ 9. Kxf2 Nc6 10. Be3 Bd7 11. Re1 h6 12. Nbd2 O-O-O +13. Ba4 Kb8 14. Rad1 Bd6 15. b4 a6 16. Nc4 Be7 17. Nfe5 Be8 18. Rxd8+ +Bxd8 19. Bxc6 Bxc6 20. Nxf7 Rh7 21. Nxd8 Bd5 22. Nd2 g5 23. Rd1 Kc8 +24. Nb3 Rd7 25. Nxb7 Bxb7 26. Rxd7 Kxd7 27. Nc5+ Kc6 28. Nxe6 Nf6 29. +Nd8+ Kd7 30. Nxb7 Ne4+ 31. Kf3 Nxc3 32. Nc5+ Kc6 33. Nxa6 Nxa2 34. Bd2 +Kb6 35. Nc5 Kc6 36. Nd3 Kb5 37. Ke4 Kc4 38. g3 Kb3 39. h4 gxh4 40. gxh4 +Nc3+ 41. Bxc3 Kxc3 42. h5 Kc4 43. Ne5+ Kxb4 44. Kd5 c5 45. Nd3+ Kb5 +46. Nxc5 Kb6 47. Ne6 Kb7 48. Nf8 Kc7 49. Ke6 Kd8 50. Kf7 Kc8 51. Kg6 +Kd8 52. Kxh6 Ke8 53. Kg7 1-0 + +[Site "Dunfermline Club Championship"] +[Date "1994.02.??"] +[Round "24"] +[White "MacArthur, John"] +[Black "Gill, Andy"] +[Result "1-0"] +[WhiteElo "1725"] + +1. d4 e6 2. Nf3 Nf6 3. c4 d5 4. Nc3 Nc6 5. e3 Be7 6. Be2 O-O 7. O-O Qd6 +8. c5 Qd7 9. Ne5 Nxe5 10. dxe5 Ne4 11. Nxe4 dxe4 12. Qc2 Qc6 13. b4 Rd8 +14. Bb2 a5 15. a3 axb4 16. axb4 Rxa1 17. Rxa1 b6 18. Bd4 bxc5 19. bxc5 +Bb7 20. Ra5 Ra8 21. Bb5 Qd5 22. Qa4 Rxa5 23. Qxa5 Bxc5 24. Qxc7 Bf8 +25. Be8 h6 26. Qxf7+ Kh7 27. Qxf8 Bc6 1-0 + +[Site "Dunfermline Club Championship"] +[Date "1994.02.??"] +[Round "25"] +[White "Sneddon, Ian"] +[Black "Gill, Andy"] +[Result "1-0"] +[WhiteElo "1685"] + +1. c4 e5 2. Nc3 Nf6 3. Nf3 Nc6 4. g3 d5 5. cxd5 Nxd5 6. Bg2 Be6 7. O-O +Bb4 8. Ne4 Qd7 9. d4 exd4 10. Nxd4 O-O-O 11. Nxe6 Qxe6 12. Qc2 h6 13. +Rd1 f5 14. Nc5 Bxc5 15. Qxc5 Nde7 16. Be3 Rxd1+ 17. Rxd1 Rd8 18. Rxd8+ +Kxd8 19. b3 a6 20. Qc3 Qe5 21. Qxe5 Nxe5 22. Bxb7 N7c6 23. Bf4 Na5 24. +Bxe5 Nxb7 25. Bxg7 h5 26. Kg2 Nd6 27. f3 Ne8 28. Be5 c6 29. Kh3 Ke7 +30. Kh4 Nf6 31. Bxf6+ Kxf6 32. Kxh5 c5 33. g4 f4 34. g5+ Kg7 35. Kg4 +1-0 + +[Site "Dunfermline Club Championship"] +[Date "1994.03.??"] +[Round "26"] +[White "Gill, Andy"] +[Black "Connally, Paul"] +[Result "0-1"] +[ECO "B70"] + +1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 g6 5. Nc3 Nf6 6. Bd3 Bg7 7. O-O +O-O 8. f4 Nc6 9. Nxc6 bxc6 10. Kh1 Rb8 11. Qe1 Ng4 12. h3 Nf6 13. b3 e5 +14. fxe5 Nh5 15. Bb2 dxe5 16. Rf3 a5 17. g4 Nf4 18. Rd1 Qg5 19. Bc1 +Bxg4 20. Bxf4 Bxf3+ 0-1 + +[Site "Glenrothes Congress"] +[Date "1994.03.??"] +[Round "27"] +[White "Hunt, Tom"] +[Black "Gill, Andy"] +[Result "1/2-1/2"] + +1. Nf3 Nc6 2. g3 e5 3. Nc3 d5 4. d3 Be6 5. Bg2 Qd7 6. Ng5 d4 7. Nce4 +Bf5 8. a3 Be7 9. O-O Bxg5 10. Nxg5 f6 11. Ne4 Bh3 12. Nc5 Qc8 13. Bxh3 +Qxh3 14. Nxb7 Rb8 15. Nc5 h5 16. e4 g5 17. Qf3 g4 18. Qf5 Kf7 19. Bg5 +Nce7 20. Qe6+ Kg6 21. f4 exf4 22. Rxf4 Kxg5 23. Raf1 h4 24. Qf7 hxg3 +25. Ne6+ Kh4 26. hxg3+ Qxg3+ 1/2-1/2 + +[Site "Glenrothes Congress"] +[Date "1994.03.??"] +[Round "28"] +[White "Gill, Andy"] +[Black "Husband, Dan"] +[Result "1-0"] + +1. e4 c5 2. Nf3 Nc6 3. d4 Nxd4 4. Nxd4 cxd4 5. Qxd4 e6 6. Nc3 Qb6 7. +Qxb6 axb6 8. Bb5 Bc5 9. O-O Nf6 10. Be3 O-O 11. Rfe1 d6 12. a4 Bd7 13. +Bg5 Bc6 14. Bxf6 gxf6 15. Rad1 Kh8 16. Rd3 Rad8 17. Rh3 Rg8 18. Bd3 Rg7 +19. Nb5 Bxb5 20. axb5 Rdg8 21. Rg3 Rxg3 22. hxg3 h6 23. Kf1 Kg7 24. c3 +d5 25. exd5 exd5 26. Ra1 d4 27. Ra7 dxc3 28. bxc3 Rd8 29. Be4 Rd1+ 30. +Ke2 Rc1 31. Rxb7 Rxc3 32. Kf1 Rb3 33. Rxf7+ Kh8 34. Rxf6 Rxb5 35. Rxh6+ +Kg7 36. Rg6+ Kh7 37. Rxb6+ 1-0 + +[Site "Glenrothes Congress"] +[Date "1994.03.??"] +[Round "29"] +[White "Chance, Keith"] +[Black "Gill, Andy"] +[Result "1/2-1/2"] + +1. Nf3 Nc6 2. e4 e5 3. d4 exd4 4. Nxd4 d6 5. Nxc6 bxc6 6. Bd3 Bb7 7. +O-O Nf6 8. Re1 Be7 9. e5 dxe5 10. Rxe5 O-O 11. h3 Re8 12. Re1 Qd7 13. +Bg5 Rad8 14. Bxf6 Bxf6 15. Rxe8+ Qxe8 16. Nc3 Ba6 17. Qe1 Qxe1+ 18. +Rxe1 Bxd3 19. cxd3 g6 20. Rd1 Rb8 21. Ne4 Bxb2 22. Rb1 a5 23. Nc3 Rb4 +24. Nd1 Ba3 25. Rxb4 Bxb4 26. Kf1 f5 27. Nb2 Kf7 28. Nc4 Ke6 29. Ke2 +Kd5 30. a3 Bc5 31. Nxa5 Bxa3 32. Nc4 Bc5 33. f3 h5 34. g4 hxg4 35. hxg4 +fxg4 36. fxg4 Ke6 37. Kf3 Bd6 38. Ke4 g5 39. Na5 c5 40. Nc4 Bf4 41. Na5 +Bd2 42. Nc4 Bb4 43. Ne5 Bd2 44. Nf3 Bc1 45. Ne5 Bf4 46. Ng6 Bg3 47. +Nf8+ Kd6 48. Nh7 Bf4 49. Kf5 Kd5 50. Nxg5 Bxg5 51. Kxg5 Kd4 52. Kf5 +Kxd3 53. g5 c4 54. g6 c3 55. g7 c2 56. g8=Q c1=Q 57. Qd5+ Ke2 58. Qg2+ +Kd1 59. Qg1+ 1/2-1/2 + +[Site "Glenrothes Congress"] +[Date "1994.03.??"] +[Round "30"] +[White "Gill, Andy"] +[Black "King, Jim"] +[Result "1/2-1/2"] + +1. e4 c5 2. Nf3 Nc6 3. d4 cxd4 4. Nxd4 d6 5. Bb5 Qc7 6. O-O a6 7. Ba4 +b5 8. Bb3 Nf6 9. Re1 e6 10. Bg5 Be7 11. c3 O-O 12. Nd2 Bb7 13. Qe2 Rfe8 +14. Rac1 d5 15. Bc2 Rac8 16. e5 Nd7 17. Bxe7 Rxe7 18. N2f3 h6 19. Qd3 +g6 20. Qe3 Kg7 21. Nh4 Ncxe5 22. b3 Qxc3 23. Qxc3 Rxc3 24. Bb1 b4 25. +Rxc3 bxc3 26. Rc1 g5 27. Nhf3 Nxf3+ 28. Nxf3 g4 29. Nd4 e5 30. Nf5+ Kf6 +31. Nxe7 Kxe7 32. Rxc3 Kd6 33. h3 Nf6 34. hxg4 Nxg4 35. Bf5 Nf6 36. Bc8 +d4 37. Rc4 Bd5 38. Rc2 a5 39. f3 Nh5 40. Ba6 Nf4 41. Rd2 f6 42. Bd3 Bc6 +43. Kf2 h5 44. g3 Ne6 45. a4 Be8 46. Bb5 Bg6 1/2-1/2 + +[Site "Glenrothes Congress"] +[Date "1994.03.??"] +[Round "31"] +[White "Gourley, R."] +[Black "Gill, Andy"] +[Result "1-0"] + +1. Nf3 Nc6 2. d4 e6 3. c4 d5 4. Nc3 Bb4 5. e3 Nf6 6. Bd2 O-O 7. Ne5 +Nxe5 8. dxe5 Ne4 9. Nxe4 dxe4 10. Bxb4 c5 11. Bxc5 Qa5+ 12. b4 Rd8 13. +bxa5 Rxd1+ 14. Rxd1 h6 15. Rd8+ Kh7 16. Be7 b6 17. axb6 axb6 1-0 + +[Site "Dunfermline Club Championship"] +[Date "1994.03.??"] +[Round "32"] +[White "Gill, Andy"] +[Black "Glynis, Grant"] +[Result "1-0"] + +1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 a6 6. Bc4 Nc6 7. Nxc6 +bxc6 8. Be3 e6 9. O-O Be7 10. Bb3 O-O 11. Qe2 Bb7 12. Rad1 Qc7 13. f4 +e5 14. Kh1 Rfd8 15. Qf3 Qc8 16. fxe5 dxe5 17. Qg3 Rxd1 18. Nxd1 Qg4 +19. Qxe5 Qxe4 20. Qxe4 Nxe4 21. Rxf7 Nd6 22. Rxe7+ Kh8 23. Re5 Rf8 24. +Kg1 h6 25. Bc5 Rf6 26. c3 a5 27. g3 Ba6 28. Bc2 g5 29. Bd4 Kg8 30. Rxa5 +Rf1+ 31. Kg2 Rf8 32. Rxa6 Nc4 33. Rxc6 Na5 34. Rxh6 Rf7 35. Rh8# 1-0 + +[Site "Dunfermline Club Championship"] +[Date "1994.03.??"] +[Round "33"] +[White "Welshman, Alistair"] +[Black "Gill, Andy"] +[Result "0-1"] +[ECO "B20"] + +1. e4 c5 2. Bc4 d6 3. Nc3 Nf6 4. Nf3 e6 5. O-O Be7 6. d3 O-O 7. Bg5 Nc6 +8. Bxf6 Bxf6 9. Bb5 Bd7 10. Bxc6 Bxc6 11. Qe2 Re8 12. Rae1 Bxc3 13. +bxc3 Qa5 14. e5 d5 15. d4 Bb5 16. Qe3 Bxf1 17. Rxf1 cxd4 18. Qxd4 Rac8 +19. Qb4 Qxb4 20. cxb4 Rxc2 21. Ra1 Rec8 22. Kf1 Rc1+ 23. Rxc1 Rxc1+ +24. Ke2 Rc2+ 25. Nd2 Rxa2 26. g4 Rb2 0-1 + +[Site "Dunfermline Club Championship"] +[Date "1994.03.??"] +[Round "34"] +[White "Taylor, Robin"] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "C02"] +[WhiteElo "1610"] + +1. d4 e6 2. e4 d5 3. e5 c5 4. c3 Nc6 5. Nf3 Bd7 6. Bf4 cxd4 7. cxd4 +Bb4+ 8. Bd2 Bxd2+ 9. Qxd2 Nge7 10. Nc3 a6 11. a3 Qc7 12. Bd3 O-O-O 13. +O-O Rdf8 14. b4 f6 15. b5 Nxd4 16. Nxd4 Qxe5 17. bxa6 Qxd4 18. axb7+ +Kb8 19. Ne2 Qa7 20. Qb4 Nf5 21. Bxf5 exf5 22. Qd6+ Kxb7 23. Rab1+ Kc8 +24. Rfc1+ Kd8 25. Rb8+ Qxb8 26. Qxb8+ Ke7 27. Qb4+ Kf7 28. f4 Rc8 29. +Rxc8 Rxc8 30. Qd6 Be6 31. Nd4 Rc1+ 32. Kf2 Rd1 33. Qxe6+ Kf8 34. Nxf5 +Rd2+ 35. Ke3 1-0 + +[Site "Dunfermline C vs Stirling A"] +[Date "1994.03.??"] +[Round "35"] +[White "Smith, Steve"] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "B92"] +[WhiteElo "1745"] + +1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 a6 6. Be2 e5 7. Nb3 +Be7 8. O-O O-O 9. a4 Be6 10. f4 Bxb3 11. cxb3 Nc6 12. Be3 Qd7 13. Bc4 +Rad8 14. f5 Kh8 15. Qf3 Nb4 16. Rfd1 Nc2 17. Rac1 Nxe3 18. Qxe3 Qc6 +19. Nd5 Nxd5 20. Bxd5 Qd7 21. Qb6 Rb8 22. Rc7 Bd8 23. Rxd7 Bxb6+ 24. +Kf1 f6 25. Bxb7 Bd4 26. Rc1 Bxb2 27. Rcc7 Rg8 28. Bxa6 h5 29. Bc4 Rgc8 +30. Rxg7 Rxc7 31. Rxc7 Bd4 32. Rf7 Rg8 33. Rxf6 Rg4 34. Bd5 Rf4+ 35. +Ke1 Bc3+ 36. Ke2 Bd4 37. Rh6+ Kg7 38. Rxh5 Rf2+ 39. Kd3 Rxg2 40. Kc4 +Bg1 41. h4 Rc2+ 42. Kd3 Rg2 43. Rg5+ Rxg5 44. hxg5 Bb6 45. Kc4 Bd8 46. +f6+ Kg6 47. f7 Be7 1-0 + +[Site "Dunfermline Club Championship"] +[Date "1994.04.??"] +[Round "36"] +[White "Gill, Andy"] +[Black "Bill, Phillips"] +[Result "0-1"] +[ECO "C10"] + +1. e4 e6 2. d4 d5 3. Nc3 c5 4. e5 Nc6 5. Nf3 Qb6 6. Bb5 Bd7 7. Bxc6 +Bxc6 8. O-O Ne7 9. dxc5 Qxc5 10. Be3 Qa5 11. Qd3 Nf5 12. Nd4 Nxe3 13. +Nxc6 bxc6 14. Qxe3 Bc5 15. Qd3 O-O 16. a3 Qc7 17. b4 Bb6 18. Rfe1 a6 +19. Na4 Rfb8 20. Nxb6 Rxb6 21. c4 dxc4 22. Qxc4 Rb5 23. Qe4 Rd5 24. +Rad1 Rad8 25. Rxd5 cxd5 26. Qd4 Rc8 27. f4 g6 28. Re3 h5 29. Kf2 Qc2+ +30. Kf3 Rc4 31. Qd3 Qc1 32. Qe2 d4 33. Rd3 Rc3 34. Ke4 Rxa3 35. Rxa3 +Qxa3 36. Qc4 Qe3# 0-1 + +[Site "Edinburgh Congress"] +[Date "1994.04.??"] +[Round "37"] +[White "Gill, Andy"] +[Black "Watt, Andrew"] +[Result "0-1"] +[ECO "C97"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6 5. O-O Be7 6. Re1 b5 7. Bb3 d6 +8. c3 O-O 9. h3 Na5 10. Bc2 c5 11. d4 Qc7 12. b4 cxb4 13. cxb4 Nc4 14. +Nbd2 Bb7 15. Nxc4 Qxc4 16. dxe5 dxe5 17. a3 Rac8 18. Bd3 Qc3 19. Bg5 +Rfd8 20. Re3 Bxe4 21. Rc1 Qxc1 22. Qxc1 Rxc1+ 23. Re1 Rxe1+ 24. Nxe1 +Bxd3 25. Nf3 Be4 26. Nxe5 Rd1+ 27. Kh2 Bd6 28. f4 h6 29. Bh4 g5 30. Bg3 +Bxe5 31. fxe5 Nh5 32. e6 Nxg3 33. e7 Nf1+ 34. Kg1 Bc6 35. Kf2 f6 36. +Ke2 Ra1 37. Kd3 Kf7 0-1 + +[Site "Edinburgh Congress"] +[Date "1994.04.??"] +[Round "38"] +[White "Milne, Jake"] +[Black "Gill, Andy"] +[Result "0-1"] +[ECO "B50"] + +1. e4 c5 2. Nf3 d6 3. Bc4 e6 4. d3 Nf6 5. a3 Nc6 6. Nc3 Be7 7. O-O O-O +8. Be3 b6 9. h3 Bb7 10. Ne2 d5 11. exd5 exd5 12. Ba2 Re8 13. c3 Qc7 +14. Bf4 Bd6 15. Bxd6 Qxd6 16. d4 cxd4 17. Nexd4 Nxd4 18. Nxd4 Rad8 19. +Qd2 Ba6 20. Qg5 Re5 21. Nf5 Rxf5 22. Qxf5 Bxf1 23. Rxf1 g6 24. Qf3 Kg7 +25. Rd1 Qe5 26. g3 a5 27. Kg2 h5 28. h4 Rd6 29. Bb1 d4 30. Qd3 Qd5+ +31. Qf3 Qb3 32. Qe2 Qd5+ 33. f3 Qe6 34. Qxe6 Rxe6 35. Be4 dxc3 36. bxc3 +Nxe4 37. fxe4 Rxe4 38. Rd6 Re2+ 39. Kf3 Rb2 40. Rd3 a4 41. Ke4 f5+ 42. +Kd5 Re2 43. c4 Re8 44. Kc6 Rc8+ 45. Kxb6 Rxc4 46. Kb5 Rg4 47. Rd7+ Kf6 +48. Ra7 f4 49. gxf4 Rxf4 50. Rxa4 Rxa4 51. Kxa4 g5 52. hxg5+ Kxg5 53. +Kb5 h4 54. a4 h3 55. a5 h2 56. a6 h1=Q 57. Kb6 Qb1+ 58. Ka7 Kf5 59. Ka8 +Qe4+ 60. Kb8 Qe8+ 61. Kb7 Qd7+ 62. Kb6 Qd8+ 63. Kb7 Qd5+ 64. Kb6 Qa8 +65. Ka5 Ke5 66. Kb6 Kd5 67. Ka5 Kc5 68. Ka4 Qxa6+ 69. Kb3 Qc4+ 70. Ka3 +Qb5 71. Ka2 Kc4 72. Ka1 Kc3 0-1 + +[Site "Edinburgh Congress"] +[Date "1994.04.??"] +[Round "39"] +[White "Gill, Andy"] +[Black "Bourke, John"] +[Result "0-1"] +[ECO "C54"] + +1. e4 e5 2. Nf3 Nc6 3. Bc4 Bc5 4. c3 Nf6 5. d4 exd4 6. cxd4 Bb4+ 7. Bd2 +Nxe4 8. Bxb4 Nxb4 9. Bxf7+ Kxf7 10. Qb3+ d5 11. Qxb4 Re8 12. O-O Kg8 +13. Nc3 b6 14. Rfe1 Bf5 15. Qb3 c6 16. Rac1 Qd6 17. Re3 Nxc3 18. Qxc3 +Rxe3 19. Qxe3 Rc8 20. Re1 h6 21. Qe7 Qxe7 22. Rxe7 a5 23. Rb7 b5 24. +Ne5 c5 25. Rxb5 cxd4 26. f4 Be4 27. Rxa5 Rc1+ 28. Kf2 Rc2+ 29. Kg3 +Rxg2+ 30. Kh3 Rxb2 31. Ra3 Rd2 32. Kg3 Rg2+ 33. Kh3 Rd2 34. Kg3 d3 35. +Nf3 Rb2 36. h4 d2 37. Nxd2 Rxd2 38. Kg4 Rd3 39. Rxd3 Bxd3 40. Kf3 Bc4 +41. a4 Kf7 42. Ke3 Ke6 43. Kd4 Kf5 44. a5 Kxf4 45. a6 Bxa6 46. Kxd5 Kg4 +47. Ke6 Kxh4 48. Kf7 g5 0-1 + +[Site "Edinburgh Congress"] +[Date "1994.04.??"] +[Round "40"] +[White "Gill, Andy"] +[Black "King, David"] +[Result "1-0"] +[ECO "C70"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 b5 5. Bb3 Bc5 6. O-O Nge7 7. c3 d6 +8. d4 exd4 9. cxd4 Ba7 10. Be3 Na5 11. Bc2 O-O 12. Nbd2 f5 13. Bg5 Qe8 +14. Re1 h6 15. Bxe7 Qxe7 16. exf5 Qf6 17. Be4 Bb7 18. Bxb7 Nxb7 19. +Qb3+ Kh8 20. Qd5 Rab8 21. Rac1 Bb6 22. g4 Nd8 23. Ne4 Qf7 24. Qxf7 Rxf7 +25. h3 {At this point the score sheet goes wrong. Black eventually +looses on time!} 1-0 + +[Site "Edinburgh Congress"] +[Date "1994.04.??"] +[Round "41"] +[White "Tait, C."] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "D20"] + +1. d4 d5 2. c4 dxc4 3. e4 c6 4. Bxc4 e6 ( 4... Nf6 5. Nc3 e5 6. Be3 exd4 +7. Bxd4 Bd6 8. f3 { Score: 0.22 } ) 5. Nf3 Bb4+ ( 5... Nf6 6. Qe2 Bb4 7. Bd2 +Qb6 8. Nc3 O-O 9. O-O Nbd7 { Score: 0.25 } ) 6. Bd2 Bxd2+ 7. Qxd2 ( 7. Nbxd2 +Nf6 8. O-O O-O 9. Rc1 Nbd7 10. Qe2 c5 11. Bd3 { Score: 0.41 } ) 7... Nf6 8. Nc3 +O-O ( 8... Nbd7 9. O-O O-O 10. Rad1 Qe7 11. Rfe1 e5 { Score: 0.38 } ) 9. O-O b6 +10. e5 ( 10. Rac1 Bb7 11. Rfd1 c5 12. dxc5 Qxd2 13. Rxd2 bxc5 { Score: 0.28 } ) +10... Nfd7 ( 10... Nd5 11. Rfd1 Ba6 12. Bxa6 Nxa6 13. Rac1 Nac7 14. Nxd5 cxd5 { +Score: 0.28 } ) 11. Rfd1 Ba6 ( 11... Bb7 12. Ne4 c5 13. d5 b5 14. Bxb5 Bxd5 +15. Qe3 Qe7 { Score: 0.34 } ) 12. Bb3 ( 12. Bxa6 Nxa6 13. Rac1 Qe7 14. Ne4 c5 +15. Qe2 Nb4 16. dxc5 { Score: 0.34 } ) 12... Re8 ( 12... h6 13. Rac1 Qe7 +14. Ne4 Rd8 15. Nd6 Nf6 16. Qe3 { Score: 0.31 } ) 13. Ne4 c5 ( 13... h6 14. Nd6 +Re7 15. Rac1 c5 16. Bc2 Nc6 17. Be4 Qc7 { Score: 0.44 } ) 14. Nd6 ( 14. dxc5 +Bb7 15. Qe3 Re7 16. Nd6 Bc6 17. Ne4 bxc5 18. Nxc5 { Score: 1.25 } ) 14... Rf8 ( +14... Re7 15. Nxf7 Rxf7 16. Bxe6 cxd4 17. Bd5 Nc6 18. Bxc6 { Score: 0.44 } ) +15. d5 b5 ( 15... Qe7 16. Nxf7 c4 17. dxe6 Nxe5 18. N3xe5 cxb3 19. Qd5 { Score: +1.06 } ) 16. dxe6 fxe6 ( 16... c4 17. Nxf7 Qb6 18. exd7 Nxd7 19. Qxd7 Rxf7 +20. Qd5 { Score: 3.75 } ) 17. Bxe6+ Kh8 18. Nf7+ ( 18. Qd5 Qe7 19. Nf7 Rxf7 +20. Bxf7 h6 { Score: 4.56 } ) 18... Rxf7 19. Bxf7 Nc6 ( 19... Bb7 20. Ng5 h6 +21. Bd5 { Score: 3.03 } ) 20. e6 ( 20. Qxd7 Nd4 21. Qg4 Qe7 22. Nxd4 Qxf7 +23. e6 Qf6 { Score: 5.84 } ) 20... Qe7 ( 20... Nf6 21. Rac1 c4 22. b3 Qxd2 +23. Rxd2 Rd8 24. Rxd8 Nxd8 { Score: 3.06 } ) 21. Qxd7 Bc8 ( 21... Bb7 22. Qxe7 +Nxe7 23. Rd7 Bxf3 24. gxf3 Nc6 25. e7 Nxe7 { Score: 7.41 } ) 22. Qxc6 ( +22. Qxe7 Bxe6 23. Qxe6 Nd4 24. Nxd4 cxd4 25. Rxd4 a6 { Score: 17.72 } ) +22... Rb8 ( 22... Bb7 23. Qd7 Qxd7 24. exd7 Rd8 25. Re1 g6 26. Re8 Kg7 { Score: +10.66 } ) 23. Qe8+ ( 23. Qxc5 Bxe6 24. Qxe7 Bxf7 25. Qxa7 Rf8 26. Qxf7 Rc8 { +Score: 18.22 } ) 23... Qxe8 24. Bxe8 Bb7 ( 24... Bxe6 25. Bd7 Bg8 26. Ne5 g6 +27. Rac1 c4 28. a4 bxa4 { Score: 7.88 } ) 25. Bf7 ( 25. Bxb5 Bxf3 26. gxf3 Kg8 +27. e7 Kf7 28. Rd8 Kxe7 29. Rxb8 { Score: 12.03 } ) 25... Bc6 ( 25... g5 26. e7 +Kg7 27. Rd8 Bc6 28. Rxb8 Kxf7 29. Ne5 Kxe7 { Score: 12.03 } ) 26. Rd2 ( 26. Ne5 +Bxg2 27. e7 g6 28. Kxg2 { Score: 15.75 } ) 1-0 + +[Site "Dunfermline C vs Alloa"] +[Date "1994.04.??"] +[Round "42"] +[White "Comrie, J."] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "B50"] + +1. e4 c5 2. Nf3 d6 3. Bc4 e6 4. Nc3 Be7 5. d4 cxd4 6. Qxd4 Nf6 7. e5 +dxe5 8. Qxd8+ Bxd8 9. Nxe5 O-O 10. O-O Nbd7 11. Nxd7 Bxd7 12. Be3 a6 +13. a4 Ba5 14. Ne2 Bc6 15. Nd4 Nd5 16. Nxc6 bxc6 17. Bxd5 cxd5 18. c3 +Rab8 19. b4 Bc7 20. Rfd1 Rfd8 21. Rac1 Bb6 22. Kf1 Bxe3 23. fxe3 f5 +24. Rc2 g5 25. Kf2 Kf7 26. Kf3 Rdc8 27. g4 Rxb4 28. gxf5 Kf6 29. fxe6 +Kxe6 30. Rd4 Rxd4 31. exd4 Rf8+ 32. Kg4 h6 33. Re2+ Kd6 34. Rb2 Rc8 +35. Kh5 Rxc3 36. Rb6+ Rc6 37. Rxc6+ Kxc6 38. Kxh6 g4 39. Kg5 Kd6 40. +Kxg4 Ke6 41. Kg5 Ke7 42. h4 Kf7 43. h5 Kg7 44. Kf5 1-0 + +[Site "Dunfermline Club Championship"] +[Date "1994.04.??"] +[Round "43"] +[White "Gill, Andy"] +[Black "Hunter, Scott"] +[Result "1-0"] +[ECO "C65"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 Nf6 4. d3 Bc5 5. O-O O-O 6. Re1 d5 7. Be3 +Bxe3 8. exd5 Qxd5 9. Bxc6 Qxc6 10. Rxe3 e4 11. dxe4 Nxe4 12. Nc3 Nxc3 +13. Rxc3 Qd6 14. Qxd6 cxd6 15. Rd1 Re8 16. Rxd6 g5 17. g4 Bxg4 18. Nxg5 +Re1+ 19. Kg2 Rae8 20. Rg3 f5 21. h3 Be2 22. Nf3+ Kf7 23. Nxe1 f4 24. +Rf3 Bxf3+ 25. Nxf3 Re2 26. Rd7+ Kf8 27. Rxb7 Rxc2 28. Rxa7 Rxb2 29. Ra4 +Kf7 30. Rxf4+ Kg6 31. a4 h5 32. h4 Ra2 33. Kg3 Ra3 34. Rc4 Rd3 35. Kf4 +Rd5 36. Ne5+ Kf6 37. Re4 Ra5 38. Nd7+ Kg6 39. f3 Rf5+ 40. Ke3 1-0 + +[Site "Under 1500 Final"] +[Date "1994.05.??"] +[Round "44"] +[White "Hepburn, James"] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "B20"] + +1. e4 c5 2. Bc4 d6 3. d3 e6 4. Nc3 Nf6 5. Nf3 a6 6. Bd2 Nc6 7. O-O Be7 +8. Re1 O-O 9. a3 e5 10. h3 b5 11. Bb3 Bb7 12. Nd5 Nxd5 13. Bxd5 Qd7 +14. c3 Na5 15. b4 Bxd5 16. exd5 Nb7 17. Re4 f5 18. Re2 cxb4 19. axb4 +Bf6 20. Qb3 a5 21. Rae1 axb4 22. cxb4 Rfe8 23. Bg5 Bxg5 24. Nxg5 Nd8 +25. f4 Nf7 26. Nxf7 Qxf7 27. fxe5 dxe5 28. Rxe5 Rxe5 29. Rxe5 Ra1+ 30. +Kh2 g5 31. d4 Kg7 32. Qd3 Qd7 33. Rxf5 Qd6+ 34. Re5 Qxb4 35. Rxg5+ Kf7 +36. Qxh7+ Kf6 37. Qh6+ Ke7 38. Rg7+ Kd8 39. Qh8+ 1-0 + + +[Site "East of Scotland Championship"] +[Date "1994.05.??"] +[Round "45"] +[White "Heron, D."] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "D02"] +[WhiteElo "1790"] + +1. Nf3 Nc6 2. d4 d5 3. Bf4 Bf5 4. e3 a6 5. c4 e6 6. Nc3 Nf6 7. a3 Qd7 +8. b4 Bd6 9. Bxd6 Qxd6 10. Be2 O-O 11. O-O Ne4 12. Nxe4 Bxe4 13. Nd2 +Bg6 14. Qb3 Ne7 15. c5 Qd7 16. a4 c6 17. b5 Nf5 18. Ra3 Rfe8 19. Qb2 +Kh8 20. Rb3 Nh6 21. bxc6 bxc6 22. Rb7 Qc8 23. Nf3 Rb8 24. Bxa6 Rxb7 +25. Qxb7 Qxb7 26. Bxb7 f6 27. Bxc6 Rb8 28. Bb5 Bc2 29. Rc1 Be4 30. Nd2 +Bg6 31. Nb1 Ng8 32. Nc3 Ne7 33. a5 Nc8 34. Bd7 Bf5 35. Nxd5 exd5 36. +Bxf5 Ne7 37. Bd3 Nc6 38. Rb1 Rxb1+ 39. Bxb1 Nxa5 40. Ba2 1-0 + +[Site "East of Scotland Chalengers"] +[Date "1994.05.??"] +[Round "46"] +[White "Gill, Andy"] +[Black "Falconer, W."] +[Result "1/2-1/2"] +[ECO "A15"] + +1. c4 Nf6 2. d3 e6 3. Nf3 d5 4. cxd5 Nxd5 5. a3 Bd6 6. e3 Nc6 7. Nbd2 +O-O 8. Nc4 Bd7 9. Be2 b5 10. Nxd6 cxd6 11. O-O Rc8 12. Bd2 Qb6 13. Qb3 +Ne5 14. Rac1 a6 15. Rc2 Rxc2 16. Qxc2 Rc8 17. Qb1 Nxf3+ 18. Bxf3 Bc6 +19. Rc1 Qd8 20. Bxd5 Bxd5 21. Ba5 Qd7 22. Rxc8+ Qxc8 23. Bb4 Qc6 24. f3 +Bb3 25. Qe1 Qc2 26. Qc3 Qxc3 27. Bxc3 d5 28. Kf2 f6 29. d4 1/2-1/2 + + + +[Site "East of Scotland Chalengers"] +[Date "1994.05.??"] +[Round "47"] +[White "Gill, Andy"] +[Black "Pearson, Walter"] +[Result "0-1"] +[ECO "A20"] +[BlackElo "1650"] + +1. c4 e5 2. d3 Ne7 3. Nf3 d6 4. e3 g6 5. Be2 Bg7 6. O-O O-O 7. Nbd2 Nd7 +8. Nb3 b6 9. d4 exd4 10. Nfxd4 Bb7 0-1 + +[Site "East of Scotland Chalengers"] +[Date "1994.05.??"] +[Round "48"] +[White "Heatlie, Douglas"] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "D61"] +[WhiteElo "1650"] + +1. d4 e6 2. c4 d5 3. Nc3 Nf6 4. Bg5 Be7 5. e3 Nbd7 6. Qc2 O-O 7. Nf3 +Re8 8. h4 Nb6 9. b3 dxc4 10. bxc4 Bd7 11. Bd3 g6 12. Bxf6 Bxf6 13. h5 +Bxd4 14. exd4 Qf6 15. hxg6 fxg6 16. Ne4 Qg7 17. Nc5 Bc6 18. Ne5 Nd5 +19. cxd5 exd5 20. O-O-O Rxe5 21. dxe5 Qxe5 22. g3 Qg5+ 23. Qd2 Qe5 24. +Nb3 Ba4 25. Qh6 Qc3+ 26. Bc2 Bxb3 27. Qxh7+ Kf8 28. Qh8+ 1-0 + +[Site "Scottish Chess Minor"] +[Date "1994.07.??"] +[Round "49"] +[White "Mill, Graham"] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "B50"] + +1. e4 c5 2. Nf3 d6 3. Bc4 { This is an unusual way of opening, but is common at +the Minor level. } 3... e6 4. Nc3 Nf6 5. d3 ( 5. O-O ) 5... Nc6 ( 5... d5 +6. Bb3 dxe4 7. Nxe4 Nxe4 8. dxe4 Qxd1+ 9. Kxd1 { = } ) 6. Bf4 ( 6. O-O Be7 ) +6... a6 7. O-O Be7 ( 7... Na5 8. Bb3 Nxb3 9. axb3 Be7 10. Re1 O-O 11. Qd2 { +<sab> } ) 8. Re1 O-O { I often find this sort of position when playing the +sicilian, where white has the e file, pushes his pawn, and gains a winning +advantage. } 9. e5 dxe5 10. Nxe5 Bd7 ( 10... Nxe5 ) 11. Ne4 ( 11. Bb3 { <saw> } +) 11... Nxe5 12. Bxe5 Bc6 { } ( 12... Nxe4 13. dxe4 b5 14. Bb3 Bc6 15. Qh5 +Re8 { = } ) 13. Bxf6 ( 13. Qf3 Nxe4 14. dxe4 b6 15. Rad1 Qe8 { <saw> } ) +13... Bxe4 $4 ( 13... Bxf6 14. Nxf6+ Qxf6 15. c3 b6 16. Qe2 { <sab> } ) +14. Bxe7 Qxe7 15. Rxe4 Rac8 16. f4 ( 16. a4 Qf6 17. c3 Rfd8 18. Qe2 h6 19. Re1 +{ <waw> } ) 16... b5 17. Bb3 Rc6 ( 17... a5 { and I might be able to stir up a +queenside pawn charge. } ) 18. c4 ( 18. a4 { striking at the ambushing pawns. } +) 18... Rd8 ( 18... Rd6 19. cxb5 axb5 20. a4 c4 ) 19. Qe2 ( 19. cxb5 axb5 +20. a4 bxa4 21. Raxa4 Rcd6 22. d4 cxd4 23. Rexd4 ) 19... Rd4 ( 19... b4 ) +20. Rxd4 ( 20. cxb5 axb5 21. a4 bxa4 22. Rxa4 Rd8 23. d4 cxd4 24. Rexd4 { All +variations just win for white. } ) 20... cxd4 21. Re1 ( 21. cxb5 ) 21... Rc5 +22. Qe4 ( 22. Qf2 bxc4 23. Bxc4 Qd6 { Blacks score is rapidly going down. } ) +22... Rh5 ( 22... Qd7 23. Qa8+ Qc8 24. Qxc8+ Rxc8 25. g3 bxc4 26. dxc4 { a +passed pawn for white! Blacks passed pawn will not live long. } ) 23. g4 ( +23. f5 Rh6 24. cxb5 axb5 { Totally won for white. } ) 23... Rh4 24. Qa8+ Qf8 +25. Qxf8+ Kxf8 { } 26. h3 $2 ( 26. Bd1 Rh3 27. Be2 Ke7 28. Kg2 Re3 29. h3 Kd6 +{ Just a piece up. } ) 26... Rxh3 27. Bc2 Rg3+ 28. Kf2 Rxg4 29. Kf3 h5 ( +29... Rh4 30. Kg3 Rh6 31. Re4 Rg6+ 32. Kh3 Rh6+ 33. Kg2 { And black has drawing +chances. } ) 30. Re4 ( 30. Re5 g6 31. Re4 Rh4 32. Rxd4 g5 { Black is only a +pawn or so down. } ) 30... Ke7 31. Rxd4 ( 31. cxb5 axb5 32. Re5 g6 33. Rxb5 Kd6 +34. Ke4 ) 31... e5 ( 31... g5 32. cxb5 axb5 33. a4 e5 34. Re4 Rxf4+ 35. Rxf4 +exf4 { Blacks is a `pawn` down, with 3 connected passed pawns. Not so bad, but +still winning for white. } ) 32. Re4 Rxf4+ 33. Rxf4 exf4 34. Kxf4 Kf6 35. c5 +Ke7 36. b4 f6 37. d4 g5+ 38. Kg3 h4+ 39. Kg4 Ke6 40. c6 Kd6 41. d5 Kc7 42. Be4 +Kd6 43. Bg2 Kc7 44. Bh3 Kd6 45. Kf5 Kc7 46. Kxf6 Kb6 47. Kxg5 { I finally +resigned here. } 1-0 + +[Site "Scottish Chess Minor"] +[Date "1994.07.??"] +[Round "50"] +[White "Gill, Andy"] +[Black "McMonigle, A."] +[Result "1-0"] +[ECO "C67"] + +1. e4 e5 2. Nf3 Nc6 3. Bb5 Nf6 4. O-O Nxe4 { } 5. Re1 ( 5. d4 Be7 6. dxe5 O-O +7. Be3 a6 { and white has the edge. } ) 5... d5 ( 5... Nd6 6. Bxc6 dxc6 7. Nxe5 +Be6 8. Nc3 Be7 9. Kh1 { <saw> } ) 6. Nxe5 ( 6. d3 { is a killer move. } ) +6... Qf6 7. Nf3 ( 7. Nxc6 bxc6 8. Qf3 Qg6 9. Bd3 Bf5 10. Bxe4 { <saw> } ) +7... Be7 8. d3 $1 Nd6 { } ( 8... Nxf2 9. Kxf2 Bg4 10. Nbd2 O-O 11. Bxc6 bxc6 +{ <aw> } ) 9. Bxc6+ ( 9. Bg5 Qxb2 10. Bxc6+ bxc6 11. Rxe7+ Kf8 12. Nbd2 h6 { +White is a couple of pawns up, but the tactices are hairy! } ) 9... bxc6 10. c3 +O-O { } ( 10... h6 11. Be3 Nf5 12. Bf4 Rb8 13. Be5 Qg6 { <saw> } ) 11. Bg5 +Qg6 ( 11... Qxf3 12. Qxf3 Bxg5 13. b3 Bb7 14. Qg3 Bf6 { Is blacks best line. } +) 12. Bxe7 Re8 13. Bxd6 Rxe1+ 14. Qxe1 Qxd6 15. Qe8+ Qf8 16. Qxf8+ ( 16. Qxc6 +Rb8 17. Qxc7 Rxb2 18. Qxa7 Bf5 19. Qd4 Qb8 20. Nfd2 { <waw> The proper +continuation, and well winning for white. } ) 16... Kxf8 17. Ne5 ( 17. h3 { +Still a <waw> } ) 17... Bf5 ( 17... c5 18. h3 f6 19. Nf3 { and white moving the +knight was a waste of two tempi. } 19... Rb8 20. b3 Bf5 { <waw> } ) 18. d4 ( +18. Nd2 Re8 19. Ndf3 c5 20. g4 f6 21. Kg2 fxe5 22. gxf5 { <waw> } ) 18... Re8 +19. Nd2 Re6 { } 20. Re1 ( 20. g4 Bxg4 21. Nxg4 Rg6 22. h3 h5 23. f3 hxg4 +24. hxg4 { <waw> what a cou. } ) 20... f6 21. Nd7+ Ke7 22. Rxe6+ Bxe6 23. Nc5 +Bf5 24. f3 ( 24. h3 h6 25. Kh2 Kd6 26. Nb7+ Ke7 27. g4 Bd3 { <waw> } ) +24... Bc8 25. g4 ( 25. Kf2 Kd6 26. f4 g6 27. Kf3 h6 28. g3 f5 ) 25... Kf7 +26. Kg2 ( 26. Kf2 Ke7 27. Ke3 Kd6 28. Kd3 h6 29. c4 dxc4+ 30. Nxc4+ { <waw> +with a plan } ) 26... f5 27. Kg3 Kg6 28. Nd3 ( 28. gxf5+ Bxf5 29. Na6 Kf6 +30. h3 h6 31. Nxc7 { Attacking the weak backwards pawn. } ) 28... fxg4 { } ( +28... Kf6 29. gxf5 Kxf5 30. Ne5 Bb7 { Score: 3.19 } ) 29. Ne5+ Kf6 30. Nxc6 a6 +31. fxg4 g5 32. h4 ( 32. Nb3 Bb7 33. Nb8 h6 34. Nc5 Bc8 35. b4 Kg6 36. Nbxa6 { +Successfully ganing up on the `a` pawn. } ) 32... gxh4+ 33. Kxh4 Bd7 34. g5+ ( +34. Nb4 c6 35. Nxa6 h6 36. Kh5 Kg7 { Totally won. } ) 34... Kg7 35. Ne5 ( +35. Nb4 c6 36. Nxa6 h6 37. Nc5 Bf5 38. a4 Kg6 39. gxh6 { And either the 'a' or +'b' pawn will queen. } ) 35... Be8 36. Nb3 Bg6 { At this point black resigned. +} 1-0 + +[Site "Scottish Chess Minor"] +[Date "1994.07.??"] +[Round "51"] +[White "Swanson, Brian"] +[Black "Gill, Andy"] +[Result "1-0"] +[ECO "B86"] +1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 a6 6. Bc4 e6 ( 6... e5 7. Nf3 +Qc7 8. Bd5 Bg4 9. O-O Nxd5 10. Nxd5 { Is another line of the Sicilian. } ) +7. Bg5 ( 7. O-O Qc7 8. Qd3 e5 9. Nf3 Bg4 10. Bg5 { <saw>,0.25 } ) 7... Be7 +8. f4 b5 { } ( 8... d5 9. Bxf6 Bxf6 10. exd5 Qc7 11. Be2 Qxf4 { <ab> } ) +9. Bd3 $2 ( 9. Bb3 h6 10. Bxf6 Bxf6 11. O-O Bxd4+ 12. Qxd4 { <sab> } ) 9... Bb7 +10. b4 ( 10. Qf3 Qb6 11. Nde2 d5 { = } ) 10... Nc6 11. Nf3 $2 ( 11. Nxc6 Bxc6 +12. O-O d5 13. exd5 Nxd5 14. Bxe7 Qxe7 { <sab> } ) 11... Nxb4 12. Qe2 O-O +13. O-O ( 13. a3 Qc7 14. Qd2 { <ab>,by a pawn or so. } ) 13... Rc8 ( 13... Qc7 +14. Qd2 d5 15. Bxf6 Bxf6 { <ab> } ) 14. Nd1 d5 15. exd5 ( 15. e5 Ne4 16. Bxe7 +Qxe7 17. Bxe4 dxe4 18. Nd4 ) 15... Bxd5 16. Ne3 { } 16... Bc5 ( 16... Bxa2 +17. Rad1 Nxd3 18. cxd3 Nd5 { <wab>,2+ pawns up, but getting a bit tactical. } ) +17. Kh1 Bxe3 18. Qxe3 Nxc2 19. Bxc2 Rxc2 20. a4 Ra2 ( 20... h6 { <wab>, just +winning. } ) 21. Rxa2 Bxa2 22. axb5 ( 22. Ra1 Bd5 23. axb5 axb5 24. Rb1 Ng4 { +<wab>, to or so pawns up. } ) 22... Bc4 ( 22... axb5 23. Ra1 Bd5 24. Ra7 h6 { +<ab>, even with the rook on blacks 2nd. This rook should be able to get to 'b' +pawn, though. } ) 23. Rc1 Bxb5 24. Ne5 { } 24... Nd5 $2 { A bit wild. } ( +24... h6 25. Bxf6 Qxf6 26. Rc7 a5 27. Qc5 Be2 28. Qxa5 Qxf4 { <wab>, almost +three pawns up, and threating the forced queen exchage on f1. } ) 25. Qg3 { +Alarms bells !!!, the bishop is going to h6. Remember. } 25... f6 { I though I +was going to win a piece for a pawn. } 26. Bh6 g6 $4 ( 26... Qe7 27. Nc6 Qc7 +28. Rc2 Ba4 29. Rc4 Nb6 { Black still leads (two pawns up), but the tactics are +hairy. } ) 27. Bxf8 $2 ( 27. Nxg6 Kf7 28. Nxf8 Ke8 29. Nxe6 Qd7 30. Re1 { +<waw>,5.47 } ) 27... fxe5 ( 27... Kxf8 28. Qh4 a5 29. g3 a4 { <sab>, but +critically depending on the weak a pawn. } ) 28. Bh6 exf4 29. Qe1 { } ( +29. Bxf4 Nxf4 30. Qxf4 a5 31. h3 g5 32. Qe5 { <aw> } ) 29... g5 $4 { My major +blunder. } ( 29... Kf7 30. g3 f3 31. Qf2 Qf6 { <ab>, but tricky. } ) 30. Qxe6+ +Kh8 31. Rc8 { Mate is in a couple of moves. } 1-0 + +[Site "Scottish Chess Minor"] +[Date "1994.07.??"] +[Round "52"] +[White "Gill, Andy"] +[Black "Thomson, Brian"] +[Result "1-0"] +[ECO "B54"] + +1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nc6 5. Bb5 Bd7 6. Nc3 ( 6. Nxc6 { Score: +0.06 } ) 6... Nf6 ( 6... Nxd4 7. Qxd4 Bxb5 8. Nxb5 Qa5 9. Nc3 e5 10. Qd5 Qc7 { +Score: -0.03 } ) 7. Bg5 h6 ( 7... Nxd4 8. Bxd7 Nxd7 9. Qxd4 e5 10. Qd2 Be7 +11. Be3 { Score: -0.03 } ) 8. Bh4 ( 8. Bxf6 exf6 9. f4 Nxd4 10. Bxd7 Qxd7 +11. Qxd4 Be7 { Score: 0.16 } ) 8... Qb6 ( 8... g5 9. Bg3 Nxd4 10. Qxd4 Bg7 +11. O-O O-O { Score: -0.22 } ) 9. Nxc6 ( 9. Bxf6 gxf6 10. Bxc6 bxc6 11. Na4 Qa5 +12. c3 Bg7 { Score: 0.06 } ) 9... bxc6 10. Bxf6 ( 10. Bd3 Qxb2 11. Bxf6 exf6 +12. Na4 Qd4 13. c3 { Score: -1.03 } ) 10... exf6 11. Ba4 ( 11. Bd3 Qxb2 12. Na4 +Qa3 13. c3 Be6 14. Qc2 O-O-O { Score: -1.31 } ) 11... Qc7 ( 11... Qxb2 12. Kd2 +Qb6 13. Qf3 Be6 14. e5 Qd4 { Score: -1.44 } ) 12. O-O Be7 13. Re1 ( 13. Rb1 O-O +14. Qd3 Be6 15. f4 f5 { Score: -0.09 } ) 13... O-O 14. Qd4 ( 14. Bb3 { Score: +-0.09 } ) 14... Be6 ( 14... Rab8 15. b3 Be6 16. Rad1 Rb6 17. f4 Re8 { Score: +-0.16 } ) 15. Nd1 ( 15. f4 Rab8 16. Bb3 f5 17. e5 Bxb3 18. axb3 { Score: -0.16 +} ) 15... Qa5 ( 15... Rab8 16. Qc3 Rb6 17. Ne3 Qb7 18. f4 { Score: -0.09 } ) +16. Nc3 Qc7 ( 16... Rab8 17. b3 Qc7 18. Rad1 Rfe8 19. f4 Rb6 { Score: -0.13 } ) +17. Ne2 ( 17. Nd1 { Score: 0.00 } ) 17... Rab8 ( 17... Rfb8 18. Nf4 Rb6 +19. Nxe6 fxe6 20. Bb3 d5 21. exd5 cxd5 { Score: -0.06 } ) 18. b3 ( 18. Nf4 { +Score: -0.13 } ) 18... a5 ( 18... f5 19. Rad1 fxe4 20. Qxe4 Bd5 21. Qd4 { +Score: -0.41 } ) 19. Nf4 ( 19. Qc3 c5 20. Nd4 Rb7 21. Nc6 Ra8 22. Rad1 { Score: +0.06 } ) 19... Bd7 ( 19... Rfc8 20. c4 Rd8 21. f3 Rd7 { Score: 0.00 } ) 20. Qd2 +( 20. Qc3 Rb7 21. a3 Re8 22. Nd3 Reb8 23. f4 { Score: -0.09 } ) 20... g5 ( +20... Rfe8 { Score: -0.09 } ) 21. Nh5 ( 21. Ne2 Rb7 22. Nd4 Re8 23. Qc3 c5 +24. Bxd7 Qxd7 { Score: 0.13 } ) 21... Qb6 ( 21... Bg4 22. Ng3 Rfe8 23. c4 Bf8 +24. f3 Be6 { Score: 0.13 } ) 22. Qc3 Qd8 23. Rad1 ( 23. a3 Rc8 24. Ng3 Re8 +25. Rad1 Bg4 26. Bxc6 Bxd1 27. Rxd1 { Score: 0.31 } ) 23... Bg4 24. Ng3 Bxd1 +25. Rxd1 c5 26. Nh5 ( 26. Nf5 h5 27. a3 Rb7 28. Qd3 Rb6 29. Qd2 { Score: -0.06 +} ) 26... Kh8 ( 26... Rb4 27. Ng3 Qa8 28. a3 Rb6 { Score: -0.75 } ) 27. Rd3 ( +27. Ng3 Rg8 28. Nf5 Bf8 29. Qd2 Qc7 { Score: -0.34 } ) 27... Rg8 ( 27... Rb4 +28. Ng3 c4 29. Rd5 cxb3 30. cxb3 Qb6 31. Bc6 { Score: -0.88 } ) 28. Rf3 ( +28. Ng3 Rg6 29. Nf5 Rb4 30. Bc6 Qc7 31. a3 Rb6 { Score: -0.81 } ) 28... Rg6 ( +28... d5 29. exd5 Qxd5 30. Re3 Qd1 31. Re1 Qd8 32. Ng3 { Score: -1.00 } ) +29. Bc6 ( 29. Rd3 Rb4 30. f3 c4 31. Re3 cxb3 32. cxb3 { Score: -0.97 } ) +29... Kg8 30. Bd5 ( 30. Ng3 Qc7 31. Nf5 Bf8 32. Bd5 Bg7 33. Rd3 Bh8 { Score: +-1.00 } ) 30... a4 31. Qc4 Qe8 32. Qd3 ( 32. Qc3 axb3 33. cxb3 Qd8 34. a4 Rb6 +35. Rd3 { Score: -0.78 } ) 32... Rb4 ( 32... Qb5 33. Ng3 axb3 34. Nf5 Bf8 { +Score: -0.97 } ) 33. e5 ( 33. c3 Rb6 34. e5 Kf8 35. Nxf6 { Score: -0.25 } ) +33... dxe5 ( 33... Kh8 34. c3 Rh4 35. exf6 Bd8 36. Re3 Qd7 { Score: -0.22 } ) +34. Qxg6+ 1-0 + +[Site "Scottish Chess Minor"] +[Date "1994.07.??"] +[Round "53"] +[White "Navmann, M."] +[Black "Gill, Andy"] +[Result "1/2-1/2"] +[ECO "B50"] + +1. e4 c5 2. Nf3 d6 3. Bc4 e6 ( 3... Nc6 { Score: 0.00 } ) 4. Nc3 a6 ( 4... Nf6 +5. d3 d5 6. Bb3 dxe4 7. Nxe4 Nxe4 8. dxe4 Qxd1 { Score: 0.00 } ) 5. a4 ( 5. d3 +Nc6 6. Bf4 Na5 7. e5 d5 8. Bg5 Ne7 { Score: 0.09 } ) 5... Nf6 6. d3 ( 6. d4 { +Score: 0.06 } ) 6... Be7 ( 6... d5 7. Ba2 dxe4 8. Nxe4 Nxe4 9. dxe4 Qxd1 +10. Kxd1 { Score: 0.09 } ) 7. b3 ( 7. Bg5 h6 8. Bh4 d5 9. exd5 Nxd5 10. Nxd5 +exd5 { Score: 0.16 } ) 7... O-O ( 7... d5 8. exd5 exd5 9. Nxd5 Nxd5 10. O-O O-O +{ Score: -1.59 } ) 8. d4 ( 8. Qe2 Nc6 9. O-O d5 10. exd5 exd5 { Score: 0.06 } ) +8... cxd4 ( 8... d5 9. exd5 exd5 10. Bd3 b6 11. O-O Nc6 { Score: -0.09 } ) +9. Nxd4 ( 9. Qxd4 { Score: -0.09 } ) 9... d5 ( 9... Qa5 10. Qd2 b5 11. Bd3 e5 +12. Nf3 Bg4 { Score: -0.16 } ) 10. exd5 exd5 11. Bd3 Re8 ( 11... Nc6 12. Nce2 +Nxd4 13. Nxd4 Bb4 14. Bd2 Qa5 15. Ne2 Bxd2 { Score: -0.22 } ) 12. O-O Bb4 ( +12... Nc6 13. Nce2 Bg4 14. f3 Bc5 15. c3 { Score: -0.03 } ) 13. Bd2 ( 13. Nce2 +Nc6 14. Bb2 Bg4 15. f3 Nxd4 16. Nxd4 { Score: 0.00 } ) 13... Qa5 ( 13... b6 { +Score: -0.09 } ) 14. Nb1 Kh8 ( 14... Nc6 15. Bxb4 Nxb4 16. Re1 Bg4 17. Be2 Rad8 +{ Score: -0.09 } ) 15. Bxb4 Qxb4 16. c3 Qe7 ( 16... Qc5 17. Re1 Rxe1 18. Qxe1 +Nc6 19. Nf5 b6 { Score: 0.09 } ) 17. Nd2 ( 17. Ra2 Qc7 18. Re2 Rxe2 19. Qxe2 +Nc6 20. Rd1 Nxd4 21. cxd4 { Score: 0.09 } ) 17... Bg4 ( 17... Qc5 18. Qc2 Nc6 +19. N2f3 Nxd4 20. Nxd4 Ne4 { Score: 0.00 } ) 18. Qc1 ( 18. N2f3 Qc7 19. Qd2 Nc6 +20. Rfe1 Rad8 21. Rxe8 Rxe8 { Score: 0.00 } ) 18... Nc6 19. Nxc6 ( 19. Re1 Ne5 +20. Qc2 Qc7 21. c4 Nxd3 22. Qxd3 { Score: 0.03 } ) 19... bxc6 20. Re1 Qd7 ( +20... Qb7 21. Qc2 Rad8 22. h3 Bh5 23. c4 Rxe1 24. Rxe1 { Score: 0.03 } ) +21. Rxe8+ Qxe8 22. Qe1 ( 22. Qc2 c5 23. h3 Bh5 24. b4 c4 25. Bf5 { Score: 0.03 +} ) 22... a5 ( 22... Qd7 { Score: 0.09 } ) 23. h3 Bd7 ( 23... Bh5 24. g4 Bg6 +25. Bxg6 hxg6 26. Rd1 Rd8 27. Qxe8 Nxe8 { Score: 0.19 } ) 24. Nf3 ( 24. Rd1 Rb8 +25. c4 h6 26. Qxe8 Rxe8 27. cxd5 cxd5 { Score: 0.16 } ) 24... Qxe1+ ( 24... Rb8 +25. Bc2 c5 26. c4 Qxe1 27. Rxe1 d4 { Score: 0.16 } ) 25. Rxe1 Re8 ( 25... Rb8 +26. Bc2 g6 27. Re7 Kg7 28. Ne5 Be8 { Score: 0.44 } ) 26. Rxe8+ ( 26. Ne5 { +Score: 0.53 } ) 26... Bxe8 27. c4 ( 27. g3 { Score: 0.28 } ) 27... h6 ( +27... g6 28. g3 Kg7 29. Kg2 h6 30. Ne5 d4 31. f4 c5 { Score: 0.13 } ) 28. Kf1 ( +28. g3 g6 29. Ne5 Kg7 30. Kg2 d4 31. Kf3 c5 { Score: 0.25 } ) 28... g6 29. Ke2 +( 29. cxd5 { Score: 0.31 } ) 29... Kg7 30. Ke3 ( 30. Ne5 { Score: 0.31 } ) +30... Nd7 ( 30... c5 31. Ne5 d4 32. Kd2 Bd7 33. Nxd7 Nxd7 34. Be4 Ne5 { Score: +0.09 } ) 31. Kd4 ( 31. cxd5 cxd5 32. Kd4 Nf6 33. Ne5 Kf8 34. g3 Kg7 35. f4 { +Score: 0.59 } ) 31... dxc4 32. Bxc4 ( 32. Kxc4 f5 33. Kc3 Bf7 34. g3 Nc5 +35. Bc2 Bd5 { Score: 0.16 } ) 32... Kf6 ( 32... f5 33. Ke3 Bf7 34. Bxf7 Kxf7 +35. Kf4 Ke6 36. Nd4 Kd5 { Score: -0.03 } ) 33. Bd3 ( 33. Nd2 Nb6 34. Ne4 Ke7 +35. Bd3 f5 36. Nc5 Bf7 { Score: 0.22 } ) 33... Ke6 34. Kc4 ( 34. Ke3 Nb6 +35. Nd4 Kd6 36. Kf3 Ke5 37. Ne2 f5 { Score: 0.09 } ) 34... f6 ( 34... f5 35. g4 +fxg4 36. hxg4 Ne5 37. Nxe5 Kxe5 38. Kc3 { Score: -0.13 } ) 1/2-1/2 + +[Site "Grangemouth Congress"] +[Date "1994.09.??"] +[Round "54"] +[White "Gill, Andy"] +[Black "McKay, Stewart"] +[Result "1-0"] +[ECO "B01"] +1. e4 d5 2. exd5 Nf6 3. Bb5+ Bd7 4. Bxd7+ Qxd7 5. Nf3 Nxd5 +6. O-O Nc6 7. Re1 e6 8. d3 g6 9. Bg5 Bg7 10. c3 Nf6 11. d4 h6 12. Bxf6 Bxf6 +13. d5 Rd8 14. Qd2 Qxd5 15. Qf4 Bg7 16. Qxc7 O-O 17. Qf4 g5 18. Qd2 Qf5 19. Qe3 +Rd3 20. Qe4 Qxe4 21. Rxe4 Rd1+ 22. Re1 Rfd8 23. h3 Ne5 24. Na3 Nxf3+ 25. gxf3 +R1d3 26. Kg2 a6 27. Rac1 b5 28. Re2 Bf8 29. Nc2 Bc5 30. Ne1 Rd2 31. Rxd2 Rxd2 +32. Rc2 Rd1 33. Kf1 Be7 34. a3 Bf6 35. Ke2 Rd5 36. Nd3 Rd8 37. Kd2 Rc8 38. Ke3 +Bg7 39. f4 Bf6 40. Ne5 Rc5 41. Nd7 gxf4+ 42. Kxf4 Bg5+ 43. Ke4 f5+ 44. Kf3 Rd5 +45. Nb8 Rd6 46. c4 bxc4 47. Rxc4 Rb6 48. Rb4 Rd6 49. Ra4 Rb6 50. Nxa6 Rxb2 +51. Nc7 Rb3+ 52. Kg2 Be7 53. Nxe6 Rxa3 54. Rxa3 Bxa3 55. Kg3 Kf7 56. Nd4 Kg6 +57. Kf4 Kh5 58. Nxf5 { And White won by queening the f pawn. } 1-0 + +[Site "Grangemouth Minor Congress"] +[Date "1994.09.??"] +[Round "55"] +[White "Shaughan, Harward"] +[Black "Gill, Andy"] +[Result "0-1"] +[ECO "D02"] +1. d4 e6 2. Bf4 d5 3. Nf3 Nf6 4. Nbd2 c5 5. e3 a6 6. c4 Nc6 7. Ne5 cxd4 8. Nxc6 +bxc6 9. exd4 Qb6 10. cxd5 cxd5 11. Qc2 Bd7 12. Be3 Bb4 13. a3 Bxd2+ 14. Qxd2 +O-O 15. Bd3 Rfc8 16. O-O Bb5 17. b3 Rc6 18. f3 Rac8 19. Rfc1 Bxd3 20. Rxc6 Rxc6 +21. Qxd3 Qc7 22. Bd2 h6 23. Rb1 Nh5 24. b4 Nf4 25. Bxf4 Qxf4 26. b5 Rc1+ +27. Rxc1 Qxc1+ 28. Kf2 Qb2+ 29. Kg3 Qxb5 30. Qxb5 axb5 31. Kf2 Kf8 32. Ke3 Ke7 +33. Kd3 Kd6 34. f4 f6 35. h4 e5 36. dxe5+ fxe5 37. f5 e4+ 38. Kd4 Ke7 39. g4 +Kf6 40. Ke3 g6 41. g5+ hxg5 42. hxg5+ Kxf5 0-1 + +[Site "Grangemouth Minor Congress"] +[Date "1994.09.??"] +[Round "56"] +[White "Gill, Andy"] +[Black "Ridland, Lindsay"] +[Result "1-0"] +[ECO "C65"] +1. e4 e5 2. Nf3 Nc6 3. Bb5 Nf6 4. O-O Bc5 5. Re1 a6 (5... Ng4 6. Re2 O-O +7. d3 Nd4 8. Nxd4 Bxd4 9. Nd2 {<saw>,0.13 but a bit messy for white.}) +6. Ba4 (6. Bxc6 dxc6 7. h3 Qe7 8. d3 O-O 9. Bg5 h6 10. Bh4 {=, taking the +exchange way out.}) 6... b5 7. Bb3 d6 { We have now reached a main line +of the Ruy Lopez.} 8. c3 (8. a4 Ng4 9. Re2 Bb7 10. axb5 axb5 {=, and very +like Game 7 of the Short-Kasparov WC, where Kasparov as white scored a +decisive victory.}) 8... Bg4 9. d3 h6 10. Be3 O-O (10... Bxe3 11. Rxe3 +O-O 12. a4 b4 13. h3 Bh5 14. Nbd2 Rb8 {=}) 11. Bxc5 dxc5 12. Bc2 Qd7 +13. Nbd2 (13. h3 Bh5 14. Nbd2 Rfd8 15. Nb3 Qd6 16. Qe2 Rab8 17. Red1 { +Fritz is deperate to put h3, but I dont see why.}) 13... Nh5 {} (13... +Rad8 {is an idea.}) 14. Nb3 (14. h3 {<saw>,0.33 I now agree with this, +because the knight block the h5 retreat square.}) 14... Nf4 {?} (14... +Qd6 15. h3 Be6 16. Ng5 Bxb3 17. axb3 Nf4 18. Nf3 {<sab>}) 15. Nxc5 Qc8 ( +15... Qe7 16. Nb3 Rfd8 17. h3 Be6 18. d4 Qf6 19. Rc1 exd4 {=}) 16. Re3 ( +16. b4 {White is just a pawn up.}) 16... Rd8 17. Qd2 Rd6 (17... Bxf3 {!} +18. Rxf3 Qg4 19. Rxf4 exf4 20. h3 Qh4 21. d4 {and black has equalised!}) +18. Bd1 {} 18... Nxg2 {?? Throws away a piece for a very temp. +inititive.} (18... Rb8 19. d4 exd4 20. cxd4 Ne6 21. Nxe6 Qxe6 {and white +is starting to push home his advantage.}) 19. Kxg2 Bh3+ 20. Kh1 Qg4 ( +20... Rg6 {is another idea, but the whole plan is conceptually flawed.}) +21. Ne1 Qg5 22. Qe2 Be6 23. Rg3 Qf6 24. Nxe6 {} (24. Nf3 Ne7 25. Nxe6 +Qxe6 26. Bb3 Qf6 27. Rag1 {<waw>}) 24... Rxe6 (24... Qxe6 25. Bb3 Qe7 +26. Bd5 Rad8 27. Nf3 R8d7 28. Rd1) 25. Qf3 {Crude plan of exchanging +queens to avoid `acidents`.} (25. Bb3) 25... Qe7 26. Bb3 Rf6 27. Qe3 (27. +Qg2) 27... Rd8 28. Nc2 Kh7 29. Rag1 g6 30. Rf3 {} 30... Rxf3 (30... Rfd6 { +??} 31. Rxf7+ {Trying to avoid the exchance, but black loses his Queen! +Black actually moved his rook to d6, but before letting it go, spotted +the danger, and then took the exchange. Shame...}) 31. Qxf3 Rd7 32. Ne3 +h5 {?} 33. Nd5 {! At least winning the exchange. Black resigned here.} +1-0 + diff --git a/testsuite/tests/programs/andy_cherry/test.T b/testsuite/tests/programs/andy_cherry/test.T new file mode 100644 index 0000000000..4d14ee306e --- /dev/null +++ b/testsuite/tests/programs/andy_cherry/test.T @@ -0,0 +1,14 @@ + +test('andy_cherry', + [skip_if_fast, + extra_clean(['DataTypes.hi', 'DataTypes.o', + 'GenUtils.hi', 'GenUtils.o', + 'Interp.hi', 'Interp.o', + 'InterpUtils.hi', 'InterpUtils.o', + 'Main.hi', 'Main.o', + 'Parser.hi', 'Parser.o', + 'PrintTEX.hi', 'PrintTEX.o']), + extra_run_opts('.')], + multimod_compile_and_run, + ['Main', '-cpp']) + diff --git a/testsuite/tests/programs/barton-mangler-bug/Basic.hs b/testsuite/tests/programs/barton-mangler-bug/Basic.hs new file mode 100644 index 0000000000..1597a86d2f --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/Basic.hs @@ -0,0 +1,287 @@ + +module Basic where +import TypesettingTricks +--import Int( Num(fromInt) ) +import Physical +--import GHC( (->) ) +infixr 7 |> +class Signal s where + mapSignal:: (Physical a, Physical b) => (s a b) -> a -> b + mapSigList:: (Physical a, Physical b) => (s a b) -> [a] -> [b] + toSig:: (Physical a, Physical b) => (s a b) -> SignalRep a b + mapSignal = mapSignal . toSig + mapSigList = map . mapSignal + toSig = FunctionRep . mapSignal +instance Signal (->) where + mapSignal f = f + toSig = FunctionRep +data {- (Physical a, Physical b) => -} SignalRep a b = + FunctionRep (a -> b) | + PieceContRep (PieceCont a b) + +instance Eq (SignalRep a b) where + (==) a b = error "No equality for SignalRep" + +instance Show (SignalRep a b) where + show sr = error "No show for SignalRep" + +instance Signal SignalRep where + mapSignal (FunctionRep f) = mapSignal f + mapSignal (PieceContRep f) = mapSignal f + mapSigList (FunctionRep f) = mapSigList f + mapSigList (PieceContRep f) = mapSigList f + toSig = id +instance (Physical a, Physical b) => Eq (a -> b) where + a == b = error "Attempt to apply equality to functions" +binop:: (Physical a, Physical b) => (Float -> Float -> Float) -> + (a -> b) -> (a -> b) -> a -> b +binop op f g t = toPhysical ((fromPhysical (f t)) `op` (fromPhysical (g t))) +unop:: (Physical a, Physical b ) => (Float -> Float) -> + (a -> b) -> a -> b +unop op f t = toPhysical (op (fromPhysical (f t))) +instance (Physical a, Physical b) => Num (SignalRep a b) where + f + g = FunctionRep (binop (+) (mapSignal f) (mapSignal g)) + f * g = FunctionRep (binop (*) (mapSignal f) (mapSignal g)) + negate f = FunctionRep (unop negate (mapSignal f)) + abs f = FunctionRep (unop abs (mapSignal f)) + signum f = FunctionRep (unop abs (mapSignal f)) + fromInteger i = FunctionRep (\t -> toPhysical (fromInteger i)) + --fromInt i = FunctionRep (\t -> toPhysical (fromInt i)) +instance (Physical a, Physical b) => + Fractional (SignalRep a b) where + f / g = FunctionRep (binop (/) (mapSignal f) (mapSignal g)) + fromRational r = FunctionRep (\t -> (toPhysical (fromRational r))) +instance (Physical a, Physical b) => + Floating (SignalRep a b) where + pi = FunctionRep (\t -> (toPhysical pi)) + exp f = FunctionRep (unop exp (mapSignal f)) + log f = FunctionRep (unop log (mapSignal f)) + sin f = FunctionRep (unop sin (mapSignal f)) + cos f = FunctionRep (unop cos (mapSignal f)) + asin f = FunctionRep (unop asin (mapSignal f)) + acos f = FunctionRep (unop acos (mapSignal f)) + atan f = FunctionRep (unop atan (mapSignal f)) + sinh f = FunctionRep (unop sinh (mapSignal f)) + cosh f = FunctionRep (unop cosh (mapSignal f)) + asinh f = FunctionRep (unop asinh (mapSignal f)) + acosh f = FunctionRep (unop acosh (mapSignal f)) + atanh f = FunctionRep (unop atanh (mapSignal f)) +data Event = + TimeEvent Float | + FunctionEvent (Float -> Bool) | + BurstEvent Int Event + +instance Show Event where + show (TimeEvent f) = "TimeEvent " ++ show f + show (FunctionEvent _) = "FunctionEvent" + show (BurstEvent i e) = "BurstEvent " ++ show i ++ " " ++ show e + +instance Eq Event where + (TimeEvent x) == (TimeEvent y) = x == y + (BurstEvent i e) == (BurstEvent i' e') = (i' == i) && (e' == e) +eventOccurs:: Event -> Float -> Float +eventOccurs (TimeEvent t) x = if x < t then x else t +eventOccurs (FunctionEvent f) x = stepEval f x +eventOccurs (BurstEvent i e) x = + if i == 1 then + eventOccurs e x + else + eventOccurs (BurstEvent (i-1) e) ((eventOccurs e x) + eventEps x) +stepEval:: (Float -> Bool) -> Float -> Float +stepEval f x = if f x then x else stepEval f (x + eventEps x) +data ZeroIndicator = LocalZero | GlobalZero deriving (Eq, Show) +data {- (Physical a, Physical b) => -} FunctionWindow a b = + Window ZeroIndicator Event (SignalRep a b) + deriving (Eq, Show) +data PieceCont a b = Windows [FunctionWindow a b] + deriving (Eq, Show) +instance Signal PieceCont where + mapSignal (Windows []) t = toPhysical 0.0 + mapSignal (Windows wl) t = (mapSignal s) (toPhysical t') + where (t', (Window z e s), wl') = getWindow 0.0 (fromPhysical t) wl + toSig = PieceContRep +getWindow:: (Physical a, Physical b) => + Float -> Float -> [ FunctionWindow a b ] -> + (Float, FunctionWindow a b, [ FunctionWindow a b ]) +getWindow st t [] = (t, Window LocalZero e f, []) + where e = TimeEvent (realmul 2 t) + f = FunctionRep (\t -> toPhysical 0.0) +getWindow st t (w:wl) = if t' <= wt then (t',w,w:wl) + else getWindow (st+wt) t wl + where wt = eventOccurs e t' + (Window z e s) = w + t' = if z == LocalZero then t-st else t +(|>) :: (Physical a, Physical b) => FunctionWindow a b -> + PieceCont a b -> PieceCont a b +w |> (Windows wl) = Windows (w:wl) +nullWindow = Windows [] +cycleWindows:: (Physical a, Physical b) => + PieceCont a b -> PieceCont a b +cycleWindows (Windows wl) = Windows (cycle wl) +constant:: (Physical a, Physical b) => b -> SignalRep a b +constant x = FunctionRep (\t -> x) +linear:: (Physical a, Physical b) => Float -> b -> SignalRep a b +linear m b = FunctionRep (\x -> toPhysical (realmul m (fromPhysical x) + (fromPhysical b))) +sine:: (Physical a, Physical b) => + b -> Frequency -> Float -> SignalRep a b +sine mag omeg phase = FunctionRep (\x -> toPhysical (realmul (fromPhysical mag) (sin (realmul (realmul (realmul 2 pi) (fromPhysical omeg)) (fromPhysical x) + phase)))) +waveform:: (Physical a, Physical b) => a -> [b] -> SignalRep a b +waveform samp ampls = + let stepSlope y y' = realdiv ((fromPhysical y') - (fromPhysical y)) (fromPhysical samp) + makeWin (v,v') = Window LocalZero (TimeEvent (fromPhysical samp)) + (linear (stepSlope v v') v) + points = cycle ampls + in PieceContRep (Windows (map makeWin (zip points (tail points)))) +random:: (Physical a, Physical b) => + Integer -> a -> SignalRep a b +random i s = waveform s (map toPhysical (rand i)) +ramp:: (Physical a, Physical b) => a -> b -> SignalRep a b +ramp per v = + let sig = linear (realdiv (fromPhysical v) (fromPhysical per)) (toPhysical 0.0) + in PieceContRep (Windows (cycle ([Window LocalZero (TimeEvent (fromPhysical per)) sig ]))) +triangle:: (Physical a, Physical b) => a -> b -> SignalRep a b +triangle per v = + let sl = realmul 2.0 (realdiv (fromPhysical v) (fromPhysical per)) + qper = realdiv (fromPhysical v) 4.0 + wins = (Window LocalZero (TimeEvent qper) (linear sl (toPhysical 0.0))) |> + (Window LocalZero (TimeEvent (realmul 2.0 qper)) (linear (- sl) v)) |> + (Window LocalZero (TimeEvent qper) (linear sl (toPhysical (- (fromPhysical v))))) |> + nullWindow + in PieceContRep (cycleWindows wins) +step:: (Physical a, Physical b) => a -> b -> SignalRep a b +step tr lvl = FunctionRep (\t -> if (fromPhysical t) < (fromPhysical tr) then (toPhysical 0.0) else lvl) +square:: (Physical a, Physical b) => a -> b -> SignalRep a b +square per lvl = + let trans = realdiv (fromPhysical per) 2.0 + nlvl = asTypeOf (toPhysical (- (fromPhysical lvl))) lvl + f t = if (fromPhysical t) < trans then lvl else nlvl + wins = Windows [Window LocalZero (TimeEvent (fromPhysical per)) (FunctionRep f)] + in PieceContRep (cycleWindows wins) +pulse:: (Physical a, Physical b) => a -> a -> b -> SignalRep a b +pulse st wid lvl = + let tr = (fromPhysical st) + (fromPhysical wid) + f t = if (fromPhysical t) < (fromPhysical st) then (toPhysical 0.0) + else if (fromPhysical t) < tr then lvl else (toPhysical 0.0) + in FunctionRep f +trap:: (Physical a, Physical b) => a -> a -> a -> a -> b -> + SignalRep a b +trap st r wid f lvl = + let stepSlope y y' t = realdiv (y' - y) (fromPhysical t) + bigwin = realmul 10000000 ((fromPhysical st) + (fromPhysical wid)) + wins = Window LocalZero (TimeEvent (fromPhysical st)) (constant (toPhysical 0.0)) |> + Window LocalZero (TimeEvent (fromPhysical r)) (linear (stepSlope 0.0 (fromPhysical lvl) r) (toPhysical 0.0)) |> + Window LocalZero (TimeEvent (fromPhysical wid)) (constant lvl) |> + Window LocalZero (TimeEvent (fromPhysical f)) (linear (stepSlope (fromPhysical lvl) 0.0 f) lvl) |> + Window LocalZero (TimeEvent bigwin) (constant (toPhysical 0.0)) |> + nullWindow + in PieceContRep wins +expc:: (Physical a, Physical b) => Float -> SignalRep a b +expc damp = FunctionRep (\t -> toPhysical (exp (- (realmul (fromPhysical t) damp)))) +data {- (Physical indep, Physical dep) => -} BasicSignal indep dep = + Overshoot {start_delay::indep, + pulse_width::indep, + ringing::dep, + oscillation::Frequency, + damp_fac::Float} + | Pulse_dc {start_delay::indep, + pulse_width::indep, + rise_time::indep, + fall_time::indep, + period::indep, + dc_offset::dep, + amplitude::dep, + over::BasicSignal indep dep, + under::BasicSignal indep dep} + | Pulse_ac {start_delay::indep, + pulse_width::indep, + period::indep, + dc_offset::dep, + amplitude::dep, + frequency::Frequency, + phase::Float} + deriving (Eq, Show) + +data {- (Eq a, Eq b) => -} Foo a b = Foo { x :: a, y :: b} + +foo :: (Eq a, Eq b) => Foo a b +foo = Foo{} + +{- +overshoot:: (Physical a, Physical b) => BasicSignal a b +overshoot = Overshoot{} +pulse_dc:: (Physical a, Physical b) => BasicSignal a b +pulse_dc = Pulse_dc {over = Overshoot{start_delay=toPhysical 0.0, + ringing=(toPhysical 0.0), + oscillation=toPhysical 1.0, + damp_fac=1.0}, + under = Overshoot{start_delay=toPhysical 0.0, + ringing=(toPhysical 0.0), + oscillation=toPhysical 1.0, + damp_fac=1.0}, + start_delay = toPhysical 0.0, + dc_offset = toPhysical 0.0} + +pulse_ac:: (Physical a, Physical b) => BasicSignal a b +pulse_ac = Pulse_ac {dc_offset = toPhysical 0.0, + amplitude = toPhysical 0.0} +-} + +makeWin:: (Physical a, Physical b) => a -> a -> + SignalRep a b -> SignalRep a b +makeWin st wid sig = + let wins = Window LocalZero (TimeEvent (fromPhysical st)) (constant (toPhysical 0.0)) |> + Window LocalZero (TimeEvent (fromPhysical wid)) sig |> + nullWindow + in PieceContRep wins +instance Signal BasicSignal where + toSig (Overshoot start_delay pulse_width ringing oscillation damp_fac) = + let ring = sine ringing oscillation 0.0 + cond = asTypeOf (expc damp_fac) ring + sig = temp ring cond + temp:: (Physical a, Physical b) => SignalRep a b -> + SignalRep a b -> SignalRep a b + temp f g = FunctionRep (binop (*) (mapSignal f) (mapSignal g)) +-- temp f g = f * g +-- temp f g = asTypeOf (f * g) ring + wins = Window LocalZero (TimeEvent (fromPhysical start_delay)) (constant (toPhysical 0.0)) |> + Window LocalZero (TimeEvent (fromPhysical pulse_width)) sig |> + nullWindow + in PieceContRep wins + toSig Pulse_dc{ start_delay = start_delay + , rise_time = rise_time + , pulse_width = pulse_width + , fall_time = fall_time + , dc_offset = dc_offset + , period = period + , amplitude = amplitude + , over = over + , under = under + } = + let pul = trap start_delay rise_time pulse_width fall_time amplitude + so = toPhysical ((fromPhysical start_delay) + (fromPhysical rise_time)) + su = toPhysical ((fromPhysical so) + (fromPhysical pulse_width) + (fromPhysical fall_time)) + oversh = toSig over{start_delay=so} + undersh = toSig under{start_delay=su} + off = constant dc_offset + temp:: (Physical a, Physical b) => SignalRep a b -> + SignalRep a b -> SignalRep a b + temp f g = FunctionRep (binop (+) (mapSignal f) (mapSignal g)) + sig = temp (temp (temp pul oversh) undersh) off + wins = (Window LocalZero (TimeEvent (fromPhysical period)) sig) |> + nullWindow + in PieceContRep (cycleWindows wins) +sumSig:: (Physical a, Physical b, Signal s, Signal s') => + (s a b) -> (s' a b) -> SignalRep a b +sumSig f f' = + let s1 t = fromPhysical (mapSignal f t) + s2 t = fromPhysical (mapSignal f' t) + in FunctionRep (\t -> toPhysical ((s1 t) + (s2 t))) +mulSig:: (Physical a, Physical b, Signal s, Signal s') => + (s a b) -> (s' a b) -> SignalRep a b +mulSig f f' = + let f1 t = fromPhysical (mapSignal f t) + f2 t = fromPhysical (mapSignal f' t) + in FunctionRep (\t -> toPhysical ((f1 t) * (f2 t))) + +eventEps:: Float -> Float +eventEps x = let eps = realdiv x 1000 in if 0.01 < eps then 0.01 else eps diff --git a/testsuite/tests/programs/barton-mangler-bug/Bug.hs b/testsuite/tests/programs/barton-mangler-bug/Bug.hs new file mode 100644 index 0000000000..0f75dffc94 --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/Bug.hs @@ -0,0 +1,6 @@ +module Bug where + +data Eq a => Foo a = Foo { x :: a } + +foo :: Foo Int +foo = Foo{} diff --git a/testsuite/tests/programs/barton-mangler-bug/Expected.hs b/testsuite/tests/programs/barton-mangler-bug/Expected.hs new file mode 100644 index 0000000000..a047c2ed29 --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/Expected.hs @@ -0,0 +1,5009 @@ + +module Expected (sinExpected, pieceExpected) where + +sinExpected :: [(Float, Float)] +sinExpected = [ + (0.0, 0.0), + (4.0e-4, 5.0260194e-2), + (8.0e-4, 0.10048864), + (1.1999999e-3, 0.1506536), + (1.6e-3, 0.20072344), + (1.9999999e-3, 0.25066644), + (2.3999999e-3, 0.30045116), + (2.8e-3, 0.35004613), + (3.2e-3, 0.39941996), + (3.6e-3, 0.44854155), + (3.9999997e-3, 0.49737975), + (4.3999995e-3, 0.54590386), + (4.7999993e-3, 0.5940831), + (5.199999e-3, 0.6418871), + (5.599999e-3, 0.68928576), + (5.9999987e-3, 0.736249), + (6.3999984e-3, 0.7827472), + (6.799998e-3, 0.82875097), + (7.199998e-3, 0.87423134), + (7.599998e-3, 0.9191595), + (7.999998e-3, 0.96350706), + (8.399998e-3, 1.0072463), + (8.799998e-3, 1.0503491), + (9.199998e-3, 1.0927886), + (9.599999e-3, 1.1345378), + (9.999999e-3, 1.1755705), + (1.0399999e-2, 1.2158606), + (1.0799999e-2, 1.2553827), + (1.12e-2, 1.294112), + (1.16e-2, 1.3320237), + (1.2e-2, 1.3690943), + (1.24e-2, 1.4053), + (1.2800001e-2, 1.4406182), + (1.3200001e-2, 1.4750264), + (1.3600001e-2, 1.5085028), + (1.4000001e-2, 1.5410266), + (1.4400002e-2, 1.572577), + (1.4800002e-2, 1.6031342), + (1.5200002e-2, 1.6326787), + (1.5600002e-2, 1.661192), + (1.6000003e-2, 1.6886561), + (1.6400002e-2, 1.7150536), + (1.6800001e-2, 1.7403677), + (1.72e-2, 1.7645825), + (1.76e-2, 1.7876829), + (1.8e-2, 1.8096541), + (1.8399999e-2, 1.8304824), + (1.8799998e-2, 1.8501544), + (1.9199997e-2, 1.8686578), + (1.9599997e-2, 1.885981), + (1.9999996e-2, 1.902113), + (2.0399995e-2, 1.9170434), + (2.0799994e-2, 1.9307631), + (2.1199994e-2, 1.9432633), + (2.1599993e-2, 1.9545361), + (2.1999992e-2, 1.9645743), + (2.2399992e-2, 1.9733717), + (2.2799991e-2, 1.9809227), + (2.319999e-2, 1.9872226), + (2.359999e-2, 1.9922671), + (2.3999989e-2, 1.9960533), + (2.4399988e-2, 1.9985789), + (2.4799988e-2, 1.999842), + (2.5199987e-2, 1.999842), + (2.5599986e-2, 1.998579), + (2.5999986e-2, 1.9960536), + (2.6399985e-2, 1.9922674), + (2.6799984e-2, 1.9872228), + (2.7199984e-2, 1.980923), + (2.7599983e-2, 1.9733722), + (2.7999982e-2, 1.9645749), + (2.8399982e-2, 1.9545367), + (2.879998e-2, 1.943264), + (2.919998e-2, 1.930764), + (2.959998e-2, 1.9170443), + (2.9999979e-2, 1.9021138), + (3.0399978e-2, 1.8859819), + (3.0799977e-2, 1.8686588), + (3.1199977e-2, 1.8501555), + (3.1599976e-2, 1.8304834), + (3.1999975e-2, 1.8096554), + (3.2399975e-2, 1.7876841), + (3.2799974e-2, 1.7645838), + (3.3199973e-2, 1.7403691), + (3.3599973e-2, 1.715055), + (3.3999972e-2, 1.6886578), + (3.439997e-2, 1.6611936), + (3.479997e-2, 1.6326804), + (3.519997e-2, 1.6031361), + (3.559997e-2, 1.5725791), + (3.599997e-2, 1.541029), + (3.6399968e-2, 1.5085055), + (3.6799967e-2, 1.4750288), + (3.7199967e-2, 1.4406208), + (3.7599966e-2, 1.4053029), + (3.7999965e-2, 1.3690974), + (3.8399965e-2, 1.3320271), + (3.8799964e-2, 1.2941151), + (3.9199963e-2, 1.2553861), + (3.9599963e-2, 1.2158642), + (3.999996e-2, 1.1755743), + (4.039996e-2, 1.1345419), + (4.079996e-2, 1.0927929), + (4.119996e-2, 1.0503532), + (4.159996e-2, 1.0072505), + (4.199996e-2, 0.9635117), + (4.2399958e-2, 0.9191643), + (4.2799957e-2, 0.87423635), + (4.3199956e-2, 0.82875574), + (4.3599956e-2, 0.7827521), + (4.3999955e-2, 0.7362541), + (4.4399954e-2, 0.68929106), + (4.4799954e-2, 0.6418926), + (4.5199953e-2, 0.5940888), + (4.5599952e-2, 0.5459092), + (4.599995e-2, 0.49738535), + (4.639995e-2, 0.4485473), + (4.679995e-2, 0.39942592), + (4.719995e-2, 0.3500523), + (4.759995e-2, 0.30045706), + (4.799995e-2, 0.25067255), + (4.8399948e-2, 0.2007297), + (4.8799947e-2, 0.15066005), + (4.9199946e-2, 0.100495264), + (4.9599946e-2, 5.0266996e-2), + (4.9999945e-2, 6.500875e-6), + (5.0399944e-2, -5.025352e-2), + (5.0799944e-2, -0.1004818), + (5.1199943e-2, -0.15064661), + (5.1599942e-2, -0.20071629), + (5.199994e-2, -0.25065964), + (5.239994e-2, -0.30044422), + (5.279994e-2, -0.350039), + (5.319994e-2, -0.39941272), + (5.359994e-2, -0.44853416), + (5.3999938e-2, -0.4973723), + (5.4399937e-2, -0.5458967), + (5.4799937e-2, -0.5940759), + (5.5199936e-2, -0.64187986), + (5.5599935e-2, -0.6892784), + (5.5999935e-2, -0.7362416), + (5.6399934e-2, -0.7827402), + (5.6799933e-2, -0.82874393), + (5.7199933e-2, -0.87422425), + (5.7599932e-2, -0.9191523), + (5.799993e-2, -0.9634999), + (5.839993e-2, -1.0072393), + (5.879993e-2, -1.0503422), + (5.919993e-2, -1.0927815), + (5.959993e-2, -1.1345308), + (5.9999928e-2, -1.1755633), + (6.0399927e-2, -1.2158535), + (6.0799927e-2, -1.255376), + (6.1199926e-2, -1.2941052), + (6.1599925e-2, -1.332017), + (6.1999924e-2, -1.3690875), + (6.2399924e-2, -1.4052932), + (6.279992e-2, -1.4406117), + (6.319992e-2, -1.4750199), + (6.359992e-2, -1.5084965), + (6.399992e-2, -1.5410206), + (6.439992e-2, -1.5725712), + (6.479992e-2, -1.6031283), + (6.519992e-2, -1.6326729), + (6.559992e-2, -1.6611863), + (6.599992e-2, -1.6886505), + (6.639992e-2, -1.7150481), + (6.679992e-2, -1.7403624), + (6.7199916e-2, -1.7645775), + (6.7599915e-2, -1.7876781), + (6.7999914e-2, -1.8096495), + (6.839991e-2, -1.8304783), + (6.879991e-2, -1.8501506), + (6.919991e-2, -1.8686541), + (6.959991e-2, -1.8859775), + (6.999991e-2, -1.9021097), + (7.039991e-2, -1.9170405), + (7.079991e-2, -1.9307604), + (7.119991e-2, -1.9432608), + (7.159991e-2, -1.9545338), + (7.199991e-2, -1.9645723), + (7.239991e-2, -1.97337), + (7.2799906e-2, -1.9809214), + (7.3199905e-2, -1.9872214), + (7.3599905e-2, -1.9922662), + (7.3999904e-2, -1.9960527), + (7.43999e-2, -1.9985785), + (7.47999e-2, -1.9998419), + (7.51999e-2, -1.9998423), + (7.55999e-2, -1.9985794), + (7.59999e-2, -1.9960542), + (7.63999e-2, -1.9922683), + (7.67999e-2, -1.9872241), + (7.71999e-2, -1.9809245), + (7.75999e-2, -1.9733739), + (7.79999e-2, -1.9645768), + (7.83999e-2, -1.9545388), + (7.8799896e-2, -1.9432664), + (7.9199895e-2, -1.9307666), + (7.9599895e-2, -1.9170473), + (7.9999894e-2, -1.902117), + (8.039989e-2, -1.8859855), + (8.079989e-2, -1.8686627), + (8.119989e-2, -1.8501595), + (8.159989e-2, -1.8304875), + (8.199989e-2, -1.8096596), + (8.239989e-2, -1.7876887), + (8.279989e-2, -1.7645887), + (8.319989e-2, -1.7403742), + (8.359989e-2, -1.7150604), + (8.399989e-2, -1.6886632), + (8.439989e-2, -1.6611996), + (8.4799886e-2, -1.6326867), + (8.5199885e-2, -1.6031425), + (8.5599884e-2, -1.5725858), + (8.599988e-2, -1.5410352), + (8.639988e-2, -1.5085119), + (8.679988e-2, -1.4750358), + (8.719988e-2, -1.4406279), + (8.759988e-2, -1.4053102), + (8.799988e-2, -1.3691049), + (8.839988e-2, -1.3320347), + (8.879988e-2, -1.2941233), + (8.919988e-2, -1.2553945), + (8.959988e-2, -1.2158726), + (8.999988e-2, -1.175583), + (9.0399876e-2, -1.13455), + (9.0799876e-2, -1.0928011), + (9.1199875e-2, -1.050362), + (9.1599874e-2, -1.0072595), + (9.199987e-2, -0.96352077), + (9.239987e-2, -0.9191735), + (9.279987e-2, -0.87424564), + (9.319987e-2, -0.8287656), + (9.359987e-2, -0.78276205), + (9.399987e-2, -0.73626417), + (9.439987e-2, -0.6893012), + (9.479987e-2, -0.64190197), + (9.519987e-2, -0.59409815), + (9.559987e-2, -0.5459192), + (9.599987e-2, -0.49739534), + (9.6399866e-2, -0.44855735), + (9.6799865e-2, -0.39943603), + (9.7199865e-2, -0.35006243), + (9.7599864e-2, -0.30046773), + (9.799986e-2, -0.25068325), + (9.839986e-2, -0.20074043), + (9.879986e-2, -0.15067083), + (9.919986e-2, -0.10050509), + (9.959986e-2, -5.027683e-2), + (9.999986e-2, -1.6816446e-5), + (0.10039986, 5.024321e-2), + (0.10079986, 0.100471504), + (0.10119986, 0.15063633), + (0.10159986, 0.20070602), + (0.10199986, 0.25064895), + (0.102399856, 0.30043355), + (0.102799855, 0.3500284), + (0.103199854, 0.39940214), + (0.103599854, 0.44852456), + (0.10399985, 0.49736276), + (0.10439985, 0.5458868), + (0.10479985, 0.5940661), + (0.10519985, 0.6418701), + (0.10559985, 0.6892687), + (0.10599985, 0.736232), + (0.10639985, 0.7827302), + (0.10679985, 0.8287341), + (0.10719985, 0.87421453), + (0.10759985, 0.9191428), + (0.10799985, 0.9634913), + (0.108399846, 1.0072304), + (0.108799845, 1.0503334), + (0.109199844, 1.092773), + (0.10959984, 1.1345222), + (0.10999984, 1.175555), + (0.11039984, 1.2158452), + (0.11079984, 1.2553675), + (0.11119984, 1.294097), + (0.11159984, 1.332009), + (0.11199984, 1.3690796), + (0.11239984, 1.4052863), + (0.11279984, 1.4406046), + (0.11319984, 1.475013), + (0.11359984, 1.5084898), + (0.113999836, 1.5410138), + (0.114399835, 1.5725645), + (0.114799835, 1.6031219), + (0.115199834, 1.6326667), + (0.11559983, 1.6611804), + (0.11599983, 1.6886448), + (0.11639983, 1.7150426), + (0.11679983, 1.7403576), + (0.11719983, 1.7645729), + (0.11759983, 1.7876737), + (0.11799983, 1.8096453), + (0.11839983, 1.8304739), + (0.11879983, 1.8501464), + (0.11919983, 1.8686503), + (0.11959983, 1.8859739), + (0.119999826, 1.9021064), + (0.120399825, 1.9170374), + (0.120799825, 1.9307575), + (0.121199824, 1.9432585), + (0.12159982, 1.9545318), + (0.12199982, 1.9645705), + (0.12239982, 1.9733684), + (0.12279982, 1.9809198), + (0.12319982, 1.9872202), + (0.12359982, 1.9922652), + (0.12399982, 1.996052), + (0.12439982, 1.9985781), + (0.12479982, 1.9998418), + (0.12519982, 1.9998424), + (0.12559983, 1.9985797), + (0.12599984, 1.9960546), + (0.12639984, 1.9922688), + (0.12679985, 1.9872246), + (0.12719986, 1.9809252), + (0.12759987, 1.9733747), + (0.12799987, 1.9645776), + (0.12839988, 1.9545392), + (0.12879989, 1.9432665), + (0.12919989, 1.9307665), + (0.1295999, 1.9170468), + (0.1299999, 1.9021163), + (0.13039991, 1.8859843), + (0.13079992, 1.868661), + (0.13119993, 1.8501575), + (0.13159993, 1.8304853), + (0.13199994, 1.8096569), + (0.13239995, 1.7876855), + (0.13279995, 1.7645848), + (0.13319996, 1.7403696), + (0.13359997, 1.7150551), + (0.13399997, 1.6886573), + (0.13439998, 1.6611929), + (0.13479999, 1.6326791), + (0.1352, 1.6031342), + (0.1356, 1.5725766), + (0.136, 1.5410256), + (0.13640001, 1.5085014), + (0.13680002, 1.4750243), + (0.13720003, 1.4406155), + (0.13760003, 1.4052968), + (0.13800004, 1.3690904), + (0.13840005, 1.3320193), + (0.13880005, 1.2941068), + (0.13920006, 1.2553754), + (0.13960007, 1.2158525), + (0.14000008, 1.1755617), + (0.14040008, 1.1345282), + (0.14080009, 1.0927782), + (0.1412001, 1.0503379), + (0.1416001, 1.0072342), + (0.14200011, 0.9634943), + (0.14240012, 0.9191458), + (0.14280012, 0.87421674), + (0.14320013, 0.8287355), + (0.14360014, 0.78273076), + (0.14400014, 0.7362316), + (0.14440015, 0.68926746), + (0.14480016, 0.64186794), + (0.14520016, 0.5940629), + (0.14560017, 0.54588276), + (0.14600018, 0.49735776), + (0.14640018, 0.4485186), + (0.14680019, 0.39939615), + (0.1472002, 0.35002142), + (0.1476002, 0.30042562), + (0.14800021, 0.25064003), + (0.14840022, 0.20069614), + (0.14880022, 0.15062548), + (0.14920023, 0.10045967), + (0.14960024, 5.0230417e-2), + (0.15000024, -3.2472628e-5), + (0.15040025, -5.0293438e-2), + (0.15080026, -0.10052263), + (0.15120026, -0.15068834), + (0.15160027, -0.20075886), + (0.15200028, -0.25070256), + (0.15240029, -0.30048794), + (0.15280029, -0.3500835), + (0.1532003, -0.39945793), + (0.1536003, -0.44858003), + (0.15400031, -0.49741882), + (0.15440032, -0.5459434), + (0.15480033, -0.5941231), + (0.15520033, -0.6419276), + (0.15560034, -0.68932664), + (0.15600035, -0.7362902), + (0.15640035, -0.78278875), + (0.15680036, -0.8287928), + (0.15720037, -0.8742734), + (0.15760037, -0.9192018), + (0.15800038, -0.96354955), + (0.15840039, -1.0072887), + (0.1588004, -1.0503916), + (0.1592004, -1.092831), + (0.1596004, -1.1345801), + (0.16000041, -1.1756126), + (0.16040042, -1.2159026), + (0.16080043, -1.2554245), + (0.16120043, -1.2941549), + (0.16160044, -1.3320663), + (0.16200045, -1.3691365), + (0.16240045, -1.4053416), + (0.16280046, -1.4406593), + (0.16320047, -1.4750669), + (0.16360047, -1.5085428), + (0.16400048, -1.5410659), + (0.16440049, -1.5726155), + (0.1648005, -1.6031718), + (0.1652005, -1.6327156), + (0.16560051, -1.661228), + (0.16600052, -1.688691), + (0.16640052, -1.7150875), + (0.16680053, -1.7404007), + (0.16720054, -1.7646145), + (0.16760054, -1.7877138), + (0.16800055, -1.8096838), + (0.16840056, -1.8305107), + (0.16880056, -1.8501815), + (0.16920057, -1.8686836), + (0.16960058, -1.8860053), + (0.17000058, -1.9021357), + (0.17040059, -1.9170648), + (0.1708006, -1.9307829), + (0.1712006, -1.9432814), + (0.17160061, -1.9545525), + (0.17200062, -1.9645894), + (0.17240062, -1.973385), + (0.17280063, -1.980934), + (0.17320064, -1.9872319), + (0.17360064, -1.9922745), + (0.17400065, -1.9960587), + (0.17440066, -1.9985821), + (0.17480066, -1.9998431), + (0.17520067, -1.999841), + (0.17560068, -1.9985757), + (0.17600068, -1.996048), + (0.17640069, -1.9922595), + (0.1768007, -1.9872127), + (0.1772007, -1.9809105), + (0.17760071, -1.9733572), + (0.17800072, -1.9645574), + (0.17840073, -1.9545168), + (0.17880073, -1.9432416), + (0.17920074, -1.9307389), + (0.17960075, -1.9170167), + (0.18000075, -1.9020836), + (0.18040076, -1.8859491), + (0.18080077, -1.8686235), + (0.18120077, -1.8501174), + (0.18160078, -1.8304428), + (0.18200079, -1.8096119), + (0.1824008, -1.7876381), + (0.1828008, -1.7645352), + (0.1832008, -1.7403166), + (0.18360081, -1.7149998), + (0.18400082, -1.6885997), + (0.18440083, -1.661133), + (0.18480083, -1.6326171), + (0.18520084, -1.6030699), + (0.18560085, -1.5725102), + (0.18600085, -1.5409572), + (0.18640086, -1.5084308), + (0.18680087, -1.4749517), + (0.18720087, -1.440541), + (0.18760088, -1.4052204), + (0.18800089, -1.3690121), + (0.1884009, -1.3319391), + (0.1888009, -1.2940248), + (0.18920091, -1.2552933), + (0.18960091, -1.2157687), + (0.19000092, -1.1754762), + (0.19040093, -1.1344413), + (0.19080094, -1.0926898), + (0.19120094, -1.0502481), + (0.19160095, -1.007143), + (0.19200096, -0.9634018), + (0.19240096, -0.91905206), + (0.19280097, -0.8741218), + (0.19320098, -0.8286394), + (0.19360098, -0.7826336), + (0.19400099, -0.73613167), + (0.194401, -0.68916655), + (0.194801, -0.64176613), + (0.19520101, -0.59396034), + (0.19560102, -0.54577935), + (0.19600102, -0.49725366), + (0.19640103, -0.44841388), + (0.19680104, -0.39929086), + (0.19720104, -0.34991562), + (0.19760105, -0.30031937), + (0.19800106, -0.2505334), + (0.19840106, -0.20058921), + (0.19880107, -0.15051831), + (0.19920108, -0.10035235), + (0.19960108, -5.0122987e-2), + (0.20000109, 1.3802848e-4), + (0.2004011, 5.0398957e-2), + (0.2008011, 0.100628056), + (0.20120111, 0.1507936), + (0.20160112, 0.20086388), + (0.20200112, 0.2508073), + (0.20240113, 0.30059227), + (0.20280114, 0.35018742), + (0.20320114, 0.39956135), + (0.20360115, 0.4486829), + (0.20400116, 0.49752104), + (0.20440117, 0.54604495), + (0.20480117, 0.59422576), + (0.20520118, 0.6420294), + (0.20560119, 0.6894275), + (0.20600119, 0.7363901), + (0.2064012, 0.78288764), + (0.2068012, 0.8288906), + (0.20720121, 0.8743701), + (0.20760122, 0.9192972), + (0.20800123, 0.9636437), + (0.20840123, 1.0073816), + (0.20880124, 1.050483), + (0.20920125, 1.092921), + (0.20960125, 1.1346686), + (0.21000126, 1.1756996), + (0.21040127, 1.2159879), + (0.21080127, 1.2555081), + (0.21120128, 1.2942353), + (0.21160129, 1.3321451), + (0.2120013, 1.3692133), + (0.2124013, 1.4054167), + (0.2128013, 1.4407325), + (0.21320131, 1.4751382), + (0.21360132, 1.5086122), + (0.21400133, 1.5411332), + (0.21440133, 1.5726807), + (0.21480134, 1.603235), + (0.21520135, 1.6327765), + (0.21560135, 1.6612867), + (0.21600136, 1.6887486), + (0.21640137, 1.7151428), + (0.21680138, 1.7404536), + (0.21720138, 1.7646651), + (0.21760139, 1.7877619), + (0.2180014, 1.8097295), + (0.2184014, 1.830554), + (0.21880141, 1.8502222), + (0.21920142, 1.8687218), + (0.21960142, 1.886041), + (0.22000143, 1.902169), + (0.22040144, 1.9170954), + (0.22080144, 1.9308109), + (0.22120145, 1.9433068), + (0.22160146, 1.9545753), + (0.22200146, 1.9646091), + (0.22240147, 1.9734021), + (0.22280148, 1.9809486), + (0.22320148, 1.9872438), + (0.22360149, 1.9922837), + (0.2240015, 1.9960653), + (0.2244015, 1.998586), + (0.22480151, 1.9998444), + (0.22520152, 1.9998397), + (0.22560152, 1.9985718), + (0.22600153, 1.9960413), + (0.22640154, 1.9922502), + (0.22680154, 1.9872005), + (0.22720155, 1.9808956), + (0.22760156, 1.9733397), + (0.22800156, 1.9645373), + (0.22840157, 1.954494), + (0.22880158, 1.9432161), + (0.22920159, 1.9307109), + (0.22960159, 1.9169861), + (0.2300016, 1.9020505), + (0.2304016, 1.8859134), + (0.23080161, 1.8685851), + (0.23120162, 1.8500766), + (0.23160163, 1.8303995), + (0.23200163, 1.8095663), + (0.23240164, 1.7875899), + (0.23280165, 1.7644845), + (0.23320165, 1.7402647), + (0.23360166, 1.7149456), + (0.23400167, 1.6885431), + (0.23440167, 1.6610742), + (0.23480168, 1.6325561), + (0.23520169, 1.6030068), + (0.2356017, 1.5724449), + (0.2360017, 1.5408899), + (0.2364017, 1.5083616), + (0.23680171, 1.4748805), + (0.23720172, 1.4404678), + (0.23760173, 1.4051453), + (0.23800173, 1.3689338), + (0.23840174, 1.331859), + (0.23880175, 1.2939429), + (0.23920175, 1.2552096), + (0.23960176, 1.2156833), + (0.24000177, 1.1753893), + (0.24040177, 1.1343528), + (0.24080178, 1.0925997), + (0.24120179, 1.0501566), + (0.2416018, 1.0070502), + (0.2420018, 0.9633076), + (0.24240181, 0.9189566), + (0.24280182, 0.8740251), + (0.24320182, 0.8285416), + (0.24360183, 0.7825347), + (0.24400184, 0.73603356), + (0.24440184, 0.6890675), + (0.24480185, 0.6416662), + (0.24520186, 0.59385955), + (0.24560186, 0.54567784), + (0.24600187, 0.49715143), + (0.24640188, 0.448311), + (0.24680188, 0.39918742), + (0.24720189, 0.3498117), + (0.2476019, 0.300215), + (0.2480019, 0.25042868), + (0.24840191, 0.20048419), + (0.24880192, 0.15041116), + (0.24920192, 0.10024502), + (0.24960193, 5.001556e-2), + (0.25000194, -2.4549168e-4), + (0.25040194, -5.0506387e-2), + (0.25080195, -0.10073538), + (0.25120196, -0.15090075), + (0.25160196, -0.2009708), + (0.25200197, -0.25091392), + (0.25240198, -0.30069852), + (0.25280198, -0.35029322), + (0.253202, -0.39966664), + (0.253602, -0.44878763), + (0.254002, -0.49762514), + (0.254402, -0.5461483), + (0.25480202, -0.59432656), + (0.25520203, -0.64212936), + (0.25560203, -0.6895266), + (0.25600204, -0.7364883), + (0.25640205, -0.7829848), + (0.25680205, -0.8289867), + (0.25720206, -0.874465), + (0.25760207, -0.919391), + (0.25800207, -0.9637362), + (0.25840208, -1.0074726), + (0.2588021, -1.0505729), + (0.2592021, -1.0930094), + (0.2596021, -1.1347555), + (0.2600021, -1.175785), + (0.2604021, -1.2160717), + (0.26080212, -1.2555903), + (0.26120213, -1.2943158), + (0.26160213, -1.3322238), + (0.26200214, -1.3692902), + (0.26240215, -1.4054918), + (0.26280215, -1.4408057), + (0.26320216, -1.4752095), + (0.26360217, -1.5086814), + (0.26400217, -1.5412004), + (0.26440218, -1.5727459), + (0.2648022, -1.6032981), + (0.2652022, -1.6328397), + (0.2656022, -1.6613476), + (0.2660022, -1.6888062), + (0.2664022, -1.715198), + (0.26680222, -1.7405065), + (0.26720223, -1.7647157), + (0.26760224, -1.7878101), + (0.26800224, -1.8097752), + (0.26840225, -1.8305973), + (0.26880226, -1.8502631), + (0.26920226, -1.8687601), + (0.26960227, -1.8860768), + (0.27000228, -1.9022021), + (0.27040228, -1.917126), + (0.2708023, -1.930839), + (0.2712023, -1.9433322), + (0.2716023, -1.9545981), + (0.2720023, -1.9646293), + (0.27240232, -1.9734195), + (0.27280232, -1.9809633), + (0.27320233, -1.9872558), + (0.27360234, -1.9922931), + (0.27400234, -1.996072), + (0.27440235, -1.9985901), + (0.27480236, -1.9998459), + (0.27520236, -1.9998384), + (0.27560237, -1.9985676), + (0.27600238, -1.9960346), + (0.27640238, -1.9922408), + (0.2768024, -1.9871886), + (0.2772024, -1.9808811), + (0.2776024, -1.9733225), + (0.2780024, -1.9645175), + (0.27840242, -1.9544716), + (0.27880242, -1.9431912), + (0.27920243, -1.9306833), + (0.27960244, -1.916956), + (0.28000244, -1.9020178), + (0.28040245, -1.8858782), + (0.28080246, -1.8685476), + (0.28120247, -1.8500365), + (0.28160247, -1.830357), + (0.28200248, -1.8095212), + (0.2824025, -1.7875426), + (0.2828025, -1.7644348), + (0.2832025, -1.7402126), + (0.2836025, -1.7148912), + (0.2840025, -1.6884866), + (0.28440252, -1.6610154), + (0.28480253, -1.6324952), + (0.28520253, -1.6029437), + (0.28560254, -1.5723797), + (0.28600255, -1.5408226), + (0.28640255, -1.5082922), + (0.28680256, -1.4748092), + (0.28720257, -1.4403919), + (0.28760257, -1.4050674), + (0.28800258, -1.3688555), + (0.2884026, -1.3317788), + (0.2888026, -1.293861), + (0.2892026, -1.2551259), + (0.2896026, -1.215598), + (0.2900026, -1.1753024), + (0.29040262, -1.1342642), + (0.29080263, -1.0925097), + (0.29120263, -1.0500652), + (0.29160264, -1.0069573), + (0.29200265, -0.96321344), + (0.29240265, -0.91886115), + (0.29280266, -0.8739285), + (0.29320267, -0.82844377), + (0.29360268, -0.78243583), + (0.29400268, -0.7359336), + (0.2944027, -0.6889666), + (0.2948027, -0.64156437), + (0.2952027, -0.5937569), + (0.2956027, -0.5455744), + (0.29600272, -0.49704733), + (0.29640272, -0.44820628), + (0.29680273, -0.39908212), + (0.29720274, -0.34970587), + (0.29760274, -0.30010876), + (0.29800275, -0.25032207), + (0.29840276, -0.20037727), + (0.29880276, -0.1503059), + (0.29920277, -0.100139596), + (0.29960278, -4.9910035e-2), + (0.30000278, 3.5104755e-4), + (0.3004028, 5.061191e-2), + (0.3008028, 0.10084081), + (0.3012028, 0.151006), + (0.3016028, 0.20107582), + (0.30200282, 0.25101864), + (0.30240282, 0.3008029), + (0.30280283, 0.35039714), + (0.30320284, 0.39977008), + (0.30360284, 0.44889048), + (0.30400285, 0.49772736), + (0.30440286, 0.54624987), + (0.30480286, 0.59442735), + (0.30520287, 0.6422293), + (0.30560288, 0.6896257), + (0.3060029, 0.7365864), + (0.3064029, 0.7830819), + (0.3068029, 0.8290828), + (0.3072029, 0.87455994), + (0.3076029, 0.9194847), + (0.30800292, 0.9638287), + (0.30840293, 1.0075638), + (0.30880293, 1.0506626), + (0.30920294, 1.093101), + (0.30960295, 1.1348456), + (0.31000295, 1.1758734), + (0.31040296, 1.2161585), + (0.31080297, 1.2556754), + (0.31120297, 1.2943991), + (0.31160298, 1.3323053), + (0.312003, 1.36937), + (0.312403, 1.4055697), + (0.312803, 1.4408816), + (0.313203, 1.4752833), + (0.313603, 1.5087532), + (0.31400302, 1.5412701), + (0.31440303, 1.5728135), + (0.31480303, 1.6033634), + (0.31520304, 1.6329006), + (0.31560305, 1.6614064), + (0.31600305, 1.6888628), + (0.31640306, 1.7152524), + (0.31680307, 1.7405585), + (0.31720307, 1.7647653), + (0.31760308, 1.7878574), + (0.3180031, 1.8098202), + (0.3184031, 1.8306398), + (0.3188031, 1.8503032), + (0.3192031, 1.8687978), + (0.31960312, 1.886112), + (0.32000312, 1.9022348), + (0.32040313, 1.9171561), + (0.32080314, 1.9308665), + (0.32120314, 1.9433572), + (0.32160315, 1.9546204), + (0.32200316, 1.9646491), + (0.32240316, 1.9734367), + (0.32280317, 1.9809779), + (0.32320318, 1.9872677), + (0.32360318, 1.9923024), + (0.3240032, 1.9960786), + (0.3244032, 1.998594), + (0.3248032, 1.9998472), + (0.3252032, 1.9998369), + (0.32560322, 1.9985636), + (0.32600322, 1.996028), + (0.32640323, 1.9922315), + (0.32680324, 1.9871767), + (0.32720324, 1.9808666), + (0.32760325, 1.9733053), + (0.32800326, 1.9644977), + (0.32840326, 1.9544492), + (0.32880327, 1.9431661), + (0.32920328, 1.9306557), + (0.32960328, 1.9169259), + (0.3300033, 1.9019852), + (0.3304033, 1.8858432), + (0.3308033, 1.8685085), + (0.3312033, 1.8499949), + (0.33160332, 1.8303128), + (0.33200333, 1.8094747), + (0.33240333, 1.7874936), + (0.33280334, 1.7643833), + (0.33320335, 1.7401587), + (0.33360335, 1.7148349), + (0.33400336, 1.6884279), + (0.33440337, 1.6609545), + (0.33480337, 1.632432), + (0.33520338, 1.6028782), + (0.3356034, 1.5723121), + (0.3360034, 1.5407529), + (0.3364034, 1.5082204), + (0.3368034, 1.4747353), + (0.3372034, 1.4403187), + (0.33760342, 1.4049923), + (0.33800343, 1.3687785), + (0.33840343, 1.3317001), + (0.33880344, 1.2937804), + (0.33920345, 1.2550437), + (0.33960345, 1.2155142), + (0.34000346, 1.1752169), + (0.34040347, 1.1341773), + (0.34080347, 1.0924213), + (0.34120348, 1.0499753), + (0.3416035, 1.0068661), + (0.3420035, 0.96312094), + (0.3424035, 0.9187674), + (0.3428035, 0.87383354), + (0.3432035, 0.8283477), + (0.34360352, 0.7823387), + (0.34400353, 0.7358355), + (0.34440354, 0.6888675), + (0.34480354, 0.6414644), + (0.34520355, 0.5936561), + (0.34560356, 0.54547286), + (0.34600356, 0.49694508), + (0.34640357, 0.4481034), + (0.34680358, 0.39897868), + (0.34720358, 0.34960195), + (0.3476036, 0.3000044), + (0.3480036, 0.25021735), + (0.3484036, 0.20027225), + (0.3488036, 0.15020065), + (0.34920362, 0.10003417), + (0.34960362, 4.9804512e-2), + (0.35000363, -4.566034e-4), + (0.35040364, -5.0717432e-2), + (0.35080364, -0.100946225), + (0.35120365, -0.15111126), + (0.35160366, -0.20118085), + (0.35200366, -0.25112334), + (0.35240367, -0.30090722), + (0.35280368, -0.35050482), + (0.35320368, -0.39987722), + (0.3536037, -0.44899708), + (0.3540037, -0.4978333), + (0.3544037, -0.54635507), + (0.3548037, -0.5945318), + (0.35520372, -0.6423329), + (0.35560372, -0.6897283), + (0.35600373, -0.7366881), + (0.35640374, -0.78318256), + (0.35680375, -0.82918227), + (0.35720375, -0.8746583), + (0.35760376, -0.91958183), + (0.35800377, -0.9639245), + (0.35840377, -1.0076584), + (0.35880378, -1.0507557), + (0.3592038, -1.0931894), + (0.3596038, -1.1349325), + (0.3600038, -1.1759588), + (0.3604038, -1.2162423), + (0.3608038, -1.2557576), + (0.36120382, -1.2944796), + (0.36160383, -1.3323841), + (0.36200383, -1.369447), + (0.36240384, -1.4056448), + (0.36280385, -1.4409548), + (0.36320385, -1.4753546), + (0.36360386, -1.5088226), + (0.36400387, -1.5413374), + (0.36440387, -1.5728787), + (0.36480388, -1.6034266), + (0.3652039, -1.6329616), + (0.3656039, -1.6614652), + (0.3660039, -1.6889193), + (0.3664039, -1.7153066), + (0.3668039, -1.7406105), + (0.36720392, -1.764815), + (0.36760393, -1.7879047), + (0.36800393, -1.8098651), + (0.36840394, -1.8306823), + (0.36880395, -1.8503432), + (0.36920395, -1.8688353), + (0.36960396, -1.886147), + (0.37000397, -1.9022673), + (0.37040398, -1.9171861), + (0.37080398, -1.9308939), + (0.371204, -1.9433821), + (0.371604, -1.9546428), + (0.372004, -1.9646688), + (0.372404, -1.9734539), + (0.37280402, -1.9809924), + (0.37320402, -1.9872797), + (0.37360403, -1.9923117), + (0.37400404, -1.9960853), + (0.37440404, -1.998598), + (0.37480405, -1.9998485), + (0.37520406, -1.9998356), + (0.37560406, -1.9985595), + (0.37600407, -1.996021), + (0.37640408, -1.9922218), + (0.37680408, -1.9871643), + (0.3772041, -1.9808515), + (0.3776041, -1.9732876), + (0.3780041, -1.9644772), + (0.3784041, -1.9544259), + (0.37880412, -1.9431403), + (0.37920412, -1.9306272), + (0.37960413, -1.9168947), + (0.38000414, -1.9019513), + (0.38040414, -1.8858067), + (0.38080415, -1.8684709), + (0.38120416, -1.8499548), + (0.38160416, -1.8302703), + (0.38200417, -1.8094296), + (0.38240418, -1.7874461), + (0.3828042, -1.7643336), + (0.3832042, -1.7401067), + (0.3836042, -1.7147806), + (0.3840042, -1.6883714), + (0.3844042, -1.6608957), + (0.38480422, -1.632371), + (0.38520423, -1.6028152), + (0.38560423, -1.5722469), + (0.38600424, -1.5406855), + (0.38640425, -1.508151), + (0.38680425, -1.474664), + (0.38720426, -1.4402454), + (0.38760427, -1.4049171), + (0.38800427, -1.3687015), + (0.38840428, -1.3316213), + (0.3888043, -1.2937), + (0.3892043, -1.2549615), + (0.3896043, -1.2154304), + (0.3900043, -1.1751316), + (0.3904043, -1.1340904), + (0.39080432, -1.092333), + (0.39120433, -1.0498855), + (0.39160433, -1.0067749), + (0.39200434, -0.96302843), + (0.39240435, -0.91867363), + (0.39280435, -0.8737386), + (0.39320436, -0.8282516), + (0.39360437, -0.7822415), + (0.39400437, -0.7357373), + (0.39440438, -0.6887684), + (0.3948044, -0.6413644), + (0.3952044, -0.59355533), + (0.3956044, -0.54537135), + (0.3960044, -0.49684283), + (0.39640442, -0.44800055), + (0.39680442, -0.3988715), + (0.39720443, -0.34949428), + (0.39760444, -0.29989627), + (0.39800444, -0.25010884), + (0.39840445, -0.20016342), + (0.39880446, -0.15009159), + (0.39920446, -9.992494e-2), + (0.39960447, -4.9695175e-2), + (0.40000448, 5.659739e-4), + (0.40040448, 5.0826766e-2), + (0.4008045, 0.10105546), + (0.4012045, 0.15122032), + (0.4016045, 0.20128965), + (0.4020045, 0.25123185), + (0.40240452, 0.30101538), + (0.40280452, 0.35060874), + (0.40320453, 0.39998066), + (0.40360454, 0.44909993), + (0.40400454, 0.49793553), + (0.40440455, 0.54645663), + (0.40480456, 0.59463257), + (0.40520456, 0.64243287), + (0.40560457, 0.68982744), + (0.40600458, 0.73678625), + (0.40640458, 0.78327966), + (0.4068046, 0.82927835), + (0.4072046, 0.87475324), + (0.4076046, 0.9196756), + (0.4080046, 0.96401703), + (0.40840462, 1.0077496), + (0.40880463, 1.0508455), + (0.40920463, 1.0932778), + (0.40960464, 1.1350194), + (0.41000465, 1.1760442), + (0.41040465, 1.2163261), + (0.41080466, 1.2558397), + (0.41120467, 1.2945601), + (0.41160467, 1.3324628), + (0.41200468, 1.3695239), + (0.4124047, 1.4057199), + (0.4128047, 1.441028), + (0.4132047, 1.4754258), + (0.4136047, 1.5088918), + (0.4140047, 1.5414046), + (0.41440472, 1.5729439), + (0.41480473, 1.6034896), + (0.41520473, 1.6330225), + (0.41560474, 1.6615239), + (0.41600475, 1.6889758), + (0.41640475, 1.7153609), + (0.41680476, 1.7406625), + (0.41720477, 1.7648647), + (0.41760477, 1.787952), + (0.41800478, 1.80991), + (0.4184048, 1.8307248), + (0.4188048, 1.8503847), + (0.4192048, 1.8688743), + (0.4196048, 1.8861834), + (0.4200048, 1.9023011), + (0.42040482, 1.9172173), + (0.42080483, 1.9309224), + (0.42120484, 1.9434079), + (0.42160484, 1.9546659), + (0.42200485, 1.9646893), + (0.42240486, 1.9734716), + (0.42280486, 1.9810075), + (0.42320487, 1.9872919), + (0.42360488, 1.9923213), + (0.42400488, 1.9960921), + (0.4244049, 1.9986022), + (0.4248049, 1.9998498), + (0.4252049, 1.9998342), + (0.4256049, 1.9985555), + (0.42600492, 1.9960144), + (0.42640492, 1.9922125), + (0.42680493, 1.9871523), + (0.42720494, 1.9808369), + (0.42760494, 1.9732703), + (0.42800495, 1.9644574), + (0.42840496, 1.9544035), + (0.42880496, 1.9431152), + (0.42920497, 1.9305997), + (0.42960498, 1.9168645), + (0.43000498, 1.9019186), + (0.430405, 1.8857715), + (0.430805, 1.8684332), + (0.431205, 1.8499147), + (0.431605, 1.8302277), + (0.43200502, 1.8093847), + (0.43240502, 1.7873988), + (0.43280503, 1.7642839), + (0.43320504, 1.7400546), + (0.43360505, 1.7147262), + (0.43400505, 1.6883148), + (0.43440506, 1.6608369), + (0.43480507, 1.6323099), + (0.43520507, 1.602752), + (0.43560508, 1.5721817), + (0.4360051, 1.5406183), + (0.4364051, 1.5080818), + (0.4368051, 1.4745927), + (0.4372051, 1.4401722), + (0.4376051, 1.404842), + (0.43800512, 1.3686246), + (0.43840513, 1.3315425), + (0.43880513, 1.2936195), + (0.43920514, 1.2548794), + (0.43960515, 1.2153466), + (0.44000515, 1.1750461), + (0.44040516, 1.1340003), + (0.44080517, 1.0922413), + (0.44120517, 1.0497924), + (0.44160518, 1.0066804), + (0.4420052, 0.9629326), + (0.4424052, 0.9185765), + (0.4428052, 0.8736402), + (0.4432052, 0.82815206), + (0.4436052, 0.78214085), + (0.44400522, 0.73563564), + (0.44440523, 0.6886657), + (0.44480523, 0.6412608), + (0.44520524, 0.5934509), + (0.44560525, 0.5452661), + (0.44600525, 0.4967369), + (0.44640526, 0.44789395), + (0.44680527, 0.39876807), + (0.44720528, 0.34939033), + (0.44760528, 0.2997919), + (0.4480053, 0.2500041), + (0.4484053, 0.2000584), + (0.4488053, 0.14998633), + (0.4492053, 9.981951e-2), + (0.44960532, 4.9589653e-2), + (0.45000532, -6.715298e-4), + (0.45040533, -5.093229e-2), + (0.45080534, -0.10116088), + (0.45120534, -0.15132557), + (0.45160535, -0.20139468), + (0.45200536, -0.25133657), + (0.45240536, -0.30111971), + (0.45280537, -0.35071266), + (0.45320538, -0.40008408), + (0.45360538, -0.4492028), + (0.4540054, -0.49803776), + (0.4544054, -0.54655814), + (0.4548054, -0.5947333), + (0.4552054, -0.6425328), + (0.45560542, -0.6899265), + (0.45600542, -0.73688436), + (0.45640543, -0.7833768), + (0.45680544, -0.8293744), + (0.45720544, -0.8748481), + (0.45760545, -0.9197693), + (0.45800546, -0.9641095), + (0.45840546, -1.0078408), + (0.45880547, -1.0509354), + (0.45920548, -1.0933661), + (0.4596055, -1.1351063), + (0.4600055, -1.1761296), + (0.4604055, -1.2164099), + (0.4608055, -1.2559218), + (0.4612055, -1.2946405), + (0.46160552, -1.3325415), + (0.46200553, -1.3696008), + (0.46240553, -1.4057977), + (0.46280554, -1.4411038), + (0.46320555, -1.4754996), + (0.46360555, -1.5089636), + (0.46400556, -1.5414743), + (0.46440557, -1.5730115), + (0.46480557, -1.603555), + (0.46520558, -1.6330856), + (0.4656056, -1.6615847), + (0.4660056, -1.6890345), + (0.4664056, -1.7154171), + (0.4668056, -1.7407163), + (0.4672056, -1.7649161), + (0.46760562, -1.7880011), + (0.46800563, -1.8099566), + (0.46840563, -1.8307688), + (0.46880564, -1.8504248), + (0.46920565, -1.8689119), + (0.46960565, -1.8862185), + (0.47000566, -1.9023337), + (0.47040567, -1.9172473), + (0.47080567, -1.9309499), + (0.47120568, -1.9434329), + (0.4716057, -1.9546883), + (0.4720057, -1.964709), + (0.4724057, -1.9734887), + (0.4728057, -1.9810219), + (0.47320572, -1.9873039), + (0.47360572, -1.9923304), + (0.47400573, -1.9960986), + (0.47440574, -1.9986061), + (0.47480574, -1.9998511), + (0.47520575, -1.9998329), + (0.47560576, -1.9985515), + (0.47600576, -1.9960077), + (0.47640577, -1.9922032), + (0.47680578, -1.9871403), + (0.47720578, -1.9808223), + (0.4776058, -1.9732531), + (0.4780058, -1.9644376), + (0.4784058, -1.9543811), + (0.4788058, -1.9430903), + (0.47920582, -1.930572), + (0.47960582, -1.9168345), + (0.48000583, -1.9018861), + (0.48040584, -1.8857363), + (0.48080584, -1.8683956), + (0.48120585, -1.8498746), + (0.48160586, -1.8301852), + (0.48200586, -1.8093398), + (0.48240587, -1.7873515), + (0.48280588, -1.7642342), + (0.48320588, -1.7400026), + (0.4836059, -1.714672), + (0.4840059, -1.6882582), + (0.4844059, -1.6607759), + (0.4848059, -1.6322467), + (0.48520592, -1.6026865), + (0.48560593, -1.572114), + (0.48600593, -1.5405486), + (0.48640594, -1.5080099), + (0.48680595, -1.4745188), + (0.48720595, -1.4400963), + (0.48760596, -1.4047642), + (0.48800597, -1.3685448), + (0.48840597, -1.331461), + (0.48880598, -1.2935361), + (0.489206, -1.2547941), + (0.489606, -1.2152597), + (0.490006, -1.1749576), + (0.490406, -1.1339134), + (0.490806, -1.0921528), + (0.49120602, -1.0497025), + (0.49160603, -1.0065892), + (0.49200603, -0.96284), + (0.49240604, -0.9184827), + (0.49280605, -0.8735452), + (0.49320605, -0.828056), + (0.49360606, -0.7820437), + (0.49400607, -0.73553747), + (0.49440607, -0.6885666), + (0.49480608, -0.64116085), + (0.4952061, -0.5933501), + (0.4956061, -0.5451645), + (0.4960061, -0.49663466), + (0.4964061, -0.44779107), + (0.49680611, -0.39866465), + (0.49720612, -0.3492864), + (0.49760613, -0.29968753), + (0.49800614, -0.24989937), + (0.49840614, -0.19995338), + (0.49880615, -0.14988106), + (0.49920616, -9.971409e-2), + (0.49960616, -4.948413e-2), + (0.50000614, 7.7327096e-4), + (0.50040615, 5.1033996e-2), + (0.50080615, 0.10126249), + (0.50120616, 0.15142702), + (0.50160617, 0.2014959), + (0.5020062, 0.25143752), + (0.5024062, 0.3012203), + (0.5028062, 0.35081282), + (0.5032062, 0.40018377), + (0.5036062, 0.44930193), + (0.5040062, 0.4981363), + (0.5044062, 0.546656), + (0.5048062, 0.59483045), + (0.5052062, 0.6426292), + (0.50560623, 0.690022), + (0.50600624, 0.73698246), + (0.50640625, 0.7834739), + (0.50680625, 0.82947046), + (0.50720626, 0.8749431), + (0.50760627, 0.91986305), + (0.5080063, 0.964202), + (0.5084063, 1.0079318), + (0.5088063, 1.0510252), + (0.5092063, 1.0934545), + (0.5096063, 1.1351901), + (0.5100063, 1.1762149), + (0.5104063, 1.2164906), + (0.5108063, 1.256004), + (0.5112063, 1.2947181), + (0.51160634, 1.3326203), + (0.51200634, 1.3696749), + (0.51240635, 1.4058701), + (0.51280636, 1.4411718), + (0.51320636, 1.4755684), + (0.51360637, 1.5090278), + (0.5140064, 1.5415392), + (0.5144064, 1.573072), + (0.5148064, 1.6036158), + (0.5152064, 1.6331422), + (0.5156064, 1.6616414), + (0.5160064, 1.6890868), + (0.5164064, 1.7154695), + (0.5168064, 1.7407683), + (0.51720643, 1.764964), + (0.51760644, 1.7880483), + (0.51800644, 1.8099998), + (0.51840645, 1.8308114), + (0.51880646, 1.8504634), + (0.51920646, 1.8689494), + (0.5196065, 1.8862523), + (0.5200065, 1.9023663), + (0.5204065, 1.9172763), + (0.5208065, 1.9309775), + (0.5212065, 1.9434569), + (0.5216065, 1.9547106), + (0.5220065, 1.964728), + (0.5224065, 1.9735059), + (0.5228065, 1.981036), + (0.52320653, 1.9873157), + (0.52360654, 1.9923394), + (0.52400655, 1.9961053), + (0.52440655, 1.9986099), + (0.52480656, 1.9998523), + (0.52520657, 1.9998316), + (0.5256066, 1.9985474), + (0.5260066, 1.9960012), + (0.5264066, 1.9921939), + (0.5268066, 1.9871289), + (0.5272066, 1.9808078), + (0.5276066, 1.9732366), + (0.5280066, 1.9644177), + (0.5284066, 1.9543595), + (0.5288066, 1.9430653), + (0.52920663, 1.9305454), + (0.52960664, 1.9168043), + (0.53000665, 1.9018546), + (0.53040665, 1.8857012), + (0.53080666, 1.8683592), + (0.53120667, 1.8498344), + (0.5316067, 1.8301442), + (0.5320067, 1.8092948), + (0.5324067, 1.7873058), + (0.5328067, 1.7641845), + (0.5332067, 1.7399524), + (0.5336067, 1.7146176), + (0.5340067, 1.6882037), + (0.5344067, 1.6607193), + (0.5348067, 1.6321901), + (0.53520674, 1.6026257), + (0.53560674, 1.5720536), + (0.53600675, 1.5404836), + (0.53640676, 1.5079455), + (0.53680676, 1.4744501), + (0.53720677, 1.4400283), + (0.5376068, 1.4046918), + (0.5380068, 1.3684734), + (0.5384068, 1.331385), + (0.5388068, 1.2934556), + (0.5392068, 1.254715), + (0.5396068, 1.2151759), + (0.5400068, 1.1748753), + (0.5404068, 1.1338264), + (0.54080683, 1.0920676), + (0.54120684, 1.0496128), + (0.54160684, 1.0065013), + (0.54200685, 0.9627475), + (0.54240686, 0.91839236), + (0.54280686, 0.8734503), + (0.5432069, 0.82796335), + (0.5436069, 0.78194654), + (0.5440069, 0.7354429), + (0.5444069, 0.6884675), + (0.5448069, 0.64106447), + (0.5452069, 0.59324926), + (0.5456069, 0.54506665), + (0.5460069, 0.4965324), + (0.5464069, 0.44769192), + (0.54680693, 0.3985612), + (0.54720694, 0.3491862), + (0.54760695, 0.29958317), + (0.54800695, 0.24979843), + (0.54840696, 0.19984834), + (0.54880697, 0.1497796), + (0.549207, 9.960867e-2), + (0.549607, 4.938242e-2), + (0.550007, -8.826415e-4), + (0.550407, -5.113952e-2), + (0.550807, -0.10137172), + (0.551207, -0.15153226), + (0.551607, -0.20160471), + (0.552007, -0.25154224), + (0.552407, -0.30132842), + (0.55280703, -0.35091674), + (0.55320704, -0.40029094), + (0.55360705, -0.44940478), + (0.55400705, -0.49824223), + (0.55440706, -0.5467576), + (0.55480707, -0.5949349), + (0.5552071, -0.64272916), + (0.5556071, -0.69012463), + (0.5560071, -0.73707706), + (0.5564071, -0.783571), + (0.5568071, -0.829563), + (0.5572071, -0.87503797), + (0.5576071, -0.91995335), + (0.5580071, -0.96429443), + (0.5584071, -1.0080198), + (0.55880713, -1.0511149), + (0.55920714, -1.0935397), + (0.55960715, -1.1352801), + (0.56000715, -1.1762972), + (0.56040716, -1.2165774), + (0.56080717, -1.2560891), + (0.5612072, -1.2948015), + (0.5616072, -1.3327018), + (0.5620072, -1.3697547), + (0.5624072, -1.4059478), + (0.5628072, -1.4412476), + (0.5632072, -1.4756422), + (0.5636072, -1.5090996), + (0.5640072, -1.5416088), + (0.5644072, -1.5731394), + (0.56480724, -1.6036812), + (0.56520724, -1.6332053), + (0.56560725, -1.6617023), + (0.56600726, -1.6891454), + (0.56640726, -1.7155256), + (0.56680727, -1.7408185), + (0.5672073, -1.7650154), + (0.5676073, -1.7880939), + (0.5680073, -1.8100463), + (0.5684073, -1.8308523), + (0.5688073, -1.8505049), + (0.5692073, -1.8689857), + (0.5696073, -1.8862886), + (0.5700073, -1.9023976), + (0.57040733, -1.9173074), + (0.57080734, -1.9310039), + (0.57120734, -1.9434828), + (0.57160735, -1.9547322), + (0.57200736, -1.9647485), + (0.57240736, -1.9735223), + (0.5728074, -1.981051), + (0.5732074, -1.9873271), + (0.5736074, -1.9923489), + (0.5740074, -1.9961116), + (0.5744074, -1.998614), + (0.5748074, -1.9998536), + (0.5752074, -1.9998301), + (0.5756074, -1.9985436), + (0.5760074, -1.9959943), + (0.57640743, -1.9921849), + (0.57680744, -1.9871165), + (0.57720745, -1.9807937), + (0.57760745, -1.9732187), + (0.57800746, -1.9643986), + (0.57840747, -1.9543363), + (0.5788075, -1.9430412), + (0.5792075, -1.930517), + (0.5796075, -1.9167752), + (0.5800075, -1.9018208), + (0.5804075, -1.8856673), + (0.5808075, -1.8683202), + (0.5812075, -1.8497958), + (0.5816075, -1.8301), + (0.5820075, -1.8092514), + (0.58240753, -1.7872567), + (0.58280754, -1.764133), + (0.58320755, -1.7398984), + (0.58360755, -1.7145612), + (0.58400756, -1.688145), + (0.58440757, -1.6606584), + (0.5848076, -1.6321269), + (0.5852076, -1.6025603), + (0.5856076, -1.5719858), + (0.5860076, -1.5404139), + (0.5864076, -1.5078738), + (0.5868076, -1.4743762), + (0.5872076, -1.4399525), + (0.5876076, -1.404614), + (0.5880076, -1.3683937), + (0.58840764, -1.3313034), + (0.58880764, -1.293378), + (0.58920765, -1.2546297), + (0.58960766, -1.215095), + (0.59000766, -1.1747867), + (0.59040767, -1.1337426), + (0.5908077, -1.091976), + (0.5912077, -1.0495261), + (0.5916077, -1.0064068), + (0.5920077, -0.96265835), + (0.5924077, -0.9182952), + (0.5928077, -0.8733587), + (0.5932077, -0.8278638), + (0.5936077, -0.7818529), + (0.59400773, -0.73534113), + (0.59440774, -0.688372), + (0.59480774, -0.6409609), + (0.59520775, -0.5931521), + (0.59560776, -0.5449614), + (0.59600776, -0.49643385), + (0.5964078, -0.4475853), + (0.5968078, -0.3984615), + (0.5972078, -0.34907854), + (0.5976078, -0.29948258), + (0.5980078, -0.24968992), + (0.5984078, -0.19974712), + (0.5988078, -0.14967054), + (0.5992078, -9.950705e-2), + (0.5996078, -4.927308e-2), + (0.60000783, 9.843827e-4), + (0.60040784, 5.1248852e-2), + (0.60080785, 0.10147333), + (0.60120785, 0.15164132), + (0.60160786, 0.20170593), + (0.60200787, 0.25165072), + (0.6024079, 0.301429), + (0.6028079, 0.35102442), + (0.6032079, 0.4003906), + (0.6036079, 0.44951135), + (0.6040079, 0.49834076), + (0.6044079, 0.5468628), + (0.6048079, 0.5950393), + (0.6052079, 0.6428327), + (0.6056079, 0.69022727), + (0.60600793, 0.73717874), + (0.60640794, 0.7836717), + (0.60680795, 0.82966256), + (0.60720795, 0.8751363), + (0.60760796, 0.9200505), + (0.60800797, 0.9643903), + (0.608408, 1.0081142), + (0.608808, 1.051208), + (0.609208, 1.0936313), + (0.609608, 1.1353701), + (0.610008, 1.1763856), + (0.610408, 1.2166643), + (0.610808, 1.2561682), + (0.611208, 1.2948848), + (0.611608, 1.3327776), + (0.61200804, 1.3698343), + (0.61240804, 1.4060202), + (0.61280805, 1.4413234), + (0.61320806, 1.4757109), + (0.61360806, 1.5091714), + (0.61400807, 1.5416737), + (0.6144081, 1.573207), + (0.6148081, 1.6037419), + (0.6152081, 1.6332685), + (0.6156081, 1.6617589), + (0.6160081, 1.689204), + (0.6164081, 1.715578), + (0.6168081, 1.7408723), + (0.6172081, 1.7650633), + (0.61760813, 1.7881429), + (0.61800814, 1.8100896), + (0.61840814, 1.8308963), + (0.61880815, 1.8505435), + (0.61920816, 1.8690246), + (0.61960816, 1.8863225), + (0.6200082, 1.9024315), + (0.6204082, 1.9173363), + (0.6208082, 1.9310324), + (0.6212082, 1.9435067), + (0.6216082, 1.9547553), + (0.6220082, 1.9647675), + (0.6224082, 1.9735401), + (0.6228082, 1.9810649), + (0.6232082, 1.9873394), + (0.62360823, 1.9923579), + (0.62400824, 1.9961184), + (0.62440825, 1.9986178), + (0.62480825, 1.9998549), + (0.62520826, 1.9998288), + (0.62560827, 1.9985394), + (0.6260083, 1.9959879), + (0.6264083, 1.9921752), + (0.6268083, 1.987104), + (0.6272083, 1.9807786), + (0.6276083, 1.9732009), + (0.6280083, 1.9643781), + (0.6284083, 1.954313), + (0.6288083, 1.9430152), + (0.6292083, 1.9304883), + (0.62960833, 1.916744), + (0.63000834, 1.9017869), + (0.63040835, 1.8856308), + (0.63080835, 1.8682812), + (0.63120836, 1.8497542), + (0.63160837, 1.830056), + (0.6320084, 1.8092048), + (0.6324084, 1.7872076), + (0.6328084, 1.764085), + (0.6332084, 1.7398446), + (0.6336084, 1.7145089), + (0.6340084, 1.6880864), + (0.6344084, 1.6606016), + (0.6348084, 1.6320637), + (0.6352084, 1.6024994), + (0.63560843, 1.5719182), + (0.63600844, 1.540349), + (0.63640845, 1.5078019), + (0.63680845, 1.4743074), + (0.63720846, 1.4398766), + (0.63760847, 1.4045415), + (0.6380085, 1.3683138), + (0.6384085, 1.3312274), + (0.6388085, 1.2932945), + (0.6392085, 1.2545506), + (0.6396085, 1.2150081), + (0.6400085, 1.1747044), + (0.6404085, 1.1336524), + (0.6408085, 1.0918908), + (0.6412085, 1.049433), + (0.64160854, 1.0063188), + (0.64200854, 0.9625625), + (0.64240855, 0.9182048), + (0.64280856, 0.8732604), + (0.64320856, 0.8277712), + (0.64360857, 0.7817522), + (0.6440086, 0.73524654), + (0.6444086, 0.6882693), + (0.6448086, 0.6408645), + (0.6452086, 0.5930477), + (0.6456086, 0.5448635), + (0.6460086, 0.4963279), + (0.6464086, 0.44748616), + (0.6468086, 0.39835432), + (0.64720863, 0.34897834), + (0.64760864, 0.29937443), + (0.64800864, 0.24958897), + (0.64840865, 0.19963829), + (0.64880866, 0.14956148), + (0.64920866, 9.9397816e-2), + (0.6496087, 4.9163744e-2), + (0.6500087, -1.0937531e-3), + (0.6504087, -5.135819e-2), + (0.6508087, -0.10158256), + (0.6512087, -0.15175039), + (0.6516087, -0.20181474), + (0.6520087, -0.25175923), + (0.6524087, -0.30153713), + (0.6528087, -0.3511321), + (0.65320873, -0.40049776), + (0.65360874, -0.44961792), + (0.65400875, -0.49844667), + (0.65440875, -0.546968), + (0.65480876, -0.59513646), + (0.65520877, -0.6429363), + (0.6556088, -0.69032276), + (0.6560088, -0.7372804), + (0.6564088, -0.78376526), + (0.6568088, -0.82976204), + (0.6572088, -0.8752278), + (0.6576088, -0.9201476), + (0.6580088, -0.9644794), + (0.6584088, -1.0082086), + (0.6588088, -1.0512946), + (0.65920883, -1.0937228), + (0.65960884, -1.1354539), + (0.66000885, -1.1764741), + (0.66040885, -1.216745), + (0.66080886, -1.2562534), + (0.66120887, -1.2949624), + (0.6616089, -1.3328592), + (0.6620089, -1.3699085), + (0.6624089, -1.406098), + (0.6628089, -1.4413939), + (0.6632089, -1.4757847), + (0.6636089, -1.5092381), + (0.6640089, -1.5417433), + (0.6644089, -1.5732698), + (0.6648089, -1.6038073), + (0.66520894, -1.6333271), + (0.66560894, -1.6618198), + (0.66600895, -1.6892585), + (0.66640896, -1.7156342), + (0.66680896, -1.7409223), + (0.66720897, -1.7651147), + (0.667609, -1.7881885), + (0.668009, -1.8101362), + (0.668409, -1.8309373), + (0.668809, -1.850585), + (0.669209, -1.8690609), + (0.669609, -1.8863589), + (0.670009, -1.9024628), + (0.670409, -1.9173675), + (0.67080903, -1.9310609), + (0.67120904, -1.9435326), + (0.67160904, -1.9547784), + (0.67200905, -1.964788), + (0.67240906, -1.9735578), + (0.67280906, -1.9810799), + (0.6732091, -1.9873518), + (0.6736091, -1.9923674), + (0.6740091, -1.9961252), + (0.6744091, -1.9986218), + (0.6748091, -1.9998562), + (0.6752091, -1.9998274), + (0.6756091, -1.9985352), + (0.6760091, -1.995981), + (0.6764091, -1.9921656), + (0.67680913, -1.9870925), + (0.67720914, -1.9807634), + (0.67760915, -1.9731842), + (0.67800915, -1.9643575), + (0.67840916, -1.9542915), + (0.67880917, -1.9429893), + (0.6792092, -1.9304618), + (0.6796092, -1.9167128), + (0.6800092, -1.9017553), + (0.6804092, -1.8855944), + (0.6808092, -1.8682449), + (0.6812092, -1.8497126), + (0.6816092, -1.830015), + (0.6820092, -1.8091582), + (0.6824092, -1.787162), + (0.68280923, -1.7640334), + (0.68320924, -1.7397944), + (0.68360925, -1.7144526), + (0.68400925, -1.6880318), + (0.68440926, -1.6605407), + (0.68480927, -1.632005), + (0.6852093, -1.6024339), + (0.6856093, -1.5718554), + (0.6860093, -1.5402793), + (0.6864093, -1.507735), + (0.6868093, -1.4742335), + (0.6872093, -1.439806), + (0.6876093, -1.4044636), + (0.6880093, -1.3682396), + (0.6884093, -1.3311459), + (0.68880934, -1.293217), + (0.68920934, -1.2544653), + (0.68960935, -1.2149273), + (0.69000936, -1.1746159), + (0.69040936, -1.1335686), + (0.69080937, -1.0917991), + (0.6912094, -1.0493463), + (0.6916094, -1.0062243), + (0.6920094, -0.9624666), + (0.6924094, -0.9181076), + (0.6928094, -0.873162), + (0.6932094, -0.82767165), + (0.6936094, -0.78165156), + (0.6940094, -0.7351448), + (0.69440943, -0.6881666), + (0.69480944, -0.6407609), + (0.69520944, -0.5929432), + (0.69560945, -0.5447583), + (0.69600946, -0.49622196), + (0.69640946, -0.44737956), + (0.6968095, -0.39824715), + (0.6972095, -0.34887066), + (0.6976095, -0.2992663), + (0.6980095, -0.24948046), + (0.6984095, -0.19952947), + (0.6988095, -0.14946003), + (0.6992095, -9.9288575e-2), + (0.6996095, -4.9062036e-2), + (0.7000095, 1.2031237e-3), + (0.70040953, 5.1459894e-2), + (0.70080954, 0.10169179), + (0.70120955, 0.15185183), + (0.70160955, 0.20192356), + (0.70200956, 0.25186017), + (0.70240957, 0.30164525), + (0.7028096, 0.35123226), + (0.7032096, 0.4006049), + (0.7036096, 0.44971707), + (0.7040096, 0.4985526), + (0.7044096, 0.54706585), + (0.7048096, 0.59524083), + (0.7052096, 0.6430326), + (0.7056096, 0.69042546), + (0.7060096, 0.73737496), + (0.70640963, 0.78386587), + (0.70680964, 0.8298546), + (0.70720965, 0.87532616), + (0.70760965, 0.9202379), + (0.70800966, 0.96457523), + (0.70840967, 1.0082965), + (0.7088097, 1.0513875), + (0.7092097, 1.093808), + (0.7096097, 1.135544), + (0.7100097, 1.1765563), + (0.7104097, 1.2168318), + (0.7108097, 1.2563325), + (0.7112097, 1.2950457), + (0.7116097, 1.3329351), + (0.7120097, 1.3699881), + (0.71240973, 1.4061702), + (0.71280974, 1.4414697), + (0.71320975, 1.4758533), + (0.71360976, 1.5093099), + (0.71400976, 1.541813), + (0.71440977, 1.5733373), + (0.7148098, 1.6038727), + (0.7152098, 1.6333903), + (0.7156098, 1.6618806), + (0.7160098, 1.689317), + (0.7164098, 1.7156904), + (0.7168098, 1.7409762), + (0.7172098, 1.765166), + (0.7176098, 1.7882375), + (0.7180098, 1.8101827), + (0.71840984, 1.8309813), + (0.71880984, 1.8506265), + (0.71920985, 1.8690997), + (0.71960986, 1.8863952), + (0.72000986, 1.9024966), + (0.72040987, 1.9173986), + (0.7208099, 1.9310874), + (0.7212099, 1.9435583), + (0.7216099, 1.9547999), + (0.7220099, 1.9648083), + (0.7224099, 1.9735743), + (0.7228099, 1.981095), + (0.7232099, 1.9873631), + (0.7236099, 1.9923769), + (0.72400993, 1.9961315), + (0.72440994, 1.9986259), + (0.72480994, 1.9998574), + (0.72520995, 1.999826), + (0.72560996, 1.9985313), + (0.72600996, 1.9959741), + (0.72641, 1.9921566), + (0.72681, 1.9870801), + (0.72721, 1.9807494), + (0.72761, 1.9731665), + (0.72801, 1.9643384), + (0.72841, 1.9542682), + (0.72881, 1.9429651), + (0.72921, 1.9304332), + (0.72961, 1.9166838), + (0.73001003, 1.9017215), + (0.73041004, 1.8855605), + (0.73081005, 1.8682058), + (0.73121005, 1.8496739), + (0.73161006, 1.8299707), + (0.73201007, 1.8091148), + (0.7324101, 1.7871128), + (0.7328101, 1.7639855), + (0.7332101, 1.7397404), + (0.7336101, 1.7144002), + (0.7340101, 1.6879731), + (0.7344101, 1.660484), + (0.7348101, 1.6319417), + (0.7352101, 1.6023731), + (0.7356101, 1.5717877), + (0.73601013, 1.5402094), + (0.73641014, 1.5076631), + (0.73681015, 1.4741596), + (0.73721015, 1.43973), + (0.73761016, 1.4043858), + (0.73801017, 1.3681599), + (0.7384102, 1.3310642), + (0.7388102, 1.2931335), + (0.7392102, 1.2543802), + (0.7396102, 1.2148404), + (0.7400102, 1.1745274), + (0.7404102, 1.1334785), + (0.7408102, 1.0917075), + (0.7412102, 1.0492532), + (0.7416102, 1.0061299), + (0.74201024, 0.9623774), + (0.74241024, 0.9180105), + (0.74281025, 0.8730704), + (0.74321026, 0.82757205), + (0.74361026, 0.7815579), + (0.74401027, 0.7350431), + (0.7444103, 0.6880711), + (0.7448103, 0.6406573), + (0.7452103, 0.59284604), + (0.7456103, 0.54465306), + (0.7460103, 0.49612337), + (0.7464103, 0.44727296), + (0.7468103, 0.39814743), + (0.7472103, 0.34876296), + (0.74761033, 0.2991657), + (0.74801034, 0.24937195), + (0.74841034, 0.19942823), + (0.74881035, 0.14935096), + (0.74921036, 9.9186964e-2), + (0.74961036, 4.89527e-2), + (0.7500104, -1.3048649e-3), + (0.7504104, -5.156923e-2), + (0.7508104, -0.10179339), + (0.7512104, -0.15196088), + (0.7516104, -0.20202479), + (0.7520104, -0.25196865), + (0.7524104, -0.30174583), + (0.7528104, -0.3513399), + (0.7532104, -0.4007046), + (0.75361043, -0.44982365), + (0.75401044, -0.49865112), + (0.75441045, -0.54717106), + (0.75481045, -0.595338), + (0.75521046, -0.6431362), + (0.75561047, -0.69052094), + (0.7560105, -0.73747665), + (0.7564105, -0.78395945), + (0.7568105, -0.82995415), + (0.7572105, -0.87541765), + (0.7576105, -0.92033505), + (0.7580105, -0.964671), + (0.7584105, -1.008391), + (0.7588105, -1.0514807), + (0.7592105, -1.0938996), + (0.75961053, -1.1356341), + (0.76001054, -1.1766448), + (0.76041055, -1.2169186), + (0.76081055, -1.2564176), + (0.76121056, -1.2951291), + (0.76161057, -1.3330166), + (0.7620106, -1.3700678), + (0.7624106, -1.4062481), + (0.7628106, -1.4415455), + (0.7632106, -1.4759271), + (0.7636106, -1.5093817), + (0.7640106, -1.5418777), + (0.7644106, -1.5734049), + (0.7648106, -1.6039335), + (0.7652106, -1.6334534), + (0.76561064, -1.6619372), + (0.76601064, -1.6893755), + (0.76641065, -1.7157427), + (0.76681066, -1.74103), + (0.76721066, -1.765214), + (0.76761067, -1.7882864), + (0.7680107, -1.810226), + (0.7684107, -1.8310252), + (0.7688107, -1.850665), + (0.7692107, -1.8691386), + (0.7696107, -1.886429), + (0.7700107, -1.9025303), + (0.7704107, -1.9174275), + (0.7708107, -1.9311159), + (0.77121073, -1.9435823), + (0.77161074, -1.954823), + (0.77201074, -1.9648273), + (0.77241075, -1.973592), + (0.77281076, -1.9811089), + (0.77321076, -1.9873754), + (0.7736108, -1.9923857), + (0.7740108, -1.9961383), + (0.7744108, -1.9986296), + (0.7748108, -1.9998587), + (0.7752108, -1.9998245), + (0.7756108, -1.9985272), + (0.7760108, -1.9959676), + (0.7764108, -1.9921468), + (0.7768108, -1.9870685), + (0.77721083, -1.9807342), + (0.77761084, -1.9731498), + (0.77801085, -1.9643178), + (0.77841085, -1.9542465), + (0.77881086, -1.9429393), + (0.77921087, -1.9304066), + (0.7796109, -1.9166526), + (0.7800109, -1.9016876), + (0.7804109, -1.885524), + (0.7808109, -1.8681668), + (0.7812109, -1.8496323), + (0.7816109, -1.8299266), + (0.7820109, -1.8090682), + (0.7824109, -1.7870637), + (0.7828109, -1.763934), + (0.78321093, -1.7396865), + (0.78361094, -1.7143439), + (0.78401095, -1.6879145), + (0.78441095, -1.660423), + (0.78481096, -1.6318785), + (0.78521097, -1.6023077), + (0.785611, -1.5717201), + (0.786011, -1.5401446), + (0.786411, -1.5075914), + (0.786811, -1.4740908), + (0.787211, -1.4396541), + (0.787611, -1.4043133), + (0.788011, -1.3680801), + (0.788411, -1.3309883), + (0.788811, -1.29305), + (0.78921103, -1.254301), + (0.78961104, -1.2147536), + (0.79001105, -1.174445), + (0.79041106, -1.1333884), + (0.79081106, -1.0916222), + (0.79121107, -1.0491601), + (0.7916111, -1.0060419), + (0.7920111, -0.9622815), + (0.7924111, -0.91792005), + (0.7928111, -0.872972), + (0.7932111, -0.8274794), + (0.7936111, -0.78145725), + (0.7940111, -0.73494846), + (0.7944111, -0.6879684), + (0.7948111, -0.6405609), + (0.79521114, -0.5927416), + (0.79561114, -0.5445552), + (0.79601115, -0.49601743), + (0.79641116, -0.4471738), + (0.79681116, -0.39804026), + (0.79721117, -0.3486628), + (0.7976112, -0.29905757), + (0.7980112, -0.24927099), + (0.7984112, -0.1993194), + (0.7988112, -0.14924951), + (0.7992112, -9.9077724e-2), + (0.7996112, -4.8850987e-2), + (0.8000112, 1.4142354e-3), + (0.8004112, 5.1670935e-2), + (0.80081123, 0.10190263), + (0.80121124, 0.15206233), + (0.80161124, 0.2021336), + (0.80201125, 0.25207716), + (0.80241126, 0.30185392), + (0.80281126, 0.35144758), + (0.8032113, 0.40081176), + (0.8036113, 0.44993022), + (0.8040113, 0.49875703), + (0.8044113, 0.5472762), + (0.8048113, 0.5954424), + (0.8052113, 0.64323974), + (0.8056113, 0.6906236), + (0.8060113, 0.73757833), + (0.8064113, 0.7840601), + (0.80681133, 0.8300536), + (0.80721134, 0.87551594), + (0.80761135, 0.92043215), + (0.80801135, 0.9647601), + (0.80841136, 1.0084854), + (0.80881137, 1.0515672), + (0.8092114, 1.0939912), + (0.8096114, 1.1357177), + (0.8100114, 1.1767333), + (0.8104114, 1.2169993), + (0.8108114, 1.2565027), + (0.8112114, 1.2952065), + (0.8116114, 1.3330982), + (0.8120114, 1.370142), + (0.8124114, 1.4063258), + (0.81281143, 1.441616), + (0.81321144, 1.476001), + (0.81361145, 1.5094484), + (0.81401145, 1.5419475), + (0.81441146, 1.5734677), + (0.81481147, 1.6039988), + (0.8152115, 1.6335121), + (0.8156115, 1.661998), + (0.8160115, 1.68943), + (0.8164115, 1.7157989), + (0.8168115, 1.74108), + (0.8172115, 1.7652653), + (0.8176115, 1.788332), + (0.8180115, 1.8102725), + (0.8184115, 1.8310661), + (0.81881154, 1.8507065), + (0.81921154, 1.8691748), + (0.81961155, 1.8864653), + (0.82001156, 1.9025617), + (0.82041156, 1.9174587), + (0.82081157, 1.9311423), + (0.8212116, 1.9436082), + (0.8216116, 1.9548445), + (0.8220116, 1.9648478), + (0.8224116, 1.9736085), + (0.8228116, 1.9811239), + (0.8232116, 1.9873868), + (0.8236116, 1.9923953), + (0.8240116, 1.9961451), + (0.82441163, 1.9986336), + (0.82481164, 1.99986), + (0.82521164, 1.9998231), + (0.82561165, 1.9985229), + (0.82601166, 1.9959607), + (0.82641166, 1.9921372), + (0.8268117, 1.9870561), + (0.8272117, 1.9807191), + (0.8276117, 1.9731319), + (0.8280117, 1.9642973), + (0.8284117, 1.9542233), + (0.8288117, 1.9429133), + (0.8292117, 1.930378), + (0.8296117, 1.9166213), + (0.8300117, 1.9016562), + (0.83041173, 1.8854876), + (0.83081174, 1.8681304), + (0.83121175, 1.8495907), + (0.83161175, 1.8298856), + (0.83201176, 1.8090215), + (0.83241177, 1.7870181), + (0.8328118, 1.7638824), + (0.8332118, 1.7396363), + (0.8336118, 1.7142875), + (0.8340118, 1.6878599), + (0.8344118, 1.660362), + (0.8348118, 1.6318196), + (0.8352118, 1.6022421), + (0.8356118, 1.5716572), + (0.8360118, 1.5400748), + (0.83641183, 1.5075245), + (0.83681184, 1.4740169), + (0.83721185, 1.4395834), + (0.83761185, 1.4042355), + (0.83801186, 1.3680059), + (0.83841187, 1.3309066), + (0.8388119, 1.2929724), + (0.8392119, 1.2542157), + (0.8396119, 1.2146728), + (0.8400119, 1.1743565), + (0.8404119, 1.1333046), + (0.8408119, 1.0915306), + (0.8412119, 1.0490736), + (0.8416119, 1.0059474), + (0.8420119, 0.96219236), + (0.84241194, 0.9178229), + (0.84281194, 0.8728805), + (0.84321195, 0.8273799), + (0.84361196, 0.7813636), + (0.84401196, 0.7348468), + (0.84441197, 0.6878728), + (0.844812, 0.6404573), + (0.845212, 0.5926444), + (0.845612, 0.5444499), + (0.846012, 0.49591148), + (0.846412, 0.4470672), + (0.846812, 0.39793307), + (0.847212, 0.3485551), + (0.847612, 0.29894942), + (0.84801203, 0.24916248), + (0.84841204, 0.19921057), + (0.84881204, 0.14914043), + (0.84921205, 9.896849e-2), + (0.84961206, 4.874165e-2), + (0.85001206, -1.5236059e-3), + (0.8504121, -5.1780272e-2), + (0.8508121, -0.10201185), + (0.8512121, -0.15217139), + (0.8516121, -0.2022424), + (0.8520121, -0.25217807), + (0.8524121, -0.30196205), + (0.8528121, -0.35154775), + (0.8532121, -0.4009189), + (0.8536121, -0.45002934), + (0.85401213, -0.49886295), + (0.85441214, -0.54737407), + (0.85481215, -0.5955468), + (0.85521215, -0.64333606), + (0.85561216, -0.6907262), + (0.85601217, -0.73767287), + (0.8564122, -0.78416073), + (0.8568122, -0.8301462), + (0.8572122, -0.8756143), + (0.8576122, -0.92052245), + (0.8580122, -0.9648559), + (0.8584122, -1.0085733), + (0.8588122, -1.0516602), + (0.8592122, -1.0940763), + (0.8596122, -1.1358078), + (0.86001223, -1.1768155), + (0.86041224, -1.2170861), + (0.86081225, -1.2565819), + (0.86121225, -1.2952899), + (0.86161226, -1.333174), + (0.86201227, -1.3702216), + (0.8624123, -1.4063982), + (0.8628123, -1.4416919), + (0.8632123, -1.4760696), + (0.8636123, -1.5095202), + (0.8640123, -1.5420122), + (0.8644123, -1.5735352), + (0.8648123, -1.6040595), + (0.8652123, -1.6335752), + (0.8656123, -1.6620547), + (0.86601233, -1.6894885), + (0.86641234, -1.7158512), + (0.86681235, -1.7411339), + (0.86721236, -1.7653131), + (0.86761236, -1.788381), + (0.86801237, -1.810319), + (0.8684124, -1.8311101), + (0.8688124, -1.850748), + (0.8692124, -1.8692137), + (0.8696124, -1.8865017), + (0.8700124, -1.9025954), + (0.8704124, -1.9174898), + (0.8708124, -1.9311707), + (0.8712124, -1.9436339), + (0.8716124, -1.9548676), + (0.87201244, -1.9648682), + (0.87241244, -1.9736263), + (0.87281245, -1.9811388), + (0.87321246, -1.9873991), + (0.87361246, -1.9924048), + (0.8740125, -1.9961514), + (0.8744125, -1.9986377), + (0.8748125, -1.9998612), + (0.8752125, -1.9998217), + (0.8756125, -1.9985191), + (0.8760125, -1.9959537), + (0.8764125, -1.9921283), + (0.8768125, -1.9870437), + (0.8772125, -1.9807049), + (0.87761253, -1.973114), + (0.87801254, -1.9642781), + (0.87841254, -1.9542), + (0.87881255, -1.9428892), + (0.87921256, -1.9303493), + (0.87961257, -1.9165922), + (0.8800126, -1.9016223), + (0.8804126, -1.8854536), + (0.8808126, -1.8680915), + (0.8812126, -1.849552), + (0.8816126, -1.8298414), + (0.8820126, -1.8089781), + (0.8824126, -1.786969), + (0.8828126, -1.7638345), + (0.8832126, -1.7395823), + (0.88361263, -1.7142351), + (0.88401264, -1.6878012), + (0.88441265, -1.6603053), + (0.88481265, -1.6317564), + (0.88521266, -1.6021813), + (0.88561267, -1.5715896), + (0.8860127, -1.5400099), + (0.8864127, -1.5074526), + (0.8868127, -1.4739481), + (0.8872127, -1.4395076), + (0.8876127, -1.404163), + (0.8880127, -1.3679261), + (0.8884127, -1.3308307), + (0.8888127, -1.292889), + (0.8892127, -1.2541305), + (0.88961273, -1.2145859), + (0.89001274, -1.174268), + (0.89041275, -1.1332145), + (0.89081275, -1.091439), + (0.89121276, -1.0489805), + (0.89161277, -1.0058528), + (0.8920128, -0.96209645), + (0.8924128, -0.91772574), + (0.8928128, -0.8727821), + (0.8932128, -0.8272803), + (0.8936128, -0.78126293), + (0.8940128, -0.734745), + (0.8944128, -0.6877701), + (0.8948128, -0.6403537), + (0.8952128, -0.59253997), + (0.89561284, -0.54434466), + (0.89601284, -0.49581292), + (0.89641285, -0.4469606), + (0.89681286, -0.39783338), + (0.89721286, -0.34844738), + (0.89761287, -0.29884884), + (0.8980129, -0.24905396), + (0.8984129, -0.19910935), + (0.8988129, -0.14903137), + (0.8992129, -9.886687e-2), + (0.8996129, -4.863231e-2), + (0.9000129, 1.6253471e-3), + (0.9004129, 5.1889606e-2), + (0.9008129, 0.10211346), + (0.90121293, 0.15228043), + (0.90161294, 0.20234363), + (0.90201294, 0.25228658), + (0.90241295, 0.30206263), + (0.90281296, 0.35165542), + (0.90321296, 0.40101856), + (0.903613, 0.45013592), + (0.904013, 0.49896148), + (0.904413, 0.5474793), + (0.904813, 0.59564394), + (0.905213, 0.64343965), + (0.905613, 0.6908217), + (0.906013, 0.73777455), + (0.906413, 0.7842543), + (0.906813, 0.83024573), + (0.90721303, 0.8757058), + (0.90761304, 0.92061955), + (0.90801305, 0.9649451), + (0.90841305, 1.0086677), + (0.90881306, 1.0517467), + (0.90921307, 1.0941678), + (0.9096131, 1.1358916), + (0.9100131, 1.176904), + (0.9104131, 1.2171669), + (0.9108131, 1.256667), + (0.9112131, 1.2953732), + (0.9116131, 1.3332555), + (0.9120131, 1.3703012), + (0.9124131, 1.4064759), + (0.9128131, 1.4417677), + (0.91321313, 1.4761434), + (0.91361314, 1.5095919), + (0.91401315, 1.542082), + (0.91441315, 1.5736027), + (0.91481316, 1.6041248), + (0.91521317, 1.6336383), + (0.9156132, 1.6621155), + (0.9160132, 1.6895471), + (0.9164132, 1.7159073), + (0.9168132, 1.7411877), + (0.9172132, 1.7653645), + (0.9176132, 1.7884299), + (0.9180132, 1.8103621), + (0.9184132, 1.8311541), + (0.9188132, 1.8507864), + (0.91921324, 1.8692527), + (0.91961324, 1.8865354), + (0.92001325, 1.9026291), + (0.92041326, 1.9175186), + (0.92081326, 1.9311992), + (0.92121327, 1.9436579), + (0.9216133, 1.9548907), + (0.9220133, 1.9648871), + (0.9224133, 1.9736439), + (0.9228133, 1.9811528), + (0.9232133, 1.9874114), + (0.9236133, 1.9924138), + (0.9240133, 1.9961582), + (0.9244133, 1.9986415), + (0.92481333, 1.9998626), + (0.92521334, 1.9998202), + (0.92561334, 1.9985148), + (0.92601335, 1.9959472), + (0.92641336, 1.9921185), + (0.92681336, 1.9870322), + (0.9272134, 1.9806898), + (0.9276134, 1.9730974), + (0.9280134, 1.9642575), + (0.9284134, 1.9541783), + (0.9288134, 1.9428632), + (0.9292134, 1.9303228), + (0.9296134, 1.9165609), + (0.9300134, 1.9015907), + (0.9304134, 1.8854171), + (0.93081343, 1.8680551), + (0.93121344, 1.8495104), + (0.93161345, 1.8298004), + (0.93201345, 1.8089315), + (0.93241346, 1.7869233), + (0.93281347, 1.763783), + (0.9332135, 1.7395283), + (0.9336135, 1.7141788), + (0.9340135, 1.6877425), + (0.9344135, 1.6602443), + (0.9348135, 1.6316931), + (0.9352135, 1.6021158), + (0.9356135, 1.5715219), + (0.9360135, 1.5399401), + (0.9364135, 1.5073807), + (0.93681353, 1.4738742), + (0.93721354, 1.4394317), + (0.93761355, 1.4040852), + (0.93801355, 1.3678463), + (0.93841356, 1.330749), + (0.93881357, 1.2928056), + (0.9392136, 1.2540513), + (0.9396136, 1.214499), + (0.9400136, 1.1741856), + (0.9404136, 1.1331244), + (0.9408136, 1.0913537), + (0.9412136, 1.0488873), + (0.9416136, 1.0057648), + (0.9420136, 0.96200055), + (0.9424136, 0.9176353), + (0.94281363, 0.8726837), + (0.94321364, 0.82718766), + (0.94361365, 0.78116226), + (0.94401366, 0.73465043), + (0.94441366, 0.6876674), + (0.94481367, 0.6402573), + (0.9452137, 0.5924355), + (0.9456137, 0.5442468), + (0.9460137, 0.49570695), + (0.9464137, 0.44686142), + (0.9468137, 0.39772618), + (0.9472137, 0.3483472), + (0.9476137, 0.29874068), + (0.9480137, 0.248953), + (0.9484137, 0.19900051), + (0.94881374, 0.14892991), + (0.94921374, 9.875764e-2), + (0.94961375, 4.8530597e-2), + (0.95001376, -1.7347175e-3), + (0.95041376, -5.199131e-2), + (0.9508138, -0.10222269), + (0.9512138, -0.15238188), + (0.9516138, -0.20245244), + (0.9520138, -0.25238752), + (0.9524138, -0.30217075), + (0.9528138, -0.35175556), + (0.9532138, -0.40112573), + (0.9536138, -0.45023504), + (0.9540138, -0.4990674), + (0.95441383, -0.54757714), + (0.95481384, -0.5957483), + (0.95521384, -0.6435432), + (0.95561385, -0.69092435), + (0.95601386, -0.7378762), + (0.95641387, -0.7843549), + (0.9568139, -0.8303452), + (0.9572139, -0.87580407), + (0.9576139, -0.92071664), + (0.9580139, -0.96504086), + (0.9584139, -1.0087622), + (0.9588139, -1.0518397), + (0.9592139, -1.0942594), + (0.9596139, -1.1359816), + (0.9600139, -1.1769924), + (0.96041393, -1.2172537), + (0.96081394, -1.2567521), + (0.96121395, -1.2954508), + (0.96161395, -1.333337), + (0.96201396, -1.3703754), + (0.96241397, -1.4065537), + (0.962814, -1.4418381), + (0.963214, -1.4762172), + (0.963614, -1.5096587), + (0.964014, -1.5421516), + (0.964414, -1.5736655), + (0.964814, -1.6041901), + (0.965214, -1.633697), + (0.965614, -1.6621763), + (0.966014, -1.6896015), + (0.96641403, -1.7159635), + (0.96681404, -1.7412378), + (0.96721405, -1.7654159), + (0.96761405, -1.7884754), + (0.96801406, -1.8104086), + (0.96841407, -1.8311951), + (0.9688141, -1.8508279), + (0.9692141, -1.8692888), + (0.9696141, -1.8865718), + (0.9700141, -1.9026605), + (0.9704141, -1.9175497), + (0.9708141, -1.9312257), + (0.9712141, -1.9436836), + (0.9716141, -1.9549122), + (0.9720141, -1.9649075), + (0.97241414, -1.9736603), + (0.97281414, -1.9811678), + (0.97321415, -1.9874227), + (0.97361416, -1.9924232), + (0.97401416, -1.9961646), + (0.97441417, -1.9986454), + (0.9748142, -1.9998637), + (0.9752142, -1.9998188), + (0.9756142, -1.9985108), + (0.9760142, -1.9959403), + (0.9764142, -1.9921095), + (0.9768142, -1.9870197), + (0.9772142, -1.9806746), + (0.9776142, -1.9730796), + (0.97801423, -1.964237), + (0.97841424, -1.9541551), + (0.97881424, -1.9428372), + (0.97921425, -1.9302942), + (0.97961426, -1.9165297), + (0.98001426, -1.9015568), + (0.9804143, -1.8853806), + (0.9808143, -1.868016), + (0.9812143, -1.8494687), + (0.9816143, -1.8297563), + (0.9820143, -1.8088849), + (0.9824143, -1.7868742), + (0.9828143, -1.7637314), + (0.9832143, -1.7394781), + (0.9836143, -1.7141224), + (0.98401433, -1.6876879), + (0.98441434, -1.6601833), + (0.98481435, -1.6316344), + (0.98521435, -1.6020503), + (0.98561436, -1.5714589), + (0.98601437, -1.5398703), + (0.9864144, -1.5073138), + (0.9868144, -1.4738003), + (0.9872144, -1.439361), + (0.9876144, -1.4040072), + (0.9880144, -1.3677721), + (0.9884144, -1.3306674), + (0.9888144, -1.292728), + (0.9892144, -1.2539661), + (0.9896144, -1.2144182), + (0.99001443, -1.1740971), + (0.99041444, -1.1330405), + (0.99081445, -1.0912621), + (0.99121445, -1.0488007), + (0.99161446, -1.0056703), + (0.99201447, -0.9619114), + (0.9924145, -0.91753817), + (0.9928145, -0.87259215), + (0.9932145, -0.8270881), + (0.9936145, -0.78106856), + (0.9940145, -0.7345487), + (0.9944145, -0.6875719), + (0.9948145, -0.6401537), + (0.9952145, -0.5923383), + (0.9956145, -0.54414153), + (0.99601454, -0.4956084), + (0.99641454, -0.4467548), + (0.99681455, -0.39762646), + (0.99721456, -0.3482395), + (0.99761456, -0.29864007), + (0.99801457, -0.24884449), + (0.9984146, -0.19889928), + (0.9988146, -0.14882085), + (0.9992146, -9.86484e-2), + (0.9996146, -4.842126e-2)] + +pieceExpected :: [(Float, Float)] +pieceExpected = [ + (0.0, -1.0), + (8.0e-3, -1.0), + (1.6e-2, -1.0), + (2.4e-2, -1.0), + (3.2e-2, -1.0), + (4.0000003e-2, -1.0), + (4.8000004e-2, -1.0), + (5.6000005e-2, -1.0), + (6.4e-2, -1.0), + (7.2000004e-2, -1.0), + (8.0000006e-2, -1.0), + (8.800001e-2, -1.0), + (9.600001e-2, -1.0), + (0.10400001, -1.0), + (0.11200001, -1.0), + (0.12000001, -1.0), + (0.128, -1.0), + (0.136, -1.0), + (0.14400001, -1.0), + (0.15200001, -1.0), + (0.16000001, -1.0), + (0.16800001, -1.0), + (0.17600001, -1.0), + (0.18400002, -1.0), + (0.19200002, -1.0), + (0.20000002, -1.0), + (0.20800002, -1.0), + (0.21600002, -1.0), + (0.22400002, -1.0), + (0.23200002, -1.0), + (0.24000002, -1.0), + (0.24800003, -1.0), + (0.256, -1.0), + (0.264, -1.0), + (0.27199998, -1.0), + (0.27999997, -1.0), + (0.28799996, -1.0), + (0.29599994, -1.0), + (0.30399993, -1.0), + (0.31199992, -1.0), + (0.3199999, -1.0), + (0.3279999, -1.0), + (0.33599988, -1.0), + (0.34399986, -1.0), + (0.35199985, -1.0), + (0.35999984, -1.0), + (0.36799982, -1.0), + (0.3759998, -1.0), + (0.3839998, -1.0), + (0.39199978, -1.0), + (0.39999977, -1.0), + (0.40799975, -1.0), + (0.41599974, -1.0), + (0.42399973, -1.0), + (0.4319997, -1.0), + (0.4399997, -1.0), + (0.4479997, -1.0), + (0.45599967, -1.0), + (0.46399966, -1.0), + (0.47199965, -1.0), + (0.47999963, -1.0), + (0.48799962, -1.0), + (0.4959996, -1.0), + (0.5039996, -1.0), + (0.5119996, -1.0), + (0.5199996, -1.0), + (0.52799964, -1.0), + (0.53599966, -1.0), + (0.5439997, -1.0), + (0.5519997, -1.0), + (0.5599997, -1.0), + (0.5679997, -1.0), + (0.57599974, -1.0), + (0.58399975, -1.0), + (0.59199977, -1.0), + (0.5999998, -1.0), + (0.6079998, -1.0), + (0.6159998, -1.0), + (0.62399983, -1.0), + (0.63199985, -1.0), + (0.63999987, -1.0), + (0.6479999, -1.0), + (0.6559999, -1.0), + (0.6639999, -1.0), + (0.67199993, -1.0), + (0.67999995, -1.0), + (0.68799996, -1.0), + (0.696, -1.0), + (0.704, -1.0), + (0.712, -1.0), + (0.72, -1.0), + (0.72800004, -1.0), + (0.73600006, -1.0), + (0.7440001, -1.0), + (0.7520001, -1.0), + (0.7600001, -1.0), + (0.7680001, -1.0), + (0.77600014, -1.0), + (0.78400016, -1.0), + (0.7920002, -1.0), + (0.8000002, -1.0), + (0.8080002, -1.0), + (0.8160002, -1.0), + (0.82400024, -1.0), + (0.83200026, -1.0), + (0.8400003, -1.0), + (0.8480003, -1.0), + (0.8560003, -1.0), + (0.8640003, -1.0), + (0.87200034, -1.0), + (0.88000035, -1.0), + (0.88800037, -1.0), + (0.8960004, -1.0), + (0.9040004, -1.0), + (0.9120004, -1.0), + (0.92000043, -1.0), + (0.92800045, -1.0), + (0.93600047, -1.0), + (0.9440005, -1.0), + (0.9520005, -1.0), + (0.9600005, -1.0), + (0.96800053, -1.0), + (0.97600055, -1.0), + (0.98400056, -1.0), + (0.9920006, -1.0), + (1.0000006, -0.9999851), + (1.0080006, -0.7999847), + (1.0160006, -0.5999843), + (1.0240006, -0.39998388), + (1.0320007, -0.19998348), + (1.0400007, 1.692772e-5), + (1.0480007, 0.20001733), + (1.0560007, 0.40001774), + (1.0640007, 0.60001814), + (1.0720007, 0.80001855), + (1.0800008, 1.0000191), + (1.0880008, 1.2000194), + (1.0960008, 1.4000196), + (1.1040008, 1.6000202), + (1.1120008, 1.8000207), + (1.1200008, 2.000021), + (1.1280009, 2.2000213), + (1.1360009, 2.4000218), + (1.1440009, 2.6000223), + (1.1520009, 2.8000226), + (1.1600009, 3.000023), + (1.1680009, 3.2000237), + (1.176001, 3.400024), + (1.184001, 3.6000242), + (1.192001, 3.8000245), + (1.200001, 4.0000024), + (1.208001, 4.0199146), + (1.216001, 4.0393105), + (1.224001, 4.058002), + (1.2320011, 4.075812), + (1.2400011, 4.092575), + (1.2480011, 4.1081386), + (1.2560011, 4.122365), + (1.2640011, 4.1351323), + (1.2720011, 4.1463346), + (1.2800012, 4.155884), + (1.2880012, 4.16371), + (1.2960012, 4.1697617), + (1.3040012, 4.174006), + (1.3120012, 4.1764283), + (1.3200012, 4.177034), + (1.3280013, 4.175845), + (1.3360013, 4.1729026), + (1.3440013, 4.168264), + (1.3520013, 4.1620026), + (1.3600013, 4.154207), + (1.3680013, 4.144981), + (1.3760014, 4.13444), + (1.3840014, 4.1227107), + (1.3920014, 4.1099305), + (1.4000014, 4.0962453), + (1.4080014, 4.0818067), + (1.4160014, 4.066773), + (1.4240015, 4.0513043), + (1.4320015, 4.035564), + (1.4400015, 4.0197153), + (1.4480015, 4.003919), + (1.4560015, 3.9883342), + (1.4640015, 3.9731145), + (1.4720016, 3.9584074), + (1.4800016, 3.9443526), + (1.4880016, 3.9310822), + (1.4960016, 3.9187174), + (1.5040016, 3.9073682), + (1.5120016, 3.8971329), + (1.5200016, 3.8880968), + (1.5280017, 3.8803325), + (1.5360017, 3.8738976), + (1.5440017, 3.8688364), + (1.5520017, 3.8651776), + (1.5600017, 3.862936), + (1.5680017, 3.8621116), + (1.5760018, 3.8626904), + (1.5840018, 3.8646445), + (1.5920018, 3.8679318), + (1.6000018, 3.8724985), + (1.6080018, 3.8782783), + (1.6160018, 3.8851929), + (1.6240019, 3.8931556), + (1.6320019, 3.9020686), + (1.6400019, 3.9118276), + (1.6480019, 3.9223208), + (1.6560019, 3.9334302), + (1.664002, 3.9450345), + (1.672002, 3.9570084), + (1.680002, 3.969226), + (1.688002, 3.9815598), + (1.696002, 3.9938836), + (1.704002, 4.0060735), + (1.712002, 4.0180087), + (1.720002, 4.029573), + (1.7280021, 4.0406556), + (1.7360021, 4.0511527), + (1.7440021, 4.060967), + (1.7520021, 4.070011), + (1.7600021, 4.078206), + (1.7680022, 4.085482), + (1.7760022, 4.091781), + (1.7840022, 4.097055), + (1.7920022, 4.101267), + (1.8000022, 4.104391), + (1.8080022, 4.106413), + (1.8160022, 4.1073303), + (1.8240023, 4.1071506), + (1.8320023, 4.105894), + (1.8400023, 4.1035895), + (1.8480023, 4.100278), + (1.8560023, 4.0960073), + (1.8640023, 4.090837), + (1.8720024, 4.0848327), + (1.8800024, 4.0780687), + (1.8880024, 4.0706253), + (1.8960024, 4.0625877), + (1.9040024, 4.054047), + (1.9120024, 4.045097), + (1.9200025, 4.0358343), + (1.9280025, 4.026357), + (1.9360025, 4.016765), + (1.9440025, 4.0071564), + (1.9520025, 3.9976277), + (1.9600025, 3.988274), + (1.9680026, 3.9791875), + (1.9760026, 3.9704547), + (1.9840026, 3.9621587), + (1.9920026, 3.9543757), + (2.0000026, 3.947176), + (2.0080025, 3.9406233), + (2.0160024, 3.934773), + (2.0240023, 3.9296732), + (2.0320022, 3.9253635), + (2.040002, 3.9218745), + (2.048002, 3.9192286), + (2.056002, 3.9174385), + (2.0640018, 3.9165092), + (2.0720017, 3.9164367), + (2.0800016, 3.9172072), + (2.0880015, 3.9188004), + (2.0960014, 3.921187), + (2.1040013, 3.9243298), + (2.1120012, 3.928186), + (2.120001, 3.9327044), + (2.128001, 3.93783), + (2.1360009, 3.9435005), + (2.1440008, 3.9496508), + (2.1520007, 3.956211), + (2.1600006, 3.9631085), + (2.1680005, 3.9702682), + (2.1760004, 3.9776144), + (2.1840003, 3.9850693), + (2.1920002, 3.9925566), + (2.2, 4.0), + (2.208, 4.007325), + (2.2159998, 4.0144606), + (2.2239997, 4.0213366), + (2.2319996, 4.0278883), + (2.2399995, 4.034055), + (2.2479994, 4.0397806), + (2.2559993, 4.0450144), + (2.2639992, 4.049711), + (2.2719991, 4.0538325), + (2.279999, 4.0573454), + (2.287999, 4.060225), + (2.2959988, 4.0624514), + (2.3039987, 4.0640125), + (2.3119986, 4.064904), + (2.3199985, 4.0651274), + (2.3279984, 4.06469), + (2.3359983, 4.0636077), + (2.3439982, 4.0619016), + (2.351998, 4.0595984), + (2.359998, 4.0567307), + (2.367998, 4.053337), + (2.3759978, 4.0494595), + (2.3839977, 4.045145), + (2.3919976, 4.0404434), + (2.3999975, 4.035409), + (2.4079974, 4.030098), + (2.4159973, 4.024567), + (2.4239972, 4.018877), + (2.431997, 4.0130863), + (2.439997, 4.007256), + (2.4479969, 4.0014453), + (2.4559968, 3.9957118), + (2.4639966, 3.9901128), + (2.4719965, 3.984702), + (2.4799964, 3.9795318), + (2.4879963, 3.97465), + (2.4959962, 3.9701009), + (2.5039961, 3.9659252), + (2.511996, 3.9621596), + (2.519996, 3.9588351), + (2.5279958, 3.9559789), + (2.5359957, 3.953611), + (2.5439956, 3.9517488), + (2.5519955, 3.9504023), + (2.5599954, 3.9495773), + (2.5679953, 3.9492736), + (2.5759952, 3.9494863), + (2.583995, 3.9502048), + (2.591995, 3.9514136), + (2.599995, 3.953093), + (2.6079948, 3.9552188), + (2.6159947, 3.9577622), + (2.6239946, 3.9606915), + (2.6319945, 3.9639702), + (2.6399944, 3.9675598), + (2.6479943, 3.9714198), + (2.6559942, 3.9755063), + (2.663994, 3.979775), + (2.671994, 3.98418), + (2.6799939, 3.9886742), + (2.6879938, 3.9932117), + (2.6959937, 3.997745), + (2.7039936, 4.0022297), + (2.7119935, 4.0066204), + (2.7199934, 4.0108747), + (2.7279932, 4.014952), + (2.7359931, 4.0188136), + (2.743993, 4.0224247), + (2.751993, 4.025752), + (2.7599928, 4.028767), + (2.7679927, 4.031444), + (2.7759926, 4.033762), + (2.7839925, 4.0357027), + (2.7919924, 4.0372524), + (2.7999923, 4.038402), + (2.8079922, 4.0391464), + (2.815992, 4.0394845), + (2.823992, 4.0394187), + (2.831992, 4.038957), + (2.8399918, 4.03811), + (2.8479917, 4.036892), + (2.8559916, 4.035321), + (2.8639915, 4.0334196), + (2.8719914, 4.0312114), + (2.8799913, 4.0287237), + (2.8879912, 4.0259857), + (2.895991, 4.0230293), + (2.903991, 4.0198874), + (2.911991, 4.016595), + (2.9199908, 4.013188), + (2.9279907, 4.0097017), + (2.9359906, 4.0061727), + (2.9439905, 4.002638), + (2.9519904, 3.9991326), + (2.9599903, 3.9956918), + (2.9679902, 3.9923487), + (2.97599, 3.9891357), + (2.98399, 3.9860835), + (2.9919899, 3.98322), + (2.9999897, 3.9805713), + (3.0079896, 3.9781604), + (3.0159895, 3.9760075), + (3.0239894, 3.974131), + (3.0319893, 3.9725451), + (3.0399892, 3.971261), + (3.0479891, 3.9702873), + (3.055989, 3.9696283), + (3.063989, 3.969286), + (3.0719888, 3.9692583), + (3.0799887, 3.9695415), + (3.0879886, 3.970127), + (3.0959885, 3.9710045), + (3.1039884, 3.9721603), + (3.1119883, 3.9735785), + (3.1199882, 3.9752407), + (3.127988, 3.9771256), + (3.135988, 3.9792113), + (3.143988, 3.981474), + (3.1519878, 3.9838867), + (3.1599877, 3.9864244), + (3.1679876, 3.989058), + (3.1759875, 3.9917603), + (3.1839874, 3.994503), + (3.1919873, 3.9972572), + (3.1999872, 3.9999957), + (3.207987, 4.002691), + (3.215987, 4.005316), + (3.2239869, 4.0078454), + (3.2319868, 4.010256), + (3.2399867, 4.0125246), + (3.2479866, 4.0146313), + (3.2559865, 4.016557), + (3.2639863, 4.0182853), + (3.2719862, 4.0198016), + (3.2799861, 4.0210943), + (3.287986, 4.022154), + (3.295986, 4.0229735), + (3.3039858, 4.023548), + (3.3119857, 4.0238767), + (3.3199856, 4.023959), + (3.3279855, 4.0237985), + (3.3359854, 4.023401), + (3.3439853, 4.0227737), + (3.3519852, 4.0219264), + (3.359985, 4.020872), + (3.367985, 4.0196238), + (3.375985, 4.0181975), + (3.3839848, 4.0166106), + (3.3919847, 4.014881), + (3.3999846, 4.0130296), + (3.4079845, 4.0110755), + (3.4159844, 4.0090413), + (3.4239843, 4.006948), + (3.4319842, 4.0048175), + (3.439984, 4.0026727), + (3.447984, 4.000535), + (3.4559839, 3.998426), + (3.4639838, 3.996366), + (3.4719837, 3.9943752), + (3.4799836, 3.9924731), + (3.4879835, 3.9906769), + (3.4959834, 3.9890032), + (3.5039833, 3.9874668), + (3.5119832, 3.9860816), + (3.519983, 3.984858), + (3.527983, 3.983807), + (3.5359828, 3.982936), + (3.5439827, 3.9822502), + (3.5519826, 3.9817548), + (3.5599825, 3.981451), + (3.5679824, 3.981339), + (3.5759823, 3.9814167), + (3.5839822, 3.9816809), + (3.5919821, 3.9821253), + (3.599982, 3.9827428), + (3.607982, 3.9835248), + (3.6159818, 3.9844599), + (3.6239817, 3.9855375), + (3.6319816, 3.9867435), + (3.6399815, 3.9880638), + (3.6479814, 3.9894834), + (3.6559813, 3.9909868), + (3.6639812, 3.992557), + (3.671981, 3.9941773), + (3.679981, 3.995831), + (3.687981, 3.9975), + (3.6959808, 3.999168), + (3.7039807, 4.000818), + (3.7119806, 4.002433), + (3.7199805, 4.0039983), + (3.7279804, 4.0054984), + (3.7359803, 4.006919), + (3.7439802, 4.0082474), + (3.75198, 4.009472), + (3.75998, 4.010581), + (3.7679799, 4.011566), + (3.7759798, 4.012419), + (3.7839797, 4.013133), + (3.7919796, 4.013704), + (3.7999794, 4.014127), + (3.8079793, 4.014401), + (3.8159792, 4.0145254), + (3.8239791, 4.0145016), + (3.831979, 4.014332), + (3.839979, 4.0140204), + (3.8479788, 4.0135727), + (3.8559787, 4.0129952), + (3.8639786, 4.0122957), + (3.8719785, 4.0114837), + (3.8799784, 4.010568), + (3.8879783, 4.009561), + (3.8959782, 4.008474), + (3.903978, 4.007318), + (3.911978, 4.006107), + (3.919978, 4.0048537), + (3.9279778, 4.003571), + (3.9359777, 4.002273), + (3.9439776, 4.0009727), + (3.9519775, 3.999683), + (3.9599774, 3.998417), + (3.9679773, 3.9971871), + (3.9759772, 3.996005), + (3.983977, 3.994882), + (3.991977, 3.9938288), + (3.9999769, 3.992854), + (4.007977, 3.9919667), + (4.015977, 3.9911747), + (4.023977, 3.9904842), + (4.0319767, 3.9899006), + (4.0399766, 3.989428), + (4.0479765, 3.98907), + (4.0559764, 3.9888272), + (4.0639763, 3.9887009), + (4.071976, 3.9886909), + (4.079976, 3.9887948), + (4.087976, 3.9890099), + (4.095976, 3.9893327), + (4.103976, 3.9897575), + (4.1119757, 3.9902792), + (4.1199756, 3.9908905), + (4.1279755, 3.9915838), + (4.1359754, 3.992351), + (4.1439753, 3.9931831), + (4.151975, 3.994071), + (4.159975, 3.9950042), + (4.167975, 3.995973), + (4.175975, 3.9969673), + (4.1839747, 3.9979763), + (4.1919746, 3.9989896), + (4.1999745, 3.9999967), + (4.2079744, 3.8670897), + (4.2159743, 3.733758), + (4.223974, 3.6004262), + (4.231974, 3.467095), + (4.239974, 3.3337631), + (4.247974, 3.2004313), + (4.255974, 3.0671), + (4.2639737, 2.9337683), + (4.2719736, 2.8004367), + (4.2799735, 2.6671052), + (4.2879734, 2.5337734), + (4.2959733, 2.400442), + (4.303973, 2.2671103), + (4.311973, 2.1337786), + (4.319973, 2.000447), + (4.327973, 1.8671155), + (4.335973, 1.7337837), + (4.3439727, 1.6004522), + (4.3519726, 1.4671206), + (4.3599725, 1.3337889), + (4.3679724, 1.2004573), + (4.3759723, 1.0671258), + (4.383972, 0.933794), + (4.391972, 0.8004625), + (4.399972, 0.66713095), + (4.407972, 0.5337994), + (4.4159718, 0.40046763), + (4.4239717, 0.2671361), + (4.4319715, 0.13380456), + (4.4399714, 4.7278404e-4), + (4.4479713, -0.13285875), + (4.4559712, -0.26619053), + (4.463971, -0.39952183), + (4.471971, -0.5328536), + (4.479971, -0.6661854), + (4.487971, -0.7995167), + (4.4959707, -0.93284845), + (4.5039706, -1.0130347), + (4.5119705, -1.0388085), + (4.5199704, -1.0637013), + (4.5279703, -1.0874522), + (4.53597, -1.1098169), + (4.54397, -1.1305714), + (4.55197, -1.1495129), + (4.55997, -1.1664628), + (4.56797, -1.1812674), + (4.5759697, -1.1937997), + (4.5839696, -1.2039601), + (4.5919695, -1.211677), + (4.5999694, -1.2169073), + (4.6079693, -1.2196363), + (4.615969, -1.2198772), + (4.623969, -1.217671), + (4.631969, -1.2130848), + (4.639969, -1.206211), + (4.647969, -1.1971657), + (4.6559687, -1.1860877), + (4.6639686, -1.1731353), + (4.6719685, -1.1584852), + (4.6799684, -1.1423297), + (4.6879683, -1.1248746), + (4.695968, -1.1063366), + (4.703968, -1.0869405), + (4.711968, -1.0669167), + (4.719968, -1.0464988), + (4.7279677, -1.0259204), + (4.7359676, -1.0054132), + (4.7439675, -0.9852034), + (4.7519674, -0.9655106), + (4.7599673, -0.94654465), + (4.767967, -0.92850345), + (4.775967, -0.91157144), + (4.783967, -0.89591736), + (4.791967, -0.88169277), + (4.799967, -0.86903095), + (4.8079667, -0.8580451), + (4.8159666, -0.84882826), + (4.8239665, -0.8414518), + (4.8319664, -0.83596575), + (4.8399663, -0.83239794), + (4.847966, -0.83075464), + (4.855966, -0.8310205), + (4.863966, -0.83315915), + (4.871966, -0.83711433), + (4.879966, -0.84281033), + (4.8879657, -0.85015345), + (4.8959656, -0.85903347), + (4.9039655, -0.8693248), + (4.9119654, -0.8808886), + (4.9199653, -0.893574), + (4.927965, -0.90722066), + (4.935965, -0.92166007), + (4.943965, -0.936718), + (4.951965, -0.95221645), + (4.9599648, -0.9679753), + (4.9679646, -0.98381513), + (4.9759645, -0.9995585), + (4.9839644, -1.015032), + (4.9919643, -1.0300686), + (4.999964, -1.0445088), + (5.007964, -1.0582025), + (5.015964, -1.0710107), + (5.023964, -1.0828063), + (5.031964, -1.0934762), + (5.0399637, -1.1029212), + (5.0479636, -1.111058), + (5.0559635, -1.1178188), + (5.0639634, -1.1231527), + (5.0719633, -1.1270251), + (5.079963, -1.1294185), + (5.087963, -1.1303322), + (5.095963, -1.129782), + (5.103963, -1.1277993), + (5.111963, -1.1244311), + (5.1199627, -1.1197392), + (5.1279626, -1.1137987), + (5.1359625, -1.1066976), + (5.1439624, -1.0985346), + (5.1519623, -1.0894194), + (5.159962, -1.0794696), + (5.167962, -1.0688103), + (5.175962, -1.0575726), + (5.183962, -1.0458912), + (5.191962, -1.0339036), + (5.1999617, -1.0217485), + (5.2079616, -1.0095638), + (5.2159615, -0.99748534), + (5.2239614, -0.98564565), + (5.2319613, -0.97417194), + (5.239961, -0.96318537), + (5.247961, -0.9527996), + (5.255961, -0.94311935), + (5.263961, -0.93424004), + (5.2719607, -0.92624635), + (5.2799606, -0.9192115), + (5.2879605, -0.91319704), + (5.2959604, -0.908252), + (5.3039603, -0.9044126), + (5.31196, -0.9017023), + (5.31996, -0.90013146), + (5.32796, -0.8996976), + (5.33596, -0.90038586), + (5.34396, -0.90216887), + (5.3519597, -0.9050078), + (5.3599596, -0.90885264), + (5.3679595, -0.9136431), + (5.3759594, -0.9193096), + (5.3839593, -0.9257737), + (5.391959, -0.93294984), + (5.399959, -0.9407457), + (5.407959, -0.94906396), + (5.415959, -0.9578031), + (5.423959, -0.9668585), + (5.4319587, -0.9761243), + (5.4399586, -0.98549366), + (5.4479585, -0.9948607), + (5.4559584, -1.0041215), + (5.4639583, -1.013175), + (5.471958, -1.021924), + (5.479958, -1.0302769), + (5.487958, -1.0381477), + (5.495958, -1.0454572), + (5.5039577, -1.0521342), + (5.5119576, -1.0581155), + (5.5199575, -1.0633465), + (5.5279574, -1.0677826), + (5.5359573, -1.0713881), + (5.543957, -1.0741376), + (5.551957, -1.0760152), + (5.559957, -1.0770156), + (5.567957, -1.0771428), + (5.575957, -1.0764107), + (5.5839567, -1.0748423), + (5.5919566, -1.0724697), + (5.5999565, -1.0693333), + (5.6079564, -1.0654812), + (5.6159563, -1.0609688), + (5.623956, -1.0558577), + (5.631956, -1.0502151), + (5.639956, -1.0441129), + (5.647956, -1.0376272), + (5.655956, -1.0308366), + (5.6639557, -1.0238217), + (5.6719556, -1.0166645), + (5.6799555, -1.0094471), + (5.6879554, -1.0022506), + (5.6959553, -0.9951546), + (5.703955, -0.98823625), + (5.711955, -0.98156935), + (5.719955, -0.97522354), + (5.727955, -0.9692637), + (5.7359548, -0.9637493), + (5.7439547, -0.9587339), + (5.7519546, -0.9542646), + (5.7599545, -0.9503814), + (5.7679543, -0.9471172), + (5.7759542, -0.9444976), + (5.783954, -0.9425403), + (5.791954, -0.9412556), + (5.799954, -0.9406461), + (5.807954, -0.9407067), + (5.8159537, -0.94142497), + (5.8239536, -0.94278157), + (5.8319535, -0.9447503), + (5.8399534, -0.9472985), + (5.8479533, -0.95038784), + (5.855953, -0.9539745), + (5.863953, -0.95801), + (5.871953, -0.9624417), + (5.879953, -0.96721333), + (5.887953, -0.9722661), + (5.8959527, -0.97753865), + (5.9039526, -0.982969), + (5.9119525, -0.98849374), + (5.9199524, -0.99405), + (5.9279523, -0.99957544), + (5.935952, -1.005009), + (5.943952, -1.0102924), + (5.951952, -1.0153692), + (5.959952, -1.0201865), + (5.967952, -1.0246956), + (5.9759517, -1.0288517), + (5.9839516, -1.0326146), + (5.9919515, -1.0359496), + (5.9999514, -1.0388268), + (6.0079513, -1.0412226), + (6.015951, -1.0431185), + (6.023951, -1.0445021), + (6.031951, -1.0453672), + (6.039951, -1.0457132), + (6.0479507, -1.0455452), + (6.0559506, -1.0448741), + (6.0639505, -1.0437161), + (6.0719504, -1.0420926), + (6.0799503, -1.0400296), + (6.08795, -1.037558), + (6.09595, -1.0347121), + (6.10395, -1.0315301), + (6.11195, -1.0280534), + (6.11995, -1.0243256), + (6.1279497, -1.0203927), + (6.1359496, -1.0163016), + (6.1439495, -1.0121008), + (6.1519494, -1.007839), + (6.1599493, -1.0035642), + (6.167949, -0.9993246), + (6.175949, -0.9951664), + (6.183949, -0.9911344), + (6.191949, -0.9872713), + (6.199949, -0.98361695), + (6.2079487, -0.9802085), + (6.2159486, -0.97707933), + (6.2239485, -0.97425944), + (6.2319484, -0.97177476), + (6.2399483, -0.969647), + (6.247948, -0.96789366), + (6.255948, -0.96652764), + (6.263948, -0.96555734), + (6.271948, -0.9649867), + (6.2799478, -0.96481496), + (6.2879477, -0.9650372), + (6.2959476, -0.96564406), + (6.3039474, -0.96662205), + (6.3119473, -0.9679538), + (6.3199472, -0.96961844), + (6.327947, -0.9715916), + (6.335947, -0.97384596), + (6.343947, -0.97635156), + (6.351947, -0.97907627), + (6.3599467, -0.98198587), + (6.3679466, -0.98504496), + (6.3759465, -0.98821676), + (6.3839464, -0.9914642), + (6.3919463, -0.9947497), + (6.399946, -0.9980363), + (6.407946, -1.0012875), + (6.415946, -1.0044675), + (6.423946, -1.0075425), + (6.431946, -1.01048), + (6.4399457, -1.0132498), + (6.4479456, -1.0158241), + (6.4559455, -1.0181776), + (6.4639454, -1.0202881), + (6.4719453, -1.0221364), + (6.479945, -1.0237064), + (6.487945, -1.0249858), + (6.495945, -1.0259651), + (6.503945, -1.0266389), + (6.511945, -1.0270048), + (6.5199447, -1.0270644), + (6.5279446, -1.0268223), + (6.5359445, -1.0262864), + (6.5439444, -1.0254676), + (6.5519443, -1.0243802), + (6.559944, -1.023041), + (6.567944, -1.021469), + (6.575944, -1.019686), + (6.583944, -1.0177153), + (6.5919437, -1.0155822), + (6.5999436, -1.0133132), + (6.6079435, -1.0109358), + (6.6159434, -1.0084784), + (6.6239433, -1.0059696), + (6.631943, -1.0034382), + (6.639943, -1.0009129), + (6.647943, -0.9984215), + (6.655943, -0.99599105), + (6.663943, -0.9936476), + (6.6719427, -0.99141556), + (6.6799426, -0.98931783), + (6.6879425, -0.98737544), + (6.6959424, -0.98560715), + (6.7039423, -0.98402965), + (6.711942, -0.98265713), + (6.719942, -0.9815013), + (6.727942, -0.9805711), + (6.735942, -0.979873), + (6.743942, -0.97941077), + (6.7519417, -0.9791853), + (6.7599416, -0.97919506), + (6.7679415, -0.97943586), + (6.7759414, -0.9799009), + (6.7839413, -0.98058116), + (6.791941, -0.98146534), + (6.799941, -0.98253995), + (6.807941, -0.98378986), + (6.815941, -0.98519814), + (6.8239408, -0.98674625), + (6.8319407, -0.9884146), + (6.8399405, -0.99018264), + (6.8479404, -0.99202883), + (6.8559403, -0.9939314), + (6.8639402, -0.9958682), + (6.87194, -0.99781716), + (6.87994, -0.9997564), + (6.88794, -1.0016644), + (6.89594, -1.0035207), + (6.9039397, -1.0053055), + (6.9119396, -1.0070002), + (6.9199395, -1.0085876), + (6.9279394, -1.0100518), + (6.9359393, -1.0113788), + (6.943939, -1.0125563), + (6.951939, -1.0135736), + (6.959939, -1.0144224), + (6.967939, -1.0150962), + (6.975939, -1.0155905), + (6.9839387, -1.0159029), + (6.9919386, -1.0160332), + (6.9999385, -1.015983), + (7.0079384, -1.0157561), + (7.0159383, -1.0153582), + (7.023938, -1.0147965), + (7.031938, -1.0140803), + (7.039938, -1.0132201), + (7.047938, -1.0122279), + (7.055938, -1.0111173), + (7.0639377, -1.0099025), + (7.0719376, -1.0085988), + (7.0799375, -1.0072224), + (7.0879374, -1.0057898), + (7.0959373, -1.0043178), + (7.103937, -1.0028235), + (7.111937, -1.0013238), + (7.119937, -0.99983567), + (7.127937, -0.9983753), + (7.1359367, -0.99695843), + (7.1439366, -0.9956001), + (7.1519365, -0.9943144), + (7.1599364, -0.99311423), + (7.1679363, -0.99201155), + (7.175936, -0.99101686), + (7.183936, -0.99013937), + (7.191936, -0.9893867), + (7.199936, -0.9887651), + (7.207936, -0.98827916), + (7.2159357, -0.98793197), + (7.2239356, -0.98772484), + (7.2319355, -0.9876578), + (7.2399354, -0.987729), + (7.2479353, -0.98793536), + (7.255935, -0.98827213), + (7.263935, -0.98873335), + (7.271935, -0.9893117), + (7.279935, -0.9899987), + (7.287935, -0.9907849), + (7.2959347, -0.9916597), + (7.3039346, -0.99261194), + (7.3119345, -0.99362963), + (7.3199344, -0.99470043), + (7.3279343, -0.99581134), + (7.335934, -0.99694943), + (7.343934, -0.9981016), + (7.351934, -0.99925476), + (7.359934, -1.000396), + (7.3679338, -1.001513), + (7.3759336, -1.0025938), + (7.3839335, -1.0036267), + (7.3919334, -1.0046015), + (7.3999333, -1.005508), + (7.407933, -1.0063375), + (7.415933, -1.0070822), + (7.423933, -1.0077353), + (7.431933, -1.0082909), + (7.439933, -1.0087447), + (7.4479327, -1.0090934), + (7.4559326, -1.009335), + (7.4639325, -1.0094688), + (7.4719324, -1.0094949), + (7.4799323, -1.0094151), + (7.487932, -1.009232), + (7.495932, -1.0089496), + (7.503932, -1.0), + (7.511932, -1.0), + (7.519932, -1.0), + (7.5279317, -1.0), + (7.5359316, -1.0), + (7.5439315, -1.0), + (7.5519314, -1.0), + (7.5599313, -1.0), + (7.567931, -1.0), + (7.575931, -1.0), + (7.583931, -1.0), + (7.591931, -1.0), + (7.599931, -1.0), + (7.6079307, -1.0), + (7.6159306, -1.0), + (7.6239305, -1.0), + (7.6319304, -1.0), + (7.6399302, -1.0), + (7.64793, -1.0), + (7.65593, -1.0), + (7.66393, -1.0), + (7.67193, -1.0), + (7.6799297, -1.0), + (7.6879296, -1.0), + (7.6959295, -1.0), + (7.7039294, -1.0), + (7.7119293, -1.0), + (7.719929, -1.0), + (7.727929, -1.0), + (7.735929, -1.0), + (7.743929, -1.0), + (7.751929, -1.0), + (7.7599287, -1.0), + (7.7679286, -1.0), + (7.7759285, -1.0), + (7.7839284, -1.0), + (7.7919283, -1.0), + (7.799928, -1.0), + (7.807928, -1.0), + (7.815928, -1.0), + (7.823928, -1.0), + (7.831928, -1.0), + (7.8399277, -1.0), + (7.8479276, -1.0), + (7.8559275, -1.0), + (7.8639274, -1.0), + (7.8719273, -1.0), + (7.879927, -1.0), + (7.887927, -1.0), + (7.895927, -1.0), + (7.903927, -1.0), + (7.9119267, -1.0), + (7.9199266, -1.0), + (7.9279265, -1.0), + (7.9359264, -1.0), + (7.9439263, -1.0), + (7.951926, -1.0), + (7.959926, -1.0), + (7.967926, -1.0), + (7.975926, -1.0), + (7.983926, -1.0), + (7.9919257, -1.0), + (7.9999256, -1.0), + (8.007926, -1.0), + (8.015926, -1.0), + (8.023927, -1.0), + (8.031927, -1.0), + (8.0399275, -1.0), + (8.047928, -1.0), + (8.055928, -1.0), + (8.063929, -1.0), + (8.071929, -1.0), + (8.079929, -1.0), + (8.08793, -1.0), + (8.09593, -1.0), + (8.10393, -1.0), + (8.111931, -1.0), + (8.119931, -1.0), + (8.127932, -1.0), + (8.135932, -1.0), + (8.143932, -1.0), + (8.151933, -1.0), + (8.159933, -1.0), + (8.167933, -1.0), + (8.175934, -1.0), + (8.183934, -1.0), + (8.191935, -1.0), + (8.199935, -1.0), + (8.207935, -1.0), + (8.215936, -1.0), + (8.223936, -1.0), + (8.231936, -1.0), + (8.239937, -1.0), + (8.247937, -1.0), + (8.255938, -1.0), + (8.263938, -1.0), + (8.271938, -1.0), + (8.279939, -1.0), + (8.287939, -1.0), + (8.295939, -1.0), + (8.30394, -1.0), + (8.31194, -1.0), + (8.319941, -1.0), + (8.327941, -1.0), + (8.335941, -1.0), + (8.343942, -1.0), + (8.351942, -1.0), + (8.359942, -1.0), + (8.367943, -1.0), + (8.375943, -1.0), + (8.383944, -1.0), + (8.391944, -1.0), + (8.399944, -1.0), + (8.407945, -1.0), + (8.415945, -1.0), + (8.423945, -1.0), + (8.431946, -1.0), + (8.439946, -1.0), + (8.447947, -1.0), + (8.455947, -1.0), + (8.463947, -1.0), + (8.471948, -1.0), + (8.479948, -1.0), + (8.487948, -1.0), + (8.495949, -1.0), + (8.503949, -1.0), + (8.51195, -1.0), + (8.51995, -1.0), + (8.52795, -1.0), + (8.535951, -1.0), + (8.543951, -1.0), + (8.551951, -1.0), + (8.559952, -1.0), + (8.567952, -1.0), + (8.575953, -1.0), + (8.583953, -1.0), + (8.591953, -1.0), + (8.599954, -1.0), + (8.607954, -1.0), + (8.615954, -1.0), + (8.623955, -1.0), + (8.631955, -1.0), + (8.6399555, -1.0), + (8.647956, -1.0), + (8.655956, -1.0), + (8.663957, -1.0), + (8.671957, -1.0), + (8.679957, -1.0), + (8.687958, -1.0), + (8.695958, -1.0), + (8.7039585, -1.0), + (8.711959, -1.0), + (8.719959, -1.0), + (8.72796, -1.0), + (8.73596, -1.0), + (8.74396, -1.0), + (8.751961, -1.0), + (8.759961, -1.0), + (8.7679615, -1.0), + (8.775962, -1.0), + (8.783962, -1.0), + (8.791963, -1.0), + (8.799963, -1.0), + (8.807963, -1.0), + (8.815964, -1.0), + (8.823964, -1.0), + (8.8319645, -1.0), + (8.839965, -1.0), + (8.847965, -1.0), + (8.855966, -1.0), + (8.863966, -1.0), + (8.871966, -1.0), + (8.879967, -1.0), + (8.887967, -1.0), + (8.8959675, -1.0), + (8.903968, -1.0), + (8.911968, -1.0), + (8.919969, -1.0), + (8.927969, -1.0), + (8.935969, -1.0), + (8.94397, -1.0), + (8.95197, -1.0), + (8.95997, -1.0), + (8.967971, -1.0), + (8.975971, -1.0), + (8.983972, -1.0), + (8.991972, -1.0), + (8.999972, -1.0), + (9.007973, -1.0), + (9.015973, -1.0), + (9.023973, -1.0), + (9.031974, -1.0), + (9.039974, -1.0), + (9.047975, -1.0), + (9.055975, -1.0), + (9.063975, -1.0), + (9.071976, -1.0), + (9.079976, -1.0), + (9.087976, -1.0), + (9.095977, -1.0), + (9.103977, -1.0), + (9.111978, -1.0), + (9.119978, -1.0), + (9.127978, -1.0), + (9.135979, -1.0), + (9.143979, -1.0), + (9.151979, -1.0), + (9.15998, -1.0), + (9.16798, -1.0), + (9.175981, -1.0), + (9.183981, -1.0), + (9.191981, -1.0), + (9.199982, -1.0), + (9.207982, -1.0), + (9.215982, -1.0), + (9.223983, -1.0), + (9.231983, -1.0), + (9.239984, -1.0), + (9.247984, -1.0), + (9.255984, -1.0), + (9.263985, -1.0), + (9.271985, -1.0), + (9.279985, -1.0), + (9.287986, -1.0), + (9.295986, -1.0), + (9.303987, -1.0), + (9.311987, -1.0), + (9.319987, -1.0), + (9.327988, -1.0), + (9.335988, -1.0), + (9.343988, -1.0), + (9.351989, -1.0), + (9.359989, -1.0), + (9.36799, -1.0), + (9.37599, -1.0), + (9.38399, -1.0), + (9.391991, -1.0), + (9.399991, -1.0), + (9.407991, -1.0), + (9.415992, -1.0), + (9.423992, -1.0), + (9.431993, -1.0), + (9.439993, -1.0), + (9.447993, -1.0), + (9.455994, -1.0), + (9.463994, -1.0), + (9.471994, -1.0), + (9.479995, -1.0), + (9.487995, -1.0), + (9.4959955, -1.0), + (9.503996, -1.0), + (9.511996, -1.0), + (9.519997, -1.0), + (9.527997, -1.0), + (9.535997, -1.0), + (9.543998, -1.0), + (9.551998, -1.0), + (9.5599985, -1.0), + (9.567999, -1.0), + (9.575999, -1.0), + (9.584, -1.0), + (9.592, -1.0), + (9.6, -1.0), + (9.608001, -1.0), + (9.616001, -1.0), + (9.6240015, -1.0), + (9.632002, -1.0), + (9.640002, -1.0), + (9.648003, -1.0), + (9.656003, -1.0), + (9.664003, -1.0), + (9.672004, -1.0), + (9.680004, -1.0), + (9.6880045, -1.0), + (9.696005, -1.0), + (9.704005, -1.0), + (9.712006, -1.0), + (9.720006, -1.0), + (9.728006, -1.0), + (9.736007, -1.0), + (9.744007, -1.0), + (9.7520075, -1.0), + (9.760008, -1.0), + (9.768008, -1.0), + (9.776009, -1.0), + (9.784009, -1.0), + (9.792009, -1.0), + (9.80001, -1.0), + (9.80801, -1.0), + (9.81601, -1.0), + (9.824011, -1.0), + (9.832011, -1.0), + (9.840012, -1.0), + (9.848012, -1.0), + (9.856012, -1.0), + (9.864013, -1.0), + (9.872013, -1.0), + (9.880013, -1.0), + (9.888014, -1.0), + (9.896014, -1.0), + (9.904015, -1.0), + (9.912015, -1.0), + (9.920015, -1.0), + (9.928016, -1.0), + (9.936016, -1.0), + (9.944016, -1.0), + (9.952017, -1.0), + (9.960017, -1.0), + (9.968018, -1.0), + (9.976018, -1.0), + (9.984018, -1.0), + (9.992019, -1.0), + (10.000019, -1.0), + (10.008019, -1.0), + (10.01602, -1.0), + (10.02402, -1.0), + (10.032021, -1.0), + (10.040021, -1.0), + (10.048021, -1.0), + (10.056022, -1.0), + (10.064022, -1.0), + (10.072022, -1.0), + (10.080023, -1.0), + (10.088023, -1.0), + (10.096024, -1.0), + (10.104024, -1.0), + (10.112024, -1.0), + (10.120025, -1.0), + (10.128025, -1.0), + (10.136025, -1.0), + (10.144026, -1.0), + (10.152026, -1.0), + (10.160027, -1.0), + (10.168027, -1.0), + (10.176027, -1.0), + (10.184028, -1.0), + (10.192028, -1.0), + (10.200028, -1.0), + (10.208029, -1.0), + (10.216029, -1.0), + (10.22403, -1.0), + (10.23203, -1.0), + (10.24003, -1.0), + (10.248031, -1.0), + (10.256031, -1.0), + (10.264031, -1.0), + (10.272032, -1.0), + (10.280032, -1.0), + (10.288033, -1.0), + (10.296033, -1.0), + (10.304033, -1.0), + (10.312034, -1.0), + (10.320034, -1.0), + (10.328034, -1.0), + (10.336035, -1.0), + (10.344035, -1.0), + (10.3520355, -1.0), + (10.360036, -1.0), + (10.368036, -1.0), + (10.376037, -1.0), + (10.384037, -1.0), + (10.392037, -1.0), + (10.400038, -1.0), + (10.408038, -1.0), + (10.4160385, -1.0), + (10.424039, -1.0), + (10.432039, -1.0), + (10.44004, -1.0), + (10.44804, -1.0), + (10.45604, -1.0), + (10.464041, -1.0), + (10.472041, -1.0), + (10.4800415, -1.0), + (10.488042, -1.0), + (10.496042, -1.0), + (10.504043, -1.0), + (10.512043, -1.0), + (10.520043, -1.0), + (10.528044, -1.0), + (10.536044, -1.0), + (10.5440445, -1.0), + (10.552045, -1.0), + (10.560045, -1.0), + (10.568046, -1.0), + (10.576046, -1.0), + (10.584046, -1.0), + (10.592047, -1.0), + (10.600047, -1.0), + (10.6080475, -1.0), + (10.616048, -1.0), + (10.624048, -1.0), + (10.632049, -1.0), + (10.640049, -1.0), + (10.648049, -1.0), + (10.65605, -1.0), + (10.66405, -1.0), + (10.67205, -1.0), + (10.680051, -1.0), + (10.688051, -1.0), + (10.696052, -1.0), + (10.704052, -1.0), + (10.712052, -1.0), + (10.720053, -1.0), + (10.728053, -1.0), + (10.736053, -1.0), + (10.744054, -1.0), + (10.752054, -1.0), + (10.760055, -1.0), + (10.768055, -1.0), + (10.776055, -1.0), + (10.784056, -1.0), + (10.792056, -1.0), + (10.800056, -1.0), + (10.808057, -1.0), + (10.816057, -1.0), + (10.824058, -1.0), + (10.832058, -1.0), + (10.840058, -1.0), + (10.848059, -1.0), + (10.856059, -1.0), + (10.864059, -1.0), + (10.87206, -1.0), + (10.88006, -1.0), + (10.888061, -1.0), + (10.896061, -1.0), + (10.904061, -1.0), + (10.912062, -1.0), + (10.920062, -1.0), + (10.928062, -1.0), + (10.936063, -1.0), + (10.944063, -1.0), + (10.952064, -1.0), + (10.960064, -1.0), + (10.968064, -1.0), + (10.976065, -1.0), + (10.984065, -1.0), + (10.992065, -1.0), + (11.000066, -0.9983549), + (11.008066, -0.79834557), + (11.016067, -0.5983362), + (11.024067, -0.39832687), + (11.032067, -0.19831753), + (11.040068, 1.6918182e-3), + (11.048068, 0.20170116), + (11.056068, 0.4017105), + (11.064069, 0.60171986), + (11.072069, 0.8017292), + (11.08007, 1.0017385), + (11.08807, 1.2017479), + (11.09607, 1.4017572), + (11.104071, 1.6017666), + (11.112071, 1.8017759), + (11.120071, 2.0017853), + (11.128072, 2.2017946), + (11.136072, 2.401804), + (11.144073, 2.6018133), + (11.152073, 2.8018227), + (11.160073, 3.001832), + (11.168074, 3.2018414), + (11.176074, 3.4018507), + (11.184074, 3.60186), + (11.192075, 3.8018694), + (11.200075, 4.000189), + (11.208076, 4.020098), + (11.216076, 4.039489), + (11.224076, 4.0581737), + (11.232077, 4.0759754), + (11.240077, 4.0927286), + (11.248077, 4.1082807), + (11.256078, 4.1224947), + (11.264078, 4.1352477), + (11.2720785, 4.146435), + (11.280079, 4.155968), + (11.288079, 4.163778), + (11.29608, 4.169812), + (11.30408, 4.1740384), + (11.31208, 4.176443), + (11.320081, 4.177031), + (11.328081, 4.1758246), + (11.3360815, 4.1728644), + (11.344082, 4.1682086), + (11.352082, 4.161931), + (11.360083, 4.1541204), + (11.368083, 4.14488), + (11.376083, 4.1343255), + (11.384084, 4.1225843), + (11.392084, 4.1097937), + (11.4000845, 4.096099), + (11.408085, 4.0816526), + (11.416085, 4.0666127), + (11.424086, 4.05114), + (11.432086, 4.035397), + (11.440086, 4.019547), + (11.448087, 4.0037518), + (11.456087, 3.9881692), + (11.4640875, 3.9729538), + (11.472088, 3.958252), + (11.480088, 3.9442048), + (11.488089, 3.930943), + (11.496089, 3.9185877), + (11.504089, 3.9072495), + (11.51209, 3.8970265), + (11.52009, 3.8880038), + (11.5280905, 3.8802538), + (11.536091, 3.8738337), + (11.544091, 3.8687878), + (11.552092, 3.8651443), + (11.560092, 3.8629189), + (11.568092, 3.8621106), + (11.576093, 3.8627052), + (11.584093, 3.8646746), + (11.592093, 3.8679771), + (11.600094, 3.8725586), + (11.608094, 3.8783517), + (11.616095, 3.8852797), + (11.624095, 3.8932538), + (11.632095, 3.9021783), + (11.640096, 3.9119468), + (11.648096, 3.9224482), + (11.656096, 3.9335647), + (11.664097, 3.9451742), + (11.672097, 3.9571528), + (11.680098, 3.9693727), + (11.688098, 3.981708), + (11.696098, 3.9940314), + (11.704099, 4.0062194), + (11.712099, 4.0181518), + (11.720099, 4.0297112), + (11.7281, 4.0407877), + (11.7361, 4.051277), + (11.744101, 4.0610833), + (11.752101, 4.070118), + (11.760101, 4.078302), + (11.768102, 4.085567), + (11.776102, 4.0918536), + (11.784102, 4.0971146), + (11.792103, 4.101313), + (11.800103, 4.1044235), + (11.808104, 4.1064315), + (11.816104, 4.1073346), + (11.824104, 4.1071415), + (11.832105, 4.105871), + (11.840105, 4.1035533), + (11.848105, 4.100229), + (11.856106, 4.0959463), + (11.864106, 4.090764), + (11.872107, 4.0847497), + (11.880107, 4.0779757), + (11.888107, 4.0705237), + (11.896108, 4.0624785), + (11.904108, 4.053931), + (11.912108, 4.044976), + (11.920109, 4.0357094), + (11.928109, 4.02623), + (11.93611, 4.0166364), + (11.94411, 4.0070276), + (11.95211, 3.9975004), + (11.960111, 3.9881496), + (11.968111, 3.9790664), + (11.976111, 3.9703388), + (11.984112, 3.9620485), + (11.992112, 3.9542727), + (12.000113, 3.9470816), + (12.008113, 3.9405375), + (12.016113, 3.9346972), + (12.024114, 3.9296079), + (12.032114, 3.9253092), + (12.040114, 3.9218316), + (12.048115, 3.919197), + (12.056115, 3.9174194), + (12.064116, 3.9165025), + (12.072116, 3.916442), + (12.080116, 3.9172244), + (12.088117, 3.9188294), + (12.096117, 3.921227), + (12.104117, 3.9243808), + (12.112118, 3.928247), + (12.120118, 3.932775), + (12.1281185, 3.9379091), + (12.136119, 3.9435878), + (12.144119, 3.9497452), + (12.15212, 3.9563112), + (12.16012, 3.9632134), + (12.16812, 3.9703774), + (12.176121, 3.977726), + (12.184121, 3.9851823), + (12.1921215, 3.99267), + (12.200122, 4.0001125), + (12.208122, 4.007436), + (12.216123, 4.0145683), + (12.224123, 4.02144), + (12.232123, 4.027987), + (12.240124, 4.0341477), + (12.248124, 4.0398664), + (12.2561245, 4.045092), + (12.264125, 4.049781), + (12.272125, 4.0538926), + (12.280126, 4.057396), + (12.288126, 4.0602655), + (12.296126, 4.0624814), + (12.304127, 4.064032), + (12.312127, 4.0649133), + (12.3201275, 4.0651255), + (12.328128, 4.0646777), + (12.336128, 4.0635853), + (12.344129, 4.0618687), + (12.352129, 4.059556), + (12.360129, 4.0566792), + (12.36813, 4.053277), + (12.37613, 4.0493917), + (12.3841305, 4.0450697), + (12.392131, 4.0403624), + (12.400131, 4.0353227), + (12.408132, 4.0300064), + (12.416132, 4.0244727), + (12.424132, 4.0187798), + (12.432133, 4.0129876), + (12.440133, 4.007157), + (12.448133, 4.0013466), + (12.456134, 3.9956145), + (12.464134, 3.990018), + (12.472135, 3.984611), + (12.480135, 3.9794445), + (12.488135, 3.974568), + (12.496136, 3.9700246), + (12.504136, 3.9658556), + (12.512136, 3.9620976), + (12.520137, 3.9587808), + (12.528137, 3.9559326), + (12.536138, 3.9535737), + (12.544138, 3.9517202), + (12.552138, 3.9503832), + (12.560139, 3.9495673), + (12.568139, 3.949273), + (12.576139, 3.9494948), + (12.58414, 3.9502225), + (12.59214, 3.9514399), + (12.600141, 3.9531279), + (12.608141, 3.9552617), + (12.616141, 3.9578128), + (12.624142, 3.9607487), + (12.632142, 3.9640336), + (12.640142, 3.967629), + (12.648143, 3.9714937), + (12.656143, 3.975584), + (12.664144, 3.979856), + (12.672144, 3.9842634), + (12.680144, 3.9887595), + (12.688145, 3.993297), + (12.696145, 3.9978309), + (12.704145, 4.002314), + (12.712146, 4.006703), + (12.720146, 4.0109544), + (12.728147, 4.015028), + (12.736147, 4.0188856), + (12.744147, 4.0224915), + (12.752148, 4.0258136), + (12.760148, 4.0288224), + (12.768148, 4.0314927), + (12.776149, 4.0338035), + (12.784149, 4.0357366), + (12.79215, 4.0372787), + (12.80015, 4.0384207), + (12.80815, 4.039157), + (12.816151, 4.039487), + (12.824151, 4.0394135), + (12.832151, 4.038944), + (12.840152, 4.0380893), + (12.848152, 4.036864), + (12.856153, 4.0352864), + (12.864153, 4.033378), + (12.872153, 4.0311637), + (12.880154, 4.0286703), + (12.888154, 4.0259275), + (12.896154, 4.022967), + (12.904155, 4.019821), + (12.912155, 4.016526), + (12.920156, 4.0131164), + (12.928156, 4.009629), + (12.936156, 4.0060997), + (12.944157, 4.002565), + (12.952157, 3.9990602), + (12.960157, 3.9956207), + (12.968158, 3.99228), + (12.976158, 3.98907), + (12.9841585, 3.986021), + (12.992159, 3.983162), + (13.000159, 3.9805174), + (13.00816, 3.9781117), + (13.01616, 3.9759645), + (13.02416, 3.974094), + (13.032161, 3.9725142), + (13.040161, 3.9712367), + (13.0481615, 3.9702697), + (13.056162, 3.9696174), + (13.064162, 3.9692817), + (13.072163, 3.9692612), + (13.080163, 3.969551), + (13.088163, 3.9701433), + (13.096164, 3.971027), + (13.104164, 3.972189), + (13.1121645, 3.9736128), + (13.120165, 3.9752798), + (13.128165, 3.97717), + (13.136166, 3.97926), + (13.144166, 3.981526), + (13.152166, 3.9839425), + (13.160167, 3.9864821), + (13.168167, 3.989118), + (13.1761675, 3.9918218), + (13.184168, 3.994565), + (13.192168, 3.9973197), + (13.200169, 4.000057), + (13.208169, 4.002751), + (13.216169, 4.0053744), + (13.22417, 4.0079017), + (13.23217, 4.0103097), + (13.2401705, 4.012575), + (13.248171, 4.0146775), + (13.256171, 4.016599), + (13.264172, 4.018323), + (13.272172, 4.019834), + (13.280172, 4.0211215), + (13.288173, 4.022176), + (13.296173, 4.0229897), + (13.304173, 4.0235586), + (13.312174, 4.0238814), + (13.320174, 4.023958), + (13.328175, 4.023792), + (13.336175, 4.023389), + (13.344175, 4.022756), + (13.352176, 4.021904), + (13.360176, 4.0208445), + (13.368176, 4.019592), + (13.376177, 4.0181613), + (13.384177, 4.0165706), + (13.392178, 4.0148377), + (13.400178, 4.0129833), + (13.408178, 4.0110273), + (13.416179, 4.008991), + (13.424179, 4.0068965), + (13.432179, 4.0047655), + (13.44018, 4.00262), + (13.44818, 4.000483), + (13.456181, 3.9983745), + (13.464181, 3.996316), + (13.472181, 3.994327), + (13.480182, 3.9924273), + (13.488182, 3.990634), + (13.496182, 3.9889631), + (13.504183, 3.9874306), + (13.512183, 3.9860487), + (13.520184, 3.98483), + (13.528184, 3.9837828), + (13.536184, 3.9829164), + (13.544185, 3.9822354), + (13.552185, 3.9817448), + (13.560185, 3.9814458), + (13.568186, 3.9813385), + (13.576186, 3.981421), + (13.584187, 3.98169), + (13.592187, 3.982139), + (13.600187, 3.982761), + (13.608188, 3.9835467), + (13.616188, 3.984486), + (13.624188, 3.985567), + (13.632189, 3.9867759), + (13.640189, 3.9880996), + (13.64819, 3.9895215), + (13.65619, 3.9910269), + (13.66419, 3.992599), + (13.672191, 3.9942203), + (13.680191, 3.9958744), + (13.688191, 3.9975438), + (13.696192, 3.9992118), + (13.704192, 4.0008607), + (13.712193, 4.0024753), + (13.720193, 4.004039), + (13.728193, 4.005537), + (13.736194, 4.0069556), + (13.744194, 4.0082817), + (13.752194, 4.009503), + (13.760195, 4.010609), + (13.768195, 4.011591), + (13.776196, 4.01244), + (13.784196, 4.0131507), + (13.792196, 4.013717), + (13.800197, 4.0141363), + (13.808197, 4.014406), + (13.816197, 4.014527), + (13.824198, 4.0144987), + (13.832198, 4.014325), + (13.8401985, 4.01401), + (13.848199, 4.0135584), + (13.856199, 4.0129776), + (13.8642, 4.0122747), + (13.8722, 4.0114594), + (13.8802, 4.0105414), + (13.888201, 4.009532), + (13.896201, 4.0084424), + (13.9042015, 4.007285), + (13.912202, 4.0060725), + (13.920202, 4.004818), + (13.928203, 4.003535), + (13.936203, 4.0022364), + (13.944203, 4.000936), + (13.952204, 3.9996467), + (13.960204, 3.9983816), + (13.9682045, 3.9971528), + (13.976205, 3.9959722), + (13.984205, 3.994851), + (13.992206, 3.9937997), + (14.000206, 3.9928274), + (14.008206, 3.991943), + (14.016207, 3.9911537), + (14.024207, 3.990466), + (14.0322075, 3.9898853), + (14.040208, 3.9894161), + (14.048208, 3.9890609), + (14.056209, 3.988822), + (14.064209, 3.988699), + (14.072209, 3.9886923), + (14.08021, 3.9887996), + (14.08821, 3.989018), + (14.0962105, 3.9893436), + (14.104211, 3.9897718), + (14.112211, 3.990296), + (14.120212, 3.9909096), + (14.128212, 3.9916053), + (14.136212, 3.992375), + (14.144213, 3.993209), + (14.152213, 3.9940982), + (14.160213, 3.9950328), + (14.168214, 3.9960027), + (14.176214, 3.9969974), + (14.184215, 3.9980063), + (14.192215, 3.9990196), + (14.200215, 3.996408), + (14.208216, 3.863068), + (14.216216, 3.7297287), + (14.224216, 3.5963893), + (14.232217, 3.4630494), + (14.240217, 3.32971), + (14.248218, 3.1963706), + (14.256218, 3.0630307), + (14.264218, 2.9296913), + (14.272219, 2.796352), + (14.280219, 2.6630123), + (14.288219, 2.5296726), + (14.29622, 2.3963332), + (14.30422, 2.2629936), + (14.312221, 2.129654), + (14.320221, 1.9963145), + (14.328221, 1.8629749), + (14.336222, 1.7296352), + (14.344222, 1.5962958), + (14.352222, 1.4629562), + (14.360223, 1.3296165), + (14.368223, 1.1962771), + (14.376224, 1.0629375), + (14.384224, 0.92959785), + (14.392224, 0.79625845), + (14.400225, 0.6629188), + (14.408225, 0.5295794), + (14.416225, 0.39623976), + (14.424226, 0.2629001), + (14.432226, 0.12956071), + (14.440227, -3.7789345e-3), + (14.448227, -0.13711834), + (14.456227, -0.27045822), + (14.464228, -0.40379763), + (14.472228, -0.53713703), + (14.480228, -0.6704769), + (14.488229, -0.8038163), + (14.496229, -0.9371557), + (14.50423, -1.0138799), + (14.51223, -1.0396309), + (14.52023, -1.0644922), + (14.528231, -1.0882031), + (14.536231, -1.1105201), + (14.544231, -1.1312197), + (14.552232, -1.1501), + (14.560232, -1.1669829), + (14.568233, -1.1817157), + (14.576233, -1.1941723), + (14.584233, -1.2042537), + (14.592234, -1.2118895), + (14.600234, -1.2170376), + (14.608234, -1.219684), + (14.616235, -1.219843), + (14.624235, -1.2175564), + (14.632236, -1.212892), + (14.640236, -1.2059433), + (14.648236, -1.1968274), + (14.656237, -1.1856833), + (14.664237, -1.1726702), + (14.672237, -1.1579654), + (14.680238, -1.1417618), + (14.688238, -1.1242657), + (14.6962385, -1.1056938), + (14.704239, -1.0862715), + (14.712239, -1.0662293), + (14.72024, -1.045801), + (14.72824, -1.02522), + (14.73624, -1.004718), + (14.744241, -0.98452103), + (14.752241, -0.9648486), + (14.7602415, -0.9459099), + (14.768242, -0.92790276), + (14.776242, -0.9110109), + (14.784243, -0.89540267), + (14.792243, -0.88122904), + (14.800243, -0.86862254), + (14.808244, -0.85769594), + (14.816244, -0.8485412), + (14.8242445, -0.8412293), + (14.832245, -0.83580923), + (14.840245, -0.8323083), + (14.848246, -0.83073187), + (14.856246, -0.8310639), + (14.864246, -0.83326745), + (14.872247, -0.83728534), + (14.880247, -0.84304124), + (14.8882475, -0.85044086), + (14.896248, -0.8593734), + (14.904248, -0.8697127), + (14.912249, -0.88131946), + (14.920249, -0.8940425), + (14.928249, -0.90772104), + (14.93625, -0.9221863), + (14.94425, -0.93726397), + (14.9522505, -0.9527756), + (14.960251, -0.9685415), + (14.968251, -0.98438185), + (14.976252, -1.0001194), + (14.984252, -1.015581), + (14.992252, -1.0305998), + (15.000253, -1.0450164), + (15.008253, -1.0586814), + (15.016253, -1.0714558), + (15.024254, -1.0832133), + (15.032254, -1.0938411), + (15.040255, -1.1032405), + (15.048255, -1.1113287), + (15.056255, -1.1180388), + (15.064256, -1.12332), + (15.072256, -1.1271389), + (15.080256, -1.1294781), + (15.088257, -1.1303378), + (15.096257, -1.1297342), + (15.104258, -1.1276994), + (15.112258, -1.1242812), + (15.120258, -1.1195414), + (15.128259, -1.113556), + (15.136259, -1.1064131), + (15.144259, -1.0982125), + (15.15226, -1.0890635), + (15.16026, -1.0790844), + (15.168261, -1.0684005), + (15.176261, -1.0571431), + (15.184261, -1.0454471), + (15.192262, -1.03345), + (15.200262, -1.0212905), + (15.208262, -1.0091068), + (15.216263, -0.99703425), + (15.224263, -0.98520535), + (15.232264, -0.97374713), + (15.240264, -0.96278065), + (15.248264, -0.9524191), + (15.256265, -0.9427671), + (15.264265, -0.93391937), + (15.272265, -0.92596036), + (15.280266, -0.918963), + (15.288266, -0.9129882), + (15.296267, -0.9080845), + (15.304267, -0.9042878), + (15.312267, -0.9016209), + (15.320268, -0.9000938), + (15.328268, -0.8997035), + (15.336268, -0.9004345), + (15.344269, -0.9022592), + (15.352269, -0.90513813), + (15.36027, -0.909021), + (15.36827, -0.91384715), + (15.37627, -0.9195464), + (15.384271, -0.9260403), + (15.392271, -0.93324274), + (15.400271, -0.9410613), + (15.408272, -0.94939846), + (15.416272, -0.9581524), + (15.424273, -0.96721876), + (15.432273, -0.9764911), + (15.440273, -0.9858629), + (15.448274, -0.9952283), + (15.456274, -1.0044833), + (15.464274, -1.0135272), + (15.472275, -1.0222628), + (15.480275, -1.0305986), + (15.488276, -1.0384489), + (15.496276, -1.0457352), + (15.504276, -1.052386), + (15.512277, -1.0583386), + (15.520277, -1.0635391), + (15.528277, -1.067943), + (15.536278, -1.0715148), + (15.544278, -1.0742297), + (15.5522785, -1.0760725), + (15.560279, -1.0770376), + (15.568279, -1.0771298), + (15.57628, -1.0763634), + (15.58428, -1.0747617), + (15.59228, -1.0723573), + (15.600281, -1.0691907), + (15.608281, -1.0653105), + (15.6162815, -1.0607723), + (15.624282, -1.0556378), + (15.632282, -1.0499748), + (15.640283, -1.0438552), + (15.648283, -1.037355), + (15.656283, -1.0305531), + (15.664284, -1.0235304), + (15.672284, -1.0163687), + (15.6802845, -1.0091501), + (15.688285, -1.0019557), + (15.696285, -0.9948652), + (15.704286, -0.9879554), + (15.712286, -0.98130006), + (15.720286, -0.9749685), + (15.728287, -0.9690257), + (15.736287, -0.96353066), + (15.7442875, -0.95853686), + (15.752288, -0.9540909), + (15.760288, -0.9502326), + (15.768289, -0.94699466), + (15.776289, -0.9444023), + (15.784289, -0.94247293), + (15.79229, -0.94121647), + (15.80029, -0.9406352), + (15.8082905, -0.9407237), + (15.816291, -0.94146943), + (15.824291, -0.9428525), + (15.832292, -0.9448465), + (15.840292, -0.9474186), + (15.848292, -0.9505301), + (15.856293, -0.954137), + (15.864293, -0.9581907), + (15.872293, -0.9626382), + (15.880294, -0.9674233), + (15.888294, -0.972487), + (15.896295, -0.97776794), + (15.904295, -0.98320395), + (15.912295, -0.9887317), + (15.920296, -0.9942882), + (15.928296, -0.99981123), + (15.936296, -1.00524), + (15.944297, -1.0105158), + (15.952297, -1.0155828), + (15.960298, -1.0203881), + (15.968298, -1.0248832), + (15.976298, -1.0290232), + (15.984299, -1.0327685), + (15.992299, -1.0360843), + (16.0003, -1.0389413), + (16.008299, -1.0413154), + (16.016298, -1.0431892), + (16.024298, -1.0445504), + (16.032297, -1.045393), + (16.040297, -1.0457165), + (16.048296, -1.0455265), + (16.056295, -1.0448341), + (16.064295, -1.0436556), + (16.072294, -1.0420127), + (16.080294, -1.0399318), + (16.088293, -1.0374434), + (16.096292, -1.0345825), + (16.104292, -1.0313873), + (16.112291, -1.0278991), + (16.12029, -1.0241619), + (16.12829, -1.0202215), + (16.13629, -1.016125), + (16.144289, -1.0119209), + (16.152288, -1.0076578), + (16.160288, -1.0033838), + (16.168287, -0.99914694), + (16.176287, -0.9949933), + (16.184286, -0.9909679), + (16.192286, -0.987113), + (16.200285, -0.9834686), + (16.208284, -0.9800713), + (16.216284, -0.97695476), + (16.224283, -0.9741486), + (16.232283, -0.97167856), + (16.240282, -0.9695663), + (16.248281, -0.9678289), + (16.25628, -0.9664793), + (16.26428, -0.9655256), + (16.27228, -0.9649716), + (16.28028, -0.9648164), + (16.288279, -0.96505475), + (16.296278, -0.9656772), + (16.304277, -0.9666701), + (16.312277, -0.96801597), + (16.320276, -0.96969366), + (16.328276, -0.97167885), + (16.336275, -0.97394395), + (16.344275, -0.9764591), + (16.352274, -0.97919184), + (16.360273, -0.9821081), + (16.368273, -0.9851723), + (16.376272, -0.98834777), + (16.384272, -0.99159724), + (16.392271, -0.9948834), + (16.40027, -0.99816906), + (16.40827, -1.0014178), + (16.41627, -1.0045941), + (16.424269, -1.0076638), + (16.432268, -1.010595), + (16.440268, -1.0133573), + (16.448267, -1.015923), + (16.456266, -1.0182672), + (16.464266, -1.0203674), + (16.472265, -1.0222046), + (16.480265, -1.0237632), + (16.488264, -1.0250306), + (16.496264, -1.0259978), + (16.504263, -1.0266593), + (16.512262, -1.0270131), + (16.520262, -1.0270605), + (16.528261, -1.0268066), + (16.53626, -1.0262592), + (16.54426, -1.0254297), + (16.55226, -1.0243322), + (16.560259, -1.0229834), + (16.568258, -1.0214028), + (16.576258, -1.0196121), + (16.584257, -1.0176346), + (16.592257, -1.0154958), + (16.600256, -1.0132222), + (16.608255, -1.0108413), + (16.616255, -1.0083815), + (16.624254, -1.0058714), + (16.632254, -1.00334), + (16.640253, -1.0008156), + (16.648252, -0.9983261), + (16.656252, -0.9958988), + (16.664251, -0.99355924), + (16.67225, -0.9913321), + (16.68025, -0.98924017), + (16.68825, -0.9873042), + (16.696249, -0.9855431), + (16.704248, -0.9839733), + (16.712248, -0.9826089), + (16.720247, -0.9814616), + (16.728247, -0.9805402), + (16.736246, -0.9798511), + (16.744246, -0.97939783), + (16.752245, -0.9791814), + (16.760244, -0.9792), + (16.768244, -0.9794494), + (16.776243, -0.9799227), + (16.784243, -0.98061085), + (16.792242, -0.98150235), + (16.800241, -0.9825838), + (16.80824, -0.9838399), + (16.81624, -0.9852537), + (16.82424, -0.9868066), + (16.83224, -0.9884789), + (16.840239, -0.9902501), + (16.848238, -0.99209875), + (16.856237, -0.9940029), + (16.864237, -0.99594045), + (16.872236, -0.9978893), + (16.880236, -0.99982756), + (16.888235, -1.001734), + (16.896235, -1.0035878), + (16.904234, -1.0053695), + (16.912233, -1.0070605), + (16.920233, -1.0086435), + (16.928232, -1.0101029), + (16.936232, -1.0114245), + (16.944231, -1.0125962), + (16.95223, -1.0136076), + (16.96023, -1.0144501), + (16.96823, -1.0151173), + (16.976229, -1.015605), + (16.984228, -1.0159107), + (16.992228, -1.0160345), + (17.000227, -1.0159779), + (17.008226, -1.0157448), + (17.016226, -1.0153408), + (17.024225, -1.0147735), + (17.032225, -1.0140519), + (17.040224, -1.0131868), + (17.048223, -1.0121902), + (17.056223, -1.0110757), + (17.064222, -1.0098575), + (17.072222, -1.0085511), + (17.080221, -1.0071725), + (17.08822, -1.0057381), + (17.09622, -1.0042652), + (17.10422, -1.0027704), + (17.112219, -1.0012711), + (17.120218, -0.99978375), + (17.128218, -0.9983247), + (17.136217, -0.99690974), + (17.144217, -0.99555385), + (17.152216, -0.994271), + (17.160215, -0.99307406), + (17.168215, -0.99197507), + (17.176214, -0.9909844), + (17.184214, -0.9901111), + (17.192213, -0.98936296), + (17.200212, -0.988746), + (17.208212, -0.98826486), + (17.216211, -0.9879225), + (17.22421, -0.98772025), + (17.23221, -0.98765796), + (17.24021, -0.9877339), + (17.248209, -0.9879447), + (17.256208, -0.9882859), + (17.264208, -0.9887512), + (17.272207, -0.98933333), + (17.280207, -0.99002385), + (17.288206, -0.99081314), + (17.296206, -0.99169075), + (17.304205, -0.9926453), + (17.312204, -0.993665), + (17.320204, -0.99473727), + (17.328203, -0.99584925), + (17.336203, -0.99698794), + (17.344202, -0.9981403), + (17.352201, -0.99929315), + (17.3602, -1.0004338), + (17.3682, -1.0015496), + (17.3762, -1.0026289), + (17.3842, -1.0036601), + (17.392199, -1.0046326), + (17.400198, -1.0055367), + (17.408197, -1.0063635), + (17.416197, -1.0071052), + (17.424196, -1.007755), + (17.432196, -1.0083075), + (17.440195, -1.0087578), + (17.448195, -1.0091031), + (17.456194, -1.0093411), + (17.464193, -1.0094713), + (17.472193, -1.009494), + (17.480192, -1.0094107), + (17.488192, -1.0092244), + (17.496191, -1.0089389), + (17.50419, -1.0), + (17.51219, -1.0), + (17.52019, -1.0), + (17.528189, -1.0), + (17.536188, -1.0), + (17.544188, -1.0), + (17.552187, -1.0), + (17.560186, -1.0), + (17.568186, -1.0), + (17.576185, -1.0), + (17.584185, -1.0), + (17.592184, -1.0), + (17.600183, -1.0), + (17.608183, -1.0), + (17.616182, -1.0), + (17.624182, -1.0), + (17.632181, -1.0), + (17.64018, -1.0), + (17.64818, -1.0), + (17.65618, -1.0), + (17.664179, -1.0), + (17.672178, -1.0), + (17.680178, -1.0), + (17.688177, -1.0), + (17.696177, -1.0), + (17.704176, -1.0), + (17.712175, -1.0), + (17.720175, -1.0), + (17.728174, -1.0), + (17.736174, -1.0), + (17.744173, -1.0), + (17.752172, -1.0), + (17.760172, -1.0), + (17.768171, -1.0), + (17.77617, -1.0), + (17.78417, -1.0), + (17.79217, -1.0), + (17.800169, -1.0), + (17.808168, -1.0), + (17.816168, -1.0), + (17.824167, -1.0), + (17.832167, -1.0), + (17.840166, -1.0), + (17.848166, -1.0), + (17.856165, -1.0), + (17.864164, -1.0), + (17.872164, -1.0), + (17.880163, -1.0), + (17.888163, -1.0), + (17.896162, -1.0), + (17.904161, -1.0), + (17.91216, -1.0), + (17.92016, -1.0), + (17.92816, -1.0), + (17.93616, -1.0), + (17.944159, -1.0), + (17.952158, -1.0), + (17.960157, -1.0), + (17.968157, -1.0), + (17.976156, -1.0), + (17.984156, -1.0), + (17.992155, -1.0), + (18.000154, -1.0), + (18.008154, -1.0), + (18.016153, -1.0), + (18.024153, -1.0), + (18.032152, -1.0), + (18.040152, -1.0), + (18.048151, -1.0), + (18.05615, -1.0), + (18.06415, -1.0), + (18.07215, -1.0), + (18.080149, -1.0), + (18.088148, -1.0), + (18.096148, -1.0), + (18.104147, -1.0), + (18.112146, -1.0), + (18.120146, -1.0), + (18.128145, -1.0), + (18.136145, -1.0), + (18.144144, -1.0), + (18.152143, -1.0), + (18.160143, -1.0), + (18.168142, -1.0), + (18.176142, -1.0), + (18.184141, -1.0), + (18.19214, -1.0), + (18.20014, -1.0), + (18.20814, -1.0), + (18.216139, -1.0), + (18.224138, -1.0), + (18.232138, -1.0), + (18.240137, -1.0), + (18.248137, -1.0), + (18.256136, -1.0), + (18.264135, -1.0), + (18.272135, -1.0), + (18.280134, -1.0), + (18.288134, -1.0), + (18.296133, -1.0), + (18.304132, -1.0), + (18.312132, -1.0), + (18.320131, -1.0), + (18.32813, -1.0), + (18.33613, -1.0), + (18.34413, -1.0), + (18.352129, -1.0), + (18.360128, -1.0), + (18.368128, -1.0), + (18.376127, -1.0), + (18.384127, -1.0), + (18.392126, -1.0), + (18.400126, -1.0), + (18.408125, -1.0), + (18.416124, -1.0), + (18.424124, -1.0), + (18.432123, -1.0), + (18.440123, -1.0), + (18.448122, -1.0), + (18.456121, -1.0), + (18.46412, -1.0), + (18.47212, -1.0), + (18.48012, -1.0), + (18.48812, -1.0), + (18.496119, -1.0), + (18.504118, -1.0), + (18.512117, -1.0), + (18.520117, -1.0), + (18.528116, -1.0), + (18.536116, -1.0), + (18.544115, -1.0), + (18.552114, -1.0), + (18.560114, -1.0), + (18.568113, -1.0), + (18.576113, -1.0), + (18.584112, -1.0), + (18.592112, -1.0), + (18.600111, -1.0), + (18.60811, -1.0), + (18.61611, -1.0), + (18.62411, -1.0), + (18.632109, -1.0), + (18.640108, -1.0), + (18.648108, -1.0), + (18.656107, -1.0), + (18.664106, -1.0), + (18.672106, -1.0), + (18.680105, -1.0), + (18.688105, -1.0), + (18.696104, -1.0), + (18.704103, -1.0), + (18.712103, -1.0), + (18.720102, -1.0), + (18.728102, -1.0), + (18.736101, -1.0), + (18.7441, -1.0), + (18.7521, -1.0), + (18.7601, -1.0), + (18.768099, -1.0), + (18.776098, -1.0), + (18.784098, -1.0), + (18.792097, -1.0), + (18.800097, -1.0), + (18.808096, -1.0), + (18.816095, -1.0), + (18.824095, -1.0), + (18.832094, -1.0), + (18.840094, -1.0), + (18.848093, -1.0), + (18.856092, -1.0), + (18.864092, -1.0), + (18.872091, -1.0), + (18.88009, -1.0), + (18.88809, -1.0), + (18.89609, -1.0), + (18.904089, -1.0), + (18.912088, -1.0), + (18.920088, -1.0), + (18.928087, -1.0), + (18.936087, -1.0), + (18.944086, -1.0), + (18.952085, -1.0), + (18.960085, -1.0), + (18.968084, -1.0), + (18.976084, -1.0), + (18.984083, -1.0), + (18.992083, -1.0), + (19.000082, -1.0), + (19.008081, -1.0), + (19.01608, -1.0), + (19.02408, -1.0), + (19.03208, -1.0), + (19.04008, -1.0), + (19.048079, -1.0), + (19.056078, -1.0), + (19.064077, -1.0), + (19.072077, -1.0), + (19.080076, -1.0), + (19.088076, -1.0), + (19.096075, -1.0), + (19.104074, -1.0), + (19.112074, -1.0), + (19.120073, -1.0), + (19.128073, -1.0), + (19.136072, -1.0), + (19.144072, -1.0), + (19.152071, -1.0), + (19.16007, -1.0), + (19.16807, -1.0), + (19.17607, -1.0), + (19.184069, -1.0), + (19.192068, -1.0), + (19.200068, -1.0), + (19.208067, -1.0), + (19.216066, -1.0), + (19.224066, -1.0), + (19.232065, -1.0), + (19.240065, -1.0), + (19.248064, -1.0), + (19.256063, -1.0), + (19.264063, -1.0), + (19.272062, -1.0), + (19.280062, -1.0), + (19.288061, -1.0), + (19.29606, -1.0), + (19.30406, -1.0), + (19.31206, -1.0), + (19.320059, -1.0), + (19.328058, -1.0), + (19.336058, -1.0), + (19.344057, -1.0), + (19.352057, -1.0), + (19.360056, -1.0), + (19.368055, -1.0), + (19.376055, -1.0), + (19.384054, -1.0), + (19.392054, -1.0), + (19.400053, -1.0), + (19.408052, -1.0), + (19.416052, -1.0), + (19.424051, -1.0), + (19.43205, -1.0), + (19.44005, -1.0), + (19.44805, -1.0), + (19.456049, -1.0), + (19.464048, -1.0), + (19.472048, -1.0), + (19.480047, -1.0), + (19.488047, -1.0), + (19.496046, -1.0), + (19.504045, -1.0), + (19.512045, -1.0), + (19.520044, -1.0), + (19.528044, -1.0), + (19.536043, -1.0), + (19.544043, -1.0), + (19.552042, -1.0), + (19.560041, -1.0), + (19.56804, -1.0), + (19.57604, -1.0), + (19.58404, -1.0), + (19.59204, -1.0), + (19.600039, -1.0), + (19.608038, -1.0), + (19.616037, -1.0), + (19.624037, -1.0), + (19.632036, -1.0), + (19.640036, -1.0), + (19.648035, -1.0), + (19.656034, -1.0), + (19.664034, -1.0), + (19.672033, -1.0), + (19.680033, -1.0), + (19.688032, -1.0), + (19.696032, -1.0), + (19.704031, -1.0), + (19.71203, -1.0), + (19.72003, -1.0), + (19.72803, -1.0), + (19.736029, -1.0), + (19.744028, -1.0), + (19.752028, -1.0), + (19.760027, -1.0), + (19.768026, -1.0), + (19.776026, -1.0), + (19.784025, -1.0), + (19.792025, -1.0), + (19.800024, -1.0), + (19.808023, -1.0), + (19.816023, -1.0), + (19.824022, -1.0), + (19.832022, -1.0), + (19.840021, -1.0), + (19.84802, -1.0), + (19.85602, -1.0), + (19.86402, -1.0), + (19.872019, -1.0), + (19.880018, -1.0), + (19.888018, -1.0), + (19.896017, -1.0), + (19.904016, -1.0), + (19.912016, -1.0), + (19.920015, -1.0), + (19.928015, -1.0), + (19.936014, -1.0), + (19.944014, -1.0), + (19.952013, -1.0), + (19.960012, -1.0), + (19.968012, -1.0), + (19.976011, -1.0), + (19.98401, -1.0), + (19.99201, -1.0)] + diff --git a/testsuite/tests/programs/barton-mangler-bug/Main.hs b/testsuite/tests/programs/barton-mangler-bug/Main.hs new file mode 100644 index 0000000000..34b8dd8cd5 --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/Main.hs @@ -0,0 +1,28 @@ +module Main where +import Physical +import Basic +import TypesettingTricks +import PlotExample +import Expected +sinExample:: SignalRep Time Voltage +sinExample = sine (V 2.0) (Hz 10) 0.0 +sinPlot = plotExample "sine" sinExpected sinExample 0.0 1.0 +pieceExample = toSig Pulse_dc + { start_delay=(Sec 1.0), + rise_time=(Sec 0.2), + pulse_width=(Sec 3.0), + fall_time=(Sec 0.3), + dc_offset=(V (- 1.0)), + period=(Sec 10.0), + amplitude=(V 5.0), + over=Overshoot{ringing=(V 0.2), + pulse_width=(Sec 3.0), + oscillation=(Hz 2.0), + damp_fac=1.0}, + under=Overshoot{ringing=(V (- 0.25)), + pulse_width=(Sec 3.0), + oscillation=(Hz 2.10), + damp_fac=1.10} } +piecePlot = plotExample "piece" pieceExpected pieceExample 0.0 20.0 +main = putStrLn (sinPlot ++ piecePlot) + diff --git a/testsuite/tests/programs/barton-mangler-bug/Makefile b/testsuite/tests/programs/barton-mangler-bug/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/barton-mangler-bug/Physical.hs b/testsuite/tests/programs/barton-mangler-bug/Physical.hs new file mode 100644 index 0000000000..91981e0ac5 --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/Physical.hs @@ -0,0 +1,302 @@ +module Physical where +import TypesettingTricks +class (Eq a, Show a) => Physical a where + fromPhysical:: a -> Float + toPhysical:: Float -> a +instance Physical Float where + fromPhysical x = x + toPhysical x = x +data PlaneAngle = + Rad Float | + Mrad Float | + Urad Float | + Deg Float | + Rev Float + deriving (Eq, Show) +instance Physical PlaneAngle where + fromPhysical (Rad x) = x + fromPhysical (Mrad x) = realdiv x 1000 + fromPhysical (Urad x) = realdiv x 1000000 + fromPhysical (Deg x) = realdiv (realmul x pi) 180 + fromPhysical (Rev x) = realdiv x (realmul 2.0 pi) + toPhysical x = Rad x +data SolidAngle = + Sr Float | + Msr Float + deriving (Eq, Show) +instance Physical SolidAngle where + fromPhysical (Sr x) = x + fromPhysical (Msr x) = realdiv x 1000 + toPhysical x = Sr x +data BurstLength = + Cycle Float | + Pulse Float + deriving (Eq, Show) +instance Physical BurstLength where + fromPhysical (Cycle x) = x + fromPhysical (Pulse x) = x + toPhysical x = Cycle x +data Capacitance = + Fd Float | + Ufd Float | + Nfd Float | + Pfd Float + deriving (Eq, Show) +instance Physical Capacitance where + fromPhysical (Fd x) = x + fromPhysical (Ufd x) = realdiv x 1000000 + fromPhysical (Nfd x) = realdiv x 1000000000 + fromPhysical (Pfd x) = realdiv x 1000000000000 + toPhysical x = Fd x +data Charge = + C Float | + Kc Float | + Uc Float | + Nc Float + deriving (Eq, Show) +instance Physical Charge where + fromPhysical (C x) = x + fromPhysical (Kc x) = realmul 1000 x + fromPhysical (Uc x) = realdiv x 1000000 + fromPhysical (Nc x) = realdiv x 1000000000 + toPhysical x = C x +data Current = + A Float | + Ka Float | + Ma Float | + Ua Float | + Na Float + deriving (Eq, Show) +instance Physical Current where + fromPhysical (A x) = x + fromPhysical (Ka x) = realmul 1000 x + fromPhysical (Ma x) = realdiv x 1000 + fromPhysical (Ua x) = realdiv x 1000000 + fromPhysical (Na x) = realdiv x 1000000000 + toPhysical x = A x +data Distance = + M Float | + Km Float | + Mm Float | + Um Float | + Nm Float | + In Float | + Ft Float | + SMi Float | + NMi Float + deriving (Eq, Show) +instance Physical Distance where + fromPhysical (M x) = x + fromPhysical (Km x) = realmul 1000 x + fromPhysical (Mm x) = realdiv x 1000 + fromPhysical (Um x) = realdiv x 1000000 + fromPhysical (Nm x) = realdiv x 1000000000 + fromPhysical (In x) = realmul 25.4 x + fromPhysical (Ft x) = realmul 2.12 x + fromPhysical (SMi x) = realdiv x 2490.57 + fromPhysical (NMi x) = realdiv x 1825 + toPhysical x = M x +data Energy = + J Float | + Kj Float | + Mj Float | + Ev Float | + Kev Float | + Mev Float + deriving (Eq, Show) +instance Physical Energy where + fromPhysical (J x) = x + fromPhysical (Kj x) = realmul 1000 x + fromPhysical (Mj x) = realdiv x 1000 + fromPhysical (Ev x) = realmul 1.6E-19 x + fromPhysical (Kev x) = realmul 1.6E-16 x + fromPhysical (Mev x) = realmul 1.6E-13 x + toPhysical x = J x +data MagFlux = + Wb Float | + Mwb Float + deriving (Eq, Show) +instance Physical MagFlux where + fromPhysical (Wb x) = x + fromPhysical (Mwb x) = realdiv x 1000 + toPhysical x = Wb x +data FluxDensity = + T Float | + Mt Float | + Ut Float | + Gam Float + deriving (Eq, Show) +instance Physical FluxDensity where + fromPhysical (T x) = x + fromPhysical (Mt x) = realdiv x 1000 + fromPhysical (Ut x) = realdiv x 1000000 + fromPhysical (Gam x) = realdiv x 1000000000 + toPhysical x = T x +data Force = + N Float | + Kn Float | + Mn Float | + Un Float + deriving (Eq, Show) +instance Physical Force where + fromPhysical (N x) = x + fromPhysical (Kn x) = realmul 1000 x + fromPhysical (Mn x) = realdiv x 1000 + fromPhysical (Un x) = realdiv x 1000000 + toPhysical x = N x +data Frequency = + Hz Float | + Khz Float | + Mhz Float | + Ghz Float + deriving (Eq, Show) +instance Physical Frequency where + fromPhysical (Hz x) = x + fromPhysical (Khz x) = realmul 1000 x + fromPhysical (Mhz x) = realmul 1000000 x + fromPhysical (Ghz x) = realmul 1000000000 x + toPhysical x = Hz x +data Illuminance = + Lx Float + deriving (Eq, Show) +instance Physical Illuminance where + fromPhysical (Lx x) = x + toPhysical x = Lx x +data Inductance = + H Float | + Mh Float | + Uh Float | + Nh Float | + Ph Float + deriving (Eq, Show) +instance Physical Inductance where + fromPhysical (H x) = x + fromPhysical (Mh x) = realdiv x 1000 + fromPhysical (Uh x) = realdiv x 1000000 + fromPhysical (Nh x) = realdiv x 1000000000 + fromPhysical (Ph x) = realdiv x 1000000000000 + toPhysical x = H x +data Luminance = + Nt Float + deriving (Eq, Show) +instance Physical Luminance where + fromPhysical (Nt x) = x + toPhysical x = Nt x +data LuminFlux = + Lm Float + deriving (Eq, Read, Show) +instance Physical LuminFlux where + fromPhysical (Lm x) = x + toPhysical x = Lm x +data LuminInten = + Cd Float + deriving (Eq, Read, Show) +instance Physical LuminInten where + fromPhysical (Cd x) = x + toPhysical x = Cd x +data Mass = + Kg Float | + G Float | + Mg Float | + Ug Float + deriving (Eq, Show) +instance Physical Mass where + fromPhysical (Kg x) = x + fromPhysical (G x) = realdiv x 1000 + fromPhysical (Mg x) = realdiv x 1000000 + fromPhysical (Ug x) = realdiv x 1000000000 + toPhysical x = Kg x +data Power = + W Float | + Kw Float | + Mw Float | + Uw Float + deriving (Eq, Show) +instance Physical Power where + fromPhysical (W x) = x + fromPhysical (Kw x) = realmul 1000 x + fromPhysical (Mw x) = realdiv x 1000 + fromPhysical (Uw x) = realdiv x 1000000 + toPhysical x = W x +data Pressure = + Pa Float | + Kpa Float | + Mpa Float | + Upa Float | + Mb Float + deriving (Eq, Show) +instance Physical Pressure where + fromPhysical (Pa x) = x + fromPhysical (Kpa x) = realmul 1000 x + fromPhysical (Mpa x) = realdiv x 1000 + fromPhysical (Upa x) = realdiv x 1000000 + fromPhysical (Mb x) = realmul 100 x + toPhysical x = Pa x +data Pulse = + Pulses Float + deriving (Eq, Show) +instance Physical Pulse where + fromPhysical (Pulses x) = x + toPhysical x = Pulses x +data RatioInOut = + Db Float + deriving (Eq, Show) +instance Physical RatioInOut where + fromPhysical (Db x) = x + toPhysical x = Db x +data Resistance = + Ohm Float | + Kohm Float | + Mohm Float + deriving (Eq, Show) +instance Physical Resistance where + fromPhysical (Ohm x) = x + fromPhysical (Kohm x) = realmul 1000 x + fromPhysical (Mohm x) = realmul 1000000 x + toPhysical x = Ohm x +data Temperature = + Degk Float | + Degc Float | + Degf Float + deriving (Eq, Show) +instance Physical Temperature where + fromPhysical (Degk x) = x + fromPhysical (Degc x) = x + 273 + fromPhysical (Degf x) = (realdiv (realmul 5 (x-32)) 9) + 273 + toPhysical x = Degk x +data Time = + Sec Float | + Msec Float | + Usec Float | + Nsec Float | + Min Float | + Hr Float + deriving (Eq, Show) +instance Physical Time where + fromPhysical (Sec x) = x + fromPhysical (Msec x) = realdiv x 1000 + fromPhysical (Usec x) = realdiv x 1000000 + fromPhysical (Nsec x) = realdiv x 1000000000 + fromPhysical (Min x) = realmul 60 x + fromPhysical (Hr x) = realmul 3600 x + toPhysical x = Sec x +data Voltage = + V Float | + Kv Float | + Mv Float | + Uv Float + deriving (Eq, Show) +instance Physical Voltage where + fromPhysical (V x) = x + fromPhysical (Kv x) = realmul 1000 x + fromPhysical (Mv x) = realdiv x 1000 + fromPhysical (Uv x) = realdiv x 1000000 + toPhysical x = V x +data Volume = + L Float | + Ml Float + deriving (Eq, Show) +instance Physical Volume where + fromPhysical (L x) = x + fromPhysical (Ml x) = realdiv x 1000 + toPhysical x = L x diff --git a/testsuite/tests/programs/barton-mangler-bug/Plot.lhs b/testsuite/tests/programs/barton-mangler-bug/Plot.lhs new file mode 100644 index 0000000000..8db1066aef --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/Plot.lhs @@ -0,0 +1,79 @@ +The functions in this file (well, the single function) will allow the +user to plot different functions using the Gnuplot program. In fact, +all it really does is output a number of points on the list and allow +the user to activate Gnuplot and use the plotting program to get the +appropriate output. + +The first line just gives the module name. For the moment, I don't +anticipate using any modules (although this may change). + +> module Plot where + +Now we give the type of the function. This consists of a file name, a +list of values, and a function that goes from the appropriate types. + +> plot2d:: (Fractional a, Fractional b, Ord a, Ord b, Show a, Show b) +> => String -> [(a, b)] -> [a] -> (a -> b) -> String +> plot2d fl expected inp f = plot2d' expected inp f + +> plot2d':: (Fractional a, Fractional b, Ord a, Ord b, Show a, Show b) +> => [(a, b)] -> [a] -> (a -> b) -> String +> plot2d' [] [] f = [] +> plot2d' ((e1, e2):es) (x:xs) f +> | (e1 `isSame` x) && (e2 `isSame` x') +> = (show e1) ++ +> " " ++ +> (show e2) ++ +> "\n" ++ +> plot2d' es xs f +> | otherwise +> = "Mismatch: " ++ +> (show e1) ++ +> " " ++ +> (show e2) ++ +> " " ++ +> (show x) ++ +> " " ++ +> (show x') ++ +> "\n" ++ +> plot2d' es xs f +> where x' = f x +> plot2d' es [] _ = "Extra expected: " ++ show es +> plot2d' [] xs _ = "Extra results: " ++ show xs + +> isSame :: (Fractional a, Ord a) => a -> a -> Bool +> x `isSame` y = abs (x - y) < 0.00001 + +And now, let's create a function to make a range out of a triple of a +start point, an end point, and an increment. + +> createRange:: (Num a, Ord a) => a -> a -> a -> [a] +> createRange s e i = if s > e then [] +> else s : createRange (s+i) e i + +We now settle down to a couple of more specific functions that do +things that are more unique to gnuplot. First, we have something that +creates the appropriate gnuplot command file. + +> createGnuPlot:: Show a => String -> a -> a -> String +> createGnuPlot fl s e = +> "set terminal latex\n" ++ +> "set output \"" ++ +> (fl ++ ".tex\"\n") ++ +> "set nokey\n" ++ +> "plot [" ++ +> (show s) ++ +> ":" ++ +> (show e) ++ +> "] \"" ++ +> (fl ++ ".plt\"") ++ +> " with lines\n" + +And now we create a fairly specific plotExam function that takes a +string, a function, and two floats and produces the correct files + +> plotExam:: String -> [(Float, Float)] -> Float -> Float -> (Float -> Float) +> -> String +> plotExam fl expected s e f = plot2d (fl++".plt") expected r f ++ +> createGnuPlot fl s e +> where r = createRange s e ((e - s) / 2500) diff --git a/testsuite/tests/programs/barton-mangler-bug/PlotExample.lhs b/testsuite/tests/programs/barton-mangler-bug/PlotExample.lhs new file mode 100644 index 0000000000..66a13fbca7 --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/PlotExample.lhs @@ -0,0 +1,21 @@ +This file contains code that is explicitly designed to plot examples +from the signal modeling language. + +> module PlotExample where + +> import Plot +> import Physical +> import Basic + +Our main task is to take a signal and a begin and start point (both +reals) and convert it into something that plotExam can take in the +Plot module. + +> plotExample:: (Signal s, Physical a, Physical b) => +> String -> [(Float, Float)] -> s a b -> Float -> Float -> String +> plotExample fl expected sig s e = plotExam fl expected s e f +> where f = toFloatFunc f' +> f' = mapSignal sig + +> toFloatFunc:: (Physical a, Physical b) => (a -> b) -> Float -> Float +> toFloatFunc f x = fromPhysical (f (toPhysical x)) diff --git a/testsuite/tests/programs/barton-mangler-bug/TypesettingTricks.hs b/testsuite/tests/programs/barton-mangler-bug/TypesettingTricks.hs new file mode 100644 index 0000000000..446e4e868c --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/TypesettingTricks.hs @@ -0,0 +1,21 @@ +-- The functions in this file are expressly for the purpose of aiding +-- the typesetting of some functions with Smugweb. To this end, in +-- some cases I will use named, prefix functions rather than operators +-- (since under Smugweb operators cannot accept arguments). This file +-- will define those infix functions. + +module TypesettingTricks where + +realdiv:: Floating a => a -> a -> a +realdiv = (/) + +realmul:: Num a => a -> a -> a +realmul = (*) + +dotmul:: Num a => a -> a -> a +dotmul = (*) + +rand:: Integer -> [ Float ] +rand i = r : rand i' + where i' = ( (3146757 * i) + 1731) `mod` 4194304 + r = (fromInteger i') / 4194304.0 diff --git a/testsuite/tests/programs/barton-mangler-bug/barton-mangler-bug.stdout b/testsuite/tests/programs/barton-mangler-bug/barton-mangler-bug.stdout new file mode 100644 index 0000000000..7b801af7f3 --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/barton-mangler-bug.stdout @@ -0,0 +1,5009 @@ +0.0 0.0 +4.0e-4 5.0260194e-2 +8.0e-4 0.10048864 +1.1999999e-3 0.1506536 +1.6e-3 0.20072344 +1.9999999e-3 0.25066644 +2.3999999e-3 0.30045116 +2.8e-3 0.35004613 +3.2e-3 0.39941996 +3.6e-3 0.44854155 +3.9999997e-3 0.49737975 +4.3999995e-3 0.54590386 +4.7999993e-3 0.5940831 +5.199999e-3 0.6418871 +5.599999e-3 0.68928576 +5.9999987e-3 0.736249 +6.3999984e-3 0.7827472 +6.799998e-3 0.82875097 +7.199998e-3 0.87423134 +7.599998e-3 0.9191595 +7.999998e-3 0.96350706 +8.399998e-3 1.0072463 +8.799998e-3 1.0503491 +9.199998e-3 1.0927886 +9.599999e-3 1.1345378 +9.999999e-3 1.1755705 +1.0399999e-2 1.2158606 +1.0799999e-2 1.2553827 +1.12e-2 1.294112 +1.16e-2 1.3320237 +1.2e-2 1.3690943 +1.24e-2 1.4053 +1.2800001e-2 1.4406182 +1.3200001e-2 1.4750264 +1.3600001e-2 1.5085028 +1.4000001e-2 1.5410266 +1.4400002e-2 1.572577 +1.4800002e-2 1.6031342 +1.5200002e-2 1.6326787 +1.5600002e-2 1.661192 +1.6000003e-2 1.6886561 +1.6400002e-2 1.7150536 +1.6800001e-2 1.7403677 +1.72e-2 1.7645825 +1.76e-2 1.7876829 +1.8e-2 1.8096541 +1.8399999e-2 1.8304824 +1.8799998e-2 1.8501544 +1.9199997e-2 1.8686578 +1.9599997e-2 1.885981 +1.9999996e-2 1.902113 +2.0399995e-2 1.9170434 +2.0799994e-2 1.9307631 +2.1199994e-2 1.9432633 +2.1599993e-2 1.9545361 +2.1999992e-2 1.9645743 +2.2399992e-2 1.9733717 +2.2799991e-2 1.9809227 +2.319999e-2 1.9872226 +2.359999e-2 1.9922671 +2.3999989e-2 1.9960533 +2.4399988e-2 1.9985789 +2.4799988e-2 1.999842 +2.5199987e-2 1.999842 +2.5599986e-2 1.998579 +2.5999986e-2 1.9960536 +2.6399985e-2 1.9922674 +2.6799984e-2 1.9872228 +2.7199984e-2 1.980923 +2.7599983e-2 1.9733722 +2.7999982e-2 1.9645749 +2.8399982e-2 1.9545367 +2.879998e-2 1.943264 +2.919998e-2 1.930764 +2.959998e-2 1.9170443 +2.9999979e-2 1.9021138 +3.0399978e-2 1.8859819 +3.0799977e-2 1.8686588 +3.1199977e-2 1.8501555 +3.1599976e-2 1.8304834 +3.1999975e-2 1.8096554 +3.2399975e-2 1.7876841 +3.2799974e-2 1.7645838 +3.3199973e-2 1.7403691 +3.3599973e-2 1.715055 +3.3999972e-2 1.6886578 +3.439997e-2 1.6611936 +3.479997e-2 1.6326804 +3.519997e-2 1.6031361 +3.559997e-2 1.5725791 +3.599997e-2 1.541029 +3.6399968e-2 1.5085055 +3.6799967e-2 1.4750288 +3.7199967e-2 1.4406208 +3.7599966e-2 1.4053029 +3.7999965e-2 1.3690974 +3.8399965e-2 1.3320271 +3.8799964e-2 1.2941151 +3.9199963e-2 1.2553861 +3.9599963e-2 1.2158642 +3.999996e-2 1.1755743 +4.039996e-2 1.1345419 +4.079996e-2 1.0927929 +4.119996e-2 1.0503532 +4.159996e-2 1.0072505 +4.199996e-2 0.9635117 +4.2399958e-2 0.9191643 +4.2799957e-2 0.87423635 +4.3199956e-2 0.82875574 +4.3599956e-2 0.7827521 +4.3999955e-2 0.7362541 +4.4399954e-2 0.68929106 +4.4799954e-2 0.6418926 +4.5199953e-2 0.5940888 +4.5599952e-2 0.5459092 +4.599995e-2 0.49738535 +4.639995e-2 0.4485473 +4.679995e-2 0.39942592 +4.719995e-2 0.3500523 +4.759995e-2 0.30045706 +4.799995e-2 0.25067255 +4.8399948e-2 0.2007297 +4.8799947e-2 0.15066005 +4.9199946e-2 0.100495264 +4.9599946e-2 5.0266996e-2 +4.9999945e-2 6.500875e-6 +5.0399944e-2 -5.025352e-2 +5.0799944e-2 -0.1004818 +5.1199943e-2 -0.15064661 +5.1599942e-2 -0.20071629 +5.199994e-2 -0.25065964 +5.239994e-2 -0.30044422 +5.279994e-2 -0.350039 +5.319994e-2 -0.39941272 +5.359994e-2 -0.44853416 +5.3999938e-2 -0.4973723 +5.4399937e-2 -0.5458967 +5.4799937e-2 -0.5940759 +5.5199936e-2 -0.64187986 +5.5599935e-2 -0.6892784 +5.5999935e-2 -0.7362416 +5.6399934e-2 -0.7827402 +5.6799933e-2 -0.82874393 +5.7199933e-2 -0.87422425 +5.7599932e-2 -0.9191523 +5.799993e-2 -0.9634999 +5.839993e-2 -1.0072393 +5.879993e-2 -1.0503422 +5.919993e-2 -1.0927815 +5.959993e-2 -1.1345308 +5.9999928e-2 -1.1755633 +6.0399927e-2 -1.2158535 +6.0799927e-2 -1.255376 +6.1199926e-2 -1.2941052 +6.1599925e-2 -1.332017 +6.1999924e-2 -1.3690875 +6.2399924e-2 -1.4052932 +6.279992e-2 -1.4406117 +6.319992e-2 -1.4750199 +6.359992e-2 -1.5084965 +6.399992e-2 -1.5410206 +6.439992e-2 -1.5725712 +6.479992e-2 -1.6031283 +6.519992e-2 -1.6326729 +6.559992e-2 -1.6611863 +6.599992e-2 -1.6886505 +6.639992e-2 -1.7150481 +6.679992e-2 -1.7403624 +6.7199916e-2 -1.7645775 +6.7599915e-2 -1.7876781 +6.7999914e-2 -1.8096495 +6.839991e-2 -1.8304783 +6.879991e-2 -1.8501506 +6.919991e-2 -1.8686541 +6.959991e-2 -1.8859775 +6.999991e-2 -1.9021097 +7.039991e-2 -1.9170405 +7.079991e-2 -1.9307604 +7.119991e-2 -1.9432608 +7.159991e-2 -1.9545338 +7.199991e-2 -1.9645723 +7.239991e-2 -1.97337 +7.2799906e-2 -1.9809214 +7.3199905e-2 -1.9872214 +7.3599905e-2 -1.9922662 +7.3999904e-2 -1.9960527 +7.43999e-2 -1.9985785 +7.47999e-2 -1.9998419 +7.51999e-2 -1.9998423 +7.55999e-2 -1.9985794 +7.59999e-2 -1.9960542 +7.63999e-2 -1.9922683 +7.67999e-2 -1.9872241 +7.71999e-2 -1.9809245 +7.75999e-2 -1.9733739 +7.79999e-2 -1.9645768 +7.83999e-2 -1.9545388 +7.8799896e-2 -1.9432664 +7.9199895e-2 -1.9307666 +7.9599895e-2 -1.9170473 +7.9999894e-2 -1.902117 +8.039989e-2 -1.8859855 +8.079989e-2 -1.8686627 +8.119989e-2 -1.8501595 +8.159989e-2 -1.8304875 +8.199989e-2 -1.8096596 +8.239989e-2 -1.7876887 +8.279989e-2 -1.7645887 +8.319989e-2 -1.7403742 +8.359989e-2 -1.7150604 +8.399989e-2 -1.6886632 +8.439989e-2 -1.6611996 +8.4799886e-2 -1.6326867 +8.5199885e-2 -1.6031425 +8.5599884e-2 -1.5725858 +8.599988e-2 -1.5410352 +8.639988e-2 -1.5085119 +8.679988e-2 -1.4750358 +8.719988e-2 -1.4406279 +8.759988e-2 -1.4053102 +8.799988e-2 -1.3691049 +8.839988e-2 -1.3320347 +8.879988e-2 -1.2941233 +8.919988e-2 -1.2553945 +8.959988e-2 -1.2158726 +8.999988e-2 -1.175583 +9.0399876e-2 -1.13455 +9.0799876e-2 -1.0928011 +9.1199875e-2 -1.050362 +9.1599874e-2 -1.0072595 +9.199987e-2 -0.96352077 +9.239987e-2 -0.9191735 +9.279987e-2 -0.87424564 +9.319987e-2 -0.8287656 +9.359987e-2 -0.78276205 +9.399987e-2 -0.73626417 +9.439987e-2 -0.6893012 +9.479987e-2 -0.64190197 +9.519987e-2 -0.59409815 +9.559987e-2 -0.5459192 +9.599987e-2 -0.49739534 +9.6399866e-2 -0.44855735 +9.6799865e-2 -0.39943603 +9.7199865e-2 -0.35006243 +9.7599864e-2 -0.30046773 +9.799986e-2 -0.25068325 +9.839986e-2 -0.20074043 +9.879986e-2 -0.15067083 +9.919986e-2 -0.10050509 +9.959986e-2 -5.027683e-2 +9.999986e-2 -1.6816446e-5 +0.10039986 5.024321e-2 +0.10079986 0.100471504 +0.10119986 0.15063633 +0.10159986 0.20070602 +0.10199986 0.25064895 +0.102399856 0.30043355 +0.102799855 0.3500284 +0.103199854 0.39940214 +0.103599854 0.44852456 +0.10399985 0.49736276 +0.10439985 0.5458868 +0.10479985 0.5940661 +0.10519985 0.6418701 +0.10559985 0.6892687 +0.10599985 0.736232 +0.10639985 0.7827302 +0.10679985 0.8287341 +0.10719985 0.87421453 +0.10759985 0.9191428 +0.10799985 0.9634913 +0.108399846 1.0072304 +0.108799845 1.0503334 +0.109199844 1.092773 +0.10959984 1.1345222 +0.10999984 1.175555 +0.11039984 1.2158452 +0.11079984 1.2553675 +0.11119984 1.294097 +0.11159984 1.332009 +0.11199984 1.3690796 +0.11239984 1.4052863 +0.11279984 1.4406046 +0.11319984 1.475013 +0.11359984 1.5084898 +0.113999836 1.5410138 +0.114399835 1.5725645 +0.114799835 1.6031219 +0.115199834 1.6326667 +0.11559983 1.6611804 +0.11599983 1.6886448 +0.11639983 1.7150426 +0.11679983 1.7403576 +0.11719983 1.7645729 +0.11759983 1.7876737 +0.11799983 1.8096453 +0.11839983 1.8304739 +0.11879983 1.8501464 +0.11919983 1.8686503 +0.11959983 1.8859739 +0.119999826 1.9021064 +0.120399825 1.9170374 +0.120799825 1.9307575 +0.121199824 1.9432585 +0.12159982 1.9545318 +0.12199982 1.9645705 +0.12239982 1.9733684 +0.12279982 1.9809198 +0.12319982 1.9872202 +0.12359982 1.9922652 +0.12399982 1.996052 +0.12439982 1.9985781 +0.12479982 1.9998418 +0.12519982 1.9998424 +0.12559983 1.9985797 +0.12599984 1.9960546 +0.12639984 1.9922688 +0.12679985 1.9872246 +0.12719986 1.9809252 +0.12759987 1.9733747 +0.12799987 1.9645776 +0.12839988 1.9545392 +0.12879989 1.9432665 +0.12919989 1.9307665 +0.1295999 1.9170468 +0.1299999 1.9021163 +0.13039991 1.8859843 +0.13079992 1.868661 +0.13119993 1.8501575 +0.13159993 1.8304853 +0.13199994 1.8096569 +0.13239995 1.7876855 +0.13279995 1.7645848 +0.13319996 1.7403696 +0.13359997 1.7150551 +0.13399997 1.6886573 +0.13439998 1.6611929 +0.13479999 1.6326791 +0.1352 1.6031342 +0.1356 1.5725766 +0.136 1.5410256 +0.13640001 1.5085014 +0.13680002 1.4750243 +0.13720003 1.4406155 +0.13760003 1.4052968 +0.13800004 1.3690904 +0.13840005 1.3320193 +0.13880005 1.2941068 +0.13920006 1.2553754 +0.13960007 1.2158525 +0.14000008 1.1755617 +0.14040008 1.1345282 +0.14080009 1.0927782 +0.1412001 1.0503379 +0.1416001 1.0072342 +0.14200011 0.9634943 +0.14240012 0.9191458 +0.14280012 0.87421674 +0.14320013 0.8287355 +0.14360014 0.78273076 +0.14400014 0.7362316 +0.14440015 0.68926746 +0.14480016 0.64186794 +0.14520016 0.5940629 +0.14560017 0.54588276 +0.14600018 0.49735776 +0.14640018 0.4485186 +0.14680019 0.39939615 +0.1472002 0.35002142 +0.1476002 0.30042562 +0.14800021 0.25064003 +0.14840022 0.20069614 +0.14880022 0.15062548 +0.14920023 0.10045967 +0.14960024 5.0230417e-2 +0.15000024 -3.2472628e-5 +0.15040025 -5.0293438e-2 +0.15080026 -0.10052263 +0.15120026 -0.15068834 +0.15160027 -0.20075886 +0.15200028 -0.25070256 +0.15240029 -0.30048794 +0.15280029 -0.3500835 +0.1532003 -0.39945793 +0.1536003 -0.44858003 +0.15400031 -0.49741882 +0.15440032 -0.5459434 +0.15480033 -0.5941231 +0.15520033 -0.6419276 +0.15560034 -0.68932664 +0.15600035 -0.7362902 +0.15640035 -0.78278875 +0.15680036 -0.8287928 +0.15720037 -0.8742734 +0.15760037 -0.9192018 +0.15800038 -0.96354955 +0.15840039 -1.0072887 +0.1588004 -1.0503916 +0.1592004 -1.092831 +0.1596004 -1.1345801 +0.16000041 -1.1756126 +0.16040042 -1.2159026 +0.16080043 -1.2554245 +0.16120043 -1.2941549 +0.16160044 -1.3320663 +0.16200045 -1.3691365 +0.16240045 -1.4053416 +0.16280046 -1.4406593 +0.16320047 -1.4750669 +0.16360047 -1.5085428 +0.16400048 -1.5410659 +0.16440049 -1.5726155 +0.1648005 -1.6031718 +0.1652005 -1.6327156 +0.16560051 -1.661228 +0.16600052 -1.688691 +0.16640052 -1.7150875 +0.16680053 -1.7404007 +0.16720054 -1.7646145 +0.16760054 -1.7877138 +0.16800055 -1.8096838 +0.16840056 -1.8305107 +0.16880056 -1.8501815 +0.16920057 -1.8686836 +0.16960058 -1.8860053 +0.17000058 -1.9021357 +0.17040059 -1.9170648 +0.1708006 -1.9307829 +0.1712006 -1.9432814 +0.17160061 -1.9545525 +0.17200062 -1.9645894 +0.17240062 -1.973385 +0.17280063 -1.980934 +0.17320064 -1.9872319 +0.17360064 -1.9922745 +0.17400065 -1.9960587 +0.17440066 -1.9985821 +0.17480066 -1.9998431 +0.17520067 -1.999841 +0.17560068 -1.9985757 +0.17600068 -1.996048 +0.17640069 -1.9922595 +0.1768007 -1.9872127 +0.1772007 -1.9809105 +0.17760071 -1.9733572 +0.17800072 -1.9645574 +0.17840073 -1.9545168 +0.17880073 -1.9432416 +0.17920074 -1.9307389 +0.17960075 -1.9170167 +0.18000075 -1.9020836 +0.18040076 -1.8859491 +0.18080077 -1.8686235 +0.18120077 -1.8501174 +0.18160078 -1.8304428 +0.18200079 -1.8096119 +0.1824008 -1.7876381 +0.1828008 -1.7645352 +0.1832008 -1.7403166 +0.18360081 -1.7149998 +0.18400082 -1.6885997 +0.18440083 -1.661133 +0.18480083 -1.6326171 +0.18520084 -1.6030699 +0.18560085 -1.5725102 +0.18600085 -1.5409572 +0.18640086 -1.5084308 +0.18680087 -1.4749517 +0.18720087 -1.440541 +0.18760088 -1.4052204 +0.18800089 -1.3690121 +0.1884009 -1.3319391 +0.1888009 -1.2940248 +0.18920091 -1.2552933 +0.18960091 -1.2157687 +0.19000092 -1.1754762 +0.19040093 -1.1344413 +0.19080094 -1.0926898 +0.19120094 -1.0502481 +0.19160095 -1.007143 +0.19200096 -0.9634018 +0.19240096 -0.91905206 +0.19280097 -0.8741218 +0.19320098 -0.8286394 +0.19360098 -0.7826336 +0.19400099 -0.73613167 +0.194401 -0.68916655 +0.194801 -0.64176613 +0.19520101 -0.59396034 +0.19560102 -0.54577935 +0.19600102 -0.49725366 +0.19640103 -0.44841388 +0.19680104 -0.39929086 +0.19720104 -0.34991562 +0.19760105 -0.30031937 +0.19800106 -0.2505334 +0.19840106 -0.20058921 +0.19880107 -0.15051831 +0.19920108 -0.10035235 +0.19960108 -5.0122987e-2 +0.20000109 1.3802848e-4 +0.2004011 5.0398957e-2 +0.2008011 0.100628056 +0.20120111 0.1507936 +0.20160112 0.20086388 +0.20200112 0.2508073 +0.20240113 0.30059227 +0.20280114 0.35018742 +0.20320114 0.39956135 +0.20360115 0.4486829 +0.20400116 0.49752104 +0.20440117 0.54604495 +0.20480117 0.59422576 +0.20520118 0.6420294 +0.20560119 0.6894275 +0.20600119 0.7363901 +0.2064012 0.78288764 +0.2068012 0.8288906 +0.20720121 0.8743701 +0.20760122 0.9192972 +0.20800123 0.9636437 +0.20840123 1.0073816 +0.20880124 1.050483 +0.20920125 1.092921 +0.20960125 1.1346686 +0.21000126 1.1756996 +0.21040127 1.2159879 +0.21080127 1.2555081 +0.21120128 1.2942353 +0.21160129 1.3321451 +0.2120013 1.3692133 +0.2124013 1.4054167 +0.2128013 1.4407325 +0.21320131 1.4751382 +0.21360132 1.5086122 +0.21400133 1.5411332 +0.21440133 1.5726807 +0.21480134 1.603235 +0.21520135 1.6327765 +0.21560135 1.6612867 +0.21600136 1.6887486 +0.21640137 1.7151428 +0.21680138 1.7404536 +0.21720138 1.7646651 +0.21760139 1.7877619 +0.2180014 1.8097295 +0.2184014 1.830554 +0.21880141 1.8502222 +0.21920142 1.8687218 +0.21960142 1.886041 +0.22000143 1.902169 +0.22040144 1.9170954 +0.22080144 1.9308109 +0.22120145 1.9433068 +0.22160146 1.9545753 +0.22200146 1.9646091 +0.22240147 1.9734021 +0.22280148 1.9809486 +0.22320148 1.9872438 +0.22360149 1.9922837 +0.2240015 1.9960653 +0.2244015 1.998586 +0.22480151 1.9998444 +0.22520152 1.9998397 +0.22560152 1.9985718 +0.22600153 1.9960413 +0.22640154 1.9922502 +0.22680154 1.9872005 +0.22720155 1.9808956 +0.22760156 1.9733397 +0.22800156 1.9645373 +0.22840157 1.954494 +0.22880158 1.9432161 +0.22920159 1.9307109 +0.22960159 1.9169861 +0.2300016 1.9020505 +0.2304016 1.8859134 +0.23080161 1.8685851 +0.23120162 1.8500766 +0.23160163 1.8303995 +0.23200163 1.8095663 +0.23240164 1.7875899 +0.23280165 1.7644845 +0.23320165 1.7402647 +0.23360166 1.7149456 +0.23400167 1.6885431 +0.23440167 1.6610742 +0.23480168 1.6325561 +0.23520169 1.6030068 +0.2356017 1.5724449 +0.2360017 1.5408899 +0.2364017 1.5083616 +0.23680171 1.4748805 +0.23720172 1.4404678 +0.23760173 1.4051453 +0.23800173 1.3689338 +0.23840174 1.331859 +0.23880175 1.2939429 +0.23920175 1.2552096 +0.23960176 1.2156833 +0.24000177 1.1753893 +0.24040177 1.1343528 +0.24080178 1.0925997 +0.24120179 1.0501566 +0.2416018 1.0070502 +0.2420018 0.9633076 +0.24240181 0.9189566 +0.24280182 0.8740251 +0.24320182 0.8285416 +0.24360183 0.7825347 +0.24400184 0.73603356 +0.24440184 0.6890675 +0.24480185 0.6416662 +0.24520186 0.59385955 +0.24560186 0.54567784 +0.24600187 0.49715143 +0.24640188 0.448311 +0.24680188 0.39918742 +0.24720189 0.3498117 +0.2476019 0.300215 +0.2480019 0.25042868 +0.24840191 0.20048419 +0.24880192 0.15041116 +0.24920192 0.10024502 +0.24960193 5.001556e-2 +0.25000194 -2.4549168e-4 +0.25040194 -5.0506387e-2 +0.25080195 -0.10073538 +0.25120196 -0.15090075 +0.25160196 -0.2009708 +0.25200197 -0.25091392 +0.25240198 -0.30069852 +0.25280198 -0.35029322 +0.253202 -0.39966664 +0.253602 -0.44878763 +0.254002 -0.49762514 +0.254402 -0.5461483 +0.25480202 -0.59432656 +0.25520203 -0.64212936 +0.25560203 -0.6895266 +0.25600204 -0.7364883 +0.25640205 -0.7829848 +0.25680205 -0.8289867 +0.25720206 -0.874465 +0.25760207 -0.919391 +0.25800207 -0.9637362 +0.25840208 -1.0074726 +0.2588021 -1.0505729 +0.2592021 -1.0930094 +0.2596021 -1.1347555 +0.2600021 -1.175785 +0.2604021 -1.2160717 +0.26080212 -1.2555903 +0.26120213 -1.2943158 +0.26160213 -1.3322238 +0.26200214 -1.3692902 +0.26240215 -1.4054918 +0.26280215 -1.4408057 +0.26320216 -1.4752095 +0.26360217 -1.5086814 +0.26400217 -1.5412004 +0.26440218 -1.5727459 +0.2648022 -1.6032981 +0.2652022 -1.6328397 +0.2656022 -1.6613476 +0.2660022 -1.6888062 +0.2664022 -1.715198 +0.26680222 -1.7405065 +0.26720223 -1.7647157 +0.26760224 -1.7878101 +0.26800224 -1.8097752 +0.26840225 -1.8305973 +0.26880226 -1.8502631 +0.26920226 -1.8687601 +0.26960227 -1.8860768 +0.27000228 -1.9022021 +0.27040228 -1.917126 +0.2708023 -1.930839 +0.2712023 -1.9433322 +0.2716023 -1.9545981 +0.2720023 -1.9646293 +0.27240232 -1.9734195 +0.27280232 -1.9809633 +0.27320233 -1.9872558 +0.27360234 -1.9922931 +0.27400234 -1.996072 +0.27440235 -1.9985901 +0.27480236 -1.9998459 +0.27520236 -1.9998384 +0.27560237 -1.9985676 +0.27600238 -1.9960346 +0.27640238 -1.9922408 +0.2768024 -1.9871886 +0.2772024 -1.9808811 +0.2776024 -1.9733225 +0.2780024 -1.9645175 +0.27840242 -1.9544716 +0.27880242 -1.9431912 +0.27920243 -1.9306833 +0.27960244 -1.916956 +0.28000244 -1.9020178 +0.28040245 -1.8858782 +0.28080246 -1.8685476 +0.28120247 -1.8500365 +0.28160247 -1.830357 +0.28200248 -1.8095212 +0.2824025 -1.7875426 +0.2828025 -1.7644348 +0.2832025 -1.7402126 +0.2836025 -1.7148912 +0.2840025 -1.6884866 +0.28440252 -1.6610154 +0.28480253 -1.6324952 +0.28520253 -1.6029437 +0.28560254 -1.5723797 +0.28600255 -1.5408226 +0.28640255 -1.5082922 +0.28680256 -1.4748092 +0.28720257 -1.4403919 +0.28760257 -1.4050674 +0.28800258 -1.3688555 +0.2884026 -1.3317788 +0.2888026 -1.293861 +0.2892026 -1.2551259 +0.2896026 -1.215598 +0.2900026 -1.1753024 +0.29040262 -1.1342642 +0.29080263 -1.0925097 +0.29120263 -1.0500652 +0.29160264 -1.0069573 +0.29200265 -0.96321344 +0.29240265 -0.91886115 +0.29280266 -0.8739285 +0.29320267 -0.82844377 +0.29360268 -0.78243583 +0.29400268 -0.7359336 +0.2944027 -0.6889666 +0.2948027 -0.64156437 +0.2952027 -0.5937569 +0.2956027 -0.5455744 +0.29600272 -0.49704733 +0.29640272 -0.44820628 +0.29680273 -0.39908212 +0.29720274 -0.34970587 +0.29760274 -0.30010876 +0.29800275 -0.25032207 +0.29840276 -0.20037727 +0.29880276 -0.1503059 +0.29920277 -0.100139596 +0.29960278 -4.9910035e-2 +0.30000278 3.5104755e-4 +0.3004028 5.061191e-2 +0.3008028 0.10084081 +0.3012028 0.151006 +0.3016028 0.20107582 +0.30200282 0.25101864 +0.30240282 0.3008029 +0.30280283 0.35039714 +0.30320284 0.39977008 +0.30360284 0.44889048 +0.30400285 0.49772736 +0.30440286 0.54624987 +0.30480286 0.59442735 +0.30520287 0.6422293 +0.30560288 0.6896257 +0.3060029 0.7365864 +0.3064029 0.7830819 +0.3068029 0.8290828 +0.3072029 0.87455994 +0.3076029 0.9194847 +0.30800292 0.9638287 +0.30840293 1.0075638 +0.30880293 1.0506626 +0.30920294 1.093101 +0.30960295 1.1348456 +0.31000295 1.1758734 +0.31040296 1.2161585 +0.31080297 1.2556754 +0.31120297 1.2943991 +0.31160298 1.3323053 +0.312003 1.36937 +0.312403 1.4055697 +0.312803 1.4408816 +0.313203 1.4752833 +0.313603 1.5087532 +0.31400302 1.5412701 +0.31440303 1.5728135 +0.31480303 1.6033634 +0.31520304 1.6329006 +0.31560305 1.6614064 +0.31600305 1.6888628 +0.31640306 1.7152524 +0.31680307 1.7405585 +0.31720307 1.7647653 +0.31760308 1.7878574 +0.3180031 1.8098202 +0.3184031 1.8306398 +0.3188031 1.8503032 +0.3192031 1.8687978 +0.31960312 1.886112 +0.32000312 1.9022348 +0.32040313 1.9171561 +0.32080314 1.9308665 +0.32120314 1.9433572 +0.32160315 1.9546204 +0.32200316 1.9646491 +0.32240316 1.9734367 +0.32280317 1.9809779 +0.32320318 1.9872677 +0.32360318 1.9923024 +0.3240032 1.9960786 +0.3244032 1.998594 +0.3248032 1.9998472 +0.3252032 1.9998369 +0.32560322 1.9985636 +0.32600322 1.996028 +0.32640323 1.9922315 +0.32680324 1.9871767 +0.32720324 1.9808666 +0.32760325 1.9733053 +0.32800326 1.9644977 +0.32840326 1.9544492 +0.32880327 1.9431661 +0.32920328 1.9306557 +0.32960328 1.9169259 +0.3300033 1.9019852 +0.3304033 1.8858432 +0.3308033 1.8685085 +0.3312033 1.8499949 +0.33160332 1.8303128 +0.33200333 1.8094747 +0.33240333 1.7874936 +0.33280334 1.7643833 +0.33320335 1.7401587 +0.33360335 1.7148349 +0.33400336 1.6884279 +0.33440337 1.6609545 +0.33480337 1.632432 +0.33520338 1.6028782 +0.3356034 1.5723121 +0.3360034 1.5407529 +0.3364034 1.5082204 +0.3368034 1.4747353 +0.3372034 1.4403187 +0.33760342 1.4049923 +0.33800343 1.3687785 +0.33840343 1.3317001 +0.33880344 1.2937804 +0.33920345 1.2550437 +0.33960345 1.2155142 +0.34000346 1.1752169 +0.34040347 1.1341773 +0.34080347 1.0924213 +0.34120348 1.0499753 +0.3416035 1.0068661 +0.3420035 0.96312094 +0.3424035 0.9187674 +0.3428035 0.87383354 +0.3432035 0.8283477 +0.34360352 0.7823387 +0.34400353 0.7358355 +0.34440354 0.6888675 +0.34480354 0.6414644 +0.34520355 0.5936561 +0.34560356 0.54547286 +0.34600356 0.49694508 +0.34640357 0.4481034 +0.34680358 0.39897868 +0.34720358 0.34960195 +0.3476036 0.3000044 +0.3480036 0.25021735 +0.3484036 0.20027225 +0.3488036 0.15020065 +0.34920362 0.10003417 +0.34960362 4.9804512e-2 +0.35000363 -4.566034e-4 +0.35040364 -5.0717432e-2 +0.35080364 -0.100946225 +0.35120365 -0.15111126 +0.35160366 -0.20118085 +0.35200366 -0.25112334 +0.35240367 -0.30090722 +0.35280368 -0.35050482 +0.35320368 -0.39987722 +0.3536037 -0.44899708 +0.3540037 -0.4978333 +0.3544037 -0.54635507 +0.3548037 -0.5945318 +0.35520372 -0.6423329 +0.35560372 -0.6897283 +0.35600373 -0.7366881 +0.35640374 -0.78318256 +0.35680375 -0.82918227 +0.35720375 -0.8746583 +0.35760376 -0.91958183 +0.35800377 -0.9639245 +0.35840377 -1.0076584 +0.35880378 -1.0507557 +0.3592038 -1.0931894 +0.3596038 -1.1349325 +0.3600038 -1.1759588 +0.3604038 -1.2162423 +0.3608038 -1.2557576 +0.36120382 -1.2944796 +0.36160383 -1.3323841 +0.36200383 -1.369447 +0.36240384 -1.4056448 +0.36280385 -1.4409548 +0.36320385 -1.4753546 +0.36360386 -1.5088226 +0.36400387 -1.5413374 +0.36440387 -1.5728787 +0.36480388 -1.6034266 +0.3652039 -1.6329616 +0.3656039 -1.6614652 +0.3660039 -1.6889193 +0.3664039 -1.7153066 +0.3668039 -1.7406105 +0.36720392 -1.764815 +0.36760393 -1.7879047 +0.36800393 -1.8098651 +0.36840394 -1.8306823 +0.36880395 -1.8503432 +0.36920395 -1.8688353 +0.36960396 -1.886147 +0.37000397 -1.9022673 +0.37040398 -1.9171861 +0.37080398 -1.9308939 +0.371204 -1.9433821 +0.371604 -1.9546428 +0.372004 -1.9646688 +0.372404 -1.9734539 +0.37280402 -1.9809924 +0.37320402 -1.9872797 +0.37360403 -1.9923117 +0.37400404 -1.9960853 +0.37440404 -1.998598 +0.37480405 -1.9998485 +0.37520406 -1.9998356 +0.37560406 -1.9985595 +0.37600407 -1.996021 +0.37640408 -1.9922218 +0.37680408 -1.9871643 +0.3772041 -1.9808515 +0.3776041 -1.9732876 +0.3780041 -1.9644772 +0.3784041 -1.9544259 +0.37880412 -1.9431403 +0.37920412 -1.9306272 +0.37960413 -1.9168947 +0.38000414 -1.9019513 +0.38040414 -1.8858067 +0.38080415 -1.8684709 +0.38120416 -1.8499548 +0.38160416 -1.8302703 +0.38200417 -1.8094296 +0.38240418 -1.7874461 +0.3828042 -1.7643336 +0.3832042 -1.7401067 +0.3836042 -1.7147806 +0.3840042 -1.6883714 +0.3844042 -1.6608957 +0.38480422 -1.632371 +0.38520423 -1.6028152 +0.38560423 -1.5722469 +0.38600424 -1.5406855 +0.38640425 -1.508151 +0.38680425 -1.474664 +0.38720426 -1.4402454 +0.38760427 -1.4049171 +0.38800427 -1.3687015 +0.38840428 -1.3316213 +0.3888043 -1.2937 +0.3892043 -1.2549615 +0.3896043 -1.2154304 +0.3900043 -1.1751316 +0.3904043 -1.1340904 +0.39080432 -1.092333 +0.39120433 -1.0498855 +0.39160433 -1.0067749 +0.39200434 -0.96302843 +0.39240435 -0.91867363 +0.39280435 -0.8737386 +0.39320436 -0.8282516 +0.39360437 -0.7822415 +0.39400437 -0.7357373 +0.39440438 -0.6887684 +0.3948044 -0.6413644 +0.3952044 -0.59355533 +0.3956044 -0.54537135 +0.3960044 -0.49684283 +0.39640442 -0.44800055 +0.39680442 -0.3988715 +0.39720443 -0.34949428 +0.39760444 -0.29989627 +0.39800444 -0.25010884 +0.39840445 -0.20016342 +0.39880446 -0.15009159 +0.39920446 -9.992494e-2 +0.39960447 -4.9695175e-2 +0.40000448 5.659739e-4 +0.40040448 5.0826766e-2 +0.4008045 0.10105546 +0.4012045 0.15122032 +0.4016045 0.20128965 +0.4020045 0.25123185 +0.40240452 0.30101538 +0.40280452 0.35060874 +0.40320453 0.39998066 +0.40360454 0.44909993 +0.40400454 0.49793553 +0.40440455 0.54645663 +0.40480456 0.59463257 +0.40520456 0.64243287 +0.40560457 0.68982744 +0.40600458 0.73678625 +0.40640458 0.78327966 +0.4068046 0.82927835 +0.4072046 0.87475324 +0.4076046 0.9196756 +0.4080046 0.96401703 +0.40840462 1.0077496 +0.40880463 1.0508455 +0.40920463 1.0932778 +0.40960464 1.1350194 +0.41000465 1.1760442 +0.41040465 1.2163261 +0.41080466 1.2558397 +0.41120467 1.2945601 +0.41160467 1.3324628 +0.41200468 1.3695239 +0.4124047 1.4057199 +0.4128047 1.441028 +0.4132047 1.4754258 +0.4136047 1.5088918 +0.4140047 1.5414046 +0.41440472 1.5729439 +0.41480473 1.6034896 +0.41520473 1.6330225 +0.41560474 1.6615239 +0.41600475 1.6889758 +0.41640475 1.7153609 +0.41680476 1.7406625 +0.41720477 1.7648647 +0.41760477 1.787952 +0.41800478 1.80991 +0.4184048 1.8307248 +0.4188048 1.8503847 +0.4192048 1.8688743 +0.4196048 1.8861834 +0.4200048 1.9023011 +0.42040482 1.9172173 +0.42080483 1.9309224 +0.42120484 1.9434079 +0.42160484 1.9546659 +0.42200485 1.9646893 +0.42240486 1.9734716 +0.42280486 1.9810075 +0.42320487 1.9872919 +0.42360488 1.9923213 +0.42400488 1.9960921 +0.4244049 1.9986022 +0.4248049 1.9998498 +0.4252049 1.9998342 +0.4256049 1.9985555 +0.42600492 1.9960144 +0.42640492 1.9922125 +0.42680493 1.9871523 +0.42720494 1.9808369 +0.42760494 1.9732703 +0.42800495 1.9644574 +0.42840496 1.9544035 +0.42880496 1.9431152 +0.42920497 1.9305997 +0.42960498 1.9168645 +0.43000498 1.9019186 +0.430405 1.8857715 +0.430805 1.8684332 +0.431205 1.8499147 +0.431605 1.8302277 +0.43200502 1.8093847 +0.43240502 1.7873988 +0.43280503 1.7642839 +0.43320504 1.7400546 +0.43360505 1.7147262 +0.43400505 1.6883148 +0.43440506 1.6608369 +0.43480507 1.6323099 +0.43520507 1.602752 +0.43560508 1.5721817 +0.4360051 1.5406183 +0.4364051 1.5080818 +0.4368051 1.4745927 +0.4372051 1.4401722 +0.4376051 1.404842 +0.43800512 1.3686246 +0.43840513 1.3315425 +0.43880513 1.2936195 +0.43920514 1.2548794 +0.43960515 1.2153466 +0.44000515 1.1750461 +0.44040516 1.1340003 +0.44080517 1.0922413 +0.44120517 1.0497924 +0.44160518 1.0066804 +0.4420052 0.9629326 +0.4424052 0.9185765 +0.4428052 0.8736402 +0.4432052 0.82815206 +0.4436052 0.78214085 +0.44400522 0.73563564 +0.44440523 0.6886657 +0.44480523 0.6412608 +0.44520524 0.5934509 +0.44560525 0.5452661 +0.44600525 0.4967369 +0.44640526 0.44789395 +0.44680527 0.39876807 +0.44720528 0.34939033 +0.44760528 0.2997919 +0.4480053 0.2500041 +0.4484053 0.2000584 +0.4488053 0.14998633 +0.4492053 9.981951e-2 +0.44960532 4.9589653e-2 +0.45000532 -6.715298e-4 +0.45040533 -5.093229e-2 +0.45080534 -0.10116088 +0.45120534 -0.15132557 +0.45160535 -0.20139468 +0.45200536 -0.25133657 +0.45240536 -0.30111971 +0.45280537 -0.35071266 +0.45320538 -0.40008408 +0.45360538 -0.4492028 +0.4540054 -0.49803776 +0.4544054 -0.54655814 +0.4548054 -0.5947333 +0.4552054 -0.6425328 +0.45560542 -0.6899265 +0.45600542 -0.73688436 +0.45640543 -0.7833768 +0.45680544 -0.8293744 +0.45720544 -0.8748481 +0.45760545 -0.9197693 +0.45800546 -0.9641095 +0.45840546 -1.0078408 +0.45880547 -1.0509354 +0.45920548 -1.0933661 +0.4596055 -1.1351063 +0.4600055 -1.1761296 +0.4604055 -1.2164099 +0.4608055 -1.2559218 +0.4612055 -1.2946405 +0.46160552 -1.3325415 +0.46200553 -1.3696008 +0.46240553 -1.4057977 +0.46280554 -1.4411038 +0.46320555 -1.4754996 +0.46360555 -1.5089636 +0.46400556 -1.5414743 +0.46440557 -1.5730115 +0.46480557 -1.603555 +0.46520558 -1.6330856 +0.4656056 -1.6615847 +0.4660056 -1.6890345 +0.4664056 -1.7154171 +0.4668056 -1.7407163 +0.4672056 -1.7649161 +0.46760562 -1.7880011 +0.46800563 -1.8099566 +0.46840563 -1.8307688 +0.46880564 -1.8504248 +0.46920565 -1.8689119 +0.46960565 -1.8862185 +0.47000566 -1.9023337 +0.47040567 -1.9172473 +0.47080567 -1.9309499 +0.47120568 -1.9434329 +0.4716057 -1.9546883 +0.4720057 -1.964709 +0.4724057 -1.9734887 +0.4728057 -1.9810219 +0.47320572 -1.9873039 +0.47360572 -1.9923304 +0.47400573 -1.9960986 +0.47440574 -1.9986061 +0.47480574 -1.9998511 +0.47520575 -1.9998329 +0.47560576 -1.9985515 +0.47600576 -1.9960077 +0.47640577 -1.9922032 +0.47680578 -1.9871403 +0.47720578 -1.9808223 +0.4776058 -1.9732531 +0.4780058 -1.9644376 +0.4784058 -1.9543811 +0.4788058 -1.9430903 +0.47920582 -1.930572 +0.47960582 -1.9168345 +0.48000583 -1.9018861 +0.48040584 -1.8857363 +0.48080584 -1.8683956 +0.48120585 -1.8498746 +0.48160586 -1.8301852 +0.48200586 -1.8093398 +0.48240587 -1.7873515 +0.48280588 -1.7642342 +0.48320588 -1.7400026 +0.4836059 -1.714672 +0.4840059 -1.6882582 +0.4844059 -1.6607759 +0.4848059 -1.6322467 +0.48520592 -1.6026865 +0.48560593 -1.572114 +0.48600593 -1.5405486 +0.48640594 -1.5080099 +0.48680595 -1.4745188 +0.48720595 -1.4400963 +0.48760596 -1.4047642 +0.48800597 -1.3685448 +0.48840597 -1.331461 +0.48880598 -1.2935361 +0.489206 -1.2547941 +0.489606 -1.2152597 +0.490006 -1.1749576 +0.490406 -1.1339134 +0.490806 -1.0921528 +0.49120602 -1.0497025 +0.49160603 -1.0065892 +0.49200603 -0.96284 +0.49240604 -0.9184827 +0.49280605 -0.8735452 +0.49320605 -0.828056 +0.49360606 -0.7820437 +0.49400607 -0.73553747 +0.49440607 -0.6885666 +0.49480608 -0.64116085 +0.4952061 -0.5933501 +0.4956061 -0.5451645 +0.4960061 -0.49663466 +0.4964061 -0.44779107 +0.49680611 -0.39866465 +0.49720612 -0.3492864 +0.49760613 -0.29968753 +0.49800614 -0.24989937 +0.49840614 -0.19995338 +0.49880615 -0.14988106 +0.49920616 -9.971409e-2 +0.49960616 -4.948413e-2 +0.50000614 7.7327096e-4 +0.50040615 5.1033996e-2 +0.50080615 0.10126249 +0.50120616 0.15142702 +0.50160617 0.2014959 +0.5020062 0.25143752 +0.5024062 0.3012203 +0.5028062 0.35081282 +0.5032062 0.40018377 +0.5036062 0.44930193 +0.5040062 0.4981363 +0.5044062 0.546656 +0.5048062 0.59483045 +0.5052062 0.6426292 +0.50560623 0.690022 +0.50600624 0.73698246 +0.50640625 0.7834739 +0.50680625 0.82947046 +0.50720626 0.8749431 +0.50760627 0.91986305 +0.5080063 0.964202 +0.5084063 1.0079318 +0.5088063 1.0510252 +0.5092063 1.0934545 +0.5096063 1.1351901 +0.5100063 1.1762149 +0.5104063 1.2164906 +0.5108063 1.256004 +0.5112063 1.2947181 +0.51160634 1.3326203 +0.51200634 1.3696749 +0.51240635 1.4058701 +0.51280636 1.4411718 +0.51320636 1.4755684 +0.51360637 1.5090278 +0.5140064 1.5415392 +0.5144064 1.573072 +0.5148064 1.6036158 +0.5152064 1.6331422 +0.5156064 1.6616414 +0.5160064 1.6890868 +0.5164064 1.7154695 +0.5168064 1.7407683 +0.51720643 1.764964 +0.51760644 1.7880483 +0.51800644 1.8099998 +0.51840645 1.8308114 +0.51880646 1.8504634 +0.51920646 1.8689494 +0.5196065 1.8862523 +0.5200065 1.9023663 +0.5204065 1.9172763 +0.5208065 1.9309775 +0.5212065 1.9434569 +0.5216065 1.9547106 +0.5220065 1.964728 +0.5224065 1.9735059 +0.5228065 1.981036 +0.52320653 1.9873157 +0.52360654 1.9923394 +0.52400655 1.9961053 +0.52440655 1.9986099 +0.52480656 1.9998523 +0.52520657 1.9998316 +0.5256066 1.9985474 +0.5260066 1.9960012 +0.5264066 1.9921939 +0.5268066 1.9871289 +0.5272066 1.9808078 +0.5276066 1.9732366 +0.5280066 1.9644177 +0.5284066 1.9543595 +0.5288066 1.9430653 +0.52920663 1.9305454 +0.52960664 1.9168043 +0.53000665 1.9018546 +0.53040665 1.8857012 +0.53080666 1.8683592 +0.53120667 1.8498344 +0.5316067 1.8301442 +0.5320067 1.8092948 +0.5324067 1.7873058 +0.5328067 1.7641845 +0.5332067 1.7399524 +0.5336067 1.7146176 +0.5340067 1.6882037 +0.5344067 1.6607193 +0.5348067 1.6321901 +0.53520674 1.6026257 +0.53560674 1.5720536 +0.53600675 1.5404836 +0.53640676 1.5079455 +0.53680676 1.4744501 +0.53720677 1.4400283 +0.5376068 1.4046918 +0.5380068 1.3684734 +0.5384068 1.331385 +0.5388068 1.2934556 +0.5392068 1.254715 +0.5396068 1.2151759 +0.5400068 1.1748753 +0.5404068 1.1338264 +0.54080683 1.0920676 +0.54120684 1.0496128 +0.54160684 1.0065013 +0.54200685 0.9627475 +0.54240686 0.91839236 +0.54280686 0.8734503 +0.5432069 0.82796335 +0.5436069 0.78194654 +0.5440069 0.7354429 +0.5444069 0.6884675 +0.5448069 0.64106447 +0.5452069 0.59324926 +0.5456069 0.54506665 +0.5460069 0.4965324 +0.5464069 0.44769192 +0.54680693 0.3985612 +0.54720694 0.3491862 +0.54760695 0.29958317 +0.54800695 0.24979843 +0.54840696 0.19984834 +0.54880697 0.1497796 +0.549207 9.960867e-2 +0.549607 4.938242e-2 +0.550007 -8.826415e-4 +0.550407 -5.113952e-2 +0.550807 -0.10137172 +0.551207 -0.15153226 +0.551607 -0.20160471 +0.552007 -0.25154224 +0.552407 -0.30132842 +0.55280703 -0.35091674 +0.55320704 -0.40029094 +0.55360705 -0.44940478 +0.55400705 -0.49824223 +0.55440706 -0.5467576 +0.55480707 -0.5949349 +0.5552071 -0.64272916 +0.5556071 -0.69012463 +0.5560071 -0.73707706 +0.5564071 -0.783571 +0.5568071 -0.829563 +0.5572071 -0.87503797 +0.5576071 -0.91995335 +0.5580071 -0.96429443 +0.5584071 -1.0080198 +0.55880713 -1.0511149 +0.55920714 -1.0935397 +0.55960715 -1.1352801 +0.56000715 -1.1762972 +0.56040716 -1.2165774 +0.56080717 -1.2560891 +0.5612072 -1.2948015 +0.5616072 -1.3327018 +0.5620072 -1.3697547 +0.5624072 -1.4059478 +0.5628072 -1.4412476 +0.5632072 -1.4756422 +0.5636072 -1.5090996 +0.5640072 -1.5416088 +0.5644072 -1.5731394 +0.56480724 -1.6036812 +0.56520724 -1.6332053 +0.56560725 -1.6617023 +0.56600726 -1.6891454 +0.56640726 -1.7155256 +0.56680727 -1.7408185 +0.5672073 -1.7650154 +0.5676073 -1.7880939 +0.5680073 -1.8100463 +0.5684073 -1.8308523 +0.5688073 -1.8505049 +0.5692073 -1.8689857 +0.5696073 -1.8862886 +0.5700073 -1.9023976 +0.57040733 -1.9173074 +0.57080734 -1.9310039 +0.57120734 -1.9434828 +0.57160735 -1.9547322 +0.57200736 -1.9647485 +0.57240736 -1.9735223 +0.5728074 -1.981051 +0.5732074 -1.9873271 +0.5736074 -1.9923489 +0.5740074 -1.9961116 +0.5744074 -1.998614 +0.5748074 -1.9998536 +0.5752074 -1.9998301 +0.5756074 -1.9985436 +0.5760074 -1.9959943 +0.57640743 -1.9921849 +0.57680744 -1.9871165 +0.57720745 -1.9807937 +0.57760745 -1.9732187 +0.57800746 -1.9643986 +0.57840747 -1.9543363 +0.5788075 -1.9430412 +0.5792075 -1.930517 +0.5796075 -1.9167752 +0.5800075 -1.9018208 +0.5804075 -1.8856673 +0.5808075 -1.8683202 +0.5812075 -1.8497958 +0.5816075 -1.8301 +0.5820075 -1.8092514 +0.58240753 -1.7872567 +0.58280754 -1.764133 +0.58320755 -1.7398984 +0.58360755 -1.7145612 +0.58400756 -1.688145 +0.58440757 -1.6606584 +0.5848076 -1.6321269 +0.5852076 -1.6025603 +0.5856076 -1.5719858 +0.5860076 -1.5404139 +0.5864076 -1.5078738 +0.5868076 -1.4743762 +0.5872076 -1.4399525 +0.5876076 -1.404614 +0.5880076 -1.3683937 +0.58840764 -1.3313034 +0.58880764 -1.293378 +0.58920765 -1.2546297 +0.58960766 -1.215095 +0.59000766 -1.1747867 +0.59040767 -1.1337426 +0.5908077 -1.091976 +0.5912077 -1.0495261 +0.5916077 -1.0064068 +0.5920077 -0.96265835 +0.5924077 -0.9182952 +0.5928077 -0.8733587 +0.5932077 -0.8278638 +0.5936077 -0.7818529 +0.59400773 -0.73534113 +0.59440774 -0.688372 +0.59480774 -0.6409609 +0.59520775 -0.5931521 +0.59560776 -0.5449614 +0.59600776 -0.49643385 +0.5964078 -0.4475853 +0.5968078 -0.3984615 +0.5972078 -0.34907854 +0.5976078 -0.29948258 +0.5980078 -0.24968992 +0.5984078 -0.19974712 +0.5988078 -0.14967054 +0.5992078 -9.950705e-2 +0.5996078 -4.927308e-2 +0.60000783 9.843827e-4 +0.60040784 5.1248852e-2 +0.60080785 0.10147333 +0.60120785 0.15164132 +0.60160786 0.20170593 +0.60200787 0.25165072 +0.6024079 0.301429 +0.6028079 0.35102442 +0.6032079 0.4003906 +0.6036079 0.44951135 +0.6040079 0.49834076 +0.6044079 0.5468628 +0.6048079 0.5950393 +0.6052079 0.6428327 +0.6056079 0.69022727 +0.60600793 0.73717874 +0.60640794 0.7836717 +0.60680795 0.82966256 +0.60720795 0.8751363 +0.60760796 0.9200505 +0.60800797 0.9643903 +0.608408 1.0081142 +0.608808 1.051208 +0.609208 1.0936313 +0.609608 1.1353701 +0.610008 1.1763856 +0.610408 1.2166643 +0.610808 1.2561682 +0.611208 1.2948848 +0.611608 1.3327776 +0.61200804 1.3698343 +0.61240804 1.4060202 +0.61280805 1.4413234 +0.61320806 1.4757109 +0.61360806 1.5091714 +0.61400807 1.5416737 +0.6144081 1.573207 +0.6148081 1.6037419 +0.6152081 1.6332685 +0.6156081 1.6617589 +0.6160081 1.689204 +0.6164081 1.715578 +0.6168081 1.7408723 +0.6172081 1.7650633 +0.61760813 1.7881429 +0.61800814 1.8100896 +0.61840814 1.8308963 +0.61880815 1.8505435 +0.61920816 1.8690246 +0.61960816 1.8863225 +0.6200082 1.9024315 +0.6204082 1.9173363 +0.6208082 1.9310324 +0.6212082 1.9435067 +0.6216082 1.9547553 +0.6220082 1.9647675 +0.6224082 1.9735401 +0.6228082 1.9810649 +0.6232082 1.9873394 +0.62360823 1.9923579 +0.62400824 1.9961184 +0.62440825 1.9986178 +0.62480825 1.9998549 +0.62520826 1.9998288 +0.62560827 1.9985394 +0.6260083 1.9959879 +0.6264083 1.9921752 +0.6268083 1.987104 +0.6272083 1.9807786 +0.6276083 1.9732009 +0.6280083 1.9643781 +0.6284083 1.954313 +0.6288083 1.9430152 +0.6292083 1.9304883 +0.62960833 1.916744 +0.63000834 1.9017869 +0.63040835 1.8856308 +0.63080835 1.8682812 +0.63120836 1.8497542 +0.63160837 1.830056 +0.6320084 1.8092048 +0.6324084 1.7872076 +0.6328084 1.764085 +0.6332084 1.7398446 +0.6336084 1.7145089 +0.6340084 1.6880864 +0.6344084 1.6606016 +0.6348084 1.6320637 +0.6352084 1.6024994 +0.63560843 1.5719182 +0.63600844 1.540349 +0.63640845 1.5078019 +0.63680845 1.4743074 +0.63720846 1.4398766 +0.63760847 1.4045415 +0.6380085 1.3683138 +0.6384085 1.3312274 +0.6388085 1.2932945 +0.6392085 1.2545506 +0.6396085 1.2150081 +0.6400085 1.1747044 +0.6404085 1.1336524 +0.6408085 1.0918908 +0.6412085 1.049433 +0.64160854 1.0063188 +0.64200854 0.9625625 +0.64240855 0.9182048 +0.64280856 0.8732604 +0.64320856 0.8277712 +0.64360857 0.7817522 +0.6440086 0.73524654 +0.6444086 0.6882693 +0.6448086 0.6408645 +0.6452086 0.5930477 +0.6456086 0.5448635 +0.6460086 0.4963279 +0.6464086 0.44748616 +0.6468086 0.39835432 +0.64720863 0.34897834 +0.64760864 0.29937443 +0.64800864 0.24958897 +0.64840865 0.19963829 +0.64880866 0.14956148 +0.64920866 9.9397816e-2 +0.6496087 4.9163744e-2 +0.6500087 -1.0937531e-3 +0.6504087 -5.135819e-2 +0.6508087 -0.10158256 +0.6512087 -0.15175039 +0.6516087 -0.20181474 +0.6520087 -0.25175923 +0.6524087 -0.30153713 +0.6528087 -0.3511321 +0.65320873 -0.40049776 +0.65360874 -0.44961792 +0.65400875 -0.49844667 +0.65440875 -0.546968 +0.65480876 -0.59513646 +0.65520877 -0.6429363 +0.6556088 -0.69032276 +0.6560088 -0.7372804 +0.6564088 -0.78376526 +0.6568088 -0.82976204 +0.6572088 -0.8752278 +0.6576088 -0.9201476 +0.6580088 -0.9644794 +0.6584088 -1.0082086 +0.6588088 -1.0512946 +0.65920883 -1.0937228 +0.65960884 -1.1354539 +0.66000885 -1.1764741 +0.66040885 -1.216745 +0.66080886 -1.2562534 +0.66120887 -1.2949624 +0.6616089 -1.3328592 +0.6620089 -1.3699085 +0.6624089 -1.406098 +0.6628089 -1.4413939 +0.6632089 -1.4757847 +0.6636089 -1.5092381 +0.6640089 -1.5417433 +0.6644089 -1.5732698 +0.6648089 -1.6038073 +0.66520894 -1.6333271 +0.66560894 -1.6618198 +0.66600895 -1.6892585 +0.66640896 -1.7156342 +0.66680896 -1.7409223 +0.66720897 -1.7651147 +0.667609 -1.7881885 +0.668009 -1.8101362 +0.668409 -1.8309373 +0.668809 -1.850585 +0.669209 -1.8690609 +0.669609 -1.8863589 +0.670009 -1.9024628 +0.670409 -1.9173675 +0.67080903 -1.9310609 +0.67120904 -1.9435326 +0.67160904 -1.9547784 +0.67200905 -1.964788 +0.67240906 -1.9735578 +0.67280906 -1.9810799 +0.6732091 -1.9873518 +0.6736091 -1.9923674 +0.6740091 -1.9961252 +0.6744091 -1.9986218 +0.6748091 -1.9998562 +0.6752091 -1.9998274 +0.6756091 -1.9985352 +0.6760091 -1.995981 +0.6764091 -1.9921656 +0.67680913 -1.9870925 +0.67720914 -1.9807634 +0.67760915 -1.9731842 +0.67800915 -1.9643575 +0.67840916 -1.9542915 +0.67880917 -1.9429893 +0.6792092 -1.9304618 +0.6796092 -1.9167128 +0.6800092 -1.9017553 +0.6804092 -1.8855944 +0.6808092 -1.8682449 +0.6812092 -1.8497126 +0.6816092 -1.830015 +0.6820092 -1.8091582 +0.6824092 -1.787162 +0.68280923 -1.7640334 +0.68320924 -1.7397944 +0.68360925 -1.7144526 +0.68400925 -1.6880318 +0.68440926 -1.6605407 +0.68480927 -1.632005 +0.6852093 -1.6024339 +0.6856093 -1.5718554 +0.6860093 -1.5402793 +0.6864093 -1.507735 +0.6868093 -1.4742335 +0.6872093 -1.439806 +0.6876093 -1.4044636 +0.6880093 -1.3682396 +0.6884093 -1.3311459 +0.68880934 -1.293217 +0.68920934 -1.2544653 +0.68960935 -1.2149273 +0.69000936 -1.1746159 +0.69040936 -1.1335686 +0.69080937 -1.0917991 +0.6912094 -1.0493463 +0.6916094 -1.0062243 +0.6920094 -0.9624666 +0.6924094 -0.9181076 +0.6928094 -0.873162 +0.6932094 -0.82767165 +0.6936094 -0.78165156 +0.6940094 -0.7351448 +0.69440943 -0.6881666 +0.69480944 -0.6407609 +0.69520944 -0.5929432 +0.69560945 -0.5447583 +0.69600946 -0.49622196 +0.69640946 -0.44737956 +0.6968095 -0.39824715 +0.6972095 -0.34887066 +0.6976095 -0.2992663 +0.6980095 -0.24948046 +0.6984095 -0.19952947 +0.6988095 -0.14946003 +0.6992095 -9.9288575e-2 +0.6996095 -4.9062036e-2 +0.7000095 1.2031237e-3 +0.70040953 5.1459894e-2 +0.70080954 0.10169179 +0.70120955 0.15185183 +0.70160955 0.20192356 +0.70200956 0.25186017 +0.70240957 0.30164525 +0.7028096 0.35123226 +0.7032096 0.4006049 +0.7036096 0.44971707 +0.7040096 0.4985526 +0.7044096 0.54706585 +0.7048096 0.59524083 +0.7052096 0.6430326 +0.7056096 0.69042546 +0.7060096 0.73737496 +0.70640963 0.78386587 +0.70680964 0.8298546 +0.70720965 0.87532616 +0.70760965 0.9202379 +0.70800966 0.96457523 +0.70840967 1.0082965 +0.7088097 1.0513875 +0.7092097 1.093808 +0.7096097 1.135544 +0.7100097 1.1765563 +0.7104097 1.2168318 +0.7108097 1.2563325 +0.7112097 1.2950457 +0.7116097 1.3329351 +0.7120097 1.3699881 +0.71240973 1.4061702 +0.71280974 1.4414697 +0.71320975 1.4758533 +0.71360976 1.5093099 +0.71400976 1.541813 +0.71440977 1.5733373 +0.7148098 1.6038727 +0.7152098 1.6333903 +0.7156098 1.6618806 +0.7160098 1.689317 +0.7164098 1.7156904 +0.7168098 1.7409762 +0.7172098 1.765166 +0.7176098 1.7882375 +0.7180098 1.8101827 +0.71840984 1.8309813 +0.71880984 1.8506265 +0.71920985 1.8690997 +0.71960986 1.8863952 +0.72000986 1.9024966 +0.72040987 1.9173986 +0.7208099 1.9310874 +0.7212099 1.9435583 +0.7216099 1.9547999 +0.7220099 1.9648083 +0.7224099 1.9735743 +0.7228099 1.981095 +0.7232099 1.9873631 +0.7236099 1.9923769 +0.72400993 1.9961315 +0.72440994 1.9986259 +0.72480994 1.9998574 +0.72520995 1.999826 +0.72560996 1.9985313 +0.72600996 1.9959741 +0.72641 1.9921566 +0.72681 1.9870801 +0.72721 1.9807494 +0.72761 1.9731665 +0.72801 1.9643384 +0.72841 1.9542682 +0.72881 1.9429651 +0.72921 1.9304332 +0.72961 1.9166838 +0.73001003 1.9017215 +0.73041004 1.8855605 +0.73081005 1.8682058 +0.73121005 1.8496739 +0.73161006 1.8299707 +0.73201007 1.8091148 +0.7324101 1.7871128 +0.7328101 1.7639855 +0.7332101 1.7397404 +0.7336101 1.7144002 +0.7340101 1.6879731 +0.7344101 1.660484 +0.7348101 1.6319417 +0.7352101 1.6023731 +0.7356101 1.5717877 +0.73601013 1.5402094 +0.73641014 1.5076631 +0.73681015 1.4741596 +0.73721015 1.43973 +0.73761016 1.4043858 +0.73801017 1.3681599 +0.7384102 1.3310642 +0.7388102 1.2931335 +0.7392102 1.2543802 +0.7396102 1.2148404 +0.7400102 1.1745274 +0.7404102 1.1334785 +0.7408102 1.0917075 +0.7412102 1.0492532 +0.7416102 1.0061299 +0.74201024 0.9623774 +0.74241024 0.9180105 +0.74281025 0.8730704 +0.74321026 0.82757205 +0.74361026 0.7815579 +0.74401027 0.7350431 +0.7444103 0.6880711 +0.7448103 0.6406573 +0.7452103 0.59284604 +0.7456103 0.54465306 +0.7460103 0.49612337 +0.7464103 0.44727296 +0.7468103 0.39814743 +0.7472103 0.34876296 +0.74761033 0.2991657 +0.74801034 0.24937195 +0.74841034 0.19942823 +0.74881035 0.14935096 +0.74921036 9.9186964e-2 +0.74961036 4.89527e-2 +0.7500104 -1.3048649e-3 +0.7504104 -5.156923e-2 +0.7508104 -0.10179339 +0.7512104 -0.15196088 +0.7516104 -0.20202479 +0.7520104 -0.25196865 +0.7524104 -0.30174583 +0.7528104 -0.3513399 +0.7532104 -0.4007046 +0.75361043 -0.44982365 +0.75401044 -0.49865112 +0.75441045 -0.54717106 +0.75481045 -0.595338 +0.75521046 -0.6431362 +0.75561047 -0.69052094 +0.7560105 -0.73747665 +0.7564105 -0.78395945 +0.7568105 -0.82995415 +0.7572105 -0.87541765 +0.7576105 -0.92033505 +0.7580105 -0.964671 +0.7584105 -1.008391 +0.7588105 -1.0514807 +0.7592105 -1.0938996 +0.75961053 -1.1356341 +0.76001054 -1.1766448 +0.76041055 -1.2169186 +0.76081055 -1.2564176 +0.76121056 -1.2951291 +0.76161057 -1.3330166 +0.7620106 -1.3700678 +0.7624106 -1.4062481 +0.7628106 -1.4415455 +0.7632106 -1.4759271 +0.7636106 -1.5093817 +0.7640106 -1.5418777 +0.7644106 -1.5734049 +0.7648106 -1.6039335 +0.7652106 -1.6334534 +0.76561064 -1.6619372 +0.76601064 -1.6893755 +0.76641065 -1.7157427 +0.76681066 -1.74103 +0.76721066 -1.765214 +0.76761067 -1.7882864 +0.7680107 -1.810226 +0.7684107 -1.8310252 +0.7688107 -1.850665 +0.7692107 -1.8691386 +0.7696107 -1.886429 +0.7700107 -1.9025303 +0.7704107 -1.9174275 +0.7708107 -1.9311159 +0.77121073 -1.9435823 +0.77161074 -1.954823 +0.77201074 -1.9648273 +0.77241075 -1.973592 +0.77281076 -1.9811089 +0.77321076 -1.9873754 +0.7736108 -1.9923857 +0.7740108 -1.9961383 +0.7744108 -1.9986296 +0.7748108 -1.9998587 +0.7752108 -1.9998245 +0.7756108 -1.9985272 +0.7760108 -1.9959676 +0.7764108 -1.9921468 +0.7768108 -1.9870685 +0.77721083 -1.9807342 +0.77761084 -1.9731498 +0.77801085 -1.9643178 +0.77841085 -1.9542465 +0.77881086 -1.9429393 +0.77921087 -1.9304066 +0.7796109 -1.9166526 +0.7800109 -1.9016876 +0.7804109 -1.885524 +0.7808109 -1.8681668 +0.7812109 -1.8496323 +0.7816109 -1.8299266 +0.7820109 -1.8090682 +0.7824109 -1.7870637 +0.7828109 -1.763934 +0.78321093 -1.7396865 +0.78361094 -1.7143439 +0.78401095 -1.6879145 +0.78441095 -1.660423 +0.78481096 -1.6318785 +0.78521097 -1.6023077 +0.785611 -1.5717201 +0.786011 -1.5401446 +0.786411 -1.5075914 +0.786811 -1.4740908 +0.787211 -1.4396541 +0.787611 -1.4043133 +0.788011 -1.3680801 +0.788411 -1.3309883 +0.788811 -1.29305 +0.78921103 -1.254301 +0.78961104 -1.2147536 +0.79001105 -1.174445 +0.79041106 -1.1333884 +0.79081106 -1.0916222 +0.79121107 -1.0491601 +0.7916111 -1.0060419 +0.7920111 -0.9622815 +0.7924111 -0.91792005 +0.7928111 -0.872972 +0.7932111 -0.8274794 +0.7936111 -0.78145725 +0.7940111 -0.73494846 +0.7944111 -0.6879684 +0.7948111 -0.6405609 +0.79521114 -0.5927416 +0.79561114 -0.5445552 +0.79601115 -0.49601743 +0.79641116 -0.4471738 +0.79681116 -0.39804026 +0.79721117 -0.3486628 +0.7976112 -0.29905757 +0.7980112 -0.24927099 +0.7984112 -0.1993194 +0.7988112 -0.14924951 +0.7992112 -9.9077724e-2 +0.7996112 -4.8850987e-2 +0.8000112 1.4142354e-3 +0.8004112 5.1670935e-2 +0.80081123 0.10190263 +0.80121124 0.15206233 +0.80161124 0.2021336 +0.80201125 0.25207716 +0.80241126 0.30185392 +0.80281126 0.35144758 +0.8032113 0.40081176 +0.8036113 0.44993022 +0.8040113 0.49875703 +0.8044113 0.5472762 +0.8048113 0.5954424 +0.8052113 0.64323974 +0.8056113 0.6906236 +0.8060113 0.73757833 +0.8064113 0.7840601 +0.80681133 0.8300536 +0.80721134 0.87551594 +0.80761135 0.92043215 +0.80801135 0.9647601 +0.80841136 1.0084854 +0.80881137 1.0515672 +0.8092114 1.0939912 +0.8096114 1.1357177 +0.8100114 1.1767333 +0.8104114 1.2169993 +0.8108114 1.2565027 +0.8112114 1.2952065 +0.8116114 1.3330982 +0.8120114 1.370142 +0.8124114 1.4063258 +0.81281143 1.441616 +0.81321144 1.476001 +0.81361145 1.5094484 +0.81401145 1.5419475 +0.81441146 1.5734677 +0.81481147 1.6039988 +0.8152115 1.6335121 +0.8156115 1.661998 +0.8160115 1.68943 +0.8164115 1.7157989 +0.8168115 1.74108 +0.8172115 1.7652653 +0.8176115 1.788332 +0.8180115 1.8102725 +0.8184115 1.8310661 +0.81881154 1.8507065 +0.81921154 1.8691748 +0.81961155 1.8864653 +0.82001156 1.9025617 +0.82041156 1.9174587 +0.82081157 1.9311423 +0.8212116 1.9436082 +0.8216116 1.9548445 +0.8220116 1.9648478 +0.8224116 1.9736085 +0.8228116 1.9811239 +0.8232116 1.9873868 +0.8236116 1.9923953 +0.8240116 1.9961451 +0.82441163 1.9986336 +0.82481164 1.99986 +0.82521164 1.9998231 +0.82561165 1.9985229 +0.82601166 1.9959607 +0.82641166 1.9921372 +0.8268117 1.9870561 +0.8272117 1.9807191 +0.8276117 1.9731319 +0.8280117 1.9642973 +0.8284117 1.9542233 +0.8288117 1.9429133 +0.8292117 1.930378 +0.8296117 1.9166213 +0.8300117 1.9016562 +0.83041173 1.8854876 +0.83081174 1.8681304 +0.83121175 1.8495907 +0.83161175 1.8298856 +0.83201176 1.8090215 +0.83241177 1.7870181 +0.8328118 1.7638824 +0.8332118 1.7396363 +0.8336118 1.7142875 +0.8340118 1.6878599 +0.8344118 1.660362 +0.8348118 1.6318196 +0.8352118 1.6022421 +0.8356118 1.5716572 +0.8360118 1.5400748 +0.83641183 1.5075245 +0.83681184 1.4740169 +0.83721185 1.4395834 +0.83761185 1.4042355 +0.83801186 1.3680059 +0.83841187 1.3309066 +0.8388119 1.2929724 +0.8392119 1.2542157 +0.8396119 1.2146728 +0.8400119 1.1743565 +0.8404119 1.1333046 +0.8408119 1.0915306 +0.8412119 1.0490736 +0.8416119 1.0059474 +0.8420119 0.96219236 +0.84241194 0.9178229 +0.84281194 0.8728805 +0.84321195 0.8273799 +0.84361196 0.7813636 +0.84401196 0.7348468 +0.84441197 0.6878728 +0.844812 0.6404573 +0.845212 0.5926444 +0.845612 0.5444499 +0.846012 0.49591148 +0.846412 0.4470672 +0.846812 0.39793307 +0.847212 0.3485551 +0.847612 0.29894942 +0.84801203 0.24916248 +0.84841204 0.19921057 +0.84881204 0.14914043 +0.84921205 9.896849e-2 +0.84961206 4.874165e-2 +0.85001206 -1.5236059e-3 +0.8504121 -5.1780272e-2 +0.8508121 -0.10201185 +0.8512121 -0.15217139 +0.8516121 -0.2022424 +0.8520121 -0.25217807 +0.8524121 -0.30196205 +0.8528121 -0.35154775 +0.8532121 -0.4009189 +0.8536121 -0.45002934 +0.85401213 -0.49886295 +0.85441214 -0.54737407 +0.85481215 -0.5955468 +0.85521215 -0.64333606 +0.85561216 -0.6907262 +0.85601217 -0.73767287 +0.8564122 -0.78416073 +0.8568122 -0.8301462 +0.8572122 -0.8756143 +0.8576122 -0.92052245 +0.8580122 -0.9648559 +0.8584122 -1.0085733 +0.8588122 -1.0516602 +0.8592122 -1.0940763 +0.8596122 -1.1358078 +0.86001223 -1.1768155 +0.86041224 -1.2170861 +0.86081225 -1.2565819 +0.86121225 -1.2952899 +0.86161226 -1.333174 +0.86201227 -1.3702216 +0.8624123 -1.4063982 +0.8628123 -1.4416919 +0.8632123 -1.4760696 +0.8636123 -1.5095202 +0.8640123 -1.5420122 +0.8644123 -1.5735352 +0.8648123 -1.6040595 +0.8652123 -1.6335752 +0.8656123 -1.6620547 +0.86601233 -1.6894885 +0.86641234 -1.7158512 +0.86681235 -1.7411339 +0.86721236 -1.7653131 +0.86761236 -1.788381 +0.86801237 -1.810319 +0.8684124 -1.8311101 +0.8688124 -1.850748 +0.8692124 -1.8692137 +0.8696124 -1.8865017 +0.8700124 -1.9025954 +0.8704124 -1.9174898 +0.8708124 -1.9311707 +0.8712124 -1.9436339 +0.8716124 -1.9548676 +0.87201244 -1.9648682 +0.87241244 -1.9736263 +0.87281245 -1.9811388 +0.87321246 -1.9873991 +0.87361246 -1.9924048 +0.8740125 -1.9961514 +0.8744125 -1.9986377 +0.8748125 -1.9998612 +0.8752125 -1.9998217 +0.8756125 -1.9985191 +0.8760125 -1.9959537 +0.8764125 -1.9921283 +0.8768125 -1.9870437 +0.8772125 -1.9807049 +0.87761253 -1.973114 +0.87801254 -1.9642781 +0.87841254 -1.9542 +0.87881255 -1.9428892 +0.87921256 -1.9303493 +0.87961257 -1.9165922 +0.8800126 -1.9016223 +0.8804126 -1.8854536 +0.8808126 -1.8680915 +0.8812126 -1.849552 +0.8816126 -1.8298414 +0.8820126 -1.8089781 +0.8824126 -1.786969 +0.8828126 -1.7638345 +0.8832126 -1.7395823 +0.88361263 -1.7142351 +0.88401264 -1.6878012 +0.88441265 -1.6603053 +0.88481265 -1.6317564 +0.88521266 -1.6021813 +0.88561267 -1.5715896 +0.8860127 -1.5400099 +0.8864127 -1.5074526 +0.8868127 -1.4739481 +0.8872127 -1.4395076 +0.8876127 -1.404163 +0.8880127 -1.3679261 +0.8884127 -1.3308307 +0.8888127 -1.292889 +0.8892127 -1.2541305 +0.88961273 -1.2145859 +0.89001274 -1.174268 +0.89041275 -1.1332145 +0.89081275 -1.091439 +0.89121276 -1.0489805 +0.89161277 -1.0058528 +0.8920128 -0.96209645 +0.8924128 -0.91772574 +0.8928128 -0.8727821 +0.8932128 -0.8272803 +0.8936128 -0.78126293 +0.8940128 -0.734745 +0.8944128 -0.6877701 +0.8948128 -0.6403537 +0.8952128 -0.59253997 +0.89561284 -0.54434466 +0.89601284 -0.49581292 +0.89641285 -0.4469606 +0.89681286 -0.39783338 +0.89721286 -0.34844738 +0.89761287 -0.29884884 +0.8980129 -0.24905396 +0.8984129 -0.19910935 +0.8988129 -0.14903137 +0.8992129 -9.886687e-2 +0.8996129 -4.863231e-2 +0.9000129 1.6253471e-3 +0.9004129 5.1889606e-2 +0.9008129 0.10211346 +0.90121293 0.15228043 +0.90161294 0.20234363 +0.90201294 0.25228658 +0.90241295 0.30206263 +0.90281296 0.35165542 +0.90321296 0.40101856 +0.903613 0.45013592 +0.904013 0.49896148 +0.904413 0.5474793 +0.904813 0.59564394 +0.905213 0.64343965 +0.905613 0.6908217 +0.906013 0.73777455 +0.906413 0.7842543 +0.906813 0.83024573 +0.90721303 0.8757058 +0.90761304 0.92061955 +0.90801305 0.9649451 +0.90841305 1.0086677 +0.90881306 1.0517467 +0.90921307 1.0941678 +0.9096131 1.1358916 +0.9100131 1.176904 +0.9104131 1.2171669 +0.9108131 1.256667 +0.9112131 1.2953732 +0.9116131 1.3332555 +0.9120131 1.3703012 +0.9124131 1.4064759 +0.9128131 1.4417677 +0.91321313 1.4761434 +0.91361314 1.5095919 +0.91401315 1.542082 +0.91441315 1.5736027 +0.91481316 1.6041248 +0.91521317 1.6336383 +0.9156132 1.6621155 +0.9160132 1.6895471 +0.9164132 1.7159073 +0.9168132 1.7411877 +0.9172132 1.7653645 +0.9176132 1.7884299 +0.9180132 1.8103621 +0.9184132 1.8311541 +0.9188132 1.8507864 +0.91921324 1.8692527 +0.91961324 1.8865354 +0.92001325 1.9026291 +0.92041326 1.9175186 +0.92081326 1.9311992 +0.92121327 1.9436579 +0.9216133 1.9548907 +0.9220133 1.9648871 +0.9224133 1.9736439 +0.9228133 1.9811528 +0.9232133 1.9874114 +0.9236133 1.9924138 +0.9240133 1.9961582 +0.9244133 1.9986415 +0.92481333 1.9998626 +0.92521334 1.9998202 +0.92561334 1.9985148 +0.92601335 1.9959472 +0.92641336 1.9921185 +0.92681336 1.9870322 +0.9272134 1.9806898 +0.9276134 1.9730974 +0.9280134 1.9642575 +0.9284134 1.9541783 +0.9288134 1.9428632 +0.9292134 1.9303228 +0.9296134 1.9165609 +0.9300134 1.9015907 +0.9304134 1.8854171 +0.93081343 1.8680551 +0.93121344 1.8495104 +0.93161345 1.8298004 +0.93201345 1.8089315 +0.93241346 1.7869233 +0.93281347 1.763783 +0.9332135 1.7395283 +0.9336135 1.7141788 +0.9340135 1.6877425 +0.9344135 1.6602443 +0.9348135 1.6316931 +0.9352135 1.6021158 +0.9356135 1.5715219 +0.9360135 1.5399401 +0.9364135 1.5073807 +0.93681353 1.4738742 +0.93721354 1.4394317 +0.93761355 1.4040852 +0.93801355 1.3678463 +0.93841356 1.330749 +0.93881357 1.2928056 +0.9392136 1.2540513 +0.9396136 1.214499 +0.9400136 1.1741856 +0.9404136 1.1331244 +0.9408136 1.0913537 +0.9412136 1.0488873 +0.9416136 1.0057648 +0.9420136 0.96200055 +0.9424136 0.9176353 +0.94281363 0.8726837 +0.94321364 0.82718766 +0.94361365 0.78116226 +0.94401366 0.73465043 +0.94441366 0.6876674 +0.94481367 0.6402573 +0.9452137 0.5924355 +0.9456137 0.5442468 +0.9460137 0.49570695 +0.9464137 0.44686142 +0.9468137 0.39772618 +0.9472137 0.3483472 +0.9476137 0.29874068 +0.9480137 0.248953 +0.9484137 0.19900051 +0.94881374 0.14892991 +0.94921374 9.875764e-2 +0.94961375 4.8530597e-2 +0.95001376 -1.7347175e-3 +0.95041376 -5.199131e-2 +0.9508138 -0.10222269 +0.9512138 -0.15238188 +0.9516138 -0.20245244 +0.9520138 -0.25238752 +0.9524138 -0.30217075 +0.9528138 -0.35175556 +0.9532138 -0.40112573 +0.9536138 -0.45023504 +0.9540138 -0.4990674 +0.95441383 -0.54757714 +0.95481384 -0.5957483 +0.95521384 -0.6435432 +0.95561385 -0.69092435 +0.95601386 -0.7378762 +0.95641387 -0.7843549 +0.9568139 -0.8303452 +0.9572139 -0.87580407 +0.9576139 -0.92071664 +0.9580139 -0.96504086 +0.9584139 -1.0087622 +0.9588139 -1.0518397 +0.9592139 -1.0942594 +0.9596139 -1.1359816 +0.9600139 -1.1769924 +0.96041393 -1.2172537 +0.96081394 -1.2567521 +0.96121395 -1.2954508 +0.96161395 -1.333337 +0.96201396 -1.3703754 +0.96241397 -1.4065537 +0.962814 -1.4418381 +0.963214 -1.4762172 +0.963614 -1.5096587 +0.964014 -1.5421516 +0.964414 -1.5736655 +0.964814 -1.6041901 +0.965214 -1.633697 +0.965614 -1.6621763 +0.966014 -1.6896015 +0.96641403 -1.7159635 +0.96681404 -1.7412378 +0.96721405 -1.7654159 +0.96761405 -1.7884754 +0.96801406 -1.8104086 +0.96841407 -1.8311951 +0.9688141 -1.8508279 +0.9692141 -1.8692888 +0.9696141 -1.8865718 +0.9700141 -1.9026605 +0.9704141 -1.9175497 +0.9708141 -1.9312257 +0.9712141 -1.9436836 +0.9716141 -1.9549122 +0.9720141 -1.9649075 +0.97241414 -1.9736603 +0.97281414 -1.9811678 +0.97321415 -1.9874227 +0.97361416 -1.9924232 +0.97401416 -1.9961646 +0.97441417 -1.9986454 +0.9748142 -1.9998637 +0.9752142 -1.9998188 +0.9756142 -1.9985108 +0.9760142 -1.9959403 +0.9764142 -1.9921095 +0.9768142 -1.9870197 +0.9772142 -1.9806746 +0.9776142 -1.9730796 +0.97801423 -1.964237 +0.97841424 -1.9541551 +0.97881424 -1.9428372 +0.97921425 -1.9302942 +0.97961426 -1.9165297 +0.98001426 -1.9015568 +0.9804143 -1.8853806 +0.9808143 -1.868016 +0.9812143 -1.8494687 +0.9816143 -1.8297563 +0.9820143 -1.8088849 +0.9824143 -1.7868742 +0.9828143 -1.7637314 +0.9832143 -1.7394781 +0.9836143 -1.7141224 +0.98401433 -1.6876879 +0.98441434 -1.6601833 +0.98481435 -1.6316344 +0.98521435 -1.6020503 +0.98561436 -1.5714589 +0.98601437 -1.5398703 +0.9864144 -1.5073138 +0.9868144 -1.4738003 +0.9872144 -1.439361 +0.9876144 -1.4040072 +0.9880144 -1.3677721 +0.9884144 -1.3306674 +0.9888144 -1.292728 +0.9892144 -1.2539661 +0.9896144 -1.2144182 +0.99001443 -1.1740971 +0.99041444 -1.1330405 +0.99081445 -1.0912621 +0.99121445 -1.0488007 +0.99161446 -1.0056703 +0.99201447 -0.9619114 +0.9924145 -0.91753817 +0.9928145 -0.87259215 +0.9932145 -0.8270881 +0.9936145 -0.78106856 +0.9940145 -0.7345487 +0.9944145 -0.6875719 +0.9948145 -0.6401537 +0.9952145 -0.5923383 +0.9956145 -0.54414153 +0.99601454 -0.4956084 +0.99641454 -0.4467548 +0.99681455 -0.39762646 +0.99721456 -0.3482395 +0.99761456 -0.29864007 +0.99801457 -0.24884449 +0.9984146 -0.19889928 +0.9988146 -0.14882085 +0.9992146 -9.86484e-2 +0.9996146 -4.842126e-2 +set terminal latex +set output "sine.tex" +set nokey +plot [0.0:1.0] "sine.plt" with lines +0.0 -1.0 +8.0e-3 -1.0 +1.6e-2 -1.0 +2.4e-2 -1.0 +3.2e-2 -1.0 +4.0000003e-2 -1.0 +4.8000004e-2 -1.0 +5.6000005e-2 -1.0 +6.4e-2 -1.0 +7.2000004e-2 -1.0 +8.0000006e-2 -1.0 +8.800001e-2 -1.0 +9.600001e-2 -1.0 +0.10400001 -1.0 +0.11200001 -1.0 +0.12000001 -1.0 +0.128 -1.0 +0.136 -1.0 +0.14400001 -1.0 +0.15200001 -1.0 +0.16000001 -1.0 +0.16800001 -1.0 +0.17600001 -1.0 +0.18400002 -1.0 +0.19200002 -1.0 +0.20000002 -1.0 +0.20800002 -1.0 +0.21600002 -1.0 +0.22400002 -1.0 +0.23200002 -1.0 +0.24000002 -1.0 +0.24800003 -1.0 +0.256 -1.0 +0.264 -1.0 +0.27199998 -1.0 +0.27999997 -1.0 +0.28799996 -1.0 +0.29599994 -1.0 +0.30399993 -1.0 +0.31199992 -1.0 +0.3199999 -1.0 +0.3279999 -1.0 +0.33599988 -1.0 +0.34399986 -1.0 +0.35199985 -1.0 +0.35999984 -1.0 +0.36799982 -1.0 +0.3759998 -1.0 +0.3839998 -1.0 +0.39199978 -1.0 +0.39999977 -1.0 +0.40799975 -1.0 +0.41599974 -1.0 +0.42399973 -1.0 +0.4319997 -1.0 +0.4399997 -1.0 +0.4479997 -1.0 +0.45599967 -1.0 +0.46399966 -1.0 +0.47199965 -1.0 +0.47999963 -1.0 +0.48799962 -1.0 +0.4959996 -1.0 +0.5039996 -1.0 +0.5119996 -1.0 +0.5199996 -1.0 +0.52799964 -1.0 +0.53599966 -1.0 +0.5439997 -1.0 +0.5519997 -1.0 +0.5599997 -1.0 +0.5679997 -1.0 +0.57599974 -1.0 +0.58399975 -1.0 +0.59199977 -1.0 +0.5999998 -1.0 +0.6079998 -1.0 +0.6159998 -1.0 +0.62399983 -1.0 +0.63199985 -1.0 +0.63999987 -1.0 +0.6479999 -1.0 +0.6559999 -1.0 +0.6639999 -1.0 +0.67199993 -1.0 +0.67999995 -1.0 +0.68799996 -1.0 +0.696 -1.0 +0.704 -1.0 +0.712 -1.0 +0.72 -1.0 +0.72800004 -1.0 +0.73600006 -1.0 +0.7440001 -1.0 +0.7520001 -1.0 +0.7600001 -1.0 +0.7680001 -1.0 +0.77600014 -1.0 +0.78400016 -1.0 +0.7920002 -1.0 +0.8000002 -1.0 +0.8080002 -1.0 +0.8160002 -1.0 +0.82400024 -1.0 +0.83200026 -1.0 +0.8400003 -1.0 +0.8480003 -1.0 +0.8560003 -1.0 +0.8640003 -1.0 +0.87200034 -1.0 +0.88000035 -1.0 +0.88800037 -1.0 +0.8960004 -1.0 +0.9040004 -1.0 +0.9120004 -1.0 +0.92000043 -1.0 +0.92800045 -1.0 +0.93600047 -1.0 +0.9440005 -1.0 +0.9520005 -1.0 +0.9600005 -1.0 +0.96800053 -1.0 +0.97600055 -1.0 +0.98400056 -1.0 +0.9920006 -1.0 +1.0000006 -0.9999851 +1.0080006 -0.7999847 +1.0160006 -0.5999843 +1.0240006 -0.39998388 +1.0320007 -0.19998348 +1.0400007 1.692772e-5 +1.0480007 0.20001733 +1.0560007 0.40001774 +1.0640007 0.60001814 +1.0720007 0.80001855 +1.0800008 1.0000191 +1.0880008 1.2000194 +1.0960008 1.4000196 +1.1040008 1.6000202 +1.1120008 1.8000207 +1.1200008 2.000021 +1.1280009 2.2000213 +1.1360009 2.4000218 +1.1440009 2.6000223 +1.1520009 2.8000226 +1.1600009 3.000023 +1.1680009 3.2000237 +1.176001 3.400024 +1.184001 3.6000242 +1.192001 3.8000245 +1.200001 4.0000024 +1.208001 4.0199146 +1.216001 4.0393105 +1.224001 4.058002 +1.2320011 4.075812 +1.2400011 4.092575 +1.2480011 4.1081386 +1.2560011 4.122365 +1.2640011 4.1351323 +1.2720011 4.1463346 +1.2800012 4.155884 +1.2880012 4.16371 +1.2960012 4.1697617 +1.3040012 4.174006 +1.3120012 4.1764283 +1.3200012 4.177034 +1.3280013 4.175845 +1.3360013 4.1729026 +1.3440013 4.168264 +1.3520013 4.1620026 +1.3600013 4.154207 +1.3680013 4.144981 +1.3760014 4.13444 +1.3840014 4.1227107 +1.3920014 4.1099305 +1.4000014 4.0962453 +1.4080014 4.0818067 +1.4160014 4.066773 +1.4240015 4.0513043 +1.4320015 4.035564 +1.4400015 4.0197153 +1.4480015 4.003919 +1.4560015 3.9883342 +1.4640015 3.9731145 +1.4720016 3.9584074 +1.4800016 3.9443526 +1.4880016 3.9310822 +1.4960016 3.9187174 +1.5040016 3.9073682 +1.5120016 3.8971329 +1.5200016 3.8880968 +1.5280017 3.8803325 +1.5360017 3.8738976 +1.5440017 3.8688364 +1.5520017 3.8651776 +1.5600017 3.862936 +1.5680017 3.8621116 +1.5760018 3.8626904 +1.5840018 3.8646445 +1.5920018 3.8679318 +1.6000018 3.8724985 +1.6080018 3.8782783 +1.6160018 3.8851929 +1.6240019 3.8931556 +1.6320019 3.9020686 +1.6400019 3.9118276 +1.6480019 3.9223208 +1.6560019 3.9334302 +1.664002 3.9450345 +1.672002 3.9570084 +1.680002 3.969226 +1.688002 3.9815598 +1.696002 3.9938836 +1.704002 4.0060735 +1.712002 4.0180087 +1.720002 4.029573 +1.7280021 4.0406556 +1.7360021 4.0511527 +1.7440021 4.060967 +1.7520021 4.070011 +1.7600021 4.078206 +1.7680022 4.085482 +1.7760022 4.091781 +1.7840022 4.097055 +1.7920022 4.101267 +1.8000022 4.104391 +1.8080022 4.106413 +1.8160022 4.1073303 +1.8240023 4.1071506 +1.8320023 4.105894 +1.8400023 4.1035895 +1.8480023 4.100278 +1.8560023 4.0960073 +1.8640023 4.090837 +1.8720024 4.0848327 +1.8800024 4.0780687 +1.8880024 4.0706253 +1.8960024 4.0625877 +1.9040024 4.054047 +1.9120024 4.045097 +1.9200025 4.0358343 +1.9280025 4.026357 +1.9360025 4.016765 +1.9440025 4.0071564 +1.9520025 3.9976277 +1.9600025 3.988274 +1.9680026 3.9791875 +1.9760026 3.9704547 +1.9840026 3.9621587 +1.9920026 3.9543757 +2.0000026 3.947176 +2.0080025 3.9406233 +2.0160024 3.934773 +2.0240023 3.9296732 +2.0320022 3.9253635 +2.040002 3.9218745 +2.048002 3.9192286 +2.056002 3.9174385 +2.0640018 3.9165092 +2.0720017 3.9164367 +2.0800016 3.9172072 +2.0880015 3.9188004 +2.0960014 3.921187 +2.1040013 3.9243298 +2.1120012 3.928186 +2.120001 3.9327044 +2.128001 3.93783 +2.1360009 3.9435005 +2.1440008 3.9496508 +2.1520007 3.956211 +2.1600006 3.9631085 +2.1680005 3.9702682 +2.1760004 3.9776144 +2.1840003 3.9850693 +2.1920002 3.9925566 +2.2 4.0 +2.208 4.007325 +2.2159998 4.0144606 +2.2239997 4.0213366 +2.2319996 4.0278883 +2.2399995 4.034055 +2.2479994 4.0397806 +2.2559993 4.0450144 +2.2639992 4.049711 +2.2719991 4.0538325 +2.279999 4.0573454 +2.287999 4.060225 +2.2959988 4.0624514 +2.3039987 4.0640125 +2.3119986 4.064904 +2.3199985 4.0651274 +2.3279984 4.06469 +2.3359983 4.0636077 +2.3439982 4.0619016 +2.351998 4.0595984 +2.359998 4.0567307 +2.367998 4.053337 +2.3759978 4.0494595 +2.3839977 4.045145 +2.3919976 4.0404434 +2.3999975 4.035409 +2.4079974 4.030098 +2.4159973 4.024567 +2.4239972 4.018877 +2.431997 4.0130863 +2.439997 4.007256 +2.4479969 4.0014453 +2.4559968 3.9957118 +2.4639966 3.9901128 +2.4719965 3.984702 +2.4799964 3.9795318 +2.4879963 3.97465 +2.4959962 3.9701009 +2.5039961 3.9659252 +2.511996 3.9621596 +2.519996 3.9588351 +2.5279958 3.9559789 +2.5359957 3.953611 +2.5439956 3.9517488 +2.5519955 3.9504023 +2.5599954 3.9495773 +2.5679953 3.9492736 +2.5759952 3.9494863 +2.583995 3.9502048 +2.591995 3.9514136 +2.599995 3.953093 +2.6079948 3.9552188 +2.6159947 3.9577622 +2.6239946 3.9606915 +2.6319945 3.9639702 +2.6399944 3.9675598 +2.6479943 3.9714198 +2.6559942 3.9755063 +2.663994 3.979775 +2.671994 3.98418 +2.6799939 3.9886742 +2.6879938 3.9932117 +2.6959937 3.997745 +2.7039936 4.0022297 +2.7119935 4.0066204 +2.7199934 4.0108747 +2.7279932 4.014952 +2.7359931 4.0188136 +2.743993 4.0224247 +2.751993 4.025752 +2.7599928 4.028767 +2.7679927 4.031444 +2.7759926 4.033762 +2.7839925 4.0357027 +2.7919924 4.0372524 +2.7999923 4.038402 +2.8079922 4.0391464 +2.815992 4.0394845 +2.823992 4.0394187 +2.831992 4.038957 +2.8399918 4.03811 +2.8479917 4.036892 +2.8559916 4.035321 +2.8639915 4.0334196 +2.8719914 4.0312114 +2.8799913 4.0287237 +2.8879912 4.0259857 +2.895991 4.0230293 +2.903991 4.0198874 +2.911991 4.016595 +2.9199908 4.013188 +2.9279907 4.0097017 +2.9359906 4.0061727 +2.9439905 4.002638 +2.9519904 3.9991326 +2.9599903 3.9956918 +2.9679902 3.9923487 +2.97599 3.9891357 +2.98399 3.9860835 +2.9919899 3.98322 +2.9999897 3.9805713 +3.0079896 3.9781604 +3.0159895 3.9760075 +3.0239894 3.974131 +3.0319893 3.9725451 +3.0399892 3.971261 +3.0479891 3.9702873 +3.055989 3.9696283 +3.063989 3.969286 +3.0719888 3.9692583 +3.0799887 3.9695415 +3.0879886 3.970127 +3.0959885 3.9710045 +3.1039884 3.9721603 +3.1119883 3.9735785 +3.1199882 3.9752407 +3.127988 3.9771256 +3.135988 3.9792113 +3.143988 3.981474 +3.1519878 3.9838867 +3.1599877 3.9864244 +3.1679876 3.989058 +3.1759875 3.9917603 +3.1839874 3.994503 +3.1919873 3.9972572 +3.1999872 3.9999957 +3.207987 4.002691 +3.215987 4.005316 +3.2239869 4.0078454 +3.2319868 4.010256 +3.2399867 4.0125246 +3.2479866 4.0146313 +3.2559865 4.016557 +3.2639863 4.0182853 +3.2719862 4.0198016 +3.2799861 4.0210943 +3.287986 4.022154 +3.295986 4.0229735 +3.3039858 4.023548 +3.3119857 4.0238767 +3.3199856 4.023959 +3.3279855 4.0237985 +3.3359854 4.023401 +3.3439853 4.0227737 +3.3519852 4.0219264 +3.359985 4.020872 +3.367985 4.0196238 +3.375985 4.0181975 +3.3839848 4.0166106 +3.3919847 4.014881 +3.3999846 4.0130296 +3.4079845 4.0110755 +3.4159844 4.0090413 +3.4239843 4.006948 +3.4319842 4.0048175 +3.439984 4.0026727 +3.447984 4.000535 +3.4559839 3.998426 +3.4639838 3.996366 +3.4719837 3.9943752 +3.4799836 3.9924731 +3.4879835 3.9906769 +3.4959834 3.9890032 +3.5039833 3.9874668 +3.5119832 3.9860816 +3.519983 3.984858 +3.527983 3.983807 +3.5359828 3.982936 +3.5439827 3.9822502 +3.5519826 3.9817548 +3.5599825 3.981451 +3.5679824 3.981339 +3.5759823 3.9814167 +3.5839822 3.9816809 +3.5919821 3.9821253 +3.599982 3.9827428 +3.607982 3.9835248 +3.6159818 3.9844599 +3.6239817 3.9855375 +3.6319816 3.9867435 +3.6399815 3.9880638 +3.6479814 3.9894834 +3.6559813 3.9909868 +3.6639812 3.992557 +3.671981 3.9941773 +3.679981 3.995831 +3.687981 3.9975 +3.6959808 3.999168 +3.7039807 4.000818 +3.7119806 4.002433 +3.7199805 4.0039983 +3.7279804 4.0054984 +3.7359803 4.006919 +3.7439802 4.0082474 +3.75198 4.009472 +3.75998 4.010581 +3.7679799 4.011566 +3.7759798 4.012419 +3.7839797 4.013133 +3.7919796 4.013704 +3.7999794 4.014127 +3.8079793 4.014401 +3.8159792 4.0145254 +3.8239791 4.0145016 +3.831979 4.014332 +3.839979 4.0140204 +3.8479788 4.0135727 +3.8559787 4.0129952 +3.8639786 4.0122957 +3.8719785 4.0114837 +3.8799784 4.010568 +3.8879783 4.009561 +3.8959782 4.008474 +3.903978 4.007318 +3.911978 4.006107 +3.919978 4.0048537 +3.9279778 4.003571 +3.9359777 4.002273 +3.9439776 4.0009727 +3.9519775 3.999683 +3.9599774 3.998417 +3.9679773 3.9971871 +3.9759772 3.996005 +3.983977 3.994882 +3.991977 3.9938288 +3.9999769 3.992854 +4.007977 3.9919667 +4.015977 3.9911747 +4.023977 3.9904842 +4.0319767 3.9899006 +4.0399766 3.989428 +4.0479765 3.98907 +4.0559764 3.9888272 +4.0639763 3.9887009 +4.071976 3.9886909 +4.079976 3.9887948 +4.087976 3.9890099 +4.095976 3.9893327 +4.103976 3.9897575 +4.1119757 3.9902792 +4.1199756 3.9908905 +4.1279755 3.9915838 +4.1359754 3.992351 +4.1439753 3.9931831 +4.151975 3.994071 +4.159975 3.9950042 +4.167975 3.995973 +4.175975 3.9969673 +4.1839747 3.9979763 +4.1919746 3.9989896 +4.1999745 3.9999967 +4.2079744 3.8670897 +4.2159743 3.733758 +4.223974 3.6004262 +4.231974 3.467095 +4.239974 3.3337631 +4.247974 3.2004313 +4.255974 3.0671 +4.2639737 2.9337683 +4.2719736 2.8004367 +4.2799735 2.6671052 +4.2879734 2.5337734 +4.2959733 2.400442 +4.303973 2.2671103 +4.311973 2.1337786 +4.319973 2.000447 +4.327973 1.8671155 +4.335973 1.7337837 +4.3439727 1.6004522 +4.3519726 1.4671206 +4.3599725 1.3337889 +4.3679724 1.2004573 +4.3759723 1.0671258 +4.383972 0.933794 +4.391972 0.8004625 +4.399972 0.66713095 +4.407972 0.5337994 +4.4159718 0.40046763 +4.4239717 0.2671361 +4.4319715 0.13380456 +4.4399714 4.7278404e-4 +4.4479713 -0.13285875 +4.4559712 -0.26619053 +4.463971 -0.39952183 +4.471971 -0.5328536 +4.479971 -0.6661854 +4.487971 -0.7995167 +4.4959707 -0.93284845 +4.5039706 -1.0130347 +4.5119705 -1.0388085 +4.5199704 -1.0637013 +4.5279703 -1.0874522 +4.53597 -1.1098169 +4.54397 -1.1305714 +4.55197 -1.1495129 +4.55997 -1.1664628 +4.56797 -1.1812674 +4.5759697 -1.1937997 +4.5839696 -1.2039601 +4.5919695 -1.211677 +4.5999694 -1.2169073 +4.6079693 -1.2196363 +4.615969 -1.2198772 +4.623969 -1.217671 +4.631969 -1.2130848 +4.639969 -1.206211 +4.647969 -1.1971657 +4.6559687 -1.1860877 +4.6639686 -1.1731353 +4.6719685 -1.1584852 +4.6799684 -1.1423297 +4.6879683 -1.1248746 +4.695968 -1.1063366 +4.703968 -1.0869405 +4.711968 -1.0669167 +4.719968 -1.0464988 +4.7279677 -1.0259204 +4.7359676 -1.0054132 +4.7439675 -0.9852034 +4.7519674 -0.9655106 +4.7599673 -0.94654465 +4.767967 -0.92850345 +4.775967 -0.91157144 +4.783967 -0.89591736 +4.791967 -0.88169277 +4.799967 -0.86903095 +4.8079667 -0.8580451 +4.8159666 -0.84882826 +4.8239665 -0.8414518 +4.8319664 -0.83596575 +4.8399663 -0.83239794 +4.847966 -0.83075464 +4.855966 -0.8310205 +4.863966 -0.83315915 +4.871966 -0.83711433 +4.879966 -0.84281033 +4.8879657 -0.85015345 +4.8959656 -0.85903347 +4.9039655 -0.8693248 +4.9119654 -0.8808886 +4.9199653 -0.893574 +4.927965 -0.90722066 +4.935965 -0.92166007 +4.943965 -0.936718 +4.951965 -0.95221645 +4.9599648 -0.9679753 +4.9679646 -0.98381513 +4.9759645 -0.9995585 +4.9839644 -1.015032 +4.9919643 -1.0300686 +4.999964 -1.0445088 +5.007964 -1.0582025 +5.015964 -1.0710107 +5.023964 -1.0828063 +5.031964 -1.0934762 +5.0399637 -1.1029212 +5.0479636 -1.111058 +5.0559635 -1.1178188 +5.0639634 -1.1231527 +5.0719633 -1.1270251 +5.079963 -1.1294185 +5.087963 -1.1303322 +5.095963 -1.129782 +5.103963 -1.1277993 +5.111963 -1.1244311 +5.1199627 -1.1197392 +5.1279626 -1.1137987 +5.1359625 -1.1066976 +5.1439624 -1.0985346 +5.1519623 -1.0894194 +5.159962 -1.0794696 +5.167962 -1.0688103 +5.175962 -1.0575726 +5.183962 -1.0458912 +5.191962 -1.0339036 +5.1999617 -1.0217485 +5.2079616 -1.0095638 +5.2159615 -0.99748534 +5.2239614 -0.98564565 +5.2319613 -0.97417194 +5.239961 -0.96318537 +5.247961 -0.9527996 +5.255961 -0.94311935 +5.263961 -0.93424004 +5.2719607 -0.92624635 +5.2799606 -0.9192115 +5.2879605 -0.91319704 +5.2959604 -0.908252 +5.3039603 -0.9044126 +5.31196 -0.9017023 +5.31996 -0.90013146 +5.32796 -0.8996976 +5.33596 -0.90038586 +5.34396 -0.90216887 +5.3519597 -0.9050078 +5.3599596 -0.90885264 +5.3679595 -0.9136431 +5.3759594 -0.9193096 +5.3839593 -0.9257737 +5.391959 -0.93294984 +5.399959 -0.9407457 +5.407959 -0.94906396 +5.415959 -0.9578031 +5.423959 -0.9668585 +5.4319587 -0.9761243 +5.4399586 -0.98549366 +5.4479585 -0.9948607 +5.4559584 -1.0041215 +5.4639583 -1.013175 +5.471958 -1.021924 +5.479958 -1.0302769 +5.487958 -1.0381477 +5.495958 -1.0454572 +5.5039577 -1.0521342 +5.5119576 -1.0581155 +5.5199575 -1.0633465 +5.5279574 -1.0677826 +5.5359573 -1.0713881 +5.543957 -1.0741376 +5.551957 -1.0760152 +5.559957 -1.0770156 +5.567957 -1.0771428 +5.575957 -1.0764107 +5.5839567 -1.0748423 +5.5919566 -1.0724697 +5.5999565 -1.0693333 +5.6079564 -1.0654812 +5.6159563 -1.0609688 +5.623956 -1.0558577 +5.631956 -1.0502151 +5.639956 -1.0441129 +5.647956 -1.0376272 +5.655956 -1.0308366 +5.6639557 -1.0238217 +5.6719556 -1.0166645 +5.6799555 -1.0094471 +5.6879554 -1.0022506 +5.6959553 -0.9951546 +5.703955 -0.98823625 +5.711955 -0.98156935 +5.719955 -0.97522354 +5.727955 -0.9692637 +5.7359548 -0.9637493 +5.7439547 -0.9587339 +5.7519546 -0.9542646 +5.7599545 -0.9503814 +5.7679543 -0.9471172 +5.7759542 -0.9444976 +5.783954 -0.9425403 +5.791954 -0.9412556 +5.799954 -0.9406461 +5.807954 -0.9407067 +5.8159537 -0.94142497 +5.8239536 -0.94278157 +5.8319535 -0.9447503 +5.8399534 -0.9472985 +5.8479533 -0.95038784 +5.855953 -0.9539745 +5.863953 -0.95801 +5.871953 -0.9624417 +5.879953 -0.96721333 +5.887953 -0.9722661 +5.8959527 -0.97753865 +5.9039526 -0.982969 +5.9119525 -0.98849374 +5.9199524 -0.99405 +5.9279523 -0.99957544 +5.935952 -1.005009 +5.943952 -1.0102924 +5.951952 -1.0153692 +5.959952 -1.0201865 +5.967952 -1.0246956 +5.9759517 -1.0288517 +5.9839516 -1.0326146 +5.9919515 -1.0359496 +5.9999514 -1.0388268 +6.0079513 -1.0412226 +6.015951 -1.0431185 +6.023951 -1.0445021 +6.031951 -1.0453672 +6.039951 -1.0457132 +6.0479507 -1.0455452 +6.0559506 -1.0448741 +6.0639505 -1.0437161 +6.0719504 -1.0420926 +6.0799503 -1.0400296 +6.08795 -1.037558 +6.09595 -1.0347121 +6.10395 -1.0315301 +6.11195 -1.0280534 +6.11995 -1.0243256 +6.1279497 -1.0203927 +6.1359496 -1.0163016 +6.1439495 -1.0121008 +6.1519494 -1.007839 +6.1599493 -1.0035642 +6.167949 -0.9993246 +6.175949 -0.9951664 +6.183949 -0.9911344 +6.191949 -0.9872713 +6.199949 -0.98361695 +6.2079487 -0.9802085 +6.2159486 -0.97707933 +6.2239485 -0.97425944 +6.2319484 -0.97177476 +6.2399483 -0.969647 +6.247948 -0.96789366 +6.255948 -0.96652764 +6.263948 -0.96555734 +6.271948 -0.9649867 +6.2799478 -0.96481496 +6.2879477 -0.9650372 +6.2959476 -0.96564406 +6.3039474 -0.96662205 +6.3119473 -0.9679538 +6.3199472 -0.96961844 +6.327947 -0.9715916 +6.335947 -0.97384596 +6.343947 -0.97635156 +6.351947 -0.97907627 +6.3599467 -0.98198587 +6.3679466 -0.98504496 +6.3759465 -0.98821676 +6.3839464 -0.9914642 +6.3919463 -0.9947497 +6.399946 -0.9980363 +6.407946 -1.0012875 +6.415946 -1.0044675 +6.423946 -1.0075425 +6.431946 -1.01048 +6.4399457 -1.0132498 +6.4479456 -1.0158241 +6.4559455 -1.0181776 +6.4639454 -1.0202881 +6.4719453 -1.0221364 +6.479945 -1.0237064 +6.487945 -1.0249858 +6.495945 -1.0259651 +6.503945 -1.0266389 +6.511945 -1.0270048 +6.5199447 -1.0270644 +6.5279446 -1.0268223 +6.5359445 -1.0262864 +6.5439444 -1.0254676 +6.5519443 -1.0243802 +6.559944 -1.023041 +6.567944 -1.021469 +6.575944 -1.019686 +6.583944 -1.0177153 +6.5919437 -1.0155822 +6.5999436 -1.0133132 +6.6079435 -1.0109358 +6.6159434 -1.0084784 +6.6239433 -1.0059696 +6.631943 -1.0034382 +6.639943 -1.0009129 +6.647943 -0.9984215 +6.655943 -0.99599105 +6.663943 -0.9936476 +6.6719427 -0.99141556 +6.6799426 -0.98931783 +6.6879425 -0.98737544 +6.6959424 -0.98560715 +6.7039423 -0.98402965 +6.711942 -0.98265713 +6.719942 -0.9815013 +6.727942 -0.9805711 +6.735942 -0.979873 +6.743942 -0.97941077 +6.7519417 -0.9791853 +6.7599416 -0.97919506 +6.7679415 -0.97943586 +6.7759414 -0.9799009 +6.7839413 -0.98058116 +6.791941 -0.98146534 +6.799941 -0.98253995 +6.807941 -0.98378986 +6.815941 -0.98519814 +6.8239408 -0.98674625 +6.8319407 -0.9884146 +6.8399405 -0.99018264 +6.8479404 -0.99202883 +6.8559403 -0.9939314 +6.8639402 -0.9958682 +6.87194 -0.99781716 +6.87994 -0.9997564 +6.88794 -1.0016644 +6.89594 -1.0035207 +6.9039397 -1.0053055 +6.9119396 -1.0070002 +6.9199395 -1.0085876 +6.9279394 -1.0100518 +6.9359393 -1.0113788 +6.943939 -1.0125563 +6.951939 -1.0135736 +6.959939 -1.0144224 +6.967939 -1.0150962 +6.975939 -1.0155905 +6.9839387 -1.0159029 +6.9919386 -1.0160332 +6.9999385 -1.015983 +7.0079384 -1.0157561 +7.0159383 -1.0153582 +7.023938 -1.0147965 +7.031938 -1.0140803 +7.039938 -1.0132201 +7.047938 -1.0122279 +7.055938 -1.0111173 +7.0639377 -1.0099025 +7.0719376 -1.0085988 +7.0799375 -1.0072224 +7.0879374 -1.0057898 +7.0959373 -1.0043178 +7.103937 -1.0028235 +7.111937 -1.0013238 +7.119937 -0.99983567 +7.127937 -0.9983753 +7.1359367 -0.99695843 +7.1439366 -0.9956001 +7.1519365 -0.9943144 +7.1599364 -0.99311423 +7.1679363 -0.99201155 +7.175936 -0.99101686 +7.183936 -0.99013937 +7.191936 -0.9893867 +7.199936 -0.9887651 +7.207936 -0.98827916 +7.2159357 -0.98793197 +7.2239356 -0.98772484 +7.2319355 -0.9876578 +7.2399354 -0.987729 +7.2479353 -0.98793536 +7.255935 -0.98827213 +7.263935 -0.98873335 +7.271935 -0.9893117 +7.279935 -0.9899987 +7.287935 -0.9907849 +7.2959347 -0.9916597 +7.3039346 -0.99261194 +7.3119345 -0.99362963 +7.3199344 -0.99470043 +7.3279343 -0.99581134 +7.335934 -0.99694943 +7.343934 -0.9981016 +7.351934 -0.99925476 +7.359934 -1.000396 +7.3679338 -1.001513 +7.3759336 -1.0025938 +7.3839335 -1.0036267 +7.3919334 -1.0046015 +7.3999333 -1.005508 +7.407933 -1.0063375 +7.415933 -1.0070822 +7.423933 -1.0077353 +7.431933 -1.0082909 +7.439933 -1.0087447 +7.4479327 -1.0090934 +7.4559326 -1.009335 +7.4639325 -1.0094688 +7.4719324 -1.0094949 +7.4799323 -1.0094151 +7.487932 -1.009232 +7.495932 -1.0089496 +7.503932 -1.0 +7.511932 -1.0 +7.519932 -1.0 +7.5279317 -1.0 +7.5359316 -1.0 +7.5439315 -1.0 +7.5519314 -1.0 +7.5599313 -1.0 +7.567931 -1.0 +7.575931 -1.0 +7.583931 -1.0 +7.591931 -1.0 +7.599931 -1.0 +7.6079307 -1.0 +7.6159306 -1.0 +7.6239305 -1.0 +7.6319304 -1.0 +7.6399302 -1.0 +7.64793 -1.0 +7.65593 -1.0 +7.66393 -1.0 +7.67193 -1.0 +7.6799297 -1.0 +7.6879296 -1.0 +7.6959295 -1.0 +7.7039294 -1.0 +7.7119293 -1.0 +7.719929 -1.0 +7.727929 -1.0 +7.735929 -1.0 +7.743929 -1.0 +7.751929 -1.0 +7.7599287 -1.0 +7.7679286 -1.0 +7.7759285 -1.0 +7.7839284 -1.0 +7.7919283 -1.0 +7.799928 -1.0 +7.807928 -1.0 +7.815928 -1.0 +7.823928 -1.0 +7.831928 -1.0 +7.8399277 -1.0 +7.8479276 -1.0 +7.8559275 -1.0 +7.8639274 -1.0 +7.8719273 -1.0 +7.879927 -1.0 +7.887927 -1.0 +7.895927 -1.0 +7.903927 -1.0 +7.9119267 -1.0 +7.9199266 -1.0 +7.9279265 -1.0 +7.9359264 -1.0 +7.9439263 -1.0 +7.951926 -1.0 +7.959926 -1.0 +7.967926 -1.0 +7.975926 -1.0 +7.983926 -1.0 +7.9919257 -1.0 +7.9999256 -1.0 +8.007926 -1.0 +8.015926 -1.0 +8.023927 -1.0 +8.031927 -1.0 +8.0399275 -1.0 +8.047928 -1.0 +8.055928 -1.0 +8.063929 -1.0 +8.071929 -1.0 +8.079929 -1.0 +8.08793 -1.0 +8.09593 -1.0 +8.10393 -1.0 +8.111931 -1.0 +8.119931 -1.0 +8.127932 -1.0 +8.135932 -1.0 +8.143932 -1.0 +8.151933 -1.0 +8.159933 -1.0 +8.167933 -1.0 +8.175934 -1.0 +8.183934 -1.0 +8.191935 -1.0 +8.199935 -1.0 +8.207935 -1.0 +8.215936 -1.0 +8.223936 -1.0 +8.231936 -1.0 +8.239937 -1.0 +8.247937 -1.0 +8.255938 -1.0 +8.263938 -1.0 +8.271938 -1.0 +8.279939 -1.0 +8.287939 -1.0 +8.295939 -1.0 +8.30394 -1.0 +8.31194 -1.0 +8.319941 -1.0 +8.327941 -1.0 +8.335941 -1.0 +8.343942 -1.0 +8.351942 -1.0 +8.359942 -1.0 +8.367943 -1.0 +8.375943 -1.0 +8.383944 -1.0 +8.391944 -1.0 +8.399944 -1.0 +8.407945 -1.0 +8.415945 -1.0 +8.423945 -1.0 +8.431946 -1.0 +8.439946 -1.0 +8.447947 -1.0 +8.455947 -1.0 +8.463947 -1.0 +8.471948 -1.0 +8.479948 -1.0 +8.487948 -1.0 +8.495949 -1.0 +8.503949 -1.0 +8.51195 -1.0 +8.51995 -1.0 +8.52795 -1.0 +8.535951 -1.0 +8.543951 -1.0 +8.551951 -1.0 +8.559952 -1.0 +8.567952 -1.0 +8.575953 -1.0 +8.583953 -1.0 +8.591953 -1.0 +8.599954 -1.0 +8.607954 -1.0 +8.615954 -1.0 +8.623955 -1.0 +8.631955 -1.0 +8.6399555 -1.0 +8.647956 -1.0 +8.655956 -1.0 +8.663957 -1.0 +8.671957 -1.0 +8.679957 -1.0 +8.687958 -1.0 +8.695958 -1.0 +8.7039585 -1.0 +8.711959 -1.0 +8.719959 -1.0 +8.72796 -1.0 +8.73596 -1.0 +8.74396 -1.0 +8.751961 -1.0 +8.759961 -1.0 +8.7679615 -1.0 +8.775962 -1.0 +8.783962 -1.0 +8.791963 -1.0 +8.799963 -1.0 +8.807963 -1.0 +8.815964 -1.0 +8.823964 -1.0 +8.8319645 -1.0 +8.839965 -1.0 +8.847965 -1.0 +8.855966 -1.0 +8.863966 -1.0 +8.871966 -1.0 +8.879967 -1.0 +8.887967 -1.0 +8.8959675 -1.0 +8.903968 -1.0 +8.911968 -1.0 +8.919969 -1.0 +8.927969 -1.0 +8.935969 -1.0 +8.94397 -1.0 +8.95197 -1.0 +8.95997 -1.0 +8.967971 -1.0 +8.975971 -1.0 +8.983972 -1.0 +8.991972 -1.0 +8.999972 -1.0 +9.007973 -1.0 +9.015973 -1.0 +9.023973 -1.0 +9.031974 -1.0 +9.039974 -1.0 +9.047975 -1.0 +9.055975 -1.0 +9.063975 -1.0 +9.071976 -1.0 +9.079976 -1.0 +9.087976 -1.0 +9.095977 -1.0 +9.103977 -1.0 +9.111978 -1.0 +9.119978 -1.0 +9.127978 -1.0 +9.135979 -1.0 +9.143979 -1.0 +9.151979 -1.0 +9.15998 -1.0 +9.16798 -1.0 +9.175981 -1.0 +9.183981 -1.0 +9.191981 -1.0 +9.199982 -1.0 +9.207982 -1.0 +9.215982 -1.0 +9.223983 -1.0 +9.231983 -1.0 +9.239984 -1.0 +9.247984 -1.0 +9.255984 -1.0 +9.263985 -1.0 +9.271985 -1.0 +9.279985 -1.0 +9.287986 -1.0 +9.295986 -1.0 +9.303987 -1.0 +9.311987 -1.0 +9.319987 -1.0 +9.327988 -1.0 +9.335988 -1.0 +9.343988 -1.0 +9.351989 -1.0 +9.359989 -1.0 +9.36799 -1.0 +9.37599 -1.0 +9.38399 -1.0 +9.391991 -1.0 +9.399991 -1.0 +9.407991 -1.0 +9.415992 -1.0 +9.423992 -1.0 +9.431993 -1.0 +9.439993 -1.0 +9.447993 -1.0 +9.455994 -1.0 +9.463994 -1.0 +9.471994 -1.0 +9.479995 -1.0 +9.487995 -1.0 +9.4959955 -1.0 +9.503996 -1.0 +9.511996 -1.0 +9.519997 -1.0 +9.527997 -1.0 +9.535997 -1.0 +9.543998 -1.0 +9.551998 -1.0 +9.5599985 -1.0 +9.567999 -1.0 +9.575999 -1.0 +9.584 -1.0 +9.592 -1.0 +9.6 -1.0 +9.608001 -1.0 +9.616001 -1.0 +9.6240015 -1.0 +9.632002 -1.0 +9.640002 -1.0 +9.648003 -1.0 +9.656003 -1.0 +9.664003 -1.0 +9.672004 -1.0 +9.680004 -1.0 +9.6880045 -1.0 +9.696005 -1.0 +9.704005 -1.0 +9.712006 -1.0 +9.720006 -1.0 +9.728006 -1.0 +9.736007 -1.0 +9.744007 -1.0 +9.7520075 -1.0 +9.760008 -1.0 +9.768008 -1.0 +9.776009 -1.0 +9.784009 -1.0 +9.792009 -1.0 +9.80001 -1.0 +9.80801 -1.0 +9.81601 -1.0 +9.824011 -1.0 +9.832011 -1.0 +9.840012 -1.0 +9.848012 -1.0 +9.856012 -1.0 +9.864013 -1.0 +9.872013 -1.0 +9.880013 -1.0 +9.888014 -1.0 +9.896014 -1.0 +9.904015 -1.0 +9.912015 -1.0 +9.920015 -1.0 +9.928016 -1.0 +9.936016 -1.0 +9.944016 -1.0 +9.952017 -1.0 +9.960017 -1.0 +9.968018 -1.0 +9.976018 -1.0 +9.984018 -1.0 +9.992019 -1.0 +10.000019 -1.0 +10.008019 -1.0 +10.01602 -1.0 +10.02402 -1.0 +10.032021 -1.0 +10.040021 -1.0 +10.048021 -1.0 +10.056022 -1.0 +10.064022 -1.0 +10.072022 -1.0 +10.080023 -1.0 +10.088023 -1.0 +10.096024 -1.0 +10.104024 -1.0 +10.112024 -1.0 +10.120025 -1.0 +10.128025 -1.0 +10.136025 -1.0 +10.144026 -1.0 +10.152026 -1.0 +10.160027 -1.0 +10.168027 -1.0 +10.176027 -1.0 +10.184028 -1.0 +10.192028 -1.0 +10.200028 -1.0 +10.208029 -1.0 +10.216029 -1.0 +10.22403 -1.0 +10.23203 -1.0 +10.24003 -1.0 +10.248031 -1.0 +10.256031 -1.0 +10.264031 -1.0 +10.272032 -1.0 +10.280032 -1.0 +10.288033 -1.0 +10.296033 -1.0 +10.304033 -1.0 +10.312034 -1.0 +10.320034 -1.0 +10.328034 -1.0 +10.336035 -1.0 +10.344035 -1.0 +10.3520355 -1.0 +10.360036 -1.0 +10.368036 -1.0 +10.376037 -1.0 +10.384037 -1.0 +10.392037 -1.0 +10.400038 -1.0 +10.408038 -1.0 +10.4160385 -1.0 +10.424039 -1.0 +10.432039 -1.0 +10.44004 -1.0 +10.44804 -1.0 +10.45604 -1.0 +10.464041 -1.0 +10.472041 -1.0 +10.4800415 -1.0 +10.488042 -1.0 +10.496042 -1.0 +10.504043 -1.0 +10.512043 -1.0 +10.520043 -1.0 +10.528044 -1.0 +10.536044 -1.0 +10.5440445 -1.0 +10.552045 -1.0 +10.560045 -1.0 +10.568046 -1.0 +10.576046 -1.0 +10.584046 -1.0 +10.592047 -1.0 +10.600047 -1.0 +10.6080475 -1.0 +10.616048 -1.0 +10.624048 -1.0 +10.632049 -1.0 +10.640049 -1.0 +10.648049 -1.0 +10.65605 -1.0 +10.66405 -1.0 +10.67205 -1.0 +10.680051 -1.0 +10.688051 -1.0 +10.696052 -1.0 +10.704052 -1.0 +10.712052 -1.0 +10.720053 -1.0 +10.728053 -1.0 +10.736053 -1.0 +10.744054 -1.0 +10.752054 -1.0 +10.760055 -1.0 +10.768055 -1.0 +10.776055 -1.0 +10.784056 -1.0 +10.792056 -1.0 +10.800056 -1.0 +10.808057 -1.0 +10.816057 -1.0 +10.824058 -1.0 +10.832058 -1.0 +10.840058 -1.0 +10.848059 -1.0 +10.856059 -1.0 +10.864059 -1.0 +10.87206 -1.0 +10.88006 -1.0 +10.888061 -1.0 +10.896061 -1.0 +10.904061 -1.0 +10.912062 -1.0 +10.920062 -1.0 +10.928062 -1.0 +10.936063 -1.0 +10.944063 -1.0 +10.952064 -1.0 +10.960064 -1.0 +10.968064 -1.0 +10.976065 -1.0 +10.984065 -1.0 +10.992065 -1.0 +11.000066 -0.9983549 +11.008066 -0.79834557 +11.016067 -0.5983362 +11.024067 -0.39832687 +11.032067 -0.19831753 +11.040068 1.6918182e-3 +11.048068 0.20170116 +11.056068 0.4017105 +11.064069 0.60171986 +11.072069 0.8017292 +11.08007 1.0017385 +11.08807 1.2017479 +11.09607 1.4017572 +11.104071 1.6017666 +11.112071 1.8017759 +11.120071 2.0017853 +11.128072 2.2017946 +11.136072 2.401804 +11.144073 2.6018133 +11.152073 2.8018227 +11.160073 3.001832 +11.168074 3.2018414 +11.176074 3.4018507 +11.184074 3.60186 +11.192075 3.8018694 +11.200075 4.000189 +11.208076 4.020098 +11.216076 4.039489 +11.224076 4.0581737 +11.232077 4.0759754 +11.240077 4.0927286 +11.248077 4.1082807 +11.256078 4.1224947 +11.264078 4.1352477 +11.2720785 4.146435 +11.280079 4.155968 +11.288079 4.163778 +11.29608 4.169812 +11.30408 4.1740384 +11.31208 4.176443 +11.320081 4.177031 +11.328081 4.1758246 +11.3360815 4.1728644 +11.344082 4.1682086 +11.352082 4.161931 +11.360083 4.1541204 +11.368083 4.14488 +11.376083 4.1343255 +11.384084 4.1225843 +11.392084 4.1097937 +11.4000845 4.096099 +11.408085 4.0816526 +11.416085 4.0666127 +11.424086 4.05114 +11.432086 4.035397 +11.440086 4.019547 +11.448087 4.0037518 +11.456087 3.9881692 +11.4640875 3.9729538 +11.472088 3.958252 +11.480088 3.9442048 +11.488089 3.930943 +11.496089 3.9185877 +11.504089 3.9072495 +11.51209 3.8970265 +11.52009 3.8880038 +11.5280905 3.8802538 +11.536091 3.8738337 +11.544091 3.8687878 +11.552092 3.8651443 +11.560092 3.8629189 +11.568092 3.8621106 +11.576093 3.8627052 +11.584093 3.8646746 +11.592093 3.8679771 +11.600094 3.8725586 +11.608094 3.8783517 +11.616095 3.8852797 +11.624095 3.8932538 +11.632095 3.9021783 +11.640096 3.9119468 +11.648096 3.9224482 +11.656096 3.9335647 +11.664097 3.9451742 +11.672097 3.9571528 +11.680098 3.9693727 +11.688098 3.981708 +11.696098 3.9940314 +11.704099 4.0062194 +11.712099 4.0181518 +11.720099 4.0297112 +11.7281 4.0407877 +11.7361 4.051277 +11.744101 4.0610833 +11.752101 4.070118 +11.760101 4.078302 +11.768102 4.085567 +11.776102 4.0918536 +11.784102 4.0971146 +11.792103 4.101313 +11.800103 4.1044235 +11.808104 4.1064315 +11.816104 4.1073346 +11.824104 4.1071415 +11.832105 4.105871 +11.840105 4.1035533 +11.848105 4.100229 +11.856106 4.0959463 +11.864106 4.090764 +11.872107 4.0847497 +11.880107 4.0779757 +11.888107 4.0705237 +11.896108 4.0624785 +11.904108 4.053931 +11.912108 4.044976 +11.920109 4.0357094 +11.928109 4.02623 +11.93611 4.0166364 +11.94411 4.0070276 +11.95211 3.9975004 +11.960111 3.9881496 +11.968111 3.9790664 +11.976111 3.9703388 +11.984112 3.9620485 +11.992112 3.9542727 +12.000113 3.9470816 +12.008113 3.9405375 +12.016113 3.9346972 +12.024114 3.9296079 +12.032114 3.9253092 +12.040114 3.9218316 +12.048115 3.919197 +12.056115 3.9174194 +12.064116 3.9165025 +12.072116 3.916442 +12.080116 3.9172244 +12.088117 3.9188294 +12.096117 3.921227 +12.104117 3.9243808 +12.112118 3.928247 +12.120118 3.932775 +12.1281185 3.9379091 +12.136119 3.9435878 +12.144119 3.9497452 +12.15212 3.9563112 +12.16012 3.9632134 +12.16812 3.9703774 +12.176121 3.977726 +12.184121 3.9851823 +12.1921215 3.99267 +12.200122 4.0001125 +12.208122 4.007436 +12.216123 4.0145683 +12.224123 4.02144 +12.232123 4.027987 +12.240124 4.0341477 +12.248124 4.0398664 +12.2561245 4.045092 +12.264125 4.049781 +12.272125 4.0538926 +12.280126 4.057396 +12.288126 4.0602655 +12.296126 4.0624814 +12.304127 4.064032 +12.312127 4.0649133 +12.3201275 4.0651255 +12.328128 4.0646777 +12.336128 4.0635853 +12.344129 4.0618687 +12.352129 4.059556 +12.360129 4.0566792 +12.36813 4.053277 +12.37613 4.0493917 +12.3841305 4.0450697 +12.392131 4.0403624 +12.400131 4.0353227 +12.408132 4.0300064 +12.416132 4.0244727 +12.424132 4.0187798 +12.432133 4.0129876 +12.440133 4.007157 +12.448133 4.0013466 +12.456134 3.9956145 +12.464134 3.990018 +12.472135 3.984611 +12.480135 3.9794445 +12.488135 3.974568 +12.496136 3.9700246 +12.504136 3.9658556 +12.512136 3.9620976 +12.520137 3.9587808 +12.528137 3.9559326 +12.536138 3.9535737 +12.544138 3.9517202 +12.552138 3.9503832 +12.560139 3.9495673 +12.568139 3.949273 +12.576139 3.9494948 +12.58414 3.9502225 +12.59214 3.9514399 +12.600141 3.9531279 +12.608141 3.9552617 +12.616141 3.9578128 +12.624142 3.9607487 +12.632142 3.9640336 +12.640142 3.967629 +12.648143 3.9714937 +12.656143 3.975584 +12.664144 3.979856 +12.672144 3.9842634 +12.680144 3.9887595 +12.688145 3.993297 +12.696145 3.9978309 +12.704145 4.002314 +12.712146 4.006703 +12.720146 4.0109544 +12.728147 4.015028 +12.736147 4.0188856 +12.744147 4.0224915 +12.752148 4.0258136 +12.760148 4.0288224 +12.768148 4.0314927 +12.776149 4.0338035 +12.784149 4.0357366 +12.79215 4.0372787 +12.80015 4.0384207 +12.80815 4.039157 +12.816151 4.039487 +12.824151 4.0394135 +12.832151 4.038944 +12.840152 4.0380893 +12.848152 4.036864 +12.856153 4.0352864 +12.864153 4.033378 +12.872153 4.0311637 +12.880154 4.0286703 +12.888154 4.0259275 +12.896154 4.022967 +12.904155 4.019821 +12.912155 4.016526 +12.920156 4.0131164 +12.928156 4.009629 +12.936156 4.0060997 +12.944157 4.002565 +12.952157 3.9990602 +12.960157 3.9956207 +12.968158 3.99228 +12.976158 3.98907 +12.9841585 3.986021 +12.992159 3.983162 +13.000159 3.9805174 +13.00816 3.9781117 +13.01616 3.9759645 +13.02416 3.974094 +13.032161 3.9725142 +13.040161 3.9712367 +13.0481615 3.9702697 +13.056162 3.9696174 +13.064162 3.9692817 +13.072163 3.9692612 +13.080163 3.969551 +13.088163 3.9701433 +13.096164 3.971027 +13.104164 3.972189 +13.1121645 3.9736128 +13.120165 3.9752798 +13.128165 3.97717 +13.136166 3.97926 +13.144166 3.981526 +13.152166 3.9839425 +13.160167 3.9864821 +13.168167 3.989118 +13.1761675 3.9918218 +13.184168 3.994565 +13.192168 3.9973197 +13.200169 4.000057 +13.208169 4.002751 +13.216169 4.0053744 +13.22417 4.0079017 +13.23217 4.0103097 +13.2401705 4.012575 +13.248171 4.0146775 +13.256171 4.016599 +13.264172 4.018323 +13.272172 4.019834 +13.280172 4.0211215 +13.288173 4.022176 +13.296173 4.0229897 +13.304173 4.0235586 +13.312174 4.0238814 +13.320174 4.023958 +13.328175 4.023792 +13.336175 4.023389 +13.344175 4.022756 +13.352176 4.021904 +13.360176 4.0208445 +13.368176 4.019592 +13.376177 4.0181613 +13.384177 4.0165706 +13.392178 4.0148377 +13.400178 4.0129833 +13.408178 4.0110273 +13.416179 4.008991 +13.424179 4.0068965 +13.432179 4.0047655 +13.44018 4.00262 +13.44818 4.000483 +13.456181 3.9983745 +13.464181 3.996316 +13.472181 3.994327 +13.480182 3.9924273 +13.488182 3.990634 +13.496182 3.9889631 +13.504183 3.9874306 +13.512183 3.9860487 +13.520184 3.98483 +13.528184 3.9837828 +13.536184 3.9829164 +13.544185 3.9822354 +13.552185 3.9817448 +13.560185 3.9814458 +13.568186 3.9813385 +13.576186 3.981421 +13.584187 3.98169 +13.592187 3.982139 +13.600187 3.982761 +13.608188 3.9835467 +13.616188 3.984486 +13.624188 3.985567 +13.632189 3.9867759 +13.640189 3.9880996 +13.64819 3.9895215 +13.65619 3.9910269 +13.66419 3.992599 +13.672191 3.9942203 +13.680191 3.9958744 +13.688191 3.9975438 +13.696192 3.9992118 +13.704192 4.0008607 +13.712193 4.0024753 +13.720193 4.004039 +13.728193 4.005537 +13.736194 4.0069556 +13.744194 4.0082817 +13.752194 4.009503 +13.760195 4.010609 +13.768195 4.011591 +13.776196 4.01244 +13.784196 4.0131507 +13.792196 4.013717 +13.800197 4.0141363 +13.808197 4.014406 +13.816197 4.014527 +13.824198 4.0144987 +13.832198 4.014325 +13.8401985 4.01401 +13.848199 4.0135584 +13.856199 4.0129776 +13.8642 4.0122747 +13.8722 4.0114594 +13.8802 4.0105414 +13.888201 4.009532 +13.896201 4.0084424 +13.9042015 4.007285 +13.912202 4.0060725 +13.920202 4.004818 +13.928203 4.003535 +13.936203 4.0022364 +13.944203 4.000936 +13.952204 3.9996467 +13.960204 3.9983816 +13.9682045 3.9971528 +13.976205 3.9959722 +13.984205 3.994851 +13.992206 3.9937997 +14.000206 3.9928274 +14.008206 3.991943 +14.016207 3.9911537 +14.024207 3.990466 +14.0322075 3.9898853 +14.040208 3.9894161 +14.048208 3.9890609 +14.056209 3.988822 +14.064209 3.988699 +14.072209 3.9886923 +14.08021 3.9887996 +14.08821 3.989018 +14.0962105 3.9893436 +14.104211 3.9897718 +14.112211 3.990296 +14.120212 3.9909096 +14.128212 3.9916053 +14.136212 3.992375 +14.144213 3.993209 +14.152213 3.9940982 +14.160213 3.9950328 +14.168214 3.9960027 +14.176214 3.9969974 +14.184215 3.9980063 +14.192215 3.9990196 +14.200215 3.996408 +14.208216 3.863068 +14.216216 3.7297287 +14.224216 3.5963893 +14.232217 3.4630494 +14.240217 3.32971 +14.248218 3.1963706 +14.256218 3.0630307 +14.264218 2.9296913 +14.272219 2.796352 +14.280219 2.6630123 +14.288219 2.5296726 +14.29622 2.3963332 +14.30422 2.2629936 +14.312221 2.129654 +14.320221 1.9963145 +14.328221 1.8629749 +14.336222 1.7296352 +14.344222 1.5962958 +14.352222 1.4629562 +14.360223 1.3296165 +14.368223 1.1962771 +14.376224 1.0629375 +14.384224 0.92959785 +14.392224 0.79625845 +14.400225 0.6629188 +14.408225 0.5295794 +14.416225 0.39623976 +14.424226 0.2629001 +14.432226 0.12956071 +14.440227 -3.7789345e-3 +14.448227 -0.13711834 +14.456227 -0.27045822 +14.464228 -0.40379763 +14.472228 -0.53713703 +14.480228 -0.6704769 +14.488229 -0.8038163 +14.496229 -0.9371557 +14.50423 -1.0138799 +14.51223 -1.0396309 +14.52023 -1.0644922 +14.528231 -1.0882031 +14.536231 -1.1105201 +14.544231 -1.1312197 +14.552232 -1.1501 +14.560232 -1.1669829 +14.568233 -1.1817157 +14.576233 -1.1941723 +14.584233 -1.2042537 +14.592234 -1.2118895 +14.600234 -1.2170376 +14.608234 -1.219684 +14.616235 -1.219843 +14.624235 -1.2175564 +14.632236 -1.212892 +14.640236 -1.2059433 +14.648236 -1.1968274 +14.656237 -1.1856833 +14.664237 -1.1726702 +14.672237 -1.1579654 +14.680238 -1.1417618 +14.688238 -1.1242657 +14.6962385 -1.1056938 +14.704239 -1.0862715 +14.712239 -1.0662293 +14.72024 -1.045801 +14.72824 -1.02522 +14.73624 -1.004718 +14.744241 -0.98452103 +14.752241 -0.9648486 +14.7602415 -0.9459099 +14.768242 -0.92790276 +14.776242 -0.9110109 +14.784243 -0.89540267 +14.792243 -0.88122904 +14.800243 -0.86862254 +14.808244 -0.85769594 +14.816244 -0.8485412 +14.8242445 -0.8412293 +14.832245 -0.83580923 +14.840245 -0.8323083 +14.848246 -0.83073187 +14.856246 -0.8310639 +14.864246 -0.83326745 +14.872247 -0.83728534 +14.880247 -0.84304124 +14.8882475 -0.85044086 +14.896248 -0.8593734 +14.904248 -0.8697127 +14.912249 -0.88131946 +14.920249 -0.8940425 +14.928249 -0.90772104 +14.93625 -0.9221863 +14.94425 -0.93726397 +14.9522505 -0.9527756 +14.960251 -0.9685415 +14.968251 -0.98438185 +14.976252 -1.0001194 +14.984252 -1.015581 +14.992252 -1.0305998 +15.000253 -1.0450164 +15.008253 -1.0586814 +15.016253 -1.0714558 +15.024254 -1.0832133 +15.032254 -1.0938411 +15.040255 -1.1032405 +15.048255 -1.1113287 +15.056255 -1.1180388 +15.064256 -1.12332 +15.072256 -1.1271389 +15.080256 -1.1294781 +15.088257 -1.1303378 +15.096257 -1.1297342 +15.104258 -1.1276994 +15.112258 -1.1242812 +15.120258 -1.1195414 +15.128259 -1.113556 +15.136259 -1.1064131 +15.144259 -1.0982125 +15.15226 -1.0890635 +15.16026 -1.0790844 +15.168261 -1.0684005 +15.176261 -1.0571431 +15.184261 -1.0454471 +15.192262 -1.03345 +15.200262 -1.0212905 +15.208262 -1.0091068 +15.216263 -0.99703425 +15.224263 -0.98520535 +15.232264 -0.97374713 +15.240264 -0.96278065 +15.248264 -0.9524191 +15.256265 -0.9427671 +15.264265 -0.93391937 +15.272265 -0.92596036 +15.280266 -0.918963 +15.288266 -0.9129882 +15.296267 -0.9080845 +15.304267 -0.9042878 +15.312267 -0.9016209 +15.320268 -0.9000938 +15.328268 -0.8997035 +15.336268 -0.9004345 +15.344269 -0.9022592 +15.352269 -0.90513813 +15.36027 -0.909021 +15.36827 -0.91384715 +15.37627 -0.9195464 +15.384271 -0.9260403 +15.392271 -0.93324274 +15.400271 -0.9410613 +15.408272 -0.94939846 +15.416272 -0.9581524 +15.424273 -0.96721876 +15.432273 -0.9764911 +15.440273 -0.9858629 +15.448274 -0.9952283 +15.456274 -1.0044833 +15.464274 -1.0135272 +15.472275 -1.0222628 +15.480275 -1.0305986 +15.488276 -1.0384489 +15.496276 -1.0457352 +15.504276 -1.052386 +15.512277 -1.0583386 +15.520277 -1.0635391 +15.528277 -1.067943 +15.536278 -1.0715148 +15.544278 -1.0742297 +15.5522785 -1.0760725 +15.560279 -1.0770376 +15.568279 -1.0771298 +15.57628 -1.0763634 +15.58428 -1.0747617 +15.59228 -1.0723573 +15.600281 -1.0691907 +15.608281 -1.0653105 +15.6162815 -1.0607723 +15.624282 -1.0556378 +15.632282 -1.0499748 +15.640283 -1.0438552 +15.648283 -1.037355 +15.656283 -1.0305531 +15.664284 -1.0235304 +15.672284 -1.0163687 +15.6802845 -1.0091501 +15.688285 -1.0019557 +15.696285 -0.9948652 +15.704286 -0.9879554 +15.712286 -0.98130006 +15.720286 -0.9749685 +15.728287 -0.9690257 +15.736287 -0.96353066 +15.7442875 -0.95853686 +15.752288 -0.9540909 +15.760288 -0.9502326 +15.768289 -0.94699466 +15.776289 -0.9444023 +15.784289 -0.94247293 +15.79229 -0.94121647 +15.80029 -0.9406352 +15.8082905 -0.9407237 +15.816291 -0.94146943 +15.824291 -0.9428525 +15.832292 -0.9448465 +15.840292 -0.9474186 +15.848292 -0.9505301 +15.856293 -0.954137 +15.864293 -0.9581907 +15.872293 -0.9626382 +15.880294 -0.9674233 +15.888294 -0.972487 +15.896295 -0.97776794 +15.904295 -0.98320395 +15.912295 -0.9887317 +15.920296 -0.9942882 +15.928296 -0.99981123 +15.936296 -1.00524 +15.944297 -1.0105158 +15.952297 -1.0155828 +15.960298 -1.0203881 +15.968298 -1.0248832 +15.976298 -1.0290232 +15.984299 -1.0327685 +15.992299 -1.0360843 +16.0003 -1.0389413 +16.008299 -1.0413154 +16.016298 -1.0431892 +16.024298 -1.0445504 +16.032297 -1.045393 +16.040297 -1.0457165 +16.048296 -1.0455265 +16.056295 -1.0448341 +16.064295 -1.0436556 +16.072294 -1.0420127 +16.080294 -1.0399318 +16.088293 -1.0374434 +16.096292 -1.0345825 +16.104292 -1.0313873 +16.112291 -1.0278991 +16.12029 -1.0241619 +16.12829 -1.0202215 +16.13629 -1.016125 +16.144289 -1.0119209 +16.152288 -1.0076578 +16.160288 -1.0033838 +16.168287 -0.99914694 +16.176287 -0.9949933 +16.184286 -0.9909679 +16.192286 -0.987113 +16.200285 -0.9834686 +16.208284 -0.9800713 +16.216284 -0.97695476 +16.224283 -0.9741486 +16.232283 -0.97167856 +16.240282 -0.9695663 +16.248281 -0.9678289 +16.25628 -0.9664793 +16.26428 -0.9655256 +16.27228 -0.9649716 +16.28028 -0.9648164 +16.288279 -0.96505475 +16.296278 -0.9656772 +16.304277 -0.9666701 +16.312277 -0.96801597 +16.320276 -0.96969366 +16.328276 -0.97167885 +16.336275 -0.97394395 +16.344275 -0.9764591 +16.352274 -0.97919184 +16.360273 -0.9821081 +16.368273 -0.9851723 +16.376272 -0.98834777 +16.384272 -0.99159724 +16.392271 -0.9948834 +16.40027 -0.99816906 +16.40827 -1.0014178 +16.41627 -1.0045941 +16.424269 -1.0076638 +16.432268 -1.010595 +16.440268 -1.0133573 +16.448267 -1.015923 +16.456266 -1.0182672 +16.464266 -1.0203674 +16.472265 -1.0222046 +16.480265 -1.0237632 +16.488264 -1.0250306 +16.496264 -1.0259978 +16.504263 -1.0266593 +16.512262 -1.0270131 +16.520262 -1.0270605 +16.528261 -1.0268066 +16.53626 -1.0262592 +16.54426 -1.0254297 +16.55226 -1.0243322 +16.560259 -1.0229834 +16.568258 -1.0214028 +16.576258 -1.0196121 +16.584257 -1.0176346 +16.592257 -1.0154958 +16.600256 -1.0132222 +16.608255 -1.0108413 +16.616255 -1.0083815 +16.624254 -1.0058714 +16.632254 -1.00334 +16.640253 -1.0008156 +16.648252 -0.9983261 +16.656252 -0.9958988 +16.664251 -0.99355924 +16.67225 -0.9913321 +16.68025 -0.98924017 +16.68825 -0.9873042 +16.696249 -0.9855431 +16.704248 -0.9839733 +16.712248 -0.9826089 +16.720247 -0.9814616 +16.728247 -0.9805402 +16.736246 -0.9798511 +16.744246 -0.97939783 +16.752245 -0.9791814 +16.760244 -0.9792 +16.768244 -0.9794494 +16.776243 -0.9799227 +16.784243 -0.98061085 +16.792242 -0.98150235 +16.800241 -0.9825838 +16.80824 -0.9838399 +16.81624 -0.9852537 +16.82424 -0.9868066 +16.83224 -0.9884789 +16.840239 -0.9902501 +16.848238 -0.99209875 +16.856237 -0.9940029 +16.864237 -0.99594045 +16.872236 -0.9978893 +16.880236 -0.99982756 +16.888235 -1.001734 +16.896235 -1.0035878 +16.904234 -1.0053695 +16.912233 -1.0070605 +16.920233 -1.0086435 +16.928232 -1.0101029 +16.936232 -1.0114245 +16.944231 -1.0125962 +16.95223 -1.0136076 +16.96023 -1.0144501 +16.96823 -1.0151173 +16.976229 -1.015605 +16.984228 -1.0159107 +16.992228 -1.0160345 +17.000227 -1.0159779 +17.008226 -1.0157448 +17.016226 -1.0153408 +17.024225 -1.0147735 +17.032225 -1.0140519 +17.040224 -1.0131868 +17.048223 -1.0121902 +17.056223 -1.0110757 +17.064222 -1.0098575 +17.072222 -1.0085511 +17.080221 -1.0071725 +17.08822 -1.0057381 +17.09622 -1.0042652 +17.10422 -1.0027704 +17.112219 -1.0012711 +17.120218 -0.99978375 +17.128218 -0.9983247 +17.136217 -0.99690974 +17.144217 -0.99555385 +17.152216 -0.994271 +17.160215 -0.99307406 +17.168215 -0.99197507 +17.176214 -0.9909844 +17.184214 -0.9901111 +17.192213 -0.98936296 +17.200212 -0.988746 +17.208212 -0.98826486 +17.216211 -0.9879225 +17.22421 -0.98772025 +17.23221 -0.98765796 +17.24021 -0.9877339 +17.248209 -0.9879447 +17.256208 -0.9882859 +17.264208 -0.9887512 +17.272207 -0.98933333 +17.280207 -0.99002385 +17.288206 -0.99081314 +17.296206 -0.99169075 +17.304205 -0.9926453 +17.312204 -0.993665 +17.320204 -0.99473727 +17.328203 -0.99584925 +17.336203 -0.99698794 +17.344202 -0.9981403 +17.352201 -0.99929315 +17.3602 -1.0004338 +17.3682 -1.0015496 +17.3762 -1.0026289 +17.3842 -1.0036601 +17.392199 -1.0046326 +17.400198 -1.0055367 +17.408197 -1.0063635 +17.416197 -1.0071052 +17.424196 -1.007755 +17.432196 -1.0083075 +17.440195 -1.0087578 +17.448195 -1.0091031 +17.456194 -1.0093411 +17.464193 -1.0094713 +17.472193 -1.009494 +17.480192 -1.0094107 +17.488192 -1.0092244 +17.496191 -1.0089389 +17.50419 -1.0 +17.51219 -1.0 +17.52019 -1.0 +17.528189 -1.0 +17.536188 -1.0 +17.544188 -1.0 +17.552187 -1.0 +17.560186 -1.0 +17.568186 -1.0 +17.576185 -1.0 +17.584185 -1.0 +17.592184 -1.0 +17.600183 -1.0 +17.608183 -1.0 +17.616182 -1.0 +17.624182 -1.0 +17.632181 -1.0 +17.64018 -1.0 +17.64818 -1.0 +17.65618 -1.0 +17.664179 -1.0 +17.672178 -1.0 +17.680178 -1.0 +17.688177 -1.0 +17.696177 -1.0 +17.704176 -1.0 +17.712175 -1.0 +17.720175 -1.0 +17.728174 -1.0 +17.736174 -1.0 +17.744173 -1.0 +17.752172 -1.0 +17.760172 -1.0 +17.768171 -1.0 +17.77617 -1.0 +17.78417 -1.0 +17.79217 -1.0 +17.800169 -1.0 +17.808168 -1.0 +17.816168 -1.0 +17.824167 -1.0 +17.832167 -1.0 +17.840166 -1.0 +17.848166 -1.0 +17.856165 -1.0 +17.864164 -1.0 +17.872164 -1.0 +17.880163 -1.0 +17.888163 -1.0 +17.896162 -1.0 +17.904161 -1.0 +17.91216 -1.0 +17.92016 -1.0 +17.92816 -1.0 +17.93616 -1.0 +17.944159 -1.0 +17.952158 -1.0 +17.960157 -1.0 +17.968157 -1.0 +17.976156 -1.0 +17.984156 -1.0 +17.992155 -1.0 +18.000154 -1.0 +18.008154 -1.0 +18.016153 -1.0 +18.024153 -1.0 +18.032152 -1.0 +18.040152 -1.0 +18.048151 -1.0 +18.05615 -1.0 +18.06415 -1.0 +18.07215 -1.0 +18.080149 -1.0 +18.088148 -1.0 +18.096148 -1.0 +18.104147 -1.0 +18.112146 -1.0 +18.120146 -1.0 +18.128145 -1.0 +18.136145 -1.0 +18.144144 -1.0 +18.152143 -1.0 +18.160143 -1.0 +18.168142 -1.0 +18.176142 -1.0 +18.184141 -1.0 +18.19214 -1.0 +18.20014 -1.0 +18.20814 -1.0 +18.216139 -1.0 +18.224138 -1.0 +18.232138 -1.0 +18.240137 -1.0 +18.248137 -1.0 +18.256136 -1.0 +18.264135 -1.0 +18.272135 -1.0 +18.280134 -1.0 +18.288134 -1.0 +18.296133 -1.0 +18.304132 -1.0 +18.312132 -1.0 +18.320131 -1.0 +18.32813 -1.0 +18.33613 -1.0 +18.34413 -1.0 +18.352129 -1.0 +18.360128 -1.0 +18.368128 -1.0 +18.376127 -1.0 +18.384127 -1.0 +18.392126 -1.0 +18.400126 -1.0 +18.408125 -1.0 +18.416124 -1.0 +18.424124 -1.0 +18.432123 -1.0 +18.440123 -1.0 +18.448122 -1.0 +18.456121 -1.0 +18.46412 -1.0 +18.47212 -1.0 +18.48012 -1.0 +18.48812 -1.0 +18.496119 -1.0 +18.504118 -1.0 +18.512117 -1.0 +18.520117 -1.0 +18.528116 -1.0 +18.536116 -1.0 +18.544115 -1.0 +18.552114 -1.0 +18.560114 -1.0 +18.568113 -1.0 +18.576113 -1.0 +18.584112 -1.0 +18.592112 -1.0 +18.600111 -1.0 +18.60811 -1.0 +18.61611 -1.0 +18.62411 -1.0 +18.632109 -1.0 +18.640108 -1.0 +18.648108 -1.0 +18.656107 -1.0 +18.664106 -1.0 +18.672106 -1.0 +18.680105 -1.0 +18.688105 -1.0 +18.696104 -1.0 +18.704103 -1.0 +18.712103 -1.0 +18.720102 -1.0 +18.728102 -1.0 +18.736101 -1.0 +18.7441 -1.0 +18.7521 -1.0 +18.7601 -1.0 +18.768099 -1.0 +18.776098 -1.0 +18.784098 -1.0 +18.792097 -1.0 +18.800097 -1.0 +18.808096 -1.0 +18.816095 -1.0 +18.824095 -1.0 +18.832094 -1.0 +18.840094 -1.0 +18.848093 -1.0 +18.856092 -1.0 +18.864092 -1.0 +18.872091 -1.0 +18.88009 -1.0 +18.88809 -1.0 +18.89609 -1.0 +18.904089 -1.0 +18.912088 -1.0 +18.920088 -1.0 +18.928087 -1.0 +18.936087 -1.0 +18.944086 -1.0 +18.952085 -1.0 +18.960085 -1.0 +18.968084 -1.0 +18.976084 -1.0 +18.984083 -1.0 +18.992083 -1.0 +19.000082 -1.0 +19.008081 -1.0 +19.01608 -1.0 +19.02408 -1.0 +19.03208 -1.0 +19.04008 -1.0 +19.048079 -1.0 +19.056078 -1.0 +19.064077 -1.0 +19.072077 -1.0 +19.080076 -1.0 +19.088076 -1.0 +19.096075 -1.0 +19.104074 -1.0 +19.112074 -1.0 +19.120073 -1.0 +19.128073 -1.0 +19.136072 -1.0 +19.144072 -1.0 +19.152071 -1.0 +19.16007 -1.0 +19.16807 -1.0 +19.17607 -1.0 +19.184069 -1.0 +19.192068 -1.0 +19.200068 -1.0 +19.208067 -1.0 +19.216066 -1.0 +19.224066 -1.0 +19.232065 -1.0 +19.240065 -1.0 +19.248064 -1.0 +19.256063 -1.0 +19.264063 -1.0 +19.272062 -1.0 +19.280062 -1.0 +19.288061 -1.0 +19.29606 -1.0 +19.30406 -1.0 +19.31206 -1.0 +19.320059 -1.0 +19.328058 -1.0 +19.336058 -1.0 +19.344057 -1.0 +19.352057 -1.0 +19.360056 -1.0 +19.368055 -1.0 +19.376055 -1.0 +19.384054 -1.0 +19.392054 -1.0 +19.400053 -1.0 +19.408052 -1.0 +19.416052 -1.0 +19.424051 -1.0 +19.43205 -1.0 +19.44005 -1.0 +19.44805 -1.0 +19.456049 -1.0 +19.464048 -1.0 +19.472048 -1.0 +19.480047 -1.0 +19.488047 -1.0 +19.496046 -1.0 +19.504045 -1.0 +19.512045 -1.0 +19.520044 -1.0 +19.528044 -1.0 +19.536043 -1.0 +19.544043 -1.0 +19.552042 -1.0 +19.560041 -1.0 +19.56804 -1.0 +19.57604 -1.0 +19.58404 -1.0 +19.59204 -1.0 +19.600039 -1.0 +19.608038 -1.0 +19.616037 -1.0 +19.624037 -1.0 +19.632036 -1.0 +19.640036 -1.0 +19.648035 -1.0 +19.656034 -1.0 +19.664034 -1.0 +19.672033 -1.0 +19.680033 -1.0 +19.688032 -1.0 +19.696032 -1.0 +19.704031 -1.0 +19.71203 -1.0 +19.72003 -1.0 +19.72803 -1.0 +19.736029 -1.0 +19.744028 -1.0 +19.752028 -1.0 +19.760027 -1.0 +19.768026 -1.0 +19.776026 -1.0 +19.784025 -1.0 +19.792025 -1.0 +19.800024 -1.0 +19.808023 -1.0 +19.816023 -1.0 +19.824022 -1.0 +19.832022 -1.0 +19.840021 -1.0 +19.84802 -1.0 +19.85602 -1.0 +19.86402 -1.0 +19.872019 -1.0 +19.880018 -1.0 +19.888018 -1.0 +19.896017 -1.0 +19.904016 -1.0 +19.912016 -1.0 +19.920015 -1.0 +19.928015 -1.0 +19.936014 -1.0 +19.944014 -1.0 +19.952013 -1.0 +19.960012 -1.0 +19.968012 -1.0 +19.976011 -1.0 +19.98401 -1.0 +19.99201 -1.0 +set terminal latex +set output "piece.tex" +set nokey +plot [0.0:20.0] "piece.plt" with lines + diff --git a/testsuite/tests/programs/barton-mangler-bug/piece.gnp b/testsuite/tests/programs/barton-mangler-bug/piece.gnp new file mode 100644 index 0000000000..2256bd670e --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/piece.gnp @@ -0,0 +1,4 @@ +set terminal latex +set output "piece.tex" +set nokey +plot [0.0:20.0] "piece.plt" with lines diff --git a/testsuite/tests/programs/barton-mangler-bug/piece.plt b/testsuite/tests/programs/barton-mangler-bug/piece.plt new file mode 100644 index 0000000000..e93d58c398 --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/piece.plt @@ -0,0 +1,2500 @@ +0.0 -1.0 +8.0e-3 -1.0 +1.6e-2 -1.0 +2.4e-2 -1.0 +3.2e-2 -1.0 +4.0000003e-2 -1.0 +4.8000004e-2 -1.0 +5.6000005e-2 -1.0 +6.4e-2 -1.0 +7.2000004e-2 -1.0 +8.0000006e-2 -1.0 +8.800001e-2 -1.0 +9.600001e-2 -1.0 +0.10400001 -1.0 +0.11200001 -1.0 +0.12000001 -1.0 +0.128 -1.0 +0.136 -1.0 +0.14400001 -1.0 +0.15200001 -1.0 +0.16000001 -1.0 +0.16800001 -1.0 +0.17600001 -1.0 +0.18400002 -1.0 +0.19200002 -1.0 +0.20000002 -1.0 +0.20800002 -1.0 +0.21600002 -1.0 +0.22400002 -1.0 +0.23200002 -1.0 +0.24000002 -1.0 +0.24800003 -1.0 +0.256 -1.0 +0.264 -1.0 +0.27199998 -1.0 +0.27999997 -1.0 +0.28799996 -1.0 +0.29599994 -1.0 +0.30399993 -1.0 +0.31199992 -1.0 +0.3199999 -1.0 +0.3279999 -1.0 +0.33599988 -1.0 +0.34399986 -1.0 +0.35199985 -1.0 +0.35999984 -1.0 +0.36799982 -1.0 +0.3759998 -1.0 +0.3839998 -1.0 +0.39199978 -1.0 +0.39999977 -1.0 +0.40799975 -1.0 +0.41599974 -1.0 +0.42399973 -1.0 +0.4319997 -1.0 +0.4399997 -1.0 +0.4479997 -1.0 +0.45599967 -1.0 +0.46399966 -1.0 +0.47199965 -1.0 +0.47999963 -1.0 +0.48799962 -1.0 +0.4959996 -1.0 +0.5039996 -1.0 +0.5119996 -1.0 +0.5199996 -1.0 +0.52799964 -1.0 +0.53599966 -1.0 +0.5439997 -1.0 +0.5519997 -1.0 +0.5599997 -1.0 +0.5679997 -1.0 +0.57599974 -1.0 +0.58399975 -1.0 +0.59199977 -1.0 +0.5999998 -1.0 +0.6079998 -1.0 +0.6159998 -1.0 +0.62399983 -1.0 +0.63199985 -1.0 +0.63999987 -1.0 +0.6479999 -1.0 +0.6559999 -1.0 +0.6639999 -1.0 +0.67199993 -1.0 +0.67999995 -1.0 +0.68799996 -1.0 +0.696 -1.0 +0.704 -1.0 +0.712 -1.0 +0.72 -1.0 +0.72800004 -1.0 +0.73600006 -1.0 +0.7440001 -1.0 +0.7520001 -1.0 +0.7600001 -1.0 +0.7680001 -1.0 +0.77600014 -1.0 +0.78400016 -1.0 +0.7920002 -1.0 +0.8000002 -1.0 +0.8080002 -1.0 +0.8160002 -1.0 +0.82400024 -1.0 +0.83200026 -1.0 +0.8400003 -1.0 +0.8480003 -1.0 +0.8560003 -1.0 +0.8640003 -1.0 +0.87200034 -1.0 +0.88000035 -1.0 +0.88800037 -1.0 +0.8960004 -1.0 +0.9040004 -1.0 +0.9120004 -1.0 +0.92000043 -1.0 +0.92800045 -1.0 +0.93600047 -1.0 +0.9440005 -1.0 +0.9520005 -1.0 +0.9600005 -1.0 +0.96800053 -1.0 +0.97600055 -1.0 +0.98400056 -1.0 +0.9920006 -1.0 +1.0000006 -0.9999851 +1.0080006 -0.7999847 +1.0160006 -0.5999843 +1.0240006 -0.39998388 +1.0320007 -0.19998348 +1.0400007 1.692772e-5 +1.0480007 0.20001733 +1.0560007 0.40001774 +1.0640007 0.60001814 +1.0720007 0.80001855 +1.0800008 1.0000191 +1.0880008 1.2000194 +1.0960008 1.4000196 +1.1040008 1.6000202 +1.1120008 1.8000207 +1.1200008 2.000021 +1.1280009 2.2000213 +1.1360009 2.4000218 +1.1440009 2.6000223 +1.1520009 2.8000226 +1.1600009 3.000023 +1.1680009 3.2000237 +1.176001 3.400024 +1.184001 3.6000242 +1.192001 3.8000245 +1.200001 4.0000024 +1.208001 4.0199146 +1.216001 4.0393105 +1.224001 4.058002 +1.2320011 4.075812 +1.2400011 4.092575 +1.2480011 4.1081386 +1.2560011 4.122365 +1.2640011 4.1351323 +1.2720011 4.1463346 +1.2800012 4.155884 +1.2880012 4.16371 +1.2960012 4.1697617 +1.3040012 4.174006 +1.3120012 4.1764283 +1.3200012 4.177034 +1.3280013 4.175845 +1.3360013 4.1729026 +1.3440013 4.168264 +1.3520013 4.1620026 +1.3600013 4.154207 +1.3680013 4.144981 +1.3760014 4.13444 +1.3840014 4.1227107 +1.3920014 4.1099305 +1.4000014 4.0962453 +1.4080014 4.0818067 +1.4160014 4.066773 +1.4240015 4.0513043 +1.4320015 4.035564 +1.4400015 4.0197153 +1.4480015 4.003919 +1.4560015 3.9883342 +1.4640015 3.9731145 +1.4720016 3.9584074 +1.4800016 3.9443526 +1.4880016 3.9310822 +1.4960016 3.9187174 +1.5040016 3.9073682 +1.5120016 3.8971329 +1.5200016 3.8880968 +1.5280017 3.8803325 +1.5360017 3.8738976 +1.5440017 3.8688364 +1.5520017 3.8651776 +1.5600017 3.862936 +1.5680017 3.8621116 +1.5760018 3.8626904 +1.5840018 3.8646445 +1.5920018 3.8679318 +1.6000018 3.8724985 +1.6080018 3.8782783 +1.6160018 3.8851929 +1.6240019 3.8931556 +1.6320019 3.9020686 +1.6400019 3.9118276 +1.6480019 3.9223208 +1.6560019 3.9334302 +1.664002 3.9450345 +1.672002 3.9570084 +1.680002 3.969226 +1.688002 3.9815598 +1.696002 3.9938836 +1.704002 4.0060735 +1.712002 4.0180087 +1.720002 4.029573 +1.7280021 4.0406556 +1.7360021 4.0511527 +1.7440021 4.060967 +1.7520021 4.070011 +1.7600021 4.078206 +1.7680022 4.085482 +1.7760022 4.091781 +1.7840022 4.097055 +1.7920022 4.101267 +1.8000022 4.104391 +1.8080022 4.106413 +1.8160022 4.1073303 +1.8240023 4.1071506 +1.8320023 4.105894 +1.8400023 4.1035895 +1.8480023 4.100278 +1.8560023 4.0960073 +1.8640023 4.090837 +1.8720024 4.0848327 +1.8800024 4.0780687 +1.8880024 4.0706253 +1.8960024 4.0625877 +1.9040024 4.054047 +1.9120024 4.045097 +1.9200025 4.0358343 +1.9280025 4.026357 +1.9360025 4.016765 +1.9440025 4.0071564 +1.9520025 3.9976277 +1.9600025 3.988274 +1.9680026 3.9791875 +1.9760026 3.9704547 +1.9840026 3.9621587 +1.9920026 3.9543757 +2.0000026 3.947176 +2.0080025 3.9406233 +2.0160024 3.934773 +2.0240023 3.9296732 +2.0320022 3.9253635 +2.040002 3.9218745 +2.048002 3.9192286 +2.056002 3.9174385 +2.0640018 3.9165092 +2.0720017 3.9164367 +2.0800016 3.9172072 +2.0880015 3.9188004 +2.0960014 3.921187 +2.1040013 3.9243298 +2.1120012 3.928186 +2.120001 3.9327044 +2.128001 3.93783 +2.1360009 3.9435005 +2.1440008 3.9496508 +2.1520007 3.956211 +2.1600006 3.9631085 +2.1680005 3.9702682 +2.1760004 3.9776144 +2.1840003 3.9850693 +2.1920002 3.9925566 +2.2 4.0 +2.208 4.007325 +2.2159998 4.0144606 +2.2239997 4.0213366 +2.2319996 4.0278883 +2.2399995 4.034055 +2.2479994 4.0397806 +2.2559993 4.0450144 +2.2639992 4.049711 +2.2719991 4.0538325 +2.279999 4.0573454 +2.287999 4.060225 +2.2959988 4.0624514 +2.3039987 4.0640125 +2.3119986 4.064904 +2.3199985 4.0651274 +2.3279984 4.06469 +2.3359983 4.0636077 +2.3439982 4.0619016 +2.351998 4.0595984 +2.359998 4.0567307 +2.367998 4.053337 +2.3759978 4.0494595 +2.3839977 4.045145 +2.3919976 4.0404434 +2.3999975 4.035409 +2.4079974 4.030098 +2.4159973 4.024567 +2.4239972 4.018877 +2.431997 4.0130863 +2.439997 4.007256 +2.4479969 4.0014453 +2.4559968 3.9957118 +2.4639966 3.9901128 +2.4719965 3.984702 +2.4799964 3.9795318 +2.4879963 3.97465 +2.4959962 3.9701009 +2.5039961 3.9659252 +2.511996 3.9621596 +2.519996 3.9588351 +2.5279958 3.9559789 +2.5359957 3.953611 +2.5439956 3.9517488 +2.5519955 3.9504023 +2.5599954 3.9495773 +2.5679953 3.9492736 +2.5759952 3.9494863 +2.583995 3.9502048 +2.591995 3.9514136 +2.599995 3.953093 +2.6079948 3.9552188 +2.6159947 3.9577622 +2.6239946 3.9606915 +2.6319945 3.9639702 +2.6399944 3.9675598 +2.6479943 3.9714198 +2.6559942 3.9755063 +2.663994 3.979775 +2.671994 3.98418 +2.6799939 3.9886742 +2.6879938 3.9932117 +2.6959937 3.997745 +2.7039936 4.0022297 +2.7119935 4.0066204 +2.7199934 4.0108747 +2.7279932 4.014952 +2.7359931 4.0188136 +2.743993 4.0224247 +2.751993 4.025752 +2.7599928 4.028767 +2.7679927 4.031444 +2.7759926 4.033762 +2.7839925 4.0357027 +2.7919924 4.0372524 +2.7999923 4.038402 +2.8079922 4.0391464 +2.815992 4.0394845 +2.823992 4.0394187 +2.831992 4.038957 +2.8399918 4.03811 +2.8479917 4.036892 +2.8559916 4.035321 +2.8639915 4.0334196 +2.8719914 4.0312114 +2.8799913 4.0287237 +2.8879912 4.0259857 +2.895991 4.0230293 +2.903991 4.0198874 +2.911991 4.016595 +2.9199908 4.013188 +2.9279907 4.0097017 +2.9359906 4.0061727 +2.9439905 4.002638 +2.9519904 3.9991326 +2.9599903 3.9956918 +2.9679902 3.9923487 +2.97599 3.9891357 +2.98399 3.9860835 +2.9919899 3.98322 +2.9999897 3.9805713 +3.0079896 3.9781604 +3.0159895 3.9760075 +3.0239894 3.974131 +3.0319893 3.9725451 +3.0399892 3.971261 +3.0479891 3.9702873 +3.055989 3.9696283 +3.063989 3.969286 +3.0719888 3.9692583 +3.0799887 3.9695415 +3.0879886 3.970127 +3.0959885 3.9710045 +3.1039884 3.9721603 +3.1119883 3.9735785 +3.1199882 3.9752407 +3.127988 3.9771256 +3.135988 3.9792113 +3.143988 3.981474 +3.1519878 3.9838867 +3.1599877 3.9864244 +3.1679876 3.989058 +3.1759875 3.9917603 +3.1839874 3.994503 +3.1919873 3.9972572 +3.1999872 3.9999957 +3.207987 4.002691 +3.215987 4.005316 +3.2239869 4.0078454 +3.2319868 4.010256 +3.2399867 4.0125246 +3.2479866 4.0146313 +3.2559865 4.016557 +3.2639863 4.0182853 +3.2719862 4.0198016 +3.2799861 4.0210943 +3.287986 4.022154 +3.295986 4.0229735 +3.3039858 4.023548 +3.3119857 4.0238767 +3.3199856 4.023959 +3.3279855 4.0237985 +3.3359854 4.023401 +3.3439853 4.0227737 +3.3519852 4.0219264 +3.359985 4.020872 +3.367985 4.0196238 +3.375985 4.0181975 +3.3839848 4.0166106 +3.3919847 4.014881 +3.3999846 4.0130296 +3.4079845 4.0110755 +3.4159844 4.0090413 +3.4239843 4.006948 +3.4319842 4.0048175 +3.439984 4.0026727 +3.447984 4.000535 +3.4559839 3.998426 +3.4639838 3.996366 +3.4719837 3.9943752 +3.4799836 3.9924731 +3.4879835 3.9906769 +3.4959834 3.9890032 +3.5039833 3.9874668 +3.5119832 3.9860816 +3.519983 3.984858 +3.527983 3.983807 +3.5359828 3.982936 +3.5439827 3.9822502 +3.5519826 3.9817548 +3.5599825 3.981451 +3.5679824 3.981339 +3.5759823 3.9814167 +3.5839822 3.9816809 +3.5919821 3.9821253 +3.599982 3.9827428 +3.607982 3.9835248 +3.6159818 3.9844599 +3.6239817 3.9855375 +3.6319816 3.9867435 +3.6399815 3.9880638 +3.6479814 3.9894834 +3.6559813 3.9909868 +3.6639812 3.992557 +3.671981 3.9941773 +3.679981 3.995831 +3.687981 3.9975 +3.6959808 3.999168 +3.7039807 4.000818 +3.7119806 4.002433 +3.7199805 4.0039983 +3.7279804 4.0054984 +3.7359803 4.006919 +3.7439802 4.0082474 +3.75198 4.009472 +3.75998 4.010581 +3.7679799 4.011566 +3.7759798 4.012419 +3.7839797 4.013133 +3.7919796 4.013704 +3.7999794 4.014127 +3.8079793 4.014401 +3.8159792 4.0145254 +3.8239791 4.0145016 +3.831979 4.014332 +3.839979 4.0140204 +3.8479788 4.0135727 +3.8559787 4.0129952 +3.8639786 4.0122957 +3.8719785 4.0114837 +3.8799784 4.010568 +3.8879783 4.009561 +3.8959782 4.008474 +3.903978 4.007318 +3.911978 4.006107 +3.919978 4.0048537 +3.9279778 4.003571 +3.9359777 4.002273 +3.9439776 4.0009727 +3.9519775 3.999683 +3.9599774 3.998417 +3.9679773 3.9971871 +3.9759772 3.996005 +3.983977 3.994882 +3.991977 3.9938288 +3.9999769 3.992854 +4.007977 3.9919667 +4.015977 3.9911747 +4.023977 3.9904842 +4.0319767 3.9899006 +4.0399766 3.989428 +4.0479765 3.98907 +4.0559764 3.9888272 +4.0639763 3.9887009 +4.071976 3.9886909 +4.079976 3.9887948 +4.087976 3.9890099 +4.095976 3.9893327 +4.103976 3.9897575 +4.1119757 3.9902792 +4.1199756 3.9908905 +4.1279755 3.9915838 +4.1359754 3.992351 +4.1439753 3.9931831 +4.151975 3.994071 +4.159975 3.9950042 +4.167975 3.995973 +4.175975 3.9969673 +4.1839747 3.9979763 +4.1919746 3.9989896 +4.1999745 3.9999967 +4.2079744 3.8670897 +4.2159743 3.733758 +4.223974 3.6004262 +4.231974 3.467095 +4.239974 3.3337631 +4.247974 3.2004313 +4.255974 3.0671 +4.2639737 2.9337683 +4.2719736 2.8004367 +4.2799735 2.6671052 +4.2879734 2.5337734 +4.2959733 2.400442 +4.303973 2.2671103 +4.311973 2.1337786 +4.319973 2.000447 +4.327973 1.8671155 +4.335973 1.7337837 +4.3439727 1.6004522 +4.3519726 1.4671206 +4.3599725 1.3337889 +4.3679724 1.2004573 +4.3759723 1.0671258 +4.383972 0.933794 +4.391972 0.8004625 +4.399972 0.66713095 +4.407972 0.5337994 +4.4159718 0.40046763 +4.4239717 0.2671361 +4.4319715 0.13380456 +4.4399714 4.7278404e-4 +4.4479713 -0.13285875 +4.4559712 -0.26619053 +4.463971 -0.39952183 +4.471971 -0.5328536 +4.479971 -0.6661854 +4.487971 -0.7995167 +4.4959707 -0.93284845 +4.5039706 -1.0130347 +4.5119705 -1.0388085 +4.5199704 -1.0637013 +4.5279703 -1.0874522 +4.53597 -1.1098169 +4.54397 -1.1305714 +4.55197 -1.1495129 +4.55997 -1.1664628 +4.56797 -1.1812674 +4.5759697 -1.1937997 +4.5839696 -1.2039601 +4.5919695 -1.211677 +4.5999694 -1.2169073 +4.6079693 -1.2196363 +4.615969 -1.2198772 +4.623969 -1.217671 +4.631969 -1.2130848 +4.639969 -1.206211 +4.647969 -1.1971657 +4.6559687 -1.1860877 +4.6639686 -1.1731353 +4.6719685 -1.1584852 +4.6799684 -1.1423297 +4.6879683 -1.1248746 +4.695968 -1.1063366 +4.703968 -1.0869405 +4.711968 -1.0669167 +4.719968 -1.0464988 +4.7279677 -1.0259204 +4.7359676 -1.0054132 +4.7439675 -0.9852034 +4.7519674 -0.9655106 +4.7599673 -0.94654465 +4.767967 -0.92850345 +4.775967 -0.91157144 +4.783967 -0.89591736 +4.791967 -0.88169277 +4.799967 -0.86903095 +4.8079667 -0.8580451 +4.8159666 -0.84882826 +4.8239665 -0.8414518 +4.8319664 -0.83596575 +4.8399663 -0.83239794 +4.847966 -0.83075464 +4.855966 -0.8310205 +4.863966 -0.83315915 +4.871966 -0.83711433 +4.879966 -0.84281033 +4.8879657 -0.85015345 +4.8959656 -0.85903347 +4.9039655 -0.8693248 +4.9119654 -0.8808886 +4.9199653 -0.893574 +4.927965 -0.90722066 +4.935965 -0.92166007 +4.943965 -0.936718 +4.951965 -0.95221645 +4.9599648 -0.9679753 +4.9679646 -0.98381513 +4.9759645 -0.9995585 +4.9839644 -1.015032 +4.9919643 -1.0300686 +4.999964 -1.0445088 +5.007964 -1.0582025 +5.015964 -1.0710107 +5.023964 -1.0828063 +5.031964 -1.0934762 +5.0399637 -1.1029212 +5.0479636 -1.111058 +5.0559635 -1.1178188 +5.0639634 -1.1231527 +5.0719633 -1.1270251 +5.079963 -1.1294185 +5.087963 -1.1303322 +5.095963 -1.129782 +5.103963 -1.1277993 +5.111963 -1.1244311 +5.1199627 -1.1197392 +5.1279626 -1.1137987 +5.1359625 -1.1066976 +5.1439624 -1.0985346 +5.1519623 -1.0894194 +5.159962 -1.0794696 +5.167962 -1.0688103 +5.175962 -1.0575726 +5.183962 -1.0458912 +5.191962 -1.0339036 +5.1999617 -1.0217485 +5.2079616 -1.0095638 +5.2159615 -0.99748534 +5.2239614 -0.98564565 +5.2319613 -0.97417194 +5.239961 -0.96318537 +5.247961 -0.9527996 +5.255961 -0.94311935 +5.263961 -0.93424004 +5.2719607 -0.92624635 +5.2799606 -0.9192115 +5.2879605 -0.91319704 +5.2959604 -0.908252 +5.3039603 -0.9044126 +5.31196 -0.9017023 +5.31996 -0.90013146 +5.32796 -0.8996976 +5.33596 -0.90038586 +5.34396 -0.90216887 +5.3519597 -0.9050078 +5.3599596 -0.90885264 +5.3679595 -0.9136431 +5.3759594 -0.9193096 +5.3839593 -0.9257737 +5.391959 -0.93294984 +5.399959 -0.9407457 +5.407959 -0.94906396 +5.415959 -0.9578031 +5.423959 -0.9668585 +5.4319587 -0.9761243 +5.4399586 -0.98549366 +5.4479585 -0.9948607 +5.4559584 -1.0041215 +5.4639583 -1.013175 +5.471958 -1.021924 +5.479958 -1.0302769 +5.487958 -1.0381477 +5.495958 -1.0454572 +5.5039577 -1.0521342 +5.5119576 -1.0581155 +5.5199575 -1.0633465 +5.5279574 -1.0677826 +5.5359573 -1.0713881 +5.543957 -1.0741376 +5.551957 -1.0760152 +5.559957 -1.0770156 +5.567957 -1.0771428 +5.575957 -1.0764107 +5.5839567 -1.0748423 +5.5919566 -1.0724697 +5.5999565 -1.0693333 +5.6079564 -1.0654812 +5.6159563 -1.0609688 +5.623956 -1.0558577 +5.631956 -1.0502151 +5.639956 -1.0441129 +5.647956 -1.0376272 +5.655956 -1.0308366 +5.6639557 -1.0238217 +5.6719556 -1.0166645 +5.6799555 -1.0094471 +5.6879554 -1.0022506 +5.6959553 -0.9951546 +5.703955 -0.98823625 +5.711955 -0.98156935 +5.719955 -0.97522354 +5.727955 -0.9692637 +5.7359548 -0.9637493 +5.7439547 -0.9587339 +5.7519546 -0.9542646 +5.7599545 -0.9503814 +5.7679543 -0.9471172 +5.7759542 -0.9444976 +5.783954 -0.9425403 +5.791954 -0.9412556 +5.799954 -0.9406461 +5.807954 -0.9407067 +5.8159537 -0.94142497 +5.8239536 -0.94278157 +5.8319535 -0.9447503 +5.8399534 -0.9472985 +5.8479533 -0.95038784 +5.855953 -0.9539745 +5.863953 -0.95801 +5.871953 -0.9624417 +5.879953 -0.96721333 +5.887953 -0.9722661 +5.8959527 -0.97753865 +5.9039526 -0.982969 +5.9119525 -0.98849374 +5.9199524 -0.99405 +5.9279523 -0.99957544 +5.935952 -1.005009 +5.943952 -1.0102924 +5.951952 -1.0153692 +5.959952 -1.0201865 +5.967952 -1.0246956 +5.9759517 -1.0288517 +5.9839516 -1.0326146 +5.9919515 -1.0359496 +5.9999514 -1.0388268 +6.0079513 -1.0412226 +6.015951 -1.0431185 +6.023951 -1.0445021 +6.031951 -1.0453672 +6.039951 -1.0457132 +6.0479507 -1.0455452 +6.0559506 -1.0448741 +6.0639505 -1.0437161 +6.0719504 -1.0420926 +6.0799503 -1.0400296 +6.08795 -1.037558 +6.09595 -1.0347121 +6.10395 -1.0315301 +6.11195 -1.0280534 +6.11995 -1.0243256 +6.1279497 -1.0203927 +6.1359496 -1.0163016 +6.1439495 -1.0121008 +6.1519494 -1.007839 +6.1599493 -1.0035642 +6.167949 -0.9993246 +6.175949 -0.9951664 +6.183949 -0.9911344 +6.191949 -0.9872713 +6.199949 -0.98361695 +6.2079487 -0.9802085 +6.2159486 -0.97707933 +6.2239485 -0.97425944 +6.2319484 -0.97177476 +6.2399483 -0.969647 +6.247948 -0.96789366 +6.255948 -0.96652764 +6.263948 -0.96555734 +6.271948 -0.9649867 +6.2799478 -0.96481496 +6.2879477 -0.9650372 +6.2959476 -0.96564406 +6.3039474 -0.96662205 +6.3119473 -0.9679538 +6.3199472 -0.96961844 +6.327947 -0.9715916 +6.335947 -0.97384596 +6.343947 -0.97635156 +6.351947 -0.97907627 +6.3599467 -0.98198587 +6.3679466 -0.98504496 +6.3759465 -0.98821676 +6.3839464 -0.9914642 +6.3919463 -0.9947497 +6.399946 -0.9980363 +6.407946 -1.0012875 +6.415946 -1.0044675 +6.423946 -1.0075425 +6.431946 -1.01048 +6.4399457 -1.0132498 +6.4479456 -1.0158241 +6.4559455 -1.0181776 +6.4639454 -1.0202881 +6.4719453 -1.0221364 +6.479945 -1.0237064 +6.487945 -1.0249858 +6.495945 -1.0259651 +6.503945 -1.0266389 +6.511945 -1.0270048 +6.5199447 -1.0270644 +6.5279446 -1.0268223 +6.5359445 -1.0262864 +6.5439444 -1.0254676 +6.5519443 -1.0243802 +6.559944 -1.023041 +6.567944 -1.021469 +6.575944 -1.019686 +6.583944 -1.0177153 +6.5919437 -1.0155822 +6.5999436 -1.0133132 +6.6079435 -1.0109358 +6.6159434 -1.0084784 +6.6239433 -1.0059696 +6.631943 -1.0034382 +6.639943 -1.0009129 +6.647943 -0.9984215 +6.655943 -0.99599105 +6.663943 -0.9936476 +6.6719427 -0.99141556 +6.6799426 -0.98931783 +6.6879425 -0.98737544 +6.6959424 -0.98560715 +6.7039423 -0.98402965 +6.711942 -0.98265713 +6.719942 -0.9815013 +6.727942 -0.9805711 +6.735942 -0.979873 +6.743942 -0.97941077 +6.7519417 -0.9791853 +6.7599416 -0.97919506 +6.7679415 -0.97943586 +6.7759414 -0.9799009 +6.7839413 -0.98058116 +6.791941 -0.98146534 +6.799941 -0.98253995 +6.807941 -0.98378986 +6.815941 -0.98519814 +6.8239408 -0.98674625 +6.8319407 -0.9884146 +6.8399405 -0.99018264 +6.8479404 -0.99202883 +6.8559403 -0.9939314 +6.8639402 -0.9958682 +6.87194 -0.99781716 +6.87994 -0.9997564 +6.88794 -1.0016644 +6.89594 -1.0035207 +6.9039397 -1.0053055 +6.9119396 -1.0070002 +6.9199395 -1.0085876 +6.9279394 -1.0100518 +6.9359393 -1.0113788 +6.943939 -1.0125563 +6.951939 -1.0135736 +6.959939 -1.0144224 +6.967939 -1.0150962 +6.975939 -1.0155905 +6.9839387 -1.0159029 +6.9919386 -1.0160332 +6.9999385 -1.015983 +7.0079384 -1.0157561 +7.0159383 -1.0153582 +7.023938 -1.0147965 +7.031938 -1.0140803 +7.039938 -1.0132201 +7.047938 -1.0122279 +7.055938 -1.0111173 +7.0639377 -1.0099025 +7.0719376 -1.0085988 +7.0799375 -1.0072224 +7.0879374 -1.0057898 +7.0959373 -1.0043178 +7.103937 -1.0028235 +7.111937 -1.0013238 +7.119937 -0.99983567 +7.127937 -0.9983753 +7.1359367 -0.99695843 +7.1439366 -0.9956001 +7.1519365 -0.9943144 +7.1599364 -0.99311423 +7.1679363 -0.99201155 +7.175936 -0.99101686 +7.183936 -0.99013937 +7.191936 -0.9893867 +7.199936 -0.9887651 +7.207936 -0.98827916 +7.2159357 -0.98793197 +7.2239356 -0.98772484 +7.2319355 -0.9876578 +7.2399354 -0.987729 +7.2479353 -0.98793536 +7.255935 -0.98827213 +7.263935 -0.98873335 +7.271935 -0.9893117 +7.279935 -0.9899987 +7.287935 -0.9907849 +7.2959347 -0.9916597 +7.3039346 -0.99261194 +7.3119345 -0.99362963 +7.3199344 -0.99470043 +7.3279343 -0.99581134 +7.335934 -0.99694943 +7.343934 -0.9981016 +7.351934 -0.99925476 +7.359934 -1.000396 +7.3679338 -1.001513 +7.3759336 -1.0025938 +7.3839335 -1.0036267 +7.3919334 -1.0046015 +7.3999333 -1.005508 +7.407933 -1.0063375 +7.415933 -1.0070822 +7.423933 -1.0077353 +7.431933 -1.0082909 +7.439933 -1.0087447 +7.4479327 -1.0090934 +7.4559326 -1.009335 +7.4639325 -1.0094688 +7.4719324 -1.0094949 +7.4799323 -1.0094151 +7.487932 -1.009232 +7.495932 -1.0089496 +7.503932 -1.0 +7.511932 -1.0 +7.519932 -1.0 +7.5279317 -1.0 +7.5359316 -1.0 +7.5439315 -1.0 +7.5519314 -1.0 +7.5599313 -1.0 +7.567931 -1.0 +7.575931 -1.0 +7.583931 -1.0 +7.591931 -1.0 +7.599931 -1.0 +7.6079307 -1.0 +7.6159306 -1.0 +7.6239305 -1.0 +7.6319304 -1.0 +7.6399302 -1.0 +7.64793 -1.0 +7.65593 -1.0 +7.66393 -1.0 +7.67193 -1.0 +7.6799297 -1.0 +7.6879296 -1.0 +7.6959295 -1.0 +7.7039294 -1.0 +7.7119293 -1.0 +7.719929 -1.0 +7.727929 -1.0 +7.735929 -1.0 +7.743929 -1.0 +7.751929 -1.0 +7.7599287 -1.0 +7.7679286 -1.0 +7.7759285 -1.0 +7.7839284 -1.0 +7.7919283 -1.0 +7.799928 -1.0 +7.807928 -1.0 +7.815928 -1.0 +7.823928 -1.0 +7.831928 -1.0 +7.8399277 -1.0 +7.8479276 -1.0 +7.8559275 -1.0 +7.8639274 -1.0 +7.8719273 -1.0 +7.879927 -1.0 +7.887927 -1.0 +7.895927 -1.0 +7.903927 -1.0 +7.9119267 -1.0 +7.9199266 -1.0 +7.9279265 -1.0 +7.9359264 -1.0 +7.9439263 -1.0 +7.951926 -1.0 +7.959926 -1.0 +7.967926 -1.0 +7.975926 -1.0 +7.983926 -1.0 +7.9919257 -1.0 +7.9999256 -1.0 +8.007926 -1.0 +8.015926 -1.0 +8.023927 -1.0 +8.031927 -1.0 +8.0399275 -1.0 +8.047928 -1.0 +8.055928 -1.0 +8.063929 -1.0 +8.071929 -1.0 +8.079929 -1.0 +8.08793 -1.0 +8.09593 -1.0 +8.10393 -1.0 +8.111931 -1.0 +8.119931 -1.0 +8.127932 -1.0 +8.135932 -1.0 +8.143932 -1.0 +8.151933 -1.0 +8.159933 -1.0 +8.167933 -1.0 +8.175934 -1.0 +8.183934 -1.0 +8.191935 -1.0 +8.199935 -1.0 +8.207935 -1.0 +8.215936 -1.0 +8.223936 -1.0 +8.231936 -1.0 +8.239937 -1.0 +8.247937 -1.0 +8.255938 -1.0 +8.263938 -1.0 +8.271938 -1.0 +8.279939 -1.0 +8.287939 -1.0 +8.295939 -1.0 +8.30394 -1.0 +8.31194 -1.0 +8.319941 -1.0 +8.327941 -1.0 +8.335941 -1.0 +8.343942 -1.0 +8.351942 -1.0 +8.359942 -1.0 +8.367943 -1.0 +8.375943 -1.0 +8.383944 -1.0 +8.391944 -1.0 +8.399944 -1.0 +8.407945 -1.0 +8.415945 -1.0 +8.423945 -1.0 +8.431946 -1.0 +8.439946 -1.0 +8.447947 -1.0 +8.455947 -1.0 +8.463947 -1.0 +8.471948 -1.0 +8.479948 -1.0 +8.487948 -1.0 +8.495949 -1.0 +8.503949 -1.0 +8.51195 -1.0 +8.51995 -1.0 +8.52795 -1.0 +8.535951 -1.0 +8.543951 -1.0 +8.551951 -1.0 +8.559952 -1.0 +8.567952 -1.0 +8.575953 -1.0 +8.583953 -1.0 +8.591953 -1.0 +8.599954 -1.0 +8.607954 -1.0 +8.615954 -1.0 +8.623955 -1.0 +8.631955 -1.0 +8.6399555 -1.0 +8.647956 -1.0 +8.655956 -1.0 +8.663957 -1.0 +8.671957 -1.0 +8.679957 -1.0 +8.687958 -1.0 +8.695958 -1.0 +8.7039585 -1.0 +8.711959 -1.0 +8.719959 -1.0 +8.72796 -1.0 +8.73596 -1.0 +8.74396 -1.0 +8.751961 -1.0 +8.759961 -1.0 +8.7679615 -1.0 +8.775962 -1.0 +8.783962 -1.0 +8.791963 -1.0 +8.799963 -1.0 +8.807963 -1.0 +8.815964 -1.0 +8.823964 -1.0 +8.8319645 -1.0 +8.839965 -1.0 +8.847965 -1.0 +8.855966 -1.0 +8.863966 -1.0 +8.871966 -1.0 +8.879967 -1.0 +8.887967 -1.0 +8.8959675 -1.0 +8.903968 -1.0 +8.911968 -1.0 +8.919969 -1.0 +8.927969 -1.0 +8.935969 -1.0 +8.94397 -1.0 +8.95197 -1.0 +8.95997 -1.0 +8.967971 -1.0 +8.975971 -1.0 +8.983972 -1.0 +8.991972 -1.0 +8.999972 -1.0 +9.007973 -1.0 +9.015973 -1.0 +9.023973 -1.0 +9.031974 -1.0 +9.039974 -1.0 +9.047975 -1.0 +9.055975 -1.0 +9.063975 -1.0 +9.071976 -1.0 +9.079976 -1.0 +9.087976 -1.0 +9.095977 -1.0 +9.103977 -1.0 +9.111978 -1.0 +9.119978 -1.0 +9.127978 -1.0 +9.135979 -1.0 +9.143979 -1.0 +9.151979 -1.0 +9.15998 -1.0 +9.16798 -1.0 +9.175981 -1.0 +9.183981 -1.0 +9.191981 -1.0 +9.199982 -1.0 +9.207982 -1.0 +9.215982 -1.0 +9.223983 -1.0 +9.231983 -1.0 +9.239984 -1.0 +9.247984 -1.0 +9.255984 -1.0 +9.263985 -1.0 +9.271985 -1.0 +9.279985 -1.0 +9.287986 -1.0 +9.295986 -1.0 +9.303987 -1.0 +9.311987 -1.0 +9.319987 -1.0 +9.327988 -1.0 +9.335988 -1.0 +9.343988 -1.0 +9.351989 -1.0 +9.359989 -1.0 +9.36799 -1.0 +9.37599 -1.0 +9.38399 -1.0 +9.391991 -1.0 +9.399991 -1.0 +9.407991 -1.0 +9.415992 -1.0 +9.423992 -1.0 +9.431993 -1.0 +9.439993 -1.0 +9.447993 -1.0 +9.455994 -1.0 +9.463994 -1.0 +9.471994 -1.0 +9.479995 -1.0 +9.487995 -1.0 +9.4959955 -1.0 +9.503996 -1.0 +9.511996 -1.0 +9.519997 -1.0 +9.527997 -1.0 +9.535997 -1.0 +9.543998 -1.0 +9.551998 -1.0 +9.5599985 -1.0 +9.567999 -1.0 +9.575999 -1.0 +9.584 -1.0 +9.592 -1.0 +9.6 -1.0 +9.608001 -1.0 +9.616001 -1.0 +9.6240015 -1.0 +9.632002 -1.0 +9.640002 -1.0 +9.648003 -1.0 +9.656003 -1.0 +9.664003 -1.0 +9.672004 -1.0 +9.680004 -1.0 +9.6880045 -1.0 +9.696005 -1.0 +9.704005 -1.0 +9.712006 -1.0 +9.720006 -1.0 +9.728006 -1.0 +9.736007 -1.0 +9.744007 -1.0 +9.7520075 -1.0 +9.760008 -1.0 +9.768008 -1.0 +9.776009 -1.0 +9.784009 -1.0 +9.792009 -1.0 +9.80001 -1.0 +9.80801 -1.0 +9.81601 -1.0 +9.824011 -1.0 +9.832011 -1.0 +9.840012 -1.0 +9.848012 -1.0 +9.856012 -1.0 +9.864013 -1.0 +9.872013 -1.0 +9.880013 -1.0 +9.888014 -1.0 +9.896014 -1.0 +9.904015 -1.0 +9.912015 -1.0 +9.920015 -1.0 +9.928016 -1.0 +9.936016 -1.0 +9.944016 -1.0 +9.952017 -1.0 +9.960017 -1.0 +9.968018 -1.0 +9.976018 -1.0 +9.984018 -1.0 +9.992019 -1.0 +10.000019 -1.0 +10.008019 -1.0 +10.01602 -1.0 +10.02402 -1.0 +10.032021 -1.0 +10.040021 -1.0 +10.048021 -1.0 +10.056022 -1.0 +10.064022 -1.0 +10.072022 -1.0 +10.080023 -1.0 +10.088023 -1.0 +10.096024 -1.0 +10.104024 -1.0 +10.112024 -1.0 +10.120025 -1.0 +10.128025 -1.0 +10.136025 -1.0 +10.144026 -1.0 +10.152026 -1.0 +10.160027 -1.0 +10.168027 -1.0 +10.176027 -1.0 +10.184028 -1.0 +10.192028 -1.0 +10.200028 -1.0 +10.208029 -1.0 +10.216029 -1.0 +10.22403 -1.0 +10.23203 -1.0 +10.24003 -1.0 +10.248031 -1.0 +10.256031 -1.0 +10.264031 -1.0 +10.272032 -1.0 +10.280032 -1.0 +10.288033 -1.0 +10.296033 -1.0 +10.304033 -1.0 +10.312034 -1.0 +10.320034 -1.0 +10.328034 -1.0 +10.336035 -1.0 +10.344035 -1.0 +10.3520355 -1.0 +10.360036 -1.0 +10.368036 -1.0 +10.376037 -1.0 +10.384037 -1.0 +10.392037 -1.0 +10.400038 -1.0 +10.408038 -1.0 +10.4160385 -1.0 +10.424039 -1.0 +10.432039 -1.0 +10.44004 -1.0 +10.44804 -1.0 +10.45604 -1.0 +10.464041 -1.0 +10.472041 -1.0 +10.4800415 -1.0 +10.488042 -1.0 +10.496042 -1.0 +10.504043 -1.0 +10.512043 -1.0 +10.520043 -1.0 +10.528044 -1.0 +10.536044 -1.0 +10.5440445 -1.0 +10.552045 -1.0 +10.560045 -1.0 +10.568046 -1.0 +10.576046 -1.0 +10.584046 -1.0 +10.592047 -1.0 +10.600047 -1.0 +10.6080475 -1.0 +10.616048 -1.0 +10.624048 -1.0 +10.632049 -1.0 +10.640049 -1.0 +10.648049 -1.0 +10.65605 -1.0 +10.66405 -1.0 +10.67205 -1.0 +10.680051 -1.0 +10.688051 -1.0 +10.696052 -1.0 +10.704052 -1.0 +10.712052 -1.0 +10.720053 -1.0 +10.728053 -1.0 +10.736053 -1.0 +10.744054 -1.0 +10.752054 -1.0 +10.760055 -1.0 +10.768055 -1.0 +10.776055 -1.0 +10.784056 -1.0 +10.792056 -1.0 +10.800056 -1.0 +10.808057 -1.0 +10.816057 -1.0 +10.824058 -1.0 +10.832058 -1.0 +10.840058 -1.0 +10.848059 -1.0 +10.856059 -1.0 +10.864059 -1.0 +10.87206 -1.0 +10.88006 -1.0 +10.888061 -1.0 +10.896061 -1.0 +10.904061 -1.0 +10.912062 -1.0 +10.920062 -1.0 +10.928062 -1.0 +10.936063 -1.0 +10.944063 -1.0 +10.952064 -1.0 +10.960064 -1.0 +10.968064 -1.0 +10.976065 -1.0 +10.984065 -1.0 +10.992065 -1.0 +11.000066 -0.9983549 +11.008066 -0.79834557 +11.016067 -0.5983362 +11.024067 -0.39832687 +11.032067 -0.19831753 +11.040068 1.6918182e-3 +11.048068 0.20170116 +11.056068 0.4017105 +11.064069 0.60171986 +11.072069 0.8017292 +11.08007 1.0017385 +11.08807 1.2017479 +11.09607 1.4017572 +11.104071 1.6017666 +11.112071 1.8017759 +11.120071 2.0017853 +11.128072 2.2017946 +11.136072 2.401804 +11.144073 2.6018133 +11.152073 2.8018227 +11.160073 3.001832 +11.168074 3.2018414 +11.176074 3.4018507 +11.184074 3.60186 +11.192075 3.8018694 +11.200075 4.000189 +11.208076 4.020098 +11.216076 4.039489 +11.224076 4.0581737 +11.232077 4.0759754 +11.240077 4.0927286 +11.248077 4.1082807 +11.256078 4.1224947 +11.264078 4.1352477 +11.2720785 4.146435 +11.280079 4.155968 +11.288079 4.163778 +11.29608 4.169812 +11.30408 4.1740384 +11.31208 4.176443 +11.320081 4.177031 +11.328081 4.1758246 +11.3360815 4.1728644 +11.344082 4.1682086 +11.352082 4.161931 +11.360083 4.1541204 +11.368083 4.14488 +11.376083 4.1343255 +11.384084 4.1225843 +11.392084 4.1097937 +11.4000845 4.096099 +11.408085 4.0816526 +11.416085 4.0666127 +11.424086 4.05114 +11.432086 4.035397 +11.440086 4.019547 +11.448087 4.0037518 +11.456087 3.9881692 +11.4640875 3.9729538 +11.472088 3.958252 +11.480088 3.9442048 +11.488089 3.930943 +11.496089 3.9185877 +11.504089 3.9072495 +11.51209 3.8970265 +11.52009 3.8880038 +11.5280905 3.8802538 +11.536091 3.8738337 +11.544091 3.8687878 +11.552092 3.8651443 +11.560092 3.8629189 +11.568092 3.8621106 +11.576093 3.8627052 +11.584093 3.8646746 +11.592093 3.8679771 +11.600094 3.8725586 +11.608094 3.8783517 +11.616095 3.8852797 +11.624095 3.8932538 +11.632095 3.9021783 +11.640096 3.9119468 +11.648096 3.9224482 +11.656096 3.9335647 +11.664097 3.9451742 +11.672097 3.9571528 +11.680098 3.9693727 +11.688098 3.981708 +11.696098 3.9940314 +11.704099 4.0062194 +11.712099 4.0181518 +11.720099 4.0297112 +11.7281 4.0407877 +11.7361 4.051277 +11.744101 4.0610833 +11.752101 4.070118 +11.760101 4.078302 +11.768102 4.085567 +11.776102 4.0918536 +11.784102 4.0971146 +11.792103 4.101313 +11.800103 4.1044235 +11.808104 4.1064315 +11.816104 4.1073346 +11.824104 4.1071415 +11.832105 4.105871 +11.840105 4.1035533 +11.848105 4.100229 +11.856106 4.0959463 +11.864106 4.090764 +11.872107 4.0847497 +11.880107 4.0779757 +11.888107 4.0705237 +11.896108 4.0624785 +11.904108 4.053931 +11.912108 4.044976 +11.920109 4.0357094 +11.928109 4.02623 +11.93611 4.0166364 +11.94411 4.0070276 +11.95211 3.9975004 +11.960111 3.9881496 +11.968111 3.9790664 +11.976111 3.9703388 +11.984112 3.9620485 +11.992112 3.9542727 +12.000113 3.9470816 +12.008113 3.9405375 +12.016113 3.9346972 +12.024114 3.9296079 +12.032114 3.9253092 +12.040114 3.9218316 +12.048115 3.919197 +12.056115 3.9174194 +12.064116 3.9165025 +12.072116 3.916442 +12.080116 3.9172244 +12.088117 3.9188294 +12.096117 3.921227 +12.104117 3.9243808 +12.112118 3.928247 +12.120118 3.932775 +12.1281185 3.9379091 +12.136119 3.9435878 +12.144119 3.9497452 +12.15212 3.9563112 +12.16012 3.9632134 +12.16812 3.9703774 +12.176121 3.977726 +12.184121 3.9851823 +12.1921215 3.99267 +12.200122 4.0001125 +12.208122 4.007436 +12.216123 4.0145683 +12.224123 4.02144 +12.232123 4.027987 +12.240124 4.0341477 +12.248124 4.0398664 +12.2561245 4.045092 +12.264125 4.049781 +12.272125 4.0538926 +12.280126 4.057396 +12.288126 4.0602655 +12.296126 4.0624814 +12.304127 4.064032 +12.312127 4.0649133 +12.3201275 4.0651255 +12.328128 4.0646777 +12.336128 4.0635853 +12.344129 4.0618687 +12.352129 4.059556 +12.360129 4.0566792 +12.36813 4.053277 +12.37613 4.0493917 +12.3841305 4.0450697 +12.392131 4.0403624 +12.400131 4.0353227 +12.408132 4.0300064 +12.416132 4.0244727 +12.424132 4.0187798 +12.432133 4.0129876 +12.440133 4.007157 +12.448133 4.0013466 +12.456134 3.9956145 +12.464134 3.990018 +12.472135 3.984611 +12.480135 3.9794445 +12.488135 3.974568 +12.496136 3.9700246 +12.504136 3.9658556 +12.512136 3.9620976 +12.520137 3.9587808 +12.528137 3.9559326 +12.536138 3.9535737 +12.544138 3.9517202 +12.552138 3.9503832 +12.560139 3.9495673 +12.568139 3.949273 +12.576139 3.9494948 +12.58414 3.9502225 +12.59214 3.9514399 +12.600141 3.9531279 +12.608141 3.9552617 +12.616141 3.9578128 +12.624142 3.9607487 +12.632142 3.9640336 +12.640142 3.967629 +12.648143 3.9714937 +12.656143 3.975584 +12.664144 3.979856 +12.672144 3.9842634 +12.680144 3.9887595 +12.688145 3.993297 +12.696145 3.9978309 +12.704145 4.002314 +12.712146 4.006703 +12.720146 4.0109544 +12.728147 4.015028 +12.736147 4.0188856 +12.744147 4.0224915 +12.752148 4.0258136 +12.760148 4.0288224 +12.768148 4.0314927 +12.776149 4.0338035 +12.784149 4.0357366 +12.79215 4.0372787 +12.80015 4.0384207 +12.80815 4.039157 +12.816151 4.039487 +12.824151 4.0394135 +12.832151 4.038944 +12.840152 4.0380893 +12.848152 4.036864 +12.856153 4.0352864 +12.864153 4.033378 +12.872153 4.0311637 +12.880154 4.0286703 +12.888154 4.0259275 +12.896154 4.022967 +12.904155 4.019821 +12.912155 4.016526 +12.920156 4.0131164 +12.928156 4.009629 +12.936156 4.0060997 +12.944157 4.002565 +12.952157 3.9990602 +12.960157 3.9956207 +12.968158 3.99228 +12.976158 3.98907 +12.9841585 3.986021 +12.992159 3.983162 +13.000159 3.9805174 +13.00816 3.9781117 +13.01616 3.9759645 +13.02416 3.974094 +13.032161 3.9725142 +13.040161 3.9712367 +13.0481615 3.9702697 +13.056162 3.9696174 +13.064162 3.9692817 +13.072163 3.9692612 +13.080163 3.969551 +13.088163 3.9701433 +13.096164 3.971027 +13.104164 3.972189 +13.1121645 3.9736128 +13.120165 3.9752798 +13.128165 3.97717 +13.136166 3.97926 +13.144166 3.981526 +13.152166 3.9839425 +13.160167 3.9864821 +13.168167 3.989118 +13.1761675 3.9918218 +13.184168 3.994565 +13.192168 3.9973197 +13.200169 4.000057 +13.208169 4.002751 +13.216169 4.0053744 +13.22417 4.0079017 +13.23217 4.0103097 +13.2401705 4.012575 +13.248171 4.0146775 +13.256171 4.016599 +13.264172 4.018323 +13.272172 4.019834 +13.280172 4.0211215 +13.288173 4.022176 +13.296173 4.0229897 +13.304173 4.0235586 +13.312174 4.0238814 +13.320174 4.023958 +13.328175 4.023792 +13.336175 4.023389 +13.344175 4.022756 +13.352176 4.021904 +13.360176 4.0208445 +13.368176 4.019592 +13.376177 4.0181613 +13.384177 4.0165706 +13.392178 4.0148377 +13.400178 4.0129833 +13.408178 4.0110273 +13.416179 4.008991 +13.424179 4.0068965 +13.432179 4.0047655 +13.44018 4.00262 +13.44818 4.000483 +13.456181 3.9983745 +13.464181 3.996316 +13.472181 3.994327 +13.480182 3.9924273 +13.488182 3.990634 +13.496182 3.9889631 +13.504183 3.9874306 +13.512183 3.9860487 +13.520184 3.98483 +13.528184 3.9837828 +13.536184 3.9829164 +13.544185 3.9822354 +13.552185 3.9817448 +13.560185 3.9814458 +13.568186 3.9813385 +13.576186 3.981421 +13.584187 3.98169 +13.592187 3.982139 +13.600187 3.982761 +13.608188 3.9835467 +13.616188 3.984486 +13.624188 3.985567 +13.632189 3.9867759 +13.640189 3.9880996 +13.64819 3.9895215 +13.65619 3.9910269 +13.66419 3.992599 +13.672191 3.9942203 +13.680191 3.9958744 +13.688191 3.9975438 +13.696192 3.9992118 +13.704192 4.0008607 +13.712193 4.0024753 +13.720193 4.004039 +13.728193 4.005537 +13.736194 4.0069556 +13.744194 4.0082817 +13.752194 4.009503 +13.760195 4.010609 +13.768195 4.011591 +13.776196 4.01244 +13.784196 4.0131507 +13.792196 4.013717 +13.800197 4.0141363 +13.808197 4.014406 +13.816197 4.014527 +13.824198 4.0144987 +13.832198 4.014325 +13.8401985 4.01401 +13.848199 4.0135584 +13.856199 4.0129776 +13.8642 4.0122747 +13.8722 4.0114594 +13.8802 4.0105414 +13.888201 4.009532 +13.896201 4.0084424 +13.9042015 4.007285 +13.912202 4.0060725 +13.920202 4.004818 +13.928203 4.003535 +13.936203 4.0022364 +13.944203 4.000936 +13.952204 3.9996467 +13.960204 3.9983816 +13.9682045 3.9971528 +13.976205 3.9959722 +13.984205 3.994851 +13.992206 3.9937997 +14.000206 3.9928274 +14.008206 3.991943 +14.016207 3.9911537 +14.024207 3.990466 +14.0322075 3.9898853 +14.040208 3.9894161 +14.048208 3.9890609 +14.056209 3.988822 +14.064209 3.988699 +14.072209 3.9886923 +14.08021 3.9887996 +14.08821 3.989018 +14.0962105 3.9893436 +14.104211 3.9897718 +14.112211 3.990296 +14.120212 3.9909096 +14.128212 3.9916053 +14.136212 3.992375 +14.144213 3.993209 +14.152213 3.9940982 +14.160213 3.9950328 +14.168214 3.9960027 +14.176214 3.9969974 +14.184215 3.9980063 +14.192215 3.9990196 +14.200215 3.996408 +14.208216 3.863068 +14.216216 3.7297287 +14.224216 3.5963893 +14.232217 3.4630494 +14.240217 3.32971 +14.248218 3.1963706 +14.256218 3.0630307 +14.264218 2.9296913 +14.272219 2.796352 +14.280219 2.6630123 +14.288219 2.5296726 +14.29622 2.3963332 +14.30422 2.2629936 +14.312221 2.129654 +14.320221 1.9963145 +14.328221 1.8629749 +14.336222 1.7296352 +14.344222 1.5962958 +14.352222 1.4629562 +14.360223 1.3296165 +14.368223 1.1962771 +14.376224 1.0629375 +14.384224 0.92959785 +14.392224 0.79625845 +14.400225 0.6629188 +14.408225 0.5295794 +14.416225 0.39623976 +14.424226 0.2629001 +14.432226 0.12956071 +14.440227 -3.7789345e-3 +14.448227 -0.13711834 +14.456227 -0.27045822 +14.464228 -0.40379763 +14.472228 -0.53713703 +14.480228 -0.6704769 +14.488229 -0.8038163 +14.496229 -0.9371557 +14.50423 -1.0138799 +14.51223 -1.0396309 +14.52023 -1.0644922 +14.528231 -1.0882031 +14.536231 -1.1105201 +14.544231 -1.1312197 +14.552232 -1.1501 +14.560232 -1.1669829 +14.568233 -1.1817157 +14.576233 -1.1941723 +14.584233 -1.2042537 +14.592234 -1.2118895 +14.600234 -1.2170376 +14.608234 -1.219684 +14.616235 -1.219843 +14.624235 -1.2175564 +14.632236 -1.212892 +14.640236 -1.2059433 +14.648236 -1.1968274 +14.656237 -1.1856833 +14.664237 -1.1726702 +14.672237 -1.1579654 +14.680238 -1.1417618 +14.688238 -1.1242657 +14.6962385 -1.1056938 +14.704239 -1.0862715 +14.712239 -1.0662293 +14.72024 -1.045801 +14.72824 -1.02522 +14.73624 -1.004718 +14.744241 -0.98452103 +14.752241 -0.9648486 +14.7602415 -0.9459099 +14.768242 -0.92790276 +14.776242 -0.9110109 +14.784243 -0.89540267 +14.792243 -0.88122904 +14.800243 -0.86862254 +14.808244 -0.85769594 +14.816244 -0.8485412 +14.8242445 -0.8412293 +14.832245 -0.83580923 +14.840245 -0.8323083 +14.848246 -0.83073187 +14.856246 -0.8310639 +14.864246 -0.83326745 +14.872247 -0.83728534 +14.880247 -0.84304124 +14.8882475 -0.85044086 +14.896248 -0.8593734 +14.904248 -0.8697127 +14.912249 -0.88131946 +14.920249 -0.8940425 +14.928249 -0.90772104 +14.93625 -0.9221863 +14.94425 -0.93726397 +14.9522505 -0.9527756 +14.960251 -0.9685415 +14.968251 -0.98438185 +14.976252 -1.0001194 +14.984252 -1.015581 +14.992252 -1.0305998 +15.000253 -1.0450164 +15.008253 -1.0586814 +15.016253 -1.0714558 +15.024254 -1.0832133 +15.032254 -1.0938411 +15.040255 -1.1032405 +15.048255 -1.1113287 +15.056255 -1.1180388 +15.064256 -1.12332 +15.072256 -1.1271389 +15.080256 -1.1294781 +15.088257 -1.1303378 +15.096257 -1.1297342 +15.104258 -1.1276994 +15.112258 -1.1242812 +15.120258 -1.1195414 +15.128259 -1.113556 +15.136259 -1.1064131 +15.144259 -1.0982125 +15.15226 -1.0890635 +15.16026 -1.0790844 +15.168261 -1.0684005 +15.176261 -1.0571431 +15.184261 -1.0454471 +15.192262 -1.03345 +15.200262 -1.0212905 +15.208262 -1.0091068 +15.216263 -0.99703425 +15.224263 -0.98520535 +15.232264 -0.97374713 +15.240264 -0.96278065 +15.248264 -0.9524191 +15.256265 -0.9427671 +15.264265 -0.93391937 +15.272265 -0.92596036 +15.280266 -0.918963 +15.288266 -0.9129882 +15.296267 -0.9080845 +15.304267 -0.9042878 +15.312267 -0.9016209 +15.320268 -0.9000938 +15.328268 -0.8997035 +15.336268 -0.9004345 +15.344269 -0.9022592 +15.352269 -0.90513813 +15.36027 -0.909021 +15.36827 -0.91384715 +15.37627 -0.9195464 +15.384271 -0.9260403 +15.392271 -0.93324274 +15.400271 -0.9410613 +15.408272 -0.94939846 +15.416272 -0.9581524 +15.424273 -0.96721876 +15.432273 -0.9764911 +15.440273 -0.9858629 +15.448274 -0.9952283 +15.456274 -1.0044833 +15.464274 -1.0135272 +15.472275 -1.0222628 +15.480275 -1.0305986 +15.488276 -1.0384489 +15.496276 -1.0457352 +15.504276 -1.052386 +15.512277 -1.0583386 +15.520277 -1.0635391 +15.528277 -1.067943 +15.536278 -1.0715148 +15.544278 -1.0742297 +15.5522785 -1.0760725 +15.560279 -1.0770376 +15.568279 -1.0771298 +15.57628 -1.0763634 +15.58428 -1.0747617 +15.59228 -1.0723573 +15.600281 -1.0691907 +15.608281 -1.0653105 +15.6162815 -1.0607723 +15.624282 -1.0556378 +15.632282 -1.0499748 +15.640283 -1.0438552 +15.648283 -1.037355 +15.656283 -1.0305531 +15.664284 -1.0235304 +15.672284 -1.0163687 +15.6802845 -1.0091501 +15.688285 -1.0019557 +15.696285 -0.9948652 +15.704286 -0.9879554 +15.712286 -0.98130006 +15.720286 -0.9749685 +15.728287 -0.9690257 +15.736287 -0.96353066 +15.7442875 -0.95853686 +15.752288 -0.9540909 +15.760288 -0.9502326 +15.768289 -0.94699466 +15.776289 -0.9444023 +15.784289 -0.94247293 +15.79229 -0.94121647 +15.80029 -0.9406352 +15.8082905 -0.9407237 +15.816291 -0.94146943 +15.824291 -0.9428525 +15.832292 -0.9448465 +15.840292 -0.9474186 +15.848292 -0.9505301 +15.856293 -0.954137 +15.864293 -0.9581907 +15.872293 -0.9626382 +15.880294 -0.9674233 +15.888294 -0.972487 +15.896295 -0.97776794 +15.904295 -0.98320395 +15.912295 -0.9887317 +15.920296 -0.9942882 +15.928296 -0.99981123 +15.936296 -1.00524 +15.944297 -1.0105158 +15.952297 -1.0155828 +15.960298 -1.0203881 +15.968298 -1.0248832 +15.976298 -1.0290232 +15.984299 -1.0327685 +15.992299 -1.0360843 +16.0003 -1.0389413 +16.008299 -1.0413154 +16.016298 -1.0431892 +16.024298 -1.0445504 +16.032297 -1.045393 +16.040297 -1.0457165 +16.048296 -1.0455265 +16.056295 -1.0448341 +16.064295 -1.0436556 +16.072294 -1.0420127 +16.080294 -1.0399318 +16.088293 -1.0374434 +16.096292 -1.0345825 +16.104292 -1.0313873 +16.112291 -1.0278991 +16.12029 -1.0241619 +16.12829 -1.0202215 +16.13629 -1.016125 +16.144289 -1.0119209 +16.152288 -1.0076578 +16.160288 -1.0033838 +16.168287 -0.99914694 +16.176287 -0.9949933 +16.184286 -0.9909679 +16.192286 -0.987113 +16.200285 -0.9834686 +16.208284 -0.9800713 +16.216284 -0.97695476 +16.224283 -0.9741486 +16.232283 -0.97167856 +16.240282 -0.9695663 +16.248281 -0.9678289 +16.25628 -0.9664793 +16.26428 -0.9655256 +16.27228 -0.9649716 +16.28028 -0.9648164 +16.288279 -0.96505475 +16.296278 -0.9656772 +16.304277 -0.9666701 +16.312277 -0.96801597 +16.320276 -0.96969366 +16.328276 -0.97167885 +16.336275 -0.97394395 +16.344275 -0.9764591 +16.352274 -0.97919184 +16.360273 -0.9821081 +16.368273 -0.9851723 +16.376272 -0.98834777 +16.384272 -0.99159724 +16.392271 -0.9948834 +16.40027 -0.99816906 +16.40827 -1.0014178 +16.41627 -1.0045941 +16.424269 -1.0076638 +16.432268 -1.010595 +16.440268 -1.0133573 +16.448267 -1.015923 +16.456266 -1.0182672 +16.464266 -1.0203674 +16.472265 -1.0222046 +16.480265 -1.0237632 +16.488264 -1.0250306 +16.496264 -1.0259978 +16.504263 -1.0266593 +16.512262 -1.0270131 +16.520262 -1.0270605 +16.528261 -1.0268066 +16.53626 -1.0262592 +16.54426 -1.0254297 +16.55226 -1.0243322 +16.560259 -1.0229834 +16.568258 -1.0214028 +16.576258 -1.0196121 +16.584257 -1.0176346 +16.592257 -1.0154958 +16.600256 -1.0132222 +16.608255 -1.0108413 +16.616255 -1.0083815 +16.624254 -1.0058714 +16.632254 -1.00334 +16.640253 -1.0008156 +16.648252 -0.9983261 +16.656252 -0.9958988 +16.664251 -0.99355924 +16.67225 -0.9913321 +16.68025 -0.98924017 +16.68825 -0.9873042 +16.696249 -0.9855431 +16.704248 -0.9839733 +16.712248 -0.9826089 +16.720247 -0.9814616 +16.728247 -0.9805402 +16.736246 -0.9798511 +16.744246 -0.97939783 +16.752245 -0.9791814 +16.760244 -0.9792 +16.768244 -0.9794494 +16.776243 -0.9799227 +16.784243 -0.98061085 +16.792242 -0.98150235 +16.800241 -0.9825838 +16.80824 -0.9838399 +16.81624 -0.9852537 +16.82424 -0.9868066 +16.83224 -0.9884789 +16.840239 -0.9902501 +16.848238 -0.99209875 +16.856237 -0.9940029 +16.864237 -0.99594045 +16.872236 -0.9978893 +16.880236 -0.99982756 +16.888235 -1.001734 +16.896235 -1.0035878 +16.904234 -1.0053695 +16.912233 -1.0070605 +16.920233 -1.0086435 +16.928232 -1.0101029 +16.936232 -1.0114245 +16.944231 -1.0125962 +16.95223 -1.0136076 +16.96023 -1.0144501 +16.96823 -1.0151173 +16.976229 -1.015605 +16.984228 -1.0159107 +16.992228 -1.0160345 +17.000227 -1.0159779 +17.008226 -1.0157448 +17.016226 -1.0153408 +17.024225 -1.0147735 +17.032225 -1.0140519 +17.040224 -1.0131868 +17.048223 -1.0121902 +17.056223 -1.0110757 +17.064222 -1.0098575 +17.072222 -1.0085511 +17.080221 -1.0071725 +17.08822 -1.0057381 +17.09622 -1.0042652 +17.10422 -1.0027704 +17.112219 -1.0012711 +17.120218 -0.99978375 +17.128218 -0.9983247 +17.136217 -0.99690974 +17.144217 -0.99555385 +17.152216 -0.994271 +17.160215 -0.99307406 +17.168215 -0.99197507 +17.176214 -0.9909844 +17.184214 -0.9901111 +17.192213 -0.98936296 +17.200212 -0.988746 +17.208212 -0.98826486 +17.216211 -0.9879225 +17.22421 -0.98772025 +17.23221 -0.98765796 +17.24021 -0.9877339 +17.248209 -0.9879447 +17.256208 -0.9882859 +17.264208 -0.9887512 +17.272207 -0.98933333 +17.280207 -0.99002385 +17.288206 -0.99081314 +17.296206 -0.99169075 +17.304205 -0.9926453 +17.312204 -0.993665 +17.320204 -0.99473727 +17.328203 -0.99584925 +17.336203 -0.99698794 +17.344202 -0.9981403 +17.352201 -0.99929315 +17.3602 -1.0004338 +17.3682 -1.0015496 +17.3762 -1.0026289 +17.3842 -1.0036601 +17.392199 -1.0046326 +17.400198 -1.0055367 +17.408197 -1.0063635 +17.416197 -1.0071052 +17.424196 -1.007755 +17.432196 -1.0083075 +17.440195 -1.0087578 +17.448195 -1.0091031 +17.456194 -1.0093411 +17.464193 -1.0094713 +17.472193 -1.009494 +17.480192 -1.0094107 +17.488192 -1.0092244 +17.496191 -1.0089389 +17.50419 -1.0 +17.51219 -1.0 +17.52019 -1.0 +17.528189 -1.0 +17.536188 -1.0 +17.544188 -1.0 +17.552187 -1.0 +17.560186 -1.0 +17.568186 -1.0 +17.576185 -1.0 +17.584185 -1.0 +17.592184 -1.0 +17.600183 -1.0 +17.608183 -1.0 +17.616182 -1.0 +17.624182 -1.0 +17.632181 -1.0 +17.64018 -1.0 +17.64818 -1.0 +17.65618 -1.0 +17.664179 -1.0 +17.672178 -1.0 +17.680178 -1.0 +17.688177 -1.0 +17.696177 -1.0 +17.704176 -1.0 +17.712175 -1.0 +17.720175 -1.0 +17.728174 -1.0 +17.736174 -1.0 +17.744173 -1.0 +17.752172 -1.0 +17.760172 -1.0 +17.768171 -1.0 +17.77617 -1.0 +17.78417 -1.0 +17.79217 -1.0 +17.800169 -1.0 +17.808168 -1.0 +17.816168 -1.0 +17.824167 -1.0 +17.832167 -1.0 +17.840166 -1.0 +17.848166 -1.0 +17.856165 -1.0 +17.864164 -1.0 +17.872164 -1.0 +17.880163 -1.0 +17.888163 -1.0 +17.896162 -1.0 +17.904161 -1.0 +17.91216 -1.0 +17.92016 -1.0 +17.92816 -1.0 +17.93616 -1.0 +17.944159 -1.0 +17.952158 -1.0 +17.960157 -1.0 +17.968157 -1.0 +17.976156 -1.0 +17.984156 -1.0 +17.992155 -1.0 +18.000154 -1.0 +18.008154 -1.0 +18.016153 -1.0 +18.024153 -1.0 +18.032152 -1.0 +18.040152 -1.0 +18.048151 -1.0 +18.05615 -1.0 +18.06415 -1.0 +18.07215 -1.0 +18.080149 -1.0 +18.088148 -1.0 +18.096148 -1.0 +18.104147 -1.0 +18.112146 -1.0 +18.120146 -1.0 +18.128145 -1.0 +18.136145 -1.0 +18.144144 -1.0 +18.152143 -1.0 +18.160143 -1.0 +18.168142 -1.0 +18.176142 -1.0 +18.184141 -1.0 +18.19214 -1.0 +18.20014 -1.0 +18.20814 -1.0 +18.216139 -1.0 +18.224138 -1.0 +18.232138 -1.0 +18.240137 -1.0 +18.248137 -1.0 +18.256136 -1.0 +18.264135 -1.0 +18.272135 -1.0 +18.280134 -1.0 +18.288134 -1.0 +18.296133 -1.0 +18.304132 -1.0 +18.312132 -1.0 +18.320131 -1.0 +18.32813 -1.0 +18.33613 -1.0 +18.34413 -1.0 +18.352129 -1.0 +18.360128 -1.0 +18.368128 -1.0 +18.376127 -1.0 +18.384127 -1.0 +18.392126 -1.0 +18.400126 -1.0 +18.408125 -1.0 +18.416124 -1.0 +18.424124 -1.0 +18.432123 -1.0 +18.440123 -1.0 +18.448122 -1.0 +18.456121 -1.0 +18.46412 -1.0 +18.47212 -1.0 +18.48012 -1.0 +18.48812 -1.0 +18.496119 -1.0 +18.504118 -1.0 +18.512117 -1.0 +18.520117 -1.0 +18.528116 -1.0 +18.536116 -1.0 +18.544115 -1.0 +18.552114 -1.0 +18.560114 -1.0 +18.568113 -1.0 +18.576113 -1.0 +18.584112 -1.0 +18.592112 -1.0 +18.600111 -1.0 +18.60811 -1.0 +18.61611 -1.0 +18.62411 -1.0 +18.632109 -1.0 +18.640108 -1.0 +18.648108 -1.0 +18.656107 -1.0 +18.664106 -1.0 +18.672106 -1.0 +18.680105 -1.0 +18.688105 -1.0 +18.696104 -1.0 +18.704103 -1.0 +18.712103 -1.0 +18.720102 -1.0 +18.728102 -1.0 +18.736101 -1.0 +18.7441 -1.0 +18.7521 -1.0 +18.7601 -1.0 +18.768099 -1.0 +18.776098 -1.0 +18.784098 -1.0 +18.792097 -1.0 +18.800097 -1.0 +18.808096 -1.0 +18.816095 -1.0 +18.824095 -1.0 +18.832094 -1.0 +18.840094 -1.0 +18.848093 -1.0 +18.856092 -1.0 +18.864092 -1.0 +18.872091 -1.0 +18.88009 -1.0 +18.88809 -1.0 +18.89609 -1.0 +18.904089 -1.0 +18.912088 -1.0 +18.920088 -1.0 +18.928087 -1.0 +18.936087 -1.0 +18.944086 -1.0 +18.952085 -1.0 +18.960085 -1.0 +18.968084 -1.0 +18.976084 -1.0 +18.984083 -1.0 +18.992083 -1.0 +19.000082 -1.0 +19.008081 -1.0 +19.01608 -1.0 +19.02408 -1.0 +19.03208 -1.0 +19.04008 -1.0 +19.048079 -1.0 +19.056078 -1.0 +19.064077 -1.0 +19.072077 -1.0 +19.080076 -1.0 +19.088076 -1.0 +19.096075 -1.0 +19.104074 -1.0 +19.112074 -1.0 +19.120073 -1.0 +19.128073 -1.0 +19.136072 -1.0 +19.144072 -1.0 +19.152071 -1.0 +19.16007 -1.0 +19.16807 -1.0 +19.17607 -1.0 +19.184069 -1.0 +19.192068 -1.0 +19.200068 -1.0 +19.208067 -1.0 +19.216066 -1.0 +19.224066 -1.0 +19.232065 -1.0 +19.240065 -1.0 +19.248064 -1.0 +19.256063 -1.0 +19.264063 -1.0 +19.272062 -1.0 +19.280062 -1.0 +19.288061 -1.0 +19.29606 -1.0 +19.30406 -1.0 +19.31206 -1.0 +19.320059 -1.0 +19.328058 -1.0 +19.336058 -1.0 +19.344057 -1.0 +19.352057 -1.0 +19.360056 -1.0 +19.368055 -1.0 +19.376055 -1.0 +19.384054 -1.0 +19.392054 -1.0 +19.400053 -1.0 +19.408052 -1.0 +19.416052 -1.0 +19.424051 -1.0 +19.43205 -1.0 +19.44005 -1.0 +19.44805 -1.0 +19.456049 -1.0 +19.464048 -1.0 +19.472048 -1.0 +19.480047 -1.0 +19.488047 -1.0 +19.496046 -1.0 +19.504045 -1.0 +19.512045 -1.0 +19.520044 -1.0 +19.528044 -1.0 +19.536043 -1.0 +19.544043 -1.0 +19.552042 -1.0 +19.560041 -1.0 +19.56804 -1.0 +19.57604 -1.0 +19.58404 -1.0 +19.59204 -1.0 +19.600039 -1.0 +19.608038 -1.0 +19.616037 -1.0 +19.624037 -1.0 +19.632036 -1.0 +19.640036 -1.0 +19.648035 -1.0 +19.656034 -1.0 +19.664034 -1.0 +19.672033 -1.0 +19.680033 -1.0 +19.688032 -1.0 +19.696032 -1.0 +19.704031 -1.0 +19.71203 -1.0 +19.72003 -1.0 +19.72803 -1.0 +19.736029 -1.0 +19.744028 -1.0 +19.752028 -1.0 +19.760027 -1.0 +19.768026 -1.0 +19.776026 -1.0 +19.784025 -1.0 +19.792025 -1.0 +19.800024 -1.0 +19.808023 -1.0 +19.816023 -1.0 +19.824022 -1.0 +19.832022 -1.0 +19.840021 -1.0 +19.84802 -1.0 +19.85602 -1.0 +19.86402 -1.0 +19.872019 -1.0 +19.880018 -1.0 +19.888018 -1.0 +19.896017 -1.0 +19.904016 -1.0 +19.912016 -1.0 +19.920015 -1.0 +19.928015 -1.0 +19.936014 -1.0 +19.944014 -1.0 +19.952013 -1.0 +19.960012 -1.0 +19.968012 -1.0 +19.976011 -1.0 +19.98401 -1.0 +19.99201 -1.0 diff --git a/testsuite/tests/programs/barton-mangler-bug/sine.gnp b/testsuite/tests/programs/barton-mangler-bug/sine.gnp new file mode 100644 index 0000000000..0e5d95582f --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/sine.gnp @@ -0,0 +1,4 @@ +set terminal latex +set output "sine.tex" +set nokey +plot [0.0:1.0] "sine.plt" with lines diff --git a/testsuite/tests/programs/barton-mangler-bug/sine.plt b/testsuite/tests/programs/barton-mangler-bug/sine.plt new file mode 100644 index 0000000000..6168d0e964 --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/sine.plt @@ -0,0 +1,2500 @@ +0.0 0.0 +4.0e-4 5.0260194e-2 +8.0e-4 0.10048864 +1.1999999e-3 0.1506536 +1.6e-3 0.20072344 +1.9999999e-3 0.25066644 +2.3999999e-3 0.30045116 +2.8e-3 0.35004613 +3.2e-3 0.39941996 +3.6e-3 0.44854155 +3.9999997e-3 0.49737975 +4.3999995e-3 0.54590386 +4.7999993e-3 0.5940831 +5.199999e-3 0.6418871 +5.599999e-3 0.68928576 +5.9999987e-3 0.736249 +6.3999984e-3 0.7827472 +6.799998e-3 0.82875097 +7.199998e-3 0.87423134 +7.599998e-3 0.9191595 +7.999998e-3 0.96350706 +8.399998e-3 1.0072463 +8.799998e-3 1.0503491 +9.199998e-3 1.0927886 +9.599999e-3 1.1345378 +9.999999e-3 1.1755705 +1.0399999e-2 1.2158606 +1.0799999e-2 1.2553827 +1.12e-2 1.294112 +1.16e-2 1.3320237 +1.2e-2 1.3690943 +1.24e-2 1.4053 +1.2800001e-2 1.4406182 +1.3200001e-2 1.4750264 +1.3600001e-2 1.5085028 +1.4000001e-2 1.5410266 +1.4400002e-2 1.572577 +1.4800002e-2 1.6031342 +1.5200002e-2 1.6326787 +1.5600002e-2 1.661192 +1.6000003e-2 1.6886561 +1.6400002e-2 1.7150536 +1.6800001e-2 1.7403677 +1.72e-2 1.7645825 +1.76e-2 1.7876829 +1.8e-2 1.8096541 +1.8399999e-2 1.8304824 +1.8799998e-2 1.8501544 +1.9199997e-2 1.8686578 +1.9599997e-2 1.885981 +1.9999996e-2 1.902113 +2.0399995e-2 1.9170434 +2.0799994e-2 1.9307631 +2.1199994e-2 1.9432633 +2.1599993e-2 1.9545361 +2.1999992e-2 1.9645743 +2.2399992e-2 1.9733717 +2.2799991e-2 1.9809227 +2.319999e-2 1.9872226 +2.359999e-2 1.9922671 +2.3999989e-2 1.9960533 +2.4399988e-2 1.9985789 +2.4799988e-2 1.999842 +2.5199987e-2 1.999842 +2.5599986e-2 1.998579 +2.5999986e-2 1.9960536 +2.6399985e-2 1.9922674 +2.6799984e-2 1.9872228 +2.7199984e-2 1.980923 +2.7599983e-2 1.9733722 +2.7999982e-2 1.9645749 +2.8399982e-2 1.9545367 +2.879998e-2 1.943264 +2.919998e-2 1.930764 +2.959998e-2 1.9170443 +2.9999979e-2 1.9021138 +3.0399978e-2 1.8859819 +3.0799977e-2 1.8686588 +3.1199977e-2 1.8501555 +3.1599976e-2 1.8304834 +3.1999975e-2 1.8096554 +3.2399975e-2 1.7876841 +3.2799974e-2 1.7645838 +3.3199973e-2 1.7403691 +3.3599973e-2 1.715055 +3.3999972e-2 1.6886578 +3.439997e-2 1.6611936 +3.479997e-2 1.6326804 +3.519997e-2 1.6031361 +3.559997e-2 1.5725791 +3.599997e-2 1.541029 +3.6399968e-2 1.5085055 +3.6799967e-2 1.4750288 +3.7199967e-2 1.4406208 +3.7599966e-2 1.4053029 +3.7999965e-2 1.3690974 +3.8399965e-2 1.3320271 +3.8799964e-2 1.2941151 +3.9199963e-2 1.2553861 +3.9599963e-2 1.2158642 +3.999996e-2 1.1755743 +4.039996e-2 1.1345419 +4.079996e-2 1.0927929 +4.119996e-2 1.0503532 +4.159996e-2 1.0072505 +4.199996e-2 0.9635117 +4.2399958e-2 0.9191643 +4.2799957e-2 0.87423635 +4.3199956e-2 0.82875574 +4.3599956e-2 0.7827521 +4.3999955e-2 0.7362541 +4.4399954e-2 0.68929106 +4.4799954e-2 0.6418926 +4.5199953e-2 0.5940888 +4.5599952e-2 0.5459092 +4.599995e-2 0.49738535 +4.639995e-2 0.4485473 +4.679995e-2 0.39942592 +4.719995e-2 0.3500523 +4.759995e-2 0.30045706 +4.799995e-2 0.25067255 +4.8399948e-2 0.2007297 +4.8799947e-2 0.15066005 +4.9199946e-2 0.100495264 +4.9599946e-2 5.0266996e-2 +4.9999945e-2 6.500875e-6 +5.0399944e-2 -5.025352e-2 +5.0799944e-2 -0.1004818 +5.1199943e-2 -0.15064661 +5.1599942e-2 -0.20071629 +5.199994e-2 -0.25065964 +5.239994e-2 -0.30044422 +5.279994e-2 -0.350039 +5.319994e-2 -0.39941272 +5.359994e-2 -0.44853416 +5.3999938e-2 -0.4973723 +5.4399937e-2 -0.5458967 +5.4799937e-2 -0.5940759 +5.5199936e-2 -0.64187986 +5.5599935e-2 -0.6892784 +5.5999935e-2 -0.7362416 +5.6399934e-2 -0.7827402 +5.6799933e-2 -0.82874393 +5.7199933e-2 -0.87422425 +5.7599932e-2 -0.9191523 +5.799993e-2 -0.9634999 +5.839993e-2 -1.0072393 +5.879993e-2 -1.0503422 +5.919993e-2 -1.0927815 +5.959993e-2 -1.1345308 +5.9999928e-2 -1.1755633 +6.0399927e-2 -1.2158535 +6.0799927e-2 -1.255376 +6.1199926e-2 -1.2941052 +6.1599925e-2 -1.332017 +6.1999924e-2 -1.3690875 +6.2399924e-2 -1.4052932 +6.279992e-2 -1.4406117 +6.319992e-2 -1.4750199 +6.359992e-2 -1.5084965 +6.399992e-2 -1.5410206 +6.439992e-2 -1.5725712 +6.479992e-2 -1.6031283 +6.519992e-2 -1.6326729 +6.559992e-2 -1.6611863 +6.599992e-2 -1.6886505 +6.639992e-2 -1.7150481 +6.679992e-2 -1.7403624 +6.7199916e-2 -1.7645775 +6.7599915e-2 -1.7876781 +6.7999914e-2 -1.8096495 +6.839991e-2 -1.8304783 +6.879991e-2 -1.8501506 +6.919991e-2 -1.8686541 +6.959991e-2 -1.8859775 +6.999991e-2 -1.9021097 +7.039991e-2 -1.9170405 +7.079991e-2 -1.9307604 +7.119991e-2 -1.9432608 +7.159991e-2 -1.9545338 +7.199991e-2 -1.9645723 +7.239991e-2 -1.97337 +7.2799906e-2 -1.9809214 +7.3199905e-2 -1.9872214 +7.3599905e-2 -1.9922662 +7.3999904e-2 -1.9960527 +7.43999e-2 -1.9985785 +7.47999e-2 -1.9998419 +7.51999e-2 -1.9998423 +7.55999e-2 -1.9985794 +7.59999e-2 -1.9960542 +7.63999e-2 -1.9922683 +7.67999e-2 -1.9872241 +7.71999e-2 -1.9809245 +7.75999e-2 -1.9733739 +7.79999e-2 -1.9645768 +7.83999e-2 -1.9545388 +7.8799896e-2 -1.9432664 +7.9199895e-2 -1.9307666 +7.9599895e-2 -1.9170473 +7.9999894e-2 -1.902117 +8.039989e-2 -1.8859855 +8.079989e-2 -1.8686627 +8.119989e-2 -1.8501595 +8.159989e-2 -1.8304875 +8.199989e-2 -1.8096596 +8.239989e-2 -1.7876887 +8.279989e-2 -1.7645887 +8.319989e-2 -1.7403742 +8.359989e-2 -1.7150604 +8.399989e-2 -1.6886632 +8.439989e-2 -1.6611996 +8.4799886e-2 -1.6326867 +8.5199885e-2 -1.6031425 +8.5599884e-2 -1.5725858 +8.599988e-2 -1.5410352 +8.639988e-2 -1.5085119 +8.679988e-2 -1.4750358 +8.719988e-2 -1.4406279 +8.759988e-2 -1.4053102 +8.799988e-2 -1.3691049 +8.839988e-2 -1.3320347 +8.879988e-2 -1.2941233 +8.919988e-2 -1.2553945 +8.959988e-2 -1.2158726 +8.999988e-2 -1.175583 +9.0399876e-2 -1.13455 +9.0799876e-2 -1.0928011 +9.1199875e-2 -1.050362 +9.1599874e-2 -1.0072595 +9.199987e-2 -0.96352077 +9.239987e-2 -0.9191735 +9.279987e-2 -0.87424564 +9.319987e-2 -0.8287656 +9.359987e-2 -0.78276205 +9.399987e-2 -0.73626417 +9.439987e-2 -0.6893012 +9.479987e-2 -0.64190197 +9.519987e-2 -0.59409815 +9.559987e-2 -0.5459192 +9.599987e-2 -0.49739534 +9.6399866e-2 -0.44855735 +9.6799865e-2 -0.39943603 +9.7199865e-2 -0.35006243 +9.7599864e-2 -0.30046773 +9.799986e-2 -0.25068325 +9.839986e-2 -0.20074043 +9.879986e-2 -0.15067083 +9.919986e-2 -0.10050509 +9.959986e-2 -5.027683e-2 +9.999986e-2 -1.6816446e-5 +0.10039986 5.024321e-2 +0.10079986 0.100471504 +0.10119986 0.15063633 +0.10159986 0.20070602 +0.10199986 0.25064895 +0.102399856 0.30043355 +0.102799855 0.3500284 +0.103199854 0.39940214 +0.103599854 0.44852456 +0.10399985 0.49736276 +0.10439985 0.5458868 +0.10479985 0.5940661 +0.10519985 0.6418701 +0.10559985 0.6892687 +0.10599985 0.736232 +0.10639985 0.7827302 +0.10679985 0.8287341 +0.10719985 0.87421453 +0.10759985 0.9191428 +0.10799985 0.9634913 +0.108399846 1.0072304 +0.108799845 1.0503334 +0.109199844 1.092773 +0.10959984 1.1345222 +0.10999984 1.175555 +0.11039984 1.2158452 +0.11079984 1.2553675 +0.11119984 1.294097 +0.11159984 1.332009 +0.11199984 1.3690796 +0.11239984 1.4052863 +0.11279984 1.4406046 +0.11319984 1.475013 +0.11359984 1.5084898 +0.113999836 1.5410138 +0.114399835 1.5725645 +0.114799835 1.6031219 +0.115199834 1.6326667 +0.11559983 1.6611804 +0.11599983 1.6886448 +0.11639983 1.7150426 +0.11679983 1.7403576 +0.11719983 1.7645729 +0.11759983 1.7876737 +0.11799983 1.8096453 +0.11839983 1.8304739 +0.11879983 1.8501464 +0.11919983 1.8686503 +0.11959983 1.8859739 +0.119999826 1.9021064 +0.120399825 1.9170374 +0.120799825 1.9307575 +0.121199824 1.9432585 +0.12159982 1.9545318 +0.12199982 1.9645705 +0.12239982 1.9733684 +0.12279982 1.9809198 +0.12319982 1.9872202 +0.12359982 1.9922652 +0.12399982 1.996052 +0.12439982 1.9985781 +0.12479982 1.9998418 +0.12519982 1.9998424 +0.12559983 1.9985797 +0.12599984 1.9960546 +0.12639984 1.9922688 +0.12679985 1.9872246 +0.12719986 1.9809252 +0.12759987 1.9733747 +0.12799987 1.9645776 +0.12839988 1.9545392 +0.12879989 1.9432665 +0.12919989 1.9307665 +0.1295999 1.9170468 +0.1299999 1.9021163 +0.13039991 1.8859843 +0.13079992 1.868661 +0.13119993 1.8501575 +0.13159993 1.8304853 +0.13199994 1.8096569 +0.13239995 1.7876855 +0.13279995 1.7645848 +0.13319996 1.7403696 +0.13359997 1.7150551 +0.13399997 1.6886573 +0.13439998 1.6611929 +0.13479999 1.6326791 +0.1352 1.6031342 +0.1356 1.5725766 +0.136 1.5410256 +0.13640001 1.5085014 +0.13680002 1.4750243 +0.13720003 1.4406155 +0.13760003 1.4052968 +0.13800004 1.3690904 +0.13840005 1.3320193 +0.13880005 1.2941068 +0.13920006 1.2553754 +0.13960007 1.2158525 +0.14000008 1.1755617 +0.14040008 1.1345282 +0.14080009 1.0927782 +0.1412001 1.0503379 +0.1416001 1.0072342 +0.14200011 0.9634943 +0.14240012 0.9191458 +0.14280012 0.87421674 +0.14320013 0.8287355 +0.14360014 0.78273076 +0.14400014 0.7362316 +0.14440015 0.68926746 +0.14480016 0.64186794 +0.14520016 0.5940629 +0.14560017 0.54588276 +0.14600018 0.49735776 +0.14640018 0.4485186 +0.14680019 0.39939615 +0.1472002 0.35002142 +0.1476002 0.30042562 +0.14800021 0.25064003 +0.14840022 0.20069614 +0.14880022 0.15062548 +0.14920023 0.10045967 +0.14960024 5.0230417e-2 +0.15000024 -3.2472628e-5 +0.15040025 -5.0293438e-2 +0.15080026 -0.10052263 +0.15120026 -0.15068834 +0.15160027 -0.20075886 +0.15200028 -0.25070256 +0.15240029 -0.30048794 +0.15280029 -0.3500835 +0.1532003 -0.39945793 +0.1536003 -0.44858003 +0.15400031 -0.49741882 +0.15440032 -0.5459434 +0.15480033 -0.5941231 +0.15520033 -0.6419276 +0.15560034 -0.68932664 +0.15600035 -0.7362902 +0.15640035 -0.78278875 +0.15680036 -0.8287928 +0.15720037 -0.8742734 +0.15760037 -0.9192018 +0.15800038 -0.96354955 +0.15840039 -1.0072887 +0.1588004 -1.0503916 +0.1592004 -1.092831 +0.1596004 -1.1345801 +0.16000041 -1.1756126 +0.16040042 -1.2159026 +0.16080043 -1.2554245 +0.16120043 -1.2941549 +0.16160044 -1.3320663 +0.16200045 -1.3691365 +0.16240045 -1.4053416 +0.16280046 -1.4406593 +0.16320047 -1.4750669 +0.16360047 -1.5085428 +0.16400048 -1.5410659 +0.16440049 -1.5726155 +0.1648005 -1.6031718 +0.1652005 -1.6327156 +0.16560051 -1.661228 +0.16600052 -1.688691 +0.16640052 -1.7150875 +0.16680053 -1.7404007 +0.16720054 -1.7646145 +0.16760054 -1.7877138 +0.16800055 -1.8096838 +0.16840056 -1.8305107 +0.16880056 -1.8501815 +0.16920057 -1.8686836 +0.16960058 -1.8860053 +0.17000058 -1.9021357 +0.17040059 -1.9170648 +0.1708006 -1.9307829 +0.1712006 -1.9432814 +0.17160061 -1.9545525 +0.17200062 -1.9645894 +0.17240062 -1.973385 +0.17280063 -1.980934 +0.17320064 -1.9872319 +0.17360064 -1.9922745 +0.17400065 -1.9960587 +0.17440066 -1.9985821 +0.17480066 -1.9998431 +0.17520067 -1.999841 +0.17560068 -1.9985757 +0.17600068 -1.996048 +0.17640069 -1.9922595 +0.1768007 -1.9872127 +0.1772007 -1.9809105 +0.17760071 -1.9733572 +0.17800072 -1.9645574 +0.17840073 -1.9545168 +0.17880073 -1.9432416 +0.17920074 -1.9307389 +0.17960075 -1.9170167 +0.18000075 -1.9020836 +0.18040076 -1.8859491 +0.18080077 -1.8686235 +0.18120077 -1.8501174 +0.18160078 -1.8304428 +0.18200079 -1.8096119 +0.1824008 -1.7876381 +0.1828008 -1.7645352 +0.1832008 -1.7403166 +0.18360081 -1.7149998 +0.18400082 -1.6885997 +0.18440083 -1.661133 +0.18480083 -1.6326171 +0.18520084 -1.6030699 +0.18560085 -1.5725102 +0.18600085 -1.5409572 +0.18640086 -1.5084308 +0.18680087 -1.4749517 +0.18720087 -1.440541 +0.18760088 -1.4052204 +0.18800089 -1.3690121 +0.1884009 -1.3319391 +0.1888009 -1.2940248 +0.18920091 -1.2552933 +0.18960091 -1.2157687 +0.19000092 -1.1754762 +0.19040093 -1.1344413 +0.19080094 -1.0926898 +0.19120094 -1.0502481 +0.19160095 -1.007143 +0.19200096 -0.9634018 +0.19240096 -0.91905206 +0.19280097 -0.8741218 +0.19320098 -0.8286394 +0.19360098 -0.7826336 +0.19400099 -0.73613167 +0.194401 -0.68916655 +0.194801 -0.64176613 +0.19520101 -0.59396034 +0.19560102 -0.54577935 +0.19600102 -0.49725366 +0.19640103 -0.44841388 +0.19680104 -0.39929086 +0.19720104 -0.34991562 +0.19760105 -0.30031937 +0.19800106 -0.2505334 +0.19840106 -0.20058921 +0.19880107 -0.15051831 +0.19920108 -0.10035235 +0.19960108 -5.0122987e-2 +0.20000109 1.3802848e-4 +0.2004011 5.0398957e-2 +0.2008011 0.100628056 +0.20120111 0.1507936 +0.20160112 0.20086388 +0.20200112 0.2508073 +0.20240113 0.30059227 +0.20280114 0.35018742 +0.20320114 0.39956135 +0.20360115 0.4486829 +0.20400116 0.49752104 +0.20440117 0.54604495 +0.20480117 0.59422576 +0.20520118 0.6420294 +0.20560119 0.6894275 +0.20600119 0.7363901 +0.2064012 0.78288764 +0.2068012 0.8288906 +0.20720121 0.8743701 +0.20760122 0.9192972 +0.20800123 0.9636437 +0.20840123 1.0073816 +0.20880124 1.050483 +0.20920125 1.092921 +0.20960125 1.1346686 +0.21000126 1.1756996 +0.21040127 1.2159879 +0.21080127 1.2555081 +0.21120128 1.2942353 +0.21160129 1.3321451 +0.2120013 1.3692133 +0.2124013 1.4054167 +0.2128013 1.4407325 +0.21320131 1.4751382 +0.21360132 1.5086122 +0.21400133 1.5411332 +0.21440133 1.5726807 +0.21480134 1.603235 +0.21520135 1.6327765 +0.21560135 1.6612867 +0.21600136 1.6887486 +0.21640137 1.7151428 +0.21680138 1.7404536 +0.21720138 1.7646651 +0.21760139 1.7877619 +0.2180014 1.8097295 +0.2184014 1.830554 +0.21880141 1.8502222 +0.21920142 1.8687218 +0.21960142 1.886041 +0.22000143 1.902169 +0.22040144 1.9170954 +0.22080144 1.9308109 +0.22120145 1.9433068 +0.22160146 1.9545753 +0.22200146 1.9646091 +0.22240147 1.9734021 +0.22280148 1.9809486 +0.22320148 1.9872438 +0.22360149 1.9922837 +0.2240015 1.9960653 +0.2244015 1.998586 +0.22480151 1.9998444 +0.22520152 1.9998397 +0.22560152 1.9985718 +0.22600153 1.9960413 +0.22640154 1.9922502 +0.22680154 1.9872005 +0.22720155 1.9808956 +0.22760156 1.9733397 +0.22800156 1.9645373 +0.22840157 1.954494 +0.22880158 1.9432161 +0.22920159 1.9307109 +0.22960159 1.9169861 +0.2300016 1.9020505 +0.2304016 1.8859134 +0.23080161 1.8685851 +0.23120162 1.8500766 +0.23160163 1.8303995 +0.23200163 1.8095663 +0.23240164 1.7875899 +0.23280165 1.7644845 +0.23320165 1.7402647 +0.23360166 1.7149456 +0.23400167 1.6885431 +0.23440167 1.6610742 +0.23480168 1.6325561 +0.23520169 1.6030068 +0.2356017 1.5724449 +0.2360017 1.5408899 +0.2364017 1.5083616 +0.23680171 1.4748805 +0.23720172 1.4404678 +0.23760173 1.4051453 +0.23800173 1.3689338 +0.23840174 1.331859 +0.23880175 1.2939429 +0.23920175 1.2552096 +0.23960176 1.2156833 +0.24000177 1.1753893 +0.24040177 1.1343528 +0.24080178 1.0925997 +0.24120179 1.0501566 +0.2416018 1.0070502 +0.2420018 0.9633076 +0.24240181 0.9189566 +0.24280182 0.8740251 +0.24320182 0.8285416 +0.24360183 0.7825347 +0.24400184 0.73603356 +0.24440184 0.6890675 +0.24480185 0.6416662 +0.24520186 0.59385955 +0.24560186 0.54567784 +0.24600187 0.49715143 +0.24640188 0.448311 +0.24680188 0.39918742 +0.24720189 0.3498117 +0.2476019 0.300215 +0.2480019 0.25042868 +0.24840191 0.20048419 +0.24880192 0.15041116 +0.24920192 0.10024502 +0.24960193 5.001556e-2 +0.25000194 -2.4549168e-4 +0.25040194 -5.0506387e-2 +0.25080195 -0.10073538 +0.25120196 -0.15090075 +0.25160196 -0.2009708 +0.25200197 -0.25091392 +0.25240198 -0.30069852 +0.25280198 -0.35029322 +0.253202 -0.39966664 +0.253602 -0.44878763 +0.254002 -0.49762514 +0.254402 -0.5461483 +0.25480202 -0.59432656 +0.25520203 -0.64212936 +0.25560203 -0.6895266 +0.25600204 -0.7364883 +0.25640205 -0.7829848 +0.25680205 -0.8289867 +0.25720206 -0.874465 +0.25760207 -0.919391 +0.25800207 -0.9637362 +0.25840208 -1.0074726 +0.2588021 -1.0505729 +0.2592021 -1.0930094 +0.2596021 -1.1347555 +0.2600021 -1.175785 +0.2604021 -1.2160717 +0.26080212 -1.2555903 +0.26120213 -1.2943158 +0.26160213 -1.3322238 +0.26200214 -1.3692902 +0.26240215 -1.4054918 +0.26280215 -1.4408057 +0.26320216 -1.4752095 +0.26360217 -1.5086814 +0.26400217 -1.5412004 +0.26440218 -1.5727459 +0.2648022 -1.6032981 +0.2652022 -1.6328397 +0.2656022 -1.6613476 +0.2660022 -1.6888062 +0.2664022 -1.715198 +0.26680222 -1.7405065 +0.26720223 -1.7647157 +0.26760224 -1.7878101 +0.26800224 -1.8097752 +0.26840225 -1.8305973 +0.26880226 -1.8502631 +0.26920226 -1.8687601 +0.26960227 -1.8860768 +0.27000228 -1.9022021 +0.27040228 -1.917126 +0.2708023 -1.930839 +0.2712023 -1.9433322 +0.2716023 -1.9545981 +0.2720023 -1.9646293 +0.27240232 -1.9734195 +0.27280232 -1.9809633 +0.27320233 -1.9872558 +0.27360234 -1.9922931 +0.27400234 -1.996072 +0.27440235 -1.9985901 +0.27480236 -1.9998459 +0.27520236 -1.9998384 +0.27560237 -1.9985676 +0.27600238 -1.9960346 +0.27640238 -1.9922408 +0.2768024 -1.9871886 +0.2772024 -1.9808811 +0.2776024 -1.9733225 +0.2780024 -1.9645175 +0.27840242 -1.9544716 +0.27880242 -1.9431912 +0.27920243 -1.9306833 +0.27960244 -1.916956 +0.28000244 -1.9020178 +0.28040245 -1.8858782 +0.28080246 -1.8685476 +0.28120247 -1.8500365 +0.28160247 -1.830357 +0.28200248 -1.8095212 +0.2824025 -1.7875426 +0.2828025 -1.7644348 +0.2832025 -1.7402126 +0.2836025 -1.7148912 +0.2840025 -1.6884866 +0.28440252 -1.6610154 +0.28480253 -1.6324952 +0.28520253 -1.6029437 +0.28560254 -1.5723797 +0.28600255 -1.5408226 +0.28640255 -1.5082922 +0.28680256 -1.4748092 +0.28720257 -1.4403919 +0.28760257 -1.4050674 +0.28800258 -1.3688555 +0.2884026 -1.3317788 +0.2888026 -1.293861 +0.2892026 -1.2551259 +0.2896026 -1.215598 +0.2900026 -1.1753024 +0.29040262 -1.1342642 +0.29080263 -1.0925097 +0.29120263 -1.0500652 +0.29160264 -1.0069573 +0.29200265 -0.96321344 +0.29240265 -0.91886115 +0.29280266 -0.8739285 +0.29320267 -0.82844377 +0.29360268 -0.78243583 +0.29400268 -0.7359336 +0.2944027 -0.6889666 +0.2948027 -0.64156437 +0.2952027 -0.5937569 +0.2956027 -0.5455744 +0.29600272 -0.49704733 +0.29640272 -0.44820628 +0.29680273 -0.39908212 +0.29720274 -0.34970587 +0.29760274 -0.30010876 +0.29800275 -0.25032207 +0.29840276 -0.20037727 +0.29880276 -0.1503059 +0.29920277 -0.100139596 +0.29960278 -4.9910035e-2 +0.30000278 3.5104755e-4 +0.3004028 5.061191e-2 +0.3008028 0.10084081 +0.3012028 0.151006 +0.3016028 0.20107582 +0.30200282 0.25101864 +0.30240282 0.3008029 +0.30280283 0.35039714 +0.30320284 0.39977008 +0.30360284 0.44889048 +0.30400285 0.49772736 +0.30440286 0.54624987 +0.30480286 0.59442735 +0.30520287 0.6422293 +0.30560288 0.6896257 +0.3060029 0.7365864 +0.3064029 0.7830819 +0.3068029 0.8290828 +0.3072029 0.87455994 +0.3076029 0.9194847 +0.30800292 0.9638287 +0.30840293 1.0075638 +0.30880293 1.0506626 +0.30920294 1.093101 +0.30960295 1.1348456 +0.31000295 1.1758734 +0.31040296 1.2161585 +0.31080297 1.2556754 +0.31120297 1.2943991 +0.31160298 1.3323053 +0.312003 1.36937 +0.312403 1.4055697 +0.312803 1.4408816 +0.313203 1.4752833 +0.313603 1.5087532 +0.31400302 1.5412701 +0.31440303 1.5728135 +0.31480303 1.6033634 +0.31520304 1.6329006 +0.31560305 1.6614064 +0.31600305 1.6888628 +0.31640306 1.7152524 +0.31680307 1.7405585 +0.31720307 1.7647653 +0.31760308 1.7878574 +0.3180031 1.8098202 +0.3184031 1.8306398 +0.3188031 1.8503032 +0.3192031 1.8687978 +0.31960312 1.886112 +0.32000312 1.9022348 +0.32040313 1.9171561 +0.32080314 1.9308665 +0.32120314 1.9433572 +0.32160315 1.9546204 +0.32200316 1.9646491 +0.32240316 1.9734367 +0.32280317 1.9809779 +0.32320318 1.9872677 +0.32360318 1.9923024 +0.3240032 1.9960786 +0.3244032 1.998594 +0.3248032 1.9998472 +0.3252032 1.9998369 +0.32560322 1.9985636 +0.32600322 1.996028 +0.32640323 1.9922315 +0.32680324 1.9871767 +0.32720324 1.9808666 +0.32760325 1.9733053 +0.32800326 1.9644977 +0.32840326 1.9544492 +0.32880327 1.9431661 +0.32920328 1.9306557 +0.32960328 1.9169259 +0.3300033 1.9019852 +0.3304033 1.8858432 +0.3308033 1.8685085 +0.3312033 1.8499949 +0.33160332 1.8303128 +0.33200333 1.8094747 +0.33240333 1.7874936 +0.33280334 1.7643833 +0.33320335 1.7401587 +0.33360335 1.7148349 +0.33400336 1.6884279 +0.33440337 1.6609545 +0.33480337 1.632432 +0.33520338 1.6028782 +0.3356034 1.5723121 +0.3360034 1.5407529 +0.3364034 1.5082204 +0.3368034 1.4747353 +0.3372034 1.4403187 +0.33760342 1.4049923 +0.33800343 1.3687785 +0.33840343 1.3317001 +0.33880344 1.2937804 +0.33920345 1.2550437 +0.33960345 1.2155142 +0.34000346 1.1752169 +0.34040347 1.1341773 +0.34080347 1.0924213 +0.34120348 1.0499753 +0.3416035 1.0068661 +0.3420035 0.96312094 +0.3424035 0.9187674 +0.3428035 0.87383354 +0.3432035 0.8283477 +0.34360352 0.7823387 +0.34400353 0.7358355 +0.34440354 0.6888675 +0.34480354 0.6414644 +0.34520355 0.5936561 +0.34560356 0.54547286 +0.34600356 0.49694508 +0.34640357 0.4481034 +0.34680358 0.39897868 +0.34720358 0.34960195 +0.3476036 0.3000044 +0.3480036 0.25021735 +0.3484036 0.20027225 +0.3488036 0.15020065 +0.34920362 0.10003417 +0.34960362 4.9804512e-2 +0.35000363 -4.566034e-4 +0.35040364 -5.0717432e-2 +0.35080364 -0.100946225 +0.35120365 -0.15111126 +0.35160366 -0.20118085 +0.35200366 -0.25112334 +0.35240367 -0.30090722 +0.35280368 -0.35050482 +0.35320368 -0.39987722 +0.3536037 -0.44899708 +0.3540037 -0.4978333 +0.3544037 -0.54635507 +0.3548037 -0.5945318 +0.35520372 -0.6423329 +0.35560372 -0.6897283 +0.35600373 -0.7366881 +0.35640374 -0.78318256 +0.35680375 -0.82918227 +0.35720375 -0.8746583 +0.35760376 -0.91958183 +0.35800377 -0.9639245 +0.35840377 -1.0076584 +0.35880378 -1.0507557 +0.3592038 -1.0931894 +0.3596038 -1.1349325 +0.3600038 -1.1759588 +0.3604038 -1.2162423 +0.3608038 -1.2557576 +0.36120382 -1.2944796 +0.36160383 -1.3323841 +0.36200383 -1.369447 +0.36240384 -1.4056448 +0.36280385 -1.4409548 +0.36320385 -1.4753546 +0.36360386 -1.5088226 +0.36400387 -1.5413374 +0.36440387 -1.5728787 +0.36480388 -1.6034266 +0.3652039 -1.6329616 +0.3656039 -1.6614652 +0.3660039 -1.6889193 +0.3664039 -1.7153066 +0.3668039 -1.7406105 +0.36720392 -1.764815 +0.36760393 -1.7879047 +0.36800393 -1.8098651 +0.36840394 -1.8306823 +0.36880395 -1.8503432 +0.36920395 -1.8688353 +0.36960396 -1.886147 +0.37000397 -1.9022673 +0.37040398 -1.9171861 +0.37080398 -1.9308939 +0.371204 -1.9433821 +0.371604 -1.9546428 +0.372004 -1.9646688 +0.372404 -1.9734539 +0.37280402 -1.9809924 +0.37320402 -1.9872797 +0.37360403 -1.9923117 +0.37400404 -1.9960853 +0.37440404 -1.998598 +0.37480405 -1.9998485 +0.37520406 -1.9998356 +0.37560406 -1.9985595 +0.37600407 -1.996021 +0.37640408 -1.9922218 +0.37680408 -1.9871643 +0.3772041 -1.9808515 +0.3776041 -1.9732876 +0.3780041 -1.9644772 +0.3784041 -1.9544259 +0.37880412 -1.9431403 +0.37920412 -1.9306272 +0.37960413 -1.9168947 +0.38000414 -1.9019513 +0.38040414 -1.8858067 +0.38080415 -1.8684709 +0.38120416 -1.8499548 +0.38160416 -1.8302703 +0.38200417 -1.8094296 +0.38240418 -1.7874461 +0.3828042 -1.7643336 +0.3832042 -1.7401067 +0.3836042 -1.7147806 +0.3840042 -1.6883714 +0.3844042 -1.6608957 +0.38480422 -1.632371 +0.38520423 -1.6028152 +0.38560423 -1.5722469 +0.38600424 -1.5406855 +0.38640425 -1.508151 +0.38680425 -1.474664 +0.38720426 -1.4402454 +0.38760427 -1.4049171 +0.38800427 -1.3687015 +0.38840428 -1.3316213 +0.3888043 -1.2937 +0.3892043 -1.2549615 +0.3896043 -1.2154304 +0.3900043 -1.1751316 +0.3904043 -1.1340904 +0.39080432 -1.092333 +0.39120433 -1.0498855 +0.39160433 -1.0067749 +0.39200434 -0.96302843 +0.39240435 -0.91867363 +0.39280435 -0.8737386 +0.39320436 -0.8282516 +0.39360437 -0.7822415 +0.39400437 -0.7357373 +0.39440438 -0.6887684 +0.3948044 -0.6413644 +0.3952044 -0.59355533 +0.3956044 -0.54537135 +0.3960044 -0.49684283 +0.39640442 -0.44800055 +0.39680442 -0.3988715 +0.39720443 -0.34949428 +0.39760444 -0.29989627 +0.39800444 -0.25010884 +0.39840445 -0.20016342 +0.39880446 -0.15009159 +0.39920446 -9.992494e-2 +0.39960447 -4.9695175e-2 +0.40000448 5.659739e-4 +0.40040448 5.0826766e-2 +0.4008045 0.10105546 +0.4012045 0.15122032 +0.4016045 0.20128965 +0.4020045 0.25123185 +0.40240452 0.30101538 +0.40280452 0.35060874 +0.40320453 0.39998066 +0.40360454 0.44909993 +0.40400454 0.49793553 +0.40440455 0.54645663 +0.40480456 0.59463257 +0.40520456 0.64243287 +0.40560457 0.68982744 +0.40600458 0.73678625 +0.40640458 0.78327966 +0.4068046 0.82927835 +0.4072046 0.87475324 +0.4076046 0.9196756 +0.4080046 0.96401703 +0.40840462 1.0077496 +0.40880463 1.0508455 +0.40920463 1.0932778 +0.40960464 1.1350194 +0.41000465 1.1760442 +0.41040465 1.2163261 +0.41080466 1.2558397 +0.41120467 1.2945601 +0.41160467 1.3324628 +0.41200468 1.3695239 +0.4124047 1.4057199 +0.4128047 1.441028 +0.4132047 1.4754258 +0.4136047 1.5088918 +0.4140047 1.5414046 +0.41440472 1.5729439 +0.41480473 1.6034896 +0.41520473 1.6330225 +0.41560474 1.6615239 +0.41600475 1.6889758 +0.41640475 1.7153609 +0.41680476 1.7406625 +0.41720477 1.7648647 +0.41760477 1.787952 +0.41800478 1.80991 +0.4184048 1.8307248 +0.4188048 1.8503847 +0.4192048 1.8688743 +0.4196048 1.8861834 +0.4200048 1.9023011 +0.42040482 1.9172173 +0.42080483 1.9309224 +0.42120484 1.9434079 +0.42160484 1.9546659 +0.42200485 1.9646893 +0.42240486 1.9734716 +0.42280486 1.9810075 +0.42320487 1.9872919 +0.42360488 1.9923213 +0.42400488 1.9960921 +0.4244049 1.9986022 +0.4248049 1.9998498 +0.4252049 1.9998342 +0.4256049 1.9985555 +0.42600492 1.9960144 +0.42640492 1.9922125 +0.42680493 1.9871523 +0.42720494 1.9808369 +0.42760494 1.9732703 +0.42800495 1.9644574 +0.42840496 1.9544035 +0.42880496 1.9431152 +0.42920497 1.9305997 +0.42960498 1.9168645 +0.43000498 1.9019186 +0.430405 1.8857715 +0.430805 1.8684332 +0.431205 1.8499147 +0.431605 1.8302277 +0.43200502 1.8093847 +0.43240502 1.7873988 +0.43280503 1.7642839 +0.43320504 1.7400546 +0.43360505 1.7147262 +0.43400505 1.6883148 +0.43440506 1.6608369 +0.43480507 1.6323099 +0.43520507 1.602752 +0.43560508 1.5721817 +0.4360051 1.5406183 +0.4364051 1.5080818 +0.4368051 1.4745927 +0.4372051 1.4401722 +0.4376051 1.404842 +0.43800512 1.3686246 +0.43840513 1.3315425 +0.43880513 1.2936195 +0.43920514 1.2548794 +0.43960515 1.2153466 +0.44000515 1.1750461 +0.44040516 1.1340003 +0.44080517 1.0922413 +0.44120517 1.0497924 +0.44160518 1.0066804 +0.4420052 0.9629326 +0.4424052 0.9185765 +0.4428052 0.8736402 +0.4432052 0.82815206 +0.4436052 0.78214085 +0.44400522 0.73563564 +0.44440523 0.6886657 +0.44480523 0.6412608 +0.44520524 0.5934509 +0.44560525 0.5452661 +0.44600525 0.4967369 +0.44640526 0.44789395 +0.44680527 0.39876807 +0.44720528 0.34939033 +0.44760528 0.2997919 +0.4480053 0.2500041 +0.4484053 0.2000584 +0.4488053 0.14998633 +0.4492053 9.981951e-2 +0.44960532 4.9589653e-2 +0.45000532 -6.715298e-4 +0.45040533 -5.093229e-2 +0.45080534 -0.10116088 +0.45120534 -0.15132557 +0.45160535 -0.20139468 +0.45200536 -0.25133657 +0.45240536 -0.30111971 +0.45280537 -0.35071266 +0.45320538 -0.40008408 +0.45360538 -0.4492028 +0.4540054 -0.49803776 +0.4544054 -0.54655814 +0.4548054 -0.5947333 +0.4552054 -0.6425328 +0.45560542 -0.6899265 +0.45600542 -0.73688436 +0.45640543 -0.7833768 +0.45680544 -0.8293744 +0.45720544 -0.8748481 +0.45760545 -0.9197693 +0.45800546 -0.9641095 +0.45840546 -1.0078408 +0.45880547 -1.0509354 +0.45920548 -1.0933661 +0.4596055 -1.1351063 +0.4600055 -1.1761296 +0.4604055 -1.2164099 +0.4608055 -1.2559218 +0.4612055 -1.2946405 +0.46160552 -1.3325415 +0.46200553 -1.3696008 +0.46240553 -1.4057977 +0.46280554 -1.4411038 +0.46320555 -1.4754996 +0.46360555 -1.5089636 +0.46400556 -1.5414743 +0.46440557 -1.5730115 +0.46480557 -1.603555 +0.46520558 -1.6330856 +0.4656056 -1.6615847 +0.4660056 -1.6890345 +0.4664056 -1.7154171 +0.4668056 -1.7407163 +0.4672056 -1.7649161 +0.46760562 -1.7880011 +0.46800563 -1.8099566 +0.46840563 -1.8307688 +0.46880564 -1.8504248 +0.46920565 -1.8689119 +0.46960565 -1.8862185 +0.47000566 -1.9023337 +0.47040567 -1.9172473 +0.47080567 -1.9309499 +0.47120568 -1.9434329 +0.4716057 -1.9546883 +0.4720057 -1.964709 +0.4724057 -1.9734887 +0.4728057 -1.9810219 +0.47320572 -1.9873039 +0.47360572 -1.9923304 +0.47400573 -1.9960986 +0.47440574 -1.9986061 +0.47480574 -1.9998511 +0.47520575 -1.9998329 +0.47560576 -1.9985515 +0.47600576 -1.9960077 +0.47640577 -1.9922032 +0.47680578 -1.9871403 +0.47720578 -1.9808223 +0.4776058 -1.9732531 +0.4780058 -1.9644376 +0.4784058 -1.9543811 +0.4788058 -1.9430903 +0.47920582 -1.930572 +0.47960582 -1.9168345 +0.48000583 -1.9018861 +0.48040584 -1.8857363 +0.48080584 -1.8683956 +0.48120585 -1.8498746 +0.48160586 -1.8301852 +0.48200586 -1.8093398 +0.48240587 -1.7873515 +0.48280588 -1.7642342 +0.48320588 -1.7400026 +0.4836059 -1.714672 +0.4840059 -1.6882582 +0.4844059 -1.6607759 +0.4848059 -1.6322467 +0.48520592 -1.6026865 +0.48560593 -1.572114 +0.48600593 -1.5405486 +0.48640594 -1.5080099 +0.48680595 -1.4745188 +0.48720595 -1.4400963 +0.48760596 -1.4047642 +0.48800597 -1.3685448 +0.48840597 -1.331461 +0.48880598 -1.2935361 +0.489206 -1.2547941 +0.489606 -1.2152597 +0.490006 -1.1749576 +0.490406 -1.1339134 +0.490806 -1.0921528 +0.49120602 -1.0497025 +0.49160603 -1.0065892 +0.49200603 -0.96284 +0.49240604 -0.9184827 +0.49280605 -0.8735452 +0.49320605 -0.828056 +0.49360606 -0.7820437 +0.49400607 -0.73553747 +0.49440607 -0.6885666 +0.49480608 -0.64116085 +0.4952061 -0.5933501 +0.4956061 -0.5451645 +0.4960061 -0.49663466 +0.4964061 -0.44779107 +0.49680611 -0.39866465 +0.49720612 -0.3492864 +0.49760613 -0.29968753 +0.49800614 -0.24989937 +0.49840614 -0.19995338 +0.49880615 -0.14988106 +0.49920616 -9.971409e-2 +0.49960616 -4.948413e-2 +0.50000614 7.7327096e-4 +0.50040615 5.1033996e-2 +0.50080615 0.10126249 +0.50120616 0.15142702 +0.50160617 0.2014959 +0.5020062 0.25143752 +0.5024062 0.3012203 +0.5028062 0.35081282 +0.5032062 0.40018377 +0.5036062 0.44930193 +0.5040062 0.4981363 +0.5044062 0.546656 +0.5048062 0.59483045 +0.5052062 0.6426292 +0.50560623 0.690022 +0.50600624 0.73698246 +0.50640625 0.7834739 +0.50680625 0.82947046 +0.50720626 0.8749431 +0.50760627 0.91986305 +0.5080063 0.964202 +0.5084063 1.0079318 +0.5088063 1.0510252 +0.5092063 1.0934545 +0.5096063 1.1351901 +0.5100063 1.1762149 +0.5104063 1.2164906 +0.5108063 1.256004 +0.5112063 1.2947181 +0.51160634 1.3326203 +0.51200634 1.3696749 +0.51240635 1.4058701 +0.51280636 1.4411718 +0.51320636 1.4755684 +0.51360637 1.5090278 +0.5140064 1.5415392 +0.5144064 1.573072 +0.5148064 1.6036158 +0.5152064 1.6331422 +0.5156064 1.6616414 +0.5160064 1.6890868 +0.5164064 1.7154695 +0.5168064 1.7407683 +0.51720643 1.764964 +0.51760644 1.7880483 +0.51800644 1.8099998 +0.51840645 1.8308114 +0.51880646 1.8504634 +0.51920646 1.8689494 +0.5196065 1.8862523 +0.5200065 1.9023663 +0.5204065 1.9172763 +0.5208065 1.9309775 +0.5212065 1.9434569 +0.5216065 1.9547106 +0.5220065 1.964728 +0.5224065 1.9735059 +0.5228065 1.981036 +0.52320653 1.9873157 +0.52360654 1.9923394 +0.52400655 1.9961053 +0.52440655 1.9986099 +0.52480656 1.9998523 +0.52520657 1.9998316 +0.5256066 1.9985474 +0.5260066 1.9960012 +0.5264066 1.9921939 +0.5268066 1.9871289 +0.5272066 1.9808078 +0.5276066 1.9732366 +0.5280066 1.9644177 +0.5284066 1.9543595 +0.5288066 1.9430653 +0.52920663 1.9305454 +0.52960664 1.9168043 +0.53000665 1.9018546 +0.53040665 1.8857012 +0.53080666 1.8683592 +0.53120667 1.8498344 +0.5316067 1.8301442 +0.5320067 1.8092948 +0.5324067 1.7873058 +0.5328067 1.7641845 +0.5332067 1.7399524 +0.5336067 1.7146176 +0.5340067 1.6882037 +0.5344067 1.6607193 +0.5348067 1.6321901 +0.53520674 1.6026257 +0.53560674 1.5720536 +0.53600675 1.5404836 +0.53640676 1.5079455 +0.53680676 1.4744501 +0.53720677 1.4400283 +0.5376068 1.4046918 +0.5380068 1.3684734 +0.5384068 1.331385 +0.5388068 1.2934556 +0.5392068 1.254715 +0.5396068 1.2151759 +0.5400068 1.1748753 +0.5404068 1.1338264 +0.54080683 1.0920676 +0.54120684 1.0496128 +0.54160684 1.0065013 +0.54200685 0.9627475 +0.54240686 0.91839236 +0.54280686 0.8734503 +0.5432069 0.82796335 +0.5436069 0.78194654 +0.5440069 0.7354429 +0.5444069 0.6884675 +0.5448069 0.64106447 +0.5452069 0.59324926 +0.5456069 0.54506665 +0.5460069 0.4965324 +0.5464069 0.44769192 +0.54680693 0.3985612 +0.54720694 0.3491862 +0.54760695 0.29958317 +0.54800695 0.24979843 +0.54840696 0.19984834 +0.54880697 0.1497796 +0.549207 9.960867e-2 +0.549607 4.938242e-2 +0.550007 -8.826415e-4 +0.550407 -5.113952e-2 +0.550807 -0.10137172 +0.551207 -0.15153226 +0.551607 -0.20160471 +0.552007 -0.25154224 +0.552407 -0.30132842 +0.55280703 -0.35091674 +0.55320704 -0.40029094 +0.55360705 -0.44940478 +0.55400705 -0.49824223 +0.55440706 -0.5467576 +0.55480707 -0.5949349 +0.5552071 -0.64272916 +0.5556071 -0.69012463 +0.5560071 -0.73707706 +0.5564071 -0.783571 +0.5568071 -0.829563 +0.5572071 -0.87503797 +0.5576071 -0.91995335 +0.5580071 -0.96429443 +0.5584071 -1.0080198 +0.55880713 -1.0511149 +0.55920714 -1.0935397 +0.55960715 -1.1352801 +0.56000715 -1.1762972 +0.56040716 -1.2165774 +0.56080717 -1.2560891 +0.5612072 -1.2948015 +0.5616072 -1.3327018 +0.5620072 -1.3697547 +0.5624072 -1.4059478 +0.5628072 -1.4412476 +0.5632072 -1.4756422 +0.5636072 -1.5090996 +0.5640072 -1.5416088 +0.5644072 -1.5731394 +0.56480724 -1.6036812 +0.56520724 -1.6332053 +0.56560725 -1.6617023 +0.56600726 -1.6891454 +0.56640726 -1.7155256 +0.56680727 -1.7408185 +0.5672073 -1.7650154 +0.5676073 -1.7880939 +0.5680073 -1.8100463 +0.5684073 -1.8308523 +0.5688073 -1.8505049 +0.5692073 -1.8689857 +0.5696073 -1.8862886 +0.5700073 -1.9023976 +0.57040733 -1.9173074 +0.57080734 -1.9310039 +0.57120734 -1.9434828 +0.57160735 -1.9547322 +0.57200736 -1.9647485 +0.57240736 -1.9735223 +0.5728074 -1.981051 +0.5732074 -1.9873271 +0.5736074 -1.9923489 +0.5740074 -1.9961116 +0.5744074 -1.998614 +0.5748074 -1.9998536 +0.5752074 -1.9998301 +0.5756074 -1.9985436 +0.5760074 -1.9959943 +0.57640743 -1.9921849 +0.57680744 -1.9871165 +0.57720745 -1.9807937 +0.57760745 -1.9732187 +0.57800746 -1.9643986 +0.57840747 -1.9543363 +0.5788075 -1.9430412 +0.5792075 -1.930517 +0.5796075 -1.9167752 +0.5800075 -1.9018208 +0.5804075 -1.8856673 +0.5808075 -1.8683202 +0.5812075 -1.8497958 +0.5816075 -1.8301 +0.5820075 -1.8092514 +0.58240753 -1.7872567 +0.58280754 -1.764133 +0.58320755 -1.7398984 +0.58360755 -1.7145612 +0.58400756 -1.688145 +0.58440757 -1.6606584 +0.5848076 -1.6321269 +0.5852076 -1.6025603 +0.5856076 -1.5719858 +0.5860076 -1.5404139 +0.5864076 -1.5078738 +0.5868076 -1.4743762 +0.5872076 -1.4399525 +0.5876076 -1.404614 +0.5880076 -1.3683937 +0.58840764 -1.3313034 +0.58880764 -1.293378 +0.58920765 -1.2546297 +0.58960766 -1.215095 +0.59000766 -1.1747867 +0.59040767 -1.1337426 +0.5908077 -1.091976 +0.5912077 -1.0495261 +0.5916077 -1.0064068 +0.5920077 -0.96265835 +0.5924077 -0.9182952 +0.5928077 -0.8733587 +0.5932077 -0.8278638 +0.5936077 -0.7818529 +0.59400773 -0.73534113 +0.59440774 -0.688372 +0.59480774 -0.6409609 +0.59520775 -0.5931521 +0.59560776 -0.5449614 +0.59600776 -0.49643385 +0.5964078 -0.4475853 +0.5968078 -0.3984615 +0.5972078 -0.34907854 +0.5976078 -0.29948258 +0.5980078 -0.24968992 +0.5984078 -0.19974712 +0.5988078 -0.14967054 +0.5992078 -9.950705e-2 +0.5996078 -4.927308e-2 +0.60000783 9.843827e-4 +0.60040784 5.1248852e-2 +0.60080785 0.10147333 +0.60120785 0.15164132 +0.60160786 0.20170593 +0.60200787 0.25165072 +0.6024079 0.301429 +0.6028079 0.35102442 +0.6032079 0.4003906 +0.6036079 0.44951135 +0.6040079 0.49834076 +0.6044079 0.5468628 +0.6048079 0.5950393 +0.6052079 0.6428327 +0.6056079 0.69022727 +0.60600793 0.73717874 +0.60640794 0.7836717 +0.60680795 0.82966256 +0.60720795 0.8751363 +0.60760796 0.9200505 +0.60800797 0.9643903 +0.608408 1.0081142 +0.608808 1.051208 +0.609208 1.0936313 +0.609608 1.1353701 +0.610008 1.1763856 +0.610408 1.2166643 +0.610808 1.2561682 +0.611208 1.2948848 +0.611608 1.3327776 +0.61200804 1.3698343 +0.61240804 1.4060202 +0.61280805 1.4413234 +0.61320806 1.4757109 +0.61360806 1.5091714 +0.61400807 1.5416737 +0.6144081 1.573207 +0.6148081 1.6037419 +0.6152081 1.6332685 +0.6156081 1.6617589 +0.6160081 1.689204 +0.6164081 1.715578 +0.6168081 1.7408723 +0.6172081 1.7650633 +0.61760813 1.7881429 +0.61800814 1.8100896 +0.61840814 1.8308963 +0.61880815 1.8505435 +0.61920816 1.8690246 +0.61960816 1.8863225 +0.6200082 1.9024315 +0.6204082 1.9173363 +0.6208082 1.9310324 +0.6212082 1.9435067 +0.6216082 1.9547553 +0.6220082 1.9647675 +0.6224082 1.9735401 +0.6228082 1.9810649 +0.6232082 1.9873394 +0.62360823 1.9923579 +0.62400824 1.9961184 +0.62440825 1.9986178 +0.62480825 1.9998549 +0.62520826 1.9998288 +0.62560827 1.9985394 +0.6260083 1.9959879 +0.6264083 1.9921752 +0.6268083 1.987104 +0.6272083 1.9807786 +0.6276083 1.9732009 +0.6280083 1.9643781 +0.6284083 1.954313 +0.6288083 1.9430152 +0.6292083 1.9304883 +0.62960833 1.916744 +0.63000834 1.9017869 +0.63040835 1.8856308 +0.63080835 1.8682812 +0.63120836 1.8497542 +0.63160837 1.830056 +0.6320084 1.8092048 +0.6324084 1.7872076 +0.6328084 1.764085 +0.6332084 1.7398446 +0.6336084 1.7145089 +0.6340084 1.6880864 +0.6344084 1.6606016 +0.6348084 1.6320637 +0.6352084 1.6024994 +0.63560843 1.5719182 +0.63600844 1.540349 +0.63640845 1.5078019 +0.63680845 1.4743074 +0.63720846 1.4398766 +0.63760847 1.4045415 +0.6380085 1.3683138 +0.6384085 1.3312274 +0.6388085 1.2932945 +0.6392085 1.2545506 +0.6396085 1.2150081 +0.6400085 1.1747044 +0.6404085 1.1336524 +0.6408085 1.0918908 +0.6412085 1.049433 +0.64160854 1.0063188 +0.64200854 0.9625625 +0.64240855 0.9182048 +0.64280856 0.8732604 +0.64320856 0.8277712 +0.64360857 0.7817522 +0.6440086 0.73524654 +0.6444086 0.6882693 +0.6448086 0.6408645 +0.6452086 0.5930477 +0.6456086 0.5448635 +0.6460086 0.4963279 +0.6464086 0.44748616 +0.6468086 0.39835432 +0.64720863 0.34897834 +0.64760864 0.29937443 +0.64800864 0.24958897 +0.64840865 0.19963829 +0.64880866 0.14956148 +0.64920866 9.9397816e-2 +0.6496087 4.9163744e-2 +0.6500087 -1.0937531e-3 +0.6504087 -5.135819e-2 +0.6508087 -0.10158256 +0.6512087 -0.15175039 +0.6516087 -0.20181474 +0.6520087 -0.25175923 +0.6524087 -0.30153713 +0.6528087 -0.3511321 +0.65320873 -0.40049776 +0.65360874 -0.44961792 +0.65400875 -0.49844667 +0.65440875 -0.546968 +0.65480876 -0.59513646 +0.65520877 -0.6429363 +0.6556088 -0.69032276 +0.6560088 -0.7372804 +0.6564088 -0.78376526 +0.6568088 -0.82976204 +0.6572088 -0.8752278 +0.6576088 -0.9201476 +0.6580088 -0.9644794 +0.6584088 -1.0082086 +0.6588088 -1.0512946 +0.65920883 -1.0937228 +0.65960884 -1.1354539 +0.66000885 -1.1764741 +0.66040885 -1.216745 +0.66080886 -1.2562534 +0.66120887 -1.2949624 +0.6616089 -1.3328592 +0.6620089 -1.3699085 +0.6624089 -1.406098 +0.6628089 -1.4413939 +0.6632089 -1.4757847 +0.6636089 -1.5092381 +0.6640089 -1.5417433 +0.6644089 -1.5732698 +0.6648089 -1.6038073 +0.66520894 -1.6333271 +0.66560894 -1.6618198 +0.66600895 -1.6892585 +0.66640896 -1.7156342 +0.66680896 -1.7409223 +0.66720897 -1.7651147 +0.667609 -1.7881885 +0.668009 -1.8101362 +0.668409 -1.8309373 +0.668809 -1.850585 +0.669209 -1.8690609 +0.669609 -1.8863589 +0.670009 -1.9024628 +0.670409 -1.9173675 +0.67080903 -1.9310609 +0.67120904 -1.9435326 +0.67160904 -1.9547784 +0.67200905 -1.964788 +0.67240906 -1.9735578 +0.67280906 -1.9810799 +0.6732091 -1.9873518 +0.6736091 -1.9923674 +0.6740091 -1.9961252 +0.6744091 -1.9986218 +0.6748091 -1.9998562 +0.6752091 -1.9998274 +0.6756091 -1.9985352 +0.6760091 -1.995981 +0.6764091 -1.9921656 +0.67680913 -1.9870925 +0.67720914 -1.9807634 +0.67760915 -1.9731842 +0.67800915 -1.9643575 +0.67840916 -1.9542915 +0.67880917 -1.9429893 +0.6792092 -1.9304618 +0.6796092 -1.9167128 +0.6800092 -1.9017553 +0.6804092 -1.8855944 +0.6808092 -1.8682449 +0.6812092 -1.8497126 +0.6816092 -1.830015 +0.6820092 -1.8091582 +0.6824092 -1.787162 +0.68280923 -1.7640334 +0.68320924 -1.7397944 +0.68360925 -1.7144526 +0.68400925 -1.6880318 +0.68440926 -1.6605407 +0.68480927 -1.632005 +0.6852093 -1.6024339 +0.6856093 -1.5718554 +0.6860093 -1.5402793 +0.6864093 -1.507735 +0.6868093 -1.4742335 +0.6872093 -1.439806 +0.6876093 -1.4044636 +0.6880093 -1.3682396 +0.6884093 -1.3311459 +0.68880934 -1.293217 +0.68920934 -1.2544653 +0.68960935 -1.2149273 +0.69000936 -1.1746159 +0.69040936 -1.1335686 +0.69080937 -1.0917991 +0.6912094 -1.0493463 +0.6916094 -1.0062243 +0.6920094 -0.9624666 +0.6924094 -0.9181076 +0.6928094 -0.873162 +0.6932094 -0.82767165 +0.6936094 -0.78165156 +0.6940094 -0.7351448 +0.69440943 -0.6881666 +0.69480944 -0.6407609 +0.69520944 -0.5929432 +0.69560945 -0.5447583 +0.69600946 -0.49622196 +0.69640946 -0.44737956 +0.6968095 -0.39824715 +0.6972095 -0.34887066 +0.6976095 -0.2992663 +0.6980095 -0.24948046 +0.6984095 -0.19952947 +0.6988095 -0.14946003 +0.6992095 -9.9288575e-2 +0.6996095 -4.9062036e-2 +0.7000095 1.2031237e-3 +0.70040953 5.1459894e-2 +0.70080954 0.10169179 +0.70120955 0.15185183 +0.70160955 0.20192356 +0.70200956 0.25186017 +0.70240957 0.30164525 +0.7028096 0.35123226 +0.7032096 0.4006049 +0.7036096 0.44971707 +0.7040096 0.4985526 +0.7044096 0.54706585 +0.7048096 0.59524083 +0.7052096 0.6430326 +0.7056096 0.69042546 +0.7060096 0.73737496 +0.70640963 0.78386587 +0.70680964 0.8298546 +0.70720965 0.87532616 +0.70760965 0.9202379 +0.70800966 0.96457523 +0.70840967 1.0082965 +0.7088097 1.0513875 +0.7092097 1.093808 +0.7096097 1.135544 +0.7100097 1.1765563 +0.7104097 1.2168318 +0.7108097 1.2563325 +0.7112097 1.2950457 +0.7116097 1.3329351 +0.7120097 1.3699881 +0.71240973 1.4061702 +0.71280974 1.4414697 +0.71320975 1.4758533 +0.71360976 1.5093099 +0.71400976 1.541813 +0.71440977 1.5733373 +0.7148098 1.6038727 +0.7152098 1.6333903 +0.7156098 1.6618806 +0.7160098 1.689317 +0.7164098 1.7156904 +0.7168098 1.7409762 +0.7172098 1.765166 +0.7176098 1.7882375 +0.7180098 1.8101827 +0.71840984 1.8309813 +0.71880984 1.8506265 +0.71920985 1.8690997 +0.71960986 1.8863952 +0.72000986 1.9024966 +0.72040987 1.9173986 +0.7208099 1.9310874 +0.7212099 1.9435583 +0.7216099 1.9547999 +0.7220099 1.9648083 +0.7224099 1.9735743 +0.7228099 1.981095 +0.7232099 1.9873631 +0.7236099 1.9923769 +0.72400993 1.9961315 +0.72440994 1.9986259 +0.72480994 1.9998574 +0.72520995 1.999826 +0.72560996 1.9985313 +0.72600996 1.9959741 +0.72641 1.9921566 +0.72681 1.9870801 +0.72721 1.9807494 +0.72761 1.9731665 +0.72801 1.9643384 +0.72841 1.9542682 +0.72881 1.9429651 +0.72921 1.9304332 +0.72961 1.9166838 +0.73001003 1.9017215 +0.73041004 1.8855605 +0.73081005 1.8682058 +0.73121005 1.8496739 +0.73161006 1.8299707 +0.73201007 1.8091148 +0.7324101 1.7871128 +0.7328101 1.7639855 +0.7332101 1.7397404 +0.7336101 1.7144002 +0.7340101 1.6879731 +0.7344101 1.660484 +0.7348101 1.6319417 +0.7352101 1.6023731 +0.7356101 1.5717877 +0.73601013 1.5402094 +0.73641014 1.5076631 +0.73681015 1.4741596 +0.73721015 1.43973 +0.73761016 1.4043858 +0.73801017 1.3681599 +0.7384102 1.3310642 +0.7388102 1.2931335 +0.7392102 1.2543802 +0.7396102 1.2148404 +0.7400102 1.1745274 +0.7404102 1.1334785 +0.7408102 1.0917075 +0.7412102 1.0492532 +0.7416102 1.0061299 +0.74201024 0.9623774 +0.74241024 0.9180105 +0.74281025 0.8730704 +0.74321026 0.82757205 +0.74361026 0.7815579 +0.74401027 0.7350431 +0.7444103 0.6880711 +0.7448103 0.6406573 +0.7452103 0.59284604 +0.7456103 0.54465306 +0.7460103 0.49612337 +0.7464103 0.44727296 +0.7468103 0.39814743 +0.7472103 0.34876296 +0.74761033 0.2991657 +0.74801034 0.24937195 +0.74841034 0.19942823 +0.74881035 0.14935096 +0.74921036 9.9186964e-2 +0.74961036 4.89527e-2 +0.7500104 -1.3048649e-3 +0.7504104 -5.156923e-2 +0.7508104 -0.10179339 +0.7512104 -0.15196088 +0.7516104 -0.20202479 +0.7520104 -0.25196865 +0.7524104 -0.30174583 +0.7528104 -0.3513399 +0.7532104 -0.4007046 +0.75361043 -0.44982365 +0.75401044 -0.49865112 +0.75441045 -0.54717106 +0.75481045 -0.595338 +0.75521046 -0.6431362 +0.75561047 -0.69052094 +0.7560105 -0.73747665 +0.7564105 -0.78395945 +0.7568105 -0.82995415 +0.7572105 -0.87541765 +0.7576105 -0.92033505 +0.7580105 -0.964671 +0.7584105 -1.008391 +0.7588105 -1.0514807 +0.7592105 -1.0938996 +0.75961053 -1.1356341 +0.76001054 -1.1766448 +0.76041055 -1.2169186 +0.76081055 -1.2564176 +0.76121056 -1.2951291 +0.76161057 -1.3330166 +0.7620106 -1.3700678 +0.7624106 -1.4062481 +0.7628106 -1.4415455 +0.7632106 -1.4759271 +0.7636106 -1.5093817 +0.7640106 -1.5418777 +0.7644106 -1.5734049 +0.7648106 -1.6039335 +0.7652106 -1.6334534 +0.76561064 -1.6619372 +0.76601064 -1.6893755 +0.76641065 -1.7157427 +0.76681066 -1.74103 +0.76721066 -1.765214 +0.76761067 -1.7882864 +0.7680107 -1.810226 +0.7684107 -1.8310252 +0.7688107 -1.850665 +0.7692107 -1.8691386 +0.7696107 -1.886429 +0.7700107 -1.9025303 +0.7704107 -1.9174275 +0.7708107 -1.9311159 +0.77121073 -1.9435823 +0.77161074 -1.954823 +0.77201074 -1.9648273 +0.77241075 -1.973592 +0.77281076 -1.9811089 +0.77321076 -1.9873754 +0.7736108 -1.9923857 +0.7740108 -1.9961383 +0.7744108 -1.9986296 +0.7748108 -1.9998587 +0.7752108 -1.9998245 +0.7756108 -1.9985272 +0.7760108 -1.9959676 +0.7764108 -1.9921468 +0.7768108 -1.9870685 +0.77721083 -1.9807342 +0.77761084 -1.9731498 +0.77801085 -1.9643178 +0.77841085 -1.9542465 +0.77881086 -1.9429393 +0.77921087 -1.9304066 +0.7796109 -1.9166526 +0.7800109 -1.9016876 +0.7804109 -1.885524 +0.7808109 -1.8681668 +0.7812109 -1.8496323 +0.7816109 -1.8299266 +0.7820109 -1.8090682 +0.7824109 -1.7870637 +0.7828109 -1.763934 +0.78321093 -1.7396865 +0.78361094 -1.7143439 +0.78401095 -1.6879145 +0.78441095 -1.660423 +0.78481096 -1.6318785 +0.78521097 -1.6023077 +0.785611 -1.5717201 +0.786011 -1.5401446 +0.786411 -1.5075914 +0.786811 -1.4740908 +0.787211 -1.4396541 +0.787611 -1.4043133 +0.788011 -1.3680801 +0.788411 -1.3309883 +0.788811 -1.29305 +0.78921103 -1.254301 +0.78961104 -1.2147536 +0.79001105 -1.174445 +0.79041106 -1.1333884 +0.79081106 -1.0916222 +0.79121107 -1.0491601 +0.7916111 -1.0060419 +0.7920111 -0.9622815 +0.7924111 -0.91792005 +0.7928111 -0.872972 +0.7932111 -0.8274794 +0.7936111 -0.78145725 +0.7940111 -0.73494846 +0.7944111 -0.6879684 +0.7948111 -0.6405609 +0.79521114 -0.5927416 +0.79561114 -0.5445552 +0.79601115 -0.49601743 +0.79641116 -0.4471738 +0.79681116 -0.39804026 +0.79721117 -0.3486628 +0.7976112 -0.29905757 +0.7980112 -0.24927099 +0.7984112 -0.1993194 +0.7988112 -0.14924951 +0.7992112 -9.9077724e-2 +0.7996112 -4.8850987e-2 +0.8000112 1.4142354e-3 +0.8004112 5.1670935e-2 +0.80081123 0.10190263 +0.80121124 0.15206233 +0.80161124 0.2021336 +0.80201125 0.25207716 +0.80241126 0.30185392 +0.80281126 0.35144758 +0.8032113 0.40081176 +0.8036113 0.44993022 +0.8040113 0.49875703 +0.8044113 0.5472762 +0.8048113 0.5954424 +0.8052113 0.64323974 +0.8056113 0.6906236 +0.8060113 0.73757833 +0.8064113 0.7840601 +0.80681133 0.8300536 +0.80721134 0.87551594 +0.80761135 0.92043215 +0.80801135 0.9647601 +0.80841136 1.0084854 +0.80881137 1.0515672 +0.8092114 1.0939912 +0.8096114 1.1357177 +0.8100114 1.1767333 +0.8104114 1.2169993 +0.8108114 1.2565027 +0.8112114 1.2952065 +0.8116114 1.3330982 +0.8120114 1.370142 +0.8124114 1.4063258 +0.81281143 1.441616 +0.81321144 1.476001 +0.81361145 1.5094484 +0.81401145 1.5419475 +0.81441146 1.5734677 +0.81481147 1.6039988 +0.8152115 1.6335121 +0.8156115 1.661998 +0.8160115 1.68943 +0.8164115 1.7157989 +0.8168115 1.74108 +0.8172115 1.7652653 +0.8176115 1.788332 +0.8180115 1.8102725 +0.8184115 1.8310661 +0.81881154 1.8507065 +0.81921154 1.8691748 +0.81961155 1.8864653 +0.82001156 1.9025617 +0.82041156 1.9174587 +0.82081157 1.9311423 +0.8212116 1.9436082 +0.8216116 1.9548445 +0.8220116 1.9648478 +0.8224116 1.9736085 +0.8228116 1.9811239 +0.8232116 1.9873868 +0.8236116 1.9923953 +0.8240116 1.9961451 +0.82441163 1.9986336 +0.82481164 1.99986 +0.82521164 1.9998231 +0.82561165 1.9985229 +0.82601166 1.9959607 +0.82641166 1.9921372 +0.8268117 1.9870561 +0.8272117 1.9807191 +0.8276117 1.9731319 +0.8280117 1.9642973 +0.8284117 1.9542233 +0.8288117 1.9429133 +0.8292117 1.930378 +0.8296117 1.9166213 +0.8300117 1.9016562 +0.83041173 1.8854876 +0.83081174 1.8681304 +0.83121175 1.8495907 +0.83161175 1.8298856 +0.83201176 1.8090215 +0.83241177 1.7870181 +0.8328118 1.7638824 +0.8332118 1.7396363 +0.8336118 1.7142875 +0.8340118 1.6878599 +0.8344118 1.660362 +0.8348118 1.6318196 +0.8352118 1.6022421 +0.8356118 1.5716572 +0.8360118 1.5400748 +0.83641183 1.5075245 +0.83681184 1.4740169 +0.83721185 1.4395834 +0.83761185 1.4042355 +0.83801186 1.3680059 +0.83841187 1.3309066 +0.8388119 1.2929724 +0.8392119 1.2542157 +0.8396119 1.2146728 +0.8400119 1.1743565 +0.8404119 1.1333046 +0.8408119 1.0915306 +0.8412119 1.0490736 +0.8416119 1.0059474 +0.8420119 0.96219236 +0.84241194 0.9178229 +0.84281194 0.8728805 +0.84321195 0.8273799 +0.84361196 0.7813636 +0.84401196 0.7348468 +0.84441197 0.6878728 +0.844812 0.6404573 +0.845212 0.5926444 +0.845612 0.5444499 +0.846012 0.49591148 +0.846412 0.4470672 +0.846812 0.39793307 +0.847212 0.3485551 +0.847612 0.29894942 +0.84801203 0.24916248 +0.84841204 0.19921057 +0.84881204 0.14914043 +0.84921205 9.896849e-2 +0.84961206 4.874165e-2 +0.85001206 -1.5236059e-3 +0.8504121 -5.1780272e-2 +0.8508121 -0.10201185 +0.8512121 -0.15217139 +0.8516121 -0.2022424 +0.8520121 -0.25217807 +0.8524121 -0.30196205 +0.8528121 -0.35154775 +0.8532121 -0.4009189 +0.8536121 -0.45002934 +0.85401213 -0.49886295 +0.85441214 -0.54737407 +0.85481215 -0.5955468 +0.85521215 -0.64333606 +0.85561216 -0.6907262 +0.85601217 -0.73767287 +0.8564122 -0.78416073 +0.8568122 -0.8301462 +0.8572122 -0.8756143 +0.8576122 -0.92052245 +0.8580122 -0.9648559 +0.8584122 -1.0085733 +0.8588122 -1.0516602 +0.8592122 -1.0940763 +0.8596122 -1.1358078 +0.86001223 -1.1768155 +0.86041224 -1.2170861 +0.86081225 -1.2565819 +0.86121225 -1.2952899 +0.86161226 -1.333174 +0.86201227 -1.3702216 +0.8624123 -1.4063982 +0.8628123 -1.4416919 +0.8632123 -1.4760696 +0.8636123 -1.5095202 +0.8640123 -1.5420122 +0.8644123 -1.5735352 +0.8648123 -1.6040595 +0.8652123 -1.6335752 +0.8656123 -1.6620547 +0.86601233 -1.6894885 +0.86641234 -1.7158512 +0.86681235 -1.7411339 +0.86721236 -1.7653131 +0.86761236 -1.788381 +0.86801237 -1.810319 +0.8684124 -1.8311101 +0.8688124 -1.850748 +0.8692124 -1.8692137 +0.8696124 -1.8865017 +0.8700124 -1.9025954 +0.8704124 -1.9174898 +0.8708124 -1.9311707 +0.8712124 -1.9436339 +0.8716124 -1.9548676 +0.87201244 -1.9648682 +0.87241244 -1.9736263 +0.87281245 -1.9811388 +0.87321246 -1.9873991 +0.87361246 -1.9924048 +0.8740125 -1.9961514 +0.8744125 -1.9986377 +0.8748125 -1.9998612 +0.8752125 -1.9998217 +0.8756125 -1.9985191 +0.8760125 -1.9959537 +0.8764125 -1.9921283 +0.8768125 -1.9870437 +0.8772125 -1.9807049 +0.87761253 -1.973114 +0.87801254 -1.9642781 +0.87841254 -1.9542 +0.87881255 -1.9428892 +0.87921256 -1.9303493 +0.87961257 -1.9165922 +0.8800126 -1.9016223 +0.8804126 -1.8854536 +0.8808126 -1.8680915 +0.8812126 -1.849552 +0.8816126 -1.8298414 +0.8820126 -1.8089781 +0.8824126 -1.786969 +0.8828126 -1.7638345 +0.8832126 -1.7395823 +0.88361263 -1.7142351 +0.88401264 -1.6878012 +0.88441265 -1.6603053 +0.88481265 -1.6317564 +0.88521266 -1.6021813 +0.88561267 -1.5715896 +0.8860127 -1.5400099 +0.8864127 -1.5074526 +0.8868127 -1.4739481 +0.8872127 -1.4395076 +0.8876127 -1.404163 +0.8880127 -1.3679261 +0.8884127 -1.3308307 +0.8888127 -1.292889 +0.8892127 -1.2541305 +0.88961273 -1.2145859 +0.89001274 -1.174268 +0.89041275 -1.1332145 +0.89081275 -1.091439 +0.89121276 -1.0489805 +0.89161277 -1.0058528 +0.8920128 -0.96209645 +0.8924128 -0.91772574 +0.8928128 -0.8727821 +0.8932128 -0.8272803 +0.8936128 -0.78126293 +0.8940128 -0.734745 +0.8944128 -0.6877701 +0.8948128 -0.6403537 +0.8952128 -0.59253997 +0.89561284 -0.54434466 +0.89601284 -0.49581292 +0.89641285 -0.4469606 +0.89681286 -0.39783338 +0.89721286 -0.34844738 +0.89761287 -0.29884884 +0.8980129 -0.24905396 +0.8984129 -0.19910935 +0.8988129 -0.14903137 +0.8992129 -9.886687e-2 +0.8996129 -4.863231e-2 +0.9000129 1.6253471e-3 +0.9004129 5.1889606e-2 +0.9008129 0.10211346 +0.90121293 0.15228043 +0.90161294 0.20234363 +0.90201294 0.25228658 +0.90241295 0.30206263 +0.90281296 0.35165542 +0.90321296 0.40101856 +0.903613 0.45013592 +0.904013 0.49896148 +0.904413 0.5474793 +0.904813 0.59564394 +0.905213 0.64343965 +0.905613 0.6908217 +0.906013 0.73777455 +0.906413 0.7842543 +0.906813 0.83024573 +0.90721303 0.8757058 +0.90761304 0.92061955 +0.90801305 0.9649451 +0.90841305 1.0086677 +0.90881306 1.0517467 +0.90921307 1.0941678 +0.9096131 1.1358916 +0.9100131 1.176904 +0.9104131 1.2171669 +0.9108131 1.256667 +0.9112131 1.2953732 +0.9116131 1.3332555 +0.9120131 1.3703012 +0.9124131 1.4064759 +0.9128131 1.4417677 +0.91321313 1.4761434 +0.91361314 1.5095919 +0.91401315 1.542082 +0.91441315 1.5736027 +0.91481316 1.6041248 +0.91521317 1.6336383 +0.9156132 1.6621155 +0.9160132 1.6895471 +0.9164132 1.7159073 +0.9168132 1.7411877 +0.9172132 1.7653645 +0.9176132 1.7884299 +0.9180132 1.8103621 +0.9184132 1.8311541 +0.9188132 1.8507864 +0.91921324 1.8692527 +0.91961324 1.8865354 +0.92001325 1.9026291 +0.92041326 1.9175186 +0.92081326 1.9311992 +0.92121327 1.9436579 +0.9216133 1.9548907 +0.9220133 1.9648871 +0.9224133 1.9736439 +0.9228133 1.9811528 +0.9232133 1.9874114 +0.9236133 1.9924138 +0.9240133 1.9961582 +0.9244133 1.9986415 +0.92481333 1.9998626 +0.92521334 1.9998202 +0.92561334 1.9985148 +0.92601335 1.9959472 +0.92641336 1.9921185 +0.92681336 1.9870322 +0.9272134 1.9806898 +0.9276134 1.9730974 +0.9280134 1.9642575 +0.9284134 1.9541783 +0.9288134 1.9428632 +0.9292134 1.9303228 +0.9296134 1.9165609 +0.9300134 1.9015907 +0.9304134 1.8854171 +0.93081343 1.8680551 +0.93121344 1.8495104 +0.93161345 1.8298004 +0.93201345 1.8089315 +0.93241346 1.7869233 +0.93281347 1.763783 +0.9332135 1.7395283 +0.9336135 1.7141788 +0.9340135 1.6877425 +0.9344135 1.6602443 +0.9348135 1.6316931 +0.9352135 1.6021158 +0.9356135 1.5715219 +0.9360135 1.5399401 +0.9364135 1.5073807 +0.93681353 1.4738742 +0.93721354 1.4394317 +0.93761355 1.4040852 +0.93801355 1.3678463 +0.93841356 1.330749 +0.93881357 1.2928056 +0.9392136 1.2540513 +0.9396136 1.214499 +0.9400136 1.1741856 +0.9404136 1.1331244 +0.9408136 1.0913537 +0.9412136 1.0488873 +0.9416136 1.0057648 +0.9420136 0.96200055 +0.9424136 0.9176353 +0.94281363 0.8726837 +0.94321364 0.82718766 +0.94361365 0.78116226 +0.94401366 0.73465043 +0.94441366 0.6876674 +0.94481367 0.6402573 +0.9452137 0.5924355 +0.9456137 0.5442468 +0.9460137 0.49570695 +0.9464137 0.44686142 +0.9468137 0.39772618 +0.9472137 0.3483472 +0.9476137 0.29874068 +0.9480137 0.248953 +0.9484137 0.19900051 +0.94881374 0.14892991 +0.94921374 9.875764e-2 +0.94961375 4.8530597e-2 +0.95001376 -1.7347175e-3 +0.95041376 -5.199131e-2 +0.9508138 -0.10222269 +0.9512138 -0.15238188 +0.9516138 -0.20245244 +0.9520138 -0.25238752 +0.9524138 -0.30217075 +0.9528138 -0.35175556 +0.9532138 -0.40112573 +0.9536138 -0.45023504 +0.9540138 -0.4990674 +0.95441383 -0.54757714 +0.95481384 -0.5957483 +0.95521384 -0.6435432 +0.95561385 -0.69092435 +0.95601386 -0.7378762 +0.95641387 -0.7843549 +0.9568139 -0.8303452 +0.9572139 -0.87580407 +0.9576139 -0.92071664 +0.9580139 -0.96504086 +0.9584139 -1.0087622 +0.9588139 -1.0518397 +0.9592139 -1.0942594 +0.9596139 -1.1359816 +0.9600139 -1.1769924 +0.96041393 -1.2172537 +0.96081394 -1.2567521 +0.96121395 -1.2954508 +0.96161395 -1.333337 +0.96201396 -1.3703754 +0.96241397 -1.4065537 +0.962814 -1.4418381 +0.963214 -1.4762172 +0.963614 -1.5096587 +0.964014 -1.5421516 +0.964414 -1.5736655 +0.964814 -1.6041901 +0.965214 -1.633697 +0.965614 -1.6621763 +0.966014 -1.6896015 +0.96641403 -1.7159635 +0.96681404 -1.7412378 +0.96721405 -1.7654159 +0.96761405 -1.7884754 +0.96801406 -1.8104086 +0.96841407 -1.8311951 +0.9688141 -1.8508279 +0.9692141 -1.8692888 +0.9696141 -1.8865718 +0.9700141 -1.9026605 +0.9704141 -1.9175497 +0.9708141 -1.9312257 +0.9712141 -1.9436836 +0.9716141 -1.9549122 +0.9720141 -1.9649075 +0.97241414 -1.9736603 +0.97281414 -1.9811678 +0.97321415 -1.9874227 +0.97361416 -1.9924232 +0.97401416 -1.9961646 +0.97441417 -1.9986454 +0.9748142 -1.9998637 +0.9752142 -1.9998188 +0.9756142 -1.9985108 +0.9760142 -1.9959403 +0.9764142 -1.9921095 +0.9768142 -1.9870197 +0.9772142 -1.9806746 +0.9776142 -1.9730796 +0.97801423 -1.964237 +0.97841424 -1.9541551 +0.97881424 -1.9428372 +0.97921425 -1.9302942 +0.97961426 -1.9165297 +0.98001426 -1.9015568 +0.9804143 -1.8853806 +0.9808143 -1.868016 +0.9812143 -1.8494687 +0.9816143 -1.8297563 +0.9820143 -1.8088849 +0.9824143 -1.7868742 +0.9828143 -1.7637314 +0.9832143 -1.7394781 +0.9836143 -1.7141224 +0.98401433 -1.6876879 +0.98441434 -1.6601833 +0.98481435 -1.6316344 +0.98521435 -1.6020503 +0.98561436 -1.5714589 +0.98601437 -1.5398703 +0.9864144 -1.5073138 +0.9868144 -1.4738003 +0.9872144 -1.439361 +0.9876144 -1.4040072 +0.9880144 -1.3677721 +0.9884144 -1.3306674 +0.9888144 -1.292728 +0.9892144 -1.2539661 +0.9896144 -1.2144182 +0.99001443 -1.1740971 +0.99041444 -1.1330405 +0.99081445 -1.0912621 +0.99121445 -1.0488007 +0.99161446 -1.0056703 +0.99201447 -0.9619114 +0.9924145 -0.91753817 +0.9928145 -0.87259215 +0.9932145 -0.8270881 +0.9936145 -0.78106856 +0.9940145 -0.7345487 +0.9944145 -0.6875719 +0.9948145 -0.6401537 +0.9952145 -0.5923383 +0.9956145 -0.54414153 +0.99601454 -0.4956084 +0.99641454 -0.4467548 +0.99681455 -0.39762646 +0.99721456 -0.3482395 +0.99761456 -0.29864007 +0.99801457 -0.24884449 +0.9984146 -0.19889928 +0.9988146 -0.14882085 +0.9992146 -9.86484e-2 +0.9996146 -4.842126e-2 diff --git a/testsuite/tests/programs/barton-mangler-bug/test.T b/testsuite/tests/programs/barton-mangler-bug/test.T new file mode 100644 index 0000000000..966b971ae9 --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/test.T @@ -0,0 +1,14 @@ +# Exhausts Hugs's heap (CAF leak) + +test('barton-mangler-bug', + [skip_if_fast, + extra_clean(['Basic.hi', 'Basic.o', + 'Expected.hi', 'Expected.o', + 'Main.hi', 'Main.o', + 'Physical.hi', 'Physical.o', + 'Plot.hi', 'Plot.o', + 'PlotExample.hi', 'PlotExample.o', + 'TypesettingTricks.hi', 'TypesettingTricks.o']), + omit_compiler_types(['hugs'])], + multimod_compile_and_run, ['Main', '']) + diff --git a/testsuite/tests/programs/cholewo-eval/Arr.lhs b/testsuite/tests/programs/cholewo-eval/Arr.lhs new file mode 100644 index 0000000000..799f493529 --- /dev/null +++ b/testsuite/tests/programs/cholewo-eval/Arr.lhs @@ -0,0 +1,395 @@ + +\begin{code} +module Arr ( + module Data.Array, + + safezipWith, safezip, + row, + sum1, map2, map3, + mapat, mapat2, mapat3, + mapindexed, mapindexed2, mapindexed3, +-- zipArr, sumArr, scaleArr, + arraySize, + + matvec, inner, + outerVector, + + Vector (Vector), toVector, fromVector, listVector, vectorList, vector, + zipVector, scaleVector, sumVector, vectorNorm2, vectorSize, + + Matrix (Matrix), toMatrix, fromMatrix, listMatrix, matrixList, matrix, + zipMatrix, scaleMatrix, sumMatrix, + + augment, + trMatrix, + +-- showsVector, +-- showsMatrix, +-- showsVecList, showsMatList +-- spy, +) where +import Data.Array +import Numeric +--import Trace +--import IOExtensions(unsafePerformIO) +\end{code} + +@Vector@ and @Matrix@ are 1-based arrays with read/show in form of Lists. + +\begin{code} +data Vector a = Vector (Array Int a) deriving (Eq) --, Show) + +toVector :: Array Int a -> Vector a +toVector x = Vector x + +fromVector :: Vector a -> Array Int a +fromVector (Vector x) = x + +instance Functor (Vector) where + fmap fn x = toVector (fmap fn (fromVector x)) + +{-instance Eq a => Eq (Vector a) where +-- (Vector x) == (Vector y) = x == y +-} + +instance Show a => Show (Vector a) where + showsPrec p x = showsPrec p (elems (fromVector x)) + +instance Read a => Read (Vector a) where + readsPrec p = readParen False + (\r -> [(listVector s, t) | (s, t) <- reads r]) + +instance Num b => Num (Vector b) where + (+) = zipVector "+" (+) + (-) = zipVector "-" (-) + negate = fmap negate + abs = fmap abs + signum = fmap signum +-- (*) = matMult -- works only for matrices! +-- fromInteger = fmap fromInteger +\end{code} + + +Convert a list to 1-based vector. + +\begin{code} +listVector :: [a] -> Vector a +listVector x = toVector (listArray (1,length x) x) + +vectorList :: Vector a -> [a] +vectorList = elems . fromVector + +vector (l,u) x | l == 1 = toVector (array (l,u) x) + | otherwise = error "vector: l != 1" + +zipVector :: String -> (b -> c -> d) -> Vector b -> Vector c -> Vector d +zipVector s f (Vector a) (Vector b) + | bounds a == bounds b = vector (bounds a) [(i, f (a!i) (b!i)) | i <- indices a] + | otherwise = error ("zipVector: " ++ s ++ ": unconformable arrays") + +scaleVector :: Num a => a -> Vector a -> Vector a +scaleVector a = fmap (* a) + +sumVector :: Num a => Vector a -> a +sumVector = sum . elems . fromVector + +vectorNorm2 :: Num a => Vector a -> a +vectorNorm2 x = inner x x + +vectorSize :: Vector a -> Int +vectorSize (Vector x) = rangeSize (bounds x) + +\end{code} + +============== + +\begin{code} +data Matrix a = Matrix (Array (Int, Int) a) deriving Eq + +toMatrix :: Array (Int, Int) a -> Matrix a +toMatrix x = Matrix x + +fromMatrix :: Matrix a -> Array (Int, Int) a +fromMatrix (Matrix x) = x + +instance Functor (Matrix) where + fmap fn x = toMatrix (fmap fn (fromMatrix x)) + +--instance Eq a => Eq (Matrix a) where +-- (Matrix x) == (Matrix y) = x == y + +instance Show a => Show (Matrix a) where + showsPrec p x = vertl (matrixList x) + +vertl [] = showString "[]" +vertl (x:xs) = showChar '[' . shows x . showl xs + where showl [] = showChar ']' + showl (x:xs) = showString ",\n" . shows x . showl xs + +instance Read a => Read (Matrix a) where + readsPrec p = readParen False + (\r -> [(listMatrix s, t) | (s, t) <- reads r]) + +instance Num b => Num (Matrix b) where + (+) = zipMatrix "+" (+) + (-) = zipMatrix "-" (-) + negate = fmap negate + abs = fmap abs + signum = fmap signum + x * y = toMatrix (matMult (fromMatrix x) (fromMatrix y)) -- works only for matrices! +-- fromInteger = fmap fromInteger +\end{code} + +Convert a nested list to a matrix. + +\begin{code} +listMatrix :: [[a]] -> Matrix a +listMatrix x = Matrix (listArray ((1, 1), (length x, length (x!!0))) (concat x)) + +matrixList :: Matrix a -> [[a]] +matrixList (Matrix x) = [ [x!(i,j) | j <- range (l',u')] | i <- range (l,u)] + where ((l,l'),(u,u')) = bounds x + +matrix ((l,l'),(u,u')) x | l == 1 && l' == 1 = toMatrix (array ((l,l'),(u,u')) x) + | otherwise = error "matrix: l != 1" + +zipMatrix :: String -> (b -> c -> d) -> Matrix b -> Matrix c -> Matrix d +zipMatrix s f (Matrix a) (Matrix b) + | bounds a == bounds b = matrix (bounds a) [(i, f (a!i) (b!i)) | i <- indices a] + | otherwise = error ("zipMatrix: " ++ s ++ ": unconformable arrays") + +scaleMatrix :: Num a => a -> Matrix a -> Matrix a +scaleMatrix a = fmap (* a) + +sumMatrix :: Num a => Matrix a -> a +sumMatrix = sum . elems . fromMatrix + +\end{code} + + +============ + +\begin{code} +safezipWith :: String -> (a -> b -> c) -> [a] -> [b] -> [c] +safezipWith _ _ [] [] = [] +safezipWith s f (x:xs) (y:ys) = f x y : safezipWith s f xs ys +safezipWith s _ _ _ = error ("safezipWith: " ++ s ++ ": unconformable vectors") + +safezip :: [a] -> [b] -> [(a,b)] +safezip = safezipWith "(,)" (,) + +trMatrix :: Matrix a -> Matrix a +trMatrix (Matrix x) = matrix ((l,l'),(u',u)) [((j,i), x!(i,j)) | j <- range (l',u'), i <- range (l,u)] + where ((l,l'),(u,u')) = bounds x + +row :: (Ix a, Ix b) => a -> Array (a,b) c -> Array b c +row i x = ixmap (l',u') (\j->(i,j)) x where ((l,l'),(u,u')) = bounds x + +zipArr :: (Ix a) => String -> (b -> c -> d) -> Array a b -> Array a c -> Array a d +zipArr s f a b | bounds a == bounds b = array (bounds a) [(i, f (a!i) (b!i)) | i <- indices a] + | otherwise = error ("zipArr: " ++ s ++ ": unconformable arrays") +\end{code} + +Valid only for b -> c -> b functions. + +\begin{code} +zipArr' :: (Ix a) => String -> (b -> c -> b) -> Array a b -> Array a c -> Array a b +zipArr' s f a b | bounds a == bounds b = accum f a (assocs b) + | otherwise = error ("zipArr': " ++ s ++ ": unconformable arrays") +\end{code} + +Overload arithmetical operators to work on lists. + +\begin{code} +instance Num a => Num [a] where + (+) = safezipWith "+" (+) + (-) = safezipWith "-" (-) + negate = fmap negate + abs = fmap abs + signum = fmap signum +-- (*) = undefined +-- fromInteger = undefined +\end{code} + +\begin{code} +sum1 :: (Num a) => [a] -> a +sum1 = foldl1 (+) + +--main = print (sum1 [[4,1,1], [5,1,2], [6,1,3,4]]) +\end{code} + +\begin{code} +map2 f = fmap (fmap f) +map3 f = fmap (map2 f) +\end{code} + +Map function f at position n only. Out of range indices are silently +ignored. + +\begin{code} +mapat n f x = mapat1 0 f x where + mapat1 _ _ [] = [] + mapat1 i f (x:xs) = (if i == n then f x else x) : mapat1 (i + 1) f xs + +mapat2 (i,j) = mapat i . mapat j +mapat3 (i,j,k) = mapat i . mapat j . mapat k + +-- main = print (mapat 2 (10+) [1,2,3,4]) +-- main = print (mapat2 (1,0) (1000+) ginp) +-- main = print (mapat3 (1,0,1) (1000+) gw) +\end{code} + +\begin{code} +mapindexed f x = mapindexed1 f 0 x where + mapindexed1 _ _ [] = [] + mapindexed1 f n (x:xs) = f n x : mapindexed1 f (n + 1) xs + +mapindexed2 f = mapindexed (\i -> mapindexed (\j -> f (i, j))) +mapindexed3 f = mapindexed (\i -> mapindexed (\j -> mapindexed (\k -> f (i, j, k)))) + +-- main = print (mapindexed (\x y -> mapat (10+) [1,2,3,4] y) [1,2,3,4]) +-- main = print (mapindexed2 (\(i,j) x -> 100*i + 10*j + x) ginp) +-- main = print (mapindexed3 (\(i,j,k) x -> 1000*i + 100*j + 10*k + x) gw) +\end{code} + + + +Overload arithmetical operators to work on arrays. + +\begin{code} +instance (Ix a, Show a, Num b) => Num (Array a b) where + (+) = zipArr "+" (+) + (-) = zipArr "-" (-) + negate = fmap negate + abs = fmap abs + signum = fmap signum +-- (*) = matMult -- works only for matrices! +-- fromInteger = map fromInteger +\end{code} + +\begin{xcode} +scaleArr :: (Ix i, Num a) => a -> Array i a -> Array i a +scaleArr a = fmap (*a) + +sumArr :: (Ix i, Num a) => Array i a -> a +sumArr = sum . elems +\end{xcode} + +\begin{code} +arraySize :: (Ix i) => Array i a -> Int +arraySize = rangeSize . bounds +\end{code} + +\begin{code} +matMult :: (Ix a, Ix b, Ix c, Num d) => + Array (a,b) d -> Array (b,c) d -> Array (a,c) d +matMult x y = array resultBounds + [((i,j), sum [x!(i,k) * y!(k,j) | k <- range (lj,uj)]) + | i <- range (li,ui), + j <- range (lj',uj') ] + where ((li,lj),(ui,uj)) = bounds x + ((li',lj'),(ui',uj')) = bounds y + resultBounds + | (lj,uj)==(li',ui') = ((li,lj'),(ui,uj')) + | otherwise = error "matMult: incompatible bounds" +\end{code} + + +Inner product of two vectors. + +\begin{code} +inner :: Num a => Vector a -> Vector a -> a +inner (Vector v) (Vector w) = if b == bounds w + then sum [v!i * w!i | i <- range b] + else error "nn.inner: inconformable vectors" + where b = bounds v +\end{code} + +Outer product of two vectors $v \dot w^\mathrm{T}$. + +\begin{code} +outerVector :: Num b => Vector b -> Vector b -> Matrix b +outerVector (Vector v) (Vector w) = if (l,u) == (l',u') + then matrix ((l,l'),(u,u')) [((i,j), v!i * w!j) | i <- range (l,u), j <- range (l',u')] + else error "nn.outer: inconformable vectors" + where ((l,u),(l',u')) = (bounds v, bounds w) +\end{code} + +\begin{code} +outerArr :: (Ix a, Num b) => Array a b -> Array a b -> Array (a,a) b +outerArr v w = if (l,u) == (l',u') + then array ((l,l'),(u,u')) [((i,j), v!i * w!j) | i <- range (l,u), j <- range (l',u')] + else error "nn.outer: inconformable vectors" + where ((l,u),(l',u')) = (bounds v, bounds w) +\end{code} + +Inner product of a matrix and a vector. + +\begin{code} +matvec :: (Ix a, Num b) => Array (a,a) b -> Array a b -> Array a b +matvec w x | bounds x == (l',u') = + array (l,u) [(i, sum [w!(i,j) * x!j | j <- range (l',u')]) + | i <- range (l,u)] + | otherwise = error "nn.matvec: inconformable arrays" + where ((l,l'),(u,u')) = bounds w +\end{code} + +Append to a vector. + +\begin{code} +augment :: (Num a) => Vector a -> a -> Vector a +augment (Vector x) y = Vector (array (a,b') ((b',y) : assocs x)) + where (a,b) = bounds x + b' = b + 1 +\end{code} + +Older approach (x!!i!!j fails in ghc-2.03). + +\begin{code} +toMatrix' :: [[a]] -> Matrix a +toMatrix' x = Matrix (array ((1,1),(u,u')) [((i,j), (x!!(i-1))!!(j-1)) + | i <- range (1,u), j <- range (1,u')]) + where (u,u') = (length x,length (x!!0)) +\end{code} + +Matrix 2D printout. + +\begin{code} +padleft :: Int -> String -> String +padleft n x | n <= length x = x + | otherwise = replicate (n - length x) ' ' ++ x +\end{code} + +\begin{code} +padMatrix :: RealFloat a => Int -> Matrix a -> Matrix String +padMatrix n x = let ss = fmap (\a -> showFFloat (Just n) a "") x + maxw = maximum (fmap length (elems (fromMatrix ss))) + in fmap (padleft maxw) ss +\end{code} + +\begin{xcode} +showsVector :: (RealFloat a) => Int -> Vector a -> ShowS +showsVector n x z1 = let x' = padArr n x + (l,u) = bounds x' in + concat (fmap (\ (i, s) -> if i == u then s ++ "\n" else s ++ " ") (assocs x')) ++ z1 +\end{xcode} + +\begin{xcode} +showsMatrix :: RealFloat a => Int -> Matrix a -> ShowS +showsMatrix n x z1 = let x' = padMatrix n x + ((l,l'),(u,u')) = bounds x' in + concat (fmap (\ ((i,j), s) -> if j == u' then s ++ "\n" else s ++ " ") (assocs x')) ++ z1 +\end{xcode} + +{- +showsVecList n x s = foldr (showsVector n) s x +showsMatList n x s = foldr (showsMatrix n) s x +-} + + +\begin{code} +--spy :: Show a => String -> a -> a +--spy msg x = trace ('<' : msg ++ ": " ++ shows x ">\n") x +--spy x = seq (unsafePerformIO (putStr ('<' : shows x ">\n"))) x +--spy x = traceShow "z" x +\end{code} diff --git a/testsuite/tests/programs/cholewo-eval/Main.lhs b/testsuite/tests/programs/cholewo-eval/Main.lhs new file mode 100644 index 0000000000..a2e5c8d25f --- /dev/null +++ b/testsuite/tests/programs/cholewo-eval/Main.lhs @@ -0,0 +1,109 @@ +\begin{code} +module Main(main) where +import Arr +\end{code} + +\begin{code} +type F a = Vector a -> a +type DF a = Vector a -> Vector a +\end{code} + +\begin{code} +data {-(Eval a) =>-} ScgData a = ScgData {k :: !Int, err :: !a, + w, p, r :: !(Vector a), + delta, pnorm2, lambda, lambdabar :: !a, + success :: !Bool} +\end{code} + +\begin{code} +calculate2order :: Floating a => ScgData a -> a -> DF a -> ScgData a +calculate2order d sigma1 df = + let pnorm2' = vectorNorm2 (p d) + sigma = sigma1 / (sqrt pnorm2') + s = scaleVector (1/sigma) (df ((w d) + (scaleVector sigma (p d))) - df (w d)) + in d {pnorm2 = pnorm2', delta = inner (p d) s} +\end{code} + +\begin{code} +hessPosDef :: (Floating a, Ord a) => ScgData a -> ScgData a +hessPosDef d = + let delta' = delta d + (lambda d - lambdabar d) * pnorm2 d {- step 3 -} + in if delta' <= 0 {- step 4 -} + then let lambdabar' = 2.0 * (lambda d - delta' / pnorm2 d) + in d {delta = -delta' + lambda d * pnorm2 d, lambda = lambdabar', lambdabar = lambdabar'} + else d {delta = delta'} +\end{code} + +\begin{code} +reduceError :: (Floating a, Ord a) => ScgData a -> DF a -> Bool -> a -> a -> ScgData a +reduceError d df restart bdelta mu = + let r' = negate (df (w d)) + p' = if restart + then r' + else let beta = (vectorNorm2 r' - inner r' (r d)) / mu + in r' + scaleVector beta (p d) + in d {p = p', r = r', lambda = if bdelta >= 0.75 then lambda d / 4 else lambda d + } +\end{code} + +\begin{code} +data ScgInput a = ScgInput (F a) (DF a) (Vector a) +\end{code} + +\begin{code} +scgIter :: (Floating a, Ord a) => ScgInput a -> [ScgData a] +scgIter (ScgInput f df w1) = + let p1 = negate (df w1) {- step 1 -} + r1 = p1 + pnorm21 = vectorNorm2 p1 + n = vectorSize w1 + sigma1 = 1.0e-4 + lambda1 = 1.0e-6 + err1 = f w1 + in iterate (\d -> + let d1 = if success d {- step 2 -} + then calculate2order d sigma1 df + else d + d2 = hessPosDef d1 + mu = inner (p d2) (r d2) {- step 5 -} + alpha = mu / (delta d2) + w' = (w d2) + scaleVector alpha (p d2) + err' = f w' + bdelta = 2 * (delta d2) * ((err d2) - err') / (mu^2) {- step 6 -} + success' = (bdelta >= 0) {- step 7 -} + restart = ((k d) `mod` n == 0) + d3 = if success' + then (reduceError (d2 {w = w'}) df restart bdelta mu) + {err = err', lambdabar = 0} + else d2 {lambdabar = lambda d2} + d4 = if bdelta < 0.25 {- step 8 -} + then d3 {lambda = (lambda d3) + (delta d3) * (1 - bdelta) / (pnorm2 d3)} + else d3 + in d4 {k = k d4 + 1, success = success'} + ) + (ScgData 1 err1 w1 p1 r1 0.0 pnorm21 lambda1 0.0 True) +\end{code} + +\begin{code} +rosenbrock = ScgInput + (\ (Vector x) -> 100 * (x!2 - x!1^2)^2 + (1 - x!1)^2) + (\ (Vector x) -> listVector [-2 * (1 - x!1) - 400 * x!1 * (x!2 - x!1^2), + 200 * (x!2 -x!1^2)]) + (listVector [-1,-1.0]) +\end{code} + + +\begin{code} +main = case vectorList (w ((scgIter rosenbrock)!!1)) of + [v1, v2] -> if (e1 `isSame` v1) && (e2 `isSame` v2) + then print (e1, e2) + else putStrLn ("Mismatch: " ++ show (e1, e2, v1, v2)) + vs -> putStrLn ("Wrong list length: " ++ show vs) + +e1, e2 :: Floating a => a +e1 = -0.5105811455265337 +e2 = -0.7565080326002654 + +isSame :: (Fractional a, Ord a) => a -> a -> Bool +x `isSame` y = abs (x - y) < 0.000000000000001 +\end{code} diff --git a/testsuite/tests/programs/cholewo-eval/Makefile b/testsuite/tests/programs/cholewo-eval/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/cholewo-eval/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/cholewo-eval/cholewo-eval.stdout b/testsuite/tests/programs/cholewo-eval/cholewo-eval.stdout new file mode 100644 index 0000000000..3ea84b769b --- /dev/null +++ b/testsuite/tests/programs/cholewo-eval/cholewo-eval.stdout @@ -0,0 +1 @@ +(-0.5105811455265337,-0.7565080326002654) diff --git a/testsuite/tests/programs/cholewo-eval/test.T b/testsuite/tests/programs/cholewo-eval/test.T new file mode 100644 index 0000000000..32efd68f7b --- /dev/null +++ b/testsuite/tests/programs/cholewo-eval/test.T @@ -0,0 +1,5 @@ +test('cholewo-eval', + [skip_if_fast, + extra_clean(['Main.hi', 'Main.o', 'Arr.hi', 'Arr.o'])], + multimod_compile_and_run, + ['Main', '']) diff --git a/testsuite/tests/programs/cvh_unboxing/Append.lhs b/testsuite/tests/programs/cvh_unboxing/Append.lhs new file mode 100644 index 0000000000..9c96ed6553 --- /dev/null +++ b/testsuite/tests/programs/cvh_unboxing/Append.lhs @@ -0,0 +1,142 @@ +\section{Versions of {\tt append}} + +\begin{code} +{-# LANGUAGE MagicHash #-} + +module Append where + +import GHC.Exts +import Types +\end{code} + +\begin{code} +append_ :: [a] -> [a] -> [a] +append_ (x:xs) ys = x : (append_ xs ys) +append_ [] ys = ys + +append_L_S_S :: String -> S Char -> S Char +append_L_S_S (a: b: c: d: e: a1: b1: c1: d1: e1: xs) ys + = S5 a b c d e (S5 a1 b1 c1 d1 e1 (append_L_S_S xs ys)) +append_L_S_S (a: b: c: d: e: xs) ys + = S5 a b c d e (append_L_S_S xs ys) +append_L_S_S (a: b: c: d: _) ys + = S4 a b c d ys +append_L_S_S (a: b: c: _) ys + = S3 a b c ys +append_L_S_S (a: b: _) ys + = S2 a b ys +append_L_S_S [a] ys + = S1 a ys +append_L_S_S [] ys = ys + +append_F_S_S :: F Char -> S Char -> S Char +append_F_S_S (F5 a b c d e (F5 a1 b1 c1 d1 e1 xs)) ys + = S5 a b c d e (S5 a1 b1 c1 d1 e1 (append_F_S_S xs ys)) +append_F_S_S (F5 a b c d e xs) ys + = S5 a b c d e (append_F_S_S xs ys) +append_F_S_S (F4 a b c d) ys + = S4 a b c d ys +append_F_S_S (F3 a b c) ys + = S3 a b c ys +append_F_S_S (F2 a b) ys + = S2 a b ys +append_F_S_S (F1 a) ys + = S1 a ys +append_F_S_S FN ys = ys + + +append_L_SC_SC :: String -> SC -> SC +append_L_SC_SC (C# a: C# b: C# c: C# d: + C# e: C# a1: C# b1: C# c1: + C# d1: C# e1: xs) ys + = SC5 a b c d e (SC5 a1 b1 c1 d1 e1 (append_L_SC_SC xs ys)) +append_L_SC_SC (C# a: C# b: C# c: C# d: + C# e: xs) ys + = SC5 a b c d e (append_L_SC_SC xs ys) +append_L_SC_SC (C# a: C# b: C# c: C# d: _) ys + = SC4 a b c d ys +append_L_SC_SC (C# a: C# b: C# c: _) ys + = SC3 a b c ys +append_L_SC_SC (C# a: C# b: _) ys + = SC2 a b ys +append_L_SC_SC [C# a] ys + = SC1 a ys +append_L_SC_SC [] ys = ys + + +append_FC_SC_SC :: FC -> SC -> SC +append_FC_SC_SC (FC5 a b c d e (FC5 a1 b1 c1 d1 e1 xs)) ys + = SC5 a b c d e (SC5 a1 b1 c1 d1 e1 (append_FC_SC_SC xs ys)) +append_FC_SC_SC (FC5 a b c d e xs) ys + = SC5 a b c d e (append_FC_SC_SC xs ys) +append_FC_SC_SC (FC4 a b c d) ys + = SC4 a b c d ys +append_FC_SC_SC (FC3 a b c) ys + = SC3 a b c ys +append_FC_SC_SC (FC2 a b) ys + = SC2 a b ys +append_FC_SC_SC (FC1 a) ys + = SC1 a ys +append_FC_SC_SC FCN ys = ys + +append_F_L_L :: F a -> [a] -> [a] +append_F_L_L (F5 a b c d e (F5 a1 b1 c1 d1 e1 xs)) ys + = a: b: c: d: e: a1: b1: c1: d1: e1: (append_F_L_L xs ys) +append_F_L_L (F5 a b c d e xs) ys + = a: b: c: d: e: (append_F_L_L xs ys) +append_F_L_L (F4 a b c d) ys = a: b: c: d: ys +append_F_L_L (F3 a b c) ys = a: b: c: ys +append_F_L_L (F2 a b) ys = a: b: ys +append_F_L_L (F1 a) ys = a: ys +append_F_L_L FN ys = ys + +append_S_L_L :: S Char -> String -> String +append_S_L_L (S5 a b c d e (S5 a1 b1 c1 d1 e1 xs)) ys + = a: b: c: d: e: a1: b1: c1: d1: e1: (append_S_L_L xs ys) +append_S_L_L (S5 a b c d e xs) ys + = a: b: c: d: e: (append_S_L_L xs ys) +append_S_L_L (S4 a b c d xs) ys + = a: b: c: d: (append_S_L_L xs ys) +append_S_L_L (S3 a b c xs) ys + = a: b: c: (append_S_L_L xs ys) +append_S_L_L (S2 a b xs) ys + = a: b: (append_S_L_L xs ys) +append_S_L_L (S1 a xs) ys + = a: (append_S_L_L xs ys) +append_S_L_L SN ys = ys + + +append_FC_L_L :: FC -> String -> String +append_FC_L_L (FC5 a b c d e (FC5 a1 b1 c1 d1 e1 xs)) ys + = C# a: C# b: C# c: C# d: C# e: C# a1: + C# b1: C# c1: C# d1: C# e1: + (append_FC_L_L xs ys) +append_FC_L_L (FC5 a b c d e xs) ys + = C# a: C# b: C# c: C# d: + C# e: (append_FC_L_L xs ys) +append_FC_L_L (FC4 a b c d) ys + = C# a: C# b: C# c: C# d: ys +append_FC_L_L (FC3 a b c) ys + = C# a: C# b: C# c: ys +append_FC_L_L (FC2 a b) ys = C# a: C# b: ys +append_FC_L_L (FC1 a) ys = C# a: ys +append_FC_L_L FCN ys = ys + +append_SC_L_L :: SC -> String -> String +append_SC_L_L (SC5 a b c d e (SC5 a1 b1 c1 d1 e1 xs)) ys + = C# a: C# b: C# c: C# d: C# e: C# a1: + C# b1: C# c1: C# d1: C# e1: + (append_SC_L_L xs ys) +append_SC_L_L (SC5 a b c d e xs) ys + = C# a: C# b: C# c: C# d: + C# e: (append_SC_L_L xs ys) +append_SC_L_L (SC4 a b c d xs) ys + = C# a: C# b: C# c: C# d: (append_SC_L_L xs ys) +append_SC_L_L (SC3 a b c xs) ys + = C# a: C# b: C# c: (append_SC_L_L xs ys) +append_SC_L_L (SC2 a b xs) ys + = C# a: C# b: (append_SC_L_L xs ys) +append_SC_L_L (SC1 a xs) ys + = C# a: (append_SC_L_L xs ys) +append_SC_L_L SCN ys = ys +\end{code} diff --git a/testsuite/tests/programs/cvh_unboxing/Main.lhs b/testsuite/tests/programs/cvh_unboxing/Main.lhs new file mode 100644 index 0000000000..be874a5258 --- /dev/null +++ b/testsuite/tests/programs/cvh_unboxing/Main.lhs @@ -0,0 +1,10 @@ +\begin{code} +{-# LANGUAGE MagicHash #-} + +import GHC.Exts +import Types +import Append + +main = putStr (show (append_FC_L_L (FC2 a_ a_) [])) + where a_ = case 'a' of { C# x -> x } +\end{code} diff --git a/testsuite/tests/programs/cvh_unboxing/Makefile b/testsuite/tests/programs/cvh_unboxing/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/cvh_unboxing/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/cvh_unboxing/README b/testsuite/tests/programs/cvh_unboxing/README new file mode 100644 index 0000000000..e80b542db6 --- /dev/null +++ b/testsuite/tests/programs/cvh_unboxing/README @@ -0,0 +1,4 @@ + +These files should typecheck and compile, but while they do +typecheck, they don't assemble without warnings, and when executed, +generate an illegal instruction. diff --git a/testsuite/tests/programs/cvh_unboxing/Types.lhs b/testsuite/tests/programs/cvh_unboxing/Types.lhs new file mode 100644 index 0000000000..cba89cf45b --- /dev/null +++ b/testsuite/tests/programs/cvh_unboxing/Types.lhs @@ -0,0 +1,63 @@ +\section{IDS types} + +\begin{code} +{-# LANGUAGE MagicHash #-} + +module Types where + +import GHC.Exts + +data F a = FN | F1 a | F2 a a | F3 a a a + | F4 a a a a + | F5 a a a a a (F a) + +data FI = FIN | FI1 Int# | FI2 Int# Int# | FI3 Int# Int# Int# + | FI4 Int# Int# Int# Int# + | FI5 Int# Int# Int# Int# Int# FI + +data FC = FCN | FC1 Char# | FC2 Char# Char# + | FC3 Char# Char# Char# + | FC4 Char# Char# Char# Char# + | FC5 Char# Char# Char# Char# Char# FC +\end{code} + +\begin{code} +data F2 a b = F2N | F21 a b | F22 a b a b | F23 a b a b a b + | F24 a b a b a b a b + | F25 a b a b a b a b a b (F2 a b) + +data F3 a b c = F3N | F31 a b c | F32 a b c a b c + | F33 a b c a b c a b c + | F34 a b c a b c a b c a b c + | F35 a b c a b c a b c a b c a b c (F3 a b c) + +data F3I = F3IN + | F3I1 Int# Int# Int# + | F3I2 Int# Int# Int# Int# Int# Int# + | F3I3 Int# Int# Int# Int# Int# Int# Int# Int# Int# + | F3I4 Int# Int# Int# Int# Int# Int# Int# Int# Int# + Int# Int# Int# + | F3I5 Int# Int# Int# Int# Int# Int# Int# Int# Int# + Int# Int# Int# Int# Int# Int# F3I +\end{code} + +\begin{code} +data S a = SN | S1 a (S a) | S2 a a (S a) | S3 a a a (S a) + | S4 a a a a (S a) + | S5 a a a a a (S a) + +data SI = SIN | SI1 Int# SI | SI2 Int# Int# SI + | SI3 Int# Int# Int# SI + | SI4 Int# Int# Int# Int# SI + | SI5 Int# Int# Int# Int# Int# SI + + +data SC = SCN | SC1 Char# SC | SC2 Char# Char# SC + | SC3 Char# Char# Char# SC + | SC4 Char# Char# Char# Char# SC + | SC5 Char# Char# Char# Char# Char# SC +\end{code} + + + + diff --git a/testsuite/tests/programs/cvh_unboxing/cvh_unboxing.stdout b/testsuite/tests/programs/cvh_unboxing/cvh_unboxing.stdout new file mode 100644 index 0000000000..742e221412 --- /dev/null +++ b/testsuite/tests/programs/cvh_unboxing/cvh_unboxing.stdout @@ -0,0 +1 @@ +"aa"
\ No newline at end of file diff --git a/testsuite/tests/programs/cvh_unboxing/test.T b/testsuite/tests/programs/cvh_unboxing/test.T new file mode 100644 index 0000000000..4208a7f2af --- /dev/null +++ b/testsuite/tests/programs/cvh_unboxing/test.T @@ -0,0 +1,10 @@ +setTestOpts(only_compiler_types(['ghc'])) + +test('cvh_unboxing', + [skip_if_fast, + extra_clean(['Append.hi', 'Append.o', + 'Main.hi', 'Main.o', + 'Types.hi', 'Types.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/fast2haskell/Fast2haskell.hs b/testsuite/tests/programs/fast2haskell/Fast2haskell.hs new file mode 100644 index 0000000000..da8789eca4 --- /dev/null +++ b/testsuite/tests/programs/fast2haskell/Fast2haskell.hs @@ -0,0 +1,50 @@ + module Fast2haskell ( + Complex_type, Array_type, Assoc_type, Descr_type, + abortstr, delay, fix, force, iff, iffrev, seQ, + pair, strcmp, + entier, + land_i, lnot_i, lor_i, lshift_i, rshift_i, + descr, + destr_update, indassoc, lowbound, tabulate, upbound, update, valassoc) where { + import Data.Bits; +-- import Word2; + import Data.Word; + import Data.Complex; -- 1.3 + import Data.Array; -- 1.3 +-- import Data.Int ( Num(fromInt) ); + type Complex_type = Complex Double; + type Array_type b = Array Int b; + type Assoc_type a = (Int, a); + type Descr_type = (Int,Int); + abortstr str = error ("abort:"++str); -- abort (OtherError str); + delay x = abortstr "delay not implemented"; + fix f = fix_f where {fix_f = f fix_f}; + force x = x; -- error "force not implemented"; + iff b x y = if b then x else y; + iffrev y x b = if b then x else y; + seQ x y = x `seq` y; + pair [] = False; + pair x = True; + strcmp :: [Char] -> [Char] -> Bool; + strcmp x y = x == y; + entier x = fromIntegral (floor x); + land_i :: Int -> Int -> Int; + land_i x y = x .&. y; + lnot_i :: Int -> Int; + lnot_i x = complement x; + lor_i :: Int -> Int -> Int; + lor_i x y = x .|. y; + lshift_i :: Int -> Int -> Int; + lshift_i x y = x `shiftL` y; + rshift_i :: Int -> Int -> Int; + rshift_i x y = x `shiftR` y; + write x = abortstr "write not implemented"; + descr l u = (l,u); + destr_update ar i x = ar // [(i,x)]; + indassoc (i,v) = i; + lowbound (l,u) = l; + tabulate f (l,u) = listArray (l,u) [f i | i <- [l..u]]; + upbound (l,u) = u; + update ar i x = ar // [(i,x)]; + valassoc (i,v) = v; + } diff --git a/testsuite/tests/programs/fast2haskell/Main.hs b/testsuite/tests/programs/fast2haskell/Main.hs new file mode 100644 index 0000000000..9c4a21dece --- /dev/null +++ b/testsuite/tests/programs/fast2haskell/Main.hs @@ -0,0 +1,296 @@ +module Main (main) -- TEST +where { +import Fast2haskell; +import Data.Complex;--1.3 +import Data.Array;--1.3 + + c_eps=(5.00000e-06 :: Double); + c_t=True; + c_f=False; + c_input=(0 :: Int); + f_main a_n= + let { + r_x=[(a_tf,(++) (show a_i) ((++) "\t" a_str))|(a_i,(a_tf,a_str))<-f_zip2 (enumFrom (1 :: Int)) c_testlist]; + r_noks=[(++) a_str "\n"|(a_tf,a_str)<-r_x,not a_tf]; + r_oks=[(++) a_str "\n"|(a_tf,a_str)<-r_x,a_tf] + } in + if (((>) :: (Int -> Int -> Bool)) a_n (0 :: Int)) + then (f_onetest ((!!) c_testlist (((-) :: (Int -> Int -> Int)) a_n (1 :: Int)))) + else + ((++) (show (length r_oks)) ((++) " tests passed and " ((++) (show + (length r_noks)) ((++) " failed\n" (c_concat r_noks))))); + f_onetest (True,a_str)=(++) "true: " ((++) a_str "\n"); + f_onetest (False,a_str)=(++) "false: " ((++) a_str "\n"); + f_booltest a_name True a_try= + if a_try + then (True,"") + else + (False,(++) a_name "\tok: true is: false"); + f_booltest a_name False a_try= + if (not a_try) + then (True,"") + else + (False,(++) a_name "\tok: false is: true"); + f_inttest a_name a_ok a_try= + if (((==) :: (Int -> Int -> Bool)) a_ok a_try) + then (True,"") + else + (False,(++) a_name ((++) "\tok: " ((++) (show a_ok) ((++) "\tis: " + (show a_try))))); + f_chartest a_name a_ok a_try= + if (((==) :: (Int -> Int -> Bool)) (fromEnum a_ok) (fromEnum a_try)) + then (True,"") + else + (False,(++) a_name ((++) "\tok: " ((++) ((:) a_ok []) ((++) "\tis: " + ((:) a_try []))))); + f_strtest a_name a_ok a_try= + if (strcmp a_ok a_try) + then (True,"") + else + (False,(++) a_name ((++) "\tok: " ((++) a_ok ((++) "\tis: " a_try)))); + f_linttest a_name a_ok a_try= + if (f_lintcmp a_ok a_try) + then (True,"") + else + (False,(++) a_name ((++) "\tok: " ((++) (f_showlint a_ok) ((++) "\tis: " + (f_showlint a_try))))); + f_doubtest a_name a_ok a_try= + if (((<=) :: (Double -> Double -> Bool)) (f_abs (((-) :: (Double -> Double -> Double)) a_ok a_try)) c_eps) + then (True,"") + else + (False,(++) a_name ((++) "\tok: " ((++) (show a_ok) ((++) "\tis: " + ((++) (show a_try) ((++) "\tok-is: " (show (((-) :: (Double -> Double -> Double)) a_ok a_try)))))))); + f_alternating a_l=(:) (0 :: Int) ((:) (1 :: Int) a_l); + f_showlint []=[]; + f_showlint a_xs=tail (c_concat [(++) "," (show a_x)|a_x<-a_xs]); + f_lintcmp [] []=True; + f_lintcmp [] a_ys=False; + f_lintcmp a_xs []=False; + f_lintcmp (a_x:a_xs) (a_y:a_ys)= + if (((==) :: (Int -> Int -> Bool)) a_x a_y) + then (f_lintcmp a_xs a_ys) + else + False; + c_testlist=(:) (f_inttest "array" (10 :: Int) ((!) (array (descr (1 :: Int) (3 :: Int)) ((:) + ((,) (3 :: Int) (30 :: Int)) ((:) ((,) (1 :: Int) (10 :: Int)) ((:) ((,) (2 :: Int) (20 :: Int)) [])))) (1 :: Int))) ((:) (f_inttest "array" (20 :: Int) + ((!) (array (descr (1 :: Int) (3 :: Int)) ((:) ((,) (3 :: Int) (30 :: Int)) ((:) ((,) (1 :: Int) (10 :: Int)) + ((:) ((,) (2 :: Int) (20 :: Int)) [])))) (2 :: Int))) ((:) (f_inttest "array" (30 :: Int) ((!) (array (descr (1 :: Int) (3 :: Int)) + ((:) ((,) (3 :: Int) (30 :: Int)) [])) (3 :: Int))) ((:) (f_inttest "assoc" (0 :: Int) (indassoc ((,) (0 :: Int) (1 :: Int)))) ((:) + (f_inttest "assoc" (1 :: Int) (valassoc ((,) (0 :: Int) (1 :: Int)))) ((:) (f_inttest "bounds" (1 :: Int) (lowbound (bounds + (listArray (descr (1 :: Int) (3 :: Int)) ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) []))))))) ((:) (f_inttest "bounds" (3 :: Int) + (upbound (bounds (listArray (descr (1 :: Int) (3 :: Int)) ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) []))))))) + ((:) (f_inttest "descr" (0 :: Int) (lowbound (descr (0 :: Int) (1 :: Int)))) ((:) (f_inttest "descr" (1 :: Int) (upbound + (descr (0 :: Int) (1 :: Int)))) ((:) (f_linttest "destr_update" ((:) (1 :: Int) ((:) (0 :: Int) ((:) (3 :: Int) []))) (elems + (destr_update (listArray (descr (0 :: Int) (2 :: Int)) ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) [])))) (1 :: Int) (0 :: Int)))) ((:) + (f_linttest "destr_update" ((:) (0 :: Int) []) (elems (destr_update (listArray (descr (0 :: Int) (0 :: Int)) ((:) (1 :: Int) + ((:) (2 :: Int) ((:) (3 :: Int) [])))) (0 :: Int) (0 :: Int)))) ((:) (f_linttest "elems" ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) []))) + (elems (listArray (descr (0 :: Int) (2 :: Int)) ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) [])))))) ((:) + (f_linttest "elems" ((:) (1 :: Int) []) (elems (listArray (descr (0 :: Int) (0 :: Int)) ((:) (1 :: Int) ((:) (2 :: Int) + ((:) (3 :: Int) [])))))) ((:) (f_inttest "indassoc" (0 :: Int) (indassoc ((,) (0 :: Int) (1 :: Int)))) ((:) (f_linttest "listarray" + ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) []))) (elems (listArray (descr (0 :: Int) (2 :: Int)) ((:) (1 :: Int) + ((:) (2 :: Int) ((:) (3 :: Int) [])))))) ((:) (f_linttest "listarray" ((:) (1 :: Int) []) (elems (listArray + (descr (0 :: Int) (0 :: Int)) ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) [])))))) ((:) (f_inttest "lowbound" (0 :: Int) (lowbound + (descr (0 :: Int) (1 :: Int)))) ((:) (f_inttest "subscript" (1 :: Int) ((!) (tabulate ((!!) ((:) (1 :: Int) + ((:) (2 :: Int) ((:) (3 :: Int) [])))) (descr (0 :: Int) (2 :: Int))) (0 :: Int))) ((:) (f_inttest "subscript" (2 :: Int) ((!) (tabulate + ((!!) ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) [])))) (descr (0 :: Int) (2 :: Int))) (1 :: Int))) ((:) (f_inttest "subscript" (3 :: Int) + ((!) (tabulate ((!!) ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) [])))) (descr (0 :: Int) (2 :: Int))) (2 :: Int))) + ((:) (f_linttest "tabulate" ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) []))) (elems (tabulate + ((!!) ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) [])))) (descr (0 :: Int) (2 :: Int))))) ((:) (f_linttest "tabulate" + ((:) (1 :: Int) []) (elems (tabulate ((!!) ((:) (1 :: Int) ((:) (2 :: Int) ((:) (3 :: Int) [])))) + (descr (0 :: Int) (0 :: Int))))) ((:) (f_inttest "upbound" (1 :: Int) (upbound (descr (0 :: Int) (1 :: Int)))) ((:) (f_inttest "valassoc" (1 :: Int) + (valassoc ((,) (0 :: Int) (1 :: Int)))) ((:) (f_doubtest "add_x" (0.00000 :: Double) (realPart (((+) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (0.00000 :: Double) (0.00000 :: Double)) + ((:+) (0.00000 :: Double) (0.00000 :: Double))))) ((:) (f_doubtest "add_x" (0.00000 :: Double) (imagPart (((+) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (0.00000 :: Double) (0.00000 :: Double)) ((:+) (0.00000 :: Double) (0.00000 :: Double))))) + ((:) (f_doubtest "add_x" (4.00000 :: Double) (realPart (((+) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (1.00000 :: Double) (2.00000 :: Double)) ((:+) (3.00000 :: Double) (4.00000 :: Double))))) ((:) + (f_doubtest "add_x" (6.00000 :: Double) (imagPart (((+) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (1.00000 :: Double) (2.00000 :: Double)) ((:+) (3.00000 :: Double) (4.00000 :: Double))))) ((:) (f_doubtest "complex" (1.00000 :: Double) + (realPart ((:+) (1.00000 :: Double) (0.00000 :: Double)))) ((:) (f_doubtest "complex" (1.00000 :: Double) (imagPart ((:+) (0.00000 :: Double) (1.00000 :: Double)))) ((:) + (f_doubtest "complex_im" (0.00000 :: Double) (imagPart ((:+) (1.00000 :: Double) (0.00000 :: Double)))) ((:) (f_doubtest "complex_im" (1.00000 :: Double) (imagPart ((:+) (0.00000 :: Double) (1.00000 :: Double)))) + ((:) (f_doubtest "complex_re" (0.00000 :: Double) (realPart ((:+) (0.00000 :: Double) (1.00000 :: Double)))) ((:) (f_doubtest "complex_re" (1.00000 :: Double) (realPart + ((:+) (1.00000 :: Double) (0.00000 :: Double)))) ((:) (f_doubtest "mul_x" (0.00000 :: Double) (realPart (((*) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (0.00000 :: Double) (0.00000 :: Double)) ((:+) (0.00000 :: Double) (0.00000 :: Double))))) + ((:) (f_doubtest "mul_x" (0.00000 :: Double) (imagPart (((*) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (0.00000 :: Double) (0.00000 :: Double)) ((:+) (0.00000 :: Double) (0.00000 :: Double))))) ((:) + (f_doubtest "mul_x" (((negate) :: (Double -> Double)) (5.00000 :: Double)) (realPart (((*) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (1.00000 :: Double) (2.00000 :: Double)) ((:+) (3.00000 :: Double) (4.00000 :: Double))))) ((:) + (f_doubtest "mul_x" (10.0000 :: Double) (imagPart (((*) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (1.00000 :: Double) (2.00000 :: Double)) ((:+) (3.00000 :: Double) (4.00000 :: Double))))) ((:) (f_doubtest "sub_x" (0.00000 :: Double) + (realPart (((-) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (0.00000 :: Double) (0.00000 :: Double)) ((:+) (0.00000 :: Double) (0.00000 :: Double))))) ((:) (f_doubtest "sub_x" (0.00000 :: Double) (imagPart + (((-) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (0.00000 :: Double) (0.00000 :: Double)) ((:+) (0.00000 :: Double) (0.00000 :: Double))))) ((:) (f_doubtest "sub_x" (((negate) :: (Double -> Double)) (2.00000 :: Double)) (realPart + (((-) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (1.00000 :: Double) (2.00000 :: Double)) ((:+) (3.00000 :: Double) (4.00000 :: Double))))) ((:) (f_doubtest "sub_x" (((negate) :: (Double -> Double)) (2.00000 :: Double)) (imagPart + (((-) :: (Complex_type -> Complex_type -> Complex_type)) ((:+) (1.00000 :: Double) (2.00000 :: Double)) ((:+) (3.00000 :: Double) (4.00000 :: Double))))) ((:) (f_inttest "seq" (2 :: Int) (seq (enumFrom (1 :: Int)) (2 :: Int))) + ((:) (f_strtest "**" "this one" "should fail") []))))))))))))))))))))))))))))))))))))))))))); + f_abs a_x= + if (((<=) :: (Double -> Double -> Bool)) a_x (0.00000 :: Double)) + then (((negate) :: (Double -> Double)) a_x) + else + a_x; + c_and=f_foldr (&&) True; + f_cjustify a_n a_s= + let { + r_margin=((-) :: (Int -> Int -> Int)) a_n (length a_s); + r_lmargin=((div) :: (Int -> Int -> Int)) r_margin (2 :: Int); + r_rmargin=((-) :: (Int -> Int -> Int)) r_margin r_lmargin + } in (++) (f_spaces r_lmargin) ((++) a_s (f_spaces r_rmargin)); + c_concat=f_foldr (++) []; + f_const a_x a_y=a_x; + f_digit a_x= + if (((<=) :: (Int -> Int -> Bool)) (fromEnum '0') (fromEnum a_x)) + then (((<=) :: (Int -> Int -> Bool)) (fromEnum a_x) (fromEnum '9')) + else + False; + f_drop 0 a_x=a_x; + f_drop a_n (a_a:a_x)=f_drop (((-) :: (Int -> Int -> Int)) a_n (1 :: Int)) a_x; + f_drop a_n a_x=[]; + f_dropwhile a_f []=[]; + f_dropwhile a_f (a_a:a_x)= + if (a_f a_a) + then (f_dropwhile a_f a_x) + else + ((:) a_a a_x); + c_e=((exp) :: (Double -> Double)) (1.00000 :: Double); + f_filter a_f a_x=[a_a|a_a<-a_x,a_f a_a]; + f_foldl a_op a_r []=a_r; + f_foldl a_op a_r (a_a:a_x)= + let { + f_strict a_f a_x=seq a_x (a_f a_x) + } in f_foldl a_op (f_strict a_op a_r a_a) a_x; + f_foldl1 a_op (a_a:a_x)=f_foldl a_op a_a a_x; + f_foldr a_op a_r []=a_r; + f_foldr a_op a_r (a_a:a_x)=a_op a_a (f_foldr a_op a_r a_x); + f_foldr1 a_op (a_a:[])=a_a; + f_foldr1 a_op (a_a:a_b:a_x)=a_op a_a (f_foldr1 a_op ((:) a_b a_x)); + f_fst (a_a,a_b)=a_a; + f_id a_x=a_x; + f_index a_x= + let { + f_f a_n []=[]; + f_f a_n (a_a:a_x)=(:) a_n (f_f (((+) :: (Int -> Int -> Int)) a_n (1 :: Int)) a_x) + } in f_f (0 :: Int) a_x; + f_init (a_a:a_x)= + if (null a_x) + then [] + else + ((:) a_a (f_init a_x)); + f_iterate a_f a_x=(:) a_x (f_iterate a_f (a_f a_x)); + f_last a_x=(!!) a_x (((-) :: (Int -> Int -> Int)) (length a_x) (1 :: Int)); + f_lay []=[]; + f_lay (a_a:a_x)=(++) a_a ((++) "\n" (f_lay a_x)); + f_layn a_x= + let { + f_f a_n []=[]; + f_f a_n (a_a:a_x)=(++) (f_rjustify (4 :: Int) (show a_n)) ((++) ") " ((++) a_a ((++) "\n" + (f_f (((+) :: (Int -> Int -> Int)) a_n (1 :: Int)) a_x)))) + } in f_f (1 :: Int) a_x; + f_letter a_c= + if ( + if (((<=) :: (Int -> Int -> Bool)) (fromEnum 'a') (fromEnum a_c)) + then (((<=) :: (Int -> Int -> Bool)) (fromEnum a_c) (fromEnum 'z')) + else + False) + then True + else + if (((<=) :: (Int -> Int -> Bool)) (fromEnum 'A') (fromEnum a_c)) + then (((<=) :: (Int -> Int -> Bool)) (fromEnum a_c) (fromEnum 'Z')) + else + False; + f_limit (a_a:a_b:a_x)= + if (((==) :: (Double -> Double -> Bool)) a_a a_b) + then a_a + else + (f_limit ((:) a_b a_x)); + f_lines []=[]; + f_lines (a_a:a_x)= + let { + r_xs= + if (pair a_x) + then (f_lines a_x) + else + ((:) [] []) + } in + if (((==) :: (Int -> Int -> Bool)) (fromEnum a_a) (fromEnum '\o012')) + then ((:) [] (f_lines a_x)) + else + ((:) ((:) a_a (head r_xs)) (tail r_xs)); + f_ljustify a_n a_s=(++) a_s (f_spaces (((-) :: (Int -> Int -> Int)) a_n (length a_s))); + f_map a_f a_x=[a_f a_a|a_a<-a_x]; + f_map2 a_f a_x a_y=[a_f a_a a_b|(a_a,a_b)<-f_zip2 a_x a_y]; + f_max a_xs=f_foldl1 f_max2 a_xs; + f_max2 a_a a_b= + if (((>=) :: (Int -> Int -> Bool)) a_a a_b) + then a_a + else + a_b; + f_member a_x a_a=c_or (f_map (flip ((==) :: (Int -> Int -> Bool)) a_a) a_x); + f_merge [] a_y=a_y; + f_merge (a_a:a_x) []=(:) a_a a_x; + f_merge (a_a:a_x) (a_b:a_y)= + if (((<=) :: (Int -> Int -> Bool)) a_a a_b) + then ((:) a_a (f_merge a_x ((:) a_b a_y))) + else + ((:) a_b (f_merge ((:) a_a a_x) a_y)); + f_min a_xs=f_foldl1 f_min2 a_xs; + f_min2 a_a a_b= + if (((>) :: (Int -> Int -> Bool)) a_a a_b) + then a_b + else + a_a; + f_mkset []=[]; + f_mkset (a_a:a_x)=(:) a_a (f_filter (flip ((/=) :: (Int -> Int -> Bool)) a_a) (f_mkset a_x)); + c_or=f_foldr (||) False; + c_pi=((*) :: (Double -> Double -> Double)) (4.00000 :: Double) (((atan) :: (Double -> Double)) (1.00000 :: Double)); + f_postfix a_a a_x=(++) a_x ((:) a_a []); + c_product=f_foldl ((*) :: (Int -> Int -> Int)) (1 :: Int); + f_rep a_n a_x=f_take a_n (f_repeat a_x); + f_repeat a_x=(:) a_x (f_repeat a_x); + c_reverse=f_foldl (flip (:)) []; + f_rjustify a_n a_s=(++) (f_spaces (((-) :: (Int -> Int -> Int)) a_n (length a_s))) a_s; + f_scan a_op= + let { + f_g a_r []=(:) a_r []; + f_g a_r (a_a:a_x)=(:) a_r (f_g (a_op a_r a_a) a_x) + } in f_g; + f_snd (a_a,a_b)=a_b; + f_sort a_x= + let { + r_n=length a_x; + r_n2=((div) :: (Int -> Int -> Int)) r_n (2 :: Int) + } in + if (((<=) :: (Int -> Int -> Bool)) r_n (1 :: Int)) + then a_x + else + (f_merge (f_sort (f_take r_n2 a_x)) (f_sort (f_drop r_n2 a_x))); + f_spaces a_n=f_rep a_n ' '; + f_subtract a_x a_y=((-) :: (Int -> Int -> Int)) a_y a_x; + c_sum=f_foldl ((+) :: (Int -> Int -> Int)) (0 :: Int); +data + T_sys_message=F_Stdout [Char] | F_Stderr [Char] | F_Tofile [Char] [Char] | F_Closefile [Char] | F_Appendfile [Char] | F_System [Char] | F_Exit Int; + f_take 0 a_x=[]; + f_take a_n (a_a:a_x)=(:) a_a (f_take (((-) :: (Int -> Int -> Int)) a_n (1 :: Int)) a_x); + f_take a_n a_x=[]; + f_takewhile a_f []=[]; + f_takewhile a_f (a_a:a_x)= + if (a_f a_a) + then ((:) a_a (f_takewhile a_f a_x)) + else + []; + f_transpose a_x= + let { + r_x'=f_takewhile pair a_x + } in + if (null r_x') + then [] + else + ((:) (f_map head r_x') (f_transpose (f_map tail r_x'))); + f_until a_f a_g a_x= + if (a_f a_x) + then a_x + else + (f_until a_f a_g (a_g a_x)); + f_zip2 (a_a:a_x) (a_b:a_y)=(:) (a_a,a_b) (f_zip2 a_x a_y); + f_zip2 a_x a_y=[]; + f_zip3 (a_a:a_x) (a_b:a_y) (a_c:a_z)=(:) (a_a,a_b,a_c) (f_zip3 a_x a_y a_z); + f_zip3 a_x a_y a_z=[]; + f_zip4 (a_a:a_w) (a_b:a_x) (a_c:a_y) (a_d:a_z)=(:) (a_a,a_b,a_c,a_d) (f_zip4 a_w a_x a_y a_z); + f_zip4 a_w a_x a_y a_z=[]; + f_zip5 (a_a:a_v) (a_b:a_w) (a_c:a_x) (a_d:a_y) (a_e:a_z)=(:) (a_a,a_b,a_c,a_d,a_e) (f_zip5 a_v a_w a_x a_y a_z); + f_zip5 a_v a_w a_x a_y a_z=[]; + f_zip6 (a_a:a_u) (a_b:a_v) (a_c:a_w) (a_d:a_x) (a_e:a_y) (a_f:a_z)=(:) (a_a,a_b,a_c,a_d,a_e,a_f) (f_zip6 a_u a_v a_w a_x a_y a_z); + f_zip6 a_u a_v a_w a_x a_y a_z=[]; + f_zip (a_x,a_y)=f_zip2 a_x a_y; + main = putStr (f_main c_input) +} diff --git a/testsuite/tests/programs/fast2haskell/Makefile b/testsuite/tests/programs/fast2haskell/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/fast2haskell/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/fast2haskell/fast2haskell.stdout b/testsuite/tests/programs/fast2haskell/fast2haskell.stdout new file mode 100644 index 0000000000..2f493161d6 --- /dev/null +++ b/testsuite/tests/programs/fast2haskell/fast2haskell.stdout @@ -0,0 +1,2 @@ +43 tests passed and 1 failed +44 ** ok: this one is: should fail diff --git a/testsuite/tests/programs/fast2haskell/test.T b/testsuite/tests/programs/fast2haskell/test.T new file mode 100644 index 0000000000..a730ffdfe2 --- /dev/null +++ b/testsuite/tests/programs/fast2haskell/test.T @@ -0,0 +1,8 @@ + +test('fast2haskell', + [skip_if_fast, + extra_clean(['Main.hi', 'Main.o', + 'Fast2haskell.hi', 'Fast2haskell.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/fun_insts/Main.hs b/testsuite/tests/programs/fun_insts/Main.hs new file mode 100644 index 0000000000..fece8c9c47 --- /dev/null +++ b/testsuite/tests/programs/fun_insts/Main.hs @@ -0,0 +1,26 @@ +-- !!! Defines functions as an instance of Num + +module Main where + +instance (Eq a, Eq b) => Eq (a->b) + + +instance Show (a->b) where + show f = "<<function>>" + +instance (Num a, Num b) => Num (a->b) where + f + g = \x -> f x + g x + negate f = \x -> - (f x) + f * g = \x -> f x * g x + fromInteger n = \x -> fromInteger n + +ss :: Float -> Float +cc :: Float -> Float +tt :: Float -> Float + +ss = sin * sin +cc = cos * cos +tt = ss + cc +-- sin**2 + cos**2 = 1 + +main = putStrLn ((show (tt 0.4))++ " "++(show (tt 1.652))) diff --git a/testsuite/tests/programs/fun_insts/Makefile b/testsuite/tests/programs/fun_insts/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/fun_insts/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/fun_insts/fun_insts.stdout b/testsuite/tests/programs/fun_insts/fun_insts.stdout new file mode 100644 index 0000000000..7886e5523c --- /dev/null +++ b/testsuite/tests/programs/fun_insts/fun_insts.stdout @@ -0,0 +1 @@ +1.0 1.0 diff --git a/testsuite/tests/programs/fun_insts/test.T b/testsuite/tests/programs/fun_insts/test.T new file mode 100644 index 0000000000..5151488038 --- /dev/null +++ b/testsuite/tests/programs/fun_insts/test.T @@ -0,0 +1,6 @@ + +test('fun_insts', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/galois_raytrace/CSG.hs b/testsuite/tests/programs/galois_raytrace/CSG.hs new file mode 100644 index 0000000000..ba37a17b25 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/CSG.hs @@ -0,0 +1,16 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module CSG(module Construct, + module Geometry, + module Intersections, + module Interval, + module Misc) where + +import Construct +import Geometry +import Intersections +import Interval +import Misc diff --git a/testsuite/tests/programs/galois_raytrace/Construct.hs b/testsuite/tests/programs/galois_raytrace/Construct.hs new file mode 100644 index 0000000000..90dbc60f9e --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Construct.hs @@ -0,0 +1,265 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Construct + ( Surface (..) + , Face (..) + , CSG (..) + , Texture + , Transform + , union, intersect, difference + , plane, sphere, cube, cylinder, cone + , transform + , translate, translateX, translateY, translateZ + , scale, scaleX, scaleY, scaleZ, uscale + , rotateX, rotateY, rotateZ + , eye, translateEye + , rotateEyeX, rotateEyeY, rotateEyeZ + ) where + +import Geometry + +-- In each case, we model the surface by a point and a pair of tangent vectors. +-- This gives us enough information to determine the surface +-- normal at that point, which is all that is required by the current +-- illumination model. We can't just save the surface normal because +-- that isn't preserved by transformations. + +data Surface + = Planar Point Vector Vector + | Spherical Point Vector Vector + | Cylindrical Point Vector Vector + | Conic Point Vector Vector + deriving Show + +data Face + = PlaneFace + | SphereFace + | CubeFront + | CubeBack + | CubeLeft + | CubeRight + | CubeTop + | CubeBottom + | CylinderSide + | CylinderTop + | CylinderBottom + | ConeSide + | ConeBase + deriving Show + +data CSG a + = Plane a + | Sphere a + | Cylinder a + | Cube a + | Cone a + | Transform Matrix Matrix (CSG a) + | Union (CSG a) (CSG a) + | Intersect (CSG a) (CSG a) + | Difference (CSG a) (CSG a) + | Box Box (CSG a) + deriving (Show) + +-- the data returned for determining surface texture +-- the Face tells which face of a primitive this is +-- the Point is the point of intersection in object coordinates +-- the a is application-specific texture information +type Texture a = (Face, Point, a) + +union, intersect, difference :: CSG a -> CSG a -> CSG a + +union p@(Box b1 _) q@(Box b2 _) = Box (mergeBox b1 b2) (Union p q) +union p q = Union p q + +-- rather pessimistic +intersect p@(Box b1 _) q@(Box b2 _) = Box (mergeBox b1 b2) (Intersect p q) +intersect p q = Intersect p q + +difference (Box b1 p) q = Box b1 (Difference p q) +-- no need to box again inside +-- difference p@(Box b1 _) q = Box b1 (Difference p q) +difference p q = Difference p q + +mkBox b p = Box b p + +plane, sphere, cube, cylinder, cone :: a -> CSG a + +plane = Plane +sphere s = + mkBox (B (-1 - epsilon) (1 + epsilon) + (-1 - epsilon) (1 + epsilon) + (-1 - epsilon) (1 + epsilon)) (Sphere s) +cone s = + mkBox (B (-1 - epsilon) (1 + epsilon) + ( - epsilon) (1 + epsilon) + (-1 - epsilon) (1 + epsilon)) (Cone s) +cube s = + mkBox (B (- epsilon) (1 + epsilon) + (- epsilon) (1 + epsilon) + (- epsilon) (1 + epsilon)) (Cube s) +cylinder s = + mkBox (B (-1 - epsilon) (1 + epsilon) + ( - epsilon) (1 + epsilon) + (-1 - epsilon) (1 + epsilon)) (Cylinder s) + +---------------------------- +-- Object transformations +---------------------------- + +type Transform = (Matrix, Matrix) + +transform :: Transform -> CSG a -> CSG a + +transform (m, m') (Transform mp mp' p) = Transform (multMM m mp) (multMM mp' m') p +transform mm' (Union p q) = Union (transform mm' p) (transform mm' q) +transform mm' (Intersect p q) = Intersect (transform mm' p) (transform mm' q) +transform mm' (Difference p q) = Difference (transform mm' p) (transform mm' q) +transform mm'@(m,_) (Box box p) = Box (transformBox m box) (transform mm' p) +transform (m, m') prim = Transform m m' prim + +translate :: Coords -> CSG a -> CSG a +translateX, translateY, translateZ :: Double -> CSG a -> CSG a + +translate xyz = transform $ transM xyz +translateX x = translate (x, 0, 0) +translateY y = translate (0, y, 0) +translateZ z = translate (0, 0, z) + +scale :: Coords -> CSG a -> CSG a +scaleX, scaleY, scaleZ, uscale :: Double -> CSG a -> CSG a + +scale xyz = transform $ scaleM xyz +scaleX x = scale (x, 1, 1) +scaleY y = scale (1, y, 1) +scaleZ z = scale (1, 1, z) +uscale u = scale (u,u,u) + +rotateX, rotateY, rotateZ :: Radian -> CSG a -> CSG a + +rotateX a = transform $ rotxM a +rotateY a = transform $ rotyM a +rotateZ a = transform $ rotzM a + +unit = matrix + ( ( 1.0, 0.0, 0.0, 0.0 ), + ( 0.0, 1.0, 0.0, 0.0 ), + ( 0.0, 0.0, 1.0, 0.0 ), + ( 0.0, 0.0, 0.0, 1.0 ) ) + +transM (x, y, z) + = ( matrix + ( ( 1, 0, 0, x ), + ( 0, 1, 0, y ), + ( 0, 0, 1, z ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( 1, 0, 0, -x ), + ( 0, 1, 0, -y ), + ( 0, 0, 1, -z ), + ( 0, 0, 0, 1 ) ) ) + +scaleM (x, y, z) + = ( matrix + ( ( x', 0, 0, 0 ), + ( 0, y', 0, 0 ), + ( 0, 0, z', 0 ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( 1/x', 0, 0, 0 ), + ( 0, 1/y', 0, 0 ), + ( 0, 0, 1/z', 0 ), + ( 0, 0, 0, 1 ) ) ) + where x' = nonZero x + y' = nonZero y + z' = nonZero z + +rotxM t + = ( matrix + ( ( 1, 0, 0, 0 ), + ( 0, cos t, -sin t, 0 ), + ( 0, sin t, cos t, 0 ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( 1, 0, 0, 0 ), + ( 0, cos t, sin t, 0 ), + ( 0, -sin t, cos t, 0 ), + ( 0, 0, 0, 1 ) ) ) + +rotyM t + = ( matrix + ( ( cos t, 0, sin t, 0 ), + ( 0, 1, 0, 0 ), + ( -sin t, 0, cos t, 0 ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( cos t, 0, -sin t, 0 ), + ( 0, 1, 0, 0 ), + ( sin t, 0, cos t, 0 ), + ( 0, 0, 0, 1 ) ) ) + +rotzM t + = ( matrix + ( ( cos t, -sin t, 0, 0 ), + ( sin t, cos t, 0, 0 ), + ( 0, 0, 1, 0 ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( cos t, sin t, 0, 0 ), + ( -sin t, cos t, 0, 0 ), + ( 0, 0, 1, 0 ), + ( 0, 0, 0, 1 ) ) ) + +------------------- +-- Eye transformations + +-- These are used to specify placement of the eye. +-- `eye' starts out at (0, 0, -1). +-- These are implemented as inverse transforms of the model. +------------------- + +eye :: Transform +translateEye :: Coords -> Transform -> Transform +rotateEyeX, rotateEyeY, rotateEyeZ :: Radian -> Transform -> Transform + +eye = (unit, unit) +translateEye xyz (eye1, eye2) + = (multMM m1 eye1, multMM eye2 m2) + where (m1, m2) = transM xyz +rotateEyeX t (eye1, eye2) + = (multMM m1 eye1, multMM eye2 m2) + where (m1, m2) = rotxM t +rotateEyeY t (eye1, eye2) + = (multMM m1 eye1, multMM eye2 m2) + where (m1, m2) = rotyM t +rotateEyeZ t (eye1, eye2) + = (multMM m1 eye1, multMM eye2 m2) + where (m1, m2) = rotzM t + +------------------- +-- Bounding boxes +------------------- + +mergeBox (B x11 x12 y11 y12 z11 z12) (B x21 x22 y21 y22 z21 z22) = + B (x11 `min` x21) (x12 `max` x22) + (y11 `min` y21) (y12 `max` y22) + (z11 `min` z21) (z12 `max` z22) + +transformBox t (B x1 x2 y1 y2 z1 z2) + = (B (foldr1 min (map xCoord pts')) + (foldr1 max (map xCoord pts')) + (foldr1 min (map yCoord pts')) + (foldr1 max (map yCoord pts')) + (foldr1 min (map zCoord pts')) + (foldr1 max (map zCoord pts'))) + where pts' = map (multMP t) pts + pts = [point x1 y1 z1, + point x1 y1 z2, + point x1 y2 z1, + point x1 y2 z2, + point x2 y1 z1, + point x2 y1 z2, + point x2 y2 z1, + point x2 y2 z2] diff --git a/testsuite/tests/programs/galois_raytrace/Data.hs b/testsuite/tests/programs/galois_raytrace/Data.hs new file mode 100644 index 0000000000..11e12ab79f --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Data.hs @@ -0,0 +1,408 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Data where + +import Array + +import CSG +import Geometry +import Illumination +import Primitives +import Surface + +import Debug.Trace + +-- Now the parsed (expresssion) language + +type Name = String + +type Code = [GMLToken] + +data GMLToken + -- All these can occur in parsed code + = TOp GMLOp + | TId Name + | TBind Name + | TBool Bool + | TInt Int + | TReal Double + | TString String + | TBody Code + | TArray Code + | TApply + | TIf + -- These can occur in optimized/transformed code + -- NONE (yet!) + + +instance Show GMLToken where + showsPrec p (TOp op) = shows op + showsPrec p (TId id) = showString id + showsPrec p (TBind id) = showString ('/' : id) + showsPrec p (TBool bool) = shows bool + showsPrec p (TInt i) = shows i + showsPrec p (TReal d) = shows d + showsPrec p (TString s) = shows s + showsPrec p (TBody code) = shows code + showsPrec p (TArray code) = showString "[ " + . foldr (\ a b -> a . showChar ' ' . b) id (map shows code) + . showString "]" + showsPrec p (TApply) = showString "apply" + showsPrec p (TIf) = showString "if" + + showList code = showString "{ " + . foldr (\ a b -> a . showChar ' ' . b) id (map shows code) + . showString "}" + + +-- Now the value language, used inside the interpreter + +type Stack = [GMLValue] + +data GMLValue + = VBool !Bool + | VInt !Int + | VReal !Double + | VString String + | VClosure Env Code + | VArray (Array Int GMLValue) -- FIXME: Haskell array + -- uses the interpreter version of point + | VPoint { xPoint :: !Double + , yPoint :: !Double + , zPoint :: !Double + } + -- these are abstract to the interpreter + | VObject Object + | VLight Light + -- This is an abstract object, used by the abstract interpreter + | VAbsObj AbsObj + + +-- There are only *3* basic abstract values, +-- and the combinators also. + +data AbsObj + = AbsFACE + | AbsU + | AbsV + deriving (Show) + +instance Show GMLValue where + showsPrec p value = showString (showStkEle value) + +showStkEle :: GMLValue -> String +showStkEle (VBool b) = show b ++ " :: Bool" +showStkEle (VInt i) = show i ++ " :: Int" +showStkEle (VReal r) = show r ++ " :: Real" +showStkEle (VString s) = show s ++ " :: String" +showStkEle (VClosure {}) = "<closure> :: Closure" +showStkEle (VArray arr) + = "<array (" ++ show (succ (snd (bounds arr))) ++ " elements)> :: Array" +showStkEle (VPoint x y z) = "(" ++ show x + ++ "," ++ show y + ++ "," ++ show z + ++ ") :: Point" +showStkEle (VObject {}) = "<Object> :: Object" +showStkEle (VLight {}) = "<Light> :: Object" +showStkEle (VAbsObj vobs) = "{{ " ++ show vobs ++ "}} :: AbsObj" + +-- An abstract environment + +newtype Env = Env [(Name, GMLValue)] deriving Show + +emptyEnv :: Env +emptyEnv = Env [] + +extendEnv :: Env -> Name -> GMLValue -> Env +extendEnv (Env e) n v = Env ((n, v):e) + +lookupEnv :: Env -> Name -> Maybe GMLValue +lookupEnv (Env e) n = lookup n e + +-- All primitive operators +-- +-- There is no Op_apply, Op_false, Op_true and Op_if +-- (because they appear explcitly in the rules). + +data GMLOp + = Op_acos + | Op_addi + | Op_addf + | Op_asin + | Op_clampf + | Op_cone + | Op_cos + | Op_cube + | Op_cylinder + | Op_difference + | Op_divi + | Op_divf + | Op_eqi + | Op_eqf + | Op_floor + | Op_frac + | Op_get + | Op_getx + | Op_gety + | Op_getz + | Op_intersect + | Op_length + | Op_lessi + | Op_lessf + | Op_light + | Op_modi + | Op_muli + | Op_mulf + | Op_negi + | Op_negf + | Op_plane + | Op_point + | Op_pointlight + | Op_real + | Op_render + | Op_rotatex + | Op_rotatey + | Op_rotatez + | Op_scale + | Op_sin + | Op_sphere + | Op_spotlight + | Op_sqrt + | Op_subi + | Op_subf + | Op_trace -- non standard, for debugging GML programs + | Op_translate + | Op_union + | Op_uscale + deriving (Eq,Ord,Ix,Bounded) + +instance Show GMLOp where + showsPrec _ op = showString (opNameTable ! op) + + +------------------------------------------------------------------------------ + +-- And how we use the op codes (there names, there interface) + +-- These keywords include, "apply", "if", "true" and "false", +-- they are not parsed as operators, but are +-- captured by the parser as a special case. + +keyWords :: [String] +keyWords = [ kwd | (kwd,_,_) <- opcodes ] + +-- Lookup has to look from the start (or else...) +opTable :: [(Name,GMLToken)] +opTable = [ (kwd,op) | (kwd,op,_) <- opcodes ] + +opNameTable :: Array GMLOp Name +opNameTable = array (minBound,maxBound) + [ (op,name) | (name,TOp op,_) <- opcodes ] + +undef = error "undefined function" +image = error "undefined function: talk to image group" + +-- typically, its best to have *one* opcode table, +-- so that mis-alignments do not happen. + +opcodes :: [(String,GMLToken,PrimOp)] +opcodes = + [ ("apply", TApply, error "incorrect use of apply") + , ("if", TIf, error "incorrect use of if") + , ("false", TBool False, error "incorrect use of false") + , ("true", TBool True, error "incorrect use of true") + ] ++ map (\ (a,b,c) -> (a,TOp b,c)) + -- These are just invocation, any coersions need to occur between here + -- and before arriving at the application code (like deg -> rad). + [ ("acos", Op_acos, Real_Real (rad2deg . acos)) + , ("addi", Op_addi, Int_Int_Int (+)) + , ("addf", Op_addf, Real_Real_Real (+)) + , ("asin", Op_asin, Real_Real (rad2deg . asin)) + , ("clampf", Op_clampf, Real_Real clampf) + , ("cone", Op_cone, Surface_Obj cone) + , ("cos", Op_cos, Real_Real (cos . deg2rad)) + , ("cube", Op_cube, Surface_Obj cube) + , ("cylinder", Op_cylinder, Surface_Obj cylinder) + , ("difference", Op_difference, Obj_Obj_Obj difference) + , ("divi", Op_divi, Int_Int_Int (ourQuot)) + , ("divf", Op_divf, Real_Real_Real (/)) + , ("eqi", Op_eqi, Int_Int_Bool (==)) + , ("eqf", Op_eqf, Real_Real_Bool (==)) + , ("floor", Op_floor, Real_Int floor) + , ("frac", Op_frac, Real_Real (snd . properFraction)) + , ("get", Op_get, Arr_Int_Value ixGet) + , ("getx", Op_getx, Point_Real (\ x y z -> x)) + , ("gety", Op_gety, Point_Real (\ x y z -> y)) + , ("getz", Op_getz, Point_Real (\ x y z -> z)) + , ("intersect", Op_intersect, Obj_Obj_Obj intersect) + , ("length", Op_length, Arr_Int (succ . snd . bounds)) + , ("lessi", Op_lessi, Int_Int_Bool (<)) + , ("lessf", Op_lessf, Real_Real_Bool (<)) + , ("light", Op_light, Point_Color_Light light) + , ("modi", Op_modi, Int_Int_Int (ourRem)) + , ("muli", Op_muli, Int_Int_Int (*)) + , ("mulf", Op_mulf, Real_Real_Real (*)) + , ("negi", Op_negi, Int_Int negate) + , ("negf", Op_negf, Real_Real negate) + , ("plane", Op_plane, Surface_Obj plane) + , ("point", Op_point, Real_Real_Real_Point VPoint) + , ("pointlight", Op_pointlight, Point_Color_Light pointlight) + , ("real", Op_real, Int_Real fromIntegral) + , ("render", Op_render, Render $ render eye) + , ("rotatex", Op_rotatex, Obj_Real_Obj (\ o d -> rotateX (deg2rad d) o)) + , ("rotatey", Op_rotatey, Obj_Real_Obj (\ o d -> rotateY (deg2rad d) o)) + , ("rotatez", Op_rotatez, Obj_Real_Obj (\ o d -> rotateZ (deg2rad d) o)) + , ("scale", Op_scale, Obj_Real_Real_Real_Obj (\ o x y z -> scale (x,y,z) o)) + , ("sin", Op_sin, Real_Real (sin . deg2rad)) + , ("sphere", Op_sphere, Surface_Obj sphere') -- see comment at end of file + , ("spotlight", Op_spotlight, Point_Point_Color_Real_Real_Light mySpotlight) + , ("sqrt", Op_sqrt, Real_Real ourSqrt) + , ("subi", Op_subi, Int_Int_Int (-)) + , ("subf", Op_subf, Real_Real_Real (-)) + , ("trace", Op_trace, Value_String_Value mytrace) + , ("translate", Op_translate, Obj_Real_Real_Real_Obj (\ o x y z -> translate (x,y,z) o)) + , ("union", Op_union, Obj_Obj_Obj union) + , ("uscale", Op_uscale, Obj_Real_Obj (\ o r -> uscale r o)) + ] + +-- This enumerate all possible ways of calling the fixed primitives + +-- The datatype captures the type at the *interp* level, +-- the type of the functional is mirrored on this (using Haskell types). + +data PrimOp + + -- 1 argument + = Int_Int (Int -> Int) + | Real_Real (Double -> Double) + | Point_Real (Double -> Double -> Double -> Double) + | Surface_Obj (SurfaceFn Color Double -> Object) + | Real_Int (Double -> Int) + | Int_Real (Int -> Double) + | Arr_Int (Array Int GMLValue -> Int) + + -- 2 arguments + | Int_Int_Int (Int -> Int -> Int) + | Int_Int_Bool (Int -> Int -> Bool) + | Real_Real_Real (Double -> Double -> Double) + | Real_Real_Bool (Double -> Double -> Bool) + | Arr_Int_Value (Array Int GMLValue -> Int -> GMLValue) + + -- Many arguments, typically image mangling + + | Obj_Obj_Obj (Object -> Object -> Object) + | Point_Color_Light (Coords -> Color -> Light) + | Real_Real_Real_Point (Double -> Double -> Double -> GMLValue) + | Obj_Real_Obj (Object -> Double -> Object) + | Obj_Real_Real_Real_Obj (Object -> Double -> Double -> Double -> Object) + | Value_String_Value (GMLValue -> String -> GMLValue) + + | Point_Point_Color_Real_Real_Light + (Coords -> Coords -> Color -> Radian -> Radian -> Light) + -- And finally render + | Render (Color -> [Light] -> Object -> Int -> Double -> Int -> Int -> String -> IO ()) + +data Type + = TyBool + | TyInt + | TyReal + | TyString + | TyCode + | TyArray + | TyPoint + | TyObject + | TyLight + | TyAlpha + | TyAbsObj + deriving (Eq,Ord,Ix,Bounded) + +typeTable = + [ ( TyBool, "Bool") + , ( TyInt, "Int") + , ( TyReal, "Real") + , ( TyString, "String") + , ( TyCode, "Code") + , ( TyArray, "Array") + , ( TyPoint, "Point") + , ( TyObject, "Object") + , ( TyLight, "Light") + , ( TyAlpha, "<anything>") + , ( TyAbsObj, "<abs>") + ] + +typeNames = array (minBound,maxBound) typeTable + +instance Show Type where + showsPrec _ op = showString (typeNames ! op) + +getPrimOpType :: PrimOp -> [Type] +getPrimOpType (Int_Int _) = [TyInt] +getPrimOpType (Real_Real _) = [TyReal] +getPrimOpType (Point_Real _) = [TyPoint] +getPrimOpType (Surface_Obj _) = [TyCode] +getPrimOpType (Real_Int _) = [TyReal] +getPrimOpType (Int_Real _) = [TyInt] +getPrimOpType (Arr_Int _) = [TyArray] +getPrimOpType (Int_Int_Int _) = [TyInt,TyInt] +getPrimOpType (Int_Int_Bool _) = [TyInt,TyInt] +getPrimOpType (Real_Real_Real _) = [TyReal,TyReal] +getPrimOpType (Real_Real_Bool _) = [TyReal,TyReal] +getPrimOpType (Arr_Int_Value _) = [TyArray,TyInt] +getPrimOpType (Obj_Obj_Obj _) = [TyObject,TyObject] +getPrimOpType (Point_Color_Light _) = [TyPoint,TyPoint] +getPrimOpType (Real_Real_Real_Point _) = [TyReal,TyReal,TyReal] +getPrimOpType (Obj_Real_Obj _) = [TyObject,TyReal] +getPrimOpType (Obj_Real_Real_Real_Obj _) = [TyObject,TyReal,TyReal,TyReal] +getPrimOpType (Value_String_Value _) = [TyAlpha,TyString] +getPrimOpType (Point_Point_Color_Real_Real_Light _) + = [TyPoint,TyPoint,TyPoint,TyReal,TyReal] +getPrimOpType (Render _) = [TyPoint, + TyLight, + TyObject, + TyInt, + TyReal, + TyReal, + TyReal, + TyString] + + +-- Some primitives with better error message + +mytrace v s = trace (s ++" : "++ show v ++ "\n") v + + +ixGet :: Array Int GMLValue -> Int -> GMLValue +ixGet arr i + | inRange (bounds arr) i = arr ! i + | otherwise = error ("failed access with index value " + ++ show i + ++ " (should be between 0 and " + ++ show (snd (bounds arr)) ++ ")") + +ourQuot :: Int -> Int -> Int +ourQuot _ 0 = error "attempt to use divi to divide by 0" +ourQuot a b = a `quot` b + +ourRem :: Int -> Int -> Int +ourRem _ 0 = error "attempt to use remi to divide by 0" +ourRem a b = a `rem` b + +ourSqrt :: Double -> Double +ourSqrt n | n < 0 = error "attempt to use sqrt on a negative number" + | otherwise = sqrt n + + +mySpotlight p1 p2 col cutoff exp = spotlight p1 p2 col (deg2rad cutoff) exp + +-- The problem specification gets the mapping for spheres backwards +-- (it maps the image from right to left). +-- We've fixed that in the raytracing library so that it goes from left +-- to right, but to keep the GML front compatible with the problem +-- statement, we reverse it here. + +sphere' :: SurfaceFn Color Double -> CSG (SurfaceFn Color Double) +sphere' (SFun f) = sphere (SFun (\i u v -> f i (1 - u) v)) +sphere' s = sphere s diff --git a/testsuite/tests/programs/galois_raytrace/Eval.hs b/testsuite/tests/programs/galois_raytrace/Eval.hs new file mode 100644 index 0000000000..75568f0b04 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Eval.hs @@ -0,0 +1,355 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Eval where + +import Array + +import Geometry +import CSG +import Surface +import Data +import Parse (rayParse, rayParseF) + +class Monad m => MonadEval m where + doOp :: PrimOp -> GMLOp -> Stack -> m Stack + tick :: m () + err :: String -> m a + + tick = return () + +newtype Pure a = Pure a deriving Show + +instance Monad Pure where + Pure x >>= k = k x + return = Pure + fail s = error s + +instance MonadEval Pure where + doOp = doPureOp + err s = error s + +instance MonadEval IO where + doOp prim op stk = do { -- putStrLn ("Calling " ++ show op + -- ++ " << " ++ show stk ++ " >>") + doAllOp prim op stk + } + err s = error s + +data State + = State { env :: Env + , stack :: Stack + , code :: Code + } deriving Show + +callback :: Env -> Code -> Stack -> Stack +callback env code stk + = case eval (State { env = env, stack = stk, code = code}) of + Pure stk -> stk + +{-# SPECIALIZE eval :: State -> Pure Stack #-} +{-# SPECIALIZE eval :: State -> IO Stack #-} + +eval :: MonadEval m => State -> m Stack +eval st = + do { () <- return () -- $ unsafePerformIO (print st) -- Functional debugger + ; if moreCode st then + do { tick -- tick first, so as to catch loops on new eval. + ; st' <- step st + ; eval st' + } + else return (stack st) + } + +moreCode :: State -> Bool +moreCode (State {code = []}) = False +moreCode _ = True + +-- Step has a precondition that there *is* code to run +{-# SPECIALIZE step :: State -> Pure State #-} +{-# SPECIALIZE step :: State -> IO State #-} +step :: MonadEval m => State -> m State + +-- Rule 1: Pushing BaseValues +step st@(State{ stack = stack, code = (TBool b):cs }) + = return (st { stack = (VBool b):stack, code = cs }) +step st@(State{ stack = stack, code = (TInt i):cs }) + = return (st { stack = (VInt i):stack, code = cs }) +step st@(State{ stack = stack, code = (TReal r):cs }) + = return (st { stack = (VReal r):stack, code = cs }) +step st@(State{ stack = stack, code = (TString s):cs }) + = return (st { stack = (VString s):stack, code = cs }) + +-- Rule 2: Name binding +step st@(State{ env = env, stack = (v:stack), code = (TBind id):cs }) = + return (State { env = extendEnv env id v, stack = stack, code = cs }) +step st@(State{ env = env, stack = [], code = (TBind id):cs }) = + err "Attempt to bind the top of an empty stack" + +-- Rule 3: Name lookup +step st@(State{ env = env, stack = stack, code = (TId id):cs }) = + case (lookupEnv env id) of + Just v -> return (st { stack = v:stack, code = cs }) + Nothing -> err ("Cannot find value for identifier: " ++ id) + +-- Rule 4: Closure creation +step st@(State{ env = env, stack = stack, code = (TBody body):cs }) = + return (st { stack = (VClosure env body):stack, code = cs }) + +-- Rule 5: Application +step st@(State{ env = env, stack = (VClosure env' code'):stack, code = TApply:cs }) = + do { stk <- eval (State {env = env', stack = stack, code = code'}) + ; return (st { stack = stk, code = cs }) + } +step st@(State{ env = env, stack = [], code = TApply:cs }) = + err "Application with an empty stack" +step st@(State{ env = env, stack = _:_, code = TApply:cs }) = + err "Application of a non-closure" + +-- Rule 6: Arrays +step st@(State{ env = env, stack = stack, code = TArray code':cs }) = + do { stk <- eval (State {env = env, stack = [], code = code'}) + ; let last = length stk-1 + ; let arr = array (0,last) (zip [last,last-1..] stk) + ; return (st { stack = (VArray arr):stack, code = cs }) + } + +-- Rule 7 & 8: If statement +step st@(State{ env = env, stack = (VClosure e2 c2):(VClosure e1 c1):(VBool True):stack, code = TIf:cs }) = + do { stk <- eval (State {env = e1, stack = stack, code = c1}) + ; return (st { stack = stk, code = cs }) + } +step st@(State{ env = env, stack = (VClosure e2 c2):(VClosure e1 c1):(VBool False):stack, code = TIf:cs }) = + do { stk <- eval (State {env = e2, stack = stack, code = c2}) + ; return (st { stack = stk, code = cs }) + } +step st@(State{ env = env, stack = _, code = TIf:cs }) = + err "Incorrect use of if (bad and/or inappropriate values on the stack)" + +-- Rule 9: Operators +step st@(State{ env = env, stack = stack, code = (TOp op):cs }) = + do { stk <- doOp (opFnTable ! op) op stack + ; return (st { stack = stk, code = cs }) + } + +-- Rule Opps +step _ = err "Tripped on sidewalk while stepping." + + +-------------------------------------------------------------------------- +-- Operator code + +opFnTable :: Array GMLOp PrimOp +opFnTable = array (minBound,maxBound) + [ (op,prim) | (_,TOp op,prim) <- opcodes ] + + + + +doPureOp :: (MonadEval m) => PrimOp -> GMLOp -> Stack -> m Stack +doPureOp _ Op_render _ = + err ("\nAttempting to call render from inside a purely functional callback.") +doPureOp primOp op stk = doPrimOp primOp op stk -- call the purely functional operators + +{-# SPECIALIZE doPrimOp :: PrimOp -> GMLOp -> Stack -> Pure Stack #-} +{-# SPECIALIZE doPrimOp :: PrimOp -> GMLOp -> Stack -> IO Stack #-} +{-# SPECIALIZE doPrimOp :: PrimOp -> GMLOp -> Stack -> Abs Stack #-} + +doPrimOp :: (MonadEval m) => PrimOp -> GMLOp -> Stack -> m Stack + +-- 1 argument. + +doPrimOp (Int_Int fn) _ (VInt i1:stk) + = return ((VInt (fn i1)) : stk) +doPrimOp (Real_Real fn) _ (VReal r1:stk) + = return ((VReal (fn r1)) : stk) +doPrimOp (Point_Real fn) _ (VPoint x y z:stk) + = return ((VReal (fn x y z)) : stk) + +-- This is where the callbacks happen from... +doPrimOp (Surface_Obj fn) _ (VClosure env code:stk) + = case absapply env code [VAbsObj AbsFACE,VAbsObj AbsU,VAbsObj AbsV] of + Just [VReal r3,VReal r2,VReal r1,VPoint c1 c2 c3] -> + let + res = prop (color c1 c2 c3) r1 r2 r3 + in + return ((VObject (fn (SConst res))) : stk) + _ -> return ((VObject (fn (SFun call))) : stk) + where + -- The most general case + call i r1 r2 = + case callback env code [VReal r2,VReal r1,VInt i] of + [VReal r3,VReal r2,VReal r1,VPoint c1 c2 c3] + -> prop (color c1 c2 c3) r1 r2 r3 + stk -> error ("callback failed: incorrectly typed return arguments" + ++ show stk) + +doPrimOp (Real_Int fn) _ (VReal r1:stk) + = return ((VInt (fn r1)) : stk) +doPrimOp (Int_Real fn) _ (VInt r1:stk) + = return ((VReal (fn r1)) : stk) +doPrimOp (Arr_Int fn) _ (VArray arr:stk) + = return ((VInt (fn arr)) : stk) + +-- 2 arguments. + +doPrimOp (Int_Int_Int fn) _ (VInt i2:VInt i1:stk) + = return ((VInt (fn i1 i2)) : stk) +doPrimOp (Int_Int_Bool fn) _ (VInt i2:VInt i1:stk) + = return ((VBool (fn i1 i2)) : stk) +doPrimOp (Real_Real_Real fn) _ (VReal r2:VReal r1:stk) + = return ((VReal (fn r1 r2)) : stk) +doPrimOp (Real_Real_Bool fn) _ (VReal r2:VReal r1:stk) + = return ((VBool (fn r1 r2)) : stk) +doPrimOp (Arr_Int_Value fn) _ (VInt i:VArray arr:stk) + = return ((fn arr i) : stk) + + + -- Many arguments, typically image mangling + +doPrimOp (Obj_Obj_Obj fn) _ (VObject o2:VObject o1:stk) + = return ((VObject (fn o1 o2)) : stk) +doPrimOp (Point_Color_Light fn) _ (VPoint r g b:VPoint x y z : stk) + = return (VLight (fn (x,y,z) (color r g b)) : stk) +doPrimOp (Point_Point_Color_Real_Real_Light fn) _ + (VReal r2:VReal r1:VPoint r g b:VPoint x2 y2 z2:VPoint x1 y1 z1 : stk) + = return (VLight (fn (x1,y1,z1) (x2,y2,z2) (color r g b) r1 r2) : stk) +doPrimOp (Real_Real_Real_Point fn) _ (VReal r3:VReal r2:VReal r1:stk) + = return ((fn r1 r2 r3) : stk) +doPrimOp (Obj_Real_Obj fn) _ (VReal r:VObject o:stk) + = return (VObject (fn o r) : stk) +doPrimOp (Obj_Real_Real_Real_Obj fn) _ (VReal r3:VReal r2:VReal r1:VObject o:stk) + = return (VObject (fn o r1 r2 r3) : stk) + +-- This one is our testing harness +doPrimOp (Value_String_Value fn) _ (VString s:o:stk) + = res `seq` return (res : stk) + where + res = fn o s + +doPrimOp primOp op args + = err ("\n\ntype error when attempting to execute builtin primitive \"" ++ + show op ++ "\"\n\n| " ++ + show op ++ " takes " ++ show (length types) ++ " argument" ++ s + ++ " with" ++ the ++ " type" ++ s ++ "\n|\n|" ++ + " " ++ unwords [ show ty | ty <- types ] ++ "\n|\n|" ++ + " currently, the relevent argument" ++ s ++ " on the stack " ++ + are ++ "\n|\n| " ++ + unwords [ "(" ++ show arg ++ ")" + | arg <- reverse (take (length types) args) ] ++ "\n|\n| " + ++ " (top of stack is on the right hand side)\n\n") + where + len = length types + s = (if len /= 1 then "s" else "") + are = (if len /= 1 then "are" else "is") + the = (if len /= 1 then "" else " the") + types = getPrimOpType primOp + + +-- Render is somewhat funny, becauase it can only get called at top level. +-- All other operations are purely functional. + +doAllOp :: PrimOp -> GMLOp -> Stack -> IO Stack +doAllOp (Render render) Op_render + (VString str:VInt ht:VInt wid:VReal fov + :VInt dep:VObject obj:VArray arr + :VPoint r g b : stk) + = do { render (color r g b) lights obj dep (fov * (pi / 180.0)) wid ht str + ; return stk + } + where + lights = [ light | (VLight light) <- elems arr ] + +doAllOp primOp op stk = doPrimOp primOp op stk -- call the purely functional operators + +------------------------------------------------------------------------------ +{- + - Abstract evaluation. + - + - The idea is you check for constant code that + - (1) does not look at its arguments + - (2) gives a fixed result + - + - We run for 100 steps. + - + -} + +absapply :: Env -> Code -> Stack -> Maybe Stack +absapply env code stk = + case runAbs (eval (State env stk code)) 100 of + AbsState stk _ -> Just stk + AbsFail m -> Nothing + +newtype Abs a = Abs { runAbs :: Int -> AbsState a } +data AbsState a = AbsState a !Int + | AbsFail String + +instance Monad Abs where + (Abs fn) >>= k = Abs (\ s -> case fn s of + AbsState r s' -> runAbs (k r) s' + AbsFail m -> AbsFail m) + return x = Abs (\ n -> AbsState x n) + fail s = Abs (\ n -> AbsFail s) + +instance MonadEval Abs where + doOp = doAbsOp + err = fail + tick = Abs (\ n -> if n <= 0 + then AbsFail "run out of time" + else AbsState () (n-1)) + +doAbsOp :: PrimOp -> GMLOp -> Stack -> Abs Stack +doAbsOp _ Op_point (VReal r3:VReal r2:VReal r1:stk) + = return ((VPoint r1 r2 r3) : stk) + -- here, you could have an (AbsPoint :: AbsObj) which you put on the + -- stack, with any object in the three fields. +doAbsOp _ op _ = err ("operator not understood (" ++ show op ++ ")") + +------------------------------------------------------------------------------ +-- Driver + +mainEval :: Code -> IO () +mainEval prog = do { stk <- eval (State emptyEnv [] prog) + ; return () + } +{- + * Oops, one of the example actually has something + * on the stack at the end. + * Oh well... + ; if null stk + then return () + else do { putStrLn done + ; print stk + } +-} + +done = "Items still on stack at (successfull) termination of program" + +------------------------------------------------------------------------------ +-- testing + +test :: String -> Pure Stack +test is = eval (State emptyEnv [] (rayParse is)) + +testF :: String -> IO Stack +testF is = do prog <- rayParseF is + eval (State emptyEnv [] prog) + +testA :: String -> Either String (Stack,Int) +testA is = case runAbs (eval (State emptyEnv + [VAbsObj AbsFACE,VAbsObj AbsU,VAbsObj AbsV] + (rayParse is))) 100 of + AbsState a n -> Right (a,n) + AbsFail m -> Left m + +abstest1 = "1.0 0.0 0.0 point /red { /v /u /face red 1.0 0.0 1.0 } apply" + +-- should be [3:: Int] +et1 = test "1 /x { x } /f 2 /x f apply x addi" + + + + + diff --git a/testsuite/tests/programs/galois_raytrace/Geometry.hs b/testsuite/tests/programs/galois_raytrace/Geometry.hs new file mode 100644 index 0000000000..673c7d4812 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Geometry.hs @@ -0,0 +1,314 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Geometry + ( Coords + , Ray + , Point -- abstract + , Vector -- abstract + , Matrix -- abstract + , Color -- abstract + , Box(..) + , Radian + , matrix + , coord + , color + , uncolor + , xCoord , yCoord , zCoord + , xComponent , yComponent , zComponent + , point + , vector + , nearV + , point_to_vector + , vector_to_point + , dot + , cross + , tangents + , addVV + , addPV + , subVV + , negV + , subPP + , norm + , normalize + , dist2 + , sq + , distFrom0Sq + , distFrom0 + , multSV + , multMM + , transposeM + , multMV + , multMP + , multMQ + , multMR + , white + , black + , addCC + , subCC + , sumCC + , multCC + , multSC + , nearC + , offsetToPoint + , epsilon + , inf + , nonZero + , eqEps + , near + , clampf + ) where + +import List + +type Coords = (Double,Double,Double) + +type Ray = (Point,Vector) -- origin of ray, and unit vector giving direction + +data Point = P !Double !Double !Double -- implicit extra arg of 1 + deriving (Show) +data Vector = V !Double !Double !Double -- implicit extra arg of 0 + deriving (Show, Eq) +data Matrix = M !Quad !Quad !Quad !Quad + deriving (Show) + +data Color = C !Double !Double !Double + deriving (Show, Eq) + +data Box = B !Double !Double !Double !Double !Double !Double + deriving (Show) + +data Quad = Q !Double !Double !Double !Double + deriving (Show) + +type Radian = Double + +type Tup4 a = (a,a,a,a) + +--{-# INLINE matrix #-} +matrix :: Tup4 (Tup4 Double) -> Matrix +matrix ((m11, m12, m13, m14), + (m21, m22, m23, m24), + (m31, m32, m33, m34), + (m41, m42, m43, m44)) + = M (Q m11 m12 m13 m14) + (Q m21 m22 m23 m24) + (Q m31 m32 m33 m34) + (Q m41 m42 m43 m44) + +coord x y z = (x, y, z) + +color r g b = C r g b + +uncolor (C r g b) = (r,g,b) + +{-# INLINE xCoord #-} +xCoord (P x y z) = x +{-# INLINE yCoord #-} +yCoord (P x y z) = y +{-# INLINE zCoord #-} +zCoord (P x y z) = z + +{-# INLINE xComponent #-} +xComponent (V x y z) = x +{-# INLINE yComponent #-} +yComponent (V x y z) = y +{-# INLINE zComponent #-} +zComponent (V x y z) = z + +point :: Double -> Double -> Double -> Point +point x y z = P x y z + +vector :: Double -> Double -> Double -> Vector +vector x y z = V x y z + +nearV :: Vector -> Vector -> Bool +nearV (V a b c) (V d e f) = a `near` d && b `near` e && c `near` f + +point_to_vector :: Point -> Vector +point_to_vector (P x y z) = V x y z + +vector_to_point :: Vector -> Point +vector_to_point (V x y z) = P x y z + +{-# INLINE vector_to_quad #-} +vector_to_quad :: Vector -> Quad +vector_to_quad (V x y z) = Q x y z 0 + +{-# INLINE point_to_quad #-} +point_to_quad :: Point -> Quad +point_to_quad (P x y z) = Q x y z 1 + +{-# INLINE quad_to_point #-} +quad_to_point :: Quad -> Point +quad_to_point (Q x y z _) = P x y z + +{-# INLINE quad_to_vector #-} +quad_to_vector :: Quad -> Vector +quad_to_vector (Q x y z _) = V x y z + +--{-# INLINE dot #-} +dot :: Vector -> Vector -> Double +dot (V x1 y1 z1) (V x2 y2 z2) = x1 * x2 + y1 * y2 + z1 * z2 + +cross :: Vector -> Vector -> Vector +cross (V x1 y1 z1) (V x2 y2 z2) + = V (y1 * z2 - z1 * y2) (z1 * x2 - x1 * z2) (x1 * y2 - y1 * x2) + +-- assumption: the input vector is a normal +tangents :: Vector -> (Vector, Vector) +tangents v@(V x y z) + = (v1, v `cross` v1) + where v1 | x == 0 = normalize (vector 0 z (-y)) + | otherwise = normalize (vector (-y) x 0) + +{-# INLINE dot4 #-} +dot4 :: Quad -> Quad -> Double +dot4 (Q x1 y1 z1 w1) (Q x2 y2 z2 w2) = x1 * x2 + y1 * y2 + z1 * z2 + w1 * w2 + +addVV :: Vector -> Vector -> Vector +addVV (V x1 y1 z1) (V x2 y2 z2) + = V (x1 + x2) (y1 + y2) (z1 + z2) + +addPV :: Point -> Vector -> Point +addPV (P x1 y1 z1) (V x2 y2 z2) + = P (x1 + x2) (y1 + y2) (z1 + z2) + +subVV :: Vector -> Vector -> Vector +subVV (V x1 y1 z1) (V x2 y2 z2) + = V (x1 - x2) (y1 - y2) (z1 - z2) + +negV :: Vector -> Vector +negV (V x1 y1 z1) + = V (-x1) (-y1) (-z1) + +subPP :: Point -> Point -> Vector +subPP (P x1 y1 z1) (P x2 y2 z2) + = V (x1 - x2) (y1 - y2) (z1 - z2) + +--{-# INLINE norm #-} +norm :: Vector -> Double +norm (V x y z) = sqrt (sq x + sq y + sq z) + +--{-# INLINE normalize #-} +-- normalize a vector to a unit vector +normalize :: Vector -> Vector +normalize v@(V x y z) + | norm /= 0 = multSV (1/norm) v + | otherwise = error "normalize empty!" + where norm = sqrt (sq x + sq y + sq z) + +-- This does computes the distance *squared* +dist2 :: Point -> Point -> Double +dist2 us vs = sq x + sq y + sq z + where + (V x y z) = subPP us vs + +{-# INLINE sq #-} +sq :: Double -> Double +sq d = d * d + +{-# INLINE distFrom0Sq #-} +distFrom0Sq :: Point -> Double -- Distance of point from origin. +distFrom0Sq (P x y z) = sq x + sq y + sq z + +{-# INLINE distFrom0 #-} +distFrom0 :: Point -> Double -- Distance of point from origin. +distFrom0 p = sqrt (distFrom0Sq p) + +--{-# INLINE multSV #-} +multSV :: Double -> Vector -> Vector +multSV k (V x y z) = V (k*x) (k*y) (k*z) + +--{-# INLINE multMM #-} +multMM :: Matrix -> Matrix -> Matrix +multMM m1@(M q1 q2 q3 q4) m2 + = M (multMQ m2' q1) + (multMQ m2' q2) + (multMQ m2' q3) + (multMQ m2' q4) + where + m2' = transposeM m2 + +{-# INLINE transposeM #-} +transposeM :: Matrix -> Matrix +transposeM (M (Q e11 e12 e13 e14) + (Q e21 e22 e23 e24) + (Q e31 e32 e33 e34) + (Q e41 e42 e43 e44)) = (M (Q e11 e21 e31 e41) + (Q e12 e22 e32 e42) + (Q e13 e23 e33 e43) + (Q e14 e24 e34 e44)) + + +--multMM m1 m2 = [map (dot4 row) (transpose m2) | row <- m1] + +--{-# INLINE multMV #-} +multMV :: Matrix -> Vector -> Vector +multMV m v = quad_to_vector (multMQ m (vector_to_quad v)) + +--{-# INLINE multMP #-} +multMP :: Matrix -> Point -> Point +multMP m p = quad_to_point (multMQ m (point_to_quad p)) + +-- mat vec = map (dot4 vec) mat + +{-# INLINE multMQ #-} +multMQ :: Matrix -> Quad -> Quad +multMQ (M q1 q2 q3 q4) q + = Q (dot4 q q1) + (dot4 q q2) + (dot4 q q3) + (dot4 q q4) + +{-# INLINE multMR #-} +multMR :: Matrix -> Ray -> Ray +multMR m (r, v) = (multMP m r, multMV m v) + +white :: Color +white = C 1 1 1 +black :: Color +black = C 0 0 0 + +addCC :: Color -> Color -> Color +addCC (C a b c) (C d e f) = C (a+d) (b+e) (c+f) + +subCC :: Color -> Color -> Color +subCC (C a b c) (C d e f) = C (a-d) (b-e) (c-f) + +sumCC :: [Color] -> Color +sumCC = foldr addCC black + +multCC :: Color -> Color -> Color +multCC (C a b c) (C d e f) = C (a*d) (b*e) (c*f) + +multSC :: Double -> Color -> Color +multSC k (C a b c) = C (a*k) (b*k) (c*k) + +nearC :: Color -> Color -> Bool +nearC (C a b c) (C d e f) = a `near` d && b `near` e && c `near` f + +offsetToPoint :: Ray -> Double -> Point +offsetToPoint (r,v) i = r `addPV` (i `multSV` v) + +-- + +epsilon, inf :: Double -- aproximate zero and infinity +epsilon = 1.0e-10 +inf = 1.0e20 + +nonZero :: Double -> Double -- Use before a division. It makes definitions +nonZero x | x > epsilon = x -- more complete and I bet the errors that get + | x < -epsilon = x -- introduced will be undetectable if epsilon + | otherwise = epsilon -- is small enough + + +eqEps x y = abs (x-y) < epsilon +near = eqEps + +clampf :: Double -> Double +clampf p | p < 0 = 0 + | p > 1 = 1 + | True = p diff --git a/testsuite/tests/programs/galois_raytrace/Illumination.hs b/testsuite/tests/programs/galois_raytrace/Illumination.hs new file mode 100644 index 0000000000..155a7a9a76 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Illumination.hs @@ -0,0 +1,224 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +-- Modified to use stdout (for testing) + +module Illumination + ( Object + , Light (..) + , light, pointlight, spotlight + , render + ) where + +import Array +import Char(chr) +import Maybe + +import Geometry +import CSG +import Surface +import Misc + +type Object = CSG (SurfaceFn Color Double) + +data Cxt = Cxt {ambient::Color, lights::[Light], object::Object, depth::Int} + deriving Show + +render :: (Matrix,Matrix) -> Color -> [Light] -> Object -> Int -> + Radian -> Int -> Int -> String -> IO () +render (m,m') amb ls obj dep fov wid ht file + = do { debugging + ; putStrLn (showBitmap' wid ht pixels) + } + where + debugging = return () +{- + do { putStrLn (show cxt) + ; putStrLn (show (width, delta, aspect, left, top)) + } +-} + obj' = transform (m',m) obj + ls' = [ transformLight m' l | l <- ls ] + pixelA = listArray ((1,1), (ht,wid)) + [ illumination cxt (start,pixel i j) + | j <- take ht [0.5..] + , i <- take wid [0.5..] ] + antiA = pixelA // + [ (ix, superSample ix (pixelA ! ix)) + | j <- [2 .. ht - 1], i <- [2 .. wid - 1] + , let ix = (j, i) + , contrast ix pixelA ] + pixels = [ [ illumination cxt (start,pixel i j) | i<- take wid [0.5..] ] + | j <- take ht [0.5..] + ] + cxt = Cxt {ambient=amb, lights=ls', object=obj', depth=dep} + start = point 0 0 (-1) + width = 2 * tan (fov/2) + delta = width / fromIntegral wid + aspect = fromIntegral ht / fromIntegral wid + left = - width / 2 + top = - left * aspect + pixel i j = vector (left + i*delta) (top - j*delta) 1 + + superSample (y, x) col = avg $ col: + [ illumination cxt (start, pixel (fromIntegral x - 0.5 + xd) (fromIntegral y - 0.5 + yd)) + | (xd, yd) <- [(-0.333, 0.0), (0.333, 0.0), (0.0, -0.333), (0.0, 0.333)] + ] + +avg cs = divN (fromIntegral (length cs)) (uncolor (sumCC cs)) + where divN n (r,g,b) = color (r / n) (g / n) (b / n) + +contrast :: (Int, Int) -> Array (Int, Int) Color -> Bool +contrast (x, y) arr = any diffMax [ subCC cur (arr ! (x + xd, y + yd)) + | xd <- [-1, 1], yd <- [-1, 1] + ] + where cur = arr ! (x, y) + diffMax col = (abs r) > 0.25 || (abs g) > 0.2 || (abs b) > 0.4 + where + (r,g,b) = uncolor col + + +illumination :: Cxt -> Ray -> Color +illumination cxt (r,v) + | depth cxt <= 0 = black + | otherwise = case castRay (r,v) (object cxt) of + Nothing -> black + Just info -> illum (cxt{depth=(depth cxt)-1}) info v + +illum :: Cxt -> (Point,Vector,Properties Color Double) -> Vector -> Color +illum cxt (pos,normV,(col,kd,ks,n)) v + = ambTerm `addCC` difTerm `addCC` spcTerm `addCC` recTerm + where + visibleLights = unobscured pos (object cxt) (lights cxt) normV + d = depth cxt + amb = ambient cxt + newV = subVV v (multSV (2 * dot normV v) normV) + + ambTerm = multSC kd (multCC amb col) + difTerm = multSC kd (sumCC [multSC (dot normV lj) (multCC intensity col) + |(loc,intensity) <- visibleLights, + let lj = normalize ({- pos `subVV` -} loc)]) + -- ZZ might want to avoid the phong, when you can... + spcTerm = multSC ks (sumCC [multSC ((dot normV hj) ** n ) (multCC intensity col) + |(loc,intensity) <- visibleLights, + -- ZZ note this is specific to the light at infinity + let lj = {- pos `subVV` -} normalize loc, + let hj = normalize (lj `subVV` normalize v)]) + recTerm = if recCoeff `nearC` black then black else multCC recCoeff recRay + recCoeff = multSC ks col + recRay = illumination cxt (pos,newV) + +showBitmapA :: Int -> Int -> Array (Int, Int) Color -> String +showBitmapA wid ht arr + = header ++ concatMap scaleColor (elems arr) + where + scaleColor col = [scalePixel r, scalePixel g, scalePixel b] + where (r,g,b) = uncolor col + header = "P6\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n" + +showBitmap :: Int -> Int ->[[Color]] -> String +showBitmap wid ht pss +-- type of assert | length pss == ht && all (\ ps -> length ps == wid) pss + = header ++ concat [[scalePixel r,scalePixel g,scalePixel b] + | ps <- pss, (r,g,b) <- map uncolor ps] + where + header = "P6\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n" +showBitmap _ _ _ = error "incorrect length of bitmap string" + +scalePixel :: Double -> Char +scalePixel p = chr (floor (clampf p * 255)) + +showBitmap' :: Int -> Int ->[[Color]] -> String +showBitmap' wid ht pss +-- type of assert | length pss == ht && all (\ ps -> length ps == wid) pss + = header + ++ unlines [ unwords [unwords [scalePixel' r,scalePixel' g,scalePixel' b] + | (r,g,b) <- map uncolor ps] + | ps <- pss ] + where + header = "P3\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n" +showBitmap' _ _ _ = error "incorrect length of bitmap string" + +scalePixel' :: Double -> String +scalePixel' p = show (floor (clampf p * 255)) + +-- Lights + +data Light = Light Vector Color + | PointLight Point Color + | SpotLight Point Point Color Radian Double + deriving Show + +light :: Coords -> Color -> Light +light (x,y,z) color = + Light (normalize (vector (-x) (-y) (-z))) color +pointlight (x,y,z) color = + PointLight (point x y z) color +spotlight (x,y,z) (p,q,r) col cutoff exp = + SpotLight (point x y z) (point p q r) col cutoff exp + +transformLight m (Light v c) = Light (multMV m v) c +transformLight m (PointLight p c) = PointLight (multMP m p) c +transformLight m (SpotLight p q c r d) = SpotLight (multMP m p) (multMP m q) c r d + +unobscured :: Point -> Object -> [Light] -> Vector -> [(Vector,Color)] +unobscured pos obj lights normV = catMaybes (map (unobscure pos obj normV) lights) + +unobscure :: Point -> Object -> Vector -> Light -> Maybe (Vector,Color) +unobscure pos obj normV (Light vec color) + -- ZZ probably want to make this faster + | vec `dot` normV < 0 = Nothing + | intersects (pos `addPV` (0.0001 `multSV` vec),vec) obj = Nothing + | otherwise = Just (vec,color) +unobscure pos obj normV (PointLight pp color) + | vec `dot` normV < 0 = Nothing + | intersectWithin (pos `addPV` (0.0001 `multSV` (normalize vec)), vec) obj = Nothing + | otherwise = Just (vec,is) + where vec = pp `subPP` pos + is = attenuate vec color +unobscure org obj normV (SpotLight pos at color cutoff exp) + | vec `dot` normV < 0 = Nothing + | intersectWithin (org `addPV` (0.0001 `multSV` (normalize vec)), vec) obj = Nothing + | angle > cutoff = Nothing + | otherwise = Just (vec, is) + where vec = pos `subPP` org + vec' = pos `subPP` at + angle = acos (normalize vec `dot` (normalize vec')) + + asp = normalize (at `subPP` pos) + qsp = normalize (org `subPP` pos) + is = attenuate vec (((asp `dot` qsp) ** exp) `multSC` color) + +attenuate :: Vector -> Color -> Color +attenuate vec color = (100 / (99 + sq (norm vec))) `multSC` color + +-- + +castRay ray p + = case intersectRayWithObject ray p of + (True, _, _) -> Nothing -- eye is inside + (False, [], _) -> Nothing -- eye is inside + (False, (0, b, _) : _, _) -> Nothing -- eye is inside + (False, (i, False, _) : _, _) -> Nothing -- eye is inside + (False, (t, b, (s, p0)) : _, _) -> + let (v, prop) = surface s p0 in + Just (offsetToPoint ray t, v, prop) + +intersects ray p + = case intersectRayWithObject ray p of + (True, _, _) -> False + (False, [], _) -> False + (False, (0, b, _) : _, _) -> False + (False, (i, False, _) : _, _) -> False + (False, (i, b, _) : _, _) -> True + +intersectWithin :: Ray -> Object -> Bool +intersectWithin ray p + = case intersectRayWithObject ray p of + (True, _, _) -> False -- eye is inside + (False, [], _) -> False -- eye is inside + (False, (0, b, _) : _, _) -> False -- eye is inside + (False, (i, False, _) : _, _) -> False -- eye is inside + (False, (t, b, _) : _, _) -> t < 1.0 diff --git a/testsuite/tests/programs/galois_raytrace/Intersections.hs b/testsuite/tests/programs/galois_raytrace/Intersections.hs new file mode 100644 index 0000000000..c7fe003eb3 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Intersections.hs @@ -0,0 +1,404 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Intersections + ( intersectRayWithObject, + quadratic + ) where + +import Maybe(isJust) + +import Construct +import Geometry +import Interval +import Misc + +-- This is factored into two bits. The main function `intersections' +-- intersects a line with an object. +-- The wrapper call `intersectRayWithObject' coerces this to an intersection +-- with a ray by clamping the result to start at 0. + +intersectRayWithObject ray p + = clampIntervals is + where is = intersections ray p + +clampIntervals (True, [], True) = (False, [(0, True, undefined)], True) +clampIntervals empty@(False, [], False) = empty +clampIntervals (True, is@((i, False, p) : is'), isOpen) + | i `near` 0 || i < 0 + = clampIntervals (False, is', isOpen) + | otherwise + = (False, (0, True, undefined) : is, isOpen) +clampIntervals ivals@(False, is@((i, True, p) : is'), isOpen) + | i `near` 0 || i < 0 + -- can unify this with first case... + = clampIntervals (True, is', isOpen) + | otherwise + = ivals + +intersections ray (Union p q) + = unionIntervals is js + where is = intersections ray p + js = intersections ray q + +intersections ray (Intersect p q) + = intersectIntervals is js + where is = intersections ray p + js = intersections ray q + +intersections ray (Difference p q) + = differenceIntervals is (negateSurfaces js) + where is = intersections ray p + js = intersections ray q + +intersections ray (Transform m m' p) + = mapI (xform m) is + where is = intersections (m' `multMR` ray) p + xform m (i, b, (s, p0)) = (i, b, (transformSurface m s, p0)) + +intersections ray (Box box p) + | intersectWithBox ray box = intersections ray p + | otherwise = emptyIList + +intersections ray p@(Plane s) + = intersectPlane ray s + +intersections ray p@(Sphere s) + = intersectSphere ray s + +intersections ray p@(Cube s) + = intersectCube ray s + +intersections ray p@(Cylinder s) + = intersectCylinder ray s + +intersections ray p@(Cone s) + = intersectCone ray s + +negateSurfaces :: IList (Surface, Texture a) -> IList (Surface, Texture a) +negateSurfaces = mapI negSurf + where negSurf (i, b, (s,t)) = (i, b, (negateSurface s, t)) + +negateSurface (Planar p0 v0 v1) + = Planar p0 v1 v0 +negateSurface (Spherical p0 v0 v1) + = Spherical p0 v1 v0 +negateSurface (Cylindrical p0 v0 v1) + = Cylindrical p0 v1 v0 +negateSurface (Conic p0 v0 v1) + = Conic p0 v1 v0 + +transformSurface m (Planar p0 v0 v1) + = Planar p0' v0' v1' + where p0' = multMP m p0 + v0' = multMV m v0 + v1' = multMV m v1 + +transformSurface m (Spherical p0 v0 v1) + = Spherical p0' v0' v1' + where p0' = multMP m p0 + v0' = multMV m v0 + v1' = multMV m v1 + +-- ditto as above +transformSurface m (Cylindrical p0 v0 v1) + = Cylindrical p0' v0' v1' + where p0' = multMP m p0 + v0' = multMV m v0 + v1' = multMV m v1 + +transformSurface m (Conic p0 v0 v1) + = Conic p0' v0' v1' + where p0' = multMP m p0 + v0' = multMV m v0 + v1' = multMV m v1 + +-------------------------------- +-- Plane +-------------------------------- + +intersectPlane :: Ray -> a -> IList (Surface, Texture a) +intersectPlane ray texture = intersectXZPlane PlaneFace ray 0.0 texture + +intersectXZPlane :: Face -> Ray -> Double -> a -> IList (Surface, Texture a) +intersectXZPlane n (r,v) yoffset texture + | b `near` 0 + = -- the ray is parallel to the plane - it's either all in, or all out + if y `near` yoffset || y < yoffset then openIList else emptyIList + + -- The line intersects the plane. Find t such that + -- (x + at, y + bt, z + ct) intersects the X-Z plane. + -- t may be negative (the ray starts within the halfspace), + -- but we'll catch that later when we clamp the intervals + + | b < 0 -- the ray is pointing downwards + = (False, [mkEntry (t0, (Planar p0 v0 v1, (n, p0, texture)))], True) + + | otherwise -- the ray is pointing upwards + = (True, [mkExit (t0, (Planar p0 v0 v1, (n, p0, texture)))], False) + + where t0 = (yoffset-y) / b + x0 = x + a * t0 + z0 = z + c * t0 + p0 = point x0 0 z0 + v0 = vector 0 0 1 + v1 = vector 1 0 0 + + x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + + +-------------------------------- +-- Sphere +-------------------------------- + +intersectSphere :: Ray -> a -> IList (Surface, Texture a) +intersectSphere ray@(r, v) texture + = -- Find t such that (x + ta, y + tb, z + tc) intersects the + -- unit sphere, that is, such that: + -- (x + ta)^2 + (y + tb)^2 + (z + tc)^2 = 1 + -- This is a quadratic equation in t: + -- t^2(a^2 + b^2 + c^2) + 2t(xa + yb + zc) + (x^2 + y^2 + z^2 - 1) = 0 + let c1 = sq a + sq b + sq c + c2 = 2 * (x * a + y * b + z * c) + c3 = sq x + sq y + sq z - 1 + in + case quadratic c1 c2 c3 of + Nothing -> emptyIList + Just (t1, t2) -> entryexit (g t1) (g t2) + where x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + g t = (t, (Spherical origin v1 v2, (SphereFace, p0, texture))) + where origin = point 0 0 0 + x0 = x + t * a + y0 = y + t * b + z0 = z + t * c + p0 = point x0 y0 z0 + v0 = vector x0 y0 z0 + (v1, v2) = tangents v0 + + +-------------------------------- +-- Cube +-------------------------------- + +intersectCube :: Ray -> a -> IList (Surface, Texture a) +intersectCube ray@(r, v) texture + = -- The set of t such that (x + at, y + bt, z + ct) lies within + -- the unit cube satisfies: + -- 0 <= x + at <= 1, 0 <= y + bt <= 1, 0 <= z + ct <= 1 + -- The minimum and maximum such values of t give us the two + -- intersection points. + case intersectSlabIval (intersectCubeSlab face2 face3 x a) + (intersectSlabIval (intersectCubeSlab face5 face4 y b) + (intersectCubeSlab face0 face1 z c)) of + Nothing -> emptyIList + Just (t1, t2) -> entryexit (g t1) (g t2) + where g ((n, v0, v1), t) + = (t, (Planar p0 v0 v1, (n, p0, texture))) + where p0 = offsetToPoint ray t + face0 = (CubeFront, vectorY, vectorX) + face1 = (CubeBack, vectorX, vectorY) + face2 = (CubeLeft, vectorZ, vectorY) + face3 = (CubeRight, vectorY, vectorZ) + face4 = (CubeTop, vectorZ, vectorX) + face5 = (CubeBottom, vectorX, vectorZ) + vectorX = vector 1 0 0 + vectorY = vector 0 1 0 + vectorZ = vector 0 0 1 + x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + +intersectCubeSlab n m w d + | d `near` 0 = if (0 <= w) && (w <= 1) + then Just ((n, -inf), (m, inf)) else Nothing + | d > 0 = Just ((n, (-w)/d), (m, (1-w)/d)) + | otherwise = Just ((m, (1-w)/d), (n, (-w)/d)) + +intersectSlabIval Nothing Nothing = Nothing +intersectSlabIval Nothing (Just i) = Nothing +intersectSlabIval (Just i) Nothing = Nothing +intersectSlabIval (Just (nu1@(n1, u1), mv1@(m1, v1))) + (Just (nu2@(n2, u2), mv2@(m2, v2))) + = checkInterval (nu, mv) + where nu = if u1 < u2 then nu2 else nu1 + mv = if v1 < v2 then mv1 else mv2 + checkInterval numv@(nu@(_, u), (m, v)) + -- rounding error may force us to push v out a bit + | u `near` v = Just (nu, (m, u + epsilon)) + | u < v = Just numv + | otherwise = Nothing + + +-------------------------------- +-- Cylinder +-------------------------------- + +intersectCylinder :: Ray -> a -> IList (Surface, Texture a) +intersectCylinder ray texture + = isectSide `intersectIntervals` isectTop `intersectIntervals` isectBottom + where isectSide = intersectCylSide ray texture + isectTop = intersectXZPlane CylinderTop ray 1.0 texture + isectBottom = complementIntervals $ negateSurfaces $ + intersectXZPlane CylinderBottom ray 0.0 texture + +intersectCylSide (r, v) texture + = -- The ray (x + ta, y + tb, z + tc) intersects the sides of the + -- cylinder if: + -- (x + ta)^2 + (z + tc)^2 = 1 and 0 <= y + tb <= 1. + if (sq a + sq c) `near` 0 + then -- The ray is parallel to the Y-axis, and does not intersect + -- the cylinder sides. It's either all in, or all out + if (sqxy `near` 1.0 || sqxy < 1.0) then openIList else emptyIList + else -- Find values of t that solve the quadratic equation + -- (a^2 + c^2)t^2 + 2(ax + cz)t + x^2 + z^2 - 1 = 0 + let c1 = sq a + sq c + c2 = 2 * (x * a + z * c) + c3 = sq x + sq z - 1 + in + case quadratic c1 c2 c3 of + Nothing -> emptyIList + Just (t1, t2) -> entryexit (g t1) (g t2) + + where sqxy = sq x + sq y + g t = (t, (Cylindrical origin v1 v2, (CylinderSide, p0, texture))) + where origin = point 0 0 0 + x0 = x + t * a + y0 = y + t * b + z0 = z + t * c + p0 = point x0 y0 z0 + v0 = vector x0 0 z0 + (v1, v2) = tangents v0 + + x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + + +------------------- +-- Cone +------------------- + +intersectCone :: Ray -> a -> IList (Surface, Texture a) +intersectCone ray texture + = isectSide `intersectIntervals` isectTop `intersectIntervals` isectBottom + where isectSide = intersectConeSide ray texture + isectTop = intersectXZPlane ConeBase ray 1.0 texture + isectBottom = complementIntervals $ negateSurfaces $ + intersectXZPlane ConeBase ray 0.0 texture + +intersectConeSide (r, v) texture + = -- Find the points where the ray intersects the cond side. At any points of + -- intersection, we must have: + -- (x + ta)^2 + (z + tc)^2 = (y + tb)^2 + -- which is the following quadratic equation: + -- t^2(a^2-b^2+c^2) + 2t(xa-yb+cz) + (x^2-y^2+z^2) = 0 + let c1 = sq a - sq b + sq c + c2 = 2 * (x * a - y * b + c * z) + c3 = sq x - sq y + sq z + in case quadratic c1 c2 c3 of + Nothing -> emptyIList + Just (t1, t2) -> + -- If either intersection strikes the middle, then the other + -- can only be off by rounding error, so we make a tangent + -- strike using the "good" value. + -- If the intersections straddle the origin, then it's + -- an exit/entry pair, otherwise it's an entry/exit pair. + let y1 = y + t1 * b + y2 = y + t2 * b + in if y1 `near` 0 then entryexit (g t1) (g t1) + else if y2 `near` 0 then entryexit (g t2) (g t2) + else if (y1 < 0) `xor` (y2 < 0) then exitentry (g t1) (g t2) + else entryexit (g t1) (g t2) + + where g t = (t, (Conic origin v1 v2, (ConeSide, p0, texture))) + where origin = point 0 0 0 + x0 = x + t * a + y0 = y + t * b + z0 = z + t * c + p0 = point x0 y0 z0 + v0 = normalize $ vector x0 (-y0) z0 + (v1, v2) = tangents v0 + + x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + + -- beyond me why this isn't defined in the prelude... + xor False b = b + xor True b = not b + + +------------------- +-- Solving quadratics +------------------- + +quadratic :: Double -> Double -> Double -> Maybe (Double, Double) +quadratic a b c = + -- Solve the equation ax^2 + bx + c = 0 by using the quadratic formula. + let d = sq b - 4 * a * c + d' = if d `near` 0 then 0 else d + in if d' < 0 + then Nothing -- There are no real roots. + else + if a > 0 then Just (((-b) - sqrt d') / (2 * a), + ((-b) + sqrt d') / (2 * a)) + else Just (((-b) + sqrt d') / (2 * a), + ((-b) - sqrt d') / (2 * a)) + +------------------- +-- Bounding boxes +------------------- + +data MaybeInterval = Interval !Double !Double + | NoInterval + +isInterval (Interval _ _) = True +isInterval _ = False + +intersectWithBox :: Ray -> Box -> Bool +intersectWithBox (r, v) (B x1 x2 y1 y2 z1 z2) + = isInterval interval + where x_interval = intersectRayWithSlab (xCoord r) (xComponent v) (x1, x2) + y_interval = intersectRayWithSlab (yCoord r) (yComponent v) (y1, y2) + z_interval = intersectRayWithSlab (zCoord r) (zComponent v) (z1, z2) + interval = intersectInterval x_interval + (intersectInterval y_interval z_interval) + +intersectInterval :: MaybeInterval -> MaybeInterval -> MaybeInterval +intersectInterval NoInterval _ = NoInterval +intersectInterval _ NoInterval = NoInterval +intersectInterval (Interval a b) (Interval c d) + | b < c || d < a = NoInterval + | otherwise = Interval (a `max` c) (b `min` d) + +{-# INLINE intersectRayWithSlab #-} +intersectRayWithSlab :: Double -> Double -> (Double,Double) -> MaybeInterval +intersectRayWithSlab xCoord alpha (x1, x2) + | alpha == 0 = if xCoord < x1 || xCoord > x2 then NoInterval else infInterval + | alpha > 0 = Interval a b + | otherwise = Interval b a + where a = (x1 - xCoord) / alpha + b = (x2 - xCoord) / alpha + +infInterval = Interval (-inf) inf diff --git a/testsuite/tests/programs/galois_raytrace/Interval.hs b/testsuite/tests/programs/galois_raytrace/Interval.hs new file mode 100644 index 0000000000..a4d313f66e --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Interval.hs @@ -0,0 +1,121 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Interval + ( IList + , Intersection + , emptyIList, openIList + , mkEntry, mkExit + , entryexit, exitentry + , mapI + , unionIntervals, intersectIntervals, differenceIntervals + , complementIntervals + ) where + +import Geometry + +-- The result of a ray trace is represented as a list of surface +-- intersections. Each intersection is a point along the ray with +-- a flag indicating whether this intersection is an entry or an +-- exit from the solid. Each intersection also carries unspecified +-- surface data for use by the illumination model. + +-- Just the list of intersections isn't enough, however. An empty +-- list can denote either a trace that is always within the solid +-- or never in the solid. To dissambiguate, an extra flag is kept +-- that indicates whether we are starting inside or outside of the +-- solid. As a convenience, we also keep an additional flag that +-- indicates whether the last intersection ends inside or outside. + +type IList a = (Bool, [Intersection a], Bool) +type Intersection a = (Double, Bool, a) + +emptyIList = (False, [], False) +openIList = (True, [], True) + +mapI f (b1, is, b2) = (b1, map f is, b2) + +isEntry (_, entry, _) = entry +isExit (_, entry, _) = not entry + +mkEntry (t, a) = (t, True, a) +mkExit (t, a) = (t, False, a) + +entryexit w1 w2 = (False, [mkEntry w1, mkExit w2], False) +exitentry w1 w2 = (True, [mkExit w1, mkEntry w2], True) +arrange w1@(t1, _) w2@(t2, _) | t1 < t2 = entryexit w1 w2 + | otherwise = entryexit w2 w1 + + +cmpI :: Intersection a -> Intersection a -> Ordering +cmpI (i, _, _) (j, _, _) + | i `near` j = EQ + | i < j = LT + | otherwise = GT + +bad (b1, [], b2) = b1 /= b2 +bad (b1, is, b2) = bad' b1 is || b2 /= b3 + where (_, b3, _) = last is + +bad' b [] = False +bad' b ((_, c, _) : is) = b == c || bad' c is + +unionIntervals :: IList a -> IList a -> IList a +unionIntervals (isStartOpen, is, isEndOpen) (jsStartOpen, js, jsEndOpen) + = (isStartOpen || jsStartOpen, uniIntervals is js, isEndOpen || jsEndOpen) + where uniIntervals is [] | jsEndOpen = [] + | otherwise = is + uniIntervals [] js | isEndOpen = [] + | otherwise = js + uniIntervals is@(i : is') js@(j : js') + = case cmpI i j of + EQ -> if isEntry i == isEntry j then i : uniIntervals is' js' + else uniIntervals is' js' + LT -> if isEntry j then i : uniIntervals is' js + else uniIntervals is' js + GT -> if isEntry i then j : uniIntervals is js' + else uniIntervals is js' + +intersectIntervals :: IList a -> IList a -> IList a +intersectIntervals is js + = complementIntervals (unionIntervals is' js') + where is' = complementIntervals is + js' = complementIntervals js + +differenceIntervals :: IList a -> IList a -> IList a +differenceIntervals is js + = complementIntervals (unionIntervals is' js) + where is' = complementIntervals is + +complementIntervals :: IList a -> IList a +complementIntervals (o1, is, o2) + = (not o1, [ (i, not isentry, a) | (i, isentry, a) <- is ], not o2) + +-- tests... + +{- +mkIn, mkOut :: Double -> Intersection a +mkIn x = (x, True, undefined) +mkOut x = (x, False, undefined) + +i1 = (False, [ mkIn 2, mkOut 7 ], False) +i1' = (True, [ mkOut 2, mkIn 7 ], True) +i2 = (False, [ mkIn 1, mkOut 3, mkIn 4, mkOut 5, mkIn 6, mkOut 8 ], False) + +t1 = unionIntervals i1 i2 +t2 = intersectIntervals i1 i2 +t3 = intersectIntervals i2 i1 +t4 = complementIntervals i1 +t5 = intersectIntervals i2 i1' +t6 = differenceIntervals i2 i1 +t7 = differenceIntervals i2 i2 + +sh (o1,is,o2) = + do if o1 then putStr "..." else return () + putStr $ foldr1 (++) (map si is) + if o2 then putStr "..." else return () +si (i, True, _, _) = "<" ++ show i +si (i, False, _, _) = " " ++ show i ++ ">" +-} diff --git a/testsuite/tests/programs/galois_raytrace/Main.hs b/testsuite/tests/programs/galois_raytrace/Main.hs new file mode 100644 index 0000000000..4ef9fe3e95 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Main.hs @@ -0,0 +1,17 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +-- Modified to read sample input directly from a file. + +module Main where + +import System + +import Parse +import Eval + +main = do { str <- readFile "galois.gml" + ; mainEval (rayParse str) + } diff --git a/testsuite/tests/programs/galois_raytrace/Makefile b/testsuite/tests/programs/galois_raytrace/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/galois_raytrace/Misc.hs b/testsuite/tests/programs/galois_raytrace/Misc.hs new file mode 100644 index 0000000000..104bd06af1 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Misc.hs @@ -0,0 +1,11 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Misc where + +import Debug.Trace + +debug s v = trace (s ++" : "++ show v ++ "\n") v +-- debug s v = v diff --git a/testsuite/tests/programs/galois_raytrace/Parse.hs b/testsuite/tests/programs/galois_raytrace/Parse.hs new file mode 100644 index 0000000000..931655c16e --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Parse.hs @@ -0,0 +1,137 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Parse where + +import Char +import Text.ParserCombinators.Parsec hiding (token) + +import Data + + +program :: Parser Code +program = + do { whiteSpace + ; ts <- tokenList + ; eof + ; return ts + } + +tokenList :: Parser Code +tokenList = many token <?> "list of tokens" + +token :: Parser GMLToken +token = + do { ts <- braces tokenList ; return (TBody ts) } + <|> do { ts <- brackets tokenList ; return (TArray ts) } + <|> (do { s <- gmlString ; return (TString s) } <?> "string") + <|> (do { t <- pident False ; return t } <?> "identifier") + <|> (do { char '/' -- No whitespace after slash + ; t <- pident True ; return t } <?> "binding identifier") + <|> (do { n <- number ; return n } <?> "number") + +pident :: Bool -> Parser GMLToken +pident rebind = + do { id <- ident + ; case (lookup id opTable) of + Nothing -> if rebind then return (TBind id) else return (TId id) + Just t -> if rebind then error ("Attempted rebinding of identifier " ++ id) else return t + } + +ident :: Parser String +ident = lexeme $ + do { l <- letter + ; ls <- many (satisfy (\x -> isAlphaNum x || x == '-' || x == '_')) + ; return (l:ls) + } + +gmlString :: Parser String +gmlString = lexeme $ between (char '"') (char '"') (many (satisfy (\x -> isPrint x && x /= '"'))) + +-- Tests for numbers +-- Hugs breaks on big exponents (> ~40) +test_number = "1234 -1234 1 -0 0" ++ + " 1234.5678 -1234.5678 1234.5678e12 1234.5678e-12 -1234.5678e-12" ++ + " -1234.5678e12 -1234.5678E-12 -1234.5678E12" ++ + " 1234e11 1234E33 -1234e33 1234e-33" ++ + " 123e 123.4e 123ee 123.4ee 123E 123.4E 123EE 123.4EE" + + +-- Always int or real +number :: Parser GMLToken +number = lexeme $ + do { s <- optSign + ; n <- decimal + ; do { string "." + ; m <- decimal + ; e <- option "" exponent' + ; return (TReal (read (s ++ n ++ "." ++ m ++ e))) -- FIXME: Handle error conditions + } + <|> do { e <- exponent' + ; return (TReal (read (s ++ n ++ ".0" ++ e))) + } + <|> do { return (TInt (read (s ++ n))) } + } + +exponent' :: Parser String +exponent' = try $ + do { e <- oneOf "eE" + ; s <- optSign + ; n <- decimal + ; return (e:s ++ n) + } + +decimal = many1 digit + +optSign :: Parser String +optSign = option "" (string "-") + + +------------------------------------------------------ +-- Library for tokenizing. + +braces p = between (symbol "{") (symbol "}") p +brackets p = between (symbol "[") (symbol "]") p + +symbol name = lexeme (string name) + +lexeme p = do{ x <- p; whiteSpace; return x } + +whiteSpace = skipMany (simpleSpace <|> oneLineComment <?> "") + where simpleSpace = skipMany1 (oneOf " \t\n\r\v") + oneLineComment = + do{ string "%" + ; skipMany (noneOf "\n\r\v") + ; return () + } + + +------------------------------------------------------------------------------ + +rayParse :: String -> Code +rayParse is = case (parse program "<stdin>" is) of + Left err -> error (show err) + Right x -> x + +rayParseF :: String -> IO Code +rayParseF file = + do { r <- parseFromFile program file + ; case r of + Left err -> error (show err) + Right x -> return x + } + +run :: String -> IO () +run is = case (parse program "" is) of + Left err -> print err + Right x -> print x + +runF :: IO () +runF = + do { r <- parseFromFile program "simple.gml" + ; case r of + Left err -> print err + Right x -> print x + } diff --git a/testsuite/tests/programs/galois_raytrace/Pixmap.hs b/testsuite/tests/programs/galois_raytrace/Pixmap.hs new file mode 100644 index 0000000000..11d20f0df2 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Pixmap.hs @@ -0,0 +1,64 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Pixmap where + +import Char +import IO hiding (try) +import Parsec + +readPPM f + = do h <- openFile f ReadMode + s <- hGetContents h + case (parse parsePPM f s) of + Left err -> error (show err) + Right x -> return x + +writePPM f ppm + = do h <- openFile f WriteMode + let s = showPPM (length (head ppm)) (length ppm) ppm + hPutStr h s + +-- parsing + +parsePPM + = do string "P6" + whiteSpace + width <- number + whiteSpace + height <- number + whiteSpace + colormax <- number + whiteSpace + cs <- getInput + return (chop width (chopColors cs)) + +chopColors [] = [] +chopColors (a:b:c:ds) = (ord a, ord b, ord c) : chopColors ds + +chop n [] = [] +chop n xs = h : chop n t + where (h, t) = splitAt n xs + +number + = do ds <- many1 digit + return (read ds :: Int) + +whiteSpace + = skipMany (simpleSpace <|> oneLineComment <?> "") + where simpleSpace = skipMany1 (oneOf " \t\n\r\v") + oneLineComment = + do char '#' + skipMany (noneOf "\n\r\v") + return () + +-- printing + +showPPM :: Int -> Int -> [[(Int,Int,Int)]] -> String +showPPM wid ht pss + = header ++ concat [[chr r, chr g, chr b] | ps <- pss, (r, g, b) <-ps] + where + header = "P6\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n" +showPPM _ _ _ = error "incorrect length of bitmap string" diff --git a/testsuite/tests/programs/galois_raytrace/Primitives.hs b/testsuite/tests/programs/galois_raytrace/Primitives.hs new file mode 100644 index 0000000000..2f21654055 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Primitives.hs @@ -0,0 +1,24 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Primitives where + +rad2deg :: Double -> Double +rad2deg r = r * 180 / pi + +deg2rad :: Double -> Double +deg2rad d = d * pi / 180 + +addi :: Int -> Int -> Int +addi = (+) + +addf :: Double -> Double -> Double +addf = (+) + +acosD :: Double -> Double +acosD x = acos x * 180 / pi + +asinD :: Double -> Double +asinD x = asin x * 180 / pi diff --git a/testsuite/tests/programs/galois_raytrace/RayTrace.hs b/testsuite/tests/programs/galois_raytrace/RayTrace.hs new file mode 100644 index 0000000000..cb15388e2c --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/RayTrace.hs @@ -0,0 +1,9 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module RayTrace(module Illumination, module Surface) where + +import Illumination +import Surface diff --git a/testsuite/tests/programs/galois_raytrace/Surface.hs b/testsuite/tests/programs/galois_raytrace/Surface.hs new file mode 100644 index 0000000000..832f0fcae2 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/Surface.hs @@ -0,0 +1,115 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Surface + ( SurfaceFn (..) + , Properties + , sfun, sconst + , prop + , matte, shiny + , chgColor + , surface + ) where + +import Geometry +import CSG +import Misc + +-- the surface gets passed face then u then v. +data SurfaceFn c v = SFun (Int -> Double -> Double -> Properties c v) + | SConst (Properties c v) + +sfun :: (Int -> Double -> Double -> Properties c v) -> SurfaceFn c v +sfun = SFun +sconst :: Properties c v -> SurfaceFn c v +sconst = SConst + +type Properties c v = (c, v, v, v) + +prop c d s p = (c, d, s, p) + +matte = (white, 1.0, 0.0, 1.0) +shiny = (white, 0.0, 1.0, 1.0) + +chgColor :: c -> Properties d v -> Properties c v +chgColor c (_, d, s, p) = (c, d, s, p) + +instance (Show c, Show v) => Show (SurfaceFn c v) where + show (SFun _) = "Surface function" + -- show (SConst p) = "Surface constant: " ++ show p + show (SConst p) = "Surface constant" + +evalSurface :: SurfaceFn Color Double -> Int -> Double -> Double -> Properties Color Double +evalSurface (SConst p) = \_ _ _ -> p +evalSurface (SFun f) = f + +-- calculate surface properties, given the type of +-- surface, and intersection point in object coordinates + +-- surface :: Surface SurfaceFn -> (Int, Point) -> (Vector, Properties) + +surface (Planar _ v0 v1) (n, p0, fn) + = (norm, evalSurface fn n' u v) + where norm = normalize $ cross v0 v1 + (n', u, v) = planarUV n p0 + +surface (Spherical _ v0 v1) (_, p0, fn) + = (norm, evalSurface fn 0 u v) + where x = xCoord p0 + y = yCoord p0 + z = zCoord p0 + k = sqrt (1 - sq y) + theta = adjustRadian (atan2 (x / k) (z / k)) + -- correct so that the image grows left-to-right + -- instead of right-to-left + u = 1.0 - clampf (theta / (2 * pi)) + v = clampf ((y + 1) / 2) + norm = normalize $ cross v0 v1 + +-- ZZ ignore the (incorrect) surface model, and estimate the normal +-- from the intersection in object space +surface (Cylindrical _ v0 v1) (_, p0, fn) + = (norm, evalSurface fn 0 u v) + where x = xCoord p0 + y = yCoord p0 + z = zCoord p0 + u = clampf $ adjustRadian (atan2 x z) / (2 * pi) + v = y + norm = normalize $ cross v0 v1 + +-- ZZ ignore the (incorrect) surface model, and estimate the normal +-- from the intersection in object space +surface (Conic _ v0 v1) (_, p0, fn) + = (norm, evalSurface fn 0 u v) + where x = xCoord p0 + y = yCoord p0 + z = zCoord p0 + u = clampf $ adjustRadian (atan2 (x / y) (z / y)) / (2 * pi) + v = y + norm = normalize $ cross v0 v1 + +planarUV face p0 + = case face of + PlaneFace -> (0, x, z) + + CubeFront -> (0, x, y) + CubeBack -> (1, x, y) + CubeLeft -> (2, z, y) + CubeRight -> (3, z, y) + CubeTop -> (4, x, z) + CubeBottom -> (5, x, z) + + CylinderTop -> (1, (x + 1) / 2, (z + 1) / 2) + CylinderBottom -> (2, (x + 1) / 2, (z + 1) / 2) + + ConeBase -> (1, (x + 1) / 2, (z + 1) / 2) + where x = xCoord p0 + y = yCoord p0 + z = zCoord p0 + +-- misc + +adjustRadian :: Radian -> Radian +adjustRadian r = if r > 0 then r else r + 2 * pi diff --git a/testsuite/tests/programs/galois_raytrace/galois.gml b/testsuite/tests/programs/galois_raytrace/galois.gml new file mode 100644 index 0000000000..5029d57620 --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/galois.gml @@ -0,0 +1,147 @@ + +[ [97 95 73 50 89 97 99 99 99 99 99 99 99 99 99 98 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 98 99 99 99 99 99 98 99 99 98 97 99 99 99 99 99 99 99 99 99 99 97 97 96 96 96 96 96 96 99 99 99] + [88 96 66 53 52 86 99 99 99 99 99 99 99 99 99 99 99 99 99 98 99 99 99 99 99 99 99 99 99 99 98 96 98 99 99 99 99 99 99 99 99 97 98 99 99 99 99 99 99 99 99 99 96 96 96 98 97 96 96 96 97 97 96] + [89 92 79 50 54 45 91 98 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 98 98 99 98 96 98 98 98 98 97 98 99 99 99 99 99 99 99 99 99 99 99 99 99 97 96 96 97 99 99 96 96 98 98 97 97] + [88 91 96 81 40 35 39 91 95 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 98 97 97 98 99 98 99 99 96 95 95 95 96 97 99 99 98 97 99 99 97 98 99 99 98 96 96 96 94 96 98 99 96 96 96 97 95 96] + [83 92 91 48 54 33 62 64 98 99 99 99 99 99 99 99 97 98 99 99 99 99 99 99 99 98 98 99 99 99 99 99 99 98 97 97 98 99 97 99 99 99 99 99 99 99 99 99 99 99 96 97 98 96 96 97 99 98 96 95 96 96 96] + [91 93 64 78 94 75 57 50 81 97 99 99 99 99 99 98 94 96 99 99 99 99 99 99 99 97 98 99 99 99 98 98 99 98 99 98 99 99 98 99 99 99 99 99 99 99 99 99 99 99 97 99 98 96 91 96 97 98 98 96 96 96 99] + [95 63 85 94 84 95 72 61 44 84 96 98 99 99 99 99 98 98 98 99 99 99 99 99 99 97 96 98 99 99 97 96 98 99 99 97 98 99 98 97 99 99 99 99 99 99 99 99 99 99 97 99 99 96 93 98 96 97 96 96 96 96 95] + [63 80 88 96 96 88 90 52 64 52 95 98 99 99 99 99 99 99 97 98 99 99 99 97 97 99 98 97 97 97 99 96 98 99 99 97 98 99 99 98 98 98 99 99 99 99 99 99 99 99 98 98 99 96 96 96 94 97 98 99 96 92 95] + [92 84 90 92 91 88 89 75 50 58 64 96 99 99 99 99 99 99 99 99 99 99 99 98 99 99 98 99 99 98 99 98 99 99 99 99 99 99 99 99 98 98 99 99 99 96 99 98 99 99 99 97 96 97 96 96 92 96 99 98 95 94 95] + [91 80 85 85 92 96 93 87 81 49 66 88 99 99 99 99 99 99 99 99 99 99 99 98 99 99 96 98 99 99 99 99 99 98 99 99 99 98 99 99 99 99 99 99 99 98 99 98 99 99 98 97 98 96 96 96 93 96 99 98 96 97 97] + [70 90 96 96 95 95 97 93 60 73 64 67 93 97 99 99 99 99 99 99 99 99 99 98 97 97 98 99 99 99 99 99 98 94 97 98 99 98 99 99 99 99 99 99 99 99 98 98 98 97 98 99 99 96 96 96 96 96 99 97 96 96 95] + [93 93 97 97 94 88 85 89 90 57 72 43 82 97 99 99 99 99 99 99 99 99 99 99 98 96 97 99 99 99 99 99 99 96 96 96 98 99 99 98 99 97 98 99 99 98 95 81 88 84 98 98 95 96 96 95 96 96 98 95 94 94 92] + [87 96 91 94 96 97 98 94 75 66 76 60 67 83 99 99 99 99 99 99 99 99 99 99 99 98 98 99 99 99 99 99 99 97 97 97 95 96 97 95 96 76 70 66 73 83 92 60 88 58 88 95 95 95 96 94 95 96 98 96 97 97 97] + [90 96 86 84 89 85 93 92 96 96 94 84 56 85 98 98 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 98 99 97 56 40 57 71 69 66 78 73 84 55 34 39 39 41 44 46 31 61 90 98 97 92 94 98 99 97 98 98 98] + [93 91 94 89 66 81 86 94 89 87 97 82 84 65 84 82 87 89 97 96 97 99 99 99 99 99 99 99 99 99 99 97 96 40 4 15 9 9 6 2 7 14 23 9 8 8 10 3 3 8 13 12 17 42 90 93 86 93 96 97 96 96 96] + [85 82 82 76 91 90 86 83 84 86 54 37 26 49 31 20 13 43 40 55 80 95 98 98 99 99 99 99 99 98 99 97 66 10 3 4 12 19 4 4 7 18 7 4 11 11 6 11 24 11 12 8 18 9 30 85 93 90 98 99 96 93 96] + [77 68 78 66 72 66 79 92 73 57 57 73 69 39 73 68 70 57 22 15 17 21 50 83 93 97 98 99 99 97 94 66 12 0 0 0 3 4 6 21 7 3 5 2 3 14 17 7 4 6 28 39 39 24 20 53 95 80 98 99 98 96 97] + [69 75 86 82 89 86 64 51 66 93 93 80 90 92 89 87 92 94 68 34 24 13 17 6 20 55 91 98 98 95 66 10 18 4 3 3 1 3 12 10 9 11 17 3 15 14 17 23 15 26 25 25 21 43 21 10 65 62 97 98 99 98 96] + [95 94 94 68 45 48 41 69 84 72 80 94 78 78 94 96 88 93 95 94 83 67 35 13 28 38 15 40 87 80 17 7 4 7 6 9 37 20 19 19 22 9 5 7 11 13 26 14 29 27 41 35 44 19 20 16 43 70 96 96 97 99 99] + [93 96 88 54 57 57 75 74 70 79 94 96 94 97 97 88 88 96 83 97 97 72 65 75 46 21 17 9 28 29 19 22 4 9 8 5 24 34 17 19 7 8 25 16 9 5 8 12 15 32 54 43 30 14 18 11 45 62 96 96 96 97 98] + [97 91 56 59 44 70 63 78 88 82 73 82 96 97 78 94 94 96 99 99 98 91 54 21 4 4 3 11 14 35 14 17 7 26 36 21 11 35 42 24 3 9 17 13 9 20 9 21 20 45 28 35 42 19 38 14 36 67 98 98 97 97 96] + [80 42 56 39 41 71 74 62 54 57 62 68 96 87 92 95 93 97 98 98 67 21 7 4 5 19 22 25 10 8 24 7 6 26 42 43 38 42 32 13 36 60 81 88 67 62 37 63 28 15 26 44 32 30 25 38 62 70 73 78 87 95 97] + [33 60 39 44 80 73 40 59 58 55 70 71 90 91 86 97 98 98 92 43 8 9 2 6 42 65 50 45 27 27 24 9 13 37 66 66 88 80 60 72 92 90 96 98 94 84 43 43 18 31 34 35 19 53 28 46 31 23 49 56 40 78 96] + [74 32 63 76 67 52 85 93 81 74 85 83 65 80 88 96 98 68 30 4 2 2 2 24 82 56 40 25 44 44 30 52 70 83 87 91 90 73 69 51 86 97 99 99 97 92 44 39 28 26 26 22 49 23 36 67 37 17 23 27 39 54 91] + [44 62 77 88 81 94 95 94 55 78 57 42 77 79 90 92 39 7 3 9 1 4 19 68 57 39 49 54 62 53 74 92 88 97 99 99 90 64 82 53 84 99 99 99 97 99 87 76 52 39 48 37 35 26 51 32 8 6 19 6 42 78 84] + [61 82 82 81 96 90 94 66 64 77 65 81 96 97 81 20 2 5 9 10 21 23 61 67 55 48 53 61 48 87 97 96 98 98 98 96 69 50 85 60 65 98 99 99 98 97 94 62 45 50 57 54 21 11 16 11 6 11 21 6 26 71 75] + [93 77 71 97 90 93 51 85 65 77 94 96 94 77 15 1 0 0 8 9 8 53 73 61 64 59 59 53 87 98 98 98 96 94 98 75 37 34 84 51 37 97 98 99 99 97 57 5 5 4 5 4 7 3 18 4 6 15 9 4 8 64 76] + [96 82 93 79 95 82 81 79 85 96 91 74 44 11 12 9 2 0 5 5 24 69 55 63 84 82 75 78 92 98 99 97 95 91 89 33 38 41 70 55 30 94 98 99 98 90 11 8 4 6 3 12 41 2 3 1 6 6 6 6 16 30 58] + [89 66 92 84 96 98 97 92 96 75 45 29 9 38 6 10 3 10 1 8 69 67 64 70 85 87 93 94 97 99 99 99 94 94 70 44 23 60 78 55 28 98 99 99 99 78 6 9 16 15 5 2 8 4 7 1 18 13 18 16 4 23 66] + [48 79 85 82 90 97 96 95 64 20 25 26 27 12 5 8 6 7 6 42 74 64 49 80 94 96 98 99 99 99 99 98 94 96 71 50 7 55 92 31 49 98 99 99 98 62 7 10 13 8 12 11 9 3 5 4 16 9 11 9 13 44 68] + [93 72 87 92 96 98 95 62 38 9 23 64 5 6 12 32 7 9 15 70 69 54 75 97 96 97 99 99 99 99 99 98 98 96 71 79 62 66 69 20 41 98 99 99 98 63 9 29 38 33 28 17 17 40 10 9 18 10 22 10 8 39 74] + [93 69 84 88 95 93 72 41 17 31 69 54 35 6 6 26 18 36 39 68 77 82 95 98 98 97 99 98 99 99 99 99 99 97 91 89 92 63 31 11 44 98 99 99 98 77 19 8 13 22 30 28 35 14 18 21 15 7 37 46 23 53 91] + [77 85 92 96 88 65 24 23 58 63 44 35 24 17 9 24 18 21 43 54 87 95 97 98 98 97 99 97 96 98 99 99 99 99 97 89 64 47 42 16 68 99 99 99 99 94 31 17 37 25 20 51 13 7 8 7 6 34 40 39 65 63 94] + [58 83 97 92 90 42 34 66 76 38 42 35 22 12 10 51 8 33 54 80 98 96 94 90 56 88 94 95 70 68 98 98 98 97 96 94 89 66 30 48 97 99 99 99 98 98 61 13 24 10 20 19 18 6 15 10 11 25 43 27 63 53 92] + [87 71 66 73 79 65 69 44 74 47 44 38 18 15 24 29 9 38 67 93 98 96 79 53 46 96 95 88 23 61 87 95 95 95 87 79 56 35 46 89 99 99 99 99 99 98 67 23 13 10 21 49 31 21 26 16 17 36 46 40 46 67 96] + [96 80 47 69 60 77 59 22 29 74 61 50 56 41 34 27 12 48 74 96 99 97 56 40 23 95 96 63 39 77 85 82 77 75 69 68 71 77 90 97 99 99 99 99 99 98 66 29 44 17 7 23 23 18 24 27 16 33 67 18 30 87 96] + [97 96 92 70 45 52 21 22 30 18 38 74 82 25 24 21 12 35 74 96 99 93 31 57 33 95 94 35 17 53 50 48 77 89 93 96 96 98 95 97 99 99 99 99 99 99 72 7 16 28 22 31 14 10 20 23 16 13 39 25 54 95 92] + [90 64 52 70 92 83 73 49 25 8 36 40 44 25 39 28 42 26 72 96 98 96 28 41 43 95 88 18 8 75 92 89 91 95 98 93 75 61 94 97 99 99 99 99 99 98 82 13 12 20 34 25 9 23 73 55 45 19 21 15 93 95 96] + [22 38 82 96 93 95 93 81 89 51 45 46 26 36 28 24 36 15 31 94 98 95 55 44 30 80 93 34 19 87 88 89 83 94 94 79 30 16 33 90 97 99 99 99 98 98 74 26 9 32 38 21 14 54 74 41 46 46 18 29 91 92 96] + [79 92 98 98 98 95 86 82 85 91 94 81 47 28 13 16 47 7 6 69 93 95 92 70 40 75 95 83 44 42 43 83 94 96 81 61 26 26 7 32 85 98 99 99 98 95 62 38 8 13 20 30 23 62 42 31 3 11 11 59 94 97 97] + [96 96 97 98 98 85 82 94 93 88 89 96 94 92 59 40 19 12 3 10 37 84 90 94 79 60 93 67 75 65 68 94 97 96 66 40 9 11 48 4 35 93 98 99 97 62 50 36 4 3 15 53 33 63 28 6 2 15 56 72 97 97 95] + [98 94 97 95 86 94 91 89 90 95 95 96 95 93 98 88 75 58 34 29 7 21 54 83 84 89 75 79 85 94 94 95 98 82 43 25 6 21 60 24 15 89 97 99 70 66 47 48 2 0 3 22 21 7 4 1 6 55 83 96 98 95 93] + [93 96 96 91 60 65 73 87 93 96 95 91 91 88 94 97 97 97 90 76 74 25 2 19 37 59 72 71 83 91 87 90 92 95 67 47 69 37 51 45 3 76 98 98 46 83 71 21 3 4 2 19 13 2 0 7 60 89 97 99 98 92 90] + [90 88 92 95 97 95 95 93 87 88 82 86 95 93 92 91 97 96 49 73 58 58 24 6 10 58 77 49 56 84 82 89 87 94 87 46 71 37 47 67 9 54 98 98 56 50 58 13 14 18 0 10 20 4 2 31 96 96 99 99 99 96 95] + [78 55 84 95 97 89 73 71 89 92 91 89 90 90 83 82 93 93 68 54 41 27 24 49 85 96 97 89 72 70 48 70 76 91 95 92 43 25 40 87 27 69 97 96 75 33 13 12 10 5 2 14 6 3 15 86 99 97 99 99 97 96 97] + [43 61 66 70 93 79 86 94 89 84 80 84 90 96 90 92 94 92 81 37 34 70 94 96 99 98 99 98 96 95 85 77 57 62 63 59 55 50 52 77 33 63 91 71 18 6 4 5 4 4 4 12 4 15 77 98 99 99 99 98 95 95 96] + [77 82 75 56 62 67 86 85 84 89 92 90 80 77 52 61 56 59 70 89 98 98 99 99 99 99 99 99 99 98 98 98 92 92 91 69 61 47 28 22 4 9 14 7 4 3 7 11 4 9 4 4 22 79 97 96 97 99 98 96 93 95 96] + [97 96 93 97 94 86 69 64 73 59 71 71 71 64 87 94 95 96 99 99 99 99 99 99 99 97 99 99 99 99 99 99 98 96 96 96 96 95 96 93 77 35 11 4 10 2 7 6 2 1 18 59 97 97 99 97 97 99 99 97 95 95 95] + [96 97 98 94 97 95 89 75 65 85 89 93 97 98 99 98 98 99 99 99 99 99 99 97 97 99 98 99 99 97 96 96 95 94 95 97 96 96 96 97 98 93 75 45 19 4 2 4 18 49 90 98 99 99 99 95 96 98 96 96 96 95 96] + [96 98 99 97 96 95 78 59 78 97 98 98 99 99 99 99 99 99 99 99 99 99 99 98 98 99 97 97 98 96 92 91 92 95 96 98 98 95 96 97 99 98 96 97 93 82 80 87 98 97 98 99 99 98 97 96 96 98 96 96 96 97 96] + [95 84 92 97 95 94 50 80 95 98 99 99 99 99 99 97 96 99 98 97 98 99 99 97 97 99 97 97 96 96 90 82 89 92 97 94 94 94 93 96 99 99 98 99 97 99 98 99 99 97 97 97 98 98 96 97 96 96 96 96 96 98 96] + [97 90 92 98 92 52 39 93 98 99 99 99 99 99 98 95 95 98 98 96 97 99 99 97 97 99 99 98 98 95 93 89 87 92 94 88 90 90 88 94 96 97 98 98 97 99 99 99 99 97 97 96 95 96 95 96 96 97 98 98 99 98 96] + [96 94 90 95 69 43 75 97 99 99 99 99 99 99 97 96 94 94 95 96 99 99 97 94 95 98 99 97 95 95 98 95 87 93 89 89 87 88 93 94 90 94 96 96 98 98 99 98 99 98 96 97 97 95 93 95 96 98 99 99 99 98 99] + [97 81 85 68 51 53 96 97 99 99 99 99 99 99 99 97 94 95 95 96 96 98 98 97 95 94 95 95 84 90 96 95 93 95 94 88 79 88 92 97 95 95 95 96 98 99 97 97 99 99 99 98 95 94 96 98 97 99 98 98 98 99 99] + [81 86 70 56 71 72 97 99 99 99 99 99 99 99 99 99 97 98 97 96 96 96 98 98 95 94 96 96 92 94 92 94 95 94 93 91 91 93 95 97 92 87 93 95 98 99 95 95 99 98 98 98 94 88 95 95 96 98 96 97 97 96 98] + [67 62 30 43 90 73 95 98 98 96 98 98 97 98 95 98 95 95 96 95 98 94 95 96 94 95 96 95 95 96 90 94 96 96 96 92 91 92 94 96 97 91 91 95 94 97 95 93 98 96 96 96 97 95 96 93 95 96 96 96 97 95 96] + [53 35 46 37 71 72 94 97 99 99 98 97 98 98 95 94 96 97 96 96 98 87 92 93 96 95 95 92 93 96 95 93 93 89 94 90 87 89 92 90 95 96 97 90 90 96 95 94 97 97 96 96 96 97 97 94 95 96 96 97 96 97 96] + [74 88 56 35 91 90 88 94 97 97 95 95 97 98 95 94 96 97 96 96 98 96 95 95 92 88 91 92 92 94 93 94 90 86 88 95 94 93 93 92 97 96 96 94 95 96 96 96 98 99 98 99 98 98 98 97 95 97 98 98 96 94 93] + [92 93 63 65 92 97 93 95 99 96 89 98 99 98 96 98 96 93 93 95 97 94 91 94 97 94 95 96 93 88 85 90 92 86 90 97 96 96 96 93 94 97 95 96 94 96 99 96 96 96 96 98 98 96 95 95 94 97 96 93 92 95 93] + [82 94 95 81 92 95 92 97 99 98 94 93 92 97 94 97 97 98 94 90 97 95 92 94 94 90 91 96 92 88 94 94 89 83 90 97 96 96 95 96 97 95 94 97 96 96 97 94 93 93 96 98 94 96 96 92 89 90 94 94 94 92 88] + [78 85 76 94 97 95 96 97 99 99 98 96 97 97 96 97 97 95 95 96 98 96 96 96 88 86 93 96 94 93 89 88 88 90 90 94 94 97 97 96 96 97 98 98 98 96 92 87 96 96 96 96 96 94 92 93 88 88 93 95 94 90 87] + [83 88 91 94 97 97 99 98 98 98 98 99 99 98 99 98 99 97 98 97 98 96 96 95 96 94 96 95 95 91 85 90 90 93 94 94 92 94 95 96 98 97 98 98 97 97 97 96 96 96 95 96 94 95 95 94 93 93 94 95 93 88 91] + [95 90 94 94 98 96 98 99 96 98 97 97 98 98 99 99 96 95 97 97 99 95 96 98 93 96 96 96 93 95 89 93 93 95 96 96 97 97 97 97 99 98 97 96 98 99 99 99 98 93 93 96 96 96 95 94 91 92 90 93 94 96 96] +] /galois + +{ /v /u /face % bind parameters + { % toIntCoord : float -> int + 63.0 mulf floor /i % i = floor(3.0*i) + i 63 eqi { 62 } { i } if % return max(2, i) + } /toIntCoord + galois u toIntCoord apply get % val = texture[u][v] + v toIntCoord apply get + real 100.0 divf /gal + gal gal gal point % b/w galois + 1.0 % kd = 1.0 + 0.0 % ks = 0.0 + 1.0 % n = 1.0 +} /galoisface + + +galoisface cube +-0.5 -0.5 -0.5 translate % center +2.5 uscale % make it bigger +-25.0 rotatex -25.0 rotatey % rotate +0.0 -1.0 7.0 translate % move to final position + +%galoisface cylinder +%-0.5 -0.5 -0.5 translate % center +%1.5 uscale % make it bigger +%0.0 rotatex 90.0 rotatey % rotate +%0.0 0.0 5.0 translate % move to final position + +%galoisface sphere +%-0.5 -0.5 -0.5 translate % center +%1.5 uscale % make it bigger +%-25.0 rotatex 25.0 rotatey % rotate +%-3.0 0.0 5.0 translate % move to final position + +%union union % join the 3 together + +{ /v /u /face + v 5.0 divf /v + u 5.0 divf /u + v floor 2 modi 0 eqi + { 1.0 } + { 0.8 } + if /r + u floor 2 modi 0 eqi + { 1.0 } + { 0.8 } + if /g + v frac /v + u frac /u + v 0.0 lessf { v 1.0 addf } { v } if /v + u 0.0 lessf { u 1.0 addf } { u } if /u + { % toIntCoord : float -> int + 63.0 mulf floor /i % i = floor(3.0*i) + i 63 eqi { 62 } { i } if % return max(2, i) + } /toIntCoord + galois u toIntCoord apply get % val = texture[u][v] + v toIntCoord apply get + real 100.0 divf /gal + r gal mulf g gal mulf gal point % b/w galois + 0.0 % kd = 1.0 + 1.0 % ks = 0.0 + 1.0 % n = 1.0 +} plane /p + +p 0.0 -3.0 0.0 translate % plane at Y = -3 + +union + +/scene + % directional light +1.0 -1.0 0.0 point % direction +1.0 1.0 1.0 point light /l % directional light + +1.0 0.5 0.0 point % ambient light +[ l ] % lights +scene % scene to render +3 % tracing depth +90.0 % field of view +300 200 +"galois.ppm" % output file +render + diff --git a/testsuite/tests/programs/galois_raytrace/galois_raytrace.stdout b/testsuite/tests/programs/galois_raytrace/galois_raytrace.stdout new file mode 100644 index 0000000000..ca44ff5c4b --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/galois_raytrace.stdout @@ -0,0 +1,205 @@ +P3 +#Galois +300 200 +255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 253 142 255 248 125 255 253 128 255 248 125 255 248 125 255 248 125 255 245 124 255 248 125 255 243 123 255 250 127 255 248 125 255 240 122 255 253 128 255 255 129 255 250 127 255 245 124 208 139 70 255 217 110 255 196 99 254 170 86 255 175 89 255 235 119 255 243 123 255 248 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 150 255 248 125 255 250 127 255 255 129 255 255 129 255 250 127 255 243 123 255 238 120 255 248 125 255 248 125 255 253 128 255 240 122 255 232 118 239 160 81 255 181 91 255 173 87 255 181 91 88 59 30 81 54 27 34 23 11 69 46 23 42 28 14 142 95 48 154 103 52 177 119 60 96 64 32 57 38 19 227 152 77 255 248 125 255 255 129 255 255 129 255 248 125 255 250 127 255 248 125 255 255 129 255 253 128 255 250 127 255 248 125 255 238 120 255 243 123 255 248 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 153 255 255 160 255 250 127 255 248 125 255 248 125 255 253 128 255 248 125 255 248 125 255 248 125 255 248 125 255 248 125 255 253 128 162 108 55 92 62 31 166 111 56 54 36 18 146 98 49 108 72 36 139 93 47 61 41 20 69 46 23 27 18 9 19 12 6 69 46 23 30 20 10 61 41 20 88 59 30 212 142 72 119 80 40 23 15 7 27 18 9 255 222 112 255 253 128 255 250 127 255 248 125 255 248 125 255 248 125 255 248 125 255 245 124 255 245 124 255 230 116 255 240 122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 151 255 255 158 255 255 156 255 255 129 255 255 129 255 253 128 255 255 129 255 255 129 255 255 129 255 255 129 255 250 127 224 150 76 119 80 40 50 33 17 108 72 36 96 64 32 208 139 70 108 72 36 131 87 44 100 67 34 220 147 74 19 12 6 19 12 6 42 28 14 108 72 36 196 131 66 189 126 64 119 80 40 96 64 32 115 77 39 204 137 69 73 49 24 54 36 18 15 10 5 255 250 127 255 255 129 255 253 128 255 250 127 255 243 123 255 250 127 255 253 128 255 243 123 255 245 124 255 248 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 148 255 255 158 255 255 160 255 255 158 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 245 124 255 238 120 150 100 51 23 15 7 65 43 22 100 67 34 30 20 10 34 23 11 166 111 56 150 100 51 239 160 81 19 12 6 34 23 11 38 25 13 30 20 10 65 43 22 88 59 30 112 75 38 50 33 17 146 98 49 15 10 5 11 7 3 54 36 18 15 10 5 7 5 2 69 46 23 255 255 129 255 255 129 255 255 129 255 253 128 255 253 128 255 248 125 255 248 125 255 240 122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 155 255 255 155 255 255 160 255 255 156 255 255 158 255 255 129 255 253 128 255 250 127 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 254 170 86 34 23 11 15 10 5 7 5 2 27 18 9 61 41 20 255 227 115 255 253 128 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 253 128 255 255 129 255 255 129 255 255 129 255 255 129 255 253 128 255 250 127 177 119 60 216 144 73 69 46 23 15 10 5 73 49 24 255 250 127 255 255 129 255 255 129 255 250 127 255 248 125 255 248 125 255 248 125 255 250 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 155 255 255 153 255 255 160 255 255 156 255 255 156 255 255 155 255 255 129 255 255 129 255 255 129 255 255 129 255 250 127 255 253 128 255 255 129 255 255 129 255 253 128 255 245 124 7 5 2 27 18 9 34 23 11 84 56 28 27 18 9 139 93 47 255 238 120 255 217 110 251 168 85 142 95 48 108 72 36 189 126 64 169 113 57 255 175 89 255 255 129 255 255 129 255 255 129 255 250 127 255 240 122 255 230 116 208 139 70 243 162 82 34 23 11 255 240 122 255 253 128 255 250 127 255 245 124 255 225 114 255 248 125 255 250 127 255 245 124 255 250 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 153 255 255 158 255 255 156 255 255 161 255 255 161 255 255 158 255 255 129 255 255 129 255 250 127 255 245 124 255 255 129 255 253 128 255 253 128 255 255 129 255 255 129 255 253 128 220 147 74 34 23 11 46 31 15 3 2 1 142 95 48 131 87 44 162 108 55 255 206 104 247 165 83 193 129 65 158 106 53 231 155 78 212 142 72 243 162 82 181 121 61 135 90 45 255 199 101 235 157 80 61 41 20 42 28 14 81 54 27 142 95 48 96 64 32 181 121 61 255 248 125 255 245 124 255 227 115 255 240 122 255 245 124 255 238 120 255 240 122 255 245 124 255 245 124 255 250 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 156 255 255 155 255 255 156 255 255 158 255 255 161 255 255 153 255 255 156 255 255 129 255 255 129 255 248 125 255 253 128 255 253 128 255 255 129 255 255 129 255 253 128 255 243 123 255 250 127 255 250 127 154 103 52 0 0 0 15 10 5 27 18 9 100 67 34 100 67 34 142 95 48 255 250 127 255 253 128 255 230 116 255 181 91 255 183 93 255 235 119 255 250 127 255 225 114 255 178 90 255 253 128 255 243 123 254 170 86 166 111 56 255 225 114 255 245 124 255 235 119 255 248 125 255 248 125 255 250 127 255 230 116 255 240 122 255 248 125 255 227 115 255 232 118 255 232 118 255 248 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 151 255 255 156 255 255 160 255 255 156 255 255 145 121 84 47 255 194 109 255 255 148 255 255 129 255 253 128 255 253 128 255 255 129 255 253 128 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 243 123 254 170 86 65 43 22 54 36 18 92 62 31 92 62 31 255 191 97 255 250 127 255 255 129 255 255 129 255 253 128 255 255 129 255 255 129 255 245 124 255 212 107 255 230 116 255 230 116 255 243 123 255 245 124 255 230 116 255 181 91 255 253 128 255 255 129 255 235 119 255 212 107 255 245 124 255 245 124 255 243 123 255 240 122 255 232 118 255 227 115 255 232 118 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 151 255 255 160 255 255 160 255 255 158 25 17 9 75 52 29 167 116 65 163 113 63 255 255 129 255 255 129 255 253 128 255 250 127 255 255 129 255 253 128 255 250 127 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 253 128 34 23 11 42 28 14 96 64 32 96 64 32 208 139 70 235 157 80 255 201 102 255 243 123 255 255 129 255 253 128 255 248 125 88 59 30 150 100 51 30 20 10 73 49 24 169 113 57 255 219 111 255 214 108 255 186 94 255 248 125 255 255 129 255 255 129 255 248 125 255 253 128 255 217 110 255 245 124 255 240 122 255 240 122 255 238 120 255 245 124 255 240 122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 156 255 255 160 255 255 161 62 43 24 4 2 1 79 55 31 179 125 70 33 23 13 255 221 124 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 250 127 255 255 129 255 250 127 255 253 128 255 255 129 255 255 129 255 255 129 255 240 122 77 51 26 177 119 60 15 10 5 19 12 6 216 144 73 150 100 51 185 124 62 255 212 107 255 225 114 255 248 125 255 250 127 255 250 127 255 248 125 255 245 124 255 245 124 255 206 104 255 194 98 255 230 116 227 152 77 255 248 125 255 253 128 255 250 127 255 255 129 255 255 129 255 255 129 255 243 123 255 243 123 255 245 124 255 227 115 255 232 118 255 222 112 255 248 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +49 61 61 139 139 174 142 142 178 126 158 158 81 81 102 48 60 60 138 138 173 141 141 176 125 156 156 81 81 101 48 60 60 137 137 171 139 139 174 124 155 155 80 80 100 47 59 59 136 136 170 138 138 173 123 153 153 79 79 99 47 59 59 134 134 168 137 137 171 121 152 152 78 78 98 46 58 58 133 133 167 136 136 170 120 150 150 78 78 97 46 58 58 132 132 165 134 134 168 119 149 149 77 77 96 45 57 57 130 130 163 133 133 166 118 147 147 76 76 95 45 56 56 129 129 161 131 131 164 117 146 146 75 75 94 45 56 56 128 128 160 130 130 163 115 144 144 74 74 93 44 55 55 126 126 158 129 129 161 114 143 143 73 73 92 44 55 55 125 125 156 127 127 159 113 141 141 73 73 91 43 54 54 123 123 154 126 126 157 111 139 139 72 72 90 43 53 53 122 122 153 124 124 155 110 138 138 71 71 89 42 53 53 120 120 151 123 123 153 109 136 136 70 70 88 41 52 52 119 119 149 121 121 152 107 134 134 69 69 87 41 51 51 118 118 147 120 120 150 106 133 133 68 68 86 40 51 51 116 116 145 118 118 148 105 131 131 67 67 84 40 50 50 115 115 143 117 117 146 103 129 129 67 67 83 39 49 49 113 113 142 115 115 144 102 128 128 66 66 82 39 49 49 112 112 140 114 114 142 101 126 126 65 65 81 38 48 48 110 110 138 112 112 140 99 124 124 64 64 80 38 48 48 109 109 136 111 111 139 98 123 123 63 63 79 37 47 47 107 107 134 109 109 137 97 121 121 62 62 78 37 46 46 106 106 133 255 255 156 255 255 161 255 255 161 255 255 160 25 17 9 117 81 45 188 130 73 104 72 40 37 26 14 255 186 104 255 255 148 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 253 128 193 129 65 135 90 45 251 168 85 208 139 70 7 5 2 7 5 2 73 49 24 235 157 80 212 142 72 247 165 83 255 194 98 255 245 124 255 250 127 255 204 103 216 144 73 119 80 40 212 142 72 255 238 120 208 139 70 7 5 2 92 62 31 255 243 123 255 255 129 255 255 129 255 255 129 255 255 129 255 250 127 255 253 128 255 245 124 255 245 124 255 235 119 255 248 125 255 248 125 54 54 68 32 40 40 92 92 115 88 110 110 83 104 104 54 54 67 32 40 40 91 91 114 87 109 109 83 103 103 53 53 67 31 39 39 91 91 113 87 108 108 82 102 102 53 53 66 31 39 39 90 90 112 86 108 108 81 102 102 52 52 65 31 39 39 89 89 111 85 107 107 80 101 101 52 52 65 31 38 38 88 88 111 85 106 106 80 100 100 51 51 64 30 38 38 88 88 110 84 105 105 79 99 99 51 51 64 30 38 38 87 87 109 83 104 104 79 98 98 51 51 64 30 38 38 86 86 108 83 104 104 78 98 98 50 50 63 30 37 37 86 86 107 82 103 103 78 97 97 50 50 63 30 37 37 85 85 107 82 102 102 77 97 97 50 50 62 29 37 37 85 85 106 81 102 102 77 96 96 49 49 62 29 37 37 84 84 106 81 101 101 76 96 96 49 49 62 29 37 37 84 84 105 80 101 101 76 95 95 49 49 61 29 36 36 83 83 104 80 100 100 76 95 95 49 49 61 29 36 36 83 83 104 80 100 100 75 94 94 48 48 61 29 36 36 83 83 104 79 99 99 75 94 94 48 48 60 29 36 36 82 82 103 79 99 99 75 93 93 48 48 60 28 36 36 82 82 103 79 98 98 74 93 93 48 48 60 28 36 36 82 82 102 78 98 98 74 93 93 48 48 60 28 35 35 81 81 102 78 98 98 74 92 92 48 48 60 28 35 35 81 81 102 78 97 97 74 92 92 47 47 59 28 35 35 81 81 101 78 97 97 73 92 92 47 47 59 28 35 35 81 81 101 77 97 97 73 91 91 47 47 59 +127 159 159 49 61 61 142 142 178 82 82 102 139 139 174 126 158 158 48 60 60 141 141 177 81 81 101 138 138 172 125 156 156 48 60 60 140 140 175 80 80 100 137 137 171 124 155 155 47 59 59 139 139 174 80 80 100 135 135 169 123 153 153 47 59 59 137 137 172 79 79 99 134 134 168 121 152 152 47 58 58 136 136 170 78 78 98 133 133 166 120 150 150 46 58 58 135 135 169 77 77 97 132 132 165 119 149 149 46 57 57 133 133 167 76 76 96 130 130 163 118 147 147 45 57 57 132 132 165 76 76 95 129 129 161 117 146 146 45 56 56 131 131 163 75 75 94 127 127 159 115 144 144 44 55 55 129 129 162 74 74 93 126 126 158 114 143 143 44 55 55 128 128 160 73 73 92 125 125 156 113 141 141 43 54 54 126 126 158 72 72 91 123 123 154 111 139 139 43 53 53 125 125 156 71 71 89 122 122 152 110 138 138 42 53 53 123 123 154 71 71 88 120 120 150 109 136 136 42 52 52 122 122 152 70 70 87 119 119 149 107 134 134 41 52 52 120 120 151 69 69 86 117 117 147 106 133 133 41 51 51 119 119 149 68 68 85 116 116 145 105 131 131 40 50 50 117 117 147 67 67 84 114 114 143 103 129 129 40 50 50 116 116 145 66 66 83 113 113 141 102 128 128 39 49 49 114 114 143 65 65 82 112 112 140 101 126 126 39 48 48 113 113 141 65 65 81 110 110 138 100 125 125 38 48 48 111 111 139 64 64 80 109 109 136 98 123 123 38 47 47 110 110 138 63 63 79 107 107 134 97 121 121 37 46 46 255 255 158 255 255 155 255 255 160 205 142 80 58 40 22 255 183 102 83 58 32 25 17 9 46 32 17 108 75 42 255 226 127 255 255 129 255 253 128 255 255 129 255 255 129 255 255 129 255 255 129 255 253 128 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 248 125 212 142 72 131 87 44 255 243 123 255 250 127 255 255 129 166 111 56 15 10 5 34 23 11 34 23 11 19 12 6 30 20 10 255 181 91 255 175 89 208 139 70 255 240 122 255 248 125 255 248 125 255 243 123 255 178 90 112 75 38 255 196 99 255 188 95 142 95 48 255 230 116 255 255 129 255 255 129 255 248 125 255 248 125 255 248 125 255 245 124 255 248 125 255 245 124 255 248 125 255 250 127 84 106 106 32 40 40 89 111 111 54 54 68 92 92 116 84 105 105 32 40 40 88 110 110 54 54 67 92 92 115 83 104 104 32 40 40 87 109 109 53 53 67 91 91 114 82 103 103 31 39 39 87 108 108 53 53 66 90 90 113 81 102 102 31 39 39 86 107 107 52 52 66 89 89 112 81 101 101 31 39 39 85 107 107 52 52 65 89 89 111 80 100 100 31 38 38 84 106 106 52 52 65 88 88 110 80 100 100 30 38 38 84 105 105 51 51 64 87 87 109 79 99 99 30 38 38 83 104 104 51 51 64 87 87 108 78 98 98 30 38 38 83 104 104 50 50 63 86 86 108 78 98 98 30 37 37 82 103 103 50 50 63 86 86 107 78 97 97 30 37 37 82 102 102 50 50 62 85 85 107 77 96 96 29 37 37 81 102 102 50 50 62 85 85 106 77 96 96 29 37 37 81 101 101 49 49 62 84 84 105 76 95 95 29 37 37 80 101 101 49 49 61 84 84 105 76 95 95 29 36 36 80 100 100 49 49 61 83 83 104 76 95 95 29 36 36 80 100 100 49 49 61 83 83 104 75 94 94 29 36 36 79 99 99 48 48 61 83 83 103 75 94 94 29 36 36 79 99 99 48 48 60 82 82 103 75 93 93 28 36 36 79 99 99 48 48 60 82 82 103 74 93 93 28 36 36 78 98 98 48 48 60 82 82 102 74 93 93 28 35 35 78 98 98 48 48 60 81 81 102 74 92 92 28 35 35 78 98 98 48 48 60 81 81 102 74 92 92 28 35 35 78 97 97 47 47 59 81 81 101 +142 178 178 49 61 61 49 61 61 138 173 173 140 140 175 40 40 50 10 10 12 139 139 174 141 177 177 35 44 44 28 35 35 25 32 32 140 140 176 17 17 21 39 39 49 5 5 7 135 135 169 124 155 155 4 5 5 2 3 3 137 171 171 137 137 171 79 79 99 20 20 26 133 133 167 136 170 170 47 58 58 47 58 58 132 165 165 133 133 167 38 38 48 9 9 12 133 133 166 135 169 169 34 42 42 27 34 34 24 30 30 134 134 168 16 16 20 37 37 47 5 5 6 129 129 161 118 147 147 4 5 5 2 3 3 130 163 163 130 130 163 75 75 94 19 19 24 127 127 158 129 161 161 44 56 56 44 55 55 126 157 157 127 127 158 36 36 45 9 9 11 126 126 157 128 160 160 32 40 40 25 32 32 23 29 29 127 127 159 15 15 19 35 35 44 5 5 6 122 122 153 111 139 139 3 4 4 2 3 3 123 154 154 123 123 154 71 71 89 18 18 23 120 120 150 122 152 152 42 52 52 42 52 52 118 148 148 119 119 149 34 34 43 8 8 10 119 119 148 121 151 151 30 38 38 24 30 30 21 27 27 120 120 150 14 14 18 33 33 42 4 4 6 115 115 144 105 131 131 3 4 4 2 2 2 116 145 145 116 116 145 67 67 84 17 17 22 112 112 141 115 143 143 39 49 49 39 49 49 111 139 139 112 112 140 32 32 40 8 8 10 111 111 139 113 142 142 28 35 35 22 28 28 20 25 25 112 112 140 13 13 17 31 31 39 4 4 5 108 108 135 98 123 123 3 4 4 2 2 2 109 136 136 109 109 136 255 255 158 255 255 147 255 255 160 16 11 6 0 0 0 125 87 49 41 29 16 29 20 11 54 37 21 87 61 34 167 116 65 255 255 161 255 255 129 255 255 129 255 255 129 255 255 129 255 248 125 255 253 128 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 225 114 50 33 17 255 238 120 255 227 115 255 227 115 255 243 123 255 253 128 255 253 128 150 100 51 0 0 0 7 5 2 11 7 3 27 18 9 69 46 23 69 46 23 34 23 11 46 31 15 46 31 15 139 93 47 181 121 61 73 49 24 255 250 127 255 250 127 255 243 123 216 144 73 255 245 124 255 255 129 255 248 125 255 243 123 255 243 123 255 245 124 255 248 125 255 248 125 255 250 127 255 255 129 255 248 125 93 93 117 95 119 119 24 30 30 19 24 24 17 21 21 89 111 111 11 11 14 26 26 33 3 3 4 91 91 114 83 104 104 2 3 3 1 2 2 92 115 115 92 92 115 53 53 67 14 14 17 90 90 112 91 114 114 31 39 39 31 39 39 89 111 111 90 90 112 26 26 32 6 6 8 89 89 112 91 114 114 23 28 28 18 23 23 16 20 20 85 106 106 11 11 13 25 25 32 3 3 4 87 87 109 80 100 100 2 3 3 1 2 2 89 111 111 89 89 111 51 51 64 13 13 16 86 86 108 88 110 110 30 38 38 30 38 38 86 108 108 87 87 109 25 25 31 6 6 7 86 86 108 88 110 110 22 27 27 17 22 22 16 20 20 82 103 103 10 10 13 24 24 31 3 3 4 85 85 106 77 97 97 2 3 3 1 2 2 86 108 108 86 86 107 50 50 62 13 13 16 84 84 105 86 107 107 29 37 37 29 37 37 84 105 105 84 84 106 24 24 30 6 6 7 84 84 105 86 107 107 21 27 27 17 21 21 15 19 19 80 100 100 10 10 13 24 24 30 3 3 4 83 83 103 76 95 95 2 3 3 1 2 2 84 105 105 84 84 105 49 49 61 12 12 16 82 82 103 84 105 105 29 36 36 29 36 36 82 102 102 83 83 103 23 23 29 5 5 7 82 82 103 84 105 105 21 26 26 17 21 21 15 19 19 79 98 98 10 10 12 23 23 29 3 3 4 81 81 101 74 93 93 2 3 3 1 2 2 82 103 103 82 82 103 48 48 60 12 12 15 81 81 101 +102 127 127 138 172 172 82 103 103 139 174 174 143 143 179 138 138 173 141 141 176 110 110 138 132 132 165 129 129 161 141 177 177 17 21 21 135 169 169 129 162 162 135 169 169 126 158 158 139 139 173 5 5 7 132 132 166 132 132 165 125 125 156 126 126 158 138 173 173 5 7 7 137 171 171 136 171 171 121 151 151 137 137 172 136 136 170 8 8 10 136 136 171 120 120 150 130 130 163 134 168 168 135 169 169 95 119 119 129 162 162 77 97 97 130 163 163 134 134 168 130 130 162 132 132 165 103 103 129 123 123 154 121 121 151 132 166 166 16 20 20 126 158 158 121 151 151 126 158 158 118 147 147 129 129 162 5 5 6 124 124 155 123 123 154 116 116 146 117 117 147 129 161 161 5 6 6 127 159 159 127 159 159 112 140 140 128 128 160 126 126 158 7 7 9 127 127 158 111 111 139 121 121 151 125 156 156 125 157 157 88 111 111 120 150 150 72 90 90 121 151 151 124 124 155 120 120 150 122 122 153 96 96 120 114 114 143 111 111 139 122 153 153 14 18 18 117 146 146 112 140 140 116 145 145 109 136 136 119 119 149 4 4 6 114 114 142 114 114 142 107 107 134 108 108 135 119 149 149 4 6 6 117 146 146 117 146 146 103 129 129 117 117 147 116 116 145 7 7 8 116 116 146 102 102 128 111 111 139 114 143 143 115 144 144 81 102 102 110 138 138 66 82 82 111 138 138 114 114 142 110 110 138 112 112 140 88 88 110 105 105 131 102 102 128 112 140 140 13 17 17 107 134 134 102 128 128 106 133 133 99 124 124 109 109 137 255 255 160 255 255 158 255 255 158 29 20 11 58 40 22 83 58 32 96 66 37 75 52 29 75 52 29 25 17 9 255 226 127 255 255 161 255 255 156 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 253 128 255 217 110 255 188 95 255 230 116 255 243 123 255 250 127 255 238 120 255 222 112 255 227 115 255 232 118 57 38 19 42 28 14 146 98 49 23 15 7 23 15 7 65 43 22 57 38 19 158 106 53 96 64 32 139 93 47 108 72 36 255 238 120 255 227 115 255 240 122 255 232 118 255 199 101 247 165 83 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 253 128 255 253 128 255 250 127 255 250 127 255 253 128 89 89 111 87 87 109 95 119 119 11 14 14 92 115 115 87 109 109 91 114 114 85 106 106 93 93 117 17 17 21 89 89 112 89 89 112 84 84 105 85 85 106 93 117 117 3 4 4 92 115 115 92 115 115 82 102 102 87 109 109 92 92 115 5 5 7 92 92 115 81 81 101 86 86 108 91 114 114 92 115 115 65 81 81 88 110 110 70 88 88 88 111 111 91 91 114 88 88 110 90 90 112 70 70 88 84 84 105 82 82 103 90 113 113 10 13 13 87 109 109 82 103 103 86 108 108 80 101 101 89 89 111 16 16 20 85 85 106 85 85 106 80 80 100 81 81 101 89 111 111 3 4 4 88 110 110 88 110 110 78 97 97 83 104 104 87 87 109 5 5 6 88 88 110 77 77 97 82 82 103 87 109 109 88 110 110 62 77 77 84 105 105 67 84 84 84 106 106 87 87 109 84 84 106 86 86 108 67 67 84 81 81 101 79 79 98 87 108 108 10 13 13 84 105 105 79 99 99 83 103 103 77 97 97 85 85 107 15 15 19 82 82 102 81 81 102 77 77 96 78 78 97 86 107 107 3 4 4 85 106 106 84 106 106 75 94 94 80 100 100 84 84 105 5 5 6 85 85 106 75 75 93 80 80 100 84 105 105 85 106 106 60 75 75 81 102 102 65 81 81 82 103 103 84 84 106 82 82 102 83 83 104 65 65 82 78 78 98 76 76 96 84 105 105 10 12 12 81 102 102 77 96 96 80 101 101 75 94 94 83 83 104 15 15 19 79 79 99 79 79 99 +140 175 175 128 160 160 37 47 47 17 21 21 49 61 61 5 7 7 141 177 177 143 143 178 142 142 178 40 40 50 82 82 102 28 28 35 2 2 3 138 138 173 137 137 171 136 171 171 125 156 156 36 46 46 17 21 21 48 60 60 5 7 7 138 172 172 139 139 174 139 139 174 39 39 49 79 79 99 27 27 34 2 2 3 135 135 168 133 133 166 133 166 166 121 152 152 35 44 44 16 20 20 46 58 58 5 6 6 134 168 168 135 135 169 135 135 169 38 38 47 77 77 97 27 27 33 2 2 3 131 131 164 129 129 162 129 161 161 118 147 147 34 43 43 16 20 20 45 56 56 5 6 6 130 163 163 131 131 164 131 131 164 37 37 46 75 75 94 26 26 32 2 2 3 127 127 158 125 125 156 125 156 156 114 143 143 33 42 42 15 19 19 43 54 54 5 6 6 126 157 157 127 127 159 126 126 158 35 35 44 72 72 90 25 25 31 2 2 3 122 122 153 121 121 151 121 151 151 110 138 138 32 40 40 15 18 18 42 53 53 4 6 6 121 152 152 122 122 153 122 122 153 34 34 43 70 70 87 24 24 30 2 2 3 118 118 148 117 117 146 116 146 146 106 133 133 31 39 39 14 18 18 40 51 51 4 6 6 117 146 146 118 118 148 118 118 147 33 33 41 67 67 84 23 23 29 2 2 2 114 114 142 112 112 141 112 140 140 102 128 128 30 37 37 13 17 17 39 49 49 4 5 5 113 141 141 114 114 142 113 113 142 32 32 40 65 65 81 22 22 28 2 2 2 110 110 137 108 108 135 108 135 135 99 123 123 255 255 158 255 255 148 255 255 160 12 8 4 87 61 34 133 93 52 205 142 80 58 40 22 4 2 1 33 23 13 255 212 119 255 255 158 255 255 151 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 253 128 255 248 125 255 227 115 255 173 87 166 111 56 231 155 78 255 217 110 142 95 48 255 188 95 255 206 104 255 243 123 255 248 125 255 175 89 255 183 93 255 214 108 162 108 55 255 248 125 255 191 97 112 75 38 247 165 83 208 139 70 135 90 45 135 90 45 193 129 65 255 191 97 154 103 52 255 209 106 255 248 125 255 235 119 255 212 107 255 235 119 255 238 120 255 183 93 255 230 116 255 255 129 255 255 129 255 255 129 255 255 129 255 253 128 255 245 124 255 243 123 255 253 128 255 250 127 33 41 41 3 4 4 95 119 119 90 113 113 96 96 120 27 27 33 55 55 68 19 19 24 2 2 3 93 93 116 92 92 115 92 115 115 84 105 105 26 33 33 11 14 14 32 40 40 3 4 4 93 116 116 88 110 110 93 93 117 26 26 33 53 53 67 18 18 23 2 2 3 91 91 113 89 89 112 89 112 112 82 102 102 26 32 32 11 13 13 31 39 39 3 4 4 90 113 113 86 107 107 91 91 114 25 25 32 52 52 65 18 18 23 2 2 3 89 89 111 88 88 110 87 109 109 80 100 100 25 31 31 10 13 13 30 38 38 3 4 4 89 111 111 84 105 105 89 89 112 25 25 31 51 51 64 18 18 22 2 2 3 87 87 109 86 86 107 86 107 107 78 98 98 25 31 31 10 13 13 30 38 38 3 4 4 87 109 109 82 103 103 88 88 110 24 24 31 50 50 63 17 17 22 2 2 3 85 85 107 84 84 106 84 106 106 77 97 97 24 30 30 10 13 13 29 37 37 3 4 4 86 107 107 81 102 102 86 86 108 24 24 30 49 49 62 17 17 21 2 2 3 84 84 105 83 83 104 83 104 104 76 95 95 24 30 30 10 13 13 29 36 36 3 4 4 85 106 106 80 100 100 85 85 107 24 24 30 49 49 61 17 17 21 2 2 3 83 83 104 82 82 103 82 103 103 75 94 94 24 30 30 10 12 12 29 36 36 3 4 4 84 105 105 79 99 99 84 84 106 23 23 29 48 48 60 17 17 21 2 2 3 82 82 103 81 81 102 +150 120 150 181 145 181 173 138 173 180 180 180 116 116 116 176 176 176 112 112 112 81 81 81 110 110 110 171 171 171 176 176 176 176 176 176 178 142 178 172 137 172 168 134 168 130 104 130 162 130 162 78 62 78 169 135 169 158 126 158 175 140 175 173 138 173 175 175 175 134 134 134 165 165 165 165 165 165 73 73 73 155 155 155 160 160 160 172 172 172 170 170 170 172 137 172 124 99 124 138 110 138 112 89 112 75 60 75 77 62 77 137 110 137 169 135 169 160 128 160 169 169 169 109 109 109 158 158 158 96 96 96 38 38 38 60 60 60 153 153 153 166 166 166 149 149 149 166 132 166 110 88 110 95 76 95 116 93 116 41 33 41 63 50 63 135 108 135 163 130 163 156 125 156 162 162 162 105 105 105 158 158 158 101 101 101 73 73 73 99 99 99 154 154 154 158 158 158 158 158 158 159 127 159 154 123 154 151 120 151 117 93 117 145 116 145 70 56 70 151 120 151 141 113 141 156 125 156 154 123 154 156 156 156 119 119 119 147 147 147 147 147 147 65 65 65 138 138 138 143 143 143 153 153 153 151 151 151 152 122 152 110 88 110 122 98 122 99 79 99 67 53 67 68 54 68 121 97 121 150 120 150 142 113 142 149 149 149 96 96 96 139 139 139 85 85 85 34 34 34 53 53 53 135 135 135 147 147 147 131 131 131 146 117 146 97 77 97 83 67 83 102 82 102 36 29 36 55 44 55 119 95 119 143 115 143 137 110 137 143 143 143 92 92 92 139 139 139 88 88 88 64 64 64 87 87 87 135 135 135 139 139 139 138 138 138 255 255 158 255 255 156 255 255 160 16 11 6 255 206 116 37 26 14 87 61 34 71 49 27 12 8 4 255 194 109 255 194 109 255 255 160 255 255 156 255 255 150 255 255 129 255 255 129 255 255 129 255 255 129 255 255 129 255 250 127 200 134 68 224 150 76 189 126 64 255 188 95 220 147 74 254 170 86 255 225 114 255 222 112 220 147 74 255 240 122 255 186 94 255 212 107 220 147 74 212 142 72 255 191 97 247 165 83 251 168 85 255 219 111 255 248 125 146 98 49 65 43 22 224 150 76 255 196 99 112 75 38 115 77 39 96 64 32 255 219 111 255 240 122 255 232 118 255 225 114 255 230 116 255 230 116 255 188 95 251 168 85 255 245 124 255 253 128 255 255 129 255 255 129 255 253 128 255 243 123 255 245 124 255 250 127 255 253 128 121 97 121 120 96 120 121 121 121 92 92 92 114 114 114 114 114 114 51 51 51 107 107 107 111 111 111 119 119 119 118 118 118 119 95 119 86 69 86 96 76 96 77 62 77 52 42 52 53 42 53 95 76 95 117 94 117 111 89 111 117 117 117 75 75 75 110 110 110 67 67 67 27 27 27 42 42 42 106 106 106 116 116 116 104 104 104 115 92 115 77 61 77 66 53 66 81 65 81 29 23 29 44 35 44 95 76 95 114 91 114 109 87 109 114 114 114 73 73 73 111 111 111 71 71 71 51 51 51 69 69 69 108 108 108 112 112 112 112 112 112 110 110 110 109 87 109 107 85 107 83 66 83 103 82 103 49 39 49 107 86 107 100 80 100 111 89 111 110 88 110 111 111 111 85 85 85 105 105 105 105 105 105 47 47 47 99 99 99 103 103 103 110 110 110 109 109 109 110 88 110 80 64 80 89 71 89 72 57 72 48 39 48 50 40 50 88 71 88 109 87 109 104 83 104 109 109 109 70 70 70 102 102 102 62 62 62 25 25 25 39 39 39 100 100 100 108 108 108 97 97 97 108 86 108 72 57 72 62 49 62 76 61 76 27 21 27 41 33 41 89 71 89 108 86 108 103 82 103 107 107 107 69 69 69 105 105 105 67 67 67 48 48 48 66 66 66 103 103 103 106 106 106 106 106 106 104 104 104 103 83 103 101 81 101 78 63 78 98 78 98 47 37 47 102 81 102 95 76 95 106 85 106 105 84 105 106 106 106 81 81 81 100 100 100 +141 176 176 32 40 40 123 154 154 60 75 75 144 181 181 21 27 27 112 140 140 138 172 172 140 176 176 143 143 179 141 141 177 112 112 141 10 10 12 93 93 117 63 63 79 142 142 177 4 4 5 140 140 175 131 131 164 136 136 171 141 176 176 139 174 174 9 12 12 4 5 5 52 65 65 62 77 77 139 174 174 12 15 15 139 173 173 135 169 169 137 171 171 138 138 172 138 138 172 9 9 12 49 49 62 41 41 51 94 94 117 133 133 167 37 37 46 136 136 170 130 130 163 135 135 169 135 169 169 135 168 168 9 11 11 125 156 156 37 47 47 131 164 164 114 143 143 44 55 55 129 161 161 130 162 162 131 131 164 132 132 165 132 132 165 11 11 14 114 114 142 64 64 81 130 130 163 46 46 57 5 5 6 118 118 147 123 123 154 128 160 160 129 161 161 125 156 156 28 35 35 108 136 136 53 66 66 127 159 159 19 24 24 99 123 123 121 152 152 124 155 155 126 126 158 124 124 156 99 99 123 8 8 11 82 82 102 55 55 69 124 124 155 3 3 4 122 122 153 115 115 143 119 119 149 123 154 154 121 152 152 8 10 10 3 4 4 45 57 57 54 67 67 121 151 151 11 13 13 120 151 151 118 147 147 119 148 148 120 120 150 119 119 149 8 8 10 43 43 54 36 36 45 81 81 101 115 115 144 32 32 40 117 117 147 112 112 140 117 117 146 116 146 146 116 145 145 8 10 10 107 134 134 32 40 40 113 141 141 98 123 123 38 47 47 111 138 138 112 140 140 112 112 141 113 113 142 113 113 141 10 10 12 98 98 122 255 255 156 255 255 155 255 255 161 255 206 116 255 192 107 54 37 21 41 29 16 71 49 27 12 8 4 150 104 58 150 104 58 255 255 158 255 255 158 255 255 153 255 255 155 255 255 129 255 255 129 255 253 128 247 165 83 193 129 65 235 157 80 200 134 68 255 194 98 255 225 114 255 240 122 255 230 116 255 238 120 255 222 112 255 222 112 255 204 103 247 165 83 255 194 98 243 162 82 255 191 97 154 103 52 255 219 111 255 243 123 196 131 66 255 209 106 255 250 127 255 245 124 255 186 94 92 62 31 131 87 44 227 152 77 81 54 27 255 188 95 255 245 124 255 219 111 255 243 123 255 245 124 255 230 116 255 204 103 255 222 112 255 245 124 255 245 124 200 134 68 166 111 56 255 186 94 255 188 95 255 186 94 255 250 127 255 245 124 255 250 127 255 248 125 48 48 60 97 97 121 34 34 42 3 3 4 88 88 110 91 91 114 95 119 119 96 120 120 93 116 116 21 26 26 81 101 101 39 49 49 95 119 119 14 18 18 74 92 92 91 114 114 92 116 116 94 94 118 93 93 117 74 74 93 6 6 8 61 61 77 41 41 52 93 93 117 2 2 3 92 92 115 86 86 108 90 90 113 93 116 116 92 115 115 6 8 8 2 3 3 34 43 43 41 51 51 92 115 115 8 10 10 92 115 115 90 112 112 90 113 113 91 91 114 91 91 114 6 6 8 33 33 41 27 27 34 62 62 78 89 89 111 24 24 30 90 90 113 86 86 108 90 90 113 90 113 113 90 112 112 6 7 7 83 104 104 25 31 31 88 110 110 77 96 96 29 37 37 86 108 108 87 109 109 89 111 111 89 89 111 89 89 111 8 8 10 77 77 96 44 44 55 88 88 111 31 31 39 3 3 4 80 80 100 83 83 104 87 109 109 88 110 110 85 106 106 19 24 24 74 93 93 36 45 45 87 109 109 13 16 16 68 85 85 84 105 105 85 107 107 87 87 109 86 86 108 68 68 85 6 6 7 57 57 71 38 38 48 86 86 108 2 2 3 85 85 107 80 80 100 84 84 105 86 108 108 85 107 107 6 7 7 2 3 3 32 40 40 38 47 47 86 107 107 7 9 9 86 107 107 84 105 105 85 106 106 85 85 107 85 85 107 6 6 7 31 31 38 25 25 32 58 58 73 83 83 104 23 23 29 85 85 106 +146 182 182 144 180 180 129 161 161 36 45 45 49 62 62 4 5 5 29 36 36 49 62 62 2 3 3 26 32 32 139 174 174 142 177 177 143 143 179 140 140 175 141 141 176 17 17 21 40 40 50 81 81 102 40 40 50 10 10 12 21 21 26 5 5 7 138 138 172 136 136 170 136 136 170 140 175 175 138 173 173 124 155 155 35 44 44 47 59 59 4 5 5 28 35 35 47 59 59 2 3 3 25 31 31 133 166 166 136 170 170 137 137 171 134 134 167 135 135 169 16 16 20 38 38 48 78 78 97 38 38 47 9 9 11 20 20 25 5 5 6 131 131 164 130 130 162 129 129 162 133 167 167 132 165 165 118 148 148 33 41 41 45 56 56 4 5 5 26 33 33 45 56 56 2 3 3 23 29 29 127 158 158 129 161 161 130 130 163 127 127 159 128 128 160 15 15 19 36 36 45 74 74 92 36 36 45 9 9 11 19 19 24 5 5 6 125 125 156 123 123 154 123 123 153 126 158 158 125 156 156 112 140 140 31 39 39 43 53 53 3 4 4 25 31 31 42 53 53 2 3 3 22 28 28 120 150 150 122 152 152 123 123 154 120 120 150 121 121 151 14 14 18 34 34 43 70 70 87 34 34 42 8 8 10 18 18 22 4 4 6 117 117 147 116 116 145 116 116 145 119 149 149 118 147 147 105 132 132 29 37 37 40 50 50 3 4 4 23 29 29 40 50 50 2 2 2 21 26 26 113 141 141 115 144 144 116 116 145 113 113 141 114 114 143 13 13 17 32 32 40 66 66 82 32 32 40 8 8 10 17 17 21 4 4 5 255 255 158 255 255 151 255 255 158 255 255 148 255 203 114 255 238 134 100 69 39 50 34 19 29 20 11 221 154 86 46 32 17 255 232 130 255 255 161 255 255 156 255 255 150 255 255 161 255 222 112 173 116 59 135 90 45 127 85 43 255 194 98 255 217 110 255 248 125 255 235 119 255 238 120 255 243 123 255 248 125 255 230 116 254 170 86 255 235 119 255 186 94 173 116 59 220 147 74 169 113 57 158 106 53 255 206 104 255 173 87 255 248 125 255 232 118 255 245 124 255 217 110 255 238 120 255 227 115 255 248 125 255 238 120 255 178 90 255 181 91 255 181 91 255 253 128 255 253 128 255 245 124 255 235 119 255 245 124 255 181 91 216 144 73 255 243 123 255 250 127 255 238 120 255 232 118 255 219 111 115 77 39 177 119 60 243 162 82 255 245 124 255 196 99 255 243 123 96 96 120 96 96 121 11 11 14 27 27 34 56 56 70 27 27 34 6 6 8 14 14 18 3 3 4 94 94 118 93 93 116 93 93 116 96 120 120 94 118 118 85 106 106 24 30 30 32 40 40 2 3 3 19 24 24 32 40 40 1 2 2 17 21 21 91 114 114 93 116 116 88 110 110 92 92 115 92 92 116 11 11 14 26 26 33 53 53 67 26 26 33 6 6 8 14 14 17 3 3 4 90 90 113 89 89 112 89 89 112 92 115 115 91 114 114 81 102 102 23 29 29 31 39 39 2 3 3 18 23 23 31 39 39 1 2 2 16 20 20 88 110 110 90 112 112 85 106 106 89 89 111 89 89 112 10 10 13 25 25 32 52 52 65 25 25 31 6 6 7 13 13 17 3 3 4 88 88 110 87 87 108 87 87 108 89 112 112 88 110 110 79 99 99 22 28 28 30 38 38 2 3 3 17 22 22 30 38 38 1 2 2 16 20 20 86 107 107 87 109 109 83 103 103 86 86 108 87 87 109 10 10 13 24 24 31 50 50 63 24 24 31 6 6 7 13 13 16 3 3 4 85 85 107 84 84 106 84 84 106 87 109 109 86 108 108 77 97 97 22 27 27 29 37 37 2 3 3 17 21 21 29 37 37 1 2 2 15 19 19 84 105 105 85 107 107 81 101 101 84 84 106 85 85 107 10 10 13 24 24 30 49 49 62 24 24 30 6 6 7 13 13 16 3 3 4 84 84 105 83 83 104 83 83 104 +157 125 157 181 144 181 79 63 79 154 123 154 182 145 182 178 142 178 174 139 174 172 137 172 181 181 181 180 180 180 180 180 180 180 180 180 50 50 50 76 76 76 152 152 152 177 177 177 59 59 59 142 142 142 178 178 178 176 176 176 170 170 170 173 173 173 176 141 176 176 141 176 176 141 176 176 140 176 35 28 35 74 59 74 113 90 113 173 138 173 40 32 40 138 111 138 149 119 149 169 135 169 166 132 166 160 128 160 162 129 162 172 172 172 171 171 171 171 171 171 34 34 34 8 8 8 94 94 94 165 165 165 78 78 78 68 68 68 17 17 17 165 165 165 161 161 161 156 156 156 162 162 162 167 134 167 163 131 163 165 132 165 156 125 156 6 5 6 92 73 92 157 125 157 76 61 76 49 39 49 61 49 61 164 131 164 160 128 160 158 126 158 144 115 144 162 162 162 162 162 162 160 160 160 161 161 161 6 6 6 92 92 92 137 137 137 90 90 90 69 69 69 59 59 59 159 159 159 155 155 155 150 150 150 140 140 140 157 126 157 157 125 157 153 123 153 156 125 156 72 58 72 129 103 129 133 106 133 153 122 153 67 53 67 131 104 131 154 123 154 150 120 150 147 117 147 145 116 145 152 152 152 152 152 152 152 152 152 151 151 151 42 42 42 64 64 64 127 127 127 148 148 148 49 49 49 119 119 119 149 149 149 147 147 147 142 142 142 145 145 145 147 118 147 147 117 147 147 117 147 146 117 146 29 23 29 61 49 61 94 75 94 143 115 143 33 26 33 115 92 115 123 99 123 141 112 141 137 110 137 133 106 133 134 107 134 255 250 140 255 229 129 255 255 156 112 78 44 255 255 161 255 255 161 71 49 27 33 23 13 238 165 93 79 55 31 75 52 29 255 255 155 255 255 160 255 255 158 255 255 156 255 255 156 193 129 65 204 137 69 255 204 103 255 248 125 255 235 119 247 165 83 255 219 111 255 227 115 255 219 111 255 248 125 255 250 127 255 235 119 255 222 112 255 243 123 255 212 107 255 222 112 255 243 123 255 227 115 216 144 73 162 108 55 231 155 78 239 160 81 255 212 107 255 199 101 255 212 107 254 170 86 255 186 94 255 178 90 255 219 111 255 214 108 255 206 104 255 248 125 247 165 83 146 98 49 255 248 125 255 253 128 255 240 122 255 201 102 166 111 56 255 199 101 255 248 125 255 248 125 255 245 124 255 248 125 255 250 127 255 209 106 204 137 69 255 191 97 255 212 107 221 110 0 232 116 0 121 121 121 118 118 118 120 120 120 115 115 115 122 97 122 122 97 122 121 97 121 24 19 24 51 41 51 78 62 78 119 95 119 28 22 28 96 77 96 103 82 103 117 94 117 115 92 115 111 89 111 112 89 112 119 119 119 119 119 119 119 119 119 24 24 24 5 5 5 65 65 65 114 114 114 54 54 54 47 47 47 11 11 11 115 115 115 112 112 112 108 108 108 113 113 113 116 93 116 114 91 114 115 92 115 109 87 109 4 3 4 64 51 64 110 88 110 53 43 53 35 28 35 43 34 43 115 92 115 112 90 112 111 89 111 102 81 102 114 114 114 114 114 114 113 113 113 114 114 114 4 4 4 65 65 65 97 97 97 64 64 64 49 49 49 42 42 42 113 113 113 110 110 110 107 107 107 100 100 100 112 90 112 112 90 112 110 88 110 112 89 112 52 41 52 92 74 92 96 77 96 110 88 110 48 38 48 94 75 94 111 89 111 109 87 109 106 85 106 105 84 105 111 111 111 111 111 111 110 110 110 110 110 110 31 31 31 46 46 46 93 93 93 109 109 109 36 36 36 87 87 87 110 110 110 108 108 108 105 105 105 107 107 107 103 103 103 109 87 109 109 87 109 109 87 109 22 17 22 46 37 46 70 56 70 108 86 108 25 20 25 86 69 86 93 74 93 106 85 106 104 83 104 100 80 100 101 81 101 108 108 108 108 108 108 108 108 108 21 21 21 5 5 5 60 60 60 104 104 104 50 50 50 +71 89 89 10 12 12 142 177 177 141 177 177 144 180 180 140 175 175 144 180 180 145 145 181 145 145 181 145 145 181 144 144 181 62 62 78 140 140 175 99 99 123 0 0 0 52 52 65 69 69 86 10 10 12 138 138 173 138 138 173 141 141 176 136 136 170 140 140 175 141 177 177 140 175 175 141 176 176 141 176 176 81 101 101 136 170 170 9 12 12 14 17 17 29 37 37 49 61 61 16 21 21 130 163 163 138 173 173 131 164 164 135 169 169 132 165 165 137 137 172 133 133 166 137 137 171 137 137 171 129 129 162 133 133 167 6 6 8 9 9 12 45 45 56 35 35 44 79 79 98 125 125 156 134 134 168 128 128 161 131 131 164 131 131 163 133 166 166 129 161 161 133 166 166 132 165 165 125 157 157 129 161 161 6 8 8 9 11 11 43 54 54 34 43 43 76 95 95 121 151 151 130 162 162 124 155 155 127 158 158 126 158 158 129 129 161 127 127 159 128 128 160 115 115 144 120 120 150 126 126 158 0 0 0 11 11 14 48 48 60 19 19 23 123 123 154 75 75 93 125 125 157 124 124 155 117 117 146 119 119 149 124 155 155 124 155 155 124 155 155 53 67 67 119 149 149 84 105 105 0 0 0 44 55 55 59 74 74 8 10 10 118 147 147 117 147 147 119 149 149 116 145 145 119 149 149 120 120 150 120 120 150 119 119 149 119 119 149 51 51 64 115 115 144 81 81 101 0 0 0 42 42 53 57 57 71 8 8 10 113 113 142 113 113 141 115 115 144 111 111 139 114 114 143 115 144 144 114 142 142 115 144 144 255 255 155 255 255 147 255 255 145 255 255 156 255 253 142 255 255 151 255 255 161 129 90 50 66 46 26 209 145 81 184 128 71 79 55 31 255 247 138 255 255 155 255 255 161 255 255 161 255 255 156 255 255 156 255 250 127 255 227 115 255 230 116 255 227 115 255 214 108 255 245 124 243 162 82 255 238 120 255 235 119 255 181 91 255 240 122 255 225 114 255 232 118 255 240 122 255 199 101 244 122 0 252 126 0 249 124 0 244 122 0 247 123 0 232 116 0 214 107 0 191 95 0 193 96 0 168 84 0 173 86 0 188 94 0 232 116 0 234 117 0 244 122 0 244 122 0 244 122 0 244 122 0 247 123 0 237 118 0 229 114 0 242 121 0 244 122 0 244 122 0 244 122 0 244 122 0 249 124 0 249 124 0 252 126 0 242 121 0 247 123 0 242 121 0 234 117 0 229 114 0 244 122 0 36 45 45 48 60 60 6 8 8 95 119 119 95 119 119 97 121 121 94 117 117 96 121 121 93 117 117 97 97 122 97 97 121 97 97 121 42 42 52 94 94 117 66 66 83 0 0 0 35 35 43 46 46 58 6 6 8 93 93 116 92 92 116 94 94 118 91 91 114 94 94 118 95 119 119 94 117 117 94 118 118 94 118 118 54 68 68 91 114 114 6 8 8 9 11 11 19 24 24 33 41 41 11 14 14 88 110 110 93 116 116 88 110 110 91 114 114 89 111 111 93 93 116 90 90 112 92 92 116 92 92 115 87 87 109 90 90 113 4 4 5 6 6 8 30 30 38 24 24 30 53 53 67 85 85 106 91 91 114 87 87 109 89 89 112 89 89 111 91 114 114 88 110 110 91 113 113 90 113 113 86 107 107 88 111 111 4 5 5 6 7 7 30 37 37 23 29 29 52 66 66 83 104 104 90 112 112 86 107 107 88 110 110 87 109 109 89 89 112 88 88 110 89 89 111 80 80 100 83 83 104 88 88 110 0 0 0 8 8 10 34 34 42 13 13 16 87 87 108 52 52 66 88 88 110 87 87 109 83 83 103 84 84 106 88 110 110 88 110 110 88 110 110 38 47 47 85 106 106 60 75 75 0 0 0 31 39 39 42 53 53 6 7 7 84 106 106 84 106 106 86 108 108 83 104 104 86 108 108 83 104 104 87 87 108 87 87 108 87 87 108 37 37 47 84 84 105 59 59 74 0 0 0 +130 104 130 182 145 182 105 84 105 129 103 129 11 8 11 183 146 183 179 143 179 180 144 180 174 139 174 174 139 174 181 181 181 181 181 181 179 179 179 180 180 180 151 151 151 136 136 136 43 43 43 114 114 114 175 175 175 95 95 95 74 74 74 149 149 149 172 172 172 174 174 174 168 168 168 171 171 171 168 168 168 176 141 176 176 141 176 172 137 172 173 139 173 175 140 175 22 18 22 7 5 7 118 94 118 123 98 123 172 137 172 99 79 99 122 97 122 10 8 10 172 138 172 168 135 168 170 136 170 164 131 164 164 131 164 170 170 170 170 170 170 168 168 168 169 169 169 142 142 142 128 128 128 40 40 40 107 107 107 164 164 164 89 89 89 69 69 69 140 140 140 161 161 161 163 163 163 157 157 157 160 160 160 157 157 157 165 132 165 164 131 164 161 129 161 162 130 162 163 131 163 21 17 21 6 5 6 110 88 110 114 91 114 160 128 160 93 74 93 114 91 114 9 7 9 160 128 160 157 125 157 158 126 158 153 122 153 152 122 152 159 159 159 158 158 158 156 156 156 157 157 157 132 132 132 119 119 119 38 38 38 99 99 99 153 153 153 83 83 83 64 64 64 130 130 130 150 150 150 151 151 151 146 146 146 149 149 149 145 145 145 152 122 152 152 122 152 149 119 149 150 120 150 151 121 151 19 15 19 6 4 6 101 81 101 106 84 106 148 118 148 86 68 86 105 84 105 9 7 9 148 118 148 145 116 145 146 116 146 141 113 141 141 112 141 146 146 146 146 146 146 144 144 144 145 145 145 121 121 121 109 109 109 255 255 155 255 255 153 255 255 151 255 255 156 196 136 76 255 247 138 255 255 161 255 255 160 25 17 9 217 151 84 108 75 42 184 128 71 125 87 49 255 255 153 255 255 156 255 255 156 255 255 158 255 255 158 252 126 0 244 122 0 247 123 0 244 122 0 244 122 0 252 126 0 242 121 0 242 121 0 247 123 0 242 121 0 239 119 0 247 123 0 249 124 0 237 118 0 244 122 0 249 124 0 252 126 0 247 123 0 242 121 0 198 99 0 137 68 0 198 99 0 181 90 0 76 38 0 58 29 0 112 56 0 135 67 0 160 80 0 135 67 0 170 85 0 242 121 0 242 121 0 234 117 0 247 123 0 249 124 0 249 124 0 247 123 0 242 121 0 242 121 0 244 122 0 244 122 0 252 126 0 252 126 0 247 123 0 247 123 0 244 122 0 234 117 0 239 119 0 237 118 0 239 119 0 104 104 104 94 94 94 30 30 30 76 76 76 121 121 121 66 66 66 51 51 51 103 103 103 60 60 60 120 120 120 116 116 116 118 118 118 116 116 116 120 120 120 121 97 121 119 95 119 120 96 120 121 96 121 7 5 7 4 3 4 81 65 81 85 68 85 118 95 118 48 38 48 84 67 84 7 5 7 119 95 119 116 93 116 116 93 116 114 91 114 113 91 113 118 118 118 118 118 118 117 117 117 118 118 118 98 98 98 89 89 89 28 28 28 72 72 72 114 114 114 62 62 62 48 48 48 97 97 97 57 57 57 114 114 114 110 110 110 112 112 112 110 110 110 114 114 114 115 92 115 113 90 113 114 91 114 115 92 115 6 5 6 4 3 4 77 62 77 81 64 81 113 90 113 46 36 46 80 64 80 6 5 6 114 91 114 111 89 111 111 89 111 109 87 109 108 87 108 113 113 113 113 113 113 112 112 112 113 113 113 94 94 94 85 85 85 27 27 27 69 69 69 110 110 110 60 60 60 46 46 46 94 94 94 55 55 55 109 109 109 106 106 106 108 108 108 105 105 105 110 110 110 111 89 111 109 87 109 110 88 110 111 88 111 6 5 6 4 3 4 74 59 74 78 62 78 109 87 109 44 35 44 78 62 78 6 5 6 110 88 110 107 86 107 107 86 107 105 84 105 105 84 105 109 109 109 109 109 109 108 108 108 109 109 109 91 91 91 82 82 82 26 26 26 67 67 67 106 106 106 58 58 58 +141 177 177 5 7 7 28 35 35 107 133 133 89 111 111 45 57 57 23 29 29 143 179 179 132 166 166 66 82 82 113 141 141 142 178 178 137 172 172 140 175 175 136 170 170 140 175 175 144 144 180 144 144 180 143 143 179 137 137 172 5 5 7 27 27 34 18 18 23 86 86 108 79 79 98 15 15 19 139 139 174 128 128 161 34 34 42 124 124 155 138 138 172 133 133 167 137 137 172 131 131 164 135 135 169 139 174 174 139 174 174 139 174 174 137 172 172 2 3 3 26 33 33 18 22 22 73 92 92 76 95 95 15 19 19 123 154 154 134 167 167 33 41 41 119 149 149 128 160 160 131 164 164 133 166 166 125 157 157 131 163 163 134 134 168 134 134 168 133 133 166 134 134 167 2 2 3 13 13 16 32 32 40 71 71 89 73 73 92 26 26 33 64 64 80 129 129 161 5 5 6 88 88 111 123 123 154 126 126 158 127 127 159 118 118 148 126 126 157 129 162 162 129 161 161 127 159 159 128 161 161 85 107 107 27 34 34 31 38 38 65 82 82 65 82 82 25 32 32 61 76 76 124 155 155 40 51 51 85 106 106 27 34 34 123 153 153 122 153 153 113 142 142 120 151 151 124 124 155 124 124 155 121 121 151 123 123 154 82 82 102 26 26 32 23 23 29 63 63 78 62 62 78 38 38 47 19 19 24 118 118 148 39 39 48 54 54 68 26 26 33 117 117 147 113 113 142 116 116 145 115 115 144 116 116 145 118 148 148 116 145 145 118 147 147 113 141 141 4 5 5 22 28 28 85 106 106 70 88 88 36 45 45 255 255 155 255 255 156 255 253 142 255 255 156 154 107 60 133 93 52 255 255 161 255 255 161 255 255 147 255 221 124 62 43 24 104 72 40 175 122 68 255 255 156 255 255 150 255 255 158 255 255 156 255 255 158 252 126 0 247 123 0 247 123 0 242 121 0 244 122 0 244 122 0 244 122 0 242 121 0 244 122 0 244 122 0 239 119 0 249 124 0 244 122 0 244 122 0 249 124 0 252 126 0 247 123 0 247 123 0 221 110 0 102 51 0 99 49 0 66 33 0 20 10 0 40 20 0 10 5 0 20 10 0 58 29 0 165 82 0 68 34 0 45 22 0 63 31 0 38 19 0 150 75 0 183 91 0 244 122 0 252 126 0 252 126 0 244 122 0 247 123 0 244 122 0 244 122 0 249 124 0 249 124 0 247 123 0 244 122 0 249 124 0 237 118 0 237 118 0 239 119 0 100 125 125 100 125 125 99 124 124 100 125 125 66 83 83 21 26 26 24 30 30 51 64 64 51 63 63 20 25 25 47 59 59 96 120 120 31 39 39 66 83 83 21 27 27 96 120 120 95 119 119 88 111 111 94 118 118 95 119 119 97 97 121 95 95 118 96 96 121 64 64 80 20 20 25 18 18 23 49 49 62 49 49 61 30 30 37 15 15 19 93 93 117 30 30 38 43 43 54 21 21 26 93 93 116 90 90 112 92 92 115 91 91 114 92 92 115 94 118 118 92 115 115 94 117 117 90 112 112 3 4 4 18 22 22 68 85 85 56 70 70 29 36 36 15 18 18 91 114 114 84 105 105 42 52 52 72 90 90 90 113 113 87 109 109 89 112 112 86 108 108 89 111 111 92 92 115 92 92 115 91 91 114 88 88 110 3 3 4 17 17 21 12 12 15 55 55 69 50 50 63 10 10 12 89 89 111 82 82 103 22 22 27 79 79 99 88 88 111 86 86 107 88 88 110 85 85 106 87 87 109 90 112 112 90 112 112 90 112 112 89 111 111 1 2 2 17 21 21 11 14 14 48 60 60 49 62 62 9 12 12 80 100 100 87 109 109 21 27 27 78 98 98 83 104 104 86 107 107 87 108 108 82 103 103 86 107 107 88 88 110 88 88 110 87 87 109 88 88 110 1 1 2 8 8 11 21 21 26 47 47 59 48 48 61 17 17 22 42 42 53 86 86 107 3 3 4 59 59 74 82 82 103 85 85 106 +179 179 179 183 183 183 173 173 173 162 162 162 178 143 178 178 142 178 176 141 176 176 140 176 181 145 181 179 143 179 180 144 180 177 141 177 138 110 138 121 97 121 167 133 167 175 140 175 175 140 175 173 138 173 173 138 173 174 139 174 174 139 174 179 143 179 173 139 173 168 134 168 164 131 164 173 173 173 172 172 172 170 170 170 170 170 170 175 175 175 173 173 173 174 174 174 171 171 171 133 133 133 117 117 117 161 161 161 169 169 169 169 169 169 167 167 167 167 167 167 168 168 168 168 168 168 173 173 173 167 167 167 162 162 162 158 158 158 168 134 168 171 137 171 164 131 164 158 127 158 165 132 165 165 132 165 164 131 164 156 124 156 130 104 130 116 92 116 160 128 160 163 130 163 162 130 162 157 126 157 164 131 164 160 128 160 161 129 161 166 133 166 161 128 161 147 117 147 160 128 160 161 161 161 164 164 164 157 157 157 152 152 152 158 158 158 158 158 158 158 158 158 149 149 149 124 124 124 111 111 111 153 153 153 156 156 156 156 156 156 150 150 150 156 156 156 153 153 153 154 154 154 159 159 159 154 154 154 140 140 140 158 126 158 152 122 152 151 120 151 153 123 153 153 122 153 151 121 151 156 124 156 152 122 152 131 105 131 90 72 90 115 92 115 143 114 143 143 114 143 150 120 150 139 111 139 148 118 148 147 118 147 147 118 147 150 120 150 142 113 142 132 106 132 150 150 150 145 145 145 144 144 144 146 146 146 146 146 146 144 144 144 148 148 148 145 145 145 125 125 125 86 86 86 110 110 110 136 136 136 136 136 136 255 250 140 255 255 155 255 255 145 255 255 150 255 200 112 138 96 53 255 255 161 255 255 161 255 255 160 184 128 71 83 58 32 104 72 40 71 49 27 255 255 156 255 255 156 255 255 158 255 255 156 255 255 156 252 126 0 244 122 0 244 122 0 242 121 0 244 122 0 244 122 0 252 126 0 249 124 0 249 124 0 247 123 0 244 122 0 247 123 0 247 123 0 252 126 0 252 126 0 249 124 0 244 122 0 249 124 0 198 99 0 142 71 0 15 7 0 15 7 0 22 11 0 15 7 0 28 14 0 56 28 0 94 47 0 102 51 0 117 58 0 170 85 0 99 49 0 45 22 0 28 14 0 142 71 0 247 123 0 252 126 0 252 126 0 249 124 0 252 126 0 244 122 0 244 122 0 249 124 0 252 126 0 249 124 0 244 122 0 247 123 0 229 114 0 224 112 0 234 117 0 126 101 126 122 98 122 112 89 112 122 97 122 123 123 123 125 125 125 120 120 120 116 116 116 121 121 121 120 120 120 120 120 120 114 114 114 95 95 95 84 84 84 117 117 117 119 119 119 119 119 119 115 115 115 120 120 120 117 117 117 118 118 118 122 122 122 118 118 118 108 108 108 117 117 117 117 94 117 116 93 116 118 94 118 118 94 118 116 93 116 120 96 120 117 94 117 101 81 101 70 56 70 89 71 89 111 88 111 110 88 110 116 93 116 108 86 108 115 92 115 115 92 115 114 91 114 117 93 117 111 88 111 103 82 103 117 117 117 114 114 114 112 112 112 115 115 115 114 114 114 113 113 113 116 116 116 114 114 114 98 98 98 68 68 68 86 86 86 108 108 108 107 107 107 113 113 113 105 105 105 112 112 112 112 112 112 111 111 111 114 114 114 108 108 108 101 101 101 111 89 111 111 89 111 109 87 109 109 87 109 113 90 113 111 89 111 112 90 112 110 88 110 86 69 86 75 60 75 104 83 104 110 88 110 109 87 109 108 86 108 108 86 108 109 87 109 109 87 109 112 90 112 109 87 109 105 84 105 103 82 103 109 109 109 108 108 108 107 107 107 107 107 107 110 110 110 109 109 109 110 110 110 108 108 108 84 84 84 74 74 74 102 102 102 107 107 107 107 107 107 106 106 106 106 106 106 107 107 107 107 107 107 110 110 110 107 107 107 103 103 103 101 101 101 108 86 108 110 88 110 105 84 105 102 81 102 +50 40 50 163 130 163 185 148 185 185 148 185 127 101 127 98 79 98 78 62 78 169 135 169 130 104 130 183 146 183 177 142 177 166 133 166 177 141 177 162 129 162 167 134 167 181 181 181 181 181 181 177 177 177 181 181 181 180 180 180 178 178 178 145 145 145 14 14 14 79 79 79 177 177 177 179 179 179 177 177 177 138 138 138 135 135 135 116 116 116 150 150 150 175 175 175 171 171 171 169 169 169 167 167 167 167 167 167 165 165 165 175 140 175 175 140 175 174 139 174 172 138 172 174 139 174 173 139 173 170 136 170 50 40 50 47 37 47 151 121 151 172 137 172 172 137 172 117 94 117 91 73 91 72 58 72 156 125 156 120 96 120 170 136 170 164 131 164 154 123 154 163 131 163 150 120 150 154 123 154 168 168 168 167 167 167 164 164 164 167 167 167 166 166 166 164 164 164 134 134 134 13 13 13 73 73 73 163 163 163 164 164 164 162 162 162 127 127 127 124 124 124 107 107 107 138 138 138 161 161 161 157 157 157 155 155 155 153 153 153 153 153 153 151 151 151 160 128 160 160 128 160 159 127 159 157 126 157 159 127 159 158 127 158 155 124 155 46 37 46 43 34 43 138 110 138 157 125 157 156 125 156 107 85 107 83 66 83 66 52 66 142 114 142 109 87 109 154 123 154 149 119 149 140 112 140 149 119 149 136 109 136 140 112 140 152 152 152 152 152 152 148 148 148 151 151 151 151 151 151 149 149 149 121 121 121 12 12 12 66 66 66 148 148 148 149 149 149 147 147 147 115 115 115 112 112 112 97 97 97 125 125 125 255 255 143 255 255 155 255 255 147 255 255 150 179 125 70 255 177 99 255 255 145 255 255 160 255 255 161 255 255 150 87 61 34 25 17 9 255 177 99 255 255 161 255 255 156 255 255 156 255 255 156 255 255 156 244 122 0 244 122 0 244 122 0 244 122 0 249 124 0 244 122 0 249 124 0 252 126 0 252 126 0 249 124 0 249 124 0 252 126 0 244 122 0 249 124 0 247 123 0 244 122 0 244 122 0 249 124 0 178 89 0 43 21 0 15 7 0 28 14 0 38 19 0 33 16 0 22 11 0 25 12 0 17 8 0 63 31 0 91 45 0 84 42 0 48 24 0 117 58 0 28 14 0 140 70 0 226 113 0 252 126 0 252 126 0 247 123 0 244 122 0 244 122 0 244 122 0 244 122 0 247 123 0 242 121 0 242 121 0 239 119 0 226 113 0 237 118 0 232 116 0 90 72 90 127 101 127 123 98 123 115 92 115 122 98 122 112 89 112 115 92 115 125 125 125 125 125 125 125 125 125 125 125 125 124 124 124 123 123 123 100 100 100 43 43 43 55 55 55 122 122 122 123 123 123 122 122 122 75 75 75 93 93 93 80 80 80 104 104 104 121 121 121 119 119 119 117 117 117 115 115 115 115 115 115 114 114 114 116 116 116 121 96 121 120 96 120 119 95 119 120 96 120 120 96 120 117 94 117 35 28 35 32 26 32 105 84 105 118 94 118 119 95 119 81 65 81 63 50 63 50 40 50 112 90 112 83 67 83 118 94 118 114 91 114 107 85 107 114 91 114 104 83 104 108 86 108 117 117 117 117 117 117 117 117 117 117 117 117 116 116 116 115 115 115 94 94 94 41 41 41 51 51 51 115 115 115 116 116 116 114 114 114 71 71 71 87 87 87 75 75 75 97 97 97 114 114 114 112 112 112 110 110 110 109 109 109 108 108 108 107 107 107 109 109 109 114 91 114 114 91 114 113 90 113 114 91 114 113 91 113 111 89 111 33 26 33 30 24 30 99 79 99 112 89 112 113 90 113 77 62 77 60 48 60 47 38 47 107 85 107 79 63 79 112 90 112 109 87 109 102 81 102 108 87 108 99 79 99 103 82 103 112 112 112 111 111 111 111 111 111 111 111 111 111 111 111 110 110 110 90 90 90 39 39 39 49 49 49 110 110 110 111 111 111 109 109 109 68 68 68 83 83 83 72 72 72 +182 146 182 182 146 182 99 79 99 153 123 153 155 124 155 164 164 164 164 164 164 177 177 177 169 169 169 173 173 173 172 172 172 142 142 142 172 172 172 61 61 61 81 81 81 177 177 177 88 88 88 141 141 141 176 176 176 164 164 164 175 175 175 164 164 164 78 78 78 174 174 174 172 172 172 176 176 176 96 96 96 166 166 166 149 149 149 174 139 174 158 126 158 170 136 170 165 132 165 166 133 166 160 128 160 137 109 137 165 132 165 142 113 142 78 62 78 164 131 164 84 67 84 136 108 136 153 122 153 158 126 158 138 111 138 163 130 163 75 60 75 169 135 169 165 132 165 168 135 168 116 93 116 159 127 159 135 108 135 167 167 167 151 151 151 156 156 156 158 158 158 120 120 120 154 154 154 131 131 131 162 162 162 136 136 136 125 125 125 157 157 157 81 81 81 157 157 157 146 146 146 163 163 163 132 132 132 155 155 155 130 130 130 161 161 161 159 159 159 159 159 159 111 111 111 122 122 122 128 128 128 159 127 159 146 117 146 149 119 149 103 82 103 114 91 114 146 117 146 138 110 138 154 123 154 157 125 157 119 95 119 149 119 149 143 114 143 149 119 149 92 74 92 155 124 155 126 100 126 155 124 155 123 99 123 122 97 122 151 121 151 151 121 151 127 102 127 116 92 116 128 102 128 148 118 148 138 138 138 129 129 129 97 97 97 141 141 141 134 134 134 131 131 131 106 106 106 148 148 148 113 113 113 93 93 93 135 135 135 141 141 141 88 88 88 146 146 146 33 33 33 147 147 147 135 135 135 115 115 115 143 143 143 255 255 153 255 255 156 255 255 156 255 224 125 255 238 134 255 218 122 125 87 49 205 142 80 255 255 160 255 255 153 33 23 13 16 11 6 129 90 50 255 255 161 255 255 156 255 255 156 255 255 161 244 122 0 244 122 0 244 122 0 244 122 0 249 124 0 249 124 0 247 123 0 247 123 0 244 122 0 244 122 0 244 122 0 244 122 0 249 124 0 237 118 0 242 121 0 165 82 0 109 54 0 114 57 0 91 45 0 79 39 0 94 47 0 20 10 0 15 7 0 15 7 0 45 22 0 40 20 0 38 19 0 15 7 0 28 14 0 43 21 0 40 20 0 140 70 0 104 52 0 15 7 0 2 1 0 79 39 0 219 109 0 249 124 0 247 123 0 242 121 0 247 123 0 244 122 0 242 121 0 242 121 0 237 118 0 247 123 0 242 121 0 234 117 0 242 121 0 112 90 112 116 93 116 102 81 102 120 96 120 55 44 55 124 99 124 121 97 121 124 99 124 85 68 85 117 93 117 99 79 99 123 123 123 111 111 111 115 115 115 116 116 116 88 88 88 113 113 113 96 96 96 119 119 119 100 100 100 92 92 92 116 116 116 59 59 59 115 115 115 108 108 108 120 120 120 98 98 98 115 115 115 96 96 96 119 119 119 118 118 118 118 118 118 82 82 82 90 90 90 95 95 95 116 116 116 108 87 108 111 88 111 76 61 76 85 68 85 109 87 109 103 82 103 115 92 115 117 93 117 89 71 89 112 89 112 107 85 107 111 89 111 69 55 69 116 93 116 94 75 94 117 93 117 93 74 93 91 73 91 114 91 114 114 91 114 96 77 96 87 70 87 97 77 97 112 90 112 105 105 105 98 98 98 74 74 74 107 107 107 102 102 102 99 99 99 81 81 81 113 113 113 86 86 86 71 71 71 104 104 104 108 108 108 67 67 67 113 113 113 25 25 25 114 114 114 104 104 104 89 89 89 111 111 111 112 112 112 93 93 93 61 61 61 94 94 94 109 109 109 101 81 101 95 76 95 109 87 109 104 83 104 99 79 99 106 85 106 79 63 79 106 85 106 37 30 37 69 55 69 109 87 109 106 84 106 66 52 66 109 87 109 25 20 25 109 87 109 102 81 102 87 69 87 108 87 108 109 87 109 109 87 109 59 47 59 92 74 92 93 74 93 99 99 99 99 99 99 106 106 106 102 102 102 104 104 104 +104 130 130 6 7 7 28 35 35 63 79 79 103 129 129 127 159 159 116 146 146 103 129 129 62 78 78 134 167 167 140 175 175 71 89 89 75 94 94 77 96 96 142 177 177 142 177 177 137 171 171 140 175 175 137 171 171 139 174 174 142 178 178 145 145 181 142 142 177 143 143 179 144 144 180 144 144 180 100 100 125 8 8 10 27 27 34 46 46 57 99 99 124 121 121 151 112 112 140 99 99 124 43 43 53 129 129 161 47 47 59 68 68 85 67 67 83 74 74 92 136 136 170 131 131 164 131 131 164 132 132 166 131 131 164 136 136 170 136 136 170 138 173 173 135 169 169 137 171 171 138 172 172 137 172 172 8 10 10 8 10 10 23 29 29 44 55 55 95 119 119 115 144 144 107 134 134 42 53 53 41 51 51 129 162 162 45 56 56 81 102 102 63 79 79 70 88 88 129 162 162 125 157 157 124 155 155 126 158 158 128 161 161 130 162 162 132 132 165 132 132 165 129 129 161 131 131 164 131 131 164 128 128 160 7 7 9 15 15 19 22 22 27 42 42 52 107 107 134 109 109 137 120 120 150 40 40 50 59 59 74 123 123 153 9 9 11 77 77 96 60 60 75 35 35 44 123 123 153 112 112 140 117 117 146 117 117 146 122 122 152 123 123 153 125 156 156 125 156 156 123 154 154 124 155 155 124 155 155 121 151 151 4 6 6 14 18 18 21 26 26 74 93 93 101 126 126 86 108 108 113 141 141 51 64 64 56 70 70 116 145 145 8 10 10 73 91 91 48 60 60 33 42 42 116 145 145 106 132 132 114 143 143 255 255 148 255 255 155 255 255 158 255 247 138 255 255 158 255 255 151 255 192 107 129 90 50 255 255 160 255 255 160 20 14 8 46 32 17 242 168 94 255 255 160 255 255 161 255 255 156 255 255 160 244 122 0 247 123 0 252 126 0 252 126 0 252 126 0 247 123 0 239 119 0 234 117 0 237 118 0 244 122 0 242 121 0 239 119 0 234 117 0 216 108 0 135 67 0 25 12 0 40 20 0 28 14 0 96 48 0 117 58 0 170 85 0 81 40 0 10 5 0 2 1 0 2 1 0 22 11 0 45 22 0 20 10 0 38 19 0 61 30 0 51 25 0 186 93 0 107 53 0 71 35 0 0 0 0 5 2 0 38 19 0 247 123 0 252 126 0 247 123 0 244 122 0 244 122 0 239 119 0 224 112 0 247 123 0 249 124 0 244 122 0 239 119 0 244 122 0 81 81 101 71 71 89 31 31 39 93 93 116 34 34 42 49 49 62 48 48 60 53 53 67 98 98 123 95 95 119 95 95 119 96 96 120 95 95 118 98 98 123 98 98 123 100 125 125 98 123 123 99 124 124 100 125 125 100 125 125 6 7 7 6 7 7 17 21 21 32 40 40 69 86 86 84 105 105 77 97 97 30 38 38 29 37 37 94 118 118 32 40 40 59 74 74 46 58 58 51 64 64 94 118 118 91 114 114 90 113 113 92 115 115 94 117 117 94 118 118 94 118 118 96 96 120 94 94 118 96 96 120 96 96 120 94 94 117 5 5 7 11 11 14 16 16 20 30 30 38 79 79 98 80 80 101 88 88 110 29 29 37 44 44 55 91 91 113 6 6 8 57 57 71 44 44 56 26 26 33 91 91 114 83 83 104 87 87 109 87 87 109 90 90 113 91 91 114 93 116 116 93 116 116 92 115 115 93 116 116 93 116 116 91 113 113 3 4 4 11 14 14 15 19 19 56 70 70 76 95 95 65 81 81 85 107 107 39 48 48 42 53 53 88 110 110 6 8 8 55 69 69 37 46 46 25 32 32 88 111 111 81 101 101 87 109 109 84 106 106 88 110 110 87 109 109 91 91 113 89 89 111 89 89 112 90 90 113 90 90 113 63 63 78 3 3 4 10 10 13 38 38 47 54 54 68 77 77 96 63 63 79 62 62 78 38 38 47 41 41 52 85 85 106 6 6 7 46 46 57 36 36 45 86 86 108 86 86 108 +18 22 22 63 79 79 28 35 35 146 183 183 140 175 175 84 105 105 148 186 186 142 178 178 140 176 176 143 179 179 143 179 179 144 181 181 147 147 184 147 147 184 144 144 180 145 145 181 146 146 183 146 146 183 146 146 182 103 103 129 129 129 162 138 138 172 143 143 179 2 2 3 2 2 3 8 8 10 26 26 32 13 13 16 17 17 21 52 52 65 108 108 135 140 140 175 135 135 169 141 141 176 138 138 172 135 135 169 139 139 174 137 137 172 138 138 173 141 141 176 141 176 176 140 176 176 133 167 167 140 175 175 140 175 175 139 174 174 122 153 153 129 162 162 123 154 154 130 163 163 54 68 68 0 0 0 4 5 5 9 12 12 11 13 13 16 20 20 58 72 72 26 32 32 133 167 167 128 160 160 77 96 96 135 169 169 130 162 162 128 160 160 131 163 163 130 163 163 131 164 164 134 134 167 134 134 167 131 131 163 132 132 165 133 133 166 133 133 166 132 132 165 93 93 117 117 117 146 125 125 156 130 130 162 2 2 3 2 2 3 7 7 9 23 23 29 11 11 14 15 15 19 47 47 58 98 98 122 126 126 158 122 122 153 127 127 159 124 124 155 121 121 152 125 125 156 123 123 154 124 124 155 127 127 158 126 158 158 126 158 158 119 149 149 125 157 157 125 157 157 125 156 156 109 137 137 116 145 145 110 138 138 116 145 145 48 61 61 0 0 0 3 4 4 8 10 10 9 12 12 14 18 18 51 64 64 23 29 29 119 149 149 114 142 142 68 85 85 121 151 151 115 144 144 114 142 142 116 145 145 116 145 145 255 255 158 255 255 158 255 255 160 255 209 117 255 255 153 255 255 145 255 186 104 255 226 127 255 189 106 255 235 132 46 32 17 25 17 9 255 255 143 255 255 161 255 255 161 255 255 153 255 255 156 244 122 0 249 124 0 252 126 0 249 124 0 247 123 0 249 124 0 244 122 0 244 122 0 244 122 0 244 122 0 244 122 0 247 123 0 229 114 0 76 38 0 51 25 0 53 26 0 45 22 0 96 48 0 63 31 0 71 35 0 91 45 0 40 20 0 7 3 0 5 2 0 7 3 0 102 51 0 35 17 0 17 8 0 53 26 0 45 22 0 25 12 0 137 68 0 158 79 0 17 8 0 5 2 0 10 5 0 10 5 0 56 28 0 252 126 0 252 126 0 249 124 0 247 123 0 242 121 0 247 123 0 244 122 0 249 124 0 239 119 0 239 119 0 244 122 0 103 103 128 2 2 2 2 2 2 6 6 7 18 18 23 9 9 11 12 12 15 37 37 46 77 77 97 100 100 125 97 97 121 100 100 126 98 98 123 96 96 120 99 99 124 98 98 122 99 99 123 100 100 126 100 125 125 100 125 125 95 119 119 100 125 125 100 125 125 99 124 124 87 109 109 92 115 115 88 110 110 93 116 116 39 48 48 0 0 0 2 3 3 6 8 8 7 9 9 11 14 14 41 52 52 18 23 23 95 119 119 91 114 114 55 69 69 97 121 121 93 116 116 92 115 115 94 117 117 94 117 117 94 118 118 93 117 117 96 96 120 94 94 118 95 95 119 96 96 120 96 96 120 95 95 119 67 67 84 85 85 106 90 90 113 94 94 118 1 1 2 1 1 2 5 5 7 17 17 21 8 8 10 11 11 14 34 34 42 71 71 89 92 92 115 89 89 111 93 93 116 91 91 113 89 89 111 91 91 114 90 90 113 91 91 114 93 93 116 93 116 116 93 116 116 88 110 110 93 116 116 92 116 116 92 116 116 81 101 101 86 107 107 82 102 102 86 108 108 36 45 45 0 0 0 2 3 3 6 8 8 7 9 9 11 13 13 38 48 48 17 22 22 89 112 112 85 107 107 51 64 64 91 114 114 87 109 109 86 108 108 88 110 110 88 110 110 89 111 111 88 110 110 90 90 113 88 88 111 89 89 112 90 90 113 90 90 113 90 90 112 63 63 79 80 80 100 85 85 107 89 89 111 1 1 2 1 1 2 +182 182 182 186 186 186 178 178 178 179 179 179 181 145 181 185 148 185 181 144 181 186 149 186 184 147 184 178 142 178 181 145 181 185 148 185 179 143 179 182 146 182 104 83 104 11 8 11 7 5 7 29 23 29 18 14 18 49 39 49 33 26 33 27 22 27 108 86 108 176 141 176 181 145 181 176 140 176 175 140 175 175 140 175 180 144 180 176 141 176 176 141 176 170 136 170 172 137 172 173 173 173 177 177 177 171 171 171 172 172 172 176 176 176 170 170 170 173 173 173 177 177 177 175 175 175 171 171 171 138 138 138 10 10 10 7 7 7 28 28 28 17 17 17 68 68 68 70 70 70 26 26 26 103 103 103 168 168 168 173 173 173 171 171 171 169 169 169 166 166 166 171 171 171 168 168 168 167 167 167 160 160 160 163 163 163 165 132 165 168 134 168 162 130 162 164 131 164 167 133 167 165 132 165 163 130 163 167 134 167 165 132 165 162 129 162 131 105 131 45 36 45 10 8 10 26 21 26 16 13 16 65 52 65 66 53 66 41 33 41 48 38 48 159 127 159 163 130 163 161 129 161 159 127 159 157 126 157 160 128 160 158 126 158 158 126 158 151 121 151 154 123 154 150 120 150 155 155 155 155 155 155 154 154 154 157 157 157 155 155 155 153 153 153 155 155 155 157 157 157 152 152 152 123 123 123 42 42 42 9 9 9 9 9 9 14 14 14 61 61 61 62 62 62 39 39 39 45 45 45 112 112 112 153 153 153 151 151 151 150 150 150 148 148 148 150 150 150 150 150 150 147 147 147 149 149 149 144 144 144 255 255 156 255 255 156 255 255 158 255 255 161 205 142 80 179 125 70 255 224 125 255 255 148 251 174 98 221 154 86 251 174 98 29 20 11 33 23 13 255 235 132 255 255 161 255 255 158 255 255 156 255 255 158 244 122 0 244 122 0 247 123 0 244 122 0 244 122 0 244 122 0 244 122 0 247 123 0 244 122 0 244 122 0 242 121 0 249 124 0 107 53 0 22 11 0 61 30 0 48 24 0 35 17 0 48 24 0 81 40 0 124 62 0 89 44 0 53 26 0 17 8 0 20 10 0 22 11 0 43 21 0 89 44 0 45 22 0 79 39 0 58 29 0 22 11 0 53 26 0 135 67 0 56 28 0 48 24 0 35 17 0 30 15 0 10 5 0 249 124 0 252 126 0 244 122 0 247 123 0 249 124 0 244 122 0 249 124 0 244 122 0 244 122 0 242 121 0 131 104 131 129 103 129 129 103 129 73 58 73 7 6 7 5 4 5 20 16 20 13 10 13 35 28 35 23 18 23 19 15 19 76 61 76 124 99 124 128 102 128 123 99 123 123 98 123 123 98 123 127 101 127 124 99 124 124 99 124 120 96 120 121 96 121 122 122 122 124 124 124 120 120 120 121 121 121 124 124 124 120 120 120 122 122 122 124 124 124 123 123 123 120 120 120 97 97 97 7 7 7 4 4 4 19 19 19 12 12 12 48 48 48 49 49 49 18 18 18 73 73 73 118 118 118 122 122 122 120 120 120 119 119 119 118 118 118 121 121 121 118 118 118 118 118 118 113 113 113 115 115 115 113 113 113 119 95 119 115 92 115 116 93 116 118 95 118 117 93 117 116 92 116 119 95 119 118 94 118 115 92 115 93 75 93 32 25 32 7 5 7 19 15 19 11 9 11 46 37 46 47 38 47 29 23 29 34 27 34 114 91 114 117 94 117 116 93 116 115 92 115 113 91 113 116 92 116 115 92 115 114 91 114 109 87 109 111 89 111 109 87 109 112 112 112 112 112 112 112 112 112 114 114 114 113 113 113 112 112 112 113 113 113 115 115 115 111 111 111 90 90 90 31 31 31 6 6 6 6 6 6 10 10 10 45 45 45 46 46 46 28 28 28 33 33 33 83 83 83 114 114 114 114 114 114 111 111 111 110 110 110 112 112 112 112 112 112 110 110 110 112 112 112 108 108 108 106 106 106 109 87 109 109 87 109 109 87 109 112 90 112 +188 150 188 184 147 184 138 111 138 34 27 34 20 16 20 15 12 15 113 90 113 183 146 183 184 147 184 177 141 177 184 147 184 185 148 185 185 148 185 185 148 185 185 148 185 173 138 173 141 113 141 128 102 128 16 13 16 172 138 172 183 146 183 173 139 173 160 128 160 177 141 177 178 142 178 178 142 178 180 144 180 177 177 177 179 179 179 181 181 181 178 178 178 180 180 180 176 176 176 132 132 132 5 5 5 16 16 16 16 16 16 162 162 162 178 178 178 174 174 174 176 176 176 175 175 175 177 177 177 176 176 176 176 176 176 176 176 176 165 165 165 134 134 134 122 122 122 15 15 15 164 164 164 174 174 174 165 165 165 152 152 152 168 168 168 169 169 169 169 169 169 169 135 169 172 137 172 171 137 171 171 137 171 169 135 169 170 136 170 131 104 131 24 19 24 5 4 5 15 12 15 15 12 15 153 122 153 168 134 168 164 131 164 166 133 166 166 132 166 167 133 167 167 133 167 166 133 166 166 133 166 155 124 155 127 101 127 115 92 115 15 12 15 163 130 163 161 128 161 157 125 157 150 120 150 158 126 158 156 125 156 159 127 159 159 159 159 162 162 162 161 161 161 161 161 161 159 159 159 160 160 160 123 123 123 22 22 22 4 4 4 14 14 14 14 14 14 144 144 144 158 158 158 154 154 154 156 156 156 155 155 155 156 156 156 156 156 156 156 156 156 154 154 154 139 139 139 84 84 84 98 98 98 54 54 54 152 152 152 150 150 150 147 147 147 140 140 140 148 148 148 146 146 146 149 149 149 148 119 148 255 255 161 255 255 156 255 255 161 255 255 161 255 224 125 175 122 68 255 238 134 255 255 158 158 110 62 255 238 134 12 8 4 71 49 27 33 23 13 255 255 155 255 255 160 255 255 161 255 255 156 255 255 158 247 123 0 244 122 0 244 122 0 249 124 0 249 124 0 252 126 0 252 126 0 244 122 0 249 124 0 242 121 0 242 121 0 229 114 0 43 21 0 45 22 0 63 31 0 89 44 0 109 54 0 89 44 0 89 44 0 56 28 0 94 47 0 137 68 0 30 15 0 5 2 0 28 14 0 71 35 0 130 65 0 51 25 0 53 26 0 56 28 0 86 43 0 51 25 0 38 19 0 7 3 0 0 0 0 5 2 0 10 5 0 45 22 0 229 114 0 247 123 0 247 123 0 252 126 0 249 124 0 247 123 0 252 126 0 237 118 0 244 122 0 237 118 0 129 103 129 97 77 97 23 19 23 14 11 14 10 8 10 79 63 79 127 102 127 128 103 128 123 98 123 128 102 128 129 103 129 129 103 129 129 103 129 128 103 128 120 96 120 98 78 98 89 71 89 11 9 11 119 95 119 127 101 127 120 96 120 111 89 111 122 98 122 124 99 124 123 99 123 124 99 124 123 123 123 124 124 124 125 125 125 124 124 124 125 125 125 122 122 122 92 92 92 3 3 3 11 11 11 11 11 11 112 112 112 123 123 123 121 121 121 122 122 122 122 122 122 123 123 123 122 122 122 122 122 122 122 122 122 114 114 114 93 93 93 85 85 85 11 11 11 114 114 114 121 121 121 115 115 115 106 106 106 117 117 117 118 118 118 118 118 118 119 119 119 120 96 120 120 96 120 120 96 120 118 95 118 119 95 119 91 73 91 16 13 16 3 2 3 10 8 10 10 8 10 108 86 108 118 95 118 116 93 116 117 93 117 117 93 117 118 94 118 118 94 118 117 94 117 117 94 117 110 88 110 90 72 90 81 65 81 10 8 10 115 92 115 114 91 114 112 89 112 107 85 107 113 90 113 111 89 111 114 91 114 113 113 113 116 116 116 116 116 116 115 115 115 114 114 114 115 115 115 88 88 88 16 16 16 3 3 3 10 10 10 10 10 10 104 104 104 114 114 114 112 112 112 113 113 113 113 113 113 114 114 114 114 114 114 114 114 114 113 113 113 102 102 102 62 62 62 72 72 72 40 40 40 112 112 112 111 111 111 108 108 108 +101 81 101 143 114 143 186 149 186 188 150 188 188 150 188 180 144 180 178 142 178 176 140 176 175 140 175 135 108 135 182 146 182 186 149 186 184 147 184 182 145 182 185 148 185 179 143 179 177 142 177 177 141 177 173 138 173 178 143 178 184 184 184 183 183 183 181 181 181 177 177 177 181 181 181 180 180 180 180 180 180 182 182 182 180 180 180 27 27 27 5 5 5 91 91 91 89 89 89 107 107 107 169 169 169 179 179 179 179 179 179 170 170 170 173 173 173 158 158 158 171 171 171 134 134 134 138 138 138 177 177 177 177 177 177 173 173 173 176 176 176 169 169 169 170 170 170 161 161 161 161 161 161 169 169 169 174 139 174 174 139 174 170 136 170 172 137 172 171 137 171 167 134 167 169 135 169 172 138 172 172 137 172 158 126 158 29 23 29 38 30 38 69 55 69 91 73 91 129 103 129 168 134 168 169 135 169 169 135 169 162 129 162 160 128 160 158 126 158 157 126 157 122 97 122 164 131 164 167 133 167 165 132 165 163 130 163 166 132 166 160 128 160 158 127 158 158 126 158 154 123 154 159 127 159 164 164 164 163 163 163 161 161 161 158 158 158 161 161 161 160 160 160 160 160 160 161 161 161 159 159 159 24 24 24 4 4 4 81 81 81 79 79 79 95 95 95 149 149 149 159 159 159 158 158 158 150 150 150 153 153 153 140 140 140 151 151 151 118 118 118 121 121 121 156 156 156 156 156 156 152 152 152 155 155 155 148 148 148 150 150 150 141 141 141 141 141 141 149 149 149 153 122 153 153 122 153 149 119 149 255 255 160 255 255 156 255 255 156 255 255 161 246 171 96 142 98 55 255 253 142 255 255 160 255 255 145 255 212 119 100 69 39 46 32 17 37 26 14 255 255 160 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 247 123 0 244 122 0 247 123 0 252 126 0 252 126 0 249 124 0 247 123 0 252 126 0 249 124 0 242 121 0 79 39 0 33 16 0 71 35 0 63 31 0 104 52 0 137 68 0 66 33 0 86 43 0 66 33 0 122 61 0 12 6 0 7 3 0 38 19 0 84 42 0 56 28 0 63 31 0 25 12 0 43 21 0 71 35 0 81 40 0 33 16 0 7 3 0 10 5 0 45 22 0 25 12 0 10 5 0 5 2 0 249 124 0 252 126 0 252 126 0 252 126 0 249 124 0 247 123 0 244 122 0 239 119 0 244 122 0 252 126 0 131 105 131 128 102 128 129 103 129 131 105 131 131 105 131 120 96 120 22 18 22 29 23 29 52 42 52 69 55 69 98 78 98 128 102 128 129 103 129 129 103 129 124 99 124 122 98 122 121 96 121 120 96 120 93 74 93 125 100 125 128 102 128 126 101 126 125 100 125 127 101 127 123 98 123 121 97 121 121 97 121 118 95 118 122 98 122 126 126 126 125 125 125 124 124 124 121 121 121 124 124 124 123 123 123 123 123 123 124 124 124 123 123 123 18 18 18 3 3 3 62 62 62 61 61 61 73 73 73 115 115 115 123 123 123 123 123 123 116 116 116 119 119 119 108 108 108 117 117 117 92 92 92 94 94 94 121 121 121 121 121 121 119 119 119 121 121 121 116 116 116 117 117 117 111 111 111 111 111 111 116 116 116 116 116 116 120 96 120 117 94 117 118 95 118 118 94 118 116 92 116 117 93 117 119 95 119 119 95 119 109 87 109 20 16 20 26 21 26 47 38 47 63 50 63 89 71 89 117 93 117 118 94 118 118 94 118 113 90 113 111 89 111 110 88 110 110 88 110 85 68 85 114 91 114 117 93 117 115 92 115 114 91 114 116 93 116 113 90 113 111 89 111 111 89 111 109 87 109 112 90 112 116 116 116 115 115 115 114 114 114 112 112 112 114 114 114 114 114 114 114 114 114 115 115 115 114 114 114 17 17 17 3 3 3 58 58 58 56 56 56 68 68 68 107 107 107 114 114 114 114 114 114 108 108 108 110 110 110 101 101 101 +155 124 155 183 147 183 164 131 164 169 135 169 171 137 171 177 141 177 188 150 188 188 150 188 187 150 187 185 148 185 179 143 179 175 140 175 186 149 186 186 186 186 186 186 186 185 185 185 185 185 185 183 183 183 164 164 164 80 80 80 156 156 156 68 68 68 135 135 135 174 174 174 152 152 152 131 131 131 77 77 77 177 177 177 136 136 136 47 47 47 99 99 99 64 64 64 91 91 91 73 73 73 147 147 147 175 175 175 165 165 165 161 161 161 163 163 163 168 168 168 179 179 179 178 178 178 178 178 178 176 176 176 170 170 170 166 166 166 177 177 177 176 141 176 176 141 176 176 141 176 176 140 176 173 139 173 155 124 155 76 60 76 105 84 105 144 115 144 128 102 128 165 132 165 143 115 143 124 99 124 145 116 145 141 113 141 128 103 128 45 36 45 93 74 93 60 48 60 86 69 86 127 102 127 79 63 79 164 131 164 156 124 156 152 121 152 153 123 153 121 96 121 166 133 166 168 134 168 167 134 167 165 132 165 160 128 160 156 125 156 161 129 161 162 130 162 165 165 165 165 165 165 165 165 165 163 163 163 159 159 159 111 111 111 99 99 99 135 135 135 120 120 120 154 154 154 157 157 157 111 111 111 135 135 135 132 132 132 120 120 120 42 42 42 87 87 87 56 56 56 61 61 61 119 119 119 73 73 73 154 154 154 145 145 145 137 137 137 133 133 133 112 112 112 155 155 155 156 156 156 156 156 156 154 154 154 152 152 152 153 153 153 150 150 150 151 151 151 154 123 154 154 123 154 153 123 153 151 121 151 255 255 158 255 255 160 255 255 160 255 255 160 154 107 60 255 255 151 255 177 99 255 255 160 255 255 153 255 255 147 71 49 27 29 20 11 255 244 137 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 244 122 0 244 122 0 247 123 0 247 123 0 252 126 0 252 126 0 247 123 0 214 107 0 147 73 0 20 10 0 28 14 0 15 7 0 66 33 0 68 34 0 114 57 0 38 19 0 79 39 0 71 35 0 114 57 0 12 6 0 10 5 0 33 16 0 96 48 0 33 16 0 94 47 0 33 16 0 112 56 0 30 15 0 22 11 0 96 48 0 122 61 0 53 26 0 33 16 0 12 6 0 28 14 0 10 5 0 221 110 0 252 126 0 249 124 0 242 121 0 242 121 0 244 122 0 252 126 0 234 117 0 247 123 0 133 106 133 133 106 133 131 105 131 131 105 131 117 94 117 57 46 57 112 89 112 49 39 49 106 85 106 127 102 127 108 86 108 93 75 93 55 44 55 126 101 126 38 30 38 84 67 84 70 56 70 45 36 45 65 52 65 52 41 52 105 84 105 124 99 124 111 89 111 115 92 115 116 93 116 120 96 120 127 102 127 127 101 127 127 101 127 125 100 125 121 97 121 118 95 118 126 101 126 126 126 126 126 126 126 125 125 125 125 125 125 124 124 124 111 111 111 54 54 54 105 105 105 46 46 46 91 91 91 118 118 118 102 102 102 88 88 88 52 52 52 119 119 119 92 92 92 32 32 32 67 67 67 43 43 43 62 62 62 49 49 49 100 100 100 118 118 118 112 112 112 109 109 109 110 110 110 114 114 114 121 121 121 121 121 121 121 121 121 119 119 119 115 115 115 113 113 113 120 120 120 117 117 117 120 96 120 120 96 120 119 95 119 118 94 118 106 85 106 51 41 51 72 57 72 98 79 98 87 70 87 112 90 112 98 78 98 85 68 85 99 79 99 96 77 96 88 70 88 31 24 31 64 51 64 41 33 41 59 47 59 87 70 87 54 43 54 113 91 113 107 86 107 105 84 105 106 85 106 83 67 83 115 92 115 116 93 116 116 93 116 115 92 115 111 89 111 109 87 109 112 90 112 113 90 113 115 115 115 115 115 115 115 115 115 114 114 114 111 111 111 78 78 78 69 69 69 95 95 95 84 84 84 109 109 109 111 111 111 78 78 78 96 96 96 +152 152 190 152 152 190 147 147 184 142 142 178 134 134 168 132 132 166 146 146 183 146 182 182 146 182 182 145 182 182 144 180 180 143 179 179 143 179 179 146 183 183 147 184 184 144 180 180 144 180 180 147 184 184 144 180 180 143 179 179 125 157 157 113 141 141 86 108 108 101 126 126 135 169 169 136 170 170 142 178 178 136 170 170 142 177 177 140 175 175 137 171 171 139 174 174 141 176 176 139 174 174 140 175 175 140 175 175 144 180 180 142 178 178 139 174 174 135 169 169 127 159 159 131 164 164 143 143 179 138 138 173 138 138 173 142 142 178 136 136 170 136 136 170 136 136 170 138 138 173 137 137 171 136 136 171 136 136 170 139 139 174 137 137 171 135 135 169 118 118 148 107 107 134 92 92 116 95 95 119 127 127 159 128 128 161 134 134 167 128 128 160 133 133 167 132 132 165 124 124 156 131 131 164 132 132 165 131 131 163 132 132 165 132 132 165 135 135 169 134 134 167 131 131 164 126 126 158 119 119 149 123 123 154 134 167 167 131 164 164 129 162 162 133 166 166 127 159 159 130 162 162 127 159 159 129 162 162 128 160 160 129 161 161 127 159 159 130 162 162 128 160 160 120 150 150 110 138 138 100 125 125 86 108 108 97 121 121 119 148 148 120 150 150 125 156 156 124 156 156 124 155 155 123 153 153 116 145 145 125 156 156 123 154 154 122 152 152 123 153 153 122 153 153 126 157 157 124 156 156 121 152 152 117 147 147 110 137 137 114 143 143 124 124 155 121 121 152 120 120 150 123 123 154 118 118 148 120 120 151 255 255 156 255 255 155 255 255 161 255 255 160 225 157 88 255 255 155 255 203 114 255 255 161 255 255 156 255 192 107 142 98 55 87 61 34 255 212 119 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 224 112 0 112 56 0 7 3 0 61 30 0 10 5 0 38 19 0 38 19 0 53 26 0 160 80 0 109 54 0 193 96 0 158 79 0 12 6 0 22 11 0 25 12 0 73 36 0 20 10 0 33 16 0 170 85 0 183 91 0 209 104 0 188 94 0 127 63 0 119 59 0 181 90 0 33 16 0 10 5 0 17 8 0 10 5 0 252 126 0 252 126 0 252 126 0 252 126 0 247 123 0 244 122 0 244 122 0 244 122 0 249 124 0 104 130 130 104 104 130 105 105 131 103 103 129 102 102 128 102 102 127 104 104 130 98 98 123 104 104 131 102 102 128 103 103 129 105 105 131 102 102 127 101 101 127 88 88 111 79 79 99 61 61 76 71 71 89 95 95 119 98 98 123 100 100 125 96 96 120 100 100 125 101 101 126 96 96 121 98 98 123 99 99 124 99 99 124 99 99 124 99 99 123 102 102 127 101 101 127 98 98 123 95 95 119 90 90 112 88 88 111 98 98 122 97 122 122 97 122 122 97 121 121 96 120 120 96 120 120 96 120 120 98 122 122 98 123 123 96 120 120 96 120 120 98 123 123 96 120 120 96 120 120 84 105 105 75 94 94 57 72 72 67 84 84 90 113 113 91 114 114 95 119 119 91 113 113 94 118 118 93 117 117 91 114 114 93 117 117 94 118 118 93 116 116 94 117 117 94 117 117 96 121 121 95 119 119 93 117 117 90 113 113 85 107 107 88 110 110 93 116 116 93 93 116 93 93 116 95 95 119 91 91 114 91 91 114 91 91 114 93 93 116 92 92 115 92 92 115 92 92 115 94 94 117 92 92 116 91 91 114 80 80 100 72 72 90 63 63 78 64 64 81 86 86 108 87 87 109 91 91 114 87 87 109 91 91 113 90 90 112 85 85 106 89 89 112 90 90 113 89 89 112 90 90 113 90 90 113 93 93 116 92 92 115 90 90 112 87 87 109 82 82 103 85 85 106 92 115 115 90 113 113 89 112 112 92 115 115 88 110 110 90 112 112 88 110 110 +152 190 190 152 190 190 147 184 184 148 186 186 150 187 187 150 187 187 149 187 187 134 168 168 19 24 24 18 22 22 38 47 47 82 102 102 39 49 49 51 64 64 72 90 90 7 9 9 4 5 5 18 22 22 45 56 56 30 37 37 31 39 39 32 41 41 50 63 63 29 37 37 4 5 5 2 3 3 2 3 3 5 7 7 26 33 33 145 181 181 143 179 179 141 177 177 144 180 180 141 176 176 144 180 180 140 176 176 139 174 174 144 144 181 144 144 180 140 140 175 141 141 176 141 141 176 143 143 179 142 142 177 141 141 177 44 44 55 17 17 21 40 40 50 58 58 73 40 40 50 37 37 46 37 37 46 81 81 101 7 7 8 7 7 8 39 39 49 42 42 53 28 28 35 9 9 12 31 31 38 53 53 66 21 21 26 2 2 3 0 0 0 5 5 6 25 25 31 125 125 156 134 134 168 133 133 166 137 137 171 132 132 165 135 135 169 132 132 165 132 132 165 127 127 159 135 169 169 135 169 169 131 163 163 132 165 165 133 166 166 133 166 166 132 165 165 118 148 148 17 21 21 16 20 20 33 42 42 72 90 90 34 43 43 45 56 56 64 80 80 6 8 8 3 4 4 15 19 19 39 49 49 26 33 33 27 34 34 28 36 36 44 55 55 26 32 32 3 4 4 2 3 3 2 3 3 5 6 6 23 29 29 126 158 158 125 156 156 123 154 154 125 157 157 123 153 153 125 156 156 122 153 153 121 151 151 125 125 157 125 125 157 121 121 151 122 122 153 122 122 152 124 124 155 123 123 153 122 122 153 255 255 160 255 255 161 255 255 161 255 235 132 87 61 34 179 125 70 255 255 153 255 255 161 255 255 156 154 107 60 154 107 60 16 11 6 255 255 156 255 255 161 255 255 161 255 255 158 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 249 124 0 249 124 0 153 76 0 104 52 0 7 3 0 15 7 0 43 21 0 66 33 0 20 10 0 22 11 0 94 47 0 112 56 0 221 110 0 239 119 0 28 14 0 15 7 0 158 79 0 160 80 0 239 119 0 249 124 0 249 124 0 252 126 0 249 124 0 242 121 0 158 79 0 168 84 0 142 71 0 191 95 0 10 5 0 25 12 0 237 118 0 247 123 0 247 123 0 249 124 0 249 124 0 229 114 0 239 119 0 247 123 0 249 124 0 244 122 0 104 131 131 103 129 129 101 126 126 107 107 134 104 104 130 105 105 131 104 104 131 106 106 133 105 105 131 105 105 131 33 33 41 12 12 16 29 29 37 43 43 54 29 29 37 27 27 34 27 27 34 60 60 75 5 5 6 5 5 6 29 29 36 31 31 39 21 21 26 7 7 9 23 23 28 39 39 49 15 15 19 3 3 3 0 0 0 4 4 5 18 18 23 93 93 116 100 100 125 99 99 123 101 101 127 98 98 123 100 100 125 98 98 123 98 98 122 95 95 118 101 126 126 100 126 126 97 122 122 98 123 123 99 124 124 99 124 124 99 123 123 88 111 111 13 16 16 12 15 15 25 31 31 54 67 67 28 35 35 34 42 42 48 60 60 4 6 6 2 3 3 11 14 14 29 37 37 19 24 24 20 26 26 21 27 27 33 42 42 19 24 24 2 3 3 1 2 2 1 2 2 3 4 4 17 22 22 96 120 120 95 118 118 93 117 117 95 119 119 93 117 117 95 119 119 93 116 116 92 115 115 90 112 112 96 96 120 93 93 116 93 93 117 93 93 117 95 95 119 94 94 118 94 94 118 29 29 37 11 11 14 26 26 33 39 39 49 26 26 33 24 24 31 24 24 31 54 54 68 4 4 5 4 4 5 26 26 33 28 28 35 19 19 23 6 6 8 20 20 26 36 36 45 14 14 17 2 2 3 0 0 0 3 3 4 16 16 21 84 84 105 91 91 114 90 90 112 93 93 116 90 90 112 91 91 114 89 89 112 89 89 112 86 86 108 +151 189 189 101 127 127 3 3 3 32 40 40 15 19 19 29 36 36 19 24 24 110 137 137 81 101 101 77 97 97 83 104 104 47 59 59 30 38 38 24 30 30 135 168 168 147 183 183 146 183 183 136 170 170 6 7 7 67 84 84 100 126 126 115 144 144 33 41 41 145 181 181 143 179 179 140 175 175 144 181 181 144 180 180 133 167 167 138 172 172 142 178 178 142 177 177 146 146 183 146 146 182 146 146 182 145 145 182 142 142 178 145 145 181 145 145 181 143 143 179 138 138 173 2 2 3 30 30 38 14 14 18 27 27 34 34 34 43 104 104 130 76 76 95 86 86 108 79 79 99 79 79 98 28 28 35 22 22 28 68 68 85 138 138 173 138 138 172 128 128 160 5 5 7 34 34 42 94 94 118 108 108 136 31 31 38 136 136 170 136 136 170 131 131 164 135 135 169 135 135 169 125 125 157 128 128 160 133 133 166 133 133 166 134 134 168 136 171 171 136 170 170 136 170 170 133 166 166 134 168 168 135 169 169 135 169 169 129 162 162 2 3 3 5 6 6 13 16 16 25 32 32 32 40 40 97 121 121 68 85 85 80 100 100 73 92 92 73 92 92 26 33 33 14 18 18 63 79 79 128 161 161 128 160 160 119 148 148 42 52 52 31 39 39 88 110 110 114 142 142 28 36 36 121 151 151 126 158 158 122 152 152 122 152 152 125 157 157 116 145 145 118 148 148 123 154 154 123 154 154 124 155 155 126 126 158 126 126 158 126 126 157 125 125 157 124 124 155 125 125 156 125 125 156 119 119 149 83 83 103 255 255 161 255 255 161 255 255 161 255 255 151 154 107 60 238 165 93 255 255 158 255 255 158 255 255 158 25 17 9 25 17 9 79 55 31 255 255 155 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 242 121 0 211 105 0 99 49 0 20 10 0 28 14 0 35 17 0 33 16 0 12 6 0 51 25 0 214 107 0 234 117 0 252 126 0 252 126 0 249 124 0 252 126 0 249 124 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 249 124 0 181 90 0 17 8 0 114 57 0 247 123 0 249 124 0 244 122 0 242 121 0 232 116 0 247 123 0 242 121 0 239 119 0 249 124 0 105 132 132 101 126 126 102 127 127 105 131 131 104 131 131 107 107 134 107 107 134 107 107 134 107 107 134 105 105 131 107 107 133 106 106 133 105 105 131 70 70 88 4 4 5 22 22 28 20 20 25 20 20 25 13 13 17 54 54 67 56 56 70 54 54 67 58 58 72 32 32 40 11 11 14 16 16 21 93 93 116 101 101 127 101 101 127 33 33 41 4 4 5 46 46 58 69 69 87 80 80 100 96 96 120 100 100 125 99 99 124 97 97 121 100 100 125 98 98 123 92 92 115 95 95 119 98 98 122 98 98 122 101 126 126 100 126 126 100 126 126 100 125 125 98 123 123 100 125 125 100 125 125 99 123 123 66 83 83 2 2 2 21 26 26 10 12 12 19 23 23 13 16 16 72 90 90 53 66 66 50 63 63 54 68 68 30 38 38 19 24 24 15 19 19 88 110 110 96 120 120 95 119 119 88 111 111 3 4 4 44 55 55 65 82 82 75 94 94 21 27 27 95 118 118 94 117 117 92 115 115 94 118 118 94 118 118 87 109 109 90 113 113 93 116 116 93 116 116 94 117 117 95 95 119 95 95 119 95 95 119 93 93 117 95 95 119 95 95 119 94 94 117 91 91 114 1 1 2 20 20 25 9 9 11 18 18 22 22 22 28 68 68 86 50 50 63 57 57 71 52 52 65 52 52 65 19 19 23 15 15 19 45 45 56 92 92 115 91 91 114 85 85 106 3 3 4 22 22 28 63 63 79 72 72 90 20 20 25 91 91 114 91 91 114 88 88 110 +12 15 15 41 52 52 81 102 102 134 167 167 151 188 188 152 190 190 152 190 190 150 188 188 104 130 130 118 147 147 81 101 101 132 166 166 64 80 80 143 179 179 138 173 173 106 133 133 148 186 186 150 187 187 145 181 181 145 181 181 143 179 179 135 169 169 144 180 180 144 180 180 132 165 165 131 164 164 136 170 170 148 148 185 147 147 184 147 147 184 147 147 184 147 147 183 144 144 180 146 146 183 146 146 183 146 146 182 146 146 182 144 144 180 142 142 178 117 117 146 51 51 64 11 11 14 64 64 80 77 77 96 142 142 178 142 142 178 143 143 179 143 143 179 141 141 177 98 98 122 111 111 138 108 108 135 125 125 156 93 93 116 134 134 168 120 120 150 100 100 125 139 139 174 140 140 176 136 136 170 136 136 170 134 134 168 132 132 166 135 135 169 132 132 165 123 123 154 130 130 163 127 127 159 138 173 173 138 172 172 138 172 172 137 172 172 137 171 171 134 168 168 137 171 171 136 170 170 136 170 170 136 170 170 134 168 168 130 162 162 109 136 136 47 59 59 10 13 13 59 74 74 71 89 89 132 166 166 133 167 167 133 167 167 133 166 166 131 164 164 81 102 102 103 128 128 100 125 125 116 145 145 86 108 108 124 156 156 111 139 139 125 157 157 129 161 161 127 159 159 126 157 157 124 155 155 124 155 155 122 153 153 125 156 156 122 153 153 114 143 143 120 150 150 117 147 147 127 127 159 127 127 159 127 127 159 127 127 158 126 126 158 125 125 156 126 126 157 126 126 157 125 125 157 125 125 156 124 124 155 255 255 155 255 255 161 255 255 160 255 255 151 41 29 16 255 255 158 255 255 160 255 255 153 221 154 86 29 20 11 16 11 6 37 26 14 255 255 161 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 247 123 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 186 93 0 86 43 0 28 14 0 7 3 0 38 19 0 28 14 0 22 11 0 224 112 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 247 123 0 249 124 0 247 123 0 160 80 0 22 11 0 237 118 0 249 124 0 247 123 0 239 119 0 221 110 0 232 116 0 244 122 0 239 119 0 244 122 0 252 126 0 99 124 124 103 129 129 105 132 132 103 129 129 96 120 120 102 127 127 104 130 130 108 108 135 108 108 135 107 107 134 107 107 134 105 105 131 106 106 132 107 107 133 106 106 133 106 106 133 106 106 133 104 104 130 101 101 127 31 31 38 8 8 10 28 28 35 56 56 70 92 92 115 103 103 129 104 104 131 104 104 130 104 104 130 71 71 89 64 64 80 55 55 69 91 91 114 43 43 54 98 98 122 94 94 118 72 72 91 98 98 123 102 102 128 100 100 125 99 99 124 98 98 122 92 92 116 98 98 123 98 98 123 90 90 112 90 90 112 93 93 116 97 97 121 101 126 126 100 126 126 100 126 126 100 125 125 98 123 123 99 124 124 100 125 125 100 125 125 99 124 124 98 123 123 97 122 122 80 100 100 29 36 36 8 10 10 27 33 33 53 66 66 86 108 108 97 122 122 98 123 123 98 123 123 97 121 121 67 84 84 76 95 95 52 65 65 86 107 107 41 51 51 92 115 115 89 112 112 68 86 86 96 120 120 97 121 121 94 117 117 93 117 117 92 116 116 87 109 109 93 117 117 93 116 116 85 107 107 85 106 106 88 110 110 92 115 115 95 95 119 95 95 119 95 95 119 95 95 119 93 93 116 95 95 119 95 95 119 95 95 119 95 95 118 94 94 117 93 93 116 76 76 95 33 33 41 7 7 9 42 42 52 50 50 63 93 93 116 93 93 116 94 94 117 94 94 117 93 93 116 64 64 80 72 72 91 71 71 88 82 82 102 61 61 76 88 88 110 +107 134 134 119 149 149 151 189 189 151 189 189 153 191 191 151 189 189 143 179 179 57 71 71 113 142 142 89 111 111 52 65 65 150 187 187 151 189 189 151 189 189 148 185 185 150 188 188 146 182 182 149 186 186 148 186 186 147 183 183 148 185 185 148 185 185 149 149 186 149 149 186 149 149 186 148 148 186 148 148 185 148 148 185 148 148 185 148 148 185 147 147 184 147 147 184 144 144 180 25 25 31 35 35 44 143 143 179 145 145 181 11 11 14 2 2 3 30 30 38 11 11 14 101 101 126 108 108 135 112 112 140 127 127 159 143 143 178 144 144 180 142 142 178 142 142 178 53 53 67 10 10 12 107 107 133 59 59 73 49 49 61 142 142 178 142 142 177 140 140 175 138 138 173 137 137 171 136 136 171 139 139 174 139 139 174 137 137 172 138 138 173 140 140 175 139 174 174 139 174 174 139 174 174 139 173 173 138 173 173 138 173 173 138 172 172 138 172 172 137 172 172 134 168 168 110 138 138 33 41 41 114 143 143 135 168 168 92 115 115 10 13 13 1 1 1 28 35 35 32 40 40 94 117 117 93 117 117 104 130 130 132 166 166 132 165 165 133 167 167 132 165 165 125 156 156 49 62 62 99 123 123 77 96 96 45 56 56 130 163 163 131 164 164 131 164 164 128 160 160 130 163 163 126 158 158 129 161 161 128 160 160 127 159 159 128 160 160 127 159 159 129 129 161 128 128 160 128 128 160 128 128 160 127 127 159 127 127 159 127 127 159 127 127 158 126 126 158 126 126 158 123 123 154 21 21 27 255 255 153 255 255 147 255 255 161 255 255 158 255 255 148 25 17 9 255 255 161 255 255 160 255 238 134 255 180 101 58 40 22 75 52 29 16 11 6 255 255 161 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 168 84 0 22 11 0 10 5 0 5 2 0 43 21 0 63 31 0 43 21 0 206 103 0 244 122 0 252 126 0 252 126 0 249 124 0 249 124 0 249 124 0 249 124 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 237 118 0 38 19 0 22 11 0 68 34 0 84 42 0 196 98 0 249 124 0 252 126 0 244 122 0 247 123 0 247 123 0 229 114 0 234 117 0 244 122 0 244 122 0 247 123 0 108 135 135 110 137 137 106 133 133 108 135 135 108 135 135 106 133 133 107 134 134 107 134 134 108 135 135 108 108 135 108 108 135 108 108 135 107 107 134 107 107 134 107 107 134 107 107 134 107 107 133 106 106 133 104 104 130 18 18 22 25 25 32 103 103 129 104 104 131 8 8 10 2 2 2 22 22 27 8 8 10 73 73 91 78 78 97 81 81 101 91 91 114 103 103 129 104 104 130 102 102 128 102 102 128 38 38 48 7 7 9 77 77 96 42 42 53 35 35 44 102 102 128 102 102 128 101 101 126 100 100 125 99 99 123 98 98 123 100 100 126 100 100 125 99 99 124 100 100 125 101 101 126 101 126 126 101 126 126 100 126 126 100 125 125 100 125 125 100 125 125 100 125 125 100 125 125 100 125 125 97 122 122 80 100 100 24 30 30 83 104 104 98 122 122 67 83 83 8 10 10 1 1 1 20 26 26 23 29 29 68 85 85 68 85 85 76 95 95 97 121 121 97 121 121 98 122 122 96 121 121 91 114 114 36 45 45 72 91 91 57 71 71 33 41 41 96 120 120 97 121 121 96 121 121 94 118 118 96 120 120 93 117 117 95 119 119 95 119 119 94 117 117 95 119 119 95 118 118 95 119 119 95 95 119 95 95 119 95 95 119 95 95 119 95 95 119 95 95 119 95 95 119 95 95 118 95 95 118 93 93 116 16 16 20 22 22 28 92 92 116 93 93 117 7 7 9 1 1 2 20 20 25 7 7 9 65 65 82 70 70 87 73 73 91 82 82 103 +40 50 50 146 182 182 147 184 184 147 184 184 139 174 174 139 174 174 109 137 137 149 187 187 152 190 190 152 190 190 152 190 190 152 190 190 148 186 186 148 185 185 151 189 189 148 185 185 151 188 188 150 150 188 150 150 188 150 150 188 150 150 187 150 150 187 149 149 187 149 149 187 149 149 186 123 123 154 100 100 126 126 126 157 39 39 48 135 135 168 116 116 146 140 140 175 143 143 179 134 134 167 114 114 143 142 142 178 65 65 81 13 13 16 39 39 49 51 51 64 35 35 44 26 26 33 82 82 103 64 64 80 38 38 47 68 68 86 138 138 173 132 132 166 131 131 164 131 131 163 103 103 128 140 140 175 143 143 179 143 143 178 142 142 178 142 142 178 139 139 174 139 139 174 142 142 177 131 131 164 141 141 176 139 139 174 141 176 176 140 176 176 140 175 175 140 175 175 140 175 175 139 174 174 139 174 174 115 144 144 94 117 117 117 147 147 36 45 45 96 120 120 108 136 136 130 163 163 133 166 166 124 156 156 106 133 133 132 165 165 129 162 162 12 15 15 37 46 46 48 60 60 32 41 41 30 37 37 76 95 95 111 139 139 35 44 44 63 79 79 128 160 160 122 153 153 128 160 160 121 151 151 107 134 134 130 162 162 132 165 165 132 165 165 131 164 164 131 164 164 128 161 161 129 162 162 130 163 163 121 151 151 130 163 163 128 161 161 129 129 162 129 129 162 129 129 161 129 129 161 128 128 161 128 128 160 128 128 160 120 120 150 86 86 108 72 72 90 33 33 41 88 88 110 99 99 124 255 255 155 255 255 148 255 255 158 255 206 116 255 255 151 150 104 58 255 255 151 255 218 122 255 244 137 104 72 40 146 101 57 255 192 107 255 255 158 255 255 160 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 247 123 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 214 107 0 35 17 0 45 22 0 7 3 0 22 11 0 20 10 0 22 11 0 153 76 0 247 123 0 252 126 0 165 82 0 94 47 0 71 35 0 124 62 0 104 52 0 173 86 0 247 123 0 252 126 0 247 123 0 247 123 0 81 40 0 10 5 0 114 57 0 170 85 0 221 110 0 56 28 0 244 122 0 244 122 0 237 118 0 237 118 0 234 117 0 239 119 0 234 117 0 244 122 0 244 122 0 239 119 0 247 123 0 110 138 138 110 138 138 110 138 138 110 137 137 110 137 137 108 135 135 107 134 134 101 127 127 106 133 133 107 134 134 108 108 135 108 108 135 108 108 135 108 108 135 108 108 135 107 107 134 107 107 134 100 100 126 88 88 111 60 60 75 90 90 113 74 74 92 96 96 121 100 100 126 102 102 128 102 102 128 69 69 86 82 82 102 100 100 125 46 46 58 28 28 35 5 5 6 37 37 46 23 23 29 18 18 23 86 86 107 46 46 57 27 27 34 98 98 123 99 99 124 99 99 124 93 93 117 83 83 104 73 73 92 100 100 125 102 102 128 102 102 128 102 102 127 102 102 127 100 100 126 99 99 124 101 101 127 99 99 124 101 101 126 101 126 126 101 126 126 101 126 126 100 126 126 100 125 125 100 125 125 100 125 125 94 117 117 82 103 103 56 70 70 84 105 105 26 32 32 90 113 113 78 98 98 96 120 120 96 120 120 65 81 81 77 96 96 95 119 119 43 54 54 8 11 11 4 6 6 34 43 43 21 27 27 17 22 22 55 69 69 43 54 54 25 32 32 92 115 115 93 117 117 93 116 116 88 110 110 88 110 110 69 87 87 95 118 118 96 121 121 96 120 120 96 120 120 96 120 120 94 118 118 94 118 118 96 120 120 94 117 117 96 120 120 94 118 118 95 95 119 95 95 119 95 95 119 95 95 119 95 95 119 95 95 119 95 95 119 78 78 98 64 64 80 80 80 100 24 24 31 86 86 107 74 74 93 89 89 112 91 91 114 85 85 107 73 73 91 +96 121 121 146 183 183 149 186 186 147 184 184 107 134 134 79 98 98 110 137 137 109 137 137 140 175 175 142 177 177 149 187 187 149 186 186 136 136 171 79 79 99 82 82 103 82 82 103 143 143 179 128 128 160 138 138 173 140 140 175 144 144 180 146 146 182 135 135 169 138 138 172 109 109 136 134 134 168 86 86 107 66 66 82 61 61 77 100 100 126 121 121 152 135 135 168 142 142 177 143 143 179 143 143 179 141 141 177 131 131 163 117 117 146 89 89 111 136 136 170 137 137 172 144 144 181 126 126 158 88 88 110 142 142 178 136 136 170 90 90 113 142 142 177 140 140 175 138 138 173 100 100 125 74 74 92 103 103 129 103 103 128 131 131 164 133 133 166 140 140 175 139 139 174 128 160 160 74 93 93 77 96 96 77 96 96 134 168 168 137 171 171 129 162 162 130 163 163 133 166 166 136 170 170 125 157 157 128 160 160 101 126 126 63 79 79 80 100 100 61 77 77 112 140 140 93 117 117 113 141 141 125 156 156 132 165 165 124 156 156 133 166 166 131 164 164 124 155 155 108 136 136 82 103 103 126 157 157 127 159 159 134 167 167 117 146 146 81 102 102 131 164 164 126 157 157 83 104 104 131 163 163 129 161 161 123 154 154 92 115 115 68 85 85 120 150 150 94 118 118 121 151 151 122 153 153 128 161 161 129 162 162 117 117 147 68 68 85 52 52 65 71 71 88 123 123 154 125 125 157 118 118 148 123 123 154 122 122 153 124 124 155 85 85 107 117 117 147 93 93 116 58 58 72 73 73 91 52 52 65 154 107 60 163 113 63 246 171 96 255 255 148 100 69 39 255 194 109 225 157 88 255 177 99 167 116 65 117 81 45 255 255 153 255 255 161 255 255 158 255 255 160 255 255 158 255 255 161 247 123 0 247 123 0 252 126 0 249 124 0 252 126 0 252 126 0 249 124 0 249 124 0 252 126 0 252 126 0 244 122 0 198 99 0 17 8 0 17 8 0 22 11 0 56 28 0 17 8 0 7 3 0 183 91 0 130 65 0 135 67 0 153 76 0 140 70 0 140 70 0 79 39 0 28 14 0 107 53 0 117 58 0 229 114 0 242 121 0 84 42 0 17 8 0 122 61 0 130 65 0 94 47 0 127 63 0 119 59 0 244 122 0 242 121 0 229 114 0 224 112 0 232 116 0 232 116 0 239 119 0 244 122 0 239 119 0 234 117 0 69 87 87 105 132 132 108 136 136 106 133 133 102 128 128 77 96 96 79 98 98 100 125 125 101 126 126 102 127 127 101 127 127 107 133 133 108 135 135 97 97 122 59 59 74 43 43 54 102 102 128 91 91 114 104 104 130 100 100 125 103 103 129 102 102 127 96 96 120 71 71 89 77 77 97 95 95 119 48 48 60 47 47 59 43 43 54 85 85 107 86 86 108 102 102 128 101 101 126 102 102 127 95 95 119 100 100 125 93 93 116 95 95 118 63 63 79 47 47 59 97 97 122 102 102 128 102 102 128 62 62 78 101 101 126 101 101 126 64 64 80 97 97 122 99 99 124 98 98 123 95 95 119 52 52 65 73 73 91 92 92 116 93 93 117 94 94 118 99 99 124 99 99 124 100 100 125 53 66 66 55 68 68 40 50 50 95 119 119 85 106 106 92 115 115 93 116 116 96 120 120 97 121 121 89 112 112 66 83 83 72 90 90 89 111 111 57 71 71 44 55 55 41 51 51 67 83 83 81 101 101 95 119 119 94 118 118 95 119 119 95 119 119 94 118 118 87 109 109 78 97 97 59 74 74 44 55 55 91 114 114 96 120 120 84 105 105 59 73 73 95 119 119 91 114 114 60 76 76 92 115 115 93 117 117 92 116 116 67 84 84 49 62 62 69 86 86 69 86 86 88 110 110 89 111 111 94 117 117 94 117 117 94 118 118 50 50 62 52 52 65 52 52 65 90 90 113 80 80 101 87 87 109 88 88 110 91 91 114 92 92 115 85 85 106 87 87 109 68 68 86 +191 191 191 189 189 189 187 187 187 187 187 187 183 183 183 182 182 182 180 180 180 192 153 192 188 150 188 189 151 189 187 150 187 185 148 185 185 148 185 184 147 184 184 147 184 184 147 184 180 144 180 187 150 187 183 147 183 183 146 183 189 151 189 184 147 184 182 146 182 165 132 165 75 60 75 73 59 73 49 39 49 15 12 15 30 24 30 24 19 24 15 12 15 43 34 43 118 94 118 86 69 86 56 44 56 173 139 173 170 136 170 175 140 175 182 146 182 182 145 182 183 147 183 176 140 176 172 137 172 175 140 175 177 141 177 176 141 176 182 145 182 180 144 180 177 142 177 177 142 177 175 140 175 168 134 168 171 137 171 169 135 169 170 136 170 179 179 179 175 175 175 175 175 175 173 173 173 173 173 173 172 172 172 170 170 170 172 172 172 168 168 168 173 173 173 174 174 174 171 171 171 174 174 174 175 175 175 170 170 170 171 171 171 153 153 153 68 68 68 73 73 73 45 45 45 28 28 28 7 7 7 22 22 22 40 40 40 113 113 113 109 109 109 52 52 52 93 93 93 160 160 160 162 162 162 167 167 167 168 168 168 169 169 169 166 166 166 162 162 162 162 162 162 163 163 163 163 163 163 168 168 168 167 167 167 165 165 165 163 163 163 161 161 161 161 161 161 157 157 157 157 157 157 155 155 155 165 132 165 161 129 161 162 130 162 160 128 160 158 127 158 158 126 158 158 126 158 157 126 157 157 126 157 154 123 154 160 128 160 156 125 156 156 125 156 160 128 160 157 125 157 155 124 155 140 112 140 64 51 64 255 180 101 217 151 84 255 244 137 255 255 148 163 113 63 138 96 53 175 122 68 255 212 119 255 189 106 37 26 14 255 255 160 255 255 161 255 255 160 255 255 158 255 255 156 255 255 161 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 252 126 0 252 126 0 249 124 0 242 121 0 168 84 0 5 2 0 53 26 0 25 12 0 48 24 0 43 21 0 81 40 0 153 76 0 175 87 0 209 104 0 214 107 0 178 89 0 153 76 0 168 84 0 160 80 0 168 84 0 89 44 0 196 98 0 155 77 0 76 38 0 66 33 0 15 7 0 175 87 0 109 54 0 140 70 0 244 122 0 247 123 0 239 119 0 224 112 0 224 112 0 232 116 0 229 114 0 242 121 0 229 114 0 229 114 0 244 122 0 137 137 137 134 134 134 134 134 134 135 135 135 135 135 135 138 138 138 138 138 138 137 137 137 135 135 135 133 133 133 133 133 133 130 130 130 130 130 130 128 128 128 136 109 136 133 106 133 134 107 134 133 106 133 131 105 131 131 105 131 131 104 131 130 104 130 130 104 130 127 102 127 132 106 132 130 104 130 129 103 129 133 106 133 130 104 130 129 103 129 116 93 116 53 42 53 52 41 52 34 27 34 10 8 10 21 17 21 17 13 17 10 8 10 30 24 30 83 66 83 60 48 60 39 31 39 122 98 122 119 95 119 123 98 123 128 102 128 128 102 128 129 103 129 124 99 124 121 96 121 123 98 123 124 99 124 124 99 124 128 102 128 126 101 126 125 100 125 125 100 125 123 98 123 118 94 118 120 96 120 119 95 119 120 96 120 126 126 126 123 123 123 123 123 123 122 122 122 122 122 122 122 122 122 120 120 120 121 121 121 119 119 119 122 122 122 123 123 123 121 121 121 123 123 123 124 124 124 120 120 120 121 121 121 109 109 109 48 48 48 52 52 52 32 32 32 19 19 19 4 4 4 16 16 16 28 28 28 80 80 80 78 78 78 37 37 37 66 66 66 114 114 114 115 115 115 119 119 119 120 120 120 121 121 121 119 119 119 116 116 116 116 116 116 117 117 117 117 117 117 120 120 120 120 120 120 119 119 119 118 118 118 116 116 116 116 116 116 114 114 114 114 114 114 112 112 112 113 113 113 117 93 117 118 94 118 117 93 117 115 92 115 115 92 115 115 92 115 115 92 115 +184 184 184 186 186 186 189 151 189 187 150 187 187 149 187 183 146 183 187 149 187 186 149 186 186 149 186 188 150 188 186 148 186 185 148 185 183 147 183 81 64 81 17 13 17 46 37 46 82 66 82 26 21 26 36 29 36 57 46 57 44 35 44 49 39 49 21 16 21 5 4 5 7 6 7 5 4 5 76 60 76 13 10 13 11 9 11 39 31 39 34 27 34 43 34 43 101 81 101 116 93 116 13 10 13 3 3 3 7 5 7 5 4 5 147 118 147 180 144 180 184 147 184 182 145 182 178 142 178 176 140 176 174 139 174 175 140 175 179 143 179 180 144 180 176 141 176 172 138 172 174 139 174 175 140 175 175 175 175 175 175 175 171 171 171 174 174 174 174 174 174 174 174 174 175 175 175 173 173 173 173 173 173 171 171 171 176 176 176 16 16 16 43 43 43 77 77 77 25 25 25 33 33 33 53 53 53 94 94 94 46 46 46 19 19 19 5 5 5 3 3 3 5 5 5 70 70 70 24 24 24 10 10 10 36 36 36 31 31 31 17 17 17 94 94 94 107 107 107 109 109 109 3 3 3 6 6 6 5 5 5 25 25 25 166 166 166 169 169 169 167 167 167 164 164 164 162 162 162 160 160 160 149 149 149 164 164 164 166 166 166 162 162 162 158 158 158 160 160 160 161 161 161 162 130 162 160 128 160 157 125 157 160 128 160 159 127 159 159 127 159 160 128 160 158 127 158 158 126 158 156 125 156 161 129 161 68 55 68 39 31 39 70 56 70 31 24 31 30 24 30 48 39 48 86 68 86 37 29 37 255 194 109 255 255 158 255 255 153 255 255 155 104 72 40 33 23 13 25 17 9 96 66 37 25 17 9 62 43 24 255 255 161 255 255 161 255 255 161 255 255 161 255 255 155 255 255 161 252 126 0 252 126 0 252 126 0 247 123 0 249 124 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 247 123 0 175 87 0 48 24 0 10 5 0 7 3 0 51 25 0 89 44 0 107 53 0 204 102 0 186 93 0 175 87 0 94 47 0 96 48 0 17 8 0 158 79 0 234 117 0 226 113 0 201 100 0 244 122 0 237 118 0 201 100 0 102 51 0 63 31 0 117 58 0 242 121 0 232 116 0 244 122 0 244 122 0 247 123 0 226 113 0 239 119 0 244 122 0 226 113 0 219 109 0 211 105 0 237 118 0 242 121 0 2 2 2 4 4 4 21 21 21 111 111 111 139 139 139 138 138 138 138 138 138 134 134 134 131 131 131 123 123 123 132 132 132 136 136 136 133 133 133 133 133 133 130 130 130 133 133 133 134 107 134 132 106 132 132 105 132 132 105 132 131 105 131 131 105 131 132 106 132 131 104 131 130 104 130 130 104 130 133 106 133 57 45 57 12 9 12 58 46 58 25 20 25 18 15 18 25 20 25 71 56 71 30 24 30 34 27 34 4 3 4 2 2 2 5 4 5 3 3 3 18 14 18 9 7 9 7 6 7 23 19 23 13 10 13 30 24 30 71 56 71 82 66 82 9 7 9 2 2 2 5 4 5 19 15 19 103 82 103 126 101 126 127 101 127 127 101 127 124 99 124 123 98 123 113 91 113 122 98 122 125 100 125 123 98 123 123 98 123 120 96 120 121 97 121 124 124 124 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 121 121 121 121 121 121 121 121 121 121 121 121 123 123 123 53 53 53 11 11 11 30 30 30 23 23 23 17 17 17 23 23 23 37 37 37 28 28 28 32 32 32 13 13 13 2 2 2 4 4 4 3 3 3 49 49 49 8 8 8 7 7 7 26 26 26 12 12 12 28 28 28 66 66 66 76 76 76 8 8 8 2 2 2 4 4 4 18 18 18 96 96 96 118 118 118 121 121 121 119 119 119 117 117 117 115 115 115 107 107 107 115 115 115 117 117 117 119 119 119 116 116 116 113 113 113 115 115 115 116 116 116 116 92 116 115 92 115 +194 155 194 194 155 194 194 155 194 194 155 194 191 153 191 191 153 191 158 126 158 117 93 117 79 63 79 5 4 5 13 10 13 44 35 44 27 21 27 23 18 23 121 97 121 83 66 83 75 60 75 146 117 146 9 7 9 15 12 15 17 13 17 19 15 19 55 44 55 32 26 32 24 19 24 43 35 43 55 44 55 24 19 24 49 39 49 72 57 72 68 54 68 39 31 39 24 19 24 22 18 22 9 7 9 11 9 11 7 6 7 163 130 163 185 148 185 183 146 183 181 145 181 177 141 177 173 138 173 178 142 178 178 142 178 174 139 174 161 128 161 177 142 177 182 182 182 182 182 182 182 182 182 182 182 182 181 181 181 181 181 181 181 181 181 179 179 179 178 178 178 147 147 147 109 109 109 74 74 74 19 19 19 12 12 12 41 41 41 25 25 25 37 37 37 113 113 113 77 77 77 69 69 69 135 135 135 8 8 8 14 14 14 16 16 16 17 17 17 14 14 14 30 30 30 22 22 22 40 40 40 12 12 12 22 22 22 45 45 45 66 66 66 83 83 83 36 36 36 22 22 22 20 20 20 19 19 19 10 10 10 6 6 6 150 150 150 170 170 170 168 168 168 166 166 166 162 162 162 159 159 159 163 163 163 163 163 163 159 159 159 147 147 147 167 167 167 167 134 167 167 133 167 166 133 166 166 133 166 166 132 166 165 132 165 165 132 165 163 130 163 163 130 163 134 107 134 99 79 99 4 3 4 18 14 18 11 9 11 37 30 37 19 15 19 34 27 34 103 82 103 70 56 70 63 50 63 100 80 100 8 6 8 255 255 161 255 229 129 255 255 143 255 238 134 37 26 14 41 29 16 87 61 34 29 20 11 158 110 62 255 255 161 255 255 161 255 255 160 255 255 160 255 255 155 255 255 160 252 126 0 249 124 0 244 122 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 249 124 0 249 124 0 242 121 0 22 11 0 30 15 0 7 3 0 2 1 0 61 30 0 28 14 0 109 54 0 168 84 0 252 126 0 244 122 0 191 95 0 112 56 0 127 63 0 181 90 0 247 123 0 244 122 0 175 87 0 237 118 0 249 124 0 206 103 0 244 122 0 242 121 0 239 119 0 158 79 0 234 117 0 244 122 0 234 117 0 226 113 0 221 110 0 242 121 0 244 122 0 229 114 0 234 117 0 224 112 0 229 114 0 51 51 51 68 68 68 30 30 30 18 18 18 7 7 7 15 15 15 8 8 8 5 5 5 139 139 139 139 139 139 138 138 138 136 136 136 130 130 130 131 131 131 134 134 134 133 133 133 121 121 121 133 133 133 137 137 137 137 109 137 136 109 136 136 109 136 136 109 136 136 108 136 136 108 136 134 107 134 134 107 134 133 107 133 110 88 110 55 44 55 4 3 4 14 11 14 9 7 9 18 15 18 16 12 16 28 22 28 84 67 84 52 41 52 101 81 101 83 66 83 6 5 6 12 9 12 13 10 13 38 30 38 10 8 10 17 13 17 30 24 30 38 30 38 9 7 9 34 27 34 50 40 50 47 37 47 63 50 63 27 22 27 15 12 15 6 5 6 14 11 14 7 6 7 113 90 113 128 102 128 128 102 128 127 101 127 122 98 122 120 96 120 121 97 121 123 98 123 121 96 121 111 89 111 123 98 123 126 101 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 125 125 125 124 124 124 124 124 124 124 124 124 75 75 75 51 51 51 3 3 3 13 13 13 28 28 28 17 17 17 15 15 15 26 26 26 53 53 53 48 48 48 95 95 95 77 77 77 9 9 9 11 11 11 12 12 12 36 36 36 21 21 21 16 16 16 28 28 28 35 35 35 8 8 8 32 32 32 46 46 46 44 44 44 59 59 59 15 15 15 14 14 14 6 6 6 13 13 13 4 4 4 106 106 106 120 120 120 120 120 120 118 118 118 115 115 115 113 113 113 114 114 114 116 116 116 114 114 114 +195 156 195 194 155 194 149 119 149 143 114 143 27 21 27 35 28 35 5 4 5 17 14 17 15 12 15 17 14 17 116 93 116 175 140 175 192 154 192 190 152 190 188 150 188 182 145 182 189 151 189 189 151 189 189 151 189 190 152 190 190 152 190 190 152 190 190 152 190 189 151 189 189 151 189 187 150 187 177 142 177 145 116 145 102 82 102 131 105 131 119 95 119 17 13 17 176 141 176 185 148 185 187 149 187 183 146 183 177 141 177 163 131 163 171 136 171 180 144 180 179 143 179 181 145 181 181 145 181 181 144 181 182 146 182 180 180 180 180 180 180 181 181 181 183 183 183 183 183 183 182 182 182 180 180 180 182 182 182 182 182 182 178 178 178 139 139 139 133 133 133 32 32 32 5 5 5 20 20 20 16 16 16 14 14 14 108 108 108 162 162 162 175 175 175 178 178 178 176 176 176 169 169 169 175 175 175 175 175 175 175 175 175 175 175 175 176 176 176 176 176 176 175 175 175 175 175 175 175 175 175 173 173 173 164 164 164 156 156 156 133 133 133 94 94 94 110 110 110 15 15 15 61 61 61 162 162 162 170 170 170 168 168 168 163 163 163 164 164 164 150 150 150 156 156 156 165 165 165 166 166 166 162 162 162 166 166 166 165 165 165 165 132 165 165 132 165 168 134 168 166 132 166 167 134 167 167 133 167 165 132 165 164 131 164 166 133 166 165 132 165 127 101 127 121 97 121 23 18 23 29 23 29 4 3 4 14 11 14 13 10 13 14 11 14 98 79 98 148 118 148 162 129 162 160 128 160 158 126 158 153 122 153 255 255 160 255 255 158 255 255 153 158 110 62 71 49 27 12 8 4 37 26 14 87 61 34 83 58 32 255 255 161 255 255 161 255 255 161 255 255 161 255 255 160 252 126 0 252 126 0 247 123 0 242 121 0 249 124 0 252 126 0 249 124 0 252 126 0 252 126 0 249 124 0 244 122 0 102 51 0 38 19 0 10 5 0 0 0 0 15 7 0 20 10 0 91 45 0 107 53 0 221 110 0 252 126 0 249 124 0 232 116 0 239 119 0 244 122 0 247 123 0 252 126 0 242 121 0 191 95 0 196 98 0 211 105 0 239 119 0 249 124 0 234 117 0 221 110 0 196 98 0 249 124 0 244 122 0 232 116 0 226 113 0 242 121 0 234 117 0 242 121 0 237 118 0 239 119 0 226 113 0 226 113 0 142 142 142 133 133 133 127 127 127 109 109 109 77 77 77 90 90 90 12 12 12 49 49 49 132 132 132 138 138 138 140 140 140 132 132 132 134 134 134 122 122 122 127 127 127 134 134 134 135 135 135 132 132 132 135 135 135 135 135 135 136 136 136 134 107 134 137 109 137 135 108 135 136 109 136 136 109 136 134 107 134 134 107 134 135 108 135 135 108 135 132 106 132 99 79 99 19 15 19 24 19 24 4 3 4 14 11 14 10 8 10 12 9 12 80 64 80 121 96 121 130 104 130 131 105 131 130 104 130 125 100 125 130 104 130 130 104 130 130 104 130 131 105 131 131 105 131 131 105 131 131 104 131 130 104 130 130 104 130 129 103 129 122 97 122 116 93 116 70 56 70 90 72 90 82 65 82 11 9 11 45 36 45 127 102 127 128 103 128 126 100 126 121 97 121 123 98 123 117 94 117 124 99 124 123 99 123 124 99 124 122 97 122 124 99 124 125 100 125 124 124 124 124 124 124 126 126 126 126 126 126 126 126 126 126 126 126 124 124 124 124 124 124 125 125 125 122 122 122 96 96 96 92 92 92 17 17 17 3 3 3 13 13 13 11 11 11 10 10 10 11 11 11 112 112 112 121 121 121 123 123 123 122 122 122 120 120 120 122 122 122 121 121 121 121 121 121 121 121 121 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 114 114 114 109 109 109 93 93 93 66 66 66 84 84 84 11 11 11 42 42 42 113 113 113 119 119 119 120 120 120 114 114 114 115 115 115 +7 6 7 0 0 0 5 4 5 17 14 17 9 7 9 41 33 41 129 103 129 178 142 178 193 155 193 187 150 187 146 117 146 64 51 64 97 77 97 153 123 153 173 138 173 172 138 172 182 145 182 153 122 153 185 148 185 179 143 179 152 122 152 117 94 117 77 61 77 48 38 48 88 70 88 176 141 176 113 90 113 132 105 132 183 146 183 185 148 185 179 143 179 167 134 167 169 135 169 167 133 167 172 138 172 174 139 174 170 136 170 183 146 183 182 146 182 177 141 177 176 141 176 180 144 180 185 185 185 183 183 183 177 177 177 181 181 181 182 182 182 180 180 180 180 180 180 183 183 183 181 181 181 177 177 177 179 179 179 73 73 73 27 27 27 0 0 0 5 5 5 16 16 16 9 9 9 38 38 38 78 78 78 165 165 165 180 180 180 174 174 174 136 136 136 59 59 59 79 79 79 142 142 142 160 160 160 160 160 160 168 168 168 141 141 141 121 121 121 166 166 166 140 140 140 108 108 108 71 71 71 44 44 44 83 83 83 162 162 162 104 104 104 121 121 121 168 168 168 170 170 170 171 171 171 164 164 164 155 155 155 153 153 153 158 158 158 159 159 159 156 156 156 164 164 164 167 167 167 162 162 162 161 161 161 165 165 165 169 135 169 169 135 169 162 129 162 165 132 165 166 133 166 164 131 164 164 131 164 167 134 167 165 132 165 161 129 161 163 130 163 67 53 67 25 20 25 6 5 6 5 4 5 15 12 15 8 6 8 34 27 34 71 57 71 109 87 109 163 130 163 158 126 158 123 98 123 54 43 54 72 57 72 255 255 156 255 255 155 255 250 140 255 215 120 146 101 57 37 26 14 12 8 4 255 255 160 25 17 9 255 255 161 255 255 161 255 255 158 255 255 161 255 255 160 252 126 0 252 126 0 249 124 0 242 121 0 247 123 0 252 126 0 252 126 0 252 126 0 252 126 0 247 123 0 247 123 0 142 71 0 102 51 0 25 12 0 10 5 0 17 8 0 22 11 0 66 33 0 94 47 0 178 89 0 224 112 0 244 122 0 242 121 0 239 119 0 249 124 0 252 126 0 249 124 0 242 121 0 209 104 0 226 113 0 226 113 0 239 119 0 239 119 0 221 110 0 122 61 0 216 108 0 252 126 0 244 122 0 244 122 0 242 121 0 229 114 0 239 119 0 244 122 0 224 112 0 234 117 0 242 121 0 237 118 0 134 134 134 114 114 114 57 57 57 36 36 36 67 67 67 66 66 66 131 131 131 84 84 84 137 137 137 138 138 138 139 139 139 133 133 133 124 124 124 125 125 125 128 128 128 129 129 129 126 126 126 133 133 133 136 136 136 135 135 135 131 131 131 133 133 133 137 110 137 137 110 137 136 108 136 131 105 131 135 108 135 133 107 133 133 106 133 136 108 136 136 108 136 134 107 134 132 106 132 54 43 54 20 16 20 5 4 5 0 0 0 4 3 4 12 9 12 28 22 28 58 46 58 89 71 89 122 98 122 133 106 133 128 103 128 44 35 44 58 47 58 66 53 66 105 84 105 118 94 118 118 94 118 104 83 104 90 72 90 127 101 127 122 98 122 104 83 104 80 64 80 32 26 32 61 49 61 60 48 60 120 96 120 77 61 77 90 72 90 126 101 126 127 102 127 122 97 122 114 91 114 115 92 115 114 91 114 119 95 119 116 93 116 122 98 122 125 100 125 124 99 124 120 96 120 123 98 123 126 126 126 126 126 126 125 125 125 121 121 121 123 123 123 123 123 123 123 123 123 125 125 125 125 125 125 124 124 124 121 121 121 122 122 122 18 18 18 5 5 5 0 0 0 3 3 3 11 11 11 6 6 6 53 53 53 82 82 82 113 113 113 123 123 123 119 119 119 93 93 93 54 54 54 62 62 62 98 98 98 110 110 110 110 110 110 116 116 116 84 84 84 118 118 118 114 114 114 97 97 97 75 75 75 49 49 49 57 57 57 56 56 56 112 112 112 72 72 72 84 84 84 117 117 117 +27 22 27 47 37 47 47 37 47 59 47 59 145 116 145 191 152 191 194 155 194 194 155 194 194 155 194 194 155 194 193 155 193 193 154 193 191 153 191 169 135 169 97 78 97 179 143 179 171 136 171 83 66 83 131 105 131 182 145 182 168 134 168 92 74 92 164 131 164 189 151 189 190 152 190 184 147 184 176 141 176 172 138 172 178 142 178 183 147 183 175 140 175 171 137 171 181 144 181 177 141 177 161 129 161 178 142 178 168 135 168 168 134 168 187 187 187 185 185 185 184 184 184 184 184 184 186 186 186 184 184 184 181 181 181 185 185 185 185 185 185 184 184 184 184 184 184 184 184 184 184 184 184 183 183 183 183 183 183 122 122 122 31 31 31 35 35 35 25 25 25 44 44 44 44 44 44 55 55 55 177 177 177 179 179 179 180 180 180 180 180 180 180 180 180 179 179 179 179 179 179 179 179 179 157 157 157 153 153 153 90 90 90 165 165 165 158 158 158 77 77 77 121 121 121 168 168 168 146 146 146 85 85 85 151 151 151 173 173 173 175 175 175 169 169 169 162 162 162 158 158 158 172 172 172 168 168 168 161 161 161 157 157 157 166 166 166 162 162 162 148 148 148 163 163 163 147 147 147 154 154 154 171 136 171 169 135 169 168 135 168 168 134 168 169 135 169 166 132 166 169 135 169 168 135 168 168 134 168 168 134 168 168 134 168 167 134 167 167 133 167 167 133 167 158 126 158 110 88 110 28 22 28 31 25 31 23 18 23 40 32 40 39 31 39 123 98 123 160 128 160 162 129 162 163 130 163 163 130 163 162 130 162 162 130 162 255 255 150 255 255 155 255 215 120 255 186 104 50 34 19 255 255 160 255 255 161 87 61 34 255 255 161 255 255 160 255 255 158 255 255 161 255 255 160 252 126 0 252 126 0 249 124 0 244 122 0 249 124 0 252 126 0 252 126 0 252 126 0 249 124 0 252 126 0 252 126 0 252 126 0 244 122 0 30 15 0 45 22 0 10 5 0 56 28 0 17 8 0 22 11 0 132 66 0 244 122 0 249 124 0 247 123 0 252 126 0 252 126 0 252 126 0 249 124 0 221 110 0 127 63 0 191 95 0 107 53 0 165 82 0 239 119 0 214 107 0 178 89 0 252 126 0 252 126 0 249 124 0 244 122 0 242 121 0 214 107 0 242 121 0 234 117 0 244 122 0 244 122 0 242 121 0 124 124 124 72 72 72 133 133 133 127 127 127 98 98 98 135 135 135 125 125 125 118 118 118 69 69 69 122 122 122 140 140 140 141 141 141 131 131 131 128 128 128 132 132 132 139 139 139 136 136 136 130 130 130 127 127 127 133 133 133 119 119 119 132 132 132 124 124 124 118 118 118 124 124 124 138 110 138 136 109 136 136 108 136 137 109 137 135 108 135 134 107 134 136 109 136 136 109 136 136 108 136 136 108 136 135 108 135 135 108 135 135 108 135 135 108 135 128 102 128 89 71 89 23 18 23 25 20 25 32 25 32 32 25 32 40 32 40 99 79 99 130 104 130 131 105 131 132 106 132 132 106 132 132 105 132 132 105 132 131 105 131 130 104 130 115 92 115 112 90 112 66 53 66 121 97 121 56 45 56 89 71 89 123 99 123 114 91 114 107 86 107 62 50 62 111 89 111 129 103 129 125 100 125 120 96 120 117 93 117 120 96 120 127 101 127 124 99 124 119 95 119 122 98 122 120 96 120 109 87 109 121 96 121 114 91 114 109 87 109 114 91 114 126 126 126 125 125 125 125 125 125 126 126 126 125 125 125 123 123 123 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 124 124 124 118 118 118 83 83 83 21 21 21 17 17 17 30 30 30 30 30 30 37 37 37 92 92 92 121 121 121 122 122 122 123 123 123 123 123 123 123 123 123 122 122 122 122 122 122 121 121 121 107 107 107 105 105 105 113 113 113 108 108 108 53 53 53 83 83 83 115 115 115 106 106 106 +95 76 95 117 93 117 162 129 162 172 137 172 189 151 189 191 153 191 191 153 191 191 152 191 173 138 173 186 149 186 186 149 186 186 149 186 156 125 156 146 117 146 117 93 117 173 139 173 115 92 115 112 90 112 186 149 186 192 153 192 188 150 188 191 153 191 191 153 191 191 153 191 191 152 191 189 151 189 181 144 181 180 144 180 182 146 182 182 145 182 180 144 180 172 137 172 164 131 164 179 143 179 183 146 183 188 188 188 188 188 188 188 188 188 185 185 185 185 185 185 183 183 183 187 187 187 186 186 186 186 186 186 182 182 182 180 180 180 183 183 183 185 185 185 185 185 185 184 184 184 180 180 180 70 70 70 39 39 39 7 7 7 35 35 35 120 120 120 103 103 103 71 71 71 88 88 88 108 108 108 150 150 150 176 176 176 177 177 177 177 177 177 177 177 177 160 160 160 174 174 174 172 172 172 172 172 172 172 172 172 144 144 144 135 135 135 160 160 160 106 106 106 104 104 104 172 172 172 175 175 175 177 177 177 173 173 173 176 176 176 176 176 176 175 175 175 173 173 173 166 166 166 166 166 166 167 167 167 167 167 167 154 154 154 164 164 164 157 157 157 150 150 150 164 164 164 172 137 172 172 137 172 171 137 171 169 135 169 169 135 169 167 133 167 167 133 167 170 136 170 169 135 169 169 135 169 165 132 165 167 133 167 168 134 168 168 134 168 168 134 168 164 131 164 93 74 93 64 51 64 35 28 35 6 5 6 31 25 31 93 75 93 65 52 65 80 64 80 98 78 98 136 109 136 144 115 144 159 127 159 160 128 160 160 128 160 255 255 151 255 255 151 184 128 71 96 66 37 255 224 125 255 255 158 255 241 135 71 49 27 255 255 161 255 255 161 255 255 160 255 255 161 255 255 156 252 126 0 249 124 0 249 124 0 252 126 0 252 126 0 249 124 0 244 122 0 249 124 0 252 126 0 252 126 0 252 126 0 249 124 0 247 123 0 239 119 0 168 84 0 43 21 0 35 17 0 61 30 0 61 30 0 188 94 0 221 110 0 249 124 0 252 126 0 252 126 0 252 126 0 249 124 0 178 89 0 99 49 0 43 21 0 20 10 0 112 56 0 191 95 0 181 90 0 124 62 0 249 124 0 252 126 0 252 126 0 247 123 0 252 126 0 252 126 0 244 122 0 244 122 0 232 116 0 229 114 0 219 109 0 244 122 0 140 140 140 139 139 139 138 138 138 138 138 138 116 116 116 109 109 109 129 129 129 85 85 85 83 83 83 138 138 138 141 141 141 142 142 142 139 139 139 141 141 141 141 141 141 141 141 141 139 139 139 133 133 133 133 133 133 134 134 134 134 134 134 124 124 124 132 132 132 126 126 126 120 120 120 131 131 131 134 134 134 138 110 138 138 110 138 136 109 136 136 108 136 134 107 134 134 107 134 136 109 136 136 109 136 136 109 136 133 106 133 134 107 134 135 108 135 135 108 135 135 108 135 132 105 132 74 59 74 51 41 51 28 22 28 5 4 5 25 20 25 75 60 75 52 42 52 64 51 64 79 63 79 110 88 110 116 93 116 128 102 128 129 103 129 129 103 129 129 103 129 117 93 117 126 101 126 126 100 126 125 100 125 105 84 105 99 79 99 79 63 79 117 93 117 77 62 77 76 60 76 126 100 126 129 103 129 126 101 126 129 103 129 129 103 129 129 103 129 128 103 128 127 101 127 122 97 122 121 97 121 123 98 123 122 98 122 121 97 121 116 92 116 110 88 110 120 96 120 123 98 123 127 127 127 126 126 126 126 126 126 125 125 125 125 125 125 123 123 123 126 126 126 125 125 125 125 125 125 123 123 123 121 121 121 124 124 124 125 125 125 125 125 125 124 124 124 122 122 122 47 47 47 26 26 26 5 5 5 23 23 23 81 81 81 70 70 70 48 48 48 59 59 59 73 73 73 102 102 102 119 119 119 120 120 120 120 120 120 120 120 120 109 109 109 118 118 118 117 117 117 117 117 117 117 117 117 +127 101 127 107 85 107 162 130 162 190 152 190 190 152 190 192 153 192 183 147 183 189 151 189 187 149 187 187 149 187 165 132 165 41 33 41 49 39 49 113 91 113 52 42 52 137 109 137 191 153 191 193 154 193 193 154 193 192 154 192 192 154 192 192 153 192 190 152 190 186 148 186 182 145 182 168 134 168 185 148 185 181 145 181 183 146 183 184 147 184 184 147 184 182 145 182 189 189 189 189 189 189 189 189 189 189 189 189 188 188 188 188 188 188 188 188 188 188 188 188 187 187 187 187 187 187 187 187 187 187 187 187 186 186 186 186 186 186 178 178 178 39 39 39 24 24 24 125 125 125 170 170 170 39 39 39 16 16 16 3 3 3 7 7 7 42 42 42 98 98 98 127 127 127 123 123 123 118 118 118 99 99 99 150 150 150 174 174 174 176 176 176 175 175 175 170 170 170 175 175 175 173 173 173 172 172 172 152 152 152 38 38 38 45 45 45 104 104 104 48 48 48 126 126 126 176 176 176 177 177 177 177 177 177 177 177 177 177 177 177 176 176 176 174 174 174 170 170 170 166 166 166 154 154 154 169 169 169 166 166 166 167 167 167 169 169 169 168 168 168 166 166 166 173 138 173 173 138 173 172 138 172 172 138 172 172 137 172 171 137 171 171 137 171 171 137 171 170 136 170 170 136 170 170 136 170 170 136 170 169 135 169 169 135 169 162 129 162 35 28 35 22 17 22 113 91 113 122 97 122 154 123 154 15 12 15 3 2 3 6 5 6 38 30 38 88 71 88 115 92 115 111 89 111 106 85 106 89 71 89 136 108 136 157 125 157 158 127 158 217 151 84 142 98 55 255 186 104 255 255 156 255 250 140 255 255 151 230 160 89 255 255 161 255 255 161 255 255 156 255 255 160 255 255 160 249 124 0 244 122 0 252 126 0 252 126 0 249 124 0 247 123 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 247 123 0 242 121 0 73 36 0 89 44 0 25 12 0 112 56 0 158 79 0 122 61 0 234 117 0 247 123 0 252 126 0 249 124 0 247 123 0 224 112 0 160 80 0 89 44 0 237 118 0 242 121 0 191 95 0 183 91 0 247 123 0 249 124 0 247 123 0 252 126 0 252 126 0 252 126 0 239 119 0 242 121 0 244 122 0 234 117 0 239 119 0 244 122 0 249 124 0 141 141 141 141 141 141 142 142 142 136 136 136 140 140 140 138 138 138 138 138 138 122 122 122 36 36 36 84 84 84 39 39 39 101 101 101 141 141 141 142 142 142 142 142 142 141 141 141 141 141 141 141 141 141 141 141 141 139 139 139 136 136 136 133 133 133 123 123 123 132 132 132 134 134 134 135 135 135 135 135 135 133 133 133 138 111 138 138 110 138 138 110 138 138 110 138 137 110 137 137 110 137 137 109 137 137 109 137 136 109 136 136 109 136 136 109 136 136 108 136 136 108 136 135 108 135 130 104 130 28 22 28 17 14 17 91 73 91 97 78 97 123 98 123 28 22 28 12 9 12 2 2 2 5 4 5 31 24 31 71 57 71 90 72 90 85 68 85 72 57 72 109 87 109 126 101 126 128 102 128 127 102 127 129 103 129 123 98 123 127 101 127 125 100 125 125 100 125 110 88 110 27 22 27 32 26 32 35 28 35 91 73 91 128 102 128 129 103 129 129 103 129 129 103 129 129 103 129 128 103 128 128 103 128 127 101 127 124 99 124 121 97 121 112 90 112 124 99 124 121 97 121 122 97 122 123 98 123 122 97 122 127 127 127 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 119 119 119 26 26 26 16 16 16 84 84 84 90 90 90 114 114 114 26 26 26 11 11 11 2 2 2 5 5 5 28 28 28 66 66 66 86 86 86 83 83 83 79 79 79 101 101 101 117 117 117 119 119 119 +17 14 17 23 19 23 23 19 23 83 66 83 71 57 71 93 74 93 37 30 37 148 118 148 191 153 191 191 153 191 183 146 183 185 148 185 110 88 110 186 149 186 192 154 192 194 155 194 188 150 188 186 148 186 183 147 183 183 146 183 189 151 189 185 148 185 186 149 186 186 149 186 188 150 188 188 150 188 191 153 191 185 148 185 191 191 191 191 191 191 190 190 190 190 190 190 186 186 186 180 180 180 187 187 187 189 189 189 189 189 189 189 189 189 188 188 188 188 188 188 188 188 188 188 188 188 165 165 165 24 24 24 132 132 132 173 173 173 166 166 166 165 165 165 176 176 176 174 174 174 183 183 183 183 183 183 3 3 3 0 0 0 3 3 3 5 5 5 11 11 11 13 13 13 33 33 33 33 33 33 14 14 14 16 16 16 22 22 22 22 22 22 77 77 77 66 66 66 86 86 86 34 34 34 137 137 137 176 176 176 176 176 176 169 169 169 170 170 170 101 101 101 171 171 171 177 177 177 178 178 178 172 172 172 170 170 170 168 168 168 173 173 173 169 169 169 171 171 171 171 171 171 170 170 170 172 172 172 172 172 172 175 175 175 169 169 169 174 139 174 174 139 174 174 139 174 173 139 173 169 135 169 164 131 164 171 136 171 172 138 172 172 137 172 171 137 171 171 137 171 171 137 171 171 136 171 170 136 170 149 119 149 22 17 22 120 96 120 157 126 157 150 120 150 160 128 160 158 126 158 166 133 166 166 132 166 66 52 66 3 2 3 0 0 0 3 2 3 5 4 5 10 8 10 11 9 11 30 24 30 30 24 30 13 10 13 14 11 14 255 186 104 255 255 147 255 255 155 255 189 106 255 253 142 255 255 143 167 116 65 255 255 161 255 255 160 255 255 158 255 255 158 255 255 161 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 102 51 0 22 11 0 28 14 0 114 57 0 63 31 0 137 68 0 150 75 0 191 95 0 237 118 0 252 126 0 252 126 0 239 119 0 244 122 0 242 121 0 242 121 0 204 102 0 153 76 0 214 107 0 25 12 0 216 108 0 252 126 0 252 126 0 249 124 0 247 123 0 239 119 0 247 123 0 244 122 0 237 118 0 232 116 0 244 122 0 244 122 0 26 26 26 26 26 26 11 11 11 13 13 13 17 17 17 17 17 17 61 61 61 52 52 52 68 68 68 27 27 27 109 109 109 141 141 141 135 135 135 136 136 136 81 81 81 137 137 137 141 141 141 142 142 142 137 137 137 136 136 136 134 134 134 134 134 134 138 138 138 135 135 135 136 136 136 136 136 136 135 135 135 137 137 137 136 136 136 139 139 139 134 134 134 138 111 138 138 110 138 138 110 138 138 110 138 135 108 135 130 104 130 136 108 136 137 109 137 137 109 137 136 109 136 136 109 136 136 109 136 136 108 136 119 95 119 17 14 17 95 76 95 125 100 125 120 96 120 119 95 119 127 102 127 126 101 126 132 106 132 132 106 132 52 42 52 2 2 2 0 0 0 2 2 2 4 3 4 8 6 8 9 7 9 24 19 24 24 19 24 10 8 10 11 9 11 15 12 15 15 12 15 55 44 55 62 49 62 25 20 25 99 79 99 127 102 127 127 102 127 122 97 122 123 98 123 73 58 73 124 99 124 128 102 128 129 103 129 125 100 125 123 99 123 122 97 122 122 97 122 125 100 125 123 98 123 124 99 124 124 99 124 124 99 124 125 100 125 124 99 124 127 101 127 123 98 123 127 127 127 126 126 126 126 126 126 126 126 126 120 120 120 125 125 125 126 126 126 126 126 126 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 110 110 110 16 16 16 88 88 88 115 115 115 110 110 110 110 110 110 118 118 118 116 116 116 122 122 122 122 122 122 48 48 48 2 2 2 0 0 0 2 2 2 3 3 3 +51 41 51 93 75 93 187 150 187 189 151 189 181 144 181 188 151 188 178 143 178 178 142 178 158 126 158 140 112 140 191 153 191 195 156 195 195 156 195 195 156 195 195 156 195 194 155 194 194 155 194 190 152 190 192 153 192 189 151 189 193 154 193 179 143 179 189 151 189 193 154 193 190 152 190 192 192 192 192 192 192 192 192 192 191 191 191 191 191 191 191 191 191 191 191 191 190 190 190 190 190 190 190 190 190 178 178 178 157 157 157 128 128 128 107 107 107 160 160 160 49 49 49 131 131 131 171 171 171 148 148 148 178 178 178 181 181 181 181 181 181 170 170 170 122 122 122 145 145 145 180 180 180 176 176 176 82 82 82 16 16 16 50 50 50 9 9 9 65 65 65 44 44 44 40 40 40 33 33 33 103 103 103 151 151 151 81 81 81 48 48 48 86 86 86 173 173 173 174 174 174 167 167 167 174 174 174 164 164 164 164 164 164 145 145 145 129 129 129 176 176 176 179 179 179 179 179 179 179 179 179 178 178 178 178 178 178 178 178 178 174 174 174 175 175 175 173 173 173 177 177 177 164 164 164 172 172 172 176 176 176 175 140 175 175 140 175 175 140 175 175 140 175 174 139 174 174 139 174 174 139 174 173 139 173 173 138 173 173 138 173 162 129 162 142 114 142 116 93 116 97 77 97 145 116 145 45 36 45 119 95 119 155 124 155 134 107 134 161 129 161 164 131 164 164 131 164 153 123 153 110 88 110 131 104 131 163 130 163 159 127 159 74 59 74 15 12 15 45 36 45 8 6 8 58 47 58 40 32 40 36 29 36 30 24 30 93 74 93 255 255 158 255 255 156 255 255 158 255 226 127 255 255 156 255 253 142 255 255 145 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 249 124 0 249 124 0 252 126 0 252 126 0 247 123 0 252 126 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 232 116 0 38 19 0 43 21 0 56 28 0 165 82 0 142 71 0 122 61 0 150 75 0 209 104 0 244 122 0 244 122 0 249 124 0 142 71 0 117 58 0 84 42 0 109 54 0 178 89 0 239 119 0 48 24 0 15 7 0 124 62 0 252 126 0 252 126 0 252 126 0 252 126 0 247 123 0 244 122 0 239 119 0 244 122 0 239 119 0 244 122 0 252 126 0 7 7 7 52 52 52 35 35 35 32 32 32 26 26 26 82 82 82 120 120 120 64 64 64 38 38 38 68 68 68 137 137 137 138 138 138 132 132 132 138 138 138 130 130 130 130 130 130 115 115 115 102 102 102 139 139 139 142 142 142 142 142 142 142 142 142 141 141 141 141 141 141 141 141 141 138 138 138 139 139 139 137 137 137 140 140 140 130 130 130 137 137 137 139 139 139 138 138 138 139 111 139 138 111 138 138 110 138 138 110 138 138 110 138 138 110 138 137 110 137 137 110 137 137 109 137 128 103 128 113 90 113 92 73 92 77 61 77 115 92 115 35 28 35 94 75 94 123 98 123 106 85 106 128 102 128 130 104 130 130 104 130 122 97 122 88 70 88 104 83 104 129 103 129 126 101 126 59 47 59 12 9 12 36 29 36 6 5 6 46 37 46 32 25 32 29 23 29 24 19 24 74 59 74 109 87 109 58 46 58 34 27 34 62 49 62 124 99 124 125 100 125 120 96 120 125 100 125 118 94 118 118 94 118 105 84 105 93 74 93 127 101 127 129 103 129 129 103 129 129 103 129 128 103 128 128 103 128 128 102 128 125 100 125 127 101 127 125 100 125 127 102 127 118 95 118 125 100 125 127 102 127 126 100 126 127 127 127 127 127 127 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 125 125 125 118 118 118 104 104 104 84 84 84 70 70 70 106 106 106 32 32 32 87 87 87 113 113 113 98 98 98 118 118 118 120 120 120 120 120 120 112 112 112 81 81 81 96 96 96 +186 149 186 174 139 174 178 142 178 177 142 177 167 134 167 145 116 145 129 103 129 155 124 155 188 151 188 194 155 194 196 157 196 196 156 196 195 156 195 195 156 195 193 154 193 195 156 195 191 152 191 194 155 194 194 155 194 194 155 194 192 153 192 188 150 188 193 193 193 193 193 193 193 193 193 185 185 185 190 190 190 157 157 157 85 85 85 124 124 124 96 96 96 156 156 156 116 116 116 173 173 173 144 144 144 184 184 184 171 171 171 161 161 161 140 140 140 126 126 126 160 160 160 133 133 133 167 167 167 102 102 102 110 110 110 153 153 153 104 104 104 121 121 121 123 123 123 160 160 160 181 181 181 120 120 120 71 71 71 31 31 31 108 108 108 142 142 142 138 138 138 54 54 54 56 56 56 46 46 46 165 165 165 157 157 157 172 172 172 166 166 166 172 172 172 160 160 160 164 164 164 163 163 163 163 163 163 154 154 154 133 133 133 118 118 118 142 142 142 173 173 173 178 178 178 180 180 180 179 179 179 179 179 179 177 177 177 178 178 178 175 175 175 178 178 178 178 178 178 177 177 177 175 175 175 171 171 171 176 141 176 176 141 176 176 141 176 168 135 168 173 139 173 143 114 143 77 62 77 113 90 113 88 70 88 142 114 142 105 84 105 157 126 157 131 105 131 167 134 167 155 124 155 146 117 146 126 101 126 114 91 114 145 116 145 121 96 121 151 121 151 93 74 93 99 79 99 139 111 139 94 75 94 109 87 109 110 88 110 144 115 144 163 130 163 108 86 108 64 51 64 28 23 28 97 78 97 128 102 128 124 99 124 48 38 48 50 40 50 50 40 50 255 255 150 255 255 160 230 160 89 255 238 134 255 255 150 255 253 142 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 249 124 0 247 123 0 249 124 0 244 122 0 249 124 0 249 124 0 244 122 0 247 123 0 249 124 0 252 126 0 252 126 0 247 123 0 140 70 0 96 48 0 10 5 0 12 6 0 107 53 0 145 72 0 140 70 0 155 77 0 178 89 0 204 102 0 247 123 0 249 124 0 229 114 0 142 71 0 79 39 0 140 70 0 234 117 0 229 114 0 63 31 0 147 73 0 178 89 0 249 124 0 252 126 0 252 126 0 247 123 0 244 122 0 244 122 0 249 124 0 244 122 0 229 114 0 247 123 0 247 123 0 95 95 95 56 56 56 25 25 25 86 86 86 113 113 113 109 109 109 42 42 42 44 44 44 36 36 36 131 131 131 125 125 125 136 136 136 131 131 131 136 136 136 127 127 127 129 129 129 129 129 129 122 122 122 105 105 105 94 94 94 112 112 112 137 137 137 141 141 141 142 142 142 142 142 142 141 141 141 140 140 140 141 141 141 138 138 138 140 140 140 140 140 140 140 140 140 138 138 138 135 135 135 139 111 139 139 111 139 139 111 139 133 106 133 137 109 137 113 90 113 61 49 61 89 71 89 69 55 69 112 90 112 83 66 83 124 99 124 103 82 103 132 106 132 122 98 122 115 92 115 100 80 100 90 72 90 90 72 90 114 91 114 95 76 95 119 95 119 73 58 73 78 63 78 109 87 109 74 59 74 86 69 86 87 70 87 114 91 114 129 103 129 86 68 86 51 40 51 22 18 22 77 62 77 101 81 101 98 79 98 38 30 38 39 31 39 33 26 33 118 94 118 112 90 112 123 98 123 119 95 119 122 98 122 114 91 114 117 93 117 117 93 117 110 88 110 95 76 95 85 68 85 102 81 102 124 99 124 127 102 127 129 103 129 128 103 128 128 102 128 127 101 127 128 102 128 125 100 125 128 102 128 127 102 127 127 102 127 126 101 126 123 98 123 127 127 127 127 127 127 127 127 127 121 121 121 125 125 125 103 103 103 56 56 56 81 81 81 63 63 63 63 63 63 102 102 102 76 76 76 114 114 114 95 95 95 121 121 121 112 112 112 106 106 106 92 92 92 83 83 83 105 105 105 88 88 88 110 110 110 +186 149 186 124 99 124 188 150 188 194 155 194 192 153 192 189 151 189 183 146 183 137 110 137 101 81 101 141 113 141 178 143 178 141 112 141 180 144 180 182 145 182 182 145 182 191 153 191 191 153 191 193 154 193 175 175 175 102 102 102 106 106 106 78 78 78 78 78 78 105 105 105 183 183 183 164 164 164 187 187 187 177 177 177 179 179 179 184 184 184 182 182 182 186 186 186 172 172 172 127 127 127 175 175 175 139 139 139 171 171 171 86 86 86 109 109 109 84 84 84 78 78 78 153 153 153 128 128 128 154 154 154 183 183 183 183 183 183 171 171 171 180 180 180 182 182 182 170 170 170 181 181 181 179 179 179 166 166 166 169 169 169 148 148 148 112 112 112 84 84 84 172 172 172 174 174 174 183 183 183 182 182 182 160 160 160 111 111 111 180 180 180 180 180 180 172 172 172 114 114 114 173 173 173 178 178 178 178 178 178 176 176 176 174 174 174 168 168 168 126 126 126 93 93 93 129 129 129 164 164 164 129 129 129 165 165 165 166 166 166 166 166 166 175 175 175 175 175 175 176 176 176 160 128 160 93 74 93 96 77 96 71 57 71 96 77 96 167 134 167 149 119 149 170 136 170 170 136 170 161 129 161 162 130 162 167 134 167 165 132 165 168 135 168 156 125 156 115 92 115 159 127 159 125 100 125 155 124 155 78 62 78 99 79 99 76 61 76 71 56 71 138 110 138 115 92 115 139 111 139 165 132 165 154 123 154 162 130 162 164 131 164 153 122 153 153 122 153 163 130 163 161 129 161 149 119 149 152 121 152 133 106 133 101 80 101 75 60 75 154 123 154 255 200 112 255 255 155 255 255 151 255 212 119 255 200 112 255 255 160 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 249 124 0 247 123 0 247 123 0 252 126 0 252 126 0 247 123 0 249 124 0 252 126 0 252 126 0 252 126 0 211 105 0 15 7 0 191 95 0 53 26 0 10 5 0 61 30 0 48 24 0 155 77 0 140 70 0 163 81 0 124 62 0 209 104 0 242 121 0 244 122 0 247 123 0 237 118 0 249 124 0 237 118 0 17 8 0 188 94 0 104 52 0 94 47 0 252 126 0 252 126 0 247 123 0 244 122 0 242 121 0 244 122 0 244 122 0 237 118 0 249 124 0 247 123 0 144 144 144 135 135 135 144 144 144 142 142 142 131 131 131 134 134 134 134 134 134 117 117 117 89 89 89 66 66 66 136 136 136 137 137 137 144 144 144 144 144 144 126 126 126 88 88 88 142 142 142 141 141 141 135 135 135 90 90 90 136 136 136 140 140 140 139 139 139 137 137 137 132 132 132 99 99 99 73 73 73 101 101 101 129 129 129 128 128 128 101 101 101 129 129 129 131 131 131 130 130 130 137 137 137 137 137 137 138 138 138 125 100 125 73 58 73 76 60 76 56 44 56 75 60 75 131 105 131 117 93 117 134 107 134 126 101 126 128 102 128 131 105 131 130 104 130 132 106 132 123 98 123 91 72 91 90 72 90 125 100 125 98 79 98 122 97 122 61 49 61 77 62 77 60 48 60 55 44 55 108 87 108 91 72 91 109 87 109 130 104 130 121 97 121 128 102 128 129 103 129 121 97 121 129 103 129 127 102 127 118 94 118 120 96 120 105 84 105 80 64 80 60 48 60 122 98 122 122 97 122 123 98 123 130 104 130 129 103 129 113 91 113 79 63 79 128 102 128 127 102 127 122 97 122 81 65 81 123 98 123 127 101 127 125 100 125 124 99 124 120 96 120 90 72 90 66 53 66 92 73 92 116 93 116 92 73 92 117 94 117 119 95 119 118 95 118 118 95 118 125 100 125 124 99 124 126 100 126 114 114 114 66 66 66 69 69 69 51 51 51 69 69 69 120 120 120 107 107 107 122 122 122 115 115 115 117 117 117 120 120 120 119 119 119 121 121 121 112 112 112 83 83 83 115 115 115 90 90 90 112 112 112 +197 157 197 168 135 168 180 144 180 188 150 188 162 129 162 172 137 172 124 99 124 69 55 69 69 55 69 175 140 175 185 148 185 187 149 187 169 135 169 174 139 174 178 142 178 188 188 188 190 190 190 181 181 181 179 179 179 181 181 181 183 183 183 124 124 124 157 157 157 157 157 157 164 164 164 156 156 156 176 176 176 181 181 181 187 187 187 187 187 187 177 177 177 159 159 159 132 132 132 145 145 145 182 182 182 185 185 185 176 176 176 81 81 81 81 81 81 115 115 115 61 61 61 119 119 119 157 157 157 147 147 147 156 156 156 126 126 126 150 150 150 137 137 137 131 131 131 161 161 161 157 157 157 134 134 134 151 151 151 151 151 151 181 181 181 120 120 120 71 71 71 173 173 173 180 180 180 176 176 176 179 179 179 164 164 164 102 102 102 113 113 113 152 152 152 178 178 178 180 180 180 181 181 181 181 181 181 155 155 155 166 166 166 173 173 173 149 149 149 157 157 157 113 113 113 64 64 64 160 160 160 169 169 169 171 171 171 154 154 154 159 159 159 163 163 163 172 137 172 171 137 171 173 138 173 165 132 165 163 131 163 165 132 165 166 133 166 112 90 112 143 114 143 149 119 149 142 114 142 160 128 160 165 132 165 170 136 170 169 135 169 160 128 160 160 128 160 144 115 144 119 95 119 131 105 131 164 131 164 167 134 167 158 127 158 73 58 73 104 83 104 55 44 55 107 85 107 141 113 141 132 106 132 141 113 141 113 90 113 113 90 113 135 108 135 123 98 123 117 94 117 144 115 144 141 113 141 120 96 120 135 108 135 162 129 162 108 86 108 64 51 64 154 123 154 255 229 129 255 247 138 255 203 114 255 212 119 255 255 160 255 255 161 255 255 161 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 247 123 0 249 124 0 249 124 0 252 126 0 252 126 0 252 126 0 249 124 0 127 63 0 89 44 0 165 82 0 232 116 0 22 11 0 5 2 0 10 5 0 135 67 0 61 30 0 175 87 0 175 87 0 196 98 0 249 124 0 237 118 0 244 122 0 244 122 0 239 119 0 25 12 0 86 43 0 124 62 0 173 86 0 178 89 0 252 126 0 252 126 0 252 126 0 239 119 0 242 121 0 242 121 0 244 122 0 244 122 0 247 123 0 244 122 0 124 124 124 99 99 99 119 119 119 108 108 108 103 103 103 127 127 127 124 124 124 106 106 106 119 119 119 119 119 119 142 142 142 95 95 95 56 56 56 136 136 136 141 141 141 138 138 138 141 141 141 129 129 129 80 80 80 89 89 89 119 119 119 140 140 140 141 141 141 140 140 140 142 142 142 121 121 121 130 130 130 135 135 135 116 116 116 123 123 123 89 89 89 50 50 50 125 125 125 132 132 132 134 134 134 121 121 121 125 125 125 127 127 127 127 127 127 134 107 134 135 108 135 129 103 129 128 102 128 129 103 129 130 104 130 88 70 88 111 89 111 117 93 117 111 89 111 125 100 125 129 103 129 133 106 133 132 106 132 132 106 132 125 100 125 113 90 113 93 74 93 103 82 103 128 103 128 131 105 131 124 99 124 57 45 57 81 65 81 43 34 43 84 67 84 111 89 111 104 83 104 111 88 111 110 88 110 89 71 89 106 85 106 96 77 96 92 74 92 114 91 114 111 88 111 95 76 95 106 85 106 128 102 128 85 68 85 50 40 50 122 97 122 127 101 127 124 99 124 124 99 124 126 101 126 116 92 116 72 58 72 80 64 80 107 86 107 126 100 126 127 101 127 128 102 128 109 87 109 117 94 117 122 98 122 105 84 105 111 89 111 80 64 80 80 64 80 45 36 45 114 91 114 120 96 120 121 97 121 109 87 109 113 90 113 115 92 115 122 122 122 123 123 123 118 118 118 116 116 116 117 117 117 118 118 118 80 80 80 80 80 80 101 101 101 106 106 106 101 101 101 114 114 114 118 118 118 121 121 121 121 121 121 +158 158 197 159 159 199 154 154 193 152 152 191 155 155 194 150 150 188 152 152 190 147 147 184 144 144 180 140 140 175 140 140 175 153 153 191 157 197 197 154 193 193 154 192 192 151 188 188 152 190 190 152 190 190 152 190 190 145 181 181 148 185 185 148 185 185 152 191 191 151 189 189 147 184 184 152 190 190 153 192 192 150 188 188 145 182 182 150 187 187 153 191 191 154 193 193 154 192 192 151 188 188 150 188 188 147 184 184 121 151 151 83 104 104 120 150 150 109 137 137 98 123 123 46 57 57 35 44 44 35 44 44 67 84 84 59 74 74 81 101 101 96 120 120 80 101 101 102 127 127 132 165 165 144 180 180 144 180 180 139 174 174 147 183 183 146 183 183 146 183 183 143 179 179 138 173 173 144 180 180 144 180 180 142 178 178 142 177 177 142 177 177 141 177 177 144 180 180 144 180 180 145 182 182 145 181 181 145 181 181 146 183 183 141 177 177 140 175 175 143 178 178 138 172 172 139 174 174 135 168 168 134 168 168 131 164 164 128 160 160 140 175 175 144 144 180 141 141 176 140 140 176 137 137 172 138 138 173 138 138 173 138 138 173 138 138 172 132 132 165 134 134 168 138 138 173 137 137 171 134 134 167 138 138 172 139 139 174 136 136 170 131 131 164 135 135 169 138 138 173 138 138 172 139 139 174 136 136 170 136 136 170 133 133 166 109 109 136 75 75 94 108 108 135 98 98 123 88 88 111 41 41 52 41 41 51 31 31 39 60 60 75 53 53 67 72 72 91 86 86 108 72 72 90 91 91 114 118 118 148 129 129 161 129 129 161 128 128 161 124 124 155 131 131 163 255 224 125 255 232 130 255 215 120 225 157 88 255 241 135 255 255 161 255 255 160 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 242 121 0 61 30 0 211 105 0 247 123 0 170 85 0 20 10 0 5 2 0 25 12 0 22 11 0 12 6 0 107 53 0 178 89 0 99 49 0 137 68 0 170 85 0 188 94 0 66 33 0 17 8 0 30 15 0 247 123 0 244 122 0 239 119 0 142 71 0 249 124 0 252 126 0 242 121 0 244 122 0 252 126 0 239 119 0 239 119 0 239 119 0 244 122 0 252 126 0 77 97 97 36 45 45 27 34 34 53 66 66 47 58 58 63 79 79 75 94 94 63 79 79 80 100 100 104 130 130 104 130 130 113 141 141 113 141 141 109 136 136 115 143 143 114 143 143 112 140 140 108 135 135 113 141 141 112 141 141 111 139 139 111 139 139 111 138 138 110 138 138 110 138 138 112 141 141 113 142 142 113 142 142 113 141 141 114 143 143 110 138 138 109 136 136 111 139 139 111 139 139 107 134 134 108 135 135 105 131 131 102 128 128 100 125 125 109 136 136 112 112 140 109 109 137 109 109 137 107 107 134 107 107 133 108 108 135 107 107 134 107 107 134 103 103 128 105 105 131 108 108 135 107 107 133 104 104 130 107 107 134 108 108 135 108 108 135 106 106 132 102 102 128 105 105 132 107 107 134 108 108 136 106 106 133 106 106 132 103 103 129 85 85 106 58 58 73 58 58 73 84 84 106 77 77 96 69 69 86 32 32 40 24 24 31 47 47 59 42 42 52 57 57 71 67 67 84 56 56 71 71 71 89 71 71 89 93 93 116 101 101 126 101 101 126 98 98 122 103 103 128 103 103 128 100 100 125 97 97 121 101 101 126 101 101 126 101 101 126 100 100 125 100 100 125 99 99 124 99 99 124 101 101 127 102 102 128 102 102 128 102 102 127 103 103 129 100 100 125 99 99 124 98 98 123 100 100 125 97 97 121 98 98 123 95 95 119 93 93 116 90 90 113 98 98 123 101 127 127 99 124 124 99 124 124 99 124 124 97 121 121 98 122 122 98 122 122 98 122 122 93 117 117 95 119 119 98 123 123 97 122 122 +155 155 194 155 155 193 156 156 195 156 156 195 145 145 181 141 141 177 149 149 186 147 147 184 154 192 192 153 192 192 153 192 192 153 191 191 153 191 191 156 195 195 156 195 195 154 193 193 154 192 192 152 190 190 152 190 190 152 190 190 152 190 190 151 189 189 151 189 189 154 193 193 146 183 183 141 177 177 125 157 157 97 121 121 97 121 121 109 137 137 97 121 121 104 131 131 109 136 136 35 44 44 26 33 33 9 11 11 17 21 21 17 21 21 23 29 29 9 11 11 20 25 25 13 17 17 15 19 19 10 13 13 52 65 65 38 48 48 38 48 48 55 69 69 50 63 63 19 24 24 29 36 36 70 87 87 16 20 20 22 28 28 83 104 104 83 104 104 134 168 168 145 181 181 146 183 183 149 186 186 149 186 186 149 186 186 147 184 184 147 183 183 146 183 183 143 179 179 144 181 181 146 182 182 147 184 184 145 182 182 142 178 178 142 178 178 143 179 179 143 179 179 143 179 179 132 165 165 129 161 161 136 170 170 135 168 168 140 140 175 140 140 175 140 140 175 140 140 175 139 139 174 142 142 178 142 142 177 140 140 175 140 140 175 138 138 173 138 138 173 138 138 172 138 138 172 137 137 172 137 137 171 140 140 175 132 132 166 128 128 160 113 113 142 88 88 110 99 99 124 99 99 123 87 87 109 94 94 118 98 98 123 32 32 40 23 23 29 8 8 10 15 15 19 20 20 26 20 20 26 8 8 10 18 18 22 12 12 15 13 13 17 9 9 12 46 46 58 34 34 43 49 49 61 49 49 61 45 45 56 17 17 22 25 25 32 62 62 78 14 14 18 20 20 25 255 255 151 184 128 71 171 119 67 255 250 140 255 194 109 255 255 161 255 255 156 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 244 122 0 38 19 0 86 43 0 239 119 0 247 123 0 249 124 0 234 117 0 7 3 0 22 11 0 20 10 0 25 12 0 17 8 0 22 11 0 53 26 0 84 42 0 30 15 0 30 15 0 91 45 0 119 59 0 224 112 0 247 123 0 209 104 0 234 117 0 239 119 0 252 126 0 252 126 0 249 124 0 252 126 0 252 126 0 249 124 0 249 124 0 247 123 0 252 126 0 13 16 16 18 22 22 7 9 9 15 19 19 15 19 19 10 13 13 12 15 15 8 10 10 41 51 51 30 37 37 43 54 54 39 49 49 15 19 19 15 19 19 22 28 28 54 68 68 13 16 16 17 22 22 65 81 81 105 131 131 113 141 141 114 143 143 114 142 142 116 145 145 116 145 145 115 144 144 114 143 143 114 143 143 111 139 139 112 141 141 113 142 142 113 142 142 114 143 143 113 141 141 110 138 138 110 138 138 111 139 139 111 139 139 103 128 128 100 125 125 100 125 125 106 132 132 104 130 130 109 109 136 108 108 136 108 108 135 108 108 135 110 110 138 110 110 138 110 110 137 108 108 136 108 108 135 107 107 134 107 107 134 107 107 133 106 106 133 106 106 133 108 108 136 108 108 135 103 103 128 99 99 124 88 88 110 68 68 85 77 77 96 68 68 85 73 73 91 76 76 95 76 76 95 25 25 31 18 18 23 6 6 8 11 11 14 16 16 20 6 6 8 14 14 17 9 9 12 9 9 12 10 10 13 7 7 9 36 36 45 26 26 33 38 38 48 35 35 44 13 13 17 20 20 25 20 20 25 49 49 61 11 11 14 15 15 19 58 58 72 94 94 117 101 101 127 102 102 128 104 104 130 104 104 130 104 104 130 104 104 130 102 102 128 102 102 128 100 100 125 101 101 126 102 102 128 103 103 129 103 103 129 102 102 127 99 99 124 99 99 124 100 100 125 100 100 125 93 93 116 91 91 113 96 96 120 95 95 119 94 94 118 98 123 123 98 123 123 98 123 123 98 123 123 100 125 125 100 125 125 99 124 124 99 123 123 +155 155 194 155 155 194 148 148 186 153 153 191 153 153 191 154 193 193 154 193 193 156 195 195 154 193 193 154 192 192 154 192 192 145 182 182 148 186 186 153 192 192 153 191 191 153 191 191 153 191 191 152 191 191 152 191 191 152 190 190 154 192 192 142 178 178 47 59 59 31 39 39 31 39 39 33 41 41 31 39 39 28 35 35 59 74 74 39 49 49 43 54 54 56 70 70 56 70 70 79 99 99 25 31 31 28 35 35 4 5 5 10 13 13 7 9 9 7 9 9 15 19 19 27 34 34 12 15 15 23 28 28 40 50 50 37 46 46 30 38 38 30 38 38 112 140 140 113 141 141 64 80 80 42 53 53 6 7 7 0 0 0 3 3 3 3 3 3 22 28 28 116 146 146 147 183 183 149 187 187 149 187 187 146 183 183 146 182 182 144 180 180 142 178 178 139 174 174 143 179 179 142 177 177 143 179 179 144 180 180 144 180 180 145 182 182 141 176 176 142 178 178 136 170 170 140 175 175 140 175 175 141 141 177 141 141 176 141 141 176 142 142 178 140 140 175 140 140 175 132 132 166 135 135 169 135 135 169 139 139 174 139 139 174 139 139 173 138 138 173 138 138 173 138 138 173 139 139 174 139 139 174 129 129 161 43 43 53 28 28 35 30 30 37 28 28 35 25 25 32 25 25 31 53 53 67 35 35 44 39 39 49 50 50 63 71 71 89 22 22 28 25 25 31 25 25 31 4 4 5 9 9 12 6 6 8 13 13 17 25 25 31 11 11 13 20 20 25 20 20 25 35 35 44 33 33 41 27 27 34 100 100 125 101 101 126 57 57 71 57 57 71 38 38 47 5 5 6 234 162 91 200 139 78 255 255 145 179 125 70 255 255 161 255 255 153 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 102 51 0 56 28 0 239 119 0 237 118 0 244 122 0 247 123 0 249 124 0 99 49 0 5 2 0 5 2 0 7 3 0 15 7 0 66 33 0 61 30 0 73 36 0 68 34 0 99 49 0 71 35 0 33 16 0 249 124 0 239 119 0 229 114 0 196 98 0 163 81 0 252 126 0 252 126 0 252 126 0 252 126 0 247 123 0 242 121 0 249 124 0 244 122 0 252 126 0 62 78 78 19 24 24 22 27 27 3 4 4 8 10 10 6 7 7 6 7 7 12 15 15 21 27 27 9 12 12 18 22 22 31 39 39 28 36 36 24 30 30 24 30 30 87 109 109 88 110 110 50 62 62 33 41 41 4 5 5 0 0 0 2 2 2 2 2 2 17 22 22 90 113 113 114 142 142 116 145 145 116 145 145 113 141 141 113 141 141 111 139 139 110 138 138 108 135 135 111 139 139 110 137 137 111 138 138 112 140 140 111 139 139 112 140 140 109 136 136 110 137 137 105 131 131 108 135 135 108 135 135 108 135 135 109 109 136 109 109 136 109 109 137 108 108 135 108 108 135 102 102 128 104 104 130 104 104 130 107 107 134 107 107 134 107 107 134 107 107 134 107 107 133 106 106 133 107 107 134 107 107 134 99 99 124 33 33 41 22 22 27 23 23 28 22 22 27 19 19 24 19 19 24 41 41 52 27 27 34 30 30 38 39 39 49 55 55 69 17 17 21 19 19 24 19 19 24 3 3 4 7 7 9 5 5 6 10 10 13 19 19 24 8 8 10 16 16 20 16 16 20 27 27 34 25 25 32 21 21 26 78 78 97 78 78 98 44 44 55 44 44 55 29 29 37 4 4 5 0 0 0 2 2 2 15 15 19 81 81 101 102 102 127 102 102 127 104 104 130 104 104 130 101 101 127 100 100 125 99 99 124 97 97 121 100 100 125 100 100 125 99 99 123 99 99 124 100 100 126 101 101 127 98 98 123 99 99 124 99 99 124 95 95 118 98 98 122 97 97 122 98 123 123 98 123 123 99 124 124 98 123 123 98 123 123 +155 155 194 155 155 194 160 200 200 160 200 200 156 196 196 155 194 194 156 195 195 156 195 195 159 199 199 159 199 199 157 197 197 155 194 194 155 194 194 158 198 198 158 198 198 156 196 196 151 189 189 97 121 121 19 23 23 12 15 15 12 15 15 62 77 77 39 49 49 55 69 69 68 85 85 55 69 69 69 87 87 69 86 86 55 69 69 34 43 43 58 72 72 84 106 106 6 7 7 18 23 23 18 23 23 3 3 3 17 21 21 26 33 33 43 54 54 79 99 99 79 99 99 29 36 36 76 95 95 35 44 44 48 60 60 38 48 48 32 40 40 32 40 40 46 57 57 81 101 101 33 42 42 29 36 36 15 19 19 21 26 26 21 26 26 18 22 22 6 7 7 89 112 112 149 186 186 150 187 187 150 187 187 146 183 183 145 181 181 146 183 183 147 184 184 147 184 184 144 180 180 144 180 180 143 179 179 148 185 185 146 183 183 146 182 182 143 178 178 142 178 178 142 178 178 142 178 178 146 146 183 146 146 183 143 143 179 141 141 177 141 141 176 142 142 178 145 145 181 145 145 181 143 143 179 141 141 177 141 141 176 141 141 176 144 144 180 142 142 177 137 137 172 88 88 110 17 17 21 11 11 14 11 11 14 56 56 70 35 35 44 50 50 62 61 61 76 50 50 62 49 49 62 62 62 78 49 49 62 31 31 39 52 52 65 76 76 95 5 5 7 5 5 7 16 16 21 2 2 3 15 15 19 23 23 29 39 39 48 39 39 48 71 71 88 26 26 33 68 68 85 31 31 39 42 42 53 34 34 43 34 34 43 28 28 36 41 41 51 72 72 90 30 30 37 25 25 32 175 122 68 255 255 145 255 255 153 238 165 93 255 255 161 255 255 161 255 255 161 252 126 0 249 124 0 252 126 0 252 126 0 252 126 0 249 124 0 247 123 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 33 16 0 178 89 0 234 117 0 224 112 0 239 119 0 242 121 0 244 122 0 234 117 0 2 1 0 30 15 0 15 7 0 30 15 0 15 7 0 25 12 0 38 19 0 104 52 0 63 31 0 91 45 0 239 119 0 242 121 0 242 121 0 229 114 0 229 114 0 181 90 0 249 124 0 252 126 0 252 126 0 252 126 0 249 124 0 242 121 0 249 124 0 252 126 0 249 124 0 45 57 57 66 83 83 66 83 83 4 6 6 14 18 18 2 3 3 13 16 16 20 25 25 34 42 42 34 42 42 61 77 77 23 28 28 59 74 74 27 34 34 37 46 46 37 46 46 30 37 37 25 31 31 35 44 44 63 79 79 26 32 32 22 28 28 22 28 28 11 14 14 16 20 20 14 17 17 4 5 5 69 86 86 69 86 86 115 143 143 116 145 145 113 141 141 112 140 140 113 141 141 114 142 142 113 142 142 113 142 142 111 138 138 110 138 138 114 142 142 112 141 141 112 140 140 112 140 140 110 137 137 109 137 137 109 137 137 112 112 141 112 112 140 112 112 140 110 110 137 108 108 136 109 109 137 111 111 139 111 111 139 110 110 137 110 110 137 108 108 136 108 108 135 110 110 138 109 109 136 106 106 132 67 67 84 67 67 84 13 13 16 8 8 11 43 43 53 27 27 34 38 38 48 38 38 48 47 47 59 38 38 48 48 48 60 38 38 47 24 24 30 40 40 50 40 40 50 58 58 73 4 4 5 13 13 16 2 2 2 11 11 14 18 18 22 18 18 22 30 30 37 54 54 68 20 20 25 52 52 65 24 24 30 24 24 30 33 33 41 26 26 33 22 22 28 31 31 39 56 56 70 23 23 29 23 23 29 20 20 25 10 10 13 14 14 18 12 12 15 4 4 5 62 62 77 62 62 77 103 103 128 103 103 129 101 101 127 100 100 125 101 101 126 101 101 126 102 102 127 102 102 127 100 100 125 99 99 124 102 102 128 101 101 127 101 101 127 101 101 126 99 99 124 99 99 124 99 99 123 102 127 127 101 127 127 +161 201 201 161 201 201 159 199 199 160 200 200 160 200 200 160 200 200 160 200 200 160 200 200 159 199 199 159 199 199 156 195 195 156 195 195 135 168 168 93 116 116 73 92 92 12 16 16 17 22 22 17 22 22 9 11 11 41 51 51 43 53 53 51 63 63 71 89 89 71 89 89 23 29 29 49 61 61 41 51 51 61 77 77 79 98 98 79 98 98 6 7 7 9 11 11 23 29 29 12 15 15 51 64 64 51 64 64 34 43 43 39 48 48 15 19 19 15 19 19 26 33 33 26 33 33 43 54 54 31 38 38 49 62 62 20 25 25 4 5 5 4 5 5 0 0 0 6 7 7 27 34 34 7 9 9 6 7 7 6 7 7 13 17 17 1 1 1 74 93 93 148 185 185 147 184 184 147 184 184 147 184 184 148 186 186 150 187 187 148 185 185 148 185 185 145 181 181 146 182 182 149 186 186 144 180 180 139 174 174 139 174 174 143 179 179 143 179 179 138 173 173 147 147 184 147 147 184 147 147 183 146 146 183 145 145 181 146 146 183 146 146 182 146 146 182 145 145 182 145 145 182 145 145 181 145 145 181 142 142 177 122 122 153 122 122 153 84 84 105 66 66 83 11 11 14 15 15 19 8 8 10 8 8 10 37 37 46 38 38 48 46 46 57 64 64 80 21 21 26 21 21 26 44 44 55 37 37 46 55 55 69 71 71 88 5 5 7 5 5 7 8 8 10 21 21 26 11 11 14 46 46 58 30 30 38 30 30 38 35 35 43 13 13 17 13 13 17 23 23 29 38 38 48 38 38 48 27 27 34 44 44 55 17 17 22 4 4 5 4 4 5 0 0 0 5 5 6 255 255 158 255 238 134 255 255 151 251 174 98 255 255 160 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 249 124 0 244 122 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 209 104 0 51 25 0 173 86 0 239 119 0 247 123 0 198 99 0 219 109 0 224 112 0 201 100 0 196 98 0 28 14 0 30 15 0 12 6 0 89 44 0 56 28 0 45 22 0 188 94 0 102 51 0 206 103 0 244 122 0 232 116 0 209 104 0 204 102 0 234 117 0 226 113 0 247 123 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 252 126 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 23 23 9 12 12 40 50 50 26 33 33 26 33 33 30 38 38 12 15 15 12 15 15 20 25 25 33 42 42 33 42 42 24 30 30 38 48 48 15 19 19 3 4 4 0 0 0 0 0 0 4 5 5 21 26 26 5 7 7 4 5 5 10 13 13 10 13 13 1 1 1 57 72 72 113 142 142 113 142 142 113 141 141 113 141 141 114 142 142 115 144 144 113 142 142 111 139 139 112 140 140 112 140 140 114 142 142 110 138 138 107 133 133 110 137 137 110 137 137 110 137 137 106 132 132 113 113 141 112 112 141 112 112 140 111 111 139 111 111 139 112 112 140 111 111 139 111 111 139 111 111 139 111 111 139 111 111 139 111 111 138 108 108 135 93 93 117 64 64 81 51 51 64 51 51 64 8 8 11 12 12 15 6 6 8 28 28 35 28 28 35 29 29 37 35 35 44 49 49 61 16 16 20 34 34 42 33 33 42 28 28 35 42 42 53 54 54 68 4 4 5 6 6 8 6 6 8 16 16 20 8 8 10 35 35 44 23 23 29 26 26 33 26 26 33 10 10 13 10 10 13 18 18 22 30 30 37 21 21 26 21 21 26 34 34 42 13 13 17 3 3 3 0 0 0 4 4 5 4 4 5 19 19 23 5 5 6 4 4 5 9 9 11 1 1 1 1 1 1 51 51 64 101 101 127 101 101 127 101 101 127 102 102 128 102 102 128 103 103 129 102 102 127 100 100 125 100 100 126 102 102 128 102 102 128 99 99 124 96 96 120 99 99 124 99 99 124 +161 201 201 161 201 201 161 201 201 161 201 201 160 201 201 160 200 200 160 200 200 158 198 198 158 198 198 153 192 192 148 185 185 62 78 78 16 20 20 9 12 12 9 12 12 27 34 34 27 34 34 41 52 52 12 16 16 12 16 16 14 17 17 59 73 73 68 85 85 70 87 87 70 87 87 138 173 173 149 186 186 90 113 113 17 21 21 9 11 11 9 11 11 11 13 13 14 17 17 29 37 37 48 61 61 48 60 60 95 119 119 105 131 131 103 129 129 112 140 140 112 140 140 128 160 160 115 144 144 96 120 120 77 97 97 73 91 91 72 91 91 110 137 137 89 112 112 20 25 25 6 7 7 6 7 7 10 13 13 10 13 13 3 3 3 122 153 153 122 153 153 150 187 187 151 189 189 151 189 189 147 184 184 144 180 180 144 180 180 144 180 180 144 180 180 145 181 181 149 187 187 149 186 186 146 182 182 138 173 173 145 182 182 148 185 185 148 148 185 148 148 185 148 148 185 147 147 184 146 146 182 147 147 184 147 147 184 146 146 183 146 146 183 146 146 183 146 146 182 146 146 182 145 145 182 144 144 180 139 139 174 134 134 168 57 57 71 57 57 71 14 14 18 8 8 10 24 24 30 24 24 30 24 24 30 37 37 47 11 11 14 12 12 16 53 53 66 53 53 66 61 61 77 63 63 78 124 124 155 134 134 167 81 81 101 81 81 101 15 15 19 8 8 10 9 9 12 12 12 15 12 12 15 26 26 33 43 43 54 85 85 107 94 94 117 93 93 117 92 92 115 100 100 125 114 114 142 102 102 128 86 86 107 85 85 107 69 69 86 64 64 81 97 97 122 79 79 99 79 79 99 255 226 127 255 247 138 255 255 151 255 255 156 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 214 107 0 124 62 0 234 117 0 198 99 0 247 123 0 244 122 0 229 114 0 165 82 0 244 122 0 239 119 0 73 36 0 66 33 0 163 81 0 89 44 0 107 53 0 155 77 0 96 48 0 114 57 0 232 116 0 242 121 0 244 122 0 234 117 0 226 113 0 186 93 0 165 82 0 242 121 0 247 123 0 247 123 0 249 124 0 247 123 0 237 118 0 244 122 0 252 126 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 87 109 109 87 108 108 99 123 123 89 111 111 74 93 93 60 75 75 56 70 70 56 70 70 84 106 106 69 86 86 15 19 19 4 5 5 4 5 5 8 10 10 8 10 10 2 2 2 94 117 117 94 117 117 115 143 143 116 145 145 115 144 144 113 141 141 110 138 138 110 138 138 110 138 138 110 137 137 111 139 139 114 143 143 114 142 142 111 139 139 105 132 132 111 139 139 113 141 141 113 113 141 113 113 141 113 113 141 112 112 141 111 111 139 112 112 140 112 112 140 112 112 140 111 111 139 111 111 139 111 111 139 111 111 139 111 111 139 109 109 137 106 106 133 102 102 128 43 43 54 43 43 54 11 11 13 6 6 8 18 18 23 18 18 23 18 18 23 28 28 35 8 8 11 9 9 12 40 40 50 40 40 50 47 47 58 48 48 60 95 95 119 102 102 128 62 62 77 62 62 77 11 11 14 6 6 8 7 7 9 9 9 12 9 9 12 20 20 25 33 33 41 65 65 82 72 72 90 72 72 90 70 70 88 77 77 96 87 87 109 79 79 98 66 66 82 66 66 82 53 53 66 50 50 62 75 75 94 61 61 76 61 61 76 13 13 17 4 4 5 7 7 9 7 7 9 7 7 9 2 2 2 84 84 105 102 102 128 103 103 129 103 103 129 103 103 129 101 101 126 99 99 123 99 99 123 98 98 123 98 98 123 99 99 124 102 102 128 +161 202 202 161 202 202 161 201 201 161 201 201 161 201 201 161 201 201 160 201 201 107 133 133 89 111 111 14 18 18 14 18 18 6 8 8 3 4 4 4 6 6 11 14 14 11 14 14 25 32 32 20 26 26 141 176 176 157 196 196 157 196 196 158 198 198 158 198 198 158 197 197 158 197 197 157 197 197 157 197 197 157 196 196 157 196 196 157 196 196 157 196 196 156 196 196 156 195 195 156 195 195 156 195 195 156 195 195 155 194 194 155 194 194 155 194 194 155 194 194 155 194 194 155 193 193 154 193 193 154 193 193 152 191 191 152 190 190 152 190 190 149 186 186 110 137 137 10 13 13 10 13 13 6 7 7 69 86 86 149 187 187 152 190 190 152 190 190 150 188 188 147 184 184 147 184 184 147 183 183 145 181 181 145 181 181 137 171 171 143 179 179 143 178 178 145 182 182 147 183 183 148 185 185 148 185 185 148 185 185 144 181 181 149 149 186 148 148 186 148 148 185 148 148 185 148 148 185 148 148 185 147 147 184 147 147 184 147 147 184 147 147 184 147 147 183 146 146 183 146 146 183 146 146 182 146 146 182 97 97 121 80 80 101 13 13 16 13 13 16 5 5 7 2 2 3 4 4 5 10 10 12 10 10 12 23 23 29 18 18 23 127 127 159 141 141 177 141 141 176 142 142 178 142 142 178 142 142 177 142 142 177 141 141 177 141 141 176 141 141 176 141 141 176 140 140 176 140 140 175 140 140 175 140 140 175 139 139 174 139 139 174 139 139 174 139 139 173 138 138 173 138 138 173 138 138 173 138 138 172 137 137 172 137 137 172 137 137 171 137 137 171 135 135 169 135 135 169 132 132 165 255 197 111 255 255 153 255 255 151 255 244 137 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 247 123 0 170 85 0 142 71 0 214 107 0 175 87 0 229 114 0 239 119 0 209 104 0 173 86 0 181 90 0 145 72 0 165 82 0 232 116 0 114 57 0 51 25 0 79 39 0 160 80 0 119 59 0 73 36 0 63 31 0 226 113 0 237 118 0 226 113 0 237 118 0 181 90 0 216 108 0 175 87 0 198 99 0 127 63 0 191 95 0 183 91 0 186 93 0 229 114 0 234 117 0 247 123 0 249 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 117 146 146 114 143 143 114 142 142 84 105 105 8 10 10 4 5 5 53 66 66 53 66 66 114 142 142 116 145 145 115 143 143 112 140 140 112 140 140 112 140 140 110 138 138 110 138 138 104 130 130 104 130 130 109 136 136 111 138 138 112 140 140 113 141 141 112 141 141 112 140 140 110 137 137 113 113 141 113 113 141 113 113 141 112 112 141 112 112 140 112 112 140 112 112 140 112 112 140 112 112 140 111 111 139 111 111 139 111 111 139 111 111 139 111 111 139 111 111 138 73 73 92 73 73 92 61 61 76 10 10 12 4 4 5 2 2 2 2 2 2 3 3 4 7 7 9 17 17 22 14 14 17 14 14 17 96 96 121 107 107 134 108 108 135 108 108 135 108 108 135 108 108 135 108 108 135 107 107 134 107 107 134 107 107 134 107 107 134 107 107 134 107 107 133 107 107 133 106 106 133 106 106 133 106 106 133 106 106 133 106 106 132 106 106 132 106 106 132 105 105 132 105 105 132 105 105 132 105 105 131 105 105 131 104 104 130 104 104 130 101 101 127 101 101 127 75 75 93 7 7 9 4 4 5 47 47 59 47 47 59 102 102 127 104 104 130 102 102 128 102 102 128 100 100 125 100 100 125 99 99 124 99 99 123 99 99 123 +162 202 202 162 202 202 158 198 198 158 198 198 124 155 155 119 148 148 22 28 28 22 28 28 29 36 36 4 6 6 17 22 22 14 18 18 14 18 18 12 16 16 14 18 18 96 121 121 96 121 121 145 181 181 156 195 195 159 199 199 157 196 196 157 196 196 155 194 194 150 188 188 156 196 196 156 195 195 156 195 195 156 195 195 156 195 195 157 196 196 157 196 196 157 196 196 157 196 196 156 196 196 156 195 195 156 195 195 156 195 195 156 195 195 154 193 193 154 192 192 146 182 182 139 174 174 119 149 149 119 148 148 84 105 105 107 134 134 98 122 122 14 17 17 14 17 17 54 68 68 144 180 180 152 190 190 153 191 191 153 191 191 149 187 187 145 181 181 146 183 183 146 182 182 133 167 167 139 174 174 147 184 184 147 183 183 146 183 183 148 185 185 144 181 181 147 184 184 147 184 184 147 184 184 148 185 185 146 146 183 146 146 183 146 146 183 149 149 186 147 147 184 148 148 186 148 148 185 148 148 185 148 148 185 146 146 183 146 146 183 146 146 182 147 147 184 147 147 184 144 144 180 143 143 179 112 112 140 107 107 134 20 20 25 26 26 33 26 26 33 4 4 5 16 16 20 13 13 16 13 13 16 11 11 14 13 13 16 87 87 109 130 130 163 130 130 163 140 140 175 143 143 179 141 141 176 141 141 176 139 139 174 135 135 168 140 140 175 140 140 175 140 140 175 139 139 174 139 139 174 140 140 176 140 140 175 140 140 175 140 140 175 139 139 174 139 139 174 139 139 174 139 139 174 138 138 173 137 137 171 130 130 162 129 129 162 124 124 155 105 105 132 75 75 93 74 74 93 95 95 119 87 87 108 255 255 148 255 255 156 255 235 132 255 255 161 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 224 112 0 109 54 0 153 76 0 214 107 0 137 68 0 145 72 0 237 118 0 239 119 0 186 93 0 145 72 0 188 94 0 198 99 0 196 98 0 216 108 0 244 122 0 96 48 0 43 21 0 168 84 0 112 56 0 56 28 0 124 62 0 237 118 0 209 104 0 186 93 0 242 121 0 201 100 0 170 85 0 242 121 0 244 122 0 234 117 0 175 87 0 181 90 0 94 47 0 89 44 0 206 103 0 232 116 0 239 119 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 146 146 114 142 142 114 142 142 110 137 137 111 139 139 101 127 127 101 127 127 106 132 132 111 139 139 111 139 139 112 140 140 112 140 140 109 137 137 112 140 140 111 139 139 111 139 139 112 140 140 111 111 139 111 111 138 113 113 141 113 113 141 111 111 139 112 112 140 112 112 140 112 112 140 112 112 140 110 110 138 110 110 138 111 111 139 111 111 139 111 111 139 108 108 136 85 85 106 85 85 106 81 81 102 15 15 19 20 20 25 3 3 4 3 3 4 12 12 15 9 9 12 8 8 11 9 9 12 9 9 12 66 66 82 99 99 123 106 106 133 106 106 133 108 108 135 107 107 134 106 106 132 102 102 128 102 102 128 106 106 133 106 106 133 106 106 133 106 106 132 106 106 132 107 107 133 106 106 133 106 106 133 106 106 133 106 106 133 106 106 132 106 106 132 106 106 132 105 105 132 104 104 130 99 99 124 94 94 118 94 94 118 80 80 101 57 57 71 73 73 91 73 73 91 66 66 83 9 9 11 36 36 46 98 98 122 97 97 122 103 103 128 104 104 130 101 101 127 101 101 127 98 98 123 99 99 124 +162 203 203 159 198 198 113 141 141 9 12 12 9 12 12 6 8 8 9 12 12 19 24 24 19 24 24 30 38 38 27 34 34 68 85 85 51 64 64 51 64 64 97 121 121 111 139 139 132 165 165 132 165 165 137 171 171 135 169 169 112 140 140 112 140 140 125 156 156 147 184 184 110 138 138 110 138 138 49 62 62 67 83 83 47 59 59 47 59 59 73 91 91 143 179 179 151 188 188 149 186 186 149 186 186 52 65 65 11 13 13 75 94 94 75 94 94 94 118 118 80 100 100 74 92 92 73 92 92 62 78 78 81 101 101 43 54 54 43 54 54 150 187 187 149 187 187 149 187 187 144 181 181 144 180 180 136 170 170 144 180 180 142 178 178 142 178 178 146 183 183 145 181 181 141 177 177 141 177 177 143 178 178 147 184 184 145 182 182 145 181 181 148 185 185 145 181 181 148 185 185 150 150 188 150 150 188 150 150 188 150 150 187 147 147 183 146 146 183 146 146 183 147 147 184 147 147 184 147 147 184 148 148 185 148 148 185 148 148 185 148 148 185 147 147 184 147 147 184 144 144 180 144 144 180 102 102 128 8 8 11 5 5 7 8 8 11 8 8 11 17 17 22 27 27 34 24 24 31 24 24 31 61 61 76 46 46 58 87 87 109 87 87 109 100 100 125 119 119 149 123 123 154 123 123 153 121 121 151 101 101 126 112 112 140 132 132 165 132 132 165 99 99 123 44 44 55 60 60 75 59 59 74 42 42 53 65 65 81 127 127 159 127 127 159 134 134 168 132 132 166 46 46 58 46 46 58 9 9 12 67 67 84 84 84 105 71 71 89 71 71 89 65 65 81 55 55 69 72 72 90 72 72 90 255 255 151 255 255 148 209 145 81 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 252 126 0 249 124 0 242 121 0 163 81 0 163 81 0 183 91 0 168 84 0 221 110 0 219 109 0 145 72 0 214 107 0 178 89 0 224 112 0 147 73 0 237 118 0 239 119 0 216 108 0 201 100 0 244 122 0 242 121 0 183 91 0 86 43 0 165 82 0 132 66 0 211 105 0 242 121 0 249 124 0 153 76 0 247 123 0 237 118 0 247 123 0 239 119 0 247 123 0 234 117 0 216 108 0 76 38 0 117 58 0 237 118 0 216 108 0 224 112 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 107 134 134 108 135 135 111 139 139 110 137 137 110 137 137 112 140 140 109 137 137 111 139 139 111 139 139 113 113 142 113 113 141 113 113 141 110 110 138 110 110 138 110 110 138 111 111 139 111 111 139 111 111 139 112 112 140 112 112 140 111 111 139 111 111 139 111 111 139 111 111 139 108 108 136 108 108 135 77 77 96 6 6 8 4 4 5 6 6 8 6 6 8 13 13 16 21 21 26 18 18 23 18 18 23 46 46 58 35 35 44 66 66 82 66 66 82 75 75 94 90 90 112 93 93 116 93 93 116 91 91 114 76 76 95 85 85 106 100 100 125 100 100 125 74 74 93 33 33 42 45 45 56 45 45 56 32 32 40 49 49 62 96 96 121 96 96 121 102 102 127 100 100 126 35 35 44 35 35 44 7 7 9 51 51 64 64 64 80 63 63 79 54 54 67 49 49 62 42 42 53 55 55 68 55 55 68 29 29 37 101 101 126 101 101 126 101 101 126 101 101 126 97 97 122 92 92 115 +14 18 18 14 18 18 19 24 24 4 6 6 1 2 2 1 2 2 60 75 75 39 49 49 17 22 22 17 22 22 61 77 77 143 179 179 146 183 183 146 182 182 146 182 182 111 139 139 59 74 74 59 74 74 61 76 76 37 46 46 11 14 14 11 14 14 99 124 124 148 185 185 102 128 128 102 128 128 142 178 178 89 112 112 113 142 142 113 141 141 153 191 191 119 149 149 47 59 59 47 59 59 41 51 51 14 17 17 9 11 11 9 11 11 109 136 136 112 140 140 67 84 84 67 84 84 86 108 108 96 120 120 151 188 188 150 188 188 150 188 188 153 192 192 147 183 183 146 183 183 140 175 175 135 169 169 123 153 153 122 153 153 141 176 176 141 176 176 134 168 168 134 168 168 145 181 181 148 185 185 148 185 185 147 184 184 144 180 180 141 176 176 148 186 186 148 185 185 151 151 189 151 151 189 151 151 188 147 147 184 144 144 180 148 148 186 148 148 185 150 150 187 148 148 185 148 148 185 147 147 184 149 149 186 149 149 186 148 148 186 148 148 185 146 146 183 142 142 177 85 85 106 85 85 106 13 13 16 17 17 22 4 4 5 4 4 5 1 1 1 54 54 68 35 35 44 35 35 44 16 16 20 55 55 69 129 129 161 128 128 161 131 131 164 131 131 164 100 100 125 100 100 125 53 53 67 55 55 68 33 33 41 33 33 41 10 10 12 89 89 111 132 132 165 132 132 165 91 91 114 127 127 159 80 80 100 79 79 99 101 101 126 136 136 170 106 106 133 106 106 132 42 42 53 36 36 45 12 12 15 12 12 15 8 8 10 96 96 121 99 99 124 99 99 124 60 60 75 76 76 95 84 84 106 255 255 151 255 255 150 255 180 101 255 255 161 252 126 0 252 126 0 252 126 0 252 126 0 247 123 0 214 107 0 132 66 0 124 62 0 153 76 0 229 114 0 244 122 0 226 113 0 211 105 0 234 117 0 175 87 0 188 94 0 188 94 0 102 51 0 216 108 0 239 119 0 237 118 0 249 124 0 247 123 0 249 124 0 224 112 0 229 114 0 153 76 0 178 89 0 244 122 0 249 124 0 242 121 0 244 122 0 214 107 0 168 84 0 237 118 0 249 124 0 214 107 0 239 119 0 247 123 0 170 85 0 188 94 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 109 137 137 111 139 139 111 139 139 111 139 139 108 136 136 106 133 133 106 132 132 111 139 139 114 114 142 113 113 142 113 113 142 111 111 139 108 108 135 108 108 135 111 111 139 112 112 141 111 111 139 111 111 139 111 111 138 112 112 140 111 111 139 111 111 139 111 111 139 110 110 137 106 106 133 106 106 133 63 63 79 10 10 12 13 13 16 13 13 16 3 3 4 1 1 1 41 41 51 41 41 51 26 26 33 12 12 15 41 41 52 41 41 52 96 96 121 99 99 123 98 98 123 98 98 123 75 75 94 40 40 50 41 41 51 41 41 51 25 25 31 7 7 9 67 67 84 67 67 84 99 99 124 69 69 86 96 96 120 96 96 120 60 60 75 76 76 95 103 103 129 103 103 129 80 80 100 32 32 40 27 27 34 27 27 34 9 9 12 6 6 8 73 73 91 73 73 91 75 75 94 45 45 57 58 58 72 58 58 72 64 64 80 101 101 126 101 101 126 101 101 126 +0 0 0 4 6 6 4 6 6 9 12 12 13 16 16 13 16 16 59 73 73 68 85 85 107 134 134 107 134 134 142 177 177 161 201 201 159 199 199 159 199 199 159 199 199 144 180 180 113 142 142 113 141 141 115 143 143 114 143 143 114 143 143 147 183 183 156 195 195 154 193 193 154 193 193 140 175 175 110 138 138 149 186 186 149 186 186 157 196 196 150 188 188 129 161 161 129 161 161 105 131 131 68 85 85 68 85 85 106 133 133 138 172 172 150 188 188 150 188 188 99 124 124 143 179 179 151 189 189 151 189 189 149 187 187 151 189 189 152 190 190 152 190 190 147 184 184 139 174 174 139 174 174 147 183 183 145 181 181 149 187 187 149 186 186 146 182 182 136 170 170 139 174 174 139 174 174 139 174 174 139 173 173 145 181 181 145 181 181 147 184 184 152 152 190 152 152 190 151 151 189 150 150 187 145 145 181 145 145 181 148 148 185 150 150 188 150 150 188 150 150 188 150 150 187 150 150 187 149 149 187 149 149 187 146 146 183 144 144 180 144 144 180 145 145 182 84 84 105 5 5 7 5 5 7 4 4 5 0 0 0 4 4 5 4 4 5 8 8 11 11 11 14 53 53 66 53 53 66 62 62 77 97 97 121 97 97 121 127 127 159 145 145 181 143 143 179 143 143 179 143 143 178 129 129 162 101 101 127 101 101 127 103 103 128 102 102 128 131 131 164 131 131 164 139 139 174 138 138 172 125 125 156 124 124 156 98 98 123 133 133 166 132 132 166 139 139 174 133 133 167 115 115 143 114 114 143 93 93 116 60 60 75 94 94 118 94 94 118 122 122 152 133 133 166 88 88 110 88 88 110 127 127 158 133 133 167 255 255 143 138 96 53 255 255 161 252 126 0 252 126 0 242 121 0 249 124 0 206 103 0 155 77 0 191 95 0 221 110 0 237 118 0 216 108 0 237 118 0 219 109 0 219 109 0 163 81 0 122 61 0 145 72 0 181 90 0 204 102 0 206 103 0 244 122 0 229 114 0 214 107 0 209 104 0 224 112 0 244 122 0 168 84 0 119 59 0 132 66 0 96 48 0 244 122 0 239 119 0 224 112 0 198 99 0 196 98 0 247 123 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 102 128 128 104 131 131 104 130 130 104 130 130 104 130 130 108 136 136 111 138 138 110 138 138 114 114 142 113 113 142 113 113 142 112 112 140 108 108 136 111 111 138 110 110 138 112 112 141 112 112 140 112 112 140 112 112 140 112 112 140 112 112 140 109 109 137 109 109 136 108 108 135 109 109 136 109 109 136 62 62 78 4 4 5 3 3 4 3 3 4 0 0 0 3 3 4 6 6 8 6 6 8 8 8 11 39 39 49 46 46 58 46 46 58 72 72 91 95 95 119 95 95 119 108 108 136 107 107 134 107 107 134 107 107 134 97 97 121 76 76 95 77 77 96 77 77 96 77 77 96 98 98 123 105 105 131 105 105 131 103 103 129 94 94 117 93 93 117 74 74 92 100 100 125 105 105 131 105 105 131 100 100 126 86 86 108 70 70 88 70 70 88 45 45 57 71 71 89 92 92 115 92 92 115 100 100 126 66 66 83 66 66 83 96 96 120 +6 8 8 6 8 8 6 8 8 11 14 14 9 12 12 9 12 12 21 26 26 114 143 143 144 180 180 144 180 180 160 200 200 156 196 196 155 193 193 155 193 193 153 191 191 153 191 191 152 191 191 159 199 199 160 201 201 160 200 200 160 200 200 158 198 198 153 192 192 153 191 191 124 155 155 124 155 155 146 183 183 146 183 183 133 166 166 151 188 188 150 188 188 155 194 194 156 196 196 147 184 184 147 183 183 138 173 173 121 151 151 90 113 113 90 113 113 146 182 182 155 194 194 155 194 194 150 188 188 145 181 181 140 175 175 140 175 175 137 171 171 137 171 171 136 171 171 146 182 182 149 186 186 150 188 188 150 187 187 145 181 181 140 175 175 140 175 175 143 179 179 138 173 173 136 171 171 136 170 170 139 174 174 144 180 180 153 153 191 152 152 191 151 151 188 151 151 188 150 150 188 152 152 190 151 151 189 151 151 189 151 151 189 149 149 187 149 149 187 149 149 186 150 150 188 150 150 188 148 148 185 148 148 185 149 149 187 149 149 187 149 149 186 149 149 186 144 144 180 99 99 124 99 99 123 17 17 22 26 26 33 5 5 7 5 5 7 5 5 7 10 10 13 10 10 13 8 8 11 19 19 24 103 103 129 103 103 129 129 129 162 144 144 180 144 144 180 140 140 176 139 139 174 137 137 171 137 137 171 137 137 171 142 142 178 142 142 178 143 143 179 143 143 179 141 141 177 141 141 176 137 137 171 110 110 138 110 110 138 110 110 138 130 130 163 118 118 148 118 118 148 134 134 167 138 138 172 139 139 174 139 139 173 130 130 162 123 123 153 122 122 153 107 107 133 80 80 100 129 129 161 128 128 161 137 137 171 255 232 130 167 116 65 255 255 161 252 126 0 249 124 0 232 116 0 158 79 0 145 72 0 229 114 0 226 113 0 244 122 0 242 121 0 247 123 0 216 108 0 168 84 0 183 91 0 226 113 0 114 57 0 150 75 0 99 49 0 193 96 0 224 112 0 209 104 0 237 118 0 234 117 0 183 91 0 175 87 0 211 105 0 181 90 0 247 123 0 229 114 0 201 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 105 131 131 105 131 131 107 134 134 103 129 129 102 127 127 102 127 127 104 130 130 107 134 134 107 134 134 114 114 142 112 112 141 112 112 140 112 112 140 113 113 141 113 113 141 113 113 141 113 113 141 111 111 139 111 111 139 111 111 139 112 112 140 112 112 140 110 110 138 110 110 138 111 111 139 111 111 139 111 111 139 111 111 139 107 107 134 73 73 92 73 73 92 13 13 16 20 20 25 20 20 25 4 4 5 4 4 5 7 7 9 7 7 9 6 6 8 14 14 17 77 77 96 77 77 96 96 96 121 107 107 134 107 107 134 105 105 131 103 103 129 102 102 128 102 102 128 102 102 128 106 106 133 106 106 133 107 107 134 107 107 134 106 106 132 106 106 132 102 102 128 83 83 103 83 83 103 82 82 103 97 97 122 89 89 111 89 89 111 100 100 125 103 103 129 104 104 130 104 104 130 98 98 122 92 92 115 92 92 115 80 80 100 +23 28 28 39 49 49 39 49 49 39 49 49 49 61 61 49 61 61 121 152 152 159 199 199 160 201 201 160 201 201 162 202 202 162 202 202 162 202 202 161 202 202 161 202 202 161 202 202 161 201 201 161 201 201 159 199 199 159 199 199 141 176 176 137 172 172 137 172 172 81 101 101 148 186 186 142 177 177 142 177 177 69 86 86 109 137 137 109 136 136 151 189 189 139 174 174 139 174 174 131 164 164 76 96 96 136 170 170 135 169 169 156 195 195 157 197 197 157 197 197 152 191 191 146 182 182 142 178 178 142 178 178 147 184 184 155 193 193 154 193 193 151 189 189 145 181 181 144 181 181 141 177 177 149 186 186 146 182 182 145 182 182 133 166 166 147 183 183 146 183 183 138 173 173 132 165 165 138 173 173 138 172 172 153 153 192 151 151 189 151 151 189 151 151 189 151 151 189 152 152 190 152 152 190 150 150 188 149 149 186 148 148 186 151 151 189 151 151 189 151 151 189 151 151 188 150 150 188 150 150 188 150 150 188 150 150 187 150 150 187 149 149 187 149 149 187 149 149 186 141 141 177 141 141 176 99 99 124 25 25 31 25 25 31 28 28 35 20 20 26 20 20 26 35 35 44 35 35 44 44 44 55 44 44 55 109 109 137 143 143 179 143 143 179 144 144 180 145 145 182 145 145 181 145 145 181 145 145 181 144 144 181 144 144 180 144 144 180 144 144 180 143 143 179 142 142 177 126 126 157 123 123 153 122 122 153 72 72 90 132 132 165 132 132 165 126 126 157 61 61 77 97 97 121 97 97 121 134 134 167 123 123 154 123 123 154 116 116 145 67 67 84 67 67 84 120 120 150 138 138 172 139 139 174 139 139 173 255 255 155 255 235 132 255 255 158 252 126 0 114 57 0 89 44 0 84 42 0 242 121 0 244 122 0 232 116 0 234 117 0 239 119 0 239 119 0 214 107 0 193 96 0 168 84 0 219 109 0 224 112 0 142 71 0 107 53 0 81 40 0 158 79 0 196 98 0 244 122 0 122 61 0 237 118 0 237 118 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 111 139 139 108 136 136 99 124 124 99 124 124 109 137 137 103 129 129 98 123 123 98 123 123 103 128 128 114 114 143 114 114 142 113 113 141 112 112 141 112 112 140 112 112 140 113 113 141 112 112 140 112 112 140 110 110 138 112 112 141 112 112 140 112 112 140 112 112 140 112 112 140 112 112 140 111 111 139 111 111 139 111 111 139 111 111 139 111 111 139 111 111 138 110 110 138 105 105 131 73 73 92 73 73 92 18 18 23 21 21 26 15 15 19 15 15 19 26 26 33 26 26 33 26 26 33 33 33 41 81 81 101 81 81 101 106 106 133 107 107 134 108 108 135 108 108 135 108 108 135 108 108 135 107 107 134 107 107 134 107 107 134 107 107 134 107 107 134 106 106 132 94 94 117 94 94 117 91 91 114 53 53 67 53 53 67 98 98 123 94 94 118 46 46 57 46 46 57 72 72 90 100 100 125 100 100 125 92 92 116 +44 55 55 72 91 91 72 91 91 102 128 128 79 99 99 79 99 99 143 179 179 151 189 189 151 189 189 159 199 199 162 203 203 162 203 203 162 202 202 162 202 202 157 196 196 157 196 196 114 143 143 37 46 46 37 46 46 63 79 79 27 34 34 27 34 34 13 16 16 30 38 38 30 38 38 71 89 89 121 151 151 137 171 171 137 171 171 133 167 167 90 112 112 90 112 112 115 144 144 154 192 192 154 192 192 158 198 198 158 198 198 158 198 198 158 197 197 156 195 195 153 191 191 152 191 191 156 195 195 151 188 188 150 188 188 133 166 166 145 182 182 145 182 182 150 187 187 146 183 183 146 183 183 144 181 181 146 182 182 144 180 180 144 180 180 147 184 184 148 186 186 148 185 185 145 181 181 154 154 193 154 154 192 154 154 192 152 152 190 152 152 190 152 152 190 153 153 191 153 153 191 152 152 191 152 152 190 149 149 186 149 149 186 152 152 190 151 151 189 151 151 189 151 151 189 151 151 189 151 151 188 150 150 188 150 150 188 150 150 188 150 150 187 150 150 187 149 149 187 149 149 187 147 147 184 131 131 163 131 131 163 42 42 52 21 21 26 14 14 18 14 14 18 40 40 50 65 65 82 65 65 81 92 92 115 71 71 89 71 71 89 128 128 161 136 136 170 135 135 169 143 143 178 145 145 182 145 145 181 145 145 181 145 145 181 140 140 175 140 140 175 102 102 127 33 33 41 33 33 41 56 56 70 24 24 30 24 24 30 11 11 14 27 27 34 63 63 79 63 63 79 107 107 134 121 121 152 121 121 152 118 118 148 79 79 99 79 79 99 102 102 127 136 136 170 140 140 175 140 140 175 139 139 174 139 139 174 139 139 174 255 255 150 255 255 145 132 66 0 137 68 0 102 51 0 122 61 0 239 119 0 244 122 0 234 117 0 244 122 0 247 123 0 232 116 0 232 116 0 209 104 0 173 86 0 239 119 0 237 118 0 247 123 0 84 42 0 188 94 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 108 135 135 107 134 134 108 136 136 107 134 134 107 134 134 109 136 136 110 138 138 108 135 135 107 134 134 114 114 143 114 114 143 114 114 142 112 112 141 112 112 141 112 112 140 113 113 142 113 113 141 113 113 141 113 113 141 110 110 138 112 112 140 112 112 140 112 112 140 112 112 140 112 112 140 111 111 139 111 111 139 111 111 139 111 111 139 111 111 139 111 111 138 111 111 138 110 110 138 109 109 136 109 109 136 97 97 121 31 31 38 31 31 38 15 15 19 11 11 13 11 11 13 29 29 37 48 48 60 68 68 85 68 68 85 52 52 66 95 95 119 95 95 119 100 100 126 106 106 132 106 106 132 108 108 135 107 107 134 107 107 134 107 107 134 104 104 130 75 75 94 75 75 94 24 24 31 42 42 52 42 42 52 18 18 22 8 8 10 8 8 10 20 20 25 47 47 59 47 47 58 80 80 100 +81 101 101 81 101 101 87 109 109 97 122 122 97 122 122 124 155 155 153 192 192 153 191 191 161 202 202 163 203 203 163 203 203 162 203 203 162 203 203 154 192 192 154 192 192 155 194 194 157 196 196 157 196 196 153 192 192 143 179 179 143 179 179 151 189 189 154 193 193 154 193 193 151 188 188 121 152 152 121 152 152 116 145 145 124 155 155 124 155 155 156 195 195 159 199 199 159 199 199 159 199 199 159 199 199 157 196 196 157 196 196 155 194 194 155 194 194 155 194 194 158 197 197 158 197 197 157 197 197 151 189 189 152 191 191 152 190 190 152 190 190 150 188 188 150 188 188 144 180 180 150 187 187 150 187 187 143 179 179 146 183 183 146 183 183 150 188 188 150 188 188 155 155 194 155 155 193 154 154 193 154 154 193 154 154 193 151 151 189 152 152 190 152 152 190 152 152 190 148 148 186 148 148 185 151 151 189 151 151 189 151 151 189 147 147 184 150 150 188 150 150 188 148 148 186 150 150 187 150 150 187 151 151 189 151 151 188 150 150 188 150 150 188 149 149 186 138 138 172 138 138 172 22 22 28 25 25 32 25 25 32 4 4 5 33 33 41 33 33 41 75 75 93 59 59 74 59 59 74 73 73 91 79 79 98 79 79 98 87 87 109 111 111 139 111 111 139 137 137 172 144 144 181 144 144 180 146 146 182 145 145 182 145 145 181 145 145 181 137 137 172 139 139 173 138 138 173 140 140 175 136 136 171 136 136 170 127 127 159 134 134 168 134 134 168 137 137 171 134 134 167 133 133 167 107 107 134 103 103 129 103 103 129 110 110 137 138 138 173 138 138 172 140 140 176 140 140 175 140 140 175 140 140 175 138 138 173 136 136 171 255 255 145 127 63 0 168 84 0 201 100 0 244 122 0 163 81 0 160 80 0 204 102 0 204 102 0 229 114 0 237 118 0 229 114 0 237 118 0 216 108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 111 139 139 106 133 133 111 139 139 111 139 139 106 133 133 108 135 135 108 135 135 111 139 139 111 139 139 111 139 139 114 114 143 114 114 143 114 114 143 114 114 142 111 111 139 112 112 140 112 112 140 112 112 140 109 109 137 109 109 137 111 111 139 111 111 139 111 111 139 109 109 136 111 111 139 111 111 138 109 109 137 110 110 138 110 110 138 111 111 139 111 111 139 111 111 139 111 111 138 109 109 137 101 101 127 101 101 127 16 16 20 18 18 23 18 18 23 3 3 4 24 24 30 24 24 30 55 55 69 44 44 55 44 44 55 54 54 67 58 58 72 58 58 72 64 64 81 82 82 102 82 82 102 101 101 127 107 107 133 107 107 133 107 107 134 107 107 134 107 107 134 107 107 134 102 102 127 102 102 128 102 102 128 103 103 129 101 101 126 101 101 126 94 94 118 100 100 125 99 99 124 +91 114 114 106 132 132 139 174 174 139 174 174 140 176 176 155 194 194 155 194 194 158 198 198 161 202 202 161 202 202 161 202 202 92 115 115 75 94 94 75 94 94 37 47 47 54 67 67 54 67 67 70 88 88 49 61 61 49 61 61 65 81 81 129 161 161 128 161 161 136 171 171 60 75 75 60 75 75 16 20 20 138 172 172 137 172 172 160 200 200 160 200 200 160 200 200 160 200 200 156 195 195 156 195 195 157 197 197 156 195 195 155 194 194 155 194 194 152 190 190 152 190 190 152 190 190 151 189 189 151 189 189 150 187 187 153 191 191 152 191 191 146 182 182 154 192 192 153 192 192 149 186 186 139 174 174 139 173 173 151 189 189 146 183 183 146 183 183 155 155 194 155 155 194 155 155 194 155 155 194 155 155 193 154 154 193 154 154 193 154 154 193 154 154 192 154 154 192 150 150 188 150 150 188 153 153 191 153 153 191 153 153 191 149 149 187 151 151 189 151 151 188 152 152 190 152 152 190 152 152 190 151 151 189 151 151 189 151 151 189 142 142 177 30 30 38 30 30 38 42 42 53 69 69 87 69 69 87 6 6 7 7 7 9 7 7 9 63 63 79 123 123 154 123 123 154 85 85 106 82 82 103 82 82 102 95 95 119 125 125 156 125 125 156 126 126 158 139 139 174 139 139 174 142 142 177 145 145 181 144 144 180 144 144 180 82 82 103 82 82 102 67 67 84 33 33 42 33 33 42 48 48 60 62 62 78 62 62 78 43 43 54 58 58 72 57 57 72 114 114 142 121 121 151 121 121 151 53 53 66 14 14 17 14 14 17 121 121 152 141 141 177 141 141 176 141 141 176 140 140 176 140 140 175 137 137 172 138 138 173 138 138 173 242 121 0 244 122 0 234 117 0 211 105 0 232 116 0 242 121 0 234 117 0 131 131 163 130 130 163 133 133 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 113 141 141 108 135 135 108 135 135 113 142 142 110 137 137 110 137 137 102 128 128 112 140 140 111 139 139 108 135 135 115 115 143 114 114 143 114 114 143 114 114 143 114 114 142 114 114 142 114 114 142 113 113 142 113 113 142 113 113 141 113 113 141 110 110 138 113 113 141 112 112 141 112 112 140 110 110 137 110 110 137 111 111 138 112 112 140 111 111 139 111 111 139 111 111 139 111 111 139 111 111 139 104 104 130 104 104 130 22 22 27 31 31 39 31 31 39 51 51 64 4 4 5 4 4 5 5 5 6 46 46 58 46 46 58 90 90 113 62 62 78 62 62 78 60 60 75 70 70 88 70 70 87 92 92 115 93 93 116 93 93 116 102 102 128 104 104 131 104 104 130 106 106 133 106 106 133 60 60 76 60 60 75 49 49 62 24 24 31 24 24 31 35 35 44 46 46 57 +104 131 131 116 145 145 133 166 166 133 166 166 161 201 201 162 203 203 162 203 203 162 203 203 162 202 202 148 186 186 87 109 109 87 109 109 66 82 82 93 117 117 93 117 117 67 84 84 72 90 90 72 90 90 114 143 143 154 192 192 154 192 192 135 169 169 31 38 38 31 38 38 9 12 12 79 99 99 79 99 99 156 195 195 160 201 201 160 201 201 160 200 200 157 196 196 157 196 196 158 198 198 156 195 195 156 195 195 156 195 195 151 189 189 151 189 189 155 194 194 157 196 196 157 196 196 153 192 192 153 192 192 148 185 185 151 189 189 151 189 189 149 187 187 149 187 187 149 186 186 152 190 190 150 188 188 150 188 188 155 194 194 156 156 195 156 156 195 156 156 195 156 156 195 155 155 194 155 155 194 155 155 194 155 155 194 155 155 193 154 154 193 154 154 193 151 151 189 152 152 191 152 152 190 152 152 190 152 152 190 152 152 190 153 153 191 153 153 191 153 153 191 152 152 191 152 152 190 152 152 190 150 150 188 150 150 188 127 127 159 9 9 11 9 9 11 19 19 24 114 114 142 114 114 142 31 31 39 6 6 7 6 6 7 9 9 11 36 36 45 36 36 45 102 102 128 100 100 126 100 100 125 91 91 114 94 94 118 94 94 117 104 104 130 119 119 149 119 119 149 144 144 180 145 145 182 145 145 181 145 145 181 133 133 166 132 132 166 78 78 97 58 58 73 58 58 73 83 83 104 60 60 75 60 60 75 64 64 80 102 102 127 101 101 127 136 136 170 136 136 170 120 120 150 27 27 34 27 27 34 8 8 10 70 70 88 70 70 88 137 137 172 141 141 177 141 141 177 141 141 176 138 138 172 138 138 172 139 139 174 137 137 172 247 123 0 137 137 171 132 132 165 132 132 165 136 136 170 137 137 172 137 137 171 134 134 168 129 129 162 129 129 162 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 109 137 137 112 140 140 110 138 138 110 138 138 110 137 137 112 140 140 112 140 140 111 138 138 114 142 142 114 142 142 115 115 143 114 114 143 114 114 143 114 114 143 114 114 143 114 114 142 114 114 142 113 113 142 113 113 142 113 113 142 111 111 138 111 111 138 111 111 139 111 111 139 111 111 139 111 111 139 111 111 139 112 112 140 112 112 140 112 112 140 111 111 139 111 111 139 111 111 139 110 110 137 93 93 116 93 93 116 6 6 8 14 14 18 14 14 18 83 83 104 23 23 29 23 23 29 4 4 5 6 6 8 6 6 8 26 26 33 75 75 93 75 75 93 73 73 92 67 67 83 67 67 83 69 69 86 76 76 96 76 76 95 87 87 109 106 106 132 105 105 132 106 106 133 106 106 133 106 106 133 97 97 122 97 97 122 57 57 71 43 43 54 +106 133 133 90 112 112 90 112 112 136 170 170 136 170 170 157 197 197 159 199 199 159 199 199 159 199 199 160 200 200 160 200 200 153 192 192 158 198 198 158 198 198 156 195 195 156 195 195 156 195 195 138 172 172 34 43 43 34 43 43 41 51 51 41 51 51 95 118 118 44 55 55 44 55 55 114 142 142 159 199 199 159 199 199 161 201 201 161 201 201 161 201 201 160 201 201 160 200 200 160 200 200 160 200 200 160 200 200 160 200 200 158 197 197 158 197 197 154 193 193 151 189 189 151 188 188 139 174 174 154 192 192 153 192 192 150 188 188 151 189 189 151 189 189 153 191 191 153 191 191 152 191 191 151 188 188 157 157 196 157 157 196 156 156 196 156 156 196 156 156 195 156 156 195 156 156 195 156 156 195 155 155 194 155 155 194 155 155 194 155 155 194 155 155 193 154 154 193 154 154 193 154 154 193 154 154 192 154 154 192 154 154 192 153 153 192 153 153 192 153 153 191 153 153 191 153 153 191 146 146 183 32 32 40 32 32 40 19 19 24 102 102 128 102 102 128 110 110 137 139 139 173 138 138 173 32 32 40 31 31 39 13 13 17 3 3 3 3 3 3 6 6 7 34 34 43 34 34 43 79 79 99 103 103 129 103 103 129 100 100 125 95 95 119 95 95 119 80 80 100 122 122 153 122 122 152 141 141 176 141 141 176 142 142 178 142 142 177 142 142 177 143 143 179 137 137 171 136 136 171 141 141 176 139 139 174 139 139 174 139 139 173 122 122 153 122 122 153 30 30 38 36 36 45 36 36 45 84 84 105 83 83 104 39 39 48 101 101 126 100 100 126 140 140 176 142 142 177 141 141 177 141 141 177 141 141 176 141 141 176 140 140 176 140 140 175 140 140 175 140 140 175 140 140 175 138 138 172 135 135 169 135 135 168 132 132 165 122 122 152 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 103 128 128 113 141 141 113 141 141 110 138 138 111 139 139 111 139 139 112 140 140 112 140 140 112 140 140 110 138 138 110 138 138 115 115 144 115 115 143 114 114 143 114 114 143 114 114 143 114 114 142 114 114 142 114 114 142 113 113 142 113 113 142 113 113 141 113 113 141 113 113 141 113 113 141 112 112 141 112 112 140 112 112 140 112 112 140 112 112 140 112 112 140 111 111 139 111 111 139 111 111 139 106 106 133 23 23 29 23 23 29 14 14 18 75 75 93 74 74 93 80 80 100 101 101 126 101 101 126 23 23 29 23 23 29 9 9 12 2 2 2 2 2 2 4 4 5 25 25 31 25 25 31 58 58 72 75 75 94 75 75 94 73 73 91 70 70 87 70 70 87 59 59 73 89 89 111 89 89 111 103 103 129 103 103 129 104 104 130 +113 142 142 113 142 142 90 112 112 90 112 112 133 166 166 154 193 193 154 193 193 159 199 199 159 199 199 159 199 199 159 199 199 155 194 194 155 194 194 114 142 142 114 142 142 16 20 20 47 59 59 47 59 59 125 156 156 120 150 150 120 150 150 88 110 110 60 75 75 60 75 75 145 182 182 145 182 182 161 202 202 161 202 202 161 202 202 161 201 201 158 197 197 157 197 197 156 195 195 156 195 195 155 194 194 155 194 194 155 194 194 155 194 194 153 192 192 153 191 191 154 193 193 154 193 193 154 193 193 152 191 191 152 190 190 144 180 180 153 192 192 153 192 192 155 194 194 155 193 193 154 193 193 157 157 197 156 156 195 155 155 194 157 157 196 157 157 196 157 157 196 156 156 196 156 156 195 156 156 195 156 156 195 156 156 195 154 154 192 155 155 194 155 155 194 155 155 194 155 155 193 154 154 193 154 154 193 154 154 193 154 154 193 154 154 192 154 154 192 149 149 186 85 85 106 85 85 106 23 23 29 23 23 28 52 52 65 144 144 181 144 144 180 149 149 186 152 152 190 151 151 189 150 150 187 65 65 82 65 65 82 6 6 7 6 6 7 13 13 17 15 15 18 15 15 18 13 13 17 7 7 9 7 7 9 12 12 15 63 63 79 63 63 78 105 105 131 104 104 131 101 101 127 80 80 100 80 80 100 119 119 149 138 138 173 138 138 172 142 142 178 142 142 177 142 142 177 141 141 177 141 141 177 138 138 173 101 101 126 101 101 126 14 14 18 42 42 53 42 42 52 110 110 138 110 110 138 106 106 132 78 78 98 78 78 97 53 53 66 128 128 160 128 128 160 142 142 178 142 142 177 142 142 177 141 141 177 141 141 177 138 138 173 136 136 171 136 136 170 136 136 170 136 136 170 136 136 170 135 135 169 134 134 167 133 133 167 135 135 168 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 113 142 142 113 141 141 112 140 140 112 140 140 105 132 132 112 141 141 112 140 140 113 142 142 113 141 141 113 141 141 115 115 144 115 115 144 114 114 142 114 114 143 114 114 143 114 114 143 114 114 143 114 114 142 114 114 142 113 113 142 113 113 142 112 112 140 112 112 140 113 113 141 113 113 141 113 113 141 112 112 141 112 112 140 112 112 140 112 112 140 112 112 140 112 112 140 108 108 135 108 108 135 62 62 77 16 16 21 16 16 21 38 38 47 38 38 47 105 105 131 108 108 135 108 108 135 110 110 138 109 109 136 109 109 136 47 47 59 4 4 5 4 4 5 9 9 12 9 9 12 11 11 13 9 9 12 9 9 12 5 5 6 8 8 10 8 8 10 46 46 57 76 76 95 76 76 95 74 74 92 74 74 92 +72 90 90 90 113 113 90 112 112 112 140 140 123 154 154 123 154 154 123 154 154 123 154 154 119 149 149 51 64 64 51 64 64 9 12 12 4 6 6 4 6 6 56 70 70 56 70 70 148 186 186 80 101 101 80 101 101 112 140 140 133 166 166 133 166 166 115 143 143 115 143 143 162 203 203 162 203 203 162 202 202 162 202 202 160 200 200 160 200 200 160 200 200 159 199 199 154 193 193 154 193 193 154 193 193 157 197 197 155 194 194 155 194 194 155 194 194 155 194 194 155 194 194 150 187 187 150 187 187 151 189 189 153 191 191 152 191 191 157 196 196 157 196 196 155 194 194 158 158 198 158 158 198 158 158 197 158 158 197 157 157 197 157 157 197 157 157 196 157 157 196 157 157 196 157 157 196 155 155 194 153 153 191 153 153 191 156 156 195 156 156 195 155 155 194 155 155 194 155 155 194 155 155 194 155 155 193 154 154 193 154 154 193 154 154 193 151 151 189 62 62 77 62 62 77 34 34 42 105 105 131 105 105 131 147 147 183 146 146 183 128 128 160 152 152 190 152 152 190 150 150 188 141 141 176 141 141 176 45 45 57 45 45 57 4 4 5 13 13 17 13 13 17 12 12 15 7 7 9 7 7 9 1 1 1 1 1 1 9 9 11 22 22 28 22 22 28 58 58 73 64 64 80 64 64 80 80 80 101 80 80 100 100 100 125 110 110 137 110 110 137 109 109 137 106 106 133 106 106 133 45 45 57 45 45 57 8 8 11 4 4 5 4 4 5 49 49 62 131 131 164 131 131 164 71 71 89 71 71 89 99 99 123 117 117 147 117 117 147 101 101 126 143 143 179 143 143 178 142 142 178 142 142 178 142 142 177 140 140 175 140 140 175 140 140 175 135 135 169 135 135 169 135 135 169 135 135 168 137 137 172 136 136 170 135 135 169 135 135 169 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 114 142 142 113 142 142 113 142 142 109 137 137 110 138 138 110 138 138 111 139 139 111 139 139 114 143 143 113 142 142 113 141 141 115 115 144 115 115 144 115 115 144 115 115 143 114 114 143 114 114 143 114 114 143 114 114 143 114 114 142 112 112 141 112 112 140 111 111 139 111 111 139 113 113 141 113 113 141 113 113 141 112 112 141 112 112 141 112 112 140 112 112 140 112 112 140 112 112 140 109 109 137 109 109 137 45 45 56 24 24 30 24 24 30 76 76 95 76 76 95 106 106 133 92 92 116 92 92 116 110 110 138 109 109 136 109 109 136 102 102 127 102 102 127 33 33 41 3 3 4 3 3 4 9 9 12 8 8 11 8 8 11 5 5 6 5 5 6 1 1 1 6 6 8 6 6 8 16 16 20 +15 18 18 15 18 18 20 25 25 20 25 25 20 25 25 70 87 87 70 87 87 60 75 75 78 98 98 78 97 97 31 39 39 31 39 39 124 155 155 161 201 201 161 201 201 160 201 201 160 200 200 153 192 192 155 194 194 155 194 194 92 115 115 156 195 195 156 195 195 161 201 201 161 201 201 162 203 203 157 197 197 157 196 196 155 194 194 155 194 194 153 192 192 153 192 192 153 191 191 158 197 197 154 193 193 154 193 193 156 195 195 156 195 195 155 194 194 155 194 194 155 194 194 157 196 196 156 196 196 156 195 195 159 199 199 159 199 199 154 193 193 159 159 199 159 159 198 158 158 198 158 158 198 158 158 198 158 158 198 158 158 197 154 154 193 154 154 193 149 149 187 155 155 194 155 155 194 157 157 196 157 157 196 156 156 196 156 156 195 156 156 195 156 156 195 156 156 195 155 155 194 155 155 194 155 155 194 155 155 194 136 136 170 136 136 170 20 20 25 20 20 25 109 109 136 143 143 179 143 143 178 136 136 170 136 136 170 136 136 170 145 145 181 145 145 181 143 143 179 151 151 188 150 150 188 150 150 188 150 150 188 59 59 74 3 3 3 3 3 3 0 0 0 3 3 3 3 3 3 4 4 5 4 4 5 9 9 11 10 10 13 10 10 13 27 27 33 27 27 33 27 27 33 12 12 15 12 12 15 13 13 16 17 17 22 17 17 22 17 17 22 17 17 22 62 62 78 53 53 66 53 53 66 69 69 87 69 69 86 28 28 35 110 110 138 110 110 138 142 142 178 142 142 178 142 142 177 136 136 170 135 135 169 137 137 171 81 81 101 81 81 101 137 137 172 137 137 172 141 141 177 143 143 178 142 142 178 138 138 172 136 136 170 136 136 170 134 134 168 134 134 168 134 134 167 138 138 172 138 138 172 135 135 168 134 134 168 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 114 142 142 114 142 142 113 142 142 113 142 142 113 141 141 114 143 143 114 142 142 114 142 142 116 145 145 116 145 145 112 140 140 112 140 140 115 115 144 115 115 144 115 115 144 115 115 143 115 115 143 114 114 143 112 112 140 112 112 140 108 108 135 113 113 141 112 112 141 113 113 142 113 113 142 113 113 141 113 113 141 113 113 141 113 113 141 112 112 141 112 112 140 112 112 140 112 112 140 112 112 140 98 98 123 98 98 123 14 14 18 14 14 18 78 78 98 103 103 129 103 103 129 98 98 123 98 98 123 98 98 123 105 105 131 104 104 131 103 103 129 109 109 136 108 108 136 108 108 136 108 108 135 43 43 54 2 2 2 2 2 2 0 0 0 2 2 2 2 2 2 3 3 4 3 3 4 +45 56 56 35 44 44 35 44 44 46 58 58 40 50 50 40 50 50 26 33 33 26 33 33 66 83 83 146 183 183 146 183 183 161 202 202 161 201 201 151 189 189 136 170 170 136 170 170 152 190 190 152 190 190 101 126 126 155 194 194 155 194 194 162 202 202 161 202 202 163 204 204 159 199 199 159 199 199 156 195 195 156 195 195 157 197 197 159 199 199 159 198 198 162 202 202 162 202 202 160 200 200 153 191 191 153 191 191 153 191 191 153 191 191 159 199 199 157 197 197 157 196 196 157 196 196 157 196 196 158 198 198 160 200 200 159 199 199 158 158 197 159 159 199 159 159 199 159 159 199 159 159 198 158 158 198 158 158 198 158 158 198 156 156 196 156 156 195 158 158 197 157 157 197 157 157 197 157 157 196 157 157 196 157 157 196 157 157 196 156 156 196 156 156 195 156 156 195 156 156 195 154 154 193 154 154 192 129 129 161 128 128 161 31 31 39 106 106 133 106 106 133 136 136 170 135 135 169 149 149 187 137 137 171 136 136 171 146 146 182 145 145 182 147 147 184 150 150 187 149 149 187 148 148 185 148 148 185 141 141 177 30 30 38 30 30 38 1 1 1 13 13 17 13 13 17 15 15 19 15 15 19 12 12 15 48 48 60 48 48 60 39 39 49 39 39 49 36 36 45 77 77 96 76 76 96 43 43 54 43 43 54 40 40 50 31 31 39 31 31 39 41 41 52 41 41 52 35 35 44 23 23 29 23 23 29 59 59 74 59 59 74 130 130 162 143 143 179 143 143 178 134 134 167 133 133 167 120 120 150 134 134 168 134 134 168 89 89 111 88 88 111 136 136 171 142 142 178 142 142 177 143 143 179 143 143 179 140 140 175 137 137 171 136 136 171 138 138 172 139 139 174 139 139 173 141 141 177 141 141 176 139 139 174 133 133 167 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 111 139 139 111 139 139 111 139 139 116 145 145 115 144 144 114 143 143 114 143 143 114 142 142 115 144 144 115 143 143 116 145 145 114 114 143 114 114 143 115 115 144 115 115 144 115 115 144 115 115 143 114 114 143 114 114 143 113 113 141 113 113 141 114 114 142 114 114 142 113 113 142 113 113 142 113 113 142 113 113 141 113 113 141 113 113 141 113 113 141 112 112 141 112 112 140 112 112 140 111 111 139 92 92 116 92 92 116 22 22 28 22 22 28 76 76 95 97 97 122 97 97 122 107 107 134 107 107 134 98 98 123 105 105 131 105 105 131 106 106 132 105 105 132 107 107 134 106 106 133 106 106 133 102 102 127 101 101 127 22 22 27 1 1 1 1 1 1 9 9 12 +42 52 52 42 52 52 60 75 75 60 75 75 47 58 58 46 58 58 154 192 192 155 194 194 155 194 194 147 184 184 147 183 183 155 194 194 150 187 187 150 187 187 159 199 199 159 199 199 128 160 160 106 132 132 106 132 132 162 203 203 162 203 203 163 204 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 204 163 203 203 162 203 203 162 203 203 162 203 203 160 201 201 160 200 200 160 200 200 160 200 200 160 200 200 160 200 200 158 197 197 158 197 197 158 197 197 157 197 197 159 199 199 159 198 198 159 198 198 160 160 200 160 160 200 160 160 200 160 160 200 159 159 199 159 159 199 159 159 199 159 159 199 159 159 198 158 158 198 158 158 198 158 158 198 158 158 198 158 158 197 158 158 197 157 157 197 157 157 197 154 154 193 154 154 192 154 154 192 131 131 164 131 131 164 134 134 168 134 134 167 102 102 128 77 77 96 77 77 96 61 61 76 61 61 76 144 144 180 122 122 152 122 122 152 151 151 189 151 151 189 151 151 189 135 135 169 135 135 169 141 141 176 141 141 176 123 123 154 122 122 152 122 122 152 149 149 187 149 149 186 118 118 148 118 118 148 16 16 21 58 58 72 58 58 72 18 18 22 18 18 22 9 9 11 9 9 11 9 9 11 25 25 32 25 25 32 18 18 22 22 22 28 22 22 28 61 61 77 61 61 77 37 37 46 37 37 46 37 37 46 53 53 67 53 53 67 41 41 52 137 137 171 136 136 171 138 138 172 137 137 172 130 130 162 137 137 171 137 137 171 132 132 165 132 132 165 141 141 176 113 113 141 112 112 141 93 93 117 93 93 116 142 142 178 144 144 180 143 143 179 143 143 179 143 143 179 143 143 179 143 143 178 142 142 178 142 142 178 142 142 177 142 142 177 141 141 177 140 140 175 139 139 174 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 165 103 0 128 80 0 159 99 0 103 64 0 82 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 146 146 116 145 145 116 145 145 116 145 145 116 145 145 114 143 143 114 143 143 114 143 143 115 144 144 115 144 144 115 143 143 115 143 143 116 116 145 115 115 144 115 115 144 115 115 144 115 115 144 115 115 143 115 115 143 114 114 143 114 114 143 114 114 143 114 114 142 114 114 142 114 114 142 113 113 142 113 113 142 113 113 141 113 113 141 110 110 138 110 110 138 110 110 138 94 94 118 94 94 118 96 96 120 73 73 92 73 73 92 55 55 69 55 55 69 44 44 55 103 103 129 103 103 129 87 87 109 87 87 109 108 108 135 108 108 135 108 108 135 97 97 121 97 97 121 101 101 126 89 89 111 88 88 111 87 87 109 87 87 109 107 107 134 107 107 134 +43 54 54 43 54 54 79 98 98 158 197 197 158 197 197 159 199 199 159 199 199 152 190 190 159 199 199 159 199 199 150 188 188 150 188 188 150 188 188 133 167 167 133 166 166 118 148 148 118 147 147 161 201 201 161 201 201 164 205 205 164 205 205 164 205 205 164 205 205 164 205 205 163 204 204 163 204 204 163 204 204 163 204 204 163 204 204 159 199 199 159 199 199 161 201 201 159 199 199 159 199 199 162 203 203 162 202 202 150 188 188 158 198 198 158 198 198 161 202 202 161 201 201 159 199 199 161 161 201 161 161 201 160 160 201 160 160 200 160 160 200 160 160 200 160 160 200 160 160 200 159 159 199 159 159 199 159 159 199 159 159 199 159 159 198 159 159 198 158 158 198 158 158 198 158 158 198 158 158 197 148 148 185 130 130 163 130 130 163 106 106 133 106 106 133 88 88 111 133 133 166 133 133 166 41 41 51 41 41 51 108 108 136 108 108 136 141 141 177 122 122 153 122 122 153 147 147 184 147 147 184 150 150 187 150 150 187 149 149 187 140 140 175 140 140 175 101 101 126 119 119 149 119 119 149 148 148 185 148 148 185 145 145 181 145 145 181 67 67 84 13 13 17 13 13 17 41 41 51 41 41 51 7 7 9 53 53 66 53 53 66 36 36 45 36 36 45 33 33 41 33 33 41 27 27 34 84 84 106 84 84 105 123 123 154 123 123 154 66 66 82 39 39 48 39 39 48 70 70 88 70 70 87 140 140 175 141 141 177 141 141 176 135 135 169 135 135 169 140 140 176 140 140 175 133 133 166 132 132 166 132 132 165 117 117 147 117 117 147 104 104 130 142 142 177 141 141 177 144 144 180 144 144 180 144 144 180 143 143 179 143 143 179 143 143 179 143 143 179 143 143 178 142 142 178 142 142 178 139 139 174 139 139 174 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 191 119 0 183 114 0 199 124 0 185 116 0 184 115 0 160 100 0 132 82 0 91 57 0 39 24 0 106 66 0 161 100 0 150 94 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 118 148 148 116 145 145 116 145 145 117 146 146 115 144 144 115 144 144 117 147 147 117 146 146 109 136 136 114 143 143 114 143 143 116 145 145 116 145 145 115 144 144 115 143 143 116 116 145 115 115 144 115 115 144 115 115 144 115 115 144 115 115 144 115 115 143 114 114 143 114 114 143 114 114 143 114 114 143 114 114 142 114 114 142 113 113 142 113 113 142 113 113 142 113 113 141 106 106 133 93 93 117 93 93 117 76 76 95 76 76 95 63 63 79 95 95 119 95 95 119 29 29 36 29 29 36 77 77 97 77 77 97 101 101 126 87 87 109 87 87 109 105 105 131 105 105 131 107 107 134 107 107 134 107 107 134 100 100 125 100 100 125 72 72 90 85 85 106 85 85 106 +158 198 198 150 187 187 150 187 187 160 200 200 160 200 200 159 199 199 137 172 172 137 172 172 152 191 191 152 190 190 134 167 167 154 192 192 154 192 192 118 148 148 118 148 148 148 185 185 148 185 185 163 204 204 165 206 206 164 206 206 164 205 205 164 205 205 164 205 205 164 205 205 164 205 205 164 205 205 163 204 204 162 202 202 161 202 202 161 202 202 156 195 195 156 195 195 146 183 183 146 183 183 154 193 193 154 192 192 160 200 200 160 200 200 160 200 200 158 198 198 158 198 198 161 161 202 161 161 201 161 161 201 161 161 201 161 161 201 160 160 201 160 160 200 160 160 200 160 160 200 160 160 200 155 155 193 155 155 193 153 153 191 153 153 191 103 103 128 106 106 132 106 106 132 102 102 128 102 102 128 115 115 144 115 115 143 121 121 151 149 149 187 149 149 187 154 154 193 154 154 192 85 85 107 85 85 107 90 90 112 147 147 184 147 147 183 126 126 157 126 126 157 148 148 185 114 114 143 114 114 143 97 97 121 97 97 121 109 109 137 109 109 136 132 132 165 88 88 111 88 88 111 101 101 126 101 101 126 145 145 182 145 145 182 140 140 176 69 69 86 69 69 86 38 38 48 38 38 48 35 35 44 35 35 44 105 105 132 67 67 84 67 67 84 64 64 80 64 64 80 67 67 83 92 92 115 92 92 115 57 57 72 57 57 71 54 54 68 54 54 67 67 67 84 141 141 176 141 141 176 133 133 167 133 133 166 142 142 177 141 141 177 141 141 177 122 122 152 122 122 152 135 135 169 134 134 168 118 118 148 118 118 147 135 135 169 104 104 130 104 104 130 130 130 163 130 130 163 143 143 179 144 144 181 144 144 180 144 144 180 144 144 180 143 143 179 143 143 179 143 143 179 143 143 179 142 142 178 141 141 176 141 141 176 140 140 176 140 140 175 136 136 170 127 127 159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 187 117 0 183 114 0 193 121 0 191 119 0 153 95 0 174 109 0 101 63 0 100 62 0 130 81 0 127 79 0 109 68 0 138 86 0 118 74 0 46 29 0 71 44 0 120 75 0 187 117 0 186 116 0 103 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 119 149 149 119 149 149 119 149 149 119 148 148 119 148 148 117 147 147 117 146 146 117 146 146 117 146 146 113 141 141 113 141 141 105 132 132 111 139 139 111 139 139 116 145 145 115 144 144 115 144 144 114 142 142 114 142 142 116 116 145 116 116 145 116 116 145 115 115 144 115 115 144 115 115 144 115 115 144 115 115 143 115 115 143 114 114 143 114 114 143 111 111 138 109 109 137 109 109 137 73 73 92 73 73 92 75 75 94 73 73 91 73 73 91 82 82 102 82 82 102 86 86 108 86 86 108 106 106 133 110 110 137 110 110 137 61 61 76 61 61 76 64 64 80 64 64 80 104 104 131 90 90 112 90 90 112 105 105 132 105 105 131 81 81 102 81 81 102 69 69 86 78 78 97 78 78 97 94 94 118 +160 201 201 160 200 200 162 202 202 162 202 202 148 185 185 148 185 185 155 193 193 141 176 176 141 176 176 149 187 187 149 186 186 99 123 123 99 123 123 142 178 178 142 178 178 162 202 202 163 204 204 163 204 204 165 206 206 165 206 206 165 206 206 164 206 206 164 205 205 164 205 205 164 205 205 159 199 199 159 199 199 164 205 205 163 204 204 160 200 200 158 198 198 158 198 198 161 202 202 161 201 201 163 203 203 162 203 203 161 201 201 160 201 201 160 201 201 162 162 202 162 162 202 161 161 202 161 161 202 161 161 202 161 161 201 161 161 201 161 161 201 161 161 201 157 157 197 157 157 196 136 136 170 84 84 105 84 84 105 93 93 117 93 93 117 79 79 98 78 78 98 117 117 146 117 117 146 91 91 114 105 105 132 105 105 132 153 153 192 153 153 191 138 138 173 138 138 173 137 137 171 90 90 113 90 90 113 147 147 184 147 147 184 114 114 142 113 113 142 124 124 156 129 129 161 129 129 161 89 89 112 89 89 112 86 86 108 86 86 107 116 116 145 122 122 152 121 121 152 120 120 150 120 120 150 119 119 149 119 119 149 149 149 186 116 116 145 116 116 145 30 30 38 30 30 38 13 13 17 13 13 17 47 47 59 96 96 121 96 96 120 58 58 72 58 58 72 71 71 89 71 71 89 112 112 141 27 27 34 27 27 34 12 12 15 12 12 15 77 77 96 77 77 96 137 137 171 137 137 171 132 132 165 142 142 178 142 142 178 143 143 179 143 143 179 131 131 164 131 131 164 137 137 171 124 124 156 124 124 155 132 132 165 131 131 164 87 87 109 87 87 108 125 125 156 142 142 178 142 142 178 143 143 179 143 143 179 144 144 181 144 144 180 144 144 180 144 144 180 143 143 179 143 143 179 143 143 179 138 138 173 138 138 173 142 142 178 139 139 174 139 139 174 137 137 172 137 137 171 140 140 175 139 139 174 141 141 176 139 139 174 139 139 174 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 195 122 0 195 122 0 179 112 0 117 73 0 179 112 0 195 122 0 178 111 0 156 97 0 164 102 0 103 64 0 93 58 0 65 40 0 97 60 0 95 59 0 97 61 0 137 85 0 106 66 0 98 61 0 75 47 0 49 31 0 68 42 0 180 112 0 172 107 0 171 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 118 148 148 118 147 147 119 149 149 119 148 148 120 150 150 119 149 149 119 149 149 119 149 149 119 149 149 119 149 149 119 148 148 115 144 144 115 143 143 118 148 148 115 144 144 115 144 144 114 143 143 114 142 142 116 145 145 116 145 145 117 146 146 115 144 144 115 144 144 115 144 144 115 144 144 116 116 145 116 116 145 116 116 145 115 115 144 115 115 144 115 115 144 115 115 144 115 115 144 115 115 143 112 112 140 97 97 121 97 97 121 60 60 75 60 60 75 66 66 83 66 66 83 56 56 70 83 83 104 83 83 104 65 65 81 65 65 81 75 75 94 75 75 94 109 109 136 98 98 123 98 98 123 97 97 121 97 97 121 64 64 80 64 64 80 104 104 131 81 81 101 81 81 101 88 88 111 88 88 110 91 91 114 91 91 114 63 63 79 63 63 79 +157 197 197 157 197 197 147 184 184 147 184 184 150 188 188 150 187 187 150 187 187 141 177 177 141 177 177 122 153 153 122 153 153 109 136 136 131 163 163 131 163 163 159 199 199 159 199 199 164 205 205 164 205 205 165 207 207 165 206 206 165 206 206 165 206 206 165 206 206 163 204 204 163 203 203 164 205 205 164 205 205 161 201 201 160 201 201 164 205 205 163 204 204 163 204 204 163 204 204 163 204 204 161 202 202 161 201 201 158 197 197 162 162 203 162 162 203 162 162 203 162 162 203 162 162 202 162 162 202 155 155 194 155 155 194 160 160 200 132 132 165 132 132 165 71 71 89 71 71 89 104 104 130 103 103 129 81 81 101 81 81 101 131 131 163 97 97 121 96 96 121 145 145 181 145 145 181 120 120 150 120 120 150 154 154 192 142 142 178 142 142 178 134 134 168 134 134 167 116 116 145 116 116 145 105 105 131 105 105 131 133 133 166 111 111 138 111 111 138 139 139 174 139 139 174 85 85 106 85 85 106 91 91 114 91 91 114 127 127 159 86 86 108 86 86 107 100 100 125 100 100 125 101 101 127 101 101 126 132 132 165 149 149 186 149 149 186 99 99 124 99 99 124 58 58 73 58 58 73 26 26 32 26 26 32 89 89 111 117 117 146 116 116 146 113 113 142 113 113 141 44 44 55 44 44 55 45 45 57 45 45 57 38 38 47 135 135 169 135 135 168 128 128 161 128 128 160 140 140 175 140 140 175 135 135 169 139 139 174 139 139 174 130 130 163 130 130 162 133 133 166 132 132 166 132 132 165 132 132 165 124 124 156 108 108 135 108 108 135 96 96 120 96 96 120 115 115 143 114 114 143 139 139 174 139 139 174 143 143 179 145 145 181 144 144 180 144 144 180 144 144 180 144 144 180 143 143 179 142 142 177 143 143 179 143 143 178 140 140 175 139 139 174 142 142 178 142 142 177 142 142 177 141 141 177 141 141 176 139 139 174 139 139 174 165 151 170 255 223 170 255 255 175 255 255 175 228 230 174 255 255 174 187 117 0 180 112 0 112 70 0 173 108 0 191 119 0 105 66 0 62 39 0 86 53 0 126 79 0 125 78 0 85 53 0 67 42 0 160 100 0 155 97 0 118 74 0 119 74 0 93 58 0 108 67 0 137 86 0 178 111 0 189 118 0 172 107 0 176 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 103 129 129 89 112 112 89 112 112 79 99 99 79 99 99 95 119 119 115 144 144 115 144 144 119 149 149 119 148 148 120 150 150 119 149 149 119 149 149 119 149 149 119 149 149 117 147 147 117 147 147 118 148 148 118 148 148 116 145 145 115 144 144 118 147 147 117 147 147 117 147 147 117 146 146 117 146 146 115 144 144 115 144 144 113 141 141 113 141 141 116 116 145 116 116 145 116 116 145 116 116 145 115 115 144 110 110 138 110 110 138 114 114 142 94 94 117 94 94 117 51 51 63 50 50 63 74 74 92 73 73 92 57 57 72 57 57 72 93 93 116 68 68 86 68 68 86 103 103 128 103 103 128 85 85 107 85 85 107 109 109 136 109 109 136 101 101 126 95 95 119 95 95 119 82 82 103 82 82 103 74 74 93 74 74 93 94 94 118 78 78 98 78 78 98 98 98 123 98 98 123 +157 197 197 120 150 150 120 150 150 159 199 199 159 199 199 143 179 179 143 179 179 108 135 135 108 135 135 126 158 158 99 124 124 99 124 124 134 168 168 134 168 168 156 195 195 156 195 195 162 203 203 162 203 203 162 203 203 162 203 203 165 207 207 163 204 204 163 204 204 161 202 202 161 202 202 156 195 195 156 195 195 158 197 197 157 197 197 161 201 201 160 201 201 160 201 201 162 202 202 162 202 202 163 204 204 163 204 204 163 163 204 163 163 204 163 163 203 161 161 201 161 161 201 149 149 186 149 149 186 104 104 131 104 104 131 81 81 102 81 81 102 99 99 124 99 99 124 84 84 105 122 122 152 122 122 152 141 141 176 141 141 176 150 150 188 150 150 188 144 144 180 143 143 179 151 151 189 148 148 185 148 148 185 151 151 189 151 151 188 133 133 166 133 133 166 147 147 184 147 147 184 81 81 101 110 110 137 110 110 137 117 117 147 117 117 147 124 124 155 123 123 154 98 98 122 98 98 122 93 93 116 93 93 116 146 146 183 148 148 185 148 148 185 103 103 129 103 103 129 133 133 166 133 133 166 123 123 154 123 123 154 143 143 179 148 148 185 147 147 184 96 96 120 96 96 120 63 63 79 63 63 79 35 35 44 35 35 44 101 101 127 67 67 84 67 67 84 33 33 42 33 33 42 33 33 42 33 33 42 74 74 93 74 74 93 123 123 154 123 123 154 124 124 155 142 142 178 142 142 178 134 134 168 134 134 168 131 131 164 131 131 163 139 139 174 139 139 174 106 106 133 140 140 176 140 140 175 126 126 158 126 126 158 95 95 119 95 95 118 111 111 139 111 111 139 87 87 109 118 118 147 118 118 147 137 137 171 136 136 171 142 142 178 142 142 177 142 142 177 141 141 177 144 144 180 144 144 180 142 142 178 140 140 176 140 140 175 136 136 170 135 135 169 137 137 171 136 136 171 228 184 174 255 237 174 255 235 173 255 204 175 255 217 175 255 223 176 255 215 176 255 253 176 255 255 175 255 255 175 255 255 175 255 255 173 255 240 160 255 255 160 176 166 112 151 150 112 123 120 87 153 139 87 121 76 0 118 73 0 96 60 0 145 90 0 107 66 0 110 68 0 172 107 0 182 113 0 98 61 0 78 48 0 130 81 0 139 87 0 168 105 0 174 109 0 184 115 0 189 118 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 144 144 88 110 110 88 110 110 116 145 145 105 131 131 104 131 131 78 98 98 78 98 98 92 115 115 91 114 114 72 90 90 72 90 90 97 122 122 113 141 141 113 141 141 117 147 147 117 147 147 117 146 146 117 146 146 119 149 149 119 149 149 117 147 147 116 145 145 116 145 145 112 140 140 112 140 140 113 141 141 113 141 141 115 144 144 115 144 144 115 144 144 115 143 143 116 145 145 117 146 146 116 146 146 116 116 145 116 116 145 116 116 145 116 116 145 114 114 143 114 114 143 106 106 132 74 74 93 74 74 93 58 58 72 58 58 72 70 70 88 70 70 88 60 60 75 60 60 75 86 86 108 100 100 125 100 100 125 106 106 133 106 106 133 102 102 127 101 101 127 107 107 134 107 107 134 104 104 131 104 104 131 106 106 133 94 94 117 94 94 117 104 104 130 104 104 130 57 57 72 57 57 72 77 77 97 77 77 97 83 83 104 +151 189 189 134 167 167 134 167 167 113 142 142 113 142 142 145 182 182 145 182 182 160 201 201 160 200 200 160 200 200 158 198 198 158 198 198 87 109 109 87 109 109 72 90 90 72 90 90 89 111 111 89 111 111 120 151 151 122 153 153 122 152 152 120 150 150 120 150 150 150 188 188 150 187 187 161 202 202 161 202 202 158 197 197 158 197 197 158 197 197 161 201 201 161 201 201 159 199 199 159 198 198 160 160 200 160 160 200 142 142 177 142 142 177 74 74 92 74 74 92 57 57 72 57 57 72 54 54 67 123 123 154 123 123 153 155 155 194 155 155 194 144 144 180 143 143 179 143 143 179 143 143 179 156 156 195 156 156 195 154 154 193 143 143 178 142 142 178 157 157 196 157 157 196 137 137 171 137 137 171 130 130 163 130 130 163 145 145 181 144 144 181 106 106 132 138 138 172 138 138 172 76 76 96 76 76 96 91 91 113 91 91 113 111 111 139 111 111 139 113 113 141 112 112 141 115 115 144 82 82 103 82 82 103 148 148 185 148 148 185 142 142 177 141 141 177 146 146 183 146 146 182 128 128 161 128 128 160 153 153 192 151 151 189 151 151 189 153 153 191 152 152 191 144 144 181 144 144 180 100 100 126 100 100 126 65 65 81 64 64 81 100 100 125 100 100 125 118 118 148 80 80 100 79 79 99 127 127 159 127 127 159 145 145 181 145 145 181 145 145 181 144 144 181 129 129 161 129 129 161 142 142 178 98 98 123 98 98 122 143 143 179 143 143 179 134 134 167 133 133 167 118 118 148 118 118 148 100 100 125 100 100 125 128 128 160 141 141 177 141 141 176 141 141 176 141 141 176 139 139 174 139 139 173 76 76 96 76 76 95 63 63 79 63 63 79 77 77 97 105 105 131 105 105 131 106 106 133 106 106 133 104 104 131 117 111 130 139 135 163 255 221 163 255 204 175 255 233 175 216 176 171 255 203 171 255 228 170 255 231 174 255 235 173 202 169 171 199 168 171 255 249 172 255 255 172 255 242 152 255 253 152 143 129 79 140 127 79 115 102 61 95 88 58 92 87 58 212 198 131 252 223 131 255 255 166 255 255 166 230 220 153 255 255 153 255 241 153 242 227 152 186 116 0 184 115 0 96 60 0 134 84 0 172 107 0 187 117 0 191 119 0 164 102 0 168 105 0 161 101 0 158 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 117 147 147 81 101 101 81 101 101 118 148 148 118 148 148 110 138 138 110 138 138 97 122 122 97 122 122 82 103 103 106 132 132 106 132 132 116 146 146 116 145 145 116 145 145 116 145 145 114 143 143 114 143 143 63 79 79 63 79 79 52 65 65 64 80 80 64 80 80 87 108 108 86 108 108 88 110 110 87 109 109 86 108 108 86 108 108 107 134 134 107 134 134 115 144 144 113 141 141 113 141 141 113 141 141 112 141 141 115 143 143 114 143 143 113 141 141 113 141 141 114 114 143 114 114 142 101 101 126 101 101 126 52 52 65 41 41 51 40 40 51 38 38 48 38 38 48 87 87 109 87 87 109 110 110 137 110 110 137 101 101 127 101 101 127 101 101 127 110 110 138 110 110 138 109 109 136 109 109 136 101 101 126 100 100 126 111 111 138 110 110 138 97 97 121 96 96 121 92 92 115 102 102 127 102 102 127 74 74 93 74 74 93 97 97 121 97 97 121 54 54 67 +158 198 198 105 131 131 105 131 131 159 199 199 159 199 199 164 205 205 162 203 203 162 203 203 160 201 201 160 201 201 155 194 194 155 194 194 116 145 145 116 145 145 86 107 107 85 107 107 119 149 149 119 149 149 151 189 189 119 149 149 119 149 149 152 190 190 152 190 190 154 192 192 153 192 192 153 192 192 153 192 192 161 202 202 161 202 202 161 202 202 161 201 201 163 203 203 147 147 184 147 147 184 86 86 107 86 86 107 89 89 111 89 89 111 66 66 82 66 66 82 89 89 111 89 89 111 154 154 193 154 154 193 138 138 172 138 138 172 157 157 196 149 149 186 149 149 186 150 150 188 150 150 188 155 155 193 155 155 193 153 153 191 153 153 191 156 156 195 156 156 195 144 144 180 144 144 180 106 106 133 147 147 184 147 147 183 116 116 145 116 116 145 143 143 179 143 143 179 72 72 90 72 72 90 91 91 114 91 91 114 70 70 88 70 70 87 65 65 81 65 65 81 127 127 159 106 106 133 106 106 133 128 128 160 128 128 160 152 152 190 151 151 189 142 142 177 142 142 177 149 149 187 149 149 187 151 151 188 150 150 188 141 141 176 150 150 188 150 150 187 148 148 185 148 148 185 137 137 171 137 137 171 139 139 174 139 139 174 122 122 153 122 122 152 92 92 116 92 92 115 69 69 86 69 69 86 141 141 176 142 142 178 142 142 178 150 150 187 149 149 187 149 149 187 149 149 186 131 131 163 130 130 163 91 91 113 91 91 113 146 146 183 146 146 183 146 146 183 140 140 175 140 140 175 93 93 116 93 93 116 141 141 176 140 140 175 145 145 181 144 144 181 143 143 178 142 142 178 141 141 176 141 141 176 136 136 170 102 102 127 101 101 127 75 75 94 75 75 93 243 173 130 150 127 130 153 142 164 255 222 164 244 174 129 199 151 129 255 216 165 255 218 165 255 218 167 255 220 166 255 212 166 255 207 175 255 232 174 255 234 174 255 229 174 252 196 175 255 203 175 255 246 159 255 252 158 157 145 92 163 148 92 167 152 95 173 156 95 135 119 70 175 157 95 142 136 95 218 219 165 255 255 165 255 249 147 255 238 147 255 247 168 255 255 167 255 243 158 255 255 158 255 240 159 238 228 159 255 255 164 255 255 164 255 255 162 255 255 165 193 121 0 176 110 0 179 112 0 133 83 0 131 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 117 147 147 123 154 154 123 154 154 123 154 154 108 135 135 108 135 135 75 94 94 75 93 93 121 151 151 121 151 151 120 151 151 120 150 150 115 144 144 115 144 144 76 96 96 76 95 95 116 145 145 115 144 144 119 149 149 117 147 147 117 147 147 116 145 145 116 145 145 112 140 140 112 140 140 84 105 105 83 104 104 61 77 77 61 77 77 85 107 107 85 107 107 108 135 135 85 106 106 85 106 106 109 136 136 109 136 136 110 137 137 110 137 137 109 137 137 109 137 137 115 144 144 115 144 144 115 143 143 115 143 143 116 145 145 105 105 131 105 105 131 61 61 76 61 61 76 63 63 79 63 63 79 46 46 58 46 46 58 63 63 78 63 63 78 109 109 136 109 109 136 97 97 122 97 97 121 111 111 139 105 105 131 105 105 131 106 106 132 106 106 132 109 109 136 109 109 136 107 107 134 107 107 134 109 109 137 109 109 137 101 101 127 101 101 126 75 75 94 103 103 129 103 103 129 81 81 102 81 81 102 100 100 126 +95 119 119 165 206 206 160 200 200 160 200 200 165 206 206 164 206 206 164 206 206 164 205 205 166 207 207 166 207 207 161 201 201 160 201 201 115 143 143 115 143 143 94 118 118 94 118 118 72 90 90 72 90 90 62 77 77 58 73 73 58 73 73 109 136 136 109 136 136 135 169 169 135 169 169 157 196 196 157 196 196 157 196 196 157 196 196 156 196 196 156 196 196 83 83 104 83 83 104 88 88 110 88 88 110 83 83 103 82 82 103 134 134 167 79 79 99 79 79 99 129 129 161 128 128 161 155 155 193 155 155 193 158 158 197 158 158 197 151 151 189 151 151 188 139 139 174 139 139 174 157 157 196 157 157 196 158 158 198 158 158 198 153 153 191 136 136 171 136 136 171 144 144 181 144 144 180 123 123 154 123 123 154 106 106 133 106 106 133 132 132 165 132 132 165 109 109 137 109 109 137 86 86 108 86 86 108 94 94 118 94 94 118 62 62 78 70 70 88 70 70 87 121 121 151 121 121 151 140 140 175 140 140 175 128 128 161 128 128 160 153 153 192 153 153 192 125 125 156 124 124 156 132 132 165 132 132 165 129 129 161 128 128 161 144 144 180 138 138 172 137 137 172 150 150 187 150 150 187 143 143 179 143 143 179 113 113 142 113 113 141 107 107 133 107 107 133 108 108 135 108 108 135 108 108 135 107 107 134 147 147 184 147 147 184 150 150 188 150 150 187 150 150 187 145 145 181 145 145 181 138 138 173 138 138 173 144 144 180 144 144 180 144 144 180 143 143 179 105 105 132 105 105 132 84 84 105 84 84 105 145 145 182 145 145 182 140 140 176 140 140 175 145 145 181 144 144 181 144 144 180 145 145 182 145 145 182 255 233 176 255 236 175 237 169 125 237 169 125 194 138 103 171 127 103 143 103 79 146 104 78 101 78 67 122 88 67 115 83 63 117 84 63 221 158 118 255 192 147 253 185 146 255 211 170 255 218 170 255 220 169 242 189 169 210 172 169 255 208 168 161 145 89 154 141 89 173 155 94 179 159 94 163 146 89 169 150 88 222 211 143 184 187 143 131 124 84 193 189 137 226 210 137 255 255 165 255 255 165 255 255 168 255 255 168 255 244 161 255 255 160 229 217 148 231 218 148 255 255 166 255 255 166 255 255 168 255 255 167 255 255 162 255 255 162 255 245 144 255 255 152 255 255 152 104 130 130 103 129 129 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 111 111 89 111 111 89 111 111 122 152 152 121 152 152 124 155 155 123 154 154 123 154 154 123 154 154 119 149 149 114 142 142 114 142 142 119 148 148 118 148 148 118 148 148 118 148 148 87 108 108 87 108 108 69 86 86 69 86 86 120 150 150 119 149 149 115 144 144 115 144 144 119 149 149 119 148 148 118 148 148 119 149 149 119 149 149 115 144 144 115 144 144 82 103 103 82 103 103 67 84 84 67 84 84 51 64 64 51 64 64 44 55 55 44 55 55 42 52 52 42 52 52 77 97 97 77 97 97 96 120 120 112 140 140 111 139 139 111 139 139 111 139 139 111 139 139 111 139 139 59 59 73 59 59 73 62 62 78 62 62 78 58 58 73 58 58 73 95 95 118 94 94 118 56 56 70 56 56 70 90 90 113 90 90 113 109 109 136 111 111 139 111 111 139 106 106 133 106 106 133 98 98 122 98 98 122 110 110 138 110 110 138 111 111 139 111 111 139 107 107 134 107 107 134 96 96 120 95 95 119 101 101 126 101 101 126 86 86 108 75 75 93 +167 209 209 167 209 209 169 211 211 168 211 211 156 196 196 156 195 195 156 195 195 156 195 195 153 191 191 152 191 191 144 180 180 144 180 180 118 148 148 118 148 148 50 63 63 50 63 63 77 97 97 77 97 97 94 118 118 94 118 118 106 132 132 159 199 199 159 199 199 127 159 159 127 159 159 152 190 190 152 190 190 157 196 196 157 196 196 122 122 152 122 122 152 110 110 137 110 110 137 131 131 164 131 131 164 159 159 199 159 159 199 151 151 189 151 151 188 106 106 132 106 106 132 140 140 175 140 140 175 145 145 181 145 145 181 148 148 185 140 140 175 139 139 174 157 157 197 157 157 197 159 159 199 159 159 198 149 149 186 148 148 186 140 140 175 140 140 175 153 153 191 153 153 191 133 133 166 133 133 166 126 126 158 126 126 158 139 139 174 139 139 174 152 152 190 151 151 189 142 142 177 141 141 177 90 90 112 90 90 112 90 90 112 62 62 78 62 62 78 100 100 126 100 100 126 123 123 153 123 123 153 130 130 163 130 130 163 113 113 141 112 112 141 147 147 184 147 147 184 145 145 182 145 145 181 134 134 167 134 134 167 137 137 171 137 137 171 132 132 165 131 131 164 144 144 180 151 151 189 151 151 189 103 103 128 103 103 128 73 73 91 73 73 91 143 143 178 142 142 178 80 80 100 80 80 100 126 126 158 126 126 158 151 151 188 150 150 188 149 149 186 149 149 186 148 148 186 148 148 185 146 146 183 146 146 183 140 140 175 140 140 175 127 127 159 100 100 125 100 100 125 113 113 142 113 113 141 140 140 175 140 140 175 147 147 184 147 147 184 148 148 185 255 240 185 255 230 172 255 230 171 255 230 171 255 230 171 255 255 255 255 255 255 255 210 157 255 202 157 230 167 129 221 162 129 101 72 55 82 63 55 142 105 84 173 127 102 191 136 102 216 154 115 208 150 115 255 221 173 255 211 172 212 161 138 237 173 137 255 194 164 241 186 164 214 175 169 255 212 169 225 206 131 247 220 131 219 196 118 226 200 118 255 238 141 255 239 141 183 200 171 203 212 170 255 241 161 168 185 161 154 153 113 196 179 113 255 251 149 255 254 155 255 255 154 255 255 158 255 255 157 221 212 148 255 240 148 255 255 167 255 255 167 255 255 168 255 255 168 255 255 157 255 255 157 255 255 148 255 253 148 255 255 161 129 161 161 112 140 140 112 140 140 106 133 133 106 133 133 117 146 146 116 146 146 127 159 159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 106 106 85 106 106 60 75 75 60 75 75 117 147 147 117 147 147 66 83 83 66 82 82 104 130 130 104 130 130 124 155 155 124 155 155 122 153 153 122 153 153 122 152 152 122 152 152 120 150 150 115 144 144 115 144 144 105 131 131 104 131 131 82 102 102 82 102 102 93 116 116 93 116 116 115 144 144 115 143 143 121 151 151 120 151 151 121 152 152 121 152 152 112 141 141 112 140 140 112 140 140 112 140 140 109 137 137 109 137 137 103 129 129 103 129 129 84 106 106 36 45 45 36 45 45 55 69 69 55 69 69 67 84 84 67 84 84 75 94 94 75 94 94 113 142 142 113 141 141 90 113 113 90 113 113 108 135 135 108 135 135 111 139 139 111 139 139 86 86 107 86 86 107 77 77 97 77 77 97 92 92 116 92 92 116 112 112 140 112 112 140 106 106 133 74 74 93 74 74 93 99 99 123 98 98 123 102 102 127 102 102 127 104 104 130 104 104 130 98 98 122 98 98 122 110 110 138 110 110 138 111 111 139 111 111 139 104 104 130 104 104 130 98 98 123 98 98 122 107 107 134 107 107 133 +167 209 209 167 209 209 143 179 179 143 179 179 153 192 192 153 191 191 160 200 200 160 200 200 137 172 172 137 172 172 146 182 182 146 182 182 105 131 131 105 131 131 59 74 74 59 74 74 148 186 186 148 186 186 157 196 196 157 196 196 158 198 198 158 198 198 143 179 179 143 178 178 148 185 185 147 184 184 151 189 189 159 159 199 159 159 199 160 160 201 160 160 200 153 153 192 153 153 192 152 152 190 151 151 189 153 153 191 153 153 191 154 154 193 154 154 193 104 104 130 104 104 130 132 132 165 132 132 165 139 139 173 138 138 173 132 132 165 132 132 165 148 148 185 148 148 185 153 153 191 152 152 191 157 157 197 157 157 197 157 157 196 157 157 196 148 148 186 148 148 186 133 133 167 133 133 167 110 110 138 110 110 138 122 122 152 152 152 190 152 152 190 155 155 194 155 155 194 147 147 184 147 147 183 67 67 84 67 67 84 96 96 120 96 96 120 51 51 64 51 51 64 99 99 124 99 99 124 131 131 164 131 131 163 122 122 153 122 122 153 130 130 163 130 130 163 104 104 131 104 104 131 125 125 156 125 125 156 113 113 142 113 113 142 108 108 136 108 108 135 133 133 167 133 133 167 130 130 162 130 130 162 111 111 139 111 111 138 125 125 156 149 149 187 149 149 187 99 99 124 99 99 124 58 58 73 58 58 73 142 142 178 142 142 177 148 148 185 148 148 185 144 144 180 144 144 180 147 147 184 147 147 184 134 134 168 134 134 168 84 84 105 83 83 104 92 92 116 92 92 115 124 124 155 124 124 155 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 198 150 255 211 159 255 208 159 208 149 114 172 132 114 112 82 64 114 83 64 255 210 161 255 215 161 255 228 170 255 225 170 255 218 171 255 224 171 248 186 154 255 200 154 208 168 159 253 190 159 255 195 162 255 197 162 237 234 171 255 255 171 238 235 172 255 255 172 255 255 164 248 237 164 206 210 162 252 238 162 213 215 163 185 197 163 179 194 165 255 255 164 198 179 111 211 187 111 255 239 141 255 234 140 255 237 147 255 234 140 255 230 140 255 255 157 255 255 157 255 255 162 255 255 161 255 255 166 255 255 166 255 255 166 255 255 165 255 255 157 255 255 156 112 141 141 112 140 140 93 116 116 93 116 116 102 128 128 102 127 127 128 160 160 127 159 159 130 162 162 130 162 162 123 153 153 122 153 153 56 70 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 112 112 110 138 138 110 138 138 107 134 134 107 134 134 91 114 114 91 114 114 103 128 128 102 128 128 123 154 154 123 153 153 81 102 102 81 102 102 48 60 60 48 60 60 116 146 146 116 146 146 121 152 152 121 151 151 118 148 148 118 148 148 120 151 151 120 150 150 110 138 138 110 137 137 68 86 86 76 95 95 76 95 95 102 127 127 101 127 127 119 148 148 119 148 148 120 150 150 119 149 149 120 151 151 120 150 150 103 129 129 103 128 128 110 137 137 110 137 137 114 143 143 114 143 143 98 123 123 98 123 123 104 130 130 104 130 130 75 93 93 75 93 93 42 52 52 42 52 52 106 132 132 105 132 132 111 139 139 111 139 139 112 140 140 112 140 140 101 126 126 101 126 126 104 130 130 104 130 130 106 133 133 112 112 140 112 112 140 113 113 141 113 113 141 108 108 135 108 108 135 107 107 133 106 106 133 107 107 134 107 107 134 108 108 135 108 108 135 73 73 91 73 73 91 93 93 116 92 92 116 97 97 121 97 97 121 92 92 115 92 92 115 103 103 129 103 103 129 107 107 133 106 106 133 110 110 137 110 110 137 109 109 137 109 109 137 +162 203 203 162 203 203 166 207 207 166 207 207 164 205 205 164 205 205 165 207 207 165 206 206 138 172 172 138 172 172 114 142 142 114 142 142 90 112 112 90 112 112 125 157 157 125 156 156 156 195 195 155 194 194 138 173 173 138 173 173 131 164 164 131 164 164 140 175 175 140 175 175 160 200 200 160 200 200 163 163 204 163 163 203 147 147 184 147 147 184 149 149 186 149 149 186 147 147 184 147 147 184 138 138 173 138 138 173 151 151 189 151 151 189 158 158 197 158 158 197 104 104 130 104 104 130 152 152 190 152 152 190 150 150 188 150 150 188 115 115 144 115 115 144 153 153 191 143 143 179 143 143 179 148 148 185 148 148 185 152 152 191 152 152 190 139 139 174 139 139 174 126 126 157 125 125 157 112 112 140 112 112 140 154 154 193 154 154 193 151 151 189 151 151 188 157 157 196 157 157 196 129 129 162 129 129 161 53 53 66 53 53 66 119 119 149 119 119 149 70 70 88 70 70 88 97 97 122 97 97 122 149 149 186 148 148 186 153 153 191 153 153 191 141 141 177 141 141 177 76 76 95 76 76 95 147 147 184 147 147 184 147 147 184 147 147 183 121 121 152 121 121 151 91 91 114 91 91 114 136 136 170 136 136 170 150 150 188 150 150 187 151 151 189 151 151 189 140 140 175 140 140 175 34 34 42 34 34 42 122 122 153 122 122 153 148 148 185 148 148 185 151 151 189 151 151 188 143 143 178 143 143 178 138 138 172 138 138 172 119 119 149 119 119 149 65 65 82 117 117 146 117 117 146 147 147 184 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 216 180 229 175 150 251 185 150 210 154 124 205 152 124 180 129 98 182 130 97 248 178 136 247 178 136 255 223 169 255 225 168 255 194 150 255 187 150 219 166 142 250 182 142 202 161 151 247 184 150 255 209 172 215 176 172 255 255 175 255 255 175 255 254 158 255 247 158 255 255 160 196 202 159 156 176 157 230 222 157 243 226 148 243 226 148 163 182 162 224 220 161 255 255 168 255 255 168 211 187 111 194 177 111 255 255 162 255 255 161 255 255 159 255 255 159 239 210 122 239 210 122 255 255 162 255 255 162 255 255 151 255 255 151 255 255 156 255 255 155 255 255 160 128 160 160 117 146 146 116 146 146 105 132 132 105 131 131 94 118 118 129 162 162 129 161 161 126 158 158 126 158 158 131 164 164 131 164 164 108 135 135 108 135 135 44 55 55 44 55 55 99 124 124 99 124 124 58 73 73 58 73 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 78 78 122 152 152 121 152 152 121 152 152 121 151 151 100 125 125 100 125 125 75 94 94 75 94 94 112 140 140 112 140 140 123 154 154 123 154 154 124 155 155 124 155 155 115 144 144 115 143 143 28 35 35 28 35 35 100 125 125 100 125 125 121 152 152 121 152 152 124 155 155 123 154 154 117 146 146 117 146 146 113 141 141 112 141 141 97 122 122 97 122 122 53 67 67 53 67 67 95 119 119 95 119 119 120 150 150 120 150 150 118 148 148 118 148 148 118 148 148 118 147 147 116 146 146 116 145 145 118 148 148 117 146 146 117 146 146 118 148 148 118 147 147 98 123 123 98 123 123 81 101 101 81 101 101 64 80 80 64 80 80 89 111 111 89 111 111 110 138 138 110 138 138 98 122 122 98 122 122 93 116 116 93 116 116 99 123 123 98 123 123 113 141 141 112 141 141 115 115 143 114 114 143 104 104 130 103 103 129 104 104 131 104 104 131 103 103 129 103 103 129 97 97 121 97 97 121 106 106 133 106 106 132 110 110 138 110 110 138 73 73 91 73 73 91 106 106 133 106 106 133 105 105 131 105 105 131 80 80 101 80 80 100 107 107 133 106 106 133 99 99 124 99 99 124 +206 206 206 205 205 205 212 212 212 212 212 212 211 211 211 211 211 211 209 209 209 209 209 209 204 204 204 204 204 204 204 204 204 204 204 204 198 198 198 197 197 197 197 197 197 197 197 197 186 186 186 186 186 186 184 184 184 184 184 184 192 192 192 192 192 192 202 202 202 202 202 202 208 167 208 208 167 208 202 161 202 202 161 202 204 163 204 203 163 203 201 161 201 201 161 201 201 161 201 201 160 201 207 165 207 207 165 207 198 158 198 198 158 198 198 158 198 198 158 198 197 158 197 197 158 197 201 161 201 201 161 201 197 157 197 197 157 197 190 152 190 190 152 190 200 160 200 200 160 200 202 161 202 202 161 202 197 158 197 197 158 197 197 157 197 197 157 197 199 159 199 198 159 198 196 157 196 196 157 196 202 161 202 202 161 202 199 159 199 199 159 199 195 156 195 195 156 195 197 157 197 196 157 196 194 155 194 194 155 194 184 147 184 183 147 183 169 135 169 169 135 169 151 120 151 150 120 150 152 122 152 152 122 152 116 93 116 116 92 116 132 105 132 131 105 131 135 108 135 135 108 135 147 117 147 147 117 147 180 144 180 180 144 180 186 149 186 186 148 186 181 145 181 181 145 181 189 151 189 189 151 189 188 151 188 188 150 188 180 144 180 180 144 180 187 150 187 187 150 187 187 149 187 187 149 187 188 151 188 188 150 188 184 147 184 184 147 184 180 144 180 179 143 179 173 139 173 173 138 173 183 146 183 182 146 182 186 149 186 186 148 186 183 147 183 183 146 183 183 146 183 183 146 183 181 144 181 180 144 180 255 248 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 242 249 255 255 255 255 255 255 255 255 255 255 255 255 255 198 185 255 199 182 255 196 182 255 182 178 255 195 178 255 224 178 255 236 177 255 223 172 255 228 171 255 227 171 255 229 171 255 205 161 255 206 161 255 203 159 255 184 159 255 171 166 255 201 165 255 216 174 255 197 174 255 255 179 255 248 179 255 253 173 255 255 173 255 255 174 196 185 174 248 210 172 255 249 172 255 229 172 255 246 171 255 224 176 255 233 176 255 255 169 255 255 168 255 255 168 255 255 168 255 255 168 255 255 167 255 255 170 255 255 170 255 255 166 255 255 166 255 255 161 255 255 160 255 255 169 255 255 168 255 255 170 255 255 170 255 255 166 166 166 166 165 165 165 165 165 165 167 167 167 166 166 166 164 164 164 164 164 164 169 169 169 169 169 169 167 167 167 166 166 166 163 163 163 162 162 162 164 164 164 163 163 163 161 161 161 161 161 161 153 153 153 152 152 152 140 140 140 140 140 140 125 125 125 125 125 125 126 126 126 126 126 126 96 96 96 96 96 96 109 109 109 108 108 108 112 112 112 111 111 111 121 121 121 121 121 121 148 148 148 148 148 148 153 153 153 153 153 153 149 149 149 149 149 149 155 155 155 155 155 155 155 155 155 154 154 154 148 148 148 147 147 147 154 154 154 153 153 153 153 153 153 153 153 153 154 154 154 154 154 154 151 151 151 150 150 150 147 147 147 147 147 147 142 142 142 141 141 141 149 149 149 149 149 149 152 152 152 152 152 152 150 150 150 149 149 149 149 149 149 149 149 149 147 147 147 147 147 147 148 148 148 148 148 148 148 148 148 148 148 148 147 147 147 147 147 147 147 147 147 147 147 147 151 151 151 151 151 151 151 151 151 150 150 150 149 149 149 148 148 148 145 145 145 145 145 145 145 145 145 145 145 145 140 140 140 140 140 140 139 139 139 139 139 139 132 132 132 131 131 131 130 130 130 129 129 129 135 135 135 135 135 135 142 142 142 142 142 142 146 117 146 146 117 146 142 113 142 141 113 141 143 114 143 142 114 142 141 113 141 141 112 141 140 112 140 140 112 140 144 115 144 144 115 144 138 110 138 138 110 138 138 110 138 138 110 138 137 110 137 137 110 137 140 112 140 140 112 140 137 109 137 137 109 137 132 106 132 132 105 132 +210 210 210 210 210 210 212 212 212 212 212 212 205 205 205 205 205 205 203 203 203 203 203 203 207 207 207 207 207 207 200 200 200 200 200 200 202 202 202 202 202 202 195 195 195 195 195 195 191 191 191 191 191 191 186 186 186 186 186 186 203 203 203 203 203 203 209 167 209 209 167 209 209 167 209 204 163 204 204 163 204 204 163 204 204 163 204 200 160 200 199 159 199 201 161 201 201 161 201 201 161 201 201 161 201 201 160 201 201 160 201 192 153 192 192 153 192 196 157 196 196 156 196 202 161 202 202 161 202 199 159 199 199 159 199 195 156 195 195 156 195 201 160 201 200 160 200 202 162 202 202 162 202 198 158 198 198 158 198 191 153 191 191 153 191 197 158 197 197 157 197 201 161 201 201 160 201 202 162 202 202 162 202 198 158 198 198 158 198 198 158 198 197 158 197 193 154 193 193 154 193 158 126 158 158 126 158 109 87 109 109 87 109 157 126 157 157 126 157 143 114 143 143 114 143 129 103 129 128 103 128 60 48 60 60 48 60 46 36 46 46 36 46 88 70 88 88 70 88 77 62 77 77 62 77 105 84 105 105 84 105 125 100 125 125 100 125 105 84 105 105 84 105 132 106 132 132 105 132 171 137 171 171 137 171 187 149 187 186 149 186 186 149 186 186 149 186 180 144 180 180 144 180 189 151 189 189 151 189 189 151 189 188 151 188 184 147 184 184 147 184 178 142 178 178 142 178 177 142 177 185 148 185 185 148 185 184 147 184 184 147 184 182 146 182 182 145 182 181 145 181 181 145 181 181 145 181 181 144 181 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 238 185 255 194 179 255 196 179 255 175 177 255 173 177 255 218 180 255 231 180 255 224 174 255 228 174 255 234 175 255 235 175 255 222 169 255 223 169 255 208 165 255 216 165 255 190 161 255 191 160 255 226 175 255 196 175 255 255 180 255 255 179 255 255 176 255 255 175 255 255 175 237 206 175 255 254 171 255 224 171 255 215 172 255 233 172 255 255 171 255 220 171 255 228 171 255 255 171 255 255 163 255 255 163 255 255 166 255 255 166 255 250 171 255 255 171 255 255 169 255 255 168 255 255 165 255 255 164 255 255 169 255 255 169 255 255 170 255 255 170 255 255 166 166 166 166 161 161 161 160 160 160 165 165 165 165 165 165 168 168 168 168 168 168 169 169 169 169 169 169 165 165 165 165 165 165 165 165 165 165 165 165 161 161 161 161 161 161 160 160 160 131 131 131 131 131 131 90 90 90 90 90 90 130 130 130 130 130 130 118 118 118 118 118 118 106 106 106 106 106 106 49 49 49 49 49 49 38 38 38 38 38 38 72 72 72 72 72 72 64 64 64 64 64 64 86 86 86 86 86 86 102 102 102 102 102 102 86 86 86 86 86 86 108 108 108 108 108 108 140 140 140 140 140 140 153 153 153 152 152 152 152 152 152 152 152 152 147 147 147 147 147 147 154 154 154 154 154 154 154 154 154 154 154 154 150 150 150 150 150 150 145 145 145 145 145 145 151 151 151 151 151 151 150 150 150 150 150 150 148 148 148 148 148 148 148 148 148 148 148 148 147 147 147 147 147 147 147 147 147 147 147 147 150 150 150 149 149 149 151 151 151 151 151 151 150 150 150 150 150 150 150 150 150 150 150 150 151 151 151 151 151 151 146 146 146 146 146 146 144 144 144 144 144 144 147 147 147 146 146 146 142 142 142 141 141 141 143 143 143 142 142 142 138 138 138 138 138 138 134 134 134 134 134 134 131 131 131 131 131 131 143 143 143 142 142 142 142 142 142 146 117 146 146 117 146 143 114 143 143 114 143 143 114 143 142 114 142 139 111 139 139 111 139 140 112 140 140 112 140 140 112 140 140 112 140 140 112 140 140 112 140 134 107 134 133 107 133 136 109 136 136 109 136 140 112 140 140 112 140 138 111 138 138 110 138 +211 211 211 210 210 210 208 208 208 208 208 208 208 208 208 208 208 208 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 196 196 196 196 196 196 200 200 200 200 200 200 200 200 200 200 200 200 197 197 197 197 197 197 199 199 199 199 199 199 210 168 210 209 167 209 205 164 205 205 164 205 207 165 207 207 165 207 204 163 204 204 163 204 202 162 202 202 161 202 202 161 202 202 161 202 201 161 201 201 161 201 201 161 201 201 161 201 199 159 199 198 159 198 200 160 200 200 160 200 200 160 200 200 160 200 195 156 195 195 156 195 201 161 201 201 161 201 203 162 203 203 162 203 203 162 203 198 159 198 198 158 198 198 158 198 198 158 198 202 161 202 202 161 202 203 163 203 203 163 203 199 159 199 199 159 199 197 157 197 196 157 196 198 158 198 198 158 198 177 142 177 177 142 177 81 65 81 81 65 81 79 63 79 79 63 79 85 68 85 85 68 85 52 42 52 52 42 52 16 12 16 16 12 16 32 25 32 32 25 32 8 6 8 8 6 8 26 20 26 26 20 26 16 12 16 16 12 16 46 36 46 45 36 45 129 103 129 129 103 129 125 100 125 125 100 125 125 100 125 91 73 91 91 72 91 59 47 59 59 47 59 106 85 106 106 85 106 183 146 183 182 146 182 178 143 178 178 142 178 184 147 184 183 147 183 189 151 189 189 151 189 191 152 191 190 152 190 190 152 190 190 152 190 191 153 191 191 153 191 187 150 187 187 149 187 183 146 183 182 146 182 178 143 178 178 142 178 182 145 182 181 145 181 183 146 183 255 255 255 255 255 255 255 255 255 255 255 255 255 239 248 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 222 237 255 255 255 255 230 182 255 189 181 255 183 181 255 206 181 255 199 179 255 213 178 255 216 178 255 227 178 255 223 170 255 219 170 255 231 173 255 224 173 255 219 173 255 208 172 255 204 170 255 211 170 255 216 172 255 192 171 255 255 180 255 252 180 255 255 176 255 255 176 250 214 177 242 209 177 255 254 175 255 218 175 226 199 173 216 194 172 255 255 172 255 226 172 255 215 171 255 255 171 255 255 171 255 255 171 255 255 169 255 255 168 255 255 170 255 255 169 255 255 169 255 255 169 255 255 169 255 255 165 255 255 165 255 255 170 255 255 169 255 255 171 255 255 170 167 167 167 166 166 166 166 166 166 166 166 166 169 169 169 169 169 169 170 170 170 170 170 170 166 166 166 166 166 166 164 164 164 164 164 164 165 165 165 165 165 165 147 147 147 147 147 147 67 67 67 67 67 67 65 65 65 65 65 65 70 70 70 70 70 70 43 43 43 43 43 43 13 13 13 13 13 13 26 26 26 26 26 26 6 6 6 6 6 6 21 21 21 21 21 21 21 21 21 13 13 13 13 13 13 37 37 37 37 37 37 106 106 106 106 106 106 102 102 102 102 102 102 74 74 74 74 74 74 48 48 48 48 48 48 87 87 87 87 87 87 149 149 149 149 149 149 146 146 146 145 145 145 150 150 150 150 150 150 154 154 154 154 154 154 155 155 155 155 155 155 155 155 155 155 155 155 156 156 156 156 156 156 152 152 152 152 152 152 149 149 149 148 148 148 145 145 145 145 145 145 148 148 148 147 147 147 149 149 149 149 149 149 148 148 148 148 148 148 148 148 148 148 148 148 147 147 147 152 152 152 152 152 152 151 151 151 151 151 151 149 149 149 149 149 149 147 147 147 147 147 147 147 147 147 147 147 147 145 145 145 145 145 145 145 145 145 144 144 144 138 138 138 138 138 138 141 141 141 141 141 141 140 140 140 140 140 140 139 139 139 138 138 138 140 140 140 139 139 139 147 117 147 146 117 146 143 115 143 143 114 143 144 115 144 144 115 144 143 114 143 142 114 142 141 112 141 141 112 141 140 112 140 140 112 140 140 112 140 140 112 140 140 112 140 139 111 139 139 111 139 138 110 138 137 110 137 139 111 139 139 111 139 +209 209 209 209 209 209 208 208 208 206 206 206 206 206 206 208 208 208 208 208 208 210 210 210 210 210 210 199 199 199 199 199 199 201 201 201 201 201 201 203 203 203 202 202 202 202 202 202 202 202 202 198 198 198 198 198 198 204 163 204 204 163 204 204 163 204 203 163 203 208 166 208 207 166 207 203 162 203 203 162 203 201 160 201 200 160 200 200 160 200 202 162 202 202 162 202 202 161 202 202 161 202 208 166 208 208 166 208 205 164 205 205 164 205 205 164 205 205 164 205 203 162 203 202 162 202 198 158 198 198 158 198 200 160 200 200 160 200 202 161 202 201 161 201 201 161 201 201 161 201 205 164 205 205 164 205 205 164 205 204 163 204 202 162 202 202 161 202 202 161 202 197 158 197 197 158 197 197 158 197 197 157 197 201 161 201 201 160 201 159 127 159 159 127 159 114 91 114 114 91 114 55 44 55 55 44 55 12 9 12 12 9 12 12 9 12 12 9 12 8 6 8 8 6 8 12 9 12 12 9 12 32 25 32 32 25 32 18 14 18 18 14 18 20 16 20 20 16 20 20 16 20 92 73 92 92 73 92 77 62 77 77 62 77 53 43 53 53 43 53 79 63 79 79 63 79 35 28 35 35 28 35 49 39 49 49 39 49 29 23 29 29 23 29 57 45 57 57 45 57 116 92 116 115 92 115 141 112 141 141 112 141 187 150 187 187 150 187 193 154 193 192 154 192 192 154 192 192 153 192 192 153 192 191 153 191 191 153 191 189 151 189 189 151 189 185 148 185 184 147 184 186 149 186 186 148 186 184 147 184 255 255 255 255 233 244 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 244 253 255 255 255 255 255 255 255 255 255 255 255 255 255 243 182 255 233 180 255 233 180 255 208 181 255 194 181 255 205 181 255 196 182 255 226 182 255 195 172 255 223 172 255 202 174 255 222 173 255 223 175 255 195 175 255 230 174 255 230 174 255 205 170 255 195 170 255 255 175 255 226 175 255 255 175 255 255 174 200 189 178 245 211 177 186 180 174 255 216 173 200 186 171 207 189 171 255 223 172 233 203 172 240 206 172 203 188 172 255 255 171 255 255 176 255 255 176 255 255 174 255 250 174 255 255 173 255 255 173 255 255 171 255 255 171 255 255 167 255 255 167 255 255 168 255 255 168 255 255 169 255 255 169 255 255 169 169 169 169 172 172 172 172 172 172 171 171 171 171 171 171 169 169 169 169 169 169 165 165 165 165 165 165 164 164 164 164 164 164 164 164 164 167 167 167 167 167 167 132 132 132 132 132 132 95 95 95 94 94 94 45 45 45 45 45 45 10 10 10 10 10 10 10 10 10 10 10 10 6 6 6 6 6 6 10 10 10 9 9 9 26 26 26 26 26 26 14 14 14 14 14 14 16 16 16 16 16 16 75 75 75 75 75 75 64 64 64 63 63 63 63 63 63 44 44 44 44 44 44 65 65 65 65 65 65 29 29 29 29 29 29 40 40 40 40 40 40 24 24 24 24 24 24 46 46 46 46 46 46 94 94 94 94 94 94 115 115 115 114 114 114 152 152 152 152 152 152 157 157 157 156 156 156 156 156 156 156 156 156 156 156 156 155 155 155 154 154 154 153 153 153 153 153 153 150 150 150 150 150 150 151 151 151 151 151 151 149 149 149 149 149 149 148 148 148 148 148 148 148 148 148 148 148 148 151 151 151 150 150 150 152 152 152 151 151 151 150 150 150 149 149 149 148 148 148 148 148 148 146 146 146 146 146 146 147 147 147 147 147 147 148 148 148 148 148 148 140 140 140 140 140 140 140 140 140 141 141 141 141 141 141 142 142 142 142 142 142 142 142 142 141 141 141 138 138 138 138 138 138 142 114 142 142 114 142 142 113 142 142 113 142 144 115 144 144 115 144 141 113 141 141 113 141 139 111 139 139 111 139 140 112 140 140 112 140 140 112 140 140 112 140 144 115 144 144 115 144 142 114 142 142 114 142 142 113 142 +207 207 207 207 207 207 207 207 207 206 206 206 206 206 206 210 210 210 210 210 210 206 206 206 206 206 206 201 201 201 201 201 201 199 199 199 199 199 199 201 201 201 201 201 201 192 192 192 192 192 192 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 203 163 203 203 163 203 203 162 203 203 162 203 207 166 207 207 165 207 203 162 203 202 162 202 206 165 206 206 165 206 208 166 208 208 166 208 208 166 208 208 166 208 208 166 208 207 166 207 207 166 207 205 164 205 205 164 205 205 164 205 204 163 204 206 165 206 206 165 206 200 160 200 200 160 200 203 163 203 203 163 203 203 162 203 203 162 203 201 160 201 200 160 200 198 158 198 198 158 198 198 158 198 198 158 198 197 158 197 201 161 201 201 161 201 150 120 150 149 119 149 100 80 100 100 80 100 47 37 47 47 37 47 38 31 38 38 31 38 42 34 42 42 34 42 18 14 18 18 14 18 12 9 12 12 9 12 36 29 36 36 29 36 22 17 22 22 17 22 22 17 22 44 35 44 44 35 44 74 59 74 74 59 74 80 64 80 80 64 80 86 68 86 85 68 85 91 73 91 91 73 91 133 106 133 133 106 133 77 62 77 77 61 77 41 33 41 41 33 41 35 28 35 35 28 35 35 28 35 21 17 21 21 17 21 110 88 110 109 87 109 162 130 162 162 130 162 189 151 189 189 151 189 193 154 193 192 154 192 192 154 192 192 153 192 192 153 192 191 153 191 189 151 189 189 151 189 191 152 191 190 152 190 184 147 184 184 147 184 255 255 255 255 255 255 255 255 255 255 255 255 255 244 252 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 241 181 255 241 180 255 237 180 255 240 180 255 223 180 255 190 183 255 198 183 255 191 179 255 214 178 255 198 178 255 212 174 255 229 174 255 189 172 255 191 172 255 215 173 255 228 173 255 207 165 255 194 165 255 255 176 255 255 175 255 255 175 255 255 175 202 188 175 204 189 174 189 181 174 188 181 174 198 186 173 232 203 173 255 215 173 255 225 176 236 206 176 211 192 172 255 255 172 255 255 175 255 255 175 255 255 176 255 247 176 255 255 176 255 255 175 255 255 175 255 255 175 255 255 173 255 255 173 255 255 172 255 255 172 255 255 173 255 255 173 255 255 168 167 167 167 167 167 167 170 170 170 170 170 170 170 170 170 169 169 169 167 167 167 167 167 167 165 165 165 165 165 165 165 165 165 164 164 164 167 167 167 167 167 167 124 124 124 124 124 124 83 83 83 83 83 83 39 39 39 38 38 38 32 32 32 32 32 32 32 32 32 35 35 35 35 35 35 15 15 15 15 15 15 10 10 10 10 10 10 29 29 29 29 29 29 18 18 18 18 18 18 36 36 36 36 36 36 61 61 61 60 60 60 65 65 65 65 65 65 70 70 70 70 70 70 70 70 70 75 75 75 74 74 74 108 108 108 108 108 108 63 63 63 63 63 63 33 33 33 33 33 33 28 28 28 28 28 28 17 17 17 17 17 17 89 89 89 89 89 89 132 132 132 132 132 132 154 154 154 153 153 153 156 156 156 156 156 156 156 156 156 156 156 156 155 155 155 155 155 155 155 155 155 153 153 153 153 153 153 154 154 154 154 154 154 149 149 149 149 149 149 149 149 149 148 148 148 148 148 148 148 148 148 151 151 151 151 151 151 152 152 152 152 152 152 150 150 150 150 150 150 149 149 149 146 146 146 146 146 146 146 146 146 146 146 146 145 145 145 145 145 145 148 148 148 148 148 148 145 145 145 144 144 144 141 141 141 141 141 141 139 139 139 139 139 139 140 140 140 140 140 140 134 134 134 134 134 134 143 114 143 142 114 142 142 114 142 142 113 142 142 113 142 142 113 142 141 113 141 141 113 141 141 113 141 141 113 141 141 112 141 143 115 143 143 114 143 140 112 140 140 112 140 143 114 143 142 114 142 144 115 144 +207 207 207 207 207 207 207 207 207 209 209 209 209 209 209 209 209 209 208 208 208 193 193 193 193 193 193 189 189 189 189 189 189 188 188 188 199 199 199 199 199 199 197 197 197 197 197 197 205 164 205 205 164 205 205 164 205 205 164 205 204 163 204 204 163 204 204 163 204 204 163 204 208 166 208 208 166 208 208 166 208 208 166 208 207 166 207 205 164 205 205 164 205 205 164 205 205 164 205 202 162 202 202 162 202 202 162 202 202 161 202 202 161 202 202 161 202 201 161 201 201 161 201 201 161 201 201 161 201 201 160 201 205 164 205 205 164 205 194 155 194 194 155 194 187 150 187 187 150 187 166 133 166 166 133 166 128 103 128 128 103 128 145 116 145 145 116 145 128 102 128 128 102 128 138 110 138 138 110 138 138 110 138 144 115 144 144 115 144 47 37 47 47 37 47 34 27 34 34 27 34 12 9 12 12 9 12 22 18 22 22 17 22 30 24 30 30 24 30 12 9 12 12 9 12 26 21 26 26 21 26 26 21 26 18 14 18 18 14 18 20 16 20 20 16 20 14 11 14 14 11 14 68 54 68 68 54 68 50 40 50 50 40 50 72 57 72 72 57 72 65 52 65 65 52 65 25 20 25 25 20 25 25 20 25 37 30 37 37 30 37 91 72 91 91 72 91 21 17 21 21 17 21 29 23 29 29 23 29 108 86 108 108 86 108 174 139 174 174 139 174 187 150 187 187 150 187 187 149 187 189 151 189 188 151 188 192 154 192 192 153 192 192 153 192 191 153 191 191 153 191 191 152 191 189 151 189 188 151 188 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 193 217 255 255 255 255 255 255 255 255 255 255 255 255 255 251 255 255 255 255 255 247 185 255 241 181 255 241 181 255 241 180 255 239 180 255 228 182 255 239 181 255 208 181 255 208 181 255 200 167 255 189 167 255 211 167 255 204 163 255 196 163 255 223 172 255 211 171 255 224 169 255 225 169 255 255 176 255 255 176 255 255 176 255 255 175 204 190 175 189 182 175 204 189 175 189 182 174 233 203 174 250 214 177 245 211 177 207 192 177 255 221 176 255 233 174 221 198 174 255 255 174 255 255 174 255 255 171 255 243 171 255 255 171 255 255 171 255 255 170 255 255 170 255 255 170 255 255 170 255 255 169 255 255 169 255 255 169 255 255 172 255 255 172 163 163 163 162 162 162 157 157 157 157 157 157 139 139 139 139 139 139 107 107 107 107 107 107 121 121 121 120 120 120 106 106 106 106 106 106 106 106 106 114 114 114 114 114 114 119 119 119 119 119 119 39 39 39 39 39 39 28 28 28 28 28 28 10 10 10 10 10 10 18 18 18 18 18 18 25 25 25 25 25 25 10 10 10 10 10 10 10 10 10 21 21 21 21 21 21 14 14 14 14 14 14 16 16 16 16 16 16 11 11 11 11 11 11 55 55 55 55 55 55 41 41 41 40 40 40 58 58 58 58 58 58 58 58 58 53 53 53 53 53 53 21 21 21 21 21 21 30 30 30 30 30 30 74 74 74 74 74 74 17 17 17 17 17 17 24 24 24 23 23 23 87 87 87 87 87 87 141 141 141 141 141 141 141 141 141 152 152 152 151 151 151 153 153 153 153 153 153 155 155 155 155 155 155 155 155 155 155 155 155 154 154 154 154 154 154 152 152 152 152 152 152 152 152 152 152 152 152 148 148 148 148 148 148 148 148 148 149 149 149 149 149 149 150 150 150 150 150 150 152 152 152 151 151 151 150 150 150 149 149 149 146 146 146 146 146 146 146 146 146 145 145 145 147 147 147 147 147 147 146 146 146 146 146 146 146 146 146 135 135 135 135 135 135 132 132 132 132 132 132 139 139 139 139 139 139 137 137 137 137 137 137 143 114 143 142 114 142 142 114 142 142 114 142 142 113 142 142 113 142 141 113 141 141 113 141 141 113 141 144 115 144 144 115 144 143 115 143 143 115 143 142 113 142 141 113 141 141 113 141 +205 205 205 205 205 205 205 205 205 203 203 203 203 203 203 202 202 202 192 192 192 191 191 191 189 189 189 189 189 189 200 200 200 200 200 200 195 195 195 195 195 195 206 164 206 205 164 205 207 166 207 207 166 207 211 169 211 211 169 211 211 169 211 211 169 211 211 169 211 211 168 211 210 168 210 206 165 206 206 165 206 204 163 204 203 163 203 199 159 199 199 159 199 195 156 195 194 155 194 194 155 194 196 157 196 196 157 196 202 162 202 202 162 202 202 161 202 202 161 202 199 159 199 199 159 199 197 158 197 197 157 197 180 144 180 180 144 180 180 144 180 194 155 194 194 155 194 198 158 198 198 158 198 135 108 135 135 108 135 89 71 89 89 71 89 93 74 93 93 74 93 74 59 74 74 59 74 128 102 128 128 102 128 128 102 128 63 51 63 63 51 63 76 60 76 76 60 76 16 13 16 16 13 16 12 9 12 12 9 12 12 9 12 12 9 12 12 9 12 12 9 12 12 9 12 36 29 36 36 29 36 32 26 32 32 25 32 36 29 36 36 29 36 30 24 30 30 24 30 12 9 12 12 9 12 22 17 22 22 17 22 34 27 34 34 27 34 34 27 34 32 25 32 32 25 32 31 25 31 31 25 31 89 71 89 89 71 89 91 73 91 91 73 91 5 4 5 5 4 5 3 3 3 3 3 3 3 3 3 11 9 11 11 9 11 118 94 118 117 94 117 188 150 188 188 150 188 193 155 193 193 154 193 193 154 193 192 154 192 188 151 188 188 150 188 188 150 188 188 150 188 187 150 187 185 148 185 185 148 185 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 198 219 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 242 182 255 239 179 255 239 179 255 239 179 255 239 179 255 236 178 255 237 178 255 233 176 255 225 176 255 172 166 255 193 166 255 183 166 255 206 163 255 192 163 255 225 172 255 211 172 255 224 168 255 215 168 255 255 177 255 255 176 255 255 178 215 196 178 204 192 181 206 193 181 201 191 180 226 203 180 225 203 180 200 190 180 210 194 179 255 219 175 239 207 175 190 182 173 202 187 173 250 210 169 255 227 169 255 245 165 255 255 164 255 255 166 255 255 166 255 255 165 255 255 171 255 255 170 255 255 170 255 255 170 255 255 168 255 255 167 255 255 165 255 255 165 151 151 151 150 150 150 163 163 163 162 162 162 165 165 165 165 165 165 165 165 165 112 112 112 112 112 112 74 74 74 74 74 74 77 77 77 77 77 77 61 61 61 61 61 61 106 106 106 106 106 106 53 53 53 52 52 52 52 52 52 62 62 62 62 62 62 13 13 13 13 13 13 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 30 30 30 30 30 30 30 30 30 26 26 26 26 26 26 29 29 29 29 29 29 24 24 24 24 24 24 9 9 9 9 9 9 18 18 18 18 18 18 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 25 25 25 72 72 72 72 72 72 74 74 74 74 74 74 4 4 4 4 4 4 3 3 3 3 3 3 9 9 9 9 9 9 9 9 9 95 95 95 95 95 95 152 152 152 152 152 152 156 156 156 156 156 156 156 156 156 155 155 155 152 152 152 152 152 152 152 152 152 151 151 151 150 150 150 149 149 149 149 149 149 149 149 149 149 149 149 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 147 147 147 149 149 149 148 148 148 147 147 147 146 146 146 146 146 146 145 145 145 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 142 142 142 142 142 142 134 134 134 134 134 134 132 132 132 132 132 132 132 132 132 139 139 139 139 139 139 136 136 136 135 135 135 143 114 143 142 114 142 144 115 144 144 115 144 146 117 146 146 117 146 146 117 146 146 117 146 146 116 146 145 116 145 145 116 145 142 114 142 142 113 142 140 112 140 +206 206 206 205 205 205 203 203 203 203 203 203 192 192 192 192 192 192 190 190 190 190 190 190 200 200 200 200 200 200 196 196 196 195 195 195 206 165 206 206 165 206 206 165 206 208 166 208 208 166 208 212 169 212 212 169 212 212 169 212 211 169 211 211 169 211 211 169 211 207 165 207 207 165 207 206 165 206 204 163 204 204 163 204 200 160 200 199 159 199 195 156 195 195 156 195 197 157 197 197 157 197 203 162 203 203 162 203 203 162 203 202 162 202 202 162 202 200 160 200 200 160 200 198 158 198 197 158 197 180 144 180 180 144 180 195 156 195 195 156 195 199 159 199 198 159 198 198 159 198 135 108 135 135 108 135 89 71 89 89 71 89 93 74 93 93 74 93 74 59 74 74 59 74 128 102 128 128 102 128 128 102 128 64 51 64 64 51 64 76 61 76 76 61 76 16 13 16 16 13 16 12 9 12 12 9 12 12 9 12 12 9 12 12 9 12 12 9 12 12 9 12 36 29 36 36 29 36 32 26 32 32 26 32 36 29 36 36 29 36 30 24 30 30 24 30 12 9 12 12 9 12 12 9 12 22 17 22 22 17 22 34 27 34 34 27 34 32 25 32 32 25 32 32 25 32 32 25 32 90 72 90 89 71 89 91 73 91 91 73 91 91 73 91 5 4 5 5 4 5 3 3 3 3 3 3 11 9 11 11 9 11 118 94 118 118 94 118 189 151 189 188 151 188 188 150 188 194 155 194 193 155 193 193 154 193 193 154 193 189 151 189 189 151 189 188 151 188 188 150 188 186 149 186 186 148 186 185 148 185 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 242 182 255 240 180 255 239 180 255 239 179 255 239 179 255 238 179 255 239 178 255 236 176 255 236 176 255 217 166 255 208 166 255 207 164 255 189 164 255 175 164 255 222 173 255 227 172 255 225 168 255 207 168 255 255 177 255 255 177 255 255 178 228 203 178 187 184 182 189 185 181 196 189 181 255 226 181 233 207 180 255 222 180 255 228 180 255 255 176 255 255 176 249 211 174 181 177 173 239 204 169 255 255 169 255 229 165 245 205 165 255 255 165 255 255 166 255 255 166 255 255 171 255 255 171 255 255 170 255 255 170 255 255 168 255 255 168 255 255 166 255 255 166 255 255 165 151 151 151 151 151 151 163 163 163 162 162 162 166 166 166 165 165 165 113 113 113 113 113 113 74 74 74 74 74 74 77 77 77 77 77 77 77 77 77 62 62 62 61 61 61 106 106 106 106 106 106 53 53 53 52 52 52 63 63 63 63 63 63 13 13 13 13 13 13 13 13 13 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 30 30 30 30 30 30 26 26 26 26 26 26 29 29 29 29 29 29 29 29 29 24 24 24 24 24 24 9 9 9 9 9 9 18 18 18 18 18 18 27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 25 25 25 73 73 73 72 72 72 74 74 74 74 74 74 4 4 4 4 4 4 3 3 3 3 3 3 9 9 9 9 9 9 9 9 9 95 95 95 95 95 95 152 152 152 152 152 152 156 156 156 156 156 156 156 156 156 156 156 156 152 152 152 152 152 152 152 152 152 152 152 152 151 151 151 150 150 150 149 149 149 149 149 149 149 149 149 149 149 149 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 147 147 147 149 149 149 148 148 148 147 147 147 147 147 147 145 145 145 145 145 145 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 142 142 142 142 142 142 134 134 134 134 134 134 132 132 132 132 132 132 139 139 139 139 139 139 136 136 136 136 136 136 135 135 135 143 114 143 143 114 143 144 115 144 144 115 144 146 117 146 146 117 146 146 117 146 146 117 146 146 116 146 145 116 145 142 114 142 142 114 142 +206 206 206 206 206 206 199 199 199 199 199 199 201 201 201 201 201 201 203 203 203 203 203 203 203 203 203 203 203 203 202 202 202 207 165 207 206 165 206 211 168 211 210 168 210 212 170 212 212 170 212 210 168 210 210 168 210 210 168 210 207 166 207 207 166 207 205 164 205 205 164 205 209 167 209 209 167 209 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 203 163 203 203 162 203 201 161 201 201 161 201 199 159 199 198 159 198 198 158 198 194 155 194 194 155 194 196 156 196 195 156 195 178 143 178 178 143 178 111 89 111 111 89 111 20 16 20 20 16 20 20 16 20 33 26 33 33 26 33 22 18 22 22 18 22 29 23 29 29 23 29 79 63 79 79 63 79 95 76 95 95 76 95 95 76 95 138 111 138 138 110 138 66 52 66 66 52 66 22 18 22 22 18 22 8 6 8 8 6 8 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 8 6 8 8 6 8 18 14 18 18 14 18 42 34 42 42 34 42 42 34 42 14 11 14 14 11 14 20 16 20 20 16 20 32 25 32 32 25 32 54 43 54 54 43 54 46 37 46 46 36 46 46 36 46 110 88 110 110 88 110 82 65 82 81 65 81 61 49 61 61 49 61 11 9 11 11 9 11 1 1 1 1 1 1 1 1 1 13 11 13 13 11 13 61 48 61 61 48 61 169 135 169 169 135 169 192 153 192 192 153 192 187 150 187 187 150 187 187 150 187 189 151 189 188 151 188 184 147 184 184 147 184 186 149 186 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 225 239 255 255 255 255 255 255 255 255 255 255 248 255 255 255 255 255 255 255 255 235 177 255 235 176 255 235 176 255 237 178 255 237 178 255 244 183 255 244 183 255 239 179 255 239 178 255 229 172 255 231 172 255 232 174 255 218 174 247 168 173 255 205 175 255 232 175 255 224 174 255 229 174 255 255 178 255 255 177 255 229 181 185 183 180 182 182 182 207 194 182 199 190 181 217 198 179 255 233 179 255 244 177 255 255 177 255 255 175 255 255 174 255 255 178 255 224 177 191 182 173 255 255 173 255 223 173 255 255 173 255 255 172 255 255 172 255 255 172 255 255 171 255 255 171 255 255 169 255 255 169 255 255 169 255 255 167 255 255 166 255 255 162 255 255 162 164 164 164 163 163 163 149 149 149 149 149 149 92 92 92 92 92 92 92 92 92 17 17 17 17 17 17 27 27 27 27 27 27 19 19 19 19 19 19 24 24 24 24 24 24 65 65 65 65 65 65 65 65 65 78 78 78 78 78 78 114 114 114 114 114 114 54 54 54 54 54 54 18 18 18 18 18 18 6 6 6 6 6 6 6 6 6 1 1 1 1 1 1 1 1 1 1 1 1 6 6 6 6 6 6 15 15 15 14 14 14 34 34 34 34 34 34 34 34 34 11 11 11 11 11 11 16 16 16 16 16 16 26 26 26 26 26 26 44 44 44 44 44 44 44 44 44 37 37 37 37 37 37 89 89 89 89 89 89 66 66 66 66 66 66 50 50 50 49 49 49 9 9 9 9 9 9 9 9 9 1 1 1 1 1 1 11 11 11 11 11 11 49 49 49 49 49 49 136 136 136 136 136 136 155 155 155 154 154 154 154 154 154 151 151 151 150 150 150 152 152 152 152 152 152 148 148 148 148 148 148 149 149 149 149 149 149 150 150 150 150 150 150 150 150 150 148 148 148 148 148 148 146 146 146 146 146 146 150 150 150 150 150 150 145 145 145 145 145 145 142 142 142 142 142 142 142 142 142 143 143 143 143 143 143 147 147 147 147 147 147 144 144 144 143 143 143 139 139 139 138 138 138 138 138 138 140 140 140 139 139 139 141 141 141 141 141 141 140 140 140 140 140 140 143 114 143 143 114 143 146 116 146 145 116 145 145 116 145 146 117 146 146 117 146 145 116 145 144 115 144 143 114 143 143 114 143 +208 208 208 208 208 208 199 199 199 199 199 199 199 199 199 205 205 205 205 205 205 205 205 205 205 205 205 207 166 207 207 165 207 207 165 207 207 165 207 207 165 207 209 167 209 208 167 208 206 165 206 206 165 206 206 165 206 206 165 206 195 156 195 195 156 195 195 156 195 199 159 199 199 159 199 205 164 205 205 164 205 205 164 205 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 203 163 203 203 162 203 203 162 203 205 164 205 205 164 205 190 152 190 190 152 190 190 152 190 63 50 63 63 50 63 42 33 42 42 33 42 44 35 44 44 35 44 41 33 41 41 33 41 41 33 41 37 30 37 37 30 37 79 63 79 79 63 79 52 41 52 52 41 52 58 46 58 58 46 58 58 46 58 74 59 74 74 59 74 105 84 105 105 84 105 33 26 33 33 26 33 37 29 37 37 29 37 37 29 37 6 4 6 6 4 6 14 11 14 14 11 14 10 8 10 10 8 10 20 16 20 20 16 20 36 29 36 36 29 36 36 29 36 16 13 16 16 13 16 30 24 30 30 24 30 52 42 52 52 42 52 48 38 48 48 38 48 48 38 48 40 32 40 40 32 40 146 117 146 146 117 146 148 118 148 148 118 148 84 67 84 83 67 83 83 67 83 55 44 55 55 44 55 7 6 7 7 6 7 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 29 23 29 29 23 29 151 121 151 151 121 151 190 152 190 190 152 190 193 155 193 193 154 193 193 154 193 193 154 193 192 154 192 188 150 188 255 255 255 255 255 255 255 255 255 255 255 255 255 202 222 245 180 205 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 243 183 255 243 183 255 245 184 255 245 184 255 245 184 255 247 185 255 247 185 255 239 179 255 239 179 255 241 180 255 241 180 255 230 172 255 215 172 219 156 172 255 210 177 255 231 177 255 227 177 255 232 176 255 255 178 255 255 178 195 186 177 199 188 177 199 189 179 191 185 179 193 186 178 255 255 176 255 255 176 255 255 176 255 255 175 255 255 166 255 255 166 255 255 169 255 255 169 218 193 168 235 204 174 255 244 173 255 255 173 255 255 173 255 255 173 255 255 172 255 255 172 255 255 172 255 255 171 255 255 171 255 255 171 255 255 171 255 255 170 255 255 172 255 255 172 159 159 159 159 159 159 158 158 158 52 52 52 52 52 52 35 35 35 35 35 35 36 36 36 36 36 36 34 34 34 34 34 34 31 31 31 31 31 31 31 31 31 65 65 65 65 65 65 43 43 43 43 43 43 48 48 48 48 48 48 61 61 61 61 61 61 61 61 61 86 86 86 86 86 86 27 27 27 27 27 27 30 30 30 30 30 30 5 5 5 5 5 5 5 5 5 11 11 11 11 11 11 8 8 8 8 8 8 16 16 16 16 16 16 29 29 29 29 29 29 29 29 29 13 13 13 13 13 13 24 24 24 24 24 24 42 42 42 42 42 42 39 39 39 39 39 39 32 32 32 32 32 32 32 32 32 118 118 118 118 118 118 120 120 120 119 119 119 67 67 67 67 67 67 45 45 45 45 45 45 44 44 44 6 6 6 6 6 6 0 0 0 0 0 0 3 3 3 3 3 3 23 23 23 23 23 23 23 23 23 121 121 121 121 121 121 153 153 153 152 152 152 155 155 155 155 155 155 155 155 155 155 155 155 154 154 154 151 151 151 151 151 151 149 149 149 149 149 149 147 147 147 147 147 147 143 143 143 143 143 143 148 148 148 147 147 147 147 147 147 145 145 145 145 145 145 147 147 147 146 146 146 148 148 148 147 147 147 149 149 149 149 149 149 148 148 148 144 144 144 143 143 143 145 145 145 145 145 145 138 138 138 138 138 138 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 143 114 143 143 114 143 143 114 143 142 114 142 144 115 144 144 115 144 143 115 143 142 113 142 142 113 142 +209 209 209 204 204 204 204 204 204 206 206 206 206 206 206 208 208 208 208 208 208 210 168 210 210 168 210 210 168 210 207 166 207 207 166 207 207 166 207 207 165 207 202 162 202 202 162 202 202 162 202 206 165 206 206 165 206 206 165 206 206 165 206 206 165 206 206 164 206 206 164 206 205 164 205 205 164 205 207 166 207 207 166 207 205 164 205 205 164 205 204 163 204 204 163 204 204 163 204 204 163 204 204 163 204 202 161 202 201 161 201 208 166 208 207 166 207 89 71 89 88 71 88 19 15 19 19 15 19 19 15 19 50 40 50 50 40 50 90 72 90 90 72 90 39 31 39 39 31 39 29 23 29 29 23 29 29 23 29 39 31 39 39 31 39 62 50 62 62 50 62 110 88 110 110 88 110 110 88 110 47 38 47 47 38 47 54 43 54 54 43 54 22 18 22 22 18 22 6 4 6 6 4 6 6 4 6 4 3 4 4 3 4 8 6 8 8 6 8 6 4 6 6 4 6 82 65 82 82 65 82 81 65 81 28 22 28 28 22 28 14 11 14 14 11 14 12 9 12 12 9 12 42 34 42 42 34 42 42 34 42 36 29 36 36 29 36 20 16 20 20 16 20 46 37 46 46 37 46 108 86 108 108 86 108 108 86 108 124 99 124 124 99 124 126 100 126 125 100 125 13 11 13 13 11 13 3 3 3 3 3 3 3 3 3 7 6 7 7 6 7 5 4 5 5 4 5 29 23 29 29 23 29 29 23 29 155 124 155 155 124 155 190 152 190 190 152 190 193 154 193 193 154 193 191 153 191 190 152 190 255 255 255 255 255 255 255 255 255 255 255 255 255 202 223 219 166 197 231 173 202 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 241 181 255 246 185 255 245 184 255 248 186 255 247 186 255 247 185 255 242 181 255 242 181 255 242 181 255 241 181 255 236 177 255 224 176 209 155 178 255 197 178 255 233 177 255 234 179 255 237 179 255 255 180 255 255 180 251 215 178 202 190 178 199 188 177 189 183 177 255 228 177 255 255 173 255 255 173 255 255 176 255 255 176 255 255 175 255 255 175 255 255 175 255 255 175 255 255 174 179 177 174 233 203 174 255 236 175 255 255 175 255 255 173 255 255 173 255 255 172 255 255 172 255 255 172 255 255 172 255 255 171 255 255 169 255 255 169 255 255 174 255 255 174 173 173 173 74 74 74 74 74 74 15 15 15 15 15 15 42 42 42 42 42 42 75 75 75 75 75 75 75 75 75 33 33 33 33 33 33 24 24 24 24 24 24 32 32 32 32 32 32 51 51 51 51 51 51 51 51 51 91 91 91 91 91 91 39 39 39 39 39 39 44 44 44 44 44 44 44 44 44 18 18 18 18 18 18 5 5 5 5 5 5 3 3 3 3 3 3 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 66 66 66 66 66 66 23 23 23 23 23 23 11 11 11 11 11 11 11 11 11 9 9 9 9 9 9 34 34 34 34 34 34 29 29 29 29 29 29 16 16 16 16 16 16 16 16 16 37 37 37 37 37 37 87 87 87 87 87 87 100 100 100 100 100 100 101 101 101 101 101 101 101 101 101 11 11 11 11 11 11 3 3 3 3 3 3 6 6 6 6 6 6 6 6 6 4 4 4 4 4 4 23 23 23 23 23 23 124 124 124 124 124 124 152 152 152 152 152 152 152 152 152 155 155 155 155 155 155 153 153 153 152 152 152 152 152 152 152 152 152 149 149 149 148 148 148 148 148 148 147 147 147 146 146 146 145 145 145 144 144 144 135 135 135 135 135 135 145 145 145 145 145 145 145 145 145 148 148 148 148 148 148 149 149 149 149 149 149 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 141 141 141 141 141 141 142 142 142 142 142 142 144 144 144 143 143 143 145 116 145 145 116 145 144 115 144 143 114 143 142 114 142 142 114 142 142 114 142 139 111 139 +209 209 209 204 204 204 204 204 204 204 204 204 208 208 208 208 208 208 210 168 210 210 168 210 208 166 208 208 166 208 208 166 208 207 166 207 207 166 207 207 166 207 207 166 207 211 169 211 211 169 211 211 169 211 211 169 211 211 168 211 213 170 213 213 170 213 212 170 212 212 170 212 206 164 206 206 164 206 210 168 210 210 168 210 209 167 209 211 169 211 211 169 211 203 162 203 202 162 202 202 162 202 202 162 202 202 161 202 191 153 191 191 153 191 36 28 36 36 28 36 38 30 38 38 30 38 82 66 82 82 66 82 82 66 82 44 35 44 44 35 44 92 74 92 92 74 92 63 50 63 63 50 63 63 50 63 88 70 88 88 70 88 67 53 67 67 53 67 39 31 39 39 31 39 102 81 102 102 81 102 102 81 102 72 58 72 72 58 72 43 34 43 43 34 43 14 11 14 14 11 14 14 11 14 84 67 84 84 67 84 16 13 16 16 13 16 18 14 18 18 14 18 34 27 34 34 27 34 34 27 34 71 57 71 71 57 71 26 21 26 26 21 26 36 29 36 36 29 36 36 29 36 63 50 63 63 50 63 46 37 46 46 37 46 28 22 28 28 22 28 28 22 28 18 14 18 18 14 18 28 22 28 28 22 28 46 37 46 46 36 46 66 53 66 66 52 66 66 52 66 42 33 42 41 33 41 25 20 25 25 20 25 39 31 39 39 31 39 39 31 39 11 9 11 11 9 11 7 6 7 7 6 7 43 34 43 43 34 43 190 152 190 190 152 190 190 152 190 194 155 194 193 155 193 193 154 193 193 154 193 191 152 191 255 255 255 255 255 255 255 255 255 255 227 240 220 168 200 224 170 201 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 246 185 255 243 183 255 243 183 255 248 186 255 247 186 255 247 186 255 247 186 255 247 185 255 237 178 255 237 177 255 241 181 255 241 181 255 182 177 229 162 176 255 206 176 255 236 179 255 240 179 255 255 181 255 234 181 188 183 178 230 204 178 197 188 178 236 207 178 255 255 177 255 243 177 255 255 177 255 255 180 255 255 180 255 250 180 255 218 179 249 214 179 255 255 181 255 255 180 255 255 180 195 187 180 255 255 174 255 255 174 255 255 173 255 255 177 255 255 176 255 255 178 255 255 178 255 255 170 255 255 170 255 255 170 255 255 169 255 255 169 255 255 160 255 255 160 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 68 68 68 68 68 68 36 36 36 36 36 36 77 77 77 76 76 76 52 52 52 52 52 52 52 52 52 72 72 72 72 72 72 55 55 55 55 55 55 32 32 32 32 32 32 32 32 32 84 84 84 84 84 84 59 59 59 59 59 59 35 35 35 35 35 35 11 11 11 11 11 11 11 11 11 69 69 69 69 69 69 13 13 13 13 13 13 15 15 15 15 15 15 15 15 15 28 28 28 28 28 28 58 58 58 58 58 58 21 21 21 21 21 21 21 21 21 29 29 29 29 29 29 51 51 51 51 51 51 37 37 37 37 37 37 22 22 22 22 22 22 22 22 22 14 14 14 14 14 14 22 22 22 22 22 22 37 37 37 37 37 37 37 37 37 53 53 53 53 53 53 33 33 33 33 33 33 20 20 20 20 20 20 31 31 31 31 31 31 31 31 31 9 9 9 9 9 9 6 6 6 6 6 6 34 34 34 34 34 34 34 34 34 152 152 152 152 152 152 155 155 155 155 155 155 155 155 155 154 154 154 152 152 152 152 152 152 152 152 152 147 147 147 147 147 147 150 150 150 150 150 150 146 146 146 146 146 146 146 146 146 144 144 144 144 144 144 148 148 148 148 148 148 146 146 146 146 146 146 149 149 149 149 149 149 149 149 149 148 148 148 148 148 148 142 142 142 142 142 142 145 145 145 144 144 144 144 144 144 141 141 141 141 141 141 144 144 144 143 143 143 145 116 145 145 116 145 143 114 143 143 114 143 143 114 143 142 114 142 +205 205 205 205 205 205 209 209 209 209 209 209 211 169 211 211 168 211 208 167 208 208 167 208 208 166 208 208 166 208 208 166 208 208 166 208 208 166 208 212 169 212 212 169 212 212 169 212 211 169 211 211 169 211 213 171 213 213 170 213 213 170 213 213 170 213 213 170 213 206 165 206 206 165 206 210 168 210 210 168 210 212 169 212 212 169 212 212 169 212 203 162 203 203 162 203 203 162 203 203 162 203 192 153 192 192 153 192 191 153 191 36 28 36 36 28 36 38 30 38 38 30 38 82 66 82 82 66 82 82 66 82 44 35 44 44 35 44 93 74 93 93 74 93 63 50 63 63 50 63 88 70 88 88 70 88 88 70 88 67 53 67 67 53 67 39 31 39 39 31 39 102 82 102 102 82 102 102 82 102 73 58 73 73 58 73 43 35 43 43 35 43 14 11 14 14 11 14 14 11 14 85 68 85 85 68 85 16 13 16 16 13 16 18 14 18 18 14 18 18 14 18 35 28 35 35 28 35 72 57 72 71 57 71 26 21 26 26 21 26 26 21 26 36 29 36 36 29 36 63 50 63 63 50 63 46 37 46 46 37 46 28 22 28 28 22 28 28 22 28 18 14 18 18 14 18 28 22 28 28 22 28 46 37 46 46 37 46 46 37 46 66 53 66 66 53 66 42 33 42 42 33 42 26 20 26 25 20 25 25 20 25 39 31 39 39 31 39 11 9 11 11 9 11 7 6 7 7 6 7 7 6 7 43 34 43 43 34 43 191 153 191 191 152 191 194 155 194 194 155 194 194 155 194 194 155 194 193 155 193 191 153 191 255 255 255 255 255 255 255 255 255 212 163 195 255 225 240 228 173 203 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 245 186 255 244 184 255 244 183 255 246 187 255 243 187 255 247 186 255 248 186 255 248 186 255 237 178 255 237 178 255 242 181 255 242 181 255 234 177 213 156 177 255 174 176 255 236 180 255 239 180 255 255 181 201 191 181 184 181 179 188 183 179 255 243 178 255 255 178 255 255 178 255 237 177 255 255 177 255 255 181 255 255 180 255 230 180 255 251 180 255 231 179 255 232 181 255 255 181 255 255 180 255 253 180 255 255 180 255 255 174 255 255 174 255 255 177 255 255 177 255 255 178 255 255 178 255 255 171 255 255 170 255 255 170 255 255 170 255 255 170 255 255 160 255 255 160 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 68 68 68 68 68 68 36 36 36 36 36 36 36 36 36 77 77 77 77 77 77 52 52 52 52 52 52 73 73 73 73 73 73 72 72 72 55 55 55 55 55 55 32 32 32 32 32 32 84 84 84 84 84 84 84 84 84 59 59 59 59 59 59 35 35 35 35 35 35 11 11 11 11 11 11 11 11 11 69 69 69 69 69 69 13 13 13 13 13 13 15 15 15 15 15 15 28 28 28 28 28 28 28 28 28 58 58 58 58 58 58 21 21 21 21 21 21 29 29 29 29 29 29 29 29 29 51 51 51 51 51 51 37 37 37 37 37 37 22 22 22 22 22 22 22 22 22 14 14 14 14 14 14 22 22 22 22 22 22 37 37 37 37 37 37 37 37 37 53 53 53 53 53 53 33 33 33 33 33 33 20 20 20 20 20 20 20 20 20 31 31 31 31 31 31 9 9 9 9 9 9 6 6 6 6 6 6 34 34 34 34 34 34 34 34 34 152 152 152 152 152 152 155 155 155 155 155 155 155 155 155 155 155 155 154 154 154 153 153 153 152 152 152 147 147 147 147 147 147 150 150 150 150 150 150 150 150 150 146 146 146 146 146 146 144 144 144 144 144 144 149 149 149 148 148 148 148 148 148 146 146 146 146 146 146 149 149 149 149 149 149 149 149 149 148 148 148 148 148 148 142 142 142 142 142 142 145 145 145 144 144 144 141 141 141 141 141 141 141 141 141 144 144 144 144 144 144 145 116 145 145 116 145 143 114 143 143 114 143 +209 209 209 209 209 209 216 172 216 216 172 216 215 172 215 215 172 215 215 172 215 211 168 211 211 168 211 210 168 210 208 166 208 208 166 208 210 168 210 210 168 210 214 171 214 214 171 214 214 171 214 214 171 214 214 171 214 211 169 211 211 169 211 209 167 209 209 167 209 209 167 209 208 167 208 208 167 208 212 170 212 212 170 212 210 168 210 210 168 210 210 168 210 203 162 203 203 162 203 130 104 130 130 104 130 25 20 25 25 20 25 25 20 25 17 13 17 17 13 17 83 66 83 82 66 82 53 42 53 53 42 53 53 42 53 74 59 74 74 59 74 91 72 91 90 72 90 73 59 73 73 59 73 73 59 73 92 74 92 92 74 92 73 58 73 73 58 73 46 36 46 46 36 46 46 36 46 77 62 77 77 61 77 112 90 112 112 90 112 8 6 8 8 6 8 8 6 8 24 19 24 24 19 24 4 3 4 4 3 4 22 18 22 22 18 22 22 18 22 35 28 35 35 28 35 57 46 57 57 46 57 105 84 105 104 83 104 104 83 104 39 31 39 38 31 38 100 80 100 100 80 100 47 37 47 46 37 46 46 37 46 63 50 63 63 50 63 50 40 50 50 40 50 42 34 42 42 34 42 42 34 42 60 48 60 60 48 60 106 85 106 106 85 106 44 35 44 44 35 44 44 35 44 38 30 38 38 30 38 20 16 20 19 15 19 19 15 19 27 22 27 27 22 27 23 19 23 23 19 23 7 6 7 7 6 7 7 6 7 116 93 116 116 93 116 193 154 193 193 154 193 194 155 194 194 155 194 194 155 194 190 152 190 255 255 255 255 255 255 255 232 245 213 164 198 255 255 255 212 164 198 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 244 184 255 244 184 255 244 184 255 250 189 255 248 189 255 247 187 255 246 187 255 248 186 255 248 186 255 247 186 255 242 182 255 242 181 255 239 181 255 223 181 239 168 181 255 225 180 255 239 180 255 255 185 208 197 185 190 187 185 233 209 185 255 255 184 255 248 180 255 255 180 255 255 178 255 255 178 255 255 179 255 255 179 255 236 179 255 224 182 255 236 182 255 255 181 255 255 181 255 255 179 255 255 179 255 255 179 255 255 176 255 255 176 255 255 176 255 255 176 255 255 179 255 255 179 255 255 178 255 255 176 255 255 176 255 255 170 255 255 170 253 181 109 247 178 109 108 108 108 21 21 21 21 21 21 14 14 14 14 14 14 69 69 69 69 69 69 68 68 68 44 44 44 44 44 44 61 61 61 61 61 61 75 75 75 75 75 75 75 75 75 61 61 61 60 60 60 76 76 76 76 76 76 76 76 76 60 60 60 60 60 60 37 37 37 37 37 37 63 63 63 63 63 63 63 63 63 92 92 92 92 92 92 6 6 6 6 6 6 20 20 20 20 20 20 20 20 20 3 3 3 3 3 3 18 18 18 18 18 18 28 28 28 28 28 28 28 28 28 46 46 46 46 46 46 85 85 85 84 84 84 31 31 31 31 31 31 31 31 31 81 81 81 80 80 80 37 37 37 37 37 37 50 50 50 50 50 50 50 50 50 40 40 40 40 40 40 34 34 34 34 34 34 48 48 48 48 48 48 48 48 48 85 85 85 85 85 85 35 35 35 35 35 35 30 30 30 30 30 30 30 30 30 16 16 16 15 15 15 22 22 22 22 22 22 19 19 19 19 19 19 19 19 19 6 6 6 6 6 6 93 93 93 93 93 93 154 154 154 154 154 154 153 153 153 155 155 155 155 155 155 151 151 151 151 151 151 149 149 149 149 149 149 149 149 149 150 150 150 150 150 150 151 151 151 151 151 151 151 151 151 151 151 151 150 150 150 147 147 147 147 147 147 147 147 147 146 146 146 151 151 151 151 151 151 150 150 150 149 149 149 149 149 149 148 148 148 148 148 148 145 145 145 145 145 145 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 148 118 148 148 118 148 +203 203 203 216 173 216 216 173 216 216 173 216 216 172 216 216 172 216 215 172 215 215 172 215 209 167 209 209 167 209 208 167 208 208 167 208 208 166 208 210 168 210 210 168 210 210 168 210 210 168 210 212 169 212 212 169 212 212 169 212 214 171 214 213 171 213 211 169 211 211 169 211 211 169 211 211 168 211 211 168 211 210 168 210 210 168 210 189 151 189 189 151 189 188 151 188 66 53 66 66 53 66 27 22 27 27 22 27 25 20 25 25 20 25 25 20 25 59 47 59 59 47 59 53 42 53 53 42 53 87 69 87 87 69 87 87 69 87 114 91 114 114 91 114 59 47 59 59 47 59 59 47 59 54 43 54 54 43 54 71 57 71 71 57 71 54 43 54 54 43 54 54 43 54 100 80 100 100 80 100 119 95 119 119 95 119 10 8 10 10 8 10 10 8 10 6 5 6 6 5 6 10 8 10 10 8 10 24 19 24 24 19 24 24 19 24 58 46 58 58 46 58 62 49 62 62 49 62 61 49 61 41 33 41 41 32 41 41 32 41 41 32 41 43 34 43 43 34 43 43 34 43 14 11 14 14 11 14 44 35 44 44 35 44 69 55 69 69 55 69 69 55 69 77 61 77 77 61 77 40 32 40 40 32 40 40 32 40 30 24 30 30 24 30 6 4 6 6 4 6 4 3 4 4 3 4 4 3 4 0 0 0 0 0 0 4 3 4 3 3 3 7 6 7 7 6 7 7 6 7 7 6 7 7 6 7 35 28 35 35 28 35 178 142 178 177 142 177 177 142 177 193 154 193 192 154 192 190 152 190 190 152 190 255 255 255 255 255 255 255 255 255 227 172 203 255 255 255 255 251 255 229 174 207 255 255 255 255 243 254 255 255 255 255 255 255 255 255 255 255 245 185 255 244 184 255 244 184 255 249 188 255 249 188 255 243 183 255 242 183 255 243 183 255 243 183 255 243 182 255 243 182 255 242 182 255 238 180 255 235 179 230 164 179 255 204 175 255 208 175 255 254 186 203 194 186 190 188 185 255 255 185 255 255 185 255 255 184 255 255 184 255 255 178 255 255 178 255 255 178 255 246 178 255 255 177 255 255 179 255 255 179 255 255 178 255 255 178 255 255 178 255 255 179 255 240 179 255 255 181 255 255 180 255 255 178 255 255 178 255 255 178 255 255 177 255 255 177 255 255 177 255 255 176 255 255 158 255 255 158 255 255 158 126 91 55 55 55 55 23 23 23 23 23 23 23 23 23 21 21 21 21 21 21 49 49 49 49 49 49 44 44 44 44 44 44 44 44 44 72 72 72 72 72 72 94 94 94 94 94 94 48 48 48 48 48 48 48 48 48 45 45 45 45 45 45 58 58 58 58 58 58 44 44 44 44 44 44 44 44 44 82 82 82 82 82 82 97 97 97 97 97 97 97 97 97 8 8 8 8 8 8 5 5 5 5 5 5 8 8 8 8 8 8 8 8 8 20 20 20 20 20 20 47 47 47 47 47 47 50 50 50 50 50 50 50 50 50 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 11 11 11 11 11 11 36 36 36 36 36 36 36 36 36 55 55 55 55 55 55 62 62 62 61 61 61 32 32 32 32 32 32 32 32 32 24 24 24 24 24 24 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 6 6 6 6 6 6 6 6 6 6 6 6 28 28 28 28 28 28 28 28 28 141 141 141 141 141 141 153 153 153 153 153 153 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 149 149 149 149 149 149 153 153 153 153 153 153 153 153 153 151 151 151 151 151 151 147 147 147 147 147 147 147 147 147 147 147 147 146 146 146 149 149 149 149 149 149 146 146 146 146 146 146 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 143 143 143 143 143 143 143 143 143 139 139 139 139 139 139 148 118 148 +217 173 217 216 173 216 216 173 216 216 173 216 216 173 216 216 173 216 209 167 209 209 167 209 209 167 209 209 167 209 209 167 209 211 169 211 211 168 211 211 168 211 210 168 210 210 168 210 212 170 212 212 170 212 214 171 214 214 171 214 214 171 214 212 169 212 211 169 211 211 169 211 211 169 211 211 169 211 211 169 211 211 169 211 189 151 189 189 151 189 66 53 66 66 53 66 66 53 66 27 22 27 27 22 27 25 20 25 25 20 25 59 47 59 59 47 59 59 47 59 53 42 53 53 42 53 87 69 87 87 69 87 87 69 87 114 91 114 114 91 114 59 47 59 59 47 59 55 44 55 55 44 55 55 44 55 71 57 71 71 57 71 54 43 54 54 43 54 54 43 54 101 80 101 101 80 101 119 95 119 119 95 119 10 8 10 10 8 10 10 8 10 6 5 6 6 5 6 10 8 10 10 8 10 10 8 10 25 20 25 24 19 24 58 46 58 58 46 58 62 49 62 62 49 62 62 49 62 41 33 41 41 33 41 41 33 41 41 33 41 41 32 41 43 34 43 43 34 43 14 11 14 14 11 14 45 36 45 45 36 45 45 36 45 69 55 69 69 55 69 77 62 77 77 61 77 77 61 77 40 32 40 40 32 40 30 24 30 30 24 30 6 4 6 6 4 6 6 4 6 4 3 4 4 3 4 0 0 0 0 0 0 0 0 0 4 3 4 4 3 4 8 6 8 7 6 7 7 6 7 7 6 7 7 6 7 35 28 35 35 28 35 178 142 178 178 142 178 193 155 193 193 154 193 193 154 193 191 152 191 190 152 190 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 202 226 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 245 185 255 245 185 255 245 185 255 249 188 255 249 188 255 244 184 255 244 184 255 243 183 255 243 183 255 243 183 255 243 183 255 243 182 255 240 180 255 239 180 255 192 180 255 174 176 255 202 175 239 213 186 196 191 186 201 193 186 255 255 185 255 255 185 255 255 185 255 255 185 255 255 179 255 255 178 255 255 178 255 255 178 255 255 178 255 255 179 255 255 179 255 221 179 255 255 178 255 255 178 255 255 180 255 249 179 255 255 181 255 255 181 255 255 180 255 255 178 255 255 178 255 255 178 255 255 177 255 255 177 255 255 177 255 255 177 255 255 158 255 255 158 126 91 55 55 55 55 55 55 55 23 23 23 23 23 23 21 21 21 21 21 21 49 49 49 49 49 49 49 49 49 44 44 44 44 44 44 72 72 72 72 72 72 94 94 94 94 94 94 94 94 94 49 49 49 48 48 48 45 45 45 45 45 45 45 45 45 59 59 59 58 58 58 45 45 45 44 44 44 82 82 82 82 82 82 82 82 82 97 97 97 97 97 97 8 8 8 8 8 8 8 8 8 5 5 5 5 5 5 8 8 8 8 8 8 20 20 20 20 20 20 20 20 20 47 47 47 47 47 47 50 50 50 50 50 50 50 50 50 33 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 34 34 34 11 11 11 11 11 11 36 36 36 36 36 36 36 36 36 55 55 55 55 55 55 62 62 62 62 62 62 32 32 32 32 32 32 32 32 32 24 24 24 24 24 24 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 28 28 28 28 28 28 141 141 141 141 141 141 154 154 154 153 153 153 153 153 153 151 151 151 151 151 151 151 151 151 151 151 151 149 149 149 149 149 149 149 149 149 153 153 153 153 153 153 151 151 151 151 151 151 151 151 151 147 147 147 147 147 147 147 147 147 147 147 147 150 150 150 149 149 149 149 149 149 146 146 146 146 146 146 146 146 146 145 145 145 145 145 145 145 145 145 145 145 145 143 143 143 143 143 143 140 140 140 139 139 139 +217 173 217 217 173 217 217 173 217 216 173 216 216 173 216 214 171 214 214 171 214 216 173 216 216 173 216 216 172 216 216 172 216 215 172 215 215 172 215 215 172 215 215 172 215 215 172 215 215 172 215 215 172 215 214 171 214 214 171 214 214 171 214 214 171 214 210 168 210 209 167 209 181 145 181 181 145 181 181 145 181 125 100 125 125 100 125 99 79 99 99 79 99 17 13 17 17 13 17 17 13 17 23 18 23 23 18 23 12 10 12 12 10 12 12 10 12 55 44 55 55 44 55 57 46 57 57 46 57 68 54 68 68 54 68 68 54 68 95 76 95 95 76 95 31 25 31 31 25 31 31 25 31 65 52 65 65 52 65 55 44 55 54 43 54 54 43 54 82 65 82 82 65 82 105 84 105 105 84 105 8 6 8 8 6 8 8 6 8 12 10 12 12 10 12 31 25 31 31 25 31 31 25 31 16 13 16 16 13 16 68 55 68 68 54 68 68 54 68 45 36 45 45 36 45 51 41 51 51 41 51 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 35 28 35 34 27 34 34 27 34 57 46 57 57 45 57 40 32 40 40 32 40 65 52 65 65 52 65 65 52 65 26 21 26 26 21 26 6 4 6 6 4 6 6 4 6 0 0 0 0 0 0 8 6 8 8 6 8 8 6 8 36 29 36 36 28 36 10 8 10 10 8 10 8 6 8 8 6 8 8 6 8 17 14 17 17 14 17 1 1 1 1 1 1 1 1 1 97 77 97 97 77 97 192 153 192 191 153 191 191 153 191 191 153 191 191 153 191 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 207 230 255 255 255 255 191 218 255 255 255 255 255 255 255 255 255 255 248 187 255 247 187 255 253 191 255 252 191 255 252 190 255 244 184 255 244 184 255 236 178 255 236 178 255 236 177 255 243 183 255 243 183 255 243 182 255 242 182 255 227 182 190 146 176 255 212 176 197 192 187 199 193 186 255 239 186 255 255 186 255 246 186 255 255 185 255 255 185 255 255 183 255 255 183 255 255 182 255 255 184 255 255 184 255 255 183 255 227 183 231 207 183 255 238 183 255 255 182 255 255 182 255 255 182 255 255 181 255 255 181 255 255 181 255 255 181 255 255 180 255 255 176 255 255 176 255 255 176 255 255 152 255 248 152 240 172 104 227 166 104 192 137 82 194 138 82 82 82 82 14 14 14 14 14 14 19 19 19 19 19 19 19 19 19 10 10 10 10 10 10 46 46 46 46 46 46 45 45 45 47 47 47 47 47 47 56 56 56 56 56 56 78 78 78 78 78 78 78 78 78 26 26 26 26 26 26 53 53 53 53 53 53 53 53 53 45 45 45 44 44 44 67 67 67 67 67 67 67 67 67 85 85 85 85 85 85 6 6 6 6 6 6 10 10 10 10 10 10 10 10 10 25 25 25 25 25 25 13 13 13 13 13 13 13 13 13 55 55 55 55 55 55 36 36 36 36 36 36 41 41 41 41 41 41 41 41 41 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 28 28 28 28 28 28 46 46 46 46 46 46 46 46 46 32 32 32 32 32 32 52 52 52 52 52 52 21 21 21 21 21 21 21 21 21 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 6 6 6 6 6 6 28 28 28 28 28 28 28 28 28 8 8 8 7 7 7 6 6 6 6 6 6 14 14 14 14 14 14 14 14 14 1 1 1 1 1 1 77 77 77 77 77 77 77 77 77 152 152 152 152 152 152 152 152 152 151 151 151 151 151 151 151 151 151 151 151 151 152 152 152 152 152 152 153 153 153 153 153 153 153 153 153 151 151 151 151 151 151 148 148 148 147 147 147 147 147 147 148 148 148 148 148 148 151 151 151 151 151 151 146 146 146 146 146 146 146 146 146 141 141 141 141 141 141 145 145 145 145 145 145 145 145 145 145 145 145 144 144 144 +217 174 217 217 173 217 217 173 217 217 173 217 217 173 217 216 173 216 216 173 216 216 173 216 216 173 216 216 173 216 216 173 216 216 172 216 216 172 216 215 172 215 215 172 215 215 172 215 215 172 215 215 172 215 215 172 215 215 172 215 212 170 212 212 170 212 212 170 212 190 152 190 190 152 190 190 152 190 190 152 190 190 152 190 95 76 95 94 75 94 6 5 6 6 5 6 6 5 6 51 41 51 51 41 51 8 6 8 8 6 8 32 25 32 32 25 32 32 25 32 62 49 62 62 49 62 32 25 32 32 25 32 32 25 32 42 34 42 42 34 42 59 47 59 59 47 59 59 47 59 38 30 38 38 30 38 59 47 59 59 47 59 59 47 59 110 88 110 109 87 109 95 76 95 95 76 95 10 8 10 10 8 10 10 8 10 8 6 8 8 6 8 33 26 33 33 26 33 33 26 33 27 21 27 27 21 27 79 63 79 79 63 79 79 63 79 27 21 27 27 21 27 76 61 76 76 61 76 76 61 76 49 39 49 49 39 49 26 21 26 26 21 26 90 72 90 90 72 90 90 72 90 32 26 32 32 26 32 24 19 24 24 19 24 24 19 24 18 14 18 18 14 18 16 13 16 16 13 16 16 13 16 8 6 8 8 6 8 4 3 4 4 3 4 4 3 4 6 4 6 6 4 6 28 22 28 28 22 28 28 22 28 20 16 20 20 16 20 8 6 8 8 6 8 8 6 8 8 6 8 8 6 8 3 3 3 3 3 3 35 28 35 35 28 35 35 28 35 194 155 194 194 155 194 196 156 196 195 156 195 195 156 195 255 255 255 255 255 255 255 255 255 255 199 225 255 255 255 255 255 255 255 255 255 222 170 204 255 203 227 255 255 255 255 255 255 255 255 255 255 248 188 255 248 188 255 250 189 255 250 189 255 250 189 255 245 185 255 244 184 255 236 178 255 236 178 255 236 178 255 244 183 255 243 183 255 243 183 255 243 183 255 237 182 236 169 186 255 176 186 197 192 187 235 211 187 255 255 187 255 255 186 255 253 186 255 255 186 255 255 186 255 255 185 255 255 185 255 255 185 255 255 184 255 255 184 255 233 184 226 205 184 255 255 183 255 236 183 255 255 183 255 255 182 255 255 182 255 242 182 255 255 182 255 255 181 255 255 181 255 255 181 255 255 179 255 255 178 255 255 178 255 255 160 255 255 159 255 255 159 255 255 159 255 255 159 187 133 79 79 79 79 5 5 5 5 5 5 5 5 5 42 42 42 42 42 42 7 7 7 7 7 7 7 7 7 26 26 26 26 26 26 51 51 51 51 51 51 26 26 26 26 26 26 26 26 26 35 35 35 35 35 35 49 49 49 48 48 48 48 48 48 31 31 31 31 31 31 48 48 48 48 48 48 48 48 48 89 89 89 89 89 89 77 77 77 77 77 77 77 77 77 8 8 8 8 8 8 6 6 6 6 6 6 6 6 6 27 27 27 27 27 27 22 22 22 22 22 22 64 64 64 64 64 64 64 64 64 21 21 21 21 21 21 62 62 62 61 61 61 61 61 61 40 40 40 40 40 40 21 21 21 21 21 21 21 21 21 72 72 72 72 72 72 26 26 26 26 26 26 26 26 26 19 19 19 19 19 19 14 14 14 14 14 14 13 13 13 13 13 13 13 13 13 6 6 6 6 6 6 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 22 22 22 22 22 22 22 22 22 16 16 16 15 15 15 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 3 3 3 3 3 3 28 28 28 28 28 28 28 28 28 154 154 154 154 154 154 155 155 155 155 155 155 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 152 152 152 151 151 151 150 150 150 149 149 149 148 148 148 150 150 150 150 150 150 149 149 149 146 146 146 146 146 146 141 141 141 141 141 141 141 141 141 145 145 145 145 145 145 145 145 145 +217 174 217 217 174 217 217 174 217 217 173 217 217 173 217 217 173 217 217 173 217 216 173 216 216 173 216 216 173 216 216 173 216 216 173 216 216 173 216 216 172 216 216 172 216 215 172 215 215 172 215 215 172 215 215 172 215 213 170 213 213 170 213 191 152 191 191 152 191 190 152 190 190 152 190 190 152 190 95 76 95 95 76 95 95 76 95 6 5 6 6 5 6 51 41 51 51 41 51 51 41 51 8 6 8 8 6 8 32 25 32 32 25 32 32 25 32 62 49 62 62 49 62 32 25 32 32 25 32 32 25 32 42 34 42 42 34 42 59 47 59 59 47 59 59 47 59 38 30 38 38 30 38 59 47 59 59 47 59 59 47 59 110 88 110 110 88 110 95 76 95 95 76 95 10 8 10 10 8 10 10 8 10 8 6 8 8 6 8 33 26 33 33 26 33 33 26 33 27 21 27 27 21 27 79 63 79 79 63 79 79 63 79 27 21 27 27 21 27 77 61 77 77 61 77 77 61 77 49 39 49 49 39 49 26 21 26 26 21 26 26 21 26 91 72 91 90 72 90 33 26 33 33 26 33 32 26 32 24 19 24 24 19 24 18 14 18 18 14 18 18 14 18 16 13 16 16 13 16 8 6 8 8 6 8 8 6 8 4 3 4 4 3 4 6 4 6 6 4 6 6 4 6 28 22 28 28 22 28 20 16 20 20 16 20 8 6 8 8 6 8 8 6 8 8 6 8 8 6 8 4 3 4 4 3 4 3 3 3 35 28 35 35 28 35 195 156 195 195 156 195 194 155 194 196 157 196 196 157 196 196 156 196 255 255 255 255 255 255 255 255 255 255 241 254 255 254 255 255 255 255 255 255 255 210 164 200 255 194 221 255 255 255 255 255 255 255 255 255 255 255 255 255 248 188 255 251 190 255 250 189 255 250 189 255 245 185 255 245 185 255 235 179 255 236 178 255 235 178 255 243 184 255 244 183 255 243 183 255 243 183 255 241 183 255 204 186 255 187 186 231 209 188 243 215 187 255 250 187 255 237 187 255 255 187 255 253 186 255 255 186 255 255 186 255 255 185 255 255 185 255 255 185 255 255 185 255 255 184 255 251 184 255 255 184 255 255 183 255 255 183 255 255 183 255 255 183 255 255 182 255 255 182 255 255 182 255 255 181 255 255 181 255 255 181 255 255 179 255 255 179 255 255 160 255 255 160 255 255 159 255 255 159 255 255 159 187 133 79 79 79 79 79 79 79 5 5 5 5 5 5 43 43 43 43 43 43 42 42 42 7 7 7 7 7 7 26 26 26 26 26 26 26 26 26 51 51 51 51 51 51 26 26 26 26 26 26 35 35 35 35 35 35 35 35 35 49 49 49 49 49 49 31 31 31 31 31 31 31 31 31 48 48 48 48 48 48 90 90 90 89 89 89 89 89 89 77 77 77 77 77 77 8 8 8 8 8 8 8 8 8 6 6 6 6 6 6 27 27 27 27 27 27 27 27 27 22 22 22 22 22 22 64 64 64 64 64 64 64 64 64 21 21 21 21 21 21 62 62 62 62 62 62 61 61 61 40 40 40 40 40 40 21 21 21 21 21 21 21 21 21 72 72 72 72 72 72 26 26 26 26 26 26 26 26 26 19 19 19 19 19 19 14 14 14 14 14 14 13 13 13 13 13 13 13 13 13 6 6 6 6 6 6 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 22 22 22 22 22 22 22 22 22 16 16 16 16 16 16 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 3 3 3 3 3 3 3 3 3 28 28 28 28 28 28 154 154 154 154 154 154 154 154 154 155 155 155 155 155 155 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 151 151 151 151 151 151 150 150 150 149 149 149 148 148 148 150 150 150 150 150 150 146 146 146 146 146 146 146 146 146 141 141 141 141 141 141 145 145 145 145 145 145 +218 174 218 217 174 217 217 174 217 217 174 217 217 174 217 217 173 217 217 173 217 217 173 217 217 173 217 217 173 217 216 173 216 216 173 216 214 171 214 214 171 214 214 171 214 214 171 214 213 171 213 213 171 213 213 170 213 213 170 213 176 141 176 176 141 176 130 104 130 130 104 130 130 104 130 88 71 88 88 71 88 6 5 6 6 5 6 6 5 6 23 19 23 23 19 23 15 12 15 15 12 15 15 12 15 49 39 49 49 39 49 30 24 30 30 24 30 30 24 30 25 20 25 25 20 25 45 36 45 45 36 45 44 35 44 134 107 134 134 107 134 91 73 91 91 73 91 91 73 91 83 66 83 83 66 83 161 129 161 161 129 161 161 129 161 131 105 131 131 105 131 10 8 10 10 8 10 10 8 10 16 13 16 16 13 16 18 15 18 18 15 18 18 15 18 21 16 21 21 16 21 60 48 60 60 48 60 60 48 60 16 13 16 16 13 16 35 28 35 35 28 35 35 28 35 27 21 27 27 21 27 47 38 47 47 38 47 47 38 47 60 48 60 60 48 60 14 11 14 14 11 14 14 11 14 26 21 26 26 21 26 53 42 53 53 42 53 53 42 53 78 62 78 77 62 77 73 59 73 73 58 73 73 58 73 98 78 98 97 78 97 42 34 42 42 34 42 42 34 42 26 21 26 26 21 26 24 19 24 24 19 24 24 19 24 10 8 10 10 8 10 22 17 22 22 17 22 22 17 22 12 9 12 12 9 12 8 6 8 8 6 8 7 6 7 173 138 173 173 138 173 197 157 197 196 157 196 196 157 196 196 157 196 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 242 251 210 162 195 255 255 255 255 255 255 255 255 255 255 255 255 255 241 183 255 246 186 255 246 186 255 245 186 255 245 185 255 245 185 255 238 181 255 239 181 255 220 167 255 219 167 255 220 167 255 244 184 255 244 183 255 250 189 255 243 189 226 166 188 211 199 188 216 202 188 255 244 187 250 219 187 255 255 187 255 247 187 255 255 186 255 255 186 255 255 186 255 255 186 255 255 185 255 255 185 255 255 185 255 255 184 255 255 184 255 255 184 255 255 184 255 255 183 255 255 183 255 255 183 255 252 181 255 255 180 255 255 180 255 255 180 255 255 180 255 255 179 255 255 179 255 242 148 255 240 147 255 245 147 255 182 109 252 180 109 170 122 74 74 74 74 74 74 74 5 5 5 5 5 5 19 19 19 19 19 19 19 19 19 12 12 12 12 12 12 12 12 12 41 41 41 40 40 40 24 24 24 24 24 24 21 21 21 21 21 21 21 21 21 37 37 37 36 36 36 36 36 36 110 110 110 110 110 110 75 75 75 75 75 75 67 67 67 67 67 67 67 67 67 131 131 131 131 131 131 131 131 131 107 107 107 106 106 106 8 8 8 8 8 8 13 13 13 13 13 13 13 13 13 15 15 15 15 15 15 15 15 15 16 16 16 16 16 16 49 49 49 49 49 49 48 48 48 13 13 13 13 13 13 28 28 28 28 28 28 28 28 28 21 21 21 21 21 21 38 38 38 38 38 38 38 38 38 48 48 48 48 48 48 11 11 11 11 11 11 11 11 11 21 21 21 21 21 21 42 42 42 42 42 42 42 42 42 62 62 62 62 62 62 58 58 58 58 58 58 58 58 58 77 77 77 77 77 77 33 33 33 33 33 33 33 33 33 20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 7 7 7 7 7 7 17 17 17 17 17 17 17 17 17 9 9 9 9 9 9 6 6 6 6 6 6 6 6 6 137 137 137 136 136 136 155 155 155 155 155 155 155 155 155 154 154 154 154 154 154 152 152 152 152 152 152 152 152 152 150 150 150 150 150 150 147 147 147 147 147 147 146 146 146 143 143 143 143 143 143 144 144 144 144 144 144 144 144 144 147 147 147 147 147 147 146 146 146 146 146 146 146 146 146 143 143 143 143 143 143 +216 172 216 218 174 218 218 174 218 218 174 218 217 174 217 217 174 217 217 174 217 217 174 217 217 173 217 217 173 217 217 173 217 217 173 217 216 173 216 216 173 216 216 173 216 216 173 216 214 171 214 214 171 214 213 171 213 207 165 207 207 165 207 200 160 200 200 160 200 200 160 200 84 67 84 84 67 84 21 17 21 21 17 21 21 17 21 13 10 13 12 10 12 36 29 36 36 29 36 36 29 36 36 29 36 36 29 36 56 44 56 56 44 56 56 44 56 17 13 17 17 13 17 19 15 19 19 15 19 19 15 19 79 63 79 79 63 79 92 73 92 92 73 92 91 73 91 94 75 94 93 75 93 185 148 185 185 148 185 185 148 185 200 160 200 199 159 199 199 159 199 121 96 121 120 96 120 23 18 23 23 18 23 23 18 23 12 10 12 12 10 12 14 11 14 14 11 14 14 11 14 18 15 18 18 15 18 39 31 39 39 31 39 39 31 39 64 51 64 64 51 64 127 102 127 127 101 127 127 101 127 139 111 139 139 111 139 137 109 137 137 109 137 137 109 137 149 119 149 149 119 149 169 135 169 169 135 169 169 135 169 152 122 152 152 122 152 127 102 127 127 102 127 127 101 127 102 82 102 102 82 102 96 77 96 96 76 96 96 76 96 145 116 145 144 115 144 118 94 118 118 94 118 117 94 117 26 21 26 26 21 26 26 21 26 8 6 8 8 6 8 14 11 14 14 11 14 14 11 14 14 11 14 14 11 14 4 3 4 4 3 4 4 3 4 160 128 160 159 127 159 195 156 195 195 156 195 195 156 195 196 157 196 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 233 245 255 255 255 255 255 255 255 255 255 255 255 255 255 244 185 255 246 187 255 246 186 255 253 192 255 253 192 255 253 191 255 248 187 255 247 187 255 233 177 255 232 177 255 233 177 255 247 186 255 246 186 255 251 189 255 250 189 255 191 189 211 200 188 224 206 188 213 201 188 255 243 188 255 254 187 255 255 187 255 255 187 255 255 187 255 255 184 255 255 184 255 255 186 255 255 185 255 255 185 255 255 185 255 255 185 255 255 184 255 255 184 255 255 184 255 255 183 255 255 183 255 255 183 255 255 183 255 255 182 255 255 182 255 255 182 255 255 180 255 255 179 255 255 179 255 255 173 255 255 173 255 255 167 255 255 167 255 255 167 167 119 70 70 70 70 18 18 18 18 18 18 18 18 18 10 10 10 10 10 10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 46 46 46 46 46 46 46 46 46 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 65 65 65 64 64 64 64 64 64 75 75 75 75 75 75 76 76 76 76 76 76 76 76 76 151 151 151 150 150 150 162 162 162 162 162 162 162 162 162 98 98 98 98 98 98 18 18 18 18 18 18 18 18 18 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 15 15 15 15 15 15 32 32 32 32 32 32 32 32 32 52 52 52 52 52 52 102 102 102 102 102 102 102 102 102 111 111 111 111 111 111 109 109 109 109 109 109 109 109 109 119 119 119 119 119 119 135 135 135 135 135 135 135 135 135 121 121 121 121 121 121 121 121 121 101 101 101 101 101 101 81 81 81 81 81 81 81 81 81 76 76 76 76 76 76 115 115 115 114 114 114 114 114 114 93 93 93 93 93 93 20 20 20 20 20 20 20 20 20 6 6 6 6 6 6 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 3 3 3 3 3 3 3 3 3 126 126 126 126 126 126 154 154 154 154 154 154 153 153 153 155 155 155 154 154 154 154 154 154 154 154 154 154 154 154 151 151 151 150 150 150 147 147 147 147 147 147 147 147 147 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 147 147 147 147 147 147 147 147 147 151 151 151 151 151 151 148 148 148 +218 174 218 218 174 218 218 174 218 218 174 218 218 174 218 218 174 218 217 174 217 217 174 217 217 174 217 217 174 217 217 173 217 217 173 217 217 173 217 217 173 217 216 173 216 214 171 214 214 171 214 207 166 207 207 166 207 207 166 207 200 160 200 200 160 200 85 68 85 84 67 84 84 67 84 21 17 21 21 17 21 13 10 13 13 10 13 13 10 13 36 29 36 36 29 36 36 29 36 36 29 36 36 29 36 56 44 56 56 44 56 56 44 56 17 13 17 17 13 17 19 15 19 19 15 19 19 15 19 79 63 79 79 63 79 92 73 92 92 73 92 92 73 92 94 75 94 94 75 94 186 148 186 185 148 185 185 148 185 200 160 200 200 160 200 200 160 200 121 97 121 121 96 121 23 18 23 23 18 23 23 18 23 12 10 12 12 10 12 14 11 14 14 11 14 14 11 14 18 15 18 18 15 18 40 32 40 39 31 39 39 31 39 65 52 65 65 52 65 127 102 127 127 102 127 127 102 127 140 112 140 139 111 139 139 111 139 137 110 137 137 109 137 149 119 149 149 119 149 149 119 149 170 136 170 169 135 169 153 122 153 153 122 153 152 122 152 127 102 127 127 102 127 102 82 102 102 82 102 102 82 102 96 77 96 96 77 96 145 116 145 145 116 145 145 116 145 118 94 118 118 94 118 26 21 26 26 21 26 26 21 26 8 6 8 8 6 8 8 6 8 14 11 14 14 11 14 14 11 14 14 11 14 14 11 14 4 3 4 4 3 4 160 128 160 160 128 160 160 128 160 195 156 195 195 156 195 197 157 197 197 157 197 255 255 255 255 255 255 255 255 255 255 255 255 255 230 245 255 255 255 255 255 255 255 238 249 246 182 210 255 255 255 255 255 255 255 255 255 255 255 255 255 244 185 255 246 187 255 246 187 255 253 192 255 252 192 255 251 192 255 247 188 255 247 187 255 232 177 255 233 177 255 234 177 255 247 186 255 247 186 255 252 190 255 251 189 255 239 189 255 224 189 255 233 189 209 198 188 255 222 188 255 255 188 255 255 187 255 255 187 255 255 187 255 255 185 255 255 184 255 255 186 255 255 186 255 255 186 255 255 185 255 255 185 255 255 185 255 255 184 255 255 184 255 255 184 255 255 184 255 255 183 255 255 183 255 255 183 255 255 182 255 255 182 255 255 182 255 255 180 255 255 180 255 255 174 255 255 173 255 255 173 255 255 167 255 255 167 167 119 70 70 70 70 70 70 70 18 18 18 18 18 18 10 10 10 10 10 10 10 10 10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 46 46 46 46 46 46 46 46 46 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 65 65 65 65 65 65 75 75 75 75 75 75 75 75 75 76 76 76 76 76 76 151 151 151 151 151 151 151 151 151 162 162 162 162 162 162 98 98 98 98 98 98 98 98 98 18 18 18 18 18 18 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 15 15 15 15 15 15 32 32 32 32 32 32 32 32 32 52 52 52 52 52 52 102 102 102 102 102 102 102 102 102 112 112 112 111 111 111 110 110 110 109 109 109 109 109 109 119 119 119 119 119 119 135 135 135 135 135 135 135 135 135 121 121 121 121 121 121 121 121 121 101 101 101 101 101 101 81 81 81 81 81 81 81 81 81 76 76 76 76 76 76 115 115 115 115 115 115 114 114 114 93 93 93 93 93 93 20 20 20 20 20 20 20 20 20 6 6 6 6 6 6 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 3 3 3 3 3 3 126 126 126 126 126 126 126 126 126 154 154 154 154 154 154 155 155 155 155 155 155 154 154 154 154 154 154 154 154 154 151 151 151 151 151 151 150 150 150 147 147 147 147 147 147 147 147 147 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 147 147 147 147 147 147 151 151 151 151 151 151 +218 175 218 218 175 218 218 174 218 218 174 218 218 174 218 218 174 218 218 174 218 218 174 218 211 169 211 211 168 211 211 168 211 215 172 215 215 172 215 217 173 217 217 173 217 217 173 217 214 171 214 214 171 214 181 145 181 181 145 181 181 145 181 85 68 85 85 68 85 85 68 85 17 13 17 17 13 17 23 19 23 23 19 23 23 19 23 30 24 30 30 24 30 30 24 30 30 24 30 30 24 30 28 22 28 28 22 28 28 22 28 10 8 10 10 8 10 43 34 43 43 34 43 43 34 43 133 106 133 133 106 133 180 144 180 180 144 180 180 144 180 197 157 197 197 157 197 212 169 212 211 169 211 211 169 211 207 165 207 207 165 207 207 165 207 206 165 206 206 165 206 191 153 191 191 153 191 191 153 191 165 132 165 165 132 165 131 105 131 131 105 131 131 104 131 133 106 133 133 106 133 162 130 162 162 129 162 162 129 162 197 158 197 197 158 197 197 158 197 205 164 205 205 164 205 205 164 205 205 164 205 205 164 205 204 163 204 204 163 204 206 165 206 206 165 206 206 164 206 203 163 203 203 162 203 203 162 203 203 162 203 203 162 203 196 157 196 196 157 196 196 156 196 127 102 127 127 102 127 135 108 135 135 108 135 135 108 135 170 136 170 170 136 170 102 81 102 102 81 102 102 81 102 67 53 67 67 53 67 67 53 67 12 9 12 12 9 12 6 4 6 6 4 6 6 4 6 4 3 4 4 3 4 8 6 8 8 6 8 8 6 8 164 131 164 164 131 164 198 158 198 198 158 198 198 158 198 197 158 197 197 158 197 197 157 197 255 255 255 255 255 255 255 255 255 255 253 255 255 255 255 255 255 255 255 214 236 227 173 205 255 255 255 255 255 255 255 255 255 255 255 255 255 247 188 255 247 187 255 247 187 255 244 187 255 245 187 255 243 186 255 244 186 255 246 186 255 244 186 255 245 185 255 245 185 255 247 187 255 247 186 255 251 190 255 250 190 255 247 190 255 226 189 224 207 189 249 219 189 249 219 188 255 254 188 255 255 188 255 255 188 255 255 187 255 255 183 255 255 183 255 255 187 255 255 186 255 255 186 255 255 186 255 255 185 255 255 185 255 255 185 255 255 185 247 216 184 255 242 184 255 255 184 255 245 178 255 255 178 255 255 181 255 255 181 255 255 180 255 255 182 255 255 182 255 255 180 255 255 179 255 255 179 255 253 151 255 253 151 255 255 151 71 71 71 70 70 70 14 14 14 14 14 14 14 14 14 19 19 19 19 19 19 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 23 23 23 23 23 23 23 23 23 8 8 8 8 8 8 8 8 8 35 35 35 35 35 35 109 109 109 109 109 109 109 109 109 147 147 147 147 147 147 161 161 161 160 160 160 160 160 160 172 172 172 172 172 172 168 168 168 168 168 168 168 168 168 167 167 167 167 167 167 167 167 167 154 154 154 154 154 154 133 133 133 133 133 133 133 133 133 105 105 105 105 105 105 107 107 107 107 107 107 106 106 106 130 130 130 130 130 130 130 130 130 158 158 158 158 158 158 164 164 164 164 164 164 164 164 164 164 164 164 163 163 163 163 163 163 163 163 163 163 163 163 164 164 164 164 164 164 162 162 162 162 162 162 161 161 161 161 161 161 161 161 161 161 161 161 155 155 155 155 155 155 101 101 101 101 101 101 101 101 101 107 107 107 107 107 107 134 134 134 134 134 134 134 134 134 80 80 80 80 80 80 53 53 53 53 53 53 53 53 53 9 9 9 9 9 9 9 9 9 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 6 6 6 6 6 6 129 129 129 129 129 129 129 129 129 156 156 156 155 155 155 155 155 155 155 155 155 155 155 155 153 153 153 153 153 153 152 152 152 154 154 154 154 154 154 153 153 153 153 153 153 153 153 153 150 150 150 149 149 149 148 148 148 148 148 148 147 147 147 147 147 147 147 147 147 147 147 147 +219 175 219 219 175 219 218 175 218 218 175 218 218 174 218 218 174 218 218 174 218 218 174 218 218 174 218 218 174 218 217 174 217 217 174 217 217 174 217 217 174 217 217 173 217 217 173 217 217 173 217 160 128 160 159 127 159 159 127 159 74 59 74 74 59 74 17 13 17 17 13 17 17 13 17 24 19 24 23 19 23 23 19 23 6 5 6 6 5 6 32 26 32 32 26 32 32 26 32 23 19 23 23 19 23 19 15 19 19 15 19 19 15 19 19 15 19 19 15 19 19 15 19 144 115 144 144 115 144 202 162 202 202 161 202 202 161 202 208 166 208 208 166 208 208 166 208 208 166 208 207 166 207 209 167 209 209 167 209 209 167 209 211 169 211 211 169 211 209 167 209 208 167 208 208 167 208 210 168 210 210 168 210 208 166 208 208 166 208 207 166 207 207 166 207 207 166 207 207 165 207 207 165 207 207 165 207 208 167 208 208 167 208 208 166 208 206 165 206 206 164 206 208 166 208 207 166 207 207 166 207 207 165 207 207 165 207 207 165 207 206 165 206 206 165 206 206 165 206 206 165 206 206 164 206 203 163 203 203 162 203 203 162 203 203 162 203 202 162 202 200 160 200 200 160 200 200 160 200 144 115 144 144 115 144 94 75 94 94 75 94 94 75 94 114 91 114 114 91 114 153 122 153 153 122 153 153 122 153 36 29 36 36 29 36 36 29 36 8 6 8 8 6 8 20 16 20 20 16 20 20 16 20 38 30 38 38 30 38 38 30 38 187 149 187 187 149 187 194 155 194 194 155 194 194 155 194 194 155 194 193 155 193 195 156 195 255 255 255 255 255 255 255 255 255 255 253 255 255 255 255 255 255 255 255 255 255 255 209 228 255 255 255 255 255 255 255 255 255 255 255 255 255 245 186 255 244 186 255 244 186 255 240 183 255 241 183 255 240 183 255 244 186 255 246 186 255 251 190 255 251 190 255 250 189 255 248 187 255 247 187 255 249 189 255 244 188 255 216 188 233 211 190 232 211 189 207 198 189 212 200 189 255 254 189 255 255 188 255 255 188 255 255 188 255 255 187 255 255 187 255 255 187 255 255 187 255 255 186 255 255 186 255 255 186 255 255 186 255 255 185 255 235 185 200 192 185 255 255 184 255 238 184 255 247 184 255 243 184 255 255 183 255 255 183 255 255 183 255 255 182 255 255 182 255 255 182 255 255 182 255 255 181 255 224 133 255 223 133 255 223 133 62 62 62 61 61 61 14 14 14 14 14 14 14 14 14 19 19 19 19 19 19 19 19 19 5 5 5 5 5 5 26 26 26 26 26 26 26 26 26 19 19 19 19 19 19 19 19 19 16 16 16 16 16 16 15 15 15 15 15 15 15 15 15 118 118 118 118 118 118 165 165 165 165 165 165 165 165 165 170 170 170 169 169 169 169 169 169 169 169 169 168 168 168 170 170 170 170 170 170 169 169 169 171 171 171 171 171 171 169 169 169 168 168 168 168 168 168 170 170 170 169 169 169 169 169 169 167 167 167 167 167 167 167 167 167 166 166 166 166 166 166 166 166 166 165 165 165 167 167 167 167 167 167 166 166 166 164 164 164 164 164 164 164 164 164 165 165 165 165 165 165 165 165 165 165 165 165 164 164 164 164 164 164 164 164 164 164 164 164 163 163 163 163 163 163 161 161 161 161 161 161 161 161 161 161 161 161 160 160 160 158 158 158 158 158 158 158 158 158 114 114 114 113 113 113 74 74 74 74 74 74 74 74 74 90 90 90 90 90 90 90 90 90 120 120 120 120 120 120 28 28 28 28 28 28 28 28 28 6 6 6 6 6 6 15 15 15 15 15 15 15 15 15 30 30 30 30 30 30 30 30 30 147 147 147 146 146 146 153 153 153 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 153 153 153 153 153 153 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 145 145 145 145 145 145 145 145 145 138 138 138 138 138 138 138 138 138 146 146 146 +219 175 219 219 175 219 219 175 219 219 175 219 218 175 218 218 175 218 218 174 218 218 174 218 218 174 218 218 174 218 218 174 218 218 174 218 217 174 217 217 174 217 217 174 217 217 174 217 160 128 160 160 128 160 74 59 74 74 59 74 74 59 74 17 14 17 17 14 17 17 14 17 24 19 24 24 19 24 6 5 6 6 5 6 6 5 6 32 26 32 32 26 32 32 26 32 23 19 23 23 19 23 19 15 19 19 15 19 19 15 19 19 15 19 19 15 19 145 116 145 144 115 144 144 115 144 203 162 203 202 162 202 202 162 202 209 167 209 208 167 208 208 167 208 208 166 208 208 166 208 210 168 210 210 168 210 210 168 210 212 169 212 211 169 211 209 167 209 209 167 209 209 167 209 211 168 211 211 168 211 210 168 210 208 166 208 208 166 208 208 166 208 208 166 208 207 166 207 207 166 207 207 166 207 209 167 209 209 167 209 209 167 209 206 165 206 206 165 206 206 165 206 208 166 208 208 166 208 207 166 207 207 166 207 207 166 207 207 165 207 207 165 207 206 165 206 206 165 206 206 165 206 204 163 204 204 163 204 203 163 203 203 162 203 203 162 203 201 160 201 200 160 200 200 160 200 144 115 144 144 115 144 144 115 144 94 75 94 94 75 94 115 92 115 115 92 115 114 91 114 153 123 153 153 122 153 153 122 153 36 29 36 36 29 36 8 6 8 8 6 8 8 6 8 20 16 20 20 16 20 20 16 20 38 30 38 38 30 38 187 150 187 187 150 187 187 149 187 195 156 195 195 156 195 194 155 194 194 155 194 194 155 194 196 156 196 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 225 239 255 255 255 255 255 255 255 255 255 255 255 255 255 245 186 255 245 186 255 244 186 255 241 184 255 242 183 255 247 187 255 244 187 255 245 187 255 251 190 255 251 190 255 251 190 255 248 188 255 248 187 255 250 189 255 217 189 213 161 188 208 199 190 200 195 190 205 197 190 222 206 189 255 255 189 255 255 189 255 255 188 255 255 188 255 255 188 255 255 188 255 255 187 255 255 187 255 255 187 255 255 187 255 255 186 255 255 186 255 224 186 251 218 185 238 212 185 255 232 185 255 231 185 255 250 184 255 219 184 255 255 184 255 255 183 255 255 183 255 255 183 255 255 183 255 255 182 255 255 182 255 255 182 255 255 182 255 224 134 255 225 133 146 104 62 62 62 62 62 62 62 14 14 14 14 14 14 19 19 19 19 19 19 19 19 19 5 5 5 5 5 5 5 5 5 26 26 26 26 26 26 19 19 19 19 19 19 19 19 19 16 16 16 16 16 16 16 16 16 15 15 15 15 15 15 118 118 118 118 118 118 118 118 118 165 165 165 165 165 165 165 165 165 170 170 170 169 169 169 169 169 169 169 169 169 169 169 169 170 170 170 170 170 170 171 171 171 171 171 171 171 171 171 169 169 169 169 169 169 168 168 168 170 170 170 169 169 169 167 167 167 167 167 167 167 167 167 167 167 167 166 166 166 166 166 166 166 166 166 166 166 166 167 167 167 167 167 167 167 167 167 165 165 165 164 164 164 166 166 166 166 166 166 165 165 165 165 165 165 165 165 165 165 165 165 164 164 164 164 164 164 164 164 164 164 164 164 163 163 163 161 161 161 161 161 161 161 161 161 161 161 161 160 160 160 159 159 159 158 158 158 158 158 158 114 114 114 114 114 114 113 113 113 74 74 74 74 74 74 90 90 90 90 90 90 90 90 90 121 121 121 120 120 120 28 28 28 28 28 28 28 28 28 6 6 6 6 6 6 6 6 6 15 15 15 15 15 15 30 30 30 30 30 30 30 30 30 147 147 147 147 147 147 146 146 146 153 153 153 152 152 152 152 152 152 152 152 152 152 152 152 153 153 153 153 153 153 153 153 153 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 145 145 145 145 145 145 139 139 139 138 138 138 138 138 138 + diff --git a/testsuite/tests/programs/galois_raytrace/test.T b/testsuite/tests/programs/galois_raytrace/test.T new file mode 100644 index 0000000000..169e162d6a --- /dev/null +++ b/testsuite/tests/programs/galois_raytrace/test.T @@ -0,0 +1,26 @@ +setTestOpts(omit_compiler_types(['hugs'])) # takes much too long + +# Floating point differences on x86 using the NCG +if config.platform.startswith('i386-') and \ + config.platform != 'i386-unknown-openbsd': + setTestOpts(expect_fail_for(['hpc','optasm','profasm','threaded2','profthreaded'])) + +test('galois_raytrace', + [skip_if_fast, + extra_clean(['CSG.hi', 'CSG.o', + 'Construct.hi', 'Construct.o', + 'Data.hi', 'Data.o', + 'Eval.hi', 'Eval.o', + 'Geometry.hi', 'Geometry.o', + 'Illumination.hi', 'Illumination.o', + 'Intersections.hi', 'Intersections.o', + 'Interval.hi', 'Interval.o', + 'Main.hi', 'Main.o', + 'Misc.hi', 'Misc.o', + 'Parse.hi', 'Parse.o', + 'Primitives.hi', 'Primitives.o', + 'Surface.hi', 'Surface.o']), + reqlib('parsec')], + multimod_compile_and_run, + ['Main','-package parsec']) + diff --git a/testsuite/tests/programs/hs-boot/A.hs b/testsuite/tests/programs/hs-boot/A.hs new file mode 100644 index 0000000000..e09cebb67b --- /dev/null +++ b/testsuite/tests/programs/hs-boot/A.hs @@ -0,0 +1,6 @@ + +module A where + +import C +-- THIS FIXES IT: +-- import B diff --git a/testsuite/tests/programs/hs-boot/A.hs-boot b/testsuite/tests/programs/hs-boot/A.hs-boot new file mode 100644 index 0000000000..c80b00d29d --- /dev/null +++ b/testsuite/tests/programs/hs-boot/A.hs-boot @@ -0,0 +1,4 @@ + +module A where + +import C diff --git a/testsuite/tests/programs/hs-boot/B.hs b/testsuite/tests/programs/hs-boot/B.hs new file mode 100644 index 0000000000..13d1ac4948 --- /dev/null +++ b/testsuite/tests/programs/hs-boot/B.hs @@ -0,0 +1,5 @@ + +module B where + +import C +import {-# SOURCE #-} A diff --git a/testsuite/tests/programs/hs-boot/C.hs b/testsuite/tests/programs/hs-boot/C.hs new file mode 100644 index 0000000000..b81773302e --- /dev/null +++ b/testsuite/tests/programs/hs-boot/C.hs @@ -0,0 +1,2 @@ + +module C where diff --git a/testsuite/tests/programs/hs-boot/Main.hs b/testsuite/tests/programs/hs-boot/Main.hs new file mode 100644 index 0000000000..2f51014fd2 --- /dev/null +++ b/testsuite/tests/programs/hs-boot/Main.hs @@ -0,0 +1,8 @@ + +module Main where + +import B +-- REMOVING THIS OR MOVING THIS OVER "import B" FIXES IT: +import C + +main = return ()
\ No newline at end of file diff --git a/testsuite/tests/programs/hs-boot/Makefile b/testsuite/tests/programs/hs-boot/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/hs-boot/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/hs-boot/all.T b/testsuite/tests/programs/hs-boot/all.T new file mode 100644 index 0000000000..eb48087188 --- /dev/null +++ b/testsuite/tests/programs/hs-boot/all.T @@ -0,0 +1,9 @@ +# This test is for bug #906, a problem with the ordering of +# compilations involving .hs-boot files, fixed in 6.6. + +test('hs-boot', + extra_clean(['A.hi', 'A.hi-boot', 'A.o', 'A.o-boot', + 'B.hi', 'B.o', 'C.hi', 'C.o', + 'Main.hi', 'Main.o']), + multimod_compile, + ['Main -v0', '']) diff --git a/testsuite/tests/programs/hs-boot/hs-boot.stderr b/testsuite/tests/programs/hs-boot/hs-boot.stderr new file mode 100644 index 0000000000..99de1b67f5 --- /dev/null +++ b/testsuite/tests/programs/hs-boot/hs-boot.stderr @@ -0,0 +1,2 @@ + +B.hs:5:23: Warning: {-# SOURCE #-} unnecessary in import of `A' diff --git a/testsuite/tests/programs/jl_defaults/Main.hs b/testsuite/tests/programs/jl_defaults/Main.hs new file mode 100644 index 0000000000..7264c53c1e --- /dev/null +++ b/testsuite/tests/programs/jl_defaults/Main.hs @@ -0,0 +1,24 @@ +d=25637784375346753+0158409406114519728029864689069987389733-25637784375346753 + +cox(n)=foldr (\x(y)->128* y+x)0(n) +de(n)=un(\x-> (x`mod`128,x `div`128),( ==0))n +coll= un(\ zs->( take( 35)zs, drop(35)zs),(=="")) +pe(n,m)x=s(p( n`div`2,m)x) `mod`m --2323 -- john launchbury -- +p(n,m)x=if( n==0)then(1) else(if(even(n)) then(pe(n,m)x)else(po(n,m)x)) +po(n, m)x= (x*p( n-1,m) x)`mod` m +un(f, p)n= if(p(n))then []else (let(a, b)=f(n)in(a:un(f,p)b)) +(g,s) =(\x ->x,\x->x*x) --v(f) t*g+172 + +e=4998372704153806867349631861645896723396264061670520817438963311707989737197 +n=6133011105483442903214719346445720362447680717496623906453276570566830154479 + +a=g + (concat.map(map(chr.fromIntegral).de.p(d,n).read).lines) +main=interact + (unlines.map(show.p(e,n).cox.map(fromIntegral.ord)).coll) +b=g +--p::(Integer,Integer)->Integer->Integer +default (Integer) +-- 1.3 +ord = (fromEnum :: Char -> Int) +chr = (toEnum :: Int -> Char) diff --git a/testsuite/tests/programs/jl_defaults/Makefile b/testsuite/tests/programs/jl_defaults/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/jl_defaults/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/jl_defaults/jl_defaults.stdin b/testsuite/tests/programs/jl_defaults/jl_defaults.stdin new file mode 100644 index 0000000000..9f42b3cdaf --- /dev/null +++ b/testsuite/tests/programs/jl_defaults/jl_defaults.stdin @@ -0,0 +1,97 @@ +module Main +where + +import Rsa + +main = interact (decrypt 2036450659413645137870851576872812267542175329986469156678671505255564383842535488743101632280716717779536712424613501441720195827856504007305662157107 + 5282760067491066073559694937813662322539426172665930660813609694132726350877) +module Main +where + +import Rsa + +main = interact (prompt . keys . lines) + +keys (x:y:xs) = makeKeys (read x) (read y) +prompt ks = "\nEnter two random numbers on separate lines:\n" ++ + case ks of + (n,e,d) -> "The numbers n, e, and d are:\n" ++ + unlines (map show [n,e,d]) ++ "\n" + + + + +module Main +where + +import Rsa + +main = interact (encrypt 2036450659413645137870851576872812267542175329986469156678671505255564383842535488743101632280716717779536712424613501441720195827856504007305662157107 + + 387784473137902876992546516170169092918207676456888779623592396031349415024943784869634893342729620092877891356118467738167515879252473323905128540213) +module Rsa (encrypt, decrypt, makeKeys) +where + + +encrypt, decrypt :: Integer -> Integer -> String -> String +encrypt n e = unlines . map (show . power e n . code) . collect (size n) +decrypt n d = concat . map (decode . power d n . read) . lines + + +-------- Converting between Strings and Integers ----------- + +code :: String -> Integer +code = foldl accum 0 + where accum x y = (128 * x) + fromIntegral (ord y) + +decode :: Integer -> String +decode n = reverse (expand n) + where expand 0 = [] + expand x = chr (fromIntegral (x `mod` 128)) : expand (x `div` 128) + +collect :: Int -> [a] -> [[a]] +collect 0 xs = [] +collect n [] = [] +collect n xs = take n xs : collect n (drop n xs) + +size :: Integer -> Int +size n = (length (show n) * 47) `div` 100 -- log_128 10 = 0.4745 + + +------- Constructing keys ------------------------- + +makeKeys :: Integer -> Integer -> (Integer, Integer, Integer) +makeKeys p' q' = (n, invert phi d, d) + where p = nextPrime p' + q = nextPrime q' + n = p*q + phi = (p-1)*(q-1) + d = nextPrime (p+q+1) + +nextPrime :: Integer -> Integer +nextPrime a = head (filter prime [odd,odd+2..]) + where odd | even a = a+1 + | True = a + prime p = and [power (p-1) p x == 1 | x <- [3,5,7]] + +invert :: Integer -> Integer -> Integer +invert n a = if e<0 then e+n else e + where e=iter n 0 a 1 + +iter :: Integer -> Integer -> Integer -> Integer -> Integer +iter g v 0 w = v +iter g v h w = iter h w (g - fact * h) (v - fact * w) + where fact = g `div` h + + +------- Fast exponentiation, mod m ----------------- + +power :: Integer -> Integer -> Integer -> Integer +power 0 m x = 1 +power n m x | even n = sqr (power (n `div` 2) m x) `mod` m + | True = (x * power (n-1) m x) `mod` m + +sqr :: Integer -> Integer +sqr x = x * x + + diff --git a/testsuite/tests/programs/jl_defaults/jl_defaults.stdout b/testsuite/tests/programs/jl_defaults/jl_defaults.stdout new file mode 100644 index 0000000000..96af88d02a --- /dev/null +++ b/testsuite/tests/programs/jl_defaults/jl_defaults.stdout @@ -0,0 +1,81 @@ +4920809715423652126833300223898584158049941072841886687495995700883334743100 +5432330858306872686500084883710596485987545962633593608556693314985929397278 +4339248871826075716689365252959383603865108452038731242628114027468386889392 +5093536091168354561903967261876376065518631989366599364453052968769674546808 +452255175131343471422777502400803159982075304884934452744062890985998925579 +5651794710074432381863213344353720104403137760112806914487431596242938363430 +3061160482336986047106286569124179361131165975312875785380225174897705056247 +3707532298830907015078026151401521396408816523701073885235911174226183847616 +1672527229229602085474445755878025438634885550315976736763448691537272636397 +2694095939000995014017603368080556297555174784041262508235371067342645255524 +374377465877617758578798366250540382775835183912685973484329204081752413108 +70670677534061236024006132424883477045800689401223889299851269113903609674 +4000628399955471904243661544397767048125987794908180173183625871229892876397 +4906565929095346836492941810877575932437495191179616117416632984168943509597 +5516346249998806624976191380102290469940913229929556365185124042458931748107 +3249082870923755215225394643296748590367123662573818411184222619514686103707 +1491720335558719705869091168528404980739494271046932349218229579321184830523 +1686737417317757855955298010512776238712753331633604323753903197890876799373 +1805585126801071079811419697627136537113089029403553023028612722432622665752 +3511736403324390887823438889080816442699457593665362088272279450694662350325 +3059090617697805984966883699385391457394972451765807015618308229682170754691 +1791469209415048698889701534711117102841920419919199191251466207775050401648 +4909486343080247382855393243376373590835553788279147318500120102235277324688 +6105584463845350869346463822943556344444743115967948397202046370564408862801 +3101811255702323827681538739391405240305979676311679950655332212164728286905 +502301603479002276983794250287799138413539671219594405716785181026407853070 +4358061173842713923727596635618515537510627182560600542063351264350418316626 +164453598598861572154717095227623488925677211321244997860334336257326798364 +4394558632435728786563083951771397684083785946746450795656358634203698441707 +6006851346698376668509905281824701381916163461685508740794674441125858788140 +3867538230503966184572683721734208947665221540440622466928061154772391187329 +5338109760830381076911983869920441650716477560575467116072876135764595748095 +3743970364360709692565346166809854918016520774549917187253761579957026935285 +5338885389104874014929439098775791103906923949376645756253431737471221283700 +2348178884706827085411484833459920161135814667852004573467265439960241493131 +5254623865012121523980274965685942704689624593023469438181719491186136936015 +3986275158016351977835439147155809957999996272270283467743293472532115583617 +526935137060210001028448464377173261084183239425747466381941443743544027195 +507273794051233348674698212476241189139986916720908541050194948680762996344 +1033556763489852311463603207019927285083136108137572596117745744242871916900 +3446795433667187698189441512959300936201773618507473942386709884930451135074 +545931880879424996206435364533933413676207664131244784634909342311706884452 +2795801327214218413435627230002144566845535290174353455844445456463875729434 +2931834269644667286282273161824736012205083677965116753449411073863166504357 +4321226293197008552166855291951448174194860947478057945983594070230611540335 +2915201550606214604494324179626096006121149723557886610883841340815238149840 +4811620416165033750799620419212417505145222669364398338747204968522878524911 +1466224263109815153902563034416239744965838185919402925858674448761002454779 +2438889162050605487686752760988810450126857080767315726495753536171323863054 +5998821980800057085636781495295707864684178467171746799651972228599139201266 +6089567412803075636381417941158119969114523106164962143432961423089887792292 +3050021010531468802113118367257671370659795560347299789117728278864278450131 +5945718375382831109423632944705128211793085885913633593861683167159528782591 +3026204398245236798354704986302023975861815145437855415245441815308415387953 +2676529366868155998394698157879317295826322813777929555458747920862958367966 +2510144819506913011833805684069407453087501420718601429525528464579648027945 +927261031293985730579168798603066378051891567746020053024936290977579745443 +5915344780625405584011111029616932649698677975010841120923573679748044000720 +3148048140163124147500328788647215500539594107393850553079025886755275538822 +2287692746592755607916955694183169908842703620578310343535165175569710544053 +1063693689244866698553354251617273211405432367453924577142357801317603990975 +3849377130782157501991218894503189735241973306948618262933858934701817306449 +4936383948961571782723042323182925874145007039724697967700967643799136008113 +1509617705803393270808477952473702864659023851066698294243357961717765168672 +5472216837765373996121128218666257320756026383617272333703957906641519754263 +4780254190063899712174761115854857641499167561602339838395636904013647414584 +5581514826041367626669555434100028158983453767987104047095662205070800757827 +5309252036506593340513508392734823467337429965923448711237185191264932184860 +4583433054186756079090681370045250784557808030067459137931281644720019191362 +5575463174094526452776738273855782291534405989081458614218391164048773471067 +5852605354443026555410261612196443374066160991330461866108439516671532034102 +1874394262755169898049882304381434185778432126556225514931962873197932483312 +788055637358938666586632974037948121627136430004899534614992989099047141460 +2622180375354647151274534995106977971178016843195527033965282744574806644939 +4796950796491327077781445701993257220109214573739662989797578674154036157406 +233413414192494514986495864446565635199384720742811236012866416296376677246 +2347993888467688740232778654271044706092005506762442826710421788460808408534 +91161250689328982701754090976033028590711392587459602281964712770783938325 +1819439705826650262304124492559936132802903570523631190847187428885890378612 +2856891250452648545493984485566790848211215232771965243626157791018496330646 +1757223836152519443955234766296600906372788951356756698651751141731568824792 diff --git a/testsuite/tests/programs/jl_defaults/test.T b/testsuite/tests/programs/jl_defaults/test.T new file mode 100644 index 0000000000..0f6e4cbd69 --- /dev/null +++ b/testsuite/tests/programs/jl_defaults/test.T @@ -0,0 +1,6 @@ + +test('jl_defaults', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/joao-circular/Data_Lazy.hs b/testsuite/tests/programs/joao-circular/Data_Lazy.hs new file mode 100644 index 0000000000..d5ab24a9ca --- /dev/null +++ b/testsuite/tests/programs/joao-circular/Data_Lazy.hs @@ -0,0 +1,273 @@ +module Data_Lazy where + +import LrcPrelude + +-- +-- Abstract Syntax +-- +-- +data P + = C_RootProd_1 !Defs + deriving (Show , Eq , Ord) + +data Defs + = C_Defs2_1 !Def !Defs + | C_NoDefs_1 + deriving (Show , Eq , Ord) + +data Def + = C_Arraydecl_1 !Type !Name !INT + | C_Declfunc_1 !Type !Name !FormPars !Stats + | C_Declfunc_header_1 !Type !Name !FormPars !Stats + | C_Declfunc_header_novar_1 !Type !Name !FormPars !Stats + | C_Vardecl_1 !Type !Name + deriving (Show , Eq , Ord) + +data Type + = C_Booltype_1 + | C_Chartype_1 + | C_Errortype_1 + | C_Inttype_1 + | C_Realtype_1 + deriving (Show , Eq , Ord) + +data Name + = C_Ident_1 !STR + deriving (Show , Eq , Ord) + +data FormPars + = C_Emptyformpars_1 + | C_Lstformpars_1 !FormPar !FormPars + deriving (Show , Eq , Ord) + +data FormPar + = C_Declformpar_1 !Type !Name + deriving (Show , Eq , Ord) + +data Stats + = C_Emptystat_1 + | C_Lststats_1 !Stat !Stats + deriving (Show , Eq , Ord) + +data Stat + = C_ArrAssign_1 !ArrayUse !Exp + | C_Assign_1 !Name !Exp + | C_Funccall_1 !Name !ActPars + | C_If_t_e_1 !Exp !Stats !Stats + | C_Input_1 !Name + | C_LocalDecl_1 !Type !Name + | C_Print_1 !Exp + | C_While_1 !Exp !Stats + deriving (Show , Eq , Ord) + +data ArrayUse + = C_ArrayInd_1 !Name !Exp + deriving (Show , Eq , Ord) + +data Exp + = C_AddExp_1 !Exp !Exp + | C_AndExp_1 !Exp !Exp + | C_DivExp_1 !Exp !Exp + | C_EqExp_1 !Exp !Exp + | C_Factor_1 !Fac + | C_GTExp_1 !Exp !Exp + | C_LTExp_1 !Exp !Exp + | C_MinExp_1 !Exp + | C_MulExp_1 !Exp !Exp + | C_NotExp_1 !Exp + | C_OrExp_1 !Exp !Exp + | C_SubExp_1 !Exp !Exp + deriving (Show , Eq , Ord) + +data Fac + = C_ArrayConst_1 !ArrayUse + | C_BoolConst_1 !BOOL + | C_CNIdent_1 !Name + | C_Expr_1 !Exp + | C_Funcinv_1 !Name !ActPars + | C_IntConst_1 !INT + | C_RealConst_1 !REAL + deriving (Show , Eq , Ord) + +data ActPars + = C_Emptyactpars_1 + | C_Lstactpars_1 !Exp !ActPars + deriving (Show , Eq , Ord) + +data PPRoot + = C_All_1 !PPS + | C_Best_1 !PPS + deriving (Show , Eq , Ord) + +data PPS + = C_Above_1 !PPS !PPS + | C_Apply_1 !PPC !PPSArgs + | C_Beside_1 !PPS !PPS + | C_Dup_1 !PPS !PPS + | C_Empty_1 + | C_FillBlock_1 !INT !FillList + | C_Filla_1 !FillList + | C_Indent_1 !INT !PPS + | C_Join_1 !PPS + | C_Text_1 !STR + deriving (Show , Eq , Ord) + +data PPC + = C_AboveC_1 !PPC !PPC + | C_ApplyC_1 !PPC !PPCArgs + | C_BesideC_1 !PPC !PPC + | C_DupC_1 !PPC !PPC + | C_IndentC_1 !INT !PPC + | C_JoinC_1 !PPC + | C_ParC_1 + deriving (Show , Eq , Ord) + +data PPCArgs + = C_ConsPPCArgs_1 !PPC !PPCArgs + | C_NilPPCArgs_1 + deriving (Show , Eq , Ord) + +data PPSArgs + = C_ConsArgs_1 !PPS !PPSArgs + | C_NilArgs_1 + deriving (Show , Eq , Ord) + +data FillList + = C_ConsFillList_1 !PPS !FillList + | C_NilFillList_1 + deriving (Show , Eq , Ord) + + +-- +-- Type of Attributes +-- +-- +type Code = [Instr] + +type CodeParams = [Code] + +data Disp + = C_Displ_1 !PPS + deriving (Show , Eq , Ord) + +data ENTRY + = C_Consarray_1 !Type !INT !INT + | C_Consfunc_1 !Type !INT !LSTPARAM + | C_Consvar_1 !Type !INT + | C_EmptyEntry_1 + deriving (Show , Eq , Ord) + +type ERROR = [OneError] + +data Format + = C_Elem_1 !INT !INT !INT !Lst_Str + deriving (Show , Eq , Ord) + +type Formats = [Format] + +data Instr + = C_ALabel_1 !Name + | C_Add_1 + | C_And_1 + | C_Call_1 !Name + | C_Cod_1 + | C_Data_1 + | C_Div_1 + | C_Eq_1 + | C_Gt_1 + | C_Halt_1 + | C_IIn_1 + | C_IOut_1 + | C_Jump_1 !Name + | C_Jumpf_1 !Name + | C_Load_1 + | C_Lt_1 + | C_Minus_1 + | C_Mul_1 + | C_Neq_1 + | C_Not_1 + | C_Or_1 + | C_Pusha_1 !Name !INT + | C_Pushb_1 !BOOL + | C_Pushi_1 !INT + | C_Pushr_1 !REAL + | C_Ret_1 + | C_Store_1 + | C_Sub_1 + | C_Var_1 !Name !INT !Type + deriving (Show , Eq , Ord) + +type LSTPARAM = [OneParam] + +type Lst_Str = [STR] + +data OneError + = C_E_FormParam_AD_1 !Name + | C_E_Fun_ND_1 !Name + | C_E_Loc_Name_AD_1 !Name + | C_E_Name_AD_1 !Name + | C_E_Name_ND_1 !Name + deriving (Show , Eq , Ord) + +data OneParam + = C_AParam_1 !Type !Name + deriving (Show , Eq , Ord) + +data OneTypeError + = C_E_T_ActParam_1 + | C_E_T_BOP_1 + | C_E_T_DT_1 !Name + | C_E_T_IndArrNotInt_1 + | C_E_T_NC_1 !Type !Type + | C_E_T_NotArithExp_1 + | C_E_T_NotBooleanExp_1 + | C_E_T_if_t_e_1 + | C_E_T_while_1 + | C_NoTypeError_1 + deriving (Show , Eq , Ord) + +data Pair_Formats + = C_C_Pair_Formats_1 !Formats !BOOL + deriving (Show , Eq , Ord) + +data Pair_Lst_T_Errs + = C_CPair_Lst_T_Errs_1 !T_Errs !T_Errs + deriving (Show , Eq , Ord) + +data Pair_Lst_T_Fmts + = C_CPair_Lst_T_Fmts_1 !T_Fmts !T_Fmts + deriving (Show , Eq , Ord) + +data Pair_Lst_T_Mins + = C_CPair_Lst_T_Mins_1 !T_Mins !T_Mins + deriving (Show , Eq , Ord) + +data Pair_T_Formats + = C_C_Pair_T_Formats_1 !T_Formats !BOOL + deriving (Show , Eq , Ord) + +data Sizes + = C_Triple_1 !INT !INT !INT + deriving (Show , Eq , Ord) + +type TYPES = [Type] + +type T_Errs = [BOOL] + +type T_Fmts = [T_Formats] + +data T_Formats + = C_AFormat_1 !Formats + | C_TFormats_1 !Formats !Formats !BOOL !BOOL + deriving (Show , Eq , Ord) + +data T_Frame + = C_F_1 !INT !INT + deriving (Show , Eq , Ord) + +type T_Mins = [Sizes] + +type T_Reqs = [T_Frame] + +type TypeError = [OneTypeError] + diff --git a/testsuite/tests/programs/joao-circular/Funcs_Lexer.hs b/testsuite/tests/programs/joao-circular/Funcs_Lexer.hs new file mode 100644 index 0000000000..c9f5c07b16 --- /dev/null +++ b/testsuite/tests/programs/joao-circular/Funcs_Lexer.hs @@ -0,0 +1,111 @@ +-- +-- Lexer for MicroC +-- +-- João Saraiva +-- 2002 +-- + + +module Funcs_Lexer where +import Data.Char + +-- +-- Tokens passed to the parser +-- + +data Token + = Tsemicolon + | TopenB + | TcloseB + | TopenSB + | TcloseSB + | TopenCB + | TcloseCB + | Ttowdots + | Tcomma + | Tequal + | Tand + | Tor + | Tassing + | Tadd + | Tmul + | Tsub + | Tdiv + | Tgt + | Tlt + | Tnot + | Ttrue + | Tfalse + | Tint + | Treal + | Tbool + | Tchar + | Tif + | Tthen + | Telse + | Twhile + | Tinput + | Tprint + | TIdent String + | TintVal Int + | TrealVal Float + deriving Show + +lexer [] = [] +lexer (';':cs) = Tsemicolon : lexer cs +lexer ('(':cs) = TopenB : lexer cs +lexer (')':cs) = TcloseB : lexer cs +lexer ('[':cs) = TopenSB : lexer cs +lexer (']':cs) = TcloseSB : lexer cs +lexer ('{':cs) = TopenCB : lexer cs +lexer ('}':cs) = TcloseCB : lexer cs +lexer (':':cs) = Ttowdots : lexer cs +lexer (',':cs) = Tcomma : lexer cs + +lexer ('=':'=':cs) = Tequal : lexer cs +lexer ('&':'&':cs) = Tor : lexer cs +lexer ('|':'|':cs) = Tand : lexer cs + +lexer ('=':cs) = Tassing : lexer cs +lexer ('+':cs) = Tadd : lexer cs +lexer ('*':cs) = Tmul : lexer cs +lexer ('-':cs) = Tsub : lexer cs +lexer ('/':cs) = Tdiv : lexer cs +lexer ('>':cs) = Tgt : lexer cs +lexer ('<':cs) = Tlt : lexer cs +lexer ('!':cs) = Tnot : lexer cs + +lexer (c:cs) + | isSpace c = lexer cs + | isAlpha c = lexSTR (c:cs) + | isDigit c = lexINT (c:cs) + +lexINT cs = + case span isDigit cs of + (var,rest) -> TintVal ((read var)::Int) : lexer rest + + +lexSTR cs = + case span isLegalChar cs of + ("true",rest) -> Ttrue : lexer rest + ("false",rest) -> Tfalse : lexer rest + ("int",rest) -> Tint : lexer rest + ("real",rest) -> Treal : lexer rest + ("bool",rest) -> Tbool : lexer rest + ("char",rest) -> Tchar : lexer rest + ("if",rest) -> Tif : lexer rest + ("then",rest) -> Tthen : lexer rest + ("else",rest) -> Telse : lexer rest + ("while",rest) -> Twhile : lexer rest + ("input",rest) -> Tinput : lexer rest + ("print",rest) -> Tprint : lexer rest + (var,rest) -> TIdent var : lexer rest + +isLegalChar c = let x = ord c + in (isAlpha c) || (isDigit c) || (c == '_') + +runScan = do s <- readFile "input" + let t = lexer s + putStr (show t) + return () -- (scanner inp)) + diff --git a/testsuite/tests/programs/joao-circular/Funcs_Parser_Lazy.hs b/testsuite/tests/programs/joao-circular/Funcs_Parser_Lazy.hs new file mode 100644 index 0000000000..ec47769beb --- /dev/null +++ b/testsuite/tests/programs/joao-circular/Funcs_Parser_Lazy.hs @@ -0,0 +1,1549 @@ +-- parser produced by Happy Version 1.13 + +module Funcs_Parser_Lazy ( runParser ) where + +import Funcs_Lexer + +import Data_Lazy + +data HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 + = HappyTerminal Token + | HappyErrorToken Int + | HappyAbsSyn4 t4 + | HappyAbsSyn5 t5 + | HappyAbsSyn6 t6 + | HappyAbsSyn7 t7 + | HappyAbsSyn8 t8 + | HappyAbsSyn9 t9 + | HappyAbsSyn10 t10 + | HappyAbsSyn11 t11 + | HappyAbsSyn12 t12 + | HappyAbsSyn13 t13 + | HappyAbsSyn14 t14 + | HappyAbsSyn15 t15 + | HappyAbsSyn16 t16 + | HappyAbsSyn17 t17 + | HappyAbsSyn18 t18 + +action_0 (41) = happyShift action_6 +action_0 (42) = happyShift action_7 +action_0 (43) = happyShift action_8 +action_0 (44) = happyShift action_9 +action_0 (51) = happyShift action_10 +action_0 (4) = happyGoto action_11 +action_0 (5) = happyGoto action_2 +action_0 (6) = happyGoto action_3 +action_0 (7) = happyGoto action_4 +action_0 (18) = happyGoto action_5 +action_0 _ = happyReduce_3 + +action_1 (41) = happyShift action_6 +action_1 (42) = happyShift action_7 +action_1 (43) = happyShift action_8 +action_1 (44) = happyShift action_9 +action_1 (51) = happyShift action_10 +action_1 (5) = happyGoto action_2 +action_1 (6) = happyGoto action_3 +action_1 (7) = happyGoto action_4 +action_1 (18) = happyGoto action_5 +action_1 _ = happyFail + +action_2 _ = happyReduce_1 + +action_3 (19) = happyShift action_14 +action_3 _ = happyFail + +action_4 (51) = happyShift action_10 +action_4 (18) = happyGoto action_13 +action_4 _ = happyFail + +action_5 (20) = happyShift action_12 +action_5 _ = happyFail + +action_6 _ = happyReduce_7 + +action_7 _ = happyReduce_8 + +action_8 _ = happyReduce_9 + +action_9 _ = happyReduce_10 + +action_10 _ = happyReduce_51 + +action_11 (54) = happyAccept +action_11 _ = happyFail + +action_12 (41) = happyShift action_6 +action_12 (42) = happyShift action_7 +action_12 (43) = happyShift action_8 +action_12 (44) = happyShift action_9 +action_12 (7) = happyGoto action_17 +action_12 (8) = happyGoto action_18 +action_12 (9) = happyGoto action_19 +action_12 (10) = happyGoto action_20 +action_12 _ = happyReduce_11 + +action_13 (22) = happyShift action_16 +action_13 _ = happyReduce_4 + +action_14 (41) = happyShift action_6 +action_14 (42) = happyShift action_7 +action_14 (43) = happyShift action_8 +action_14 (44) = happyShift action_9 +action_14 (51) = happyShift action_10 +action_14 (5) = happyGoto action_15 +action_14 (6) = happyGoto action_3 +action_14 (7) = happyGoto action_4 +action_14 (18) = happyGoto action_5 +action_14 _ = happyReduce_3 + +action_15 _ = happyReduce_2 + +action_16 (52) = happyShift action_24 +action_16 _ = happyFail + +action_17 (51) = happyShift action_10 +action_17 (18) = happyGoto action_23 +action_17 _ = happyFail + +action_18 (21) = happyShift action_22 +action_18 _ = happyFail + +action_19 _ = happyReduce_12 + +action_20 (27) = happyShift action_21 +action_20 _ = happyReduce_14 + +action_21 (41) = happyShift action_6 +action_21 (42) = happyShift action_7 +action_21 (43) = happyShift action_8 +action_21 (44) = happyShift action_9 +action_21 (7) = happyGoto action_17 +action_21 (9) = happyGoto action_27 +action_21 (10) = happyGoto action_20 +action_21 _ = happyFail + +action_22 (26) = happyShift action_26 +action_22 _ = happyFail + +action_23 _ = happyReduce_15 + +action_24 (23) = happyShift action_25 +action_24 _ = happyFail + +action_25 _ = happyReduce_5 + +action_26 (41) = happyShift action_6 +action_26 (42) = happyShift action_7 +action_26 (43) = happyShift action_8 +action_26 (44) = happyShift action_9 +action_26 (7) = happyGoto action_28 +action_26 _ = happyFail + +action_27 _ = happyReduce_13 + +action_28 (24) = happyShift action_29 +action_28 _ = happyFail + +action_29 (41) = happyShift action_6 +action_29 (42) = happyShift action_7 +action_29 (43) = happyShift action_8 +action_29 (44) = happyShift action_9 +action_29 (45) = happyShift action_35 +action_29 (48) = happyShift action_36 +action_29 (49) = happyShift action_37 +action_29 (50) = happyShift action_38 +action_29 (51) = happyShift action_10 +action_29 (7) = happyGoto action_30 +action_29 (11) = happyGoto action_31 +action_29 (12) = happyGoto action_32 +action_29 (15) = happyGoto action_33 +action_29 (18) = happyGoto action_34 +action_29 _ = happyReduce_17 + +action_30 (51) = happyShift action_10 +action_30 (18) = happyGoto action_59 +action_30 _ = happyFail + +action_31 (25) = happyShift action_58 +action_31 _ = happyFail + +action_32 (19) = happyShift action_57 +action_32 _ = happyFail + +action_33 (31) = happyShift action_56 +action_33 _ = happyFail + +action_34 (20) = happyShift action_53 +action_34 (22) = happyShift action_54 +action_34 (31) = happyShift action_55 +action_34 _ = happyFail + +action_35 (20) = happyShift action_43 +action_35 (34) = happyShift action_44 +action_35 (38) = happyShift action_45 +action_35 (39) = happyShift action_46 +action_35 (40) = happyShift action_47 +action_35 (51) = happyShift action_10 +action_35 (52) = happyShift action_48 +action_35 (53) = happyShift action_49 +action_35 (13) = happyGoto action_52 +action_35 (14) = happyGoto action_40 +action_35 (15) = happyGoto action_41 +action_35 (18) = happyGoto action_42 +action_35 _ = happyFail + +action_36 (20) = happyShift action_43 +action_36 (34) = happyShift action_44 +action_36 (38) = happyShift action_45 +action_36 (39) = happyShift action_46 +action_36 (40) = happyShift action_47 +action_36 (51) = happyShift action_10 +action_36 (52) = happyShift action_48 +action_36 (53) = happyShift action_49 +action_36 (13) = happyGoto action_51 +action_36 (14) = happyGoto action_40 +action_36 (15) = happyGoto action_41 +action_36 (18) = happyGoto action_42 +action_36 _ = happyFail + +action_37 (51) = happyShift action_10 +action_37 (18) = happyGoto action_50 +action_37 _ = happyFail + +action_38 (20) = happyShift action_43 +action_38 (34) = happyShift action_44 +action_38 (38) = happyShift action_45 +action_38 (39) = happyShift action_46 +action_38 (40) = happyShift action_47 +action_38 (51) = happyShift action_10 +action_38 (52) = happyShift action_48 +action_38 (53) = happyShift action_49 +action_38 (13) = happyGoto action_39 +action_38 (14) = happyGoto action_40 +action_38 (15) = happyGoto action_41 +action_38 (18) = happyGoto action_42 +action_38 _ = happyFail + +action_39 (28) = happyShift action_67 +action_39 (29) = happyShift action_68 +action_39 (30) = happyShift action_69 +action_39 (32) = happyShift action_70 +action_39 (33) = happyShift action_71 +action_39 (34) = happyShift action_72 +action_39 (35) = happyShift action_73 +action_39 (36) = happyShift action_74 +action_39 (37) = happyShift action_75 +action_39 _ = happyReduce_25 + +action_40 _ = happyReduce_26 + +action_41 _ = happyReduce_42 + +action_42 (20) = happyShift action_81 +action_42 (22) = happyShift action_54 +action_42 _ = happyReduce_43 + +action_43 (20) = happyShift action_43 +action_43 (34) = happyShift action_44 +action_43 (38) = happyShift action_45 +action_43 (39) = happyShift action_46 +action_43 (40) = happyShift action_47 +action_43 (51) = happyShift action_10 +action_43 (52) = happyShift action_48 +action_43 (53) = happyShift action_49 +action_43 (13) = happyGoto action_80 +action_43 (14) = happyGoto action_40 +action_43 (15) = happyGoto action_41 +action_43 (18) = happyGoto action_42 +action_43 _ = happyFail + +action_44 (20) = happyShift action_43 +action_44 (34) = happyShift action_44 +action_44 (38) = happyShift action_45 +action_44 (39) = happyShift action_46 +action_44 (40) = happyShift action_47 +action_44 (51) = happyShift action_10 +action_44 (52) = happyShift action_48 +action_44 (53) = happyShift action_49 +action_44 (13) = happyGoto action_79 +action_44 (14) = happyGoto action_40 +action_44 (15) = happyGoto action_41 +action_44 (18) = happyGoto action_42 +action_44 _ = happyFail + +action_45 (20) = happyShift action_43 +action_45 (34) = happyShift action_44 +action_45 (38) = happyShift action_45 +action_45 (39) = happyShift action_46 +action_45 (40) = happyShift action_47 +action_45 (51) = happyShift action_10 +action_45 (52) = happyShift action_48 +action_45 (53) = happyShift action_49 +action_45 (13) = happyGoto action_78 +action_45 (14) = happyGoto action_40 +action_45 (15) = happyGoto action_41 +action_45 (18) = happyGoto action_42 +action_45 _ = happyFail + +action_46 _ = happyReduce_40 + +action_47 _ = happyReduce_41 + +action_48 _ = happyReduce_38 + +action_49 _ = happyReduce_39 + +action_50 _ = happyReduce_24 + +action_51 (24) = happyShift action_77 +action_51 (28) = happyShift action_67 +action_51 (29) = happyShift action_68 +action_51 (30) = happyShift action_69 +action_51 (32) = happyShift action_70 +action_51 (33) = happyShift action_71 +action_51 (34) = happyShift action_72 +action_51 (35) = happyShift action_73 +action_51 (36) = happyShift action_74 +action_51 (37) = happyShift action_75 +action_51 _ = happyFail + +action_52 (28) = happyShift action_67 +action_52 (29) = happyShift action_68 +action_52 (30) = happyShift action_69 +action_52 (32) = happyShift action_70 +action_52 (33) = happyShift action_71 +action_52 (34) = happyShift action_72 +action_52 (35) = happyShift action_73 +action_52 (36) = happyShift action_74 +action_52 (37) = happyShift action_75 +action_52 (46) = happyShift action_76 +action_52 _ = happyFail + +action_53 (20) = happyShift action_43 +action_53 (34) = happyShift action_44 +action_53 (38) = happyShift action_45 +action_53 (39) = happyShift action_46 +action_53 (40) = happyShift action_47 +action_53 (51) = happyShift action_10 +action_53 (52) = happyShift action_48 +action_53 (53) = happyShift action_49 +action_53 (13) = happyGoto action_64 +action_53 (14) = happyGoto action_40 +action_53 (15) = happyGoto action_41 +action_53 (16) = happyGoto action_65 +action_53 (17) = happyGoto action_66 +action_53 (18) = happyGoto action_42 +action_53 _ = happyReduce_47 + +action_54 (20) = happyShift action_43 +action_54 (34) = happyShift action_44 +action_54 (38) = happyShift action_45 +action_54 (39) = happyShift action_46 +action_54 (40) = happyShift action_47 +action_54 (51) = happyShift action_10 +action_54 (52) = happyShift action_48 +action_54 (53) = happyShift action_49 +action_54 (13) = happyGoto action_63 +action_54 (14) = happyGoto action_40 +action_54 (15) = happyGoto action_41 +action_54 (18) = happyGoto action_42 +action_54 _ = happyFail + +action_55 (20) = happyShift action_43 +action_55 (34) = happyShift action_44 +action_55 (38) = happyShift action_45 +action_55 (39) = happyShift action_46 +action_55 (40) = happyShift action_47 +action_55 (51) = happyShift action_10 +action_55 (52) = happyShift action_48 +action_55 (53) = happyShift action_49 +action_55 (13) = happyGoto action_62 +action_55 (14) = happyGoto action_40 +action_55 (15) = happyGoto action_41 +action_55 (18) = happyGoto action_42 +action_55 _ = happyFail + +action_56 (20) = happyShift action_43 +action_56 (34) = happyShift action_44 +action_56 (38) = happyShift action_45 +action_56 (39) = happyShift action_46 +action_56 (40) = happyShift action_47 +action_56 (51) = happyShift action_10 +action_56 (52) = happyShift action_48 +action_56 (53) = happyShift action_49 +action_56 (13) = happyGoto action_61 +action_56 (14) = happyGoto action_40 +action_56 (15) = happyGoto action_41 +action_56 (18) = happyGoto action_42 +action_56 _ = happyFail + +action_57 (41) = happyShift action_6 +action_57 (42) = happyShift action_7 +action_57 (43) = happyShift action_8 +action_57 (44) = happyShift action_9 +action_57 (45) = happyShift action_35 +action_57 (48) = happyShift action_36 +action_57 (49) = happyShift action_37 +action_57 (50) = happyShift action_38 +action_57 (51) = happyShift action_10 +action_57 (7) = happyGoto action_30 +action_57 (11) = happyGoto action_60 +action_57 (12) = happyGoto action_32 +action_57 (15) = happyGoto action_33 +action_57 (18) = happyGoto action_34 +action_57 _ = happyReduce_17 + +action_58 _ = happyReduce_6 + +action_59 _ = happyReduce_18 + +action_60 _ = happyReduce_16 + +action_61 (28) = happyShift action_67 +action_61 (29) = happyShift action_68 +action_61 (30) = happyShift action_69 +action_61 (32) = happyShift action_70 +action_61 (33) = happyShift action_71 +action_61 (34) = happyShift action_72 +action_61 (35) = happyShift action_73 +action_61 (36) = happyShift action_74 +action_61 (37) = happyShift action_75 +action_61 _ = happyReduce_20 + +action_62 (28) = happyShift action_67 +action_62 (29) = happyShift action_68 +action_62 (30) = happyShift action_69 +action_62 (32) = happyShift action_70 +action_62 (33) = happyShift action_71 +action_62 (34) = happyShift action_72 +action_62 (35) = happyShift action_73 +action_62 (36) = happyShift action_74 +action_62 (37) = happyShift action_75 +action_62 _ = happyReduce_19 + +action_63 (23) = happyShift action_97 +action_63 (28) = happyShift action_67 +action_63 (29) = happyShift action_68 +action_63 (30) = happyShift action_69 +action_63 (32) = happyShift action_70 +action_63 (33) = happyShift action_71 +action_63 (34) = happyShift action_72 +action_63 (35) = happyShift action_73 +action_63 (36) = happyShift action_74 +action_63 (37) = happyShift action_75 +action_63 _ = happyFail + +action_64 (27) = happyShift action_96 +action_64 (28) = happyShift action_67 +action_64 (29) = happyShift action_68 +action_64 (30) = happyShift action_69 +action_64 (32) = happyShift action_70 +action_64 (33) = happyShift action_71 +action_64 (34) = happyShift action_72 +action_64 (35) = happyShift action_73 +action_64 (36) = happyShift action_74 +action_64 (37) = happyShift action_75 +action_64 _ = happyReduce_50 + +action_65 (21) = happyShift action_95 +action_65 _ = happyFail + +action_66 _ = happyReduce_48 + +action_67 (20) = happyShift action_43 +action_67 (34) = happyShift action_44 +action_67 (38) = happyShift action_45 +action_67 (39) = happyShift action_46 +action_67 (40) = happyShift action_47 +action_67 (51) = happyShift action_10 +action_67 (52) = happyShift action_48 +action_67 (53) = happyShift action_49 +action_67 (13) = happyGoto action_94 +action_67 (14) = happyGoto action_40 +action_67 (15) = happyGoto action_41 +action_67 (18) = happyGoto action_42 +action_67 _ = happyFail + +action_68 (20) = happyShift action_43 +action_68 (34) = happyShift action_44 +action_68 (38) = happyShift action_45 +action_68 (39) = happyShift action_46 +action_68 (40) = happyShift action_47 +action_68 (51) = happyShift action_10 +action_68 (52) = happyShift action_48 +action_68 (53) = happyShift action_49 +action_68 (13) = happyGoto action_93 +action_68 (14) = happyGoto action_40 +action_68 (15) = happyGoto action_41 +action_68 (18) = happyGoto action_42 +action_68 _ = happyFail + +action_69 (20) = happyShift action_43 +action_69 (34) = happyShift action_44 +action_69 (38) = happyShift action_45 +action_69 (39) = happyShift action_46 +action_69 (40) = happyShift action_47 +action_69 (51) = happyShift action_10 +action_69 (52) = happyShift action_48 +action_69 (53) = happyShift action_49 +action_69 (13) = happyGoto action_92 +action_69 (14) = happyGoto action_40 +action_69 (15) = happyGoto action_41 +action_69 (18) = happyGoto action_42 +action_69 _ = happyFail + +action_70 (20) = happyShift action_43 +action_70 (34) = happyShift action_44 +action_70 (38) = happyShift action_45 +action_70 (39) = happyShift action_46 +action_70 (40) = happyShift action_47 +action_70 (51) = happyShift action_10 +action_70 (52) = happyShift action_48 +action_70 (53) = happyShift action_49 +action_70 (13) = happyGoto action_91 +action_70 (14) = happyGoto action_40 +action_70 (15) = happyGoto action_41 +action_70 (18) = happyGoto action_42 +action_70 _ = happyFail + +action_71 (20) = happyShift action_43 +action_71 (34) = happyShift action_44 +action_71 (38) = happyShift action_45 +action_71 (39) = happyShift action_46 +action_71 (40) = happyShift action_47 +action_71 (51) = happyShift action_10 +action_71 (52) = happyShift action_48 +action_71 (53) = happyShift action_49 +action_71 (13) = happyGoto action_90 +action_71 (14) = happyGoto action_40 +action_71 (15) = happyGoto action_41 +action_71 (18) = happyGoto action_42 +action_71 _ = happyFail + +action_72 (20) = happyShift action_43 +action_72 (34) = happyShift action_44 +action_72 (38) = happyShift action_45 +action_72 (39) = happyShift action_46 +action_72 (40) = happyShift action_47 +action_72 (51) = happyShift action_10 +action_72 (52) = happyShift action_48 +action_72 (53) = happyShift action_49 +action_72 (13) = happyGoto action_89 +action_72 (14) = happyGoto action_40 +action_72 (15) = happyGoto action_41 +action_72 (18) = happyGoto action_42 +action_72 _ = happyFail + +action_73 (20) = happyShift action_43 +action_73 (34) = happyShift action_44 +action_73 (38) = happyShift action_45 +action_73 (39) = happyShift action_46 +action_73 (40) = happyShift action_47 +action_73 (51) = happyShift action_10 +action_73 (52) = happyShift action_48 +action_73 (53) = happyShift action_49 +action_73 (13) = happyGoto action_88 +action_73 (14) = happyGoto action_40 +action_73 (15) = happyGoto action_41 +action_73 (18) = happyGoto action_42 +action_73 _ = happyFail + +action_74 (20) = happyShift action_43 +action_74 (34) = happyShift action_44 +action_74 (38) = happyShift action_45 +action_74 (39) = happyShift action_46 +action_74 (40) = happyShift action_47 +action_74 (51) = happyShift action_10 +action_74 (52) = happyShift action_48 +action_74 (53) = happyShift action_49 +action_74 (13) = happyGoto action_87 +action_74 (14) = happyGoto action_40 +action_74 (15) = happyGoto action_41 +action_74 (18) = happyGoto action_42 +action_74 _ = happyFail + +action_75 (20) = happyShift action_43 +action_75 (34) = happyShift action_44 +action_75 (38) = happyShift action_45 +action_75 (39) = happyShift action_46 +action_75 (40) = happyShift action_47 +action_75 (51) = happyShift action_10 +action_75 (52) = happyShift action_48 +action_75 (53) = happyShift action_49 +action_75 (13) = happyGoto action_86 +action_75 (14) = happyGoto action_40 +action_75 (15) = happyGoto action_41 +action_75 (18) = happyGoto action_42 +action_75 _ = happyFail + +action_76 (24) = happyShift action_85 +action_76 _ = happyFail + +action_77 (41) = happyShift action_6 +action_77 (42) = happyShift action_7 +action_77 (43) = happyShift action_8 +action_77 (44) = happyShift action_9 +action_77 (45) = happyShift action_35 +action_77 (48) = happyShift action_36 +action_77 (49) = happyShift action_37 +action_77 (50) = happyShift action_38 +action_77 (51) = happyShift action_10 +action_77 (7) = happyGoto action_30 +action_77 (11) = happyGoto action_84 +action_77 (12) = happyGoto action_32 +action_77 (15) = happyGoto action_33 +action_77 (18) = happyGoto action_34 +action_77 _ = happyReduce_17 + +action_78 (28) = happyShift action_67 +action_78 (29) = happyShift action_68 +action_78 (30) = happyShift action_69 +action_78 (32) = happyShift action_70 +action_78 (33) = happyShift action_71 +action_78 (34) = happyShift action_72 +action_78 (35) = happyShift action_73 +action_78 (36) = happyShift action_74 +action_78 (37) = happyShift action_75 +action_78 _ = happyReduce_36 + +action_79 (28) = happyShift action_67 +action_79 (29) = happyShift action_68 +action_79 (30) = happyShift action_69 +action_79 (32) = happyShift action_70 +action_79 (33) = happyShift action_71 +action_79 (34) = happyShift action_72 +action_79 (35) = happyShift action_73 +action_79 (36) = happyShift action_74 +action_79 (37) = happyShift action_75 +action_79 _ = happyReduce_37 + +action_80 (21) = happyShift action_83 +action_80 (28) = happyShift action_67 +action_80 (29) = happyShift action_68 +action_80 (30) = happyShift action_69 +action_80 (32) = happyShift action_70 +action_80 (33) = happyShift action_71 +action_80 (34) = happyShift action_72 +action_80 (35) = happyShift action_73 +action_80 (36) = happyShift action_74 +action_80 (37) = happyShift action_75 +action_80 _ = happyFail + +action_81 (20) = happyShift action_43 +action_81 (34) = happyShift action_44 +action_81 (38) = happyShift action_45 +action_81 (39) = happyShift action_46 +action_81 (40) = happyShift action_47 +action_81 (51) = happyShift action_10 +action_81 (52) = happyShift action_48 +action_81 (53) = happyShift action_49 +action_81 (13) = happyGoto action_64 +action_81 (14) = happyGoto action_40 +action_81 (15) = happyGoto action_41 +action_81 (17) = happyGoto action_82 +action_81 (18) = happyGoto action_42 +action_81 _ = happyFail + +action_82 (21) = happyShift action_101 +action_82 _ = happyFail + +action_83 _ = happyReduce_45 + +action_84 (25) = happyShift action_100 +action_84 _ = happyFail + +action_85 (41) = happyShift action_6 +action_85 (42) = happyShift action_7 +action_85 (43) = happyShift action_8 +action_85 (44) = happyShift action_9 +action_85 (45) = happyShift action_35 +action_85 (48) = happyShift action_36 +action_85 (49) = happyShift action_37 +action_85 (50) = happyShift action_38 +action_85 (51) = happyShift action_10 +action_85 (7) = happyGoto action_30 +action_85 (11) = happyGoto action_99 +action_85 (12) = happyGoto action_32 +action_85 (15) = happyGoto action_33 +action_85 (18) = happyGoto action_34 +action_85 _ = happyReduce_17 + +action_86 (28) = happyShift action_67 +action_86 (29) = happyShift action_68 +action_86 (30) = happyShift action_69 +action_86 (32) = happyShift action_70 +action_86 (33) = happyShift action_71 +action_86 (34) = happyShift action_72 +action_86 (35) = happyShift action_73 +action_86 (36) = happyShift action_74 +action_86 (37) = happyShift action_75 +action_86 _ = happyReduce_35 + +action_87 (28) = happyShift action_67 +action_87 (29) = happyShift action_68 +action_87 (30) = happyShift action_69 +action_87 (32) = happyShift action_70 +action_87 (33) = happyShift action_71 +action_87 (34) = happyShift action_72 +action_87 (35) = happyShift action_73 +action_87 (36) = happyShift action_74 +action_87 (37) = happyShift action_75 +action_87 _ = happyReduce_34 + +action_88 (28) = happyShift action_67 +action_88 (29) = happyShift action_68 +action_88 (30) = happyShift action_69 +action_88 (32) = happyShift action_70 +action_88 (33) = happyShift action_71 +action_88 (34) = happyShift action_72 +action_88 (35) = happyShift action_73 +action_88 (36) = happyShift action_74 +action_88 (37) = happyShift action_75 +action_88 _ = happyReduce_30 + +action_89 (28) = happyShift action_67 +action_89 (29) = happyShift action_68 +action_89 (30) = happyShift action_69 +action_89 (32) = happyShift action_70 +action_89 (33) = happyShift action_71 +action_89 (34) = happyShift action_72 +action_89 (35) = happyShift action_73 +action_89 (36) = happyShift action_74 +action_89 (37) = happyShift action_75 +action_89 _ = happyReduce_28 + +action_90 (28) = happyShift action_67 +action_90 (29) = happyShift action_68 +action_90 (30) = happyShift action_69 +action_90 (32) = happyShift action_70 +action_90 (33) = happyShift action_71 +action_90 (34) = happyShift action_72 +action_90 (35) = happyShift action_73 +action_90 (36) = happyShift action_74 +action_90 (37) = happyShift action_75 +action_90 _ = happyReduce_29 + +action_91 (28) = happyShift action_67 +action_91 (29) = happyShift action_68 +action_91 (30) = happyShift action_69 +action_91 (32) = happyShift action_70 +action_91 (33) = happyShift action_71 +action_91 (34) = happyShift action_72 +action_91 (35) = happyShift action_73 +action_91 (36) = happyShift action_74 +action_91 (37) = happyShift action_75 +action_91 _ = happyReduce_27 + +action_92 (28) = happyShift action_67 +action_92 (29) = happyShift action_68 +action_92 (30) = happyShift action_69 +action_92 (32) = happyShift action_70 +action_92 (33) = happyShift action_71 +action_92 (34) = happyShift action_72 +action_92 (35) = happyShift action_73 +action_92 (36) = happyShift action_74 +action_92 (37) = happyShift action_75 +action_92 _ = happyReduce_32 + +action_93 (28) = happyShift action_67 +action_93 (29) = happyShift action_68 +action_93 (30) = happyShift action_69 +action_93 (32) = happyShift action_70 +action_93 (33) = happyShift action_71 +action_93 (34) = happyShift action_72 +action_93 (35) = happyShift action_73 +action_93 (36) = happyShift action_74 +action_93 (37) = happyShift action_75 +action_93 _ = happyReduce_31 + +action_94 (28) = happyShift action_67 +action_94 (29) = happyShift action_68 +action_94 (30) = happyShift action_69 +action_94 (32) = happyShift action_70 +action_94 (33) = happyShift action_71 +action_94 (34) = happyShift action_72 +action_94 (35) = happyShift action_73 +action_94 (36) = happyShift action_74 +action_94 (37) = happyShift action_75 +action_94 _ = happyReduce_33 + +action_95 _ = happyReduce_21 + +action_96 (20) = happyShift action_43 +action_96 (34) = happyShift action_44 +action_96 (38) = happyShift action_45 +action_96 (39) = happyShift action_46 +action_96 (40) = happyShift action_47 +action_96 (51) = happyShift action_10 +action_96 (52) = happyShift action_48 +action_96 (53) = happyShift action_49 +action_96 (13) = happyGoto action_64 +action_96 (14) = happyGoto action_40 +action_96 (15) = happyGoto action_41 +action_96 (17) = happyGoto action_98 +action_96 (18) = happyGoto action_42 +action_96 _ = happyFail + +action_97 _ = happyReduce_46 + +action_98 _ = happyReduce_49 + +action_99 (25) = happyShift action_102 +action_99 _ = happyFail + +action_100 _ = happyReduce_22 + +action_101 _ = happyReduce_44 + +action_102 (47) = happyShift action_103 +action_102 _ = happyFail + +action_103 (24) = happyShift action_104 +action_103 _ = happyFail + +action_104 (41) = happyShift action_6 +action_104 (42) = happyShift action_7 +action_104 (43) = happyShift action_8 +action_104 (44) = happyShift action_9 +action_104 (45) = happyShift action_35 +action_104 (48) = happyShift action_36 +action_104 (49) = happyShift action_37 +action_104 (50) = happyShift action_38 +action_104 (51) = happyShift action_10 +action_104 (7) = happyGoto action_30 +action_104 (11) = happyGoto action_105 +action_104 (12) = happyGoto action_32 +action_104 (15) = happyGoto action_33 +action_104 (18) = happyGoto action_34 +action_104 _ = happyReduce_17 + +action_105 (25) = happyShift action_106 +action_105 _ = happyFail + +action_106 _ = happyReduce_23 + +happyReduce_1 = happySpecReduce_1 4 happyReduction_1 +happyReduction_1 (HappyAbsSyn5 happy_var_1) + = HappyAbsSyn4 + (C_RootProd_1 happy_var_1 + ) +happyReduction_1 _ = notHappyAtAll + +happyReduce_2 = happySpecReduce_3 5 happyReduction_2 +happyReduction_2 (HappyAbsSyn5 happy_var_3) + _ + (HappyAbsSyn6 happy_var_1) + = HappyAbsSyn5 + (C_Defs2_1 happy_var_1 happy_var_3 + ) +happyReduction_2 _ _ _ = notHappyAtAll + +happyReduce_3 = happySpecReduce_0 5 happyReduction_3 +happyReduction_3 = HappyAbsSyn5 + (C_NoDefs_1 + ) + +happyReduce_4 = happySpecReduce_2 6 happyReduction_4 +happyReduction_4 (HappyAbsSyn18 happy_var_2) + (HappyAbsSyn7 happy_var_1) + = HappyAbsSyn6 + (C_Vardecl_1 happy_var_1 happy_var_2 + ) +happyReduction_4 _ _ = notHappyAtAll + +happyReduce_5 = happyReduce 5 6 happyReduction_5 +happyReduction_5 (_ `HappyStk` + (HappyTerminal (TintVal happy_var_4)) `HappyStk` + _ `HappyStk` + (HappyAbsSyn18 happy_var_2) `HappyStk` + (HappyAbsSyn7 happy_var_1) `HappyStk` + happyRest) + = HappyAbsSyn6 + (C_Arraydecl_1 happy_var_1 happy_var_2 (toInteger happy_var_4) + ) `HappyStk` happyRest + +happyReduce_6 = happyReduce 9 6 happyReduction_6 +happyReduction_6 (_ `HappyStk` + (HappyAbsSyn11 happy_var_8) `HappyStk` + _ `HappyStk` + (HappyAbsSyn7 happy_var_6) `HappyStk` + _ `HappyStk` + _ `HappyStk` + (HappyAbsSyn8 happy_var_3) `HappyStk` + _ `HappyStk` + (HappyAbsSyn18 happy_var_1) `HappyStk` + happyRest) + = HappyAbsSyn6 + (C_Declfunc_1 happy_var_6 happy_var_1 happy_var_3 happy_var_8 + ) `HappyStk` happyRest + +happyReduce_7 = happySpecReduce_1 7 happyReduction_7 +happyReduction_7 _ + = HappyAbsSyn7 + (C_Inttype_1 + ) + +happyReduce_8 = happySpecReduce_1 7 happyReduction_8 +happyReduction_8 _ + = HappyAbsSyn7 + (C_Realtype_1 + ) + +happyReduce_9 = happySpecReduce_1 7 happyReduction_9 +happyReduction_9 _ + = HappyAbsSyn7 + (C_Booltype_1 + ) + +happyReduce_10 = happySpecReduce_1 7 happyReduction_10 +happyReduction_10 _ + = HappyAbsSyn7 + (C_Chartype_1 + ) + +happyReduce_11 = happySpecReduce_0 8 happyReduction_11 +happyReduction_11 = HappyAbsSyn8 + (C_Emptyformpars_1 + ) + +happyReduce_12 = happySpecReduce_1 8 happyReduction_12 +happyReduction_12 (HappyAbsSyn9 happy_var_1) + = HappyAbsSyn8 + (happy_var_1 + ) +happyReduction_12 _ = notHappyAtAll + +happyReduce_13 = happySpecReduce_3 9 happyReduction_13 +happyReduction_13 (HappyAbsSyn9 happy_var_3) + _ + (HappyAbsSyn10 happy_var_1) + = HappyAbsSyn9 + (C_Lstformpars_1 happy_var_1 happy_var_3 + ) +happyReduction_13 _ _ _ = notHappyAtAll + +happyReduce_14 = happySpecReduce_1 9 happyReduction_14 +happyReduction_14 (HappyAbsSyn10 happy_var_1) + = HappyAbsSyn9 + (C_Lstformpars_1 happy_var_1 C_Emptyformpars_1 + ) +happyReduction_14 _ = notHappyAtAll + +happyReduce_15 = happySpecReduce_2 10 happyReduction_15 +happyReduction_15 (HappyAbsSyn18 happy_var_2) + (HappyAbsSyn7 happy_var_1) + = HappyAbsSyn10 + (C_Declformpar_1 happy_var_1 happy_var_2 + ) +happyReduction_15 _ _ = notHappyAtAll + +happyReduce_16 = happySpecReduce_3 11 happyReduction_16 +happyReduction_16 (HappyAbsSyn11 happy_var_3) + _ + (HappyAbsSyn12 happy_var_1) + = HappyAbsSyn11 + (C_Lststats_1 happy_var_1 happy_var_3 + ) +happyReduction_16 _ _ _ = notHappyAtAll + +happyReduce_17 = happySpecReduce_0 11 happyReduction_17 +happyReduction_17 = HappyAbsSyn11 + (C_Emptystat_1 + ) + +happyReduce_18 = happySpecReduce_2 12 happyReduction_18 +happyReduction_18 (HappyAbsSyn18 happy_var_2) + (HappyAbsSyn7 happy_var_1) + = HappyAbsSyn12 + (C_LocalDecl_1 happy_var_1 happy_var_2 + ) +happyReduction_18 _ _ = notHappyAtAll + +happyReduce_19 = happySpecReduce_3 12 happyReduction_19 +happyReduction_19 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn18 happy_var_1) + = HappyAbsSyn12 + (C_Assign_1 happy_var_1 happy_var_3 + ) +happyReduction_19 _ _ _ = notHappyAtAll + +happyReduce_20 = happySpecReduce_3 12 happyReduction_20 +happyReduction_20 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn15 happy_var_1) + = HappyAbsSyn12 + (C_ArrAssign_1 happy_var_1 happy_var_3 + ) +happyReduction_20 _ _ _ = notHappyAtAll + +happyReduce_21 = happyReduce 4 12 happyReduction_21 +happyReduction_21 (_ `HappyStk` + (HappyAbsSyn16 happy_var_3) `HappyStk` + _ `HappyStk` + (HappyAbsSyn18 happy_var_1) `HappyStk` + happyRest) + = HappyAbsSyn12 + (C_Funccall_1 happy_var_1 happy_var_3 + ) `HappyStk` happyRest + +happyReduce_22 = happyReduce 5 12 happyReduction_22 +happyReduction_22 (_ `HappyStk` + (HappyAbsSyn11 happy_var_4) `HappyStk` + _ `HappyStk` + (HappyAbsSyn13 happy_var_2) `HappyStk` + _ `HappyStk` + happyRest) + = HappyAbsSyn12 + (C_While_1 happy_var_2 happy_var_4 + ) `HappyStk` happyRest + +happyReduce_23 = happyReduce 10 12 happyReduction_23 +happyReduction_23 (_ `HappyStk` + (HappyAbsSyn11 happy_var_9) `HappyStk` + _ `HappyStk` + _ `HappyStk` + _ `HappyStk` + (HappyAbsSyn11 happy_var_5) `HappyStk` + _ `HappyStk` + _ `HappyStk` + (HappyAbsSyn13 happy_var_2) `HappyStk` + _ `HappyStk` + happyRest) + = HappyAbsSyn12 + (C_If_t_e_1 happy_var_2 happy_var_5 happy_var_9 + ) `HappyStk` happyRest + +happyReduce_24 = happySpecReduce_2 12 happyReduction_24 +happyReduction_24 (HappyAbsSyn18 happy_var_2) + _ + = HappyAbsSyn12 + (C_Input_1 happy_var_2 + ) +happyReduction_24 _ _ = notHappyAtAll + +happyReduce_25 = happySpecReduce_2 12 happyReduction_25 +happyReduction_25 (HappyAbsSyn13 happy_var_2) + _ + = HappyAbsSyn12 + (C_Print_1 happy_var_2 + ) +happyReduction_25 _ _ = notHappyAtAll + +happyReduce_26 = happySpecReduce_1 13 happyReduction_26 +happyReduction_26 (HappyAbsSyn14 happy_var_1) + = HappyAbsSyn13 + (C_Factor_1 happy_var_1 + ) +happyReduction_26 _ = notHappyAtAll + +happyReduce_27 = happySpecReduce_3 13 happyReduction_27 +happyReduction_27 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn13 + (C_AddExp_1 happy_var_1 happy_var_3 + ) +happyReduction_27 _ _ _ = notHappyAtAll + +happyReduce_28 = happySpecReduce_3 13 happyReduction_28 +happyReduction_28 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn13 + (C_SubExp_1 happy_var_1 happy_var_3 + ) +happyReduction_28 _ _ _ = notHappyAtAll + +happyReduce_29 = happySpecReduce_3 13 happyReduction_29 +happyReduction_29 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn13 + (C_MulExp_1 happy_var_1 happy_var_3 + ) +happyReduction_29 _ _ _ = notHappyAtAll + +happyReduce_30 = happySpecReduce_3 13 happyReduction_30 +happyReduction_30 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn13 + (C_DivExp_1 happy_var_1 happy_var_3 + ) +happyReduction_30 _ _ _ = notHappyAtAll + +happyReduce_31 = happySpecReduce_3 13 happyReduction_31 +happyReduction_31 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn13 + (C_AndExp_1 happy_var_1 happy_var_3 + ) +happyReduction_31 _ _ _ = notHappyAtAll + +happyReduce_32 = happySpecReduce_3 13 happyReduction_32 +happyReduction_32 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn13 + (C_OrExp_1 happy_var_1 happy_var_3 + ) +happyReduction_32 _ _ _ = notHappyAtAll + +happyReduce_33 = happySpecReduce_3 13 happyReduction_33 +happyReduction_33 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn13 + (C_EqExp_1 happy_var_1 happy_var_3 + ) +happyReduction_33 _ _ _ = notHappyAtAll + +happyReduce_34 = happySpecReduce_3 13 happyReduction_34 +happyReduction_34 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn13 + (C_GTExp_1 happy_var_1 happy_var_3 + ) +happyReduction_34 _ _ _ = notHappyAtAll + +happyReduce_35 = happySpecReduce_3 13 happyReduction_35 +happyReduction_35 (HappyAbsSyn13 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn13 + (C_LTExp_1 happy_var_1 happy_var_3 + ) +happyReduction_35 _ _ _ = notHappyAtAll + +happyReduce_36 = happySpecReduce_2 13 happyReduction_36 +happyReduction_36 (HappyAbsSyn13 happy_var_2) + _ + = HappyAbsSyn13 + (C_NotExp_1 happy_var_2 + ) +happyReduction_36 _ _ = notHappyAtAll + +happyReduce_37 = happySpecReduce_2 13 happyReduction_37 +happyReduction_37 (HappyAbsSyn13 happy_var_2) + _ + = HappyAbsSyn13 + (C_MinExp_1 happy_var_2 + ) +happyReduction_37 _ _ = notHappyAtAll + +happyReduce_38 = happySpecReduce_1 14 happyReduction_38 +happyReduction_38 (HappyTerminal (TintVal happy_var_1)) + = HappyAbsSyn14 + (C_IntConst_1 (toInteger happy_var_1) + ) +happyReduction_38 _ = notHappyAtAll + +happyReduce_39 = happySpecReduce_1 14 happyReduction_39 +happyReduction_39 (HappyTerminal (TrealVal happy_var_1)) + = HappyAbsSyn14 + (C_RealConst_1 happy_var_1 + ) +happyReduction_39 _ = notHappyAtAll + +happyReduce_40 = happySpecReduce_1 14 happyReduction_40 +happyReduction_40 _ + = HappyAbsSyn14 + (C_BoolConst_1 True + ) + +happyReduce_41 = happySpecReduce_1 14 happyReduction_41 +happyReduction_41 _ + = HappyAbsSyn14 + (C_BoolConst_1 False + ) + +happyReduce_42 = happySpecReduce_1 14 happyReduction_42 +happyReduction_42 (HappyAbsSyn15 happy_var_1) + = HappyAbsSyn14 + (C_ArrayConst_1 happy_var_1 + ) +happyReduction_42 _ = notHappyAtAll + +happyReduce_43 = happySpecReduce_1 14 happyReduction_43 +happyReduction_43 (HappyAbsSyn18 happy_var_1) + = HappyAbsSyn14 + (C_CNIdent_1 happy_var_1 + ) +happyReduction_43 _ = notHappyAtAll + +happyReduce_44 = happyReduce 4 14 happyReduction_44 +happyReduction_44 (_ `HappyStk` + (HappyAbsSyn17 happy_var_3) `HappyStk` + _ `HappyStk` + (HappyAbsSyn18 happy_var_1) `HappyStk` + happyRest) + = HappyAbsSyn14 + (C_Funcinv_1 happy_var_1 happy_var_3 + ) `HappyStk` happyRest + +happyReduce_45 = happySpecReduce_3 14 happyReduction_45 +happyReduction_45 _ + (HappyAbsSyn13 happy_var_2) + _ + = HappyAbsSyn14 + (C_Expr_1 happy_var_2 + ) +happyReduction_45 _ _ _ = notHappyAtAll + +happyReduce_46 = happyReduce 4 15 happyReduction_46 +happyReduction_46 (_ `HappyStk` + (HappyAbsSyn13 happy_var_3) `HappyStk` + _ `HappyStk` + (HappyAbsSyn18 happy_var_1) `HappyStk` + happyRest) + = HappyAbsSyn15 + (C_ArrayInd_1 happy_var_1 happy_var_3 + ) `HappyStk` happyRest + +happyReduce_47 = happySpecReduce_0 16 happyReduction_47 +happyReduction_47 = HappyAbsSyn16 + (C_Emptyactpars_1 + ) + +happyReduce_48 = happySpecReduce_1 16 happyReduction_48 +happyReduction_48 (HappyAbsSyn17 happy_var_1) + = HappyAbsSyn16 + (happy_var_1 + ) +happyReduction_48 _ = notHappyAtAll + +happyReduce_49 = happySpecReduce_3 17 happyReduction_49 +happyReduction_49 (HappyAbsSyn17 happy_var_3) + _ + (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn17 + (C_Lstactpars_1 happy_var_1 happy_var_3 + ) +happyReduction_49 _ _ _ = notHappyAtAll + +happyReduce_50 = happySpecReduce_1 17 happyReduction_50 +happyReduction_50 (HappyAbsSyn13 happy_var_1) + = HappyAbsSyn17 + (C_Lstactpars_1 happy_var_1 C_Emptyactpars_1 + ) +happyReduction_50 _ = notHappyAtAll + +happyReduce_51 = happySpecReduce_1 18 happyReduction_51 +happyReduction_51 (HappyTerminal (TIdent happy_var_1)) + = HappyAbsSyn18 + (C_Ident_1 happy_var_1 + ) +happyReduction_51 _ = notHappyAtAll + +happyNewToken action sts stk [] = + action 54 54 (error "reading EOF!") (HappyState action) sts stk [] + +happyNewToken action sts stk (tk:tks) = + let cont i = action i i tk (HappyState action) sts stk tks in + case tk of { + Tsemicolon -> cont 19; + TopenB -> cont 20; + TcloseB -> cont 21; + TopenSB -> cont 22; + TcloseSB -> cont 23; + TopenCB -> cont 24; + TcloseCB -> cont 25; + Ttowdots -> cont 26; + Tcomma -> cont 27; + Tequal -> cont 28; + Tand -> cont 29; + Tor -> cont 30; + Tassing -> cont 31; + Tadd -> cont 32; + Tmul -> cont 33; + Tsub -> cont 34; + Tdiv -> cont 35; + Tgt -> cont 36; + Tlt -> cont 37; + Tnot -> cont 38; + Ttrue -> cont 39; + Tfalse -> cont 40; + Tint -> cont 41; + Treal -> cont 42; + Tbool -> cont 43; + Tchar -> cont 44; + Tif -> cont 45; + Tthen -> cont 46; + Telse -> cont 47; + Twhile -> cont 48; + Tinput -> cont 49; + Tprint -> cont 50; + TIdent happy_dollar_dollar -> cont 51; + TintVal happy_dollar_dollar -> cont 52; + TrealVal happy_dollar_dollar -> cont 53; + _ -> happyError tks + } + +happyThen = \m k -> k m +happyReturn = \a -> a +happyThen1 = happyThen +happyReturn1 = \a tks -> a + +parser tks = happyThen (happyParse action_0 tks) (\x -> case x of {HappyAbsSyn4 z -> happyReturn z; _other -> notHappyAtAll }) + +happySeq = happyDontSeq + +-- happyError :: [Token] -> a +happyError _ = error ("Parse error in line \n") + + + +-- runParser :: String -> Error +runParser = parser . lexer + + +testParser :: String -> IO() +testParser filename + = do s <- readFile filename + let tks = lexer s + putStr (show tks) + let ast = parser tks + putStr (show ast) + return () -- (scanner inp) +{-# LINE 1 "GenericTemplate.hs" #-} +-- $Id: Funcs_Parser_Lazy.hs,v 1.1 2002/11/19 17:00:02 simonpj Exp $ + +{-# LINE 15 "GenericTemplate.hs" #-} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +infixr 9 `HappyStk` +data HappyStk a = HappyStk a (HappyStk a) + +----------------------------------------------------------------------------- +-- starting the parse + +happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll + +----------------------------------------------------------------------------- +-- Accepting the parse + +happyAccept j tk st sts (HappyStk ans _) = + + (happyReturn1 ans) + +----------------------------------------------------------------------------- +-- Arrays only: do the next action + +{-# LINE 150 "GenericTemplate.hs" #-} + + +----------------------------------------------------------------------------- +-- HappyState data type (not arrays) + + + +newtype HappyState b c = HappyState + (Int -> -- token number + Int -> -- token number (yes, again) + b -> -- token semantic value + HappyState b c -> -- current state + [HappyState b c] -> -- state stack + c) + + + +----------------------------------------------------------------------------- +-- Shifting a token + +happyShift new_state (1) tk st sts stk@(x `HappyStk` _) = + let i = (case x of { HappyErrorToken (i) -> i }) in +-- trace "shifting the error token" $ + new_state i i tk (HappyState (new_state)) ((st):(sts)) (stk) + +happyShift new_state i tk st sts stk = + happyNewToken new_state ((st):(sts)) ((HappyTerminal (tk))`HappyStk`stk) + +-- happyReduce is specialised for the common cases. + +happySpecReduce_0 i fn (1) tk st sts stk + = happyFail (1) tk st sts stk +happySpecReduce_0 nt fn j tk st@((HappyState (action))) sts stk + = action nt j tk st ((st):(sts)) (fn `HappyStk` stk) + +happySpecReduce_1 i fn (1) tk st sts stk + = happyFail (1) tk st sts stk +happySpecReduce_1 nt fn j tk _ sts@(((st@(HappyState (action))):(_))) (v1`HappyStk`stk') + = let r = fn v1 in + happySeq r (action nt j tk st sts (r `HappyStk` stk')) + +happySpecReduce_2 i fn (1) tk st sts stk + = happyFail (1) tk st sts stk +happySpecReduce_2 nt fn j tk _ ((_):(sts@(((st@(HappyState (action))):(_))))) (v1`HappyStk`v2`HappyStk`stk') + = let r = fn v1 v2 in + happySeq r (action nt j tk st sts (r `HappyStk` stk')) + +happySpecReduce_3 i fn (1) tk st sts stk + = happyFail (1) tk st sts stk +happySpecReduce_3 nt fn j tk _ ((_):(((_):(sts@(((st@(HappyState (action))):(_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk') + = let r = fn v1 v2 v3 in + happySeq r (action nt j tk st sts (r `HappyStk` stk')) + +happyReduce k i fn (1) tk st sts stk + = happyFail (1) tk st sts stk +happyReduce k nt fn j tk st sts stk + = case happyDrop (k - ((1) :: Int)) sts of + sts1@(((st1@(HappyState (action))):(_))) -> + let r = fn stk in -- it doesn't hurt to always seq here... + happyDoSeq r (action nt j tk st1 sts1 r) + +happyMonadReduce k nt fn (1) tk st sts stk + = happyFail (1) tk st sts stk +happyMonadReduce k nt fn j tk st sts stk = + happyThen1 (fn stk) (\r -> action nt j tk st1 sts1 (r `HappyStk` drop_stk)) + where sts1@(((st1@(HappyState (action))):(_))) = happyDrop k ((st):(sts)) + drop_stk = happyDropStk k stk + +happyDrop (0) l = l +happyDrop n ((_):(t)) = happyDrop (n - ((1) :: Int)) t + +happyDropStk (0) l = l +happyDropStk n (x `HappyStk` xs) = happyDropStk (n - ((1)::Int)) xs + +----------------------------------------------------------------------------- +-- Moving to a new state after a reduction + + + + + + + + + +happyGoto action j tk st = action j j tk (HappyState action) + + +----------------------------------------------------------------------------- +-- Error recovery ((1) is the error token) + +-- parse error if we are in recovery and we fail again +happyFail (1) tk old_st _ stk = +-- trace "failing" $ + happyError + + +{- We don't need state discarding for our restricted implementation of + "error". In fact, it can cause some bogus parses, so I've disabled it + for now --SDM + +-- discard a state +happyFail (1) tk old_st (((HappyState (action))):(sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) = +-- trace ("discarding state, depth " ++ show (length stk)) $ + action (1) (1) tk (HappyState (action)) sts ((saved_tok`HappyStk`stk)) +-} + +-- Enter error recovery: generate an error token, +-- save the old token and carry on. +happyFail i tk (HappyState (action)) sts stk = +-- trace "entering error recovery" $ + action (1) (1) tk (HappyState (action)) sts ( (HappyErrorToken (i)) `HappyStk` stk) + +-- Internal happy errors: + +notHappyAtAll = error "Internal Happy error\n" + +----------------------------------------------------------------------------- +-- Hack to get the typechecker to accept our action functions + + + + + + + +----------------------------------------------------------------------------- +-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq +-- otherwise it emits +-- happySeq = happyDontSeq + +happyDoSeq, happyDontSeq :: a -> b -> b +happyDoSeq a b = a `seq` b +happyDontSeq a b = b + +----------------------------------------------------------------------------- +-- Don't inline any functions from the template. GHC has a nasty habit +-- of deciding to inline happyGoto everywhere, which increases the size of +-- the generated parser quite a bit. + + + + + + + + + +{-# NOINLINE happyShift #-} +{-# NOINLINE happySpecReduce_0 #-} +{-# NOINLINE happySpecReduce_1 #-} +{-# NOINLINE happySpecReduce_2 #-} +{-# NOINLINE happySpecReduce_3 #-} +{-# NOINLINE happyReduce #-} +{-# NOINLINE happyMonadReduce #-} +{-# NOINLINE happyGoto #-} +{-# NOINLINE happyFail #-} + +-- end of Happy Template. diff --git a/testsuite/tests/programs/joao-circular/LrcPrelude.hs b/testsuite/tests/programs/joao-circular/LrcPrelude.hs new file mode 100644 index 0000000000..84daa7fed8 --- /dev/null +++ b/testsuite/tests/programs/joao-circular/LrcPrelude.hs @@ -0,0 +1,72 @@ +-- +-- Lrc Prelude for Haskell/Gofer +-- +-- +-- by João Saraiva +-- Mon Mar 5 +-- + +module LrcPrelude where + + +type INT = Integer +type BOOL = Bool +type STR = String +type CHAR = Char +type REAL = Float + + +lrc_REALtoSTR r = show r +lrc_INTtoSTR i = show i +sf_INTtoSTR i = show i + +data BTree a = Fork !a !(BTree a) !(BTree a) + | Nil + deriving (Show, Eq , Ord) + +lrc_tree_insert a b Nil = (Fork (a,b) Nil Nil) +lrc_tree_insert a b (Fork (c,d) l r) + | a < c = (Fork (c,d) (lrc_tree_insert a b l) r) + | a == c = (Fork (a,b) l r) + | a > c = (Fork (c,d) l (lrc_tree_insert a b r)) + +type MAP a b = (BTree (a,b),b) + +lrc_empty_map :: a -> (MAP b a) +lrc_empty_map a = (Nil , a) + +lrc_map_single_update :: (Eq a , Ord a) => a -> b -> (MAP a b) -> (MAP a b) +lrc_map_single_update a b (t,d) = ((lrc_tree_insert a b t),d) + +lrc_map_application :: (Eq a , Ord a) => a -> (MAP a b) -> b +lrc_map_application a (Nil, b) = b +lrc_map_application a ((Fork (b,c) l r),d) + | a == b = c + | a < b = lrc_map_application a (l,d) + | a > b = lrc_map_application a (r,d) + + +lrc_map_in :: (Eq a , Ord a) => a -> (MAP a b) -> Bool +lrc_map_in _ (Nil, _) = False +lrc_map_in a ((Fork (b,c) l r),d) + | a == b = True + | a < b = lrc_map_in a (l,d) + | a > b = lrc_map_in a (r,d) + +lrc_map_update :: (Eq a , Ord a) => (MAP a b) -> (MAP a b) -> (MAP a b) +lrc_map_update e1 e2 = e1 -- XXXXXXXXXXXXXXXX + + +lrc_string_index :: String -> Int -> Char +lrc_string_index s i = s!!i + + +lrc_string_sub :: String -> Int -> Int -> String +lrc_string_sub s i1 i2 = s + +lrc_string_opensub s i = s + +lrc_strindex s c = 0 + +repeatCHAR :: a -> Integer -> [a] +repeatCHAR c i = replicate (fromIntegral i) c diff --git a/testsuite/tests/programs/joao-circular/Main.hs b/testsuite/tests/programs/joao-circular/Main.hs new file mode 100644 index 0000000000..2202554816 --- /dev/null +++ b/testsuite/tests/programs/joao-circular/Main.hs @@ -0,0 +1,77 @@ +module Main (main) where + +import System.Environment + +import LrcPrelude +import Funcs_Parser_Lazy + +import Data_Lazy +import Visfun_Lazy + + +-- runSemantics :: String -> [BibEntry] +runSemantics inp pw = lrcEval (runParser inp) pw + + +runEval fn pw + = do s <- readFile fn + let (code,errors,te,pp) = runSemantics s pw + + putStrLn "Pretty Printed Input:" + putStrLn pp + putStrLn "MSP Generated Code:" + putStrLn (showCode code) + + putStrLn "Detected Semantic Errors:" + putStrLn (show errors) + putStrLn (show te) + +-- putStrLn pp_code + return () + +main :: IO () +main = do args <- getArgs + putStrLn (show args) + let fn = head args + let pw = mytoint (head . tail $ args) + runEval fn pw + +mytoint :: String -> Integer +mytoint s = read s + + +showCode [] = "\n" +showCode (x:xs) = (showInstr x) ++ "\n" ++ (showCode xs) + +showInstr (C_ALabel_1 n) = (show n) ++ ":" +showInstr C_Add_1 = "ADD" +showInstr C_And_1 = "AND" +showInstr (C_Call_1 n) = "CALL " ++ (showName n) +showInstr C_Cod_1 = "CODIGO" +showInstr C_Data_1 = "MEMORIA DE DADOS" +showInstr C_Div_1 = "DIV" +showInstr C_Eq_1 = "EQ" +showInstr C_Gt_1 = "GT" +showInstr C_Halt_1 = "HALT" +showInstr C_IIn_1 = "IN" +showInstr C_IOut_1 = "OUT" +showInstr (C_Jump_1 n) = "JMP " ++ (showName n) +showInstr (C_Jumpf_1 n) = "JMPF " ++ (showName n) +showInstr C_Load_1 = "LOAD" +showInstr C_Lt_1 = "LT" +showInstr C_Minus_1 = "MIN" +showInstr C_Mul_1 = "MUL" +showInstr C_Neq_1 = "NEQ" +showInstr C_Not_1 = "NOT" +showInstr C_Or_1 = "OR" +showInstr (C_Pusha_1 n i) = "PUSHa " ++ (showName n) ++ " " ++ (show i) +showInstr (C_Pushb_1 b) = "PUSHb " ++ (show b) +showInstr (C_Pushi_1 i) = "PUSHi " ++ (show i) +showInstr (C_Pushr_1 r) = "PUSHr " ++ (show r) +showInstr C_Ret_1 = "RET" +showInstr C_Store_1 = "STORE" +showInstr C_Sub_1 = "SUB" +showInstr (C_Var_1 n i t) = (showName n) ++ " TAM " ++ (show i) + + +showName (C_Ident_1 n) = show n diff --git a/testsuite/tests/programs/joao-circular/Makefile b/testsuite/tests/programs/joao-circular/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/joao-circular/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/joao-circular/README b/testsuite/tests/programs/joao-circular/README new file mode 100644 index 0000000000..f022b71126 --- /dev/null +++ b/testsuite/tests/programs/joao-circular/README @@ -0,0 +1,6 @@ +This program went into an infinite loop when compiled with GHC 5.04. + +Input is + + ./joao-circular inp 40 + diff --git a/testsuite/tests/programs/joao-circular/Visfun_Lazy.hs b/testsuite/tests/programs/joao-circular/Visfun_Lazy.hs new file mode 100644 index 0000000000..fa768999c0 --- /dev/null +++ b/testsuite/tests/programs/joao-circular/Visfun_Lazy.hs @@ -0,0 +1,1145 @@ +module Visfun_Lazy where +import Data_Lazy +import LrcPrelude +-- +-- Lazy Circular Evaluator Functions +-- +lrcEval = visit_P +visit_P (C_RootProd_1 t_Defs ) x_pw = (x_code , x_errlst , x_typeerrors , x_uu_pp ) + where + x_uu_pp = x_fmts_2 + x_typeerrors = x_typeerrors_1 + x_errlst = x_errlst_1 + x_code = ((((:) C_Data_1 (gen_data_mem x_declsout_1))++x_declscode_1)++(((:) C_Cod_1 (genCodeMainFun ))++x_code_1)) + x_infun_1 = 0 + x_env_1 = x_declsout_1 + x_declsin_1 = (lrc_empty_map (C_EmptyEntry_1 )) + x_pw_2 = x_pw + t_uu_pp = (C_Best_1 x_uu_pp_1) + (x_code_1 , x_declscode_1 , x_declsout_1 , x_errlst_1 , x_outfun_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Defs t_Defs x_declsin_1 x_env_1 x_infun_1 + (x_fmts_2 ) = visit_PPRoot t_uu_pp x_pw_2 +visit_Defs (C_Defs2_1 t_Def t_Defs_2 ) x_declsin x_env x_infun = (x_code , x_declscode , x_declsout , x_errlst , x_outfun , x_typeerrors , x_uu_pp ) + where + x_infun_2 = x_outfun_1 + x_env_2 = x_env + x_declsin_2 = x_declsout_1 + x_uu_pp = (C_Above_1 x_uu_pp_1 x_uu_pp_2) + x_typeerrors = (x_typeerrors_1++x_typeerrors_2) + x_outfun = x_outfun_2 + x_errlst = (x_errlst_1++x_errlst_2) + x_declsout = x_declsout_2 + x_declscode = (x_declscode_1++x_declscode_2) + x_code = (x_code_1++x_code_2) + x_infun_1 = x_infun + x_env_1 = x_env + x_declsin_1 = x_declsin + (x_code_1 , x_declscode_1 , x_declsout_1 , x_errlst_1 , x_outfun_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Def t_Def x_declsin_1 x_env_1 x_infun_1 + (x_code_2 , x_declscode_2 , x_declsout_2 , x_errlst_2 , x_outfun_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Defs t_Defs_2 x_declsin_2 x_env_2 x_infun_2 +visit_Defs (C_NoDefs_1 ) x_declsin x_env x_infun = (x_code , x_declscode , x_declsout , x_errlst , x_outfun , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Empty_1 ) + x_typeerrors = ([] ) + x_outfun = x_infun + x_errlst = ([] ) + x_declsout = x_declsin + x_declscode = ([] ) + x_code = ([] ) +visit_Def (C_Arraydecl_1 t_Type t_Name t_INT ) x_declsin x_env x_infun = (x_code , x_declscode , x_declsout , x_errlst , x_outfun , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Beside_1 (ppType t_Type) (C_Beside_1 (C_Text_1 " = ") (C_Beside_1 (ppName t_Name) (C_Text_1 (("["++(lrc_INTtoSTR t_INT))++"]"))))) + x_typeerrors = ([] ) + x_outfun = x_infun + x_errlst = (if (lrc_map_in t_Name x_declsin) then ((:) (C_E_Name_AD_1 t_Name) ([] )) else ([] )) + x_declsout = (if (lrc_map_in t_Name x_declsin) then x_declsin else (lrc_map_single_update t_Name (C_Consarray_1 t_Type t_INT x_infun) x_declsin)) + x_declscode = ((:) (C_Var_1 (C_Ident_1 ((nametoSTR t_Name)++(lrc_INTtoSTR x_infun))) t_INT t_Type) ([] )) + x_code = ([] ) +visit_Def (C_Declfunc_1 t_Type t_Name t_FormPars t_Stats ) x_declsin x_env x_infun = (x_code , x_declscode , x_declsout , x_errlst , x_outfun , x_typeerrors , x_uu_pp ) + where + x_nlabeli_4 = 1 + x_infun_4 = (x_infun+1) + x_fid_4 = t_Name + x_envi_4 = x_env + x_uu_pp = (func_def_a_la_c (ppType t_Type) (ppName t_Name) x_uu_pp_3 x_uu_pp_4) + x_typeerrors = x_typeerrors_4 + x_outfun = (x_infun+1) + x_errlst = (x_err_aux++x_errlst_4) + x_declsout = (if (lrc_map_in t_Name x_declsin) then x_declsin else (lrc_map_single_update t_Name (C_Consfunc_1 t_Type x_infun x_lst_params_3) x_declsin)) + x_declscode = (((:) (C_Var_1 (C_Ident_1 ((nametoSTR t_Name)++(lrc_INTtoSTR x_infun))) 1 t_Type) (gen_code_func x_infun_4 x_lst_params_3))++x_declscode_4) + x_code = (((:) (C_ALabel_1 t_Name) x_code_4)++((:) (C_Ret_1 ) [])) + x_error = (if (lrc_map_in t_Name x_declsin) then "" else " <- id already defined!") + x_err_aux = (if (lrc_map_in t_Name x_declsin) then ((:) (C_E_Name_AD_1 t_Name) x_errlst_3) else x_errlst_3) + (x_errlst_3 , x_lst_params_3 , x_uu_pp_3 ) = visit_FormPars t_FormPars + (x_code_4 , x_declscode_4 , x_envo_4 , x_errlst_4 , x_nlabelo_4 , x_typeerrors_4 , x_uu_pp_4 ) = visit_Stats t_Stats x_envi_4 x_fid_4 x_infun_4 x_nlabeli_4 +visit_Def (C_Declfunc_header_1 t_Type t_Name t_FormPars t_Stats ) x_declsin x_env x_infun = (x_code , x_declscode , x_declsout , x_errlst , x_outfun , x_typeerrors , x_uu_pp ) + where + x_nlabeli_4 = 1 + x_infun_4 = (x_infun+1) + x_fid_4 = t_Name + x_envi_4 = x_env + x_uu_pp = (C_Empty_1 ) + x_typeerrors = x_typeerrors_4 + x_outfun = (x_infun+1) + x_errlst = (x_err_aux++x_errlst_4) + x_declsout = (if (lrc_map_in t_Name x_declsin) then x_declsin else (lrc_map_single_update t_Name (C_Consfunc_1 t_Type x_infun x_lst_params_3) x_declsin)) + x_declscode = (((:) (C_Var_1 (C_Ident_1 ((nametoSTR t_Name)++(lrc_INTtoSTR x_infun))) 1 t_Type) (gen_code_func x_infun_4 x_lst_params_3))++x_declscode_4) + x_code = (((:) (C_ALabel_1 t_Name) x_code_4)++((:) (C_Ret_1 ) [])) + x_error = (if (lrc_map_in t_Name x_declsin) then "" else " <- id already defined!") + x_err_aux = (if (lrc_map_in t_Name x_declsin) then ((:) (C_E_Name_AD_1 t_Name) x_errlst_3) else x_errlst_3) + (x_errlst_3 , x_lst_params_3 , x_uu_pp_3 ) = visit_FormPars t_FormPars + (x_code_4 , x_declscode_4 , x_envo_4 , x_errlst_4 , x_nlabelo_4 , x_typeerrors_4 , x_uu_pp_4 ) = visit_Stats t_Stats x_envi_4 x_fid_4 x_infun_4 x_nlabeli_4 +visit_Def (C_Declfunc_header_novar_1 t_Type t_Name t_FormPars t_Stats ) x_declsin x_env x_infun = (x_code , x_declscode , x_declsout , x_errlst , x_outfun , x_typeerrors , x_uu_pp ) + where + x_nlabeli_4 = 1 + x_infun_4 = (x_infun+1) + x_fid_4 = t_Name + x_envi_4 = x_env + x_uu_pp = (C_Empty_1 ) + x_typeerrors = x_typeerrors_4 + x_outfun = (x_infun+1) + x_errlst = (x_err_aux++x_errlst_4) + x_declsout = (if (lrc_map_in t_Name x_declsin) then x_declsin else (lrc_map_single_update t_Name (C_Consfunc_1 t_Type x_infun x_lst_params_3) x_declsin)) + x_declscode = (((:) (C_Var_1 (C_Ident_1 ((nametoSTR t_Name)++(lrc_INTtoSTR x_infun))) 1 t_Type) (gen_code_func x_infun_4 x_lst_params_3))++x_declscode_4) + x_code = (((:) (C_ALabel_1 t_Name) x_code_4)++((:) (C_Ret_1 ) [])) + x_error = (if (lrc_map_in t_Name x_declsin) then "" else " <- id already defined!") + x_err_aux = (if (lrc_map_in t_Name x_declsin) then ((:) (C_E_Name_AD_1 t_Name) x_errlst_3) else x_errlst_3) + (x_errlst_3 , x_lst_params_3 , x_uu_pp_3 ) = visit_FormPars t_FormPars + (x_code_4 , x_declscode_4 , x_envo_4 , x_errlst_4 , x_nlabelo_4 , x_typeerrors_4 , x_uu_pp_4 ) = visit_Stats t_Stats x_envi_4 x_fid_4 x_infun_4 x_nlabeli_4 +visit_Def (C_Vardecl_1 t_Type t_Name ) x_declsin x_env x_infun = (x_code , x_declscode , x_declsout , x_errlst , x_outfun , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Beside_1 (ppType t_Type) (C_Beside_1 (C_Text_1 " = ") (ppName t_Name))) + x_typeerrors = ([] ) + x_outfun = x_infun + x_errlst = (if (lrc_map_in t_Name x_declsin) then ((:) (C_E_Name_AD_1 t_Name) ([] )) else ([] )) + x_declsout = (if (lrc_map_in t_Name x_declsin) then x_declsin else (lrc_map_single_update t_Name (C_Consvar_1 t_Type x_infun) x_declsin)) + x_declscode = ((:) (C_Var_1 (C_Ident_1 ((nametoSTR t_Name)++(lrc_INTtoSTR x_infun))) 1 t_Type) ([] )) + x_code = ([] ) +visit_Type (C_Booltype_1 ) = () +visit_Type (C_Chartype_1 ) = () +visit_Type (C_Errortype_1 ) = () +visit_Type (C_Inttype_1 ) = () +visit_Type (C_Realtype_1 ) = () +visit_Name (C_Ident_1 t_STR ) = () +visit_FormPars (C_Emptyformpars_1 ) = (x_errlst , x_lst_params , x_uu_pp ) + where + x_uu_pp = (C_Text_1 "") + x_lst_params = ([] ) + x_errlst = ([] ) +visit_FormPars (C_Lstformpars_1 t_FormPar t_FormPars_2 ) = (x_errlst , x_lst_params , x_uu_pp ) + where + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 ",") x_uu_pp_2)) + x_lst_params = (x_one_param_1++x_lst_params_2) + x_errlst = (if (isinlst x_parname_1 x_lst_params_2) then ((:) (C_E_FormParam_AD_1 x_parname_1) x_errlst_2) else x_errlst_2) + (x_one_param_1 , x_parname_1 , x_uu_pp_1 ) = visit_FormPar t_FormPar + (x_errlst_2 , x_lst_params_2 , x_uu_pp_2 ) = visit_FormPars t_FormPars_2 +visit_FormPar (C_Declformpar_1 t_Type t_Name ) = (x_one_param , x_parname , x_uu_pp ) + where + x_uu_pp = (C_Beside_1 (ppType t_Type) (C_Beside_1 (C_Text_1 " ") (ppName t_Name))) + x_parname = t_Name + x_one_param = ((:) (C_AParam_1 t_Type t_Name) ([] )) +visit_Stats (C_Emptystat_1 ) x_envi x_fid x_infun x_nlabeli = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Empty_1 ) + x_typeerrors = ([] ) + x_nlabelo = x_nlabeli + x_errlst = ([] ) + x_envo = x_envi + x_declscode = ([] ) + x_code = [] +visit_Stats (C_Lststats_1 t_Stat t_Stats_2 ) x_envi x_fid x_infun x_nlabeli = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_nlabeli_2 = x_nlabelo_1 + x_infun_2 = x_infun + x_fid_2 = x_fid + x_envi_2 = x_envo_1 + x_uu_pp = (C_Above_1 (C_Beside_1 x_uu_pp_1 (C_Text_1 ";")) x_uu_pp_2) + x_typeerrors = (x_typeerrors_1++x_typeerrors_2) + x_nlabelo = x_nlabelo_2 + x_errlst = (x_errlst_1++x_errlst_2) + x_envo = x_envo_2 + x_declscode = (x_declscode_1++x_declscode_2) + x_code = (x_code_1++x_code_2) + x_upw_Stats_infun_1 = x_infun + x_nlabeli_1 = x_nlabeli + x_infun_1 = x_infun + x_fid_1 = x_fid + x_envi_1 = x_envi + (x_code_1 , x_declscode_1 , x_envo_1 , x_errlst_1 , x_nlabelo_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Stat t_Stat x_envi_1 x_fid_1 x_infun_1 x_nlabeli_1 x_upw_Stats_infun_1 + (x_code_2 , x_declscode_2 , x_envo_2 , x_errlst_2 , x_nlabelo_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Stats t_Stats_2 x_envi_2 x_fid_2 x_infun_2 x_nlabeli_2 +visit_Stat (C_ArrAssign_1 t_ArrayUse t_Exp ) x_envi x_fid x_infun x_nlabeli x_upw_Stats_infun = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Beside_1 x_uu_pp_1 (C_Beside_1 (C_Text_1 "[") (C_Beside_1 x_uu_pp_2 (C_Beside_1 (C_Text_1 "] = ") x_uu_pp_2)))) + x_typeerrors = (if (typecheck x_an_1 x_type_2 x_fid x_envi) then x_typeerrors_2 else ((:) (C_E_T_DT_1 x_an_1) x_typeerrors_2)) + x_nlabelo = x_nlabeli + x_errlst = (x_errlst_1++x_errlst_2) + x_envo = x_envi + x_declscode = ([] ) + x_code = (x_code_1++x_code_2) + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_envi + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_envi + (x_an_1 , x_code_1 , x_errlst_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_ArrayUse t_ArrayUse x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Stat (C_Assign_1 t_Name t_Exp ) x_envi x_fid x_infun x_nlabeli x_upw_Stats_infun = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Beside_1 (ppName t_Name) (C_Beside_1 (C_Text_1 " = ") x_uu_pp_2)) + x_typeerrors = (if (x_typerr==(C_NoTypeError_1 )) then x_typeerrors_2 else ((:) x_typerr x_typeerrors_2)) + x_nlabelo = x_nlabeli + x_errlst = (if (isinenv t_Name x_fid x_envi) then x_errlst_2 else ((:) (C_E_Name_ND_1 t_Name) x_errlst_2)) + x_envo = x_envi + x_declscode = ([] ) + x_code = (((:) (C_Pusha_1 t_Name x_infun) x_code_2)++((:) (C_Store_1 ) ([] ))) + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_envi + x_typerr = (assign_InfType t_Name x_type_2 x_fid x_envi) + x_error = (if (isinenv t_Name x_fid x_envi) then ([] ) else ((:) (C_E_Name_ND_1 t_Name) ([] ))) + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Stat (C_Funccall_1 t_Name t_ActPars ) x_envi x_fid x_infun x_nlabeli x_upw_Stats_infun = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (funccall (ppName t_Name) x_uu_pp_2) + x_typeerrors = (checkactparams t_Name x_act_params_2 x_envi) + x_nlabelo = x_nlabeli + x_errlst = (if (lrc_map_in t_Name x_envi) then x_errlst_2 else ((:) (C_E_Fun_ND_1 t_Name) x_errlst_2)) + x_envo = x_envi + x_declscode = ([] ) + x_code = (gen_code_func_inv t_Name x_envi x_code_2) + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_envi + x_error = (if (lrc_map_in t_Name x_envi) then ([] ) else ((:) (C_E_Fun_ND_1 t_Name) ([] ))) + (x_act_params_2 , x_code_2 , x_errlst_2 , x_uu_pp_2 ) = visit_ActPars t_ActPars x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Stat (C_If_t_e_1 t_Exp t_Stats t_Stats_2 ) x_envi x_fid x_infun x_nlabeli x_upw_Stats_infun = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_nlabeli_3 = (x_nlabeli+1) + x_infun_3 = x_infun + x_fid_3 = x_fid + x_envi_3 = x_envi + x_nlabeli_2 = x_nlabelo_3 + x_infun_2 = x_infun + x_fid_2 = x_fid + x_envi_2 = x_envi + x_uu_pp = (if_t_ePP x_uu_pp_1 x_uu_pp_2 x_uu_pp_3) + x_typeerrors = (if (x_typerr==(C_NoTypeError_1 )) then ((x_typeerrors_1++x_typeerrors_2)++x_typeerrors_3) else ((:) x_typerr ((x_typeerrors_1++x_typeerrors_2)++x_typeerrors_3))) + x_nlabelo = x_nlabelo_2 + x_errlst = ((x_errlst_1++x_errlst_2)++x_errlst_3) + x_envo = x_envi + x_declscode = (x_declscode_2++x_declscode_3) + x_code = (gen_code_ite x_nlabeli x_code_1 x_code_2 x_code_3) + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_envi + x_typerr = (if (isboolexp x_type_1) then (C_NoTypeError_1 ) else (C_E_T_if_t_e_1 )) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_declscode_2 , x_envo_2 , x_errlst_2 , x_nlabelo_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Stats t_Stats x_envi_2 x_fid_2 x_infun_2 x_nlabeli_2 + (x_code_3 , x_declscode_3 , x_envo_3 , x_errlst_3 , x_nlabelo_3 , x_typeerrors_3 , x_uu_pp_3 ) = visit_Stats t_Stats_2 x_envi_3 x_fid_3 x_infun_3 x_nlabeli_3 +visit_Stat (C_Input_1 t_Name ) x_envi x_fid x_infun x_nlabeli x_upw_Stats_infun = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Beside_1 (C_Text_1 "input ") (ppName t_Name)) + x_typeerrors = ([] ) + x_nlabelo = x_nlabeli + x_errlst = (if (isinenv t_Name x_fid x_envi) then ([] ) else ((:) (C_E_Name_ND_1 t_Name) ([] ))) + x_envo = x_envi + x_declscode = ([] ) + x_code = ((:) (C_Pusha_1 t_Name x_upw_Stats_infun) ((:) (C_IIn_1 ) ((:) (C_Store_1 ) ([] )))) +visit_Stat (C_LocalDecl_1 t_Type t_Name ) x_envi x_fid x_infun x_nlabeli x_upw_Stats_infun = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Beside_1 (ppType t_Type) (C_Beside_1 (C_Text_1 " ") (ppName t_Name))) + x_typeerrors = ([] ) + x_nlabelo = x_nlabeli + x_errlst = (if (lrc_map_in t_Name x_envi) then ((:) (C_E_Loc_Name_AD_1 t_Name) ([] )) else ([] )) + x_envo = (if (lrc_map_in t_Name x_envi) then x_envi else (lrc_map_single_update t_Name (C_Consvar_1 t_Type x_infun) x_envi)) + x_declscode = ((:) (C_Var_1 t_Name x_infun t_Type) ([] )) + x_code = ([] ) +visit_Stat (C_Print_1 t_Exp ) x_envi x_fid x_infun x_nlabeli x_upw_Stats_infun = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Beside_1 (C_Text_1 "print ") x_uu_pp_1) + x_typeerrors = x_typeerrors_1 + x_nlabelo = x_nlabeli + x_errlst = x_errlst_1 + x_envo = x_envi + x_declscode = ([] ) + x_code = (x_code_1++((:) (C_IOut_1 ) ([] ))) + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_envi + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp x_env_1 x_fid_1 x_upw_Stats_infun_1 +visit_Stat (C_While_1 t_Exp t_Stats ) x_envi x_fid x_infun x_nlabeli x_upw_Stats_infun = (x_code , x_declscode , x_envo , x_errlst , x_nlabelo , x_typeerrors , x_uu_pp ) + where + x_nlabeli_2 = (x_nlabeli+1) + x_infun_2 = x_infun + x_fid_2 = x_fid + x_envi_2 = x_envi + x_uu_pp = (whilePP (C_Text_1 "while ") x_uu_pp_1 x_uu_pp_2) + x_typeerrors = (if (x_typerr==(C_NoTypeError_1 )) then (x_typeerrors_1++x_typeerrors_2) else ((:) x_typerr (x_typeerrors_1++x_typeerrors_2))) + x_nlabelo = x_nlabelo_2 + x_errlst = (x_errlst_1++x_errlst_2) + x_envo = x_envi + x_declscode = x_declscode_2 + x_code = (gen_code_while x_nlabeli x_code_1 x_code_2) + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_envi + x_typerr = (if (isboolexp x_type_1) then (C_NoTypeError_1 ) else (C_E_T_while_1 )) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_declscode_2 , x_envo_2 , x_errlst_2 , x_nlabelo_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Stats t_Stats x_envi_2 x_fid_2 x_infun_2 x_nlabeli_2 +visit_ArrayUse (C_ArrayInd_1 t_Name t_Exp ) x_env x_fid x_upw_Stats_infun = (x_an , x_code , x_errlst , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_uu_pp = (C_Beside_1 (ppName t_Name) (C_Beside_1 (C_Text_1 "[") (C_Beside_1 x_uu_pp_2 (C_Text_1 "]")))) + x_typeerrors = (if (isinttype x_type_2) then x_typeerrors_2 else ((:) (C_E_T_IndArrNotInt_1 ) x_typeerrors_2)) + x_errlst = (if x_noerror then x_errlst_2 else ((:) (C_E_Name_ND_1 t_Name) x_errlst_2)) + x_code = x_code_2 + x_an = t_Name + x_noerror = (isinenv t_Name x_fid x_env) + x_error = (if x_noerror then ([] ) else ((:) (C_E_Name_ND_1 t_Name) ([] ))) + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Exp (C_AddExp_1 t_Exp_2 t_Exp_3 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 " + ") x_uu_pp_2)) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_BOP_1 ) (x_typeerrors_1++x_typeerrors_2)) else (x_typeerrors_1++x_typeerrors_2)) + x_type = (infType 1 x_type_1 x_type_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((x_code_1++x_code_2)++((:) (C_Add_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp_3 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Exp (C_AndExp_1 t_Exp_2 t_Exp_3 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 " && ") x_uu_pp_2)) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_BOP_1 ) (x_typeerrors_1++x_typeerrors_2)) else (x_typeerrors_1++x_typeerrors_2)) + x_type = (infType 2 x_type_1 x_type_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((x_code_1++x_code_2)++((:) (C_And_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp_3 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Exp (C_DivExp_1 t_Exp_2 t_Exp_3 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 " / ") x_uu_pp_2)) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_BOP_1 ) (x_typeerrors_1++x_typeerrors_2)) else (x_typeerrors_1++x_typeerrors_2)) + x_type = (infType 1 x_type_1 x_type_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((x_code_1++x_code_2)++((:) (C_Div_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp_3 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Exp (C_EqExp_1 t_Exp_2 t_Exp_3 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 " == ") x_uu_pp_2)) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_BOP_1 ) (x_typeerrors_1++x_typeerrors_2)) else (x_typeerrors_1++x_typeerrors_2)) + x_type = (infType 2 x_type_1 x_type_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((x_code_1++x_code_2)++((:) (C_Eq_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp_3 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Exp (C_Factor_1 t_Fac ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = x_uu_pp_1 + x_typeerrors = x_typeerrors_1 + x_type = x_type_1 + x_errlst = x_errlst_1 + x_code = x_code_1 + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Fac t_Fac x_env_1 x_fid_1 x_upw_Stats_infun_1 +visit_Exp (C_GTExp_1 t_Exp_2 t_Exp_3 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 " > ") x_uu_pp_2)) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_BOP_1 ) (x_typeerrors_1++x_typeerrors_2)) else (x_typeerrors_1++x_typeerrors_2)) + x_type = (infType 2 x_type_1 x_type_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((x_code_1++x_code_2)++((:) (C_Gt_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp_3 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Exp (C_LTExp_1 t_Exp_2 t_Exp_3 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 " < ") x_uu_pp_2)) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_BOP_1 ) (x_typeerrors_1++x_typeerrors_2)) else (x_typeerrors_1++x_typeerrors_2)) + x_type = (infType 2 x_type_1 x_type_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((x_code_1++x_code_2)++((:) (C_Lt_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp_3 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Exp (C_MinExp_1 t_Exp_2 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (C_Beside_1 (C_Text_1 " - ") x_uu_pp_1) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_NotArithExp_1 ) x_typeerrors_1) else x_typeerrors_1) + x_type = (if (isaritmexp x_type_1) then x_type_1 else (C_Errortype_1 )) + x_errlst = x_errlst_1 + x_code = (x_code_1++((:) (C_Minus_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 +visit_Exp (C_MulExp_1 t_Exp_2 t_Exp_3 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 " * ") x_uu_pp_2)) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_BOP_1 ) (x_typeerrors_1++x_typeerrors_2)) else (x_typeerrors_1++x_typeerrors_2)) + x_type = (infType 1 x_type_1 x_type_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((x_code_1++x_code_2)++((:) (C_Mul_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp_3 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Exp (C_NotExp_1 t_Exp_2 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (C_Beside_1 (C_Text_1 " ! ") x_uu_pp_1) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_NotBooleanExp_1 ) x_typeerrors_1) else x_typeerrors_1) + x_type = (if (isboolexp x_type_1) then x_type_1 else (C_Errortype_1 )) + x_errlst = x_errlst_1 + x_code = (x_code_1++((:) (C_Not_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 +visit_Exp (C_OrExp_1 t_Exp_2 t_Exp_3 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 " || ") x_uu_pp_2)) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_BOP_1 ) (x_typeerrors_1++x_typeerrors_2)) else (x_typeerrors_1++x_typeerrors_2)) + x_type = (infType 2 x_type_1 x_type_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((x_code_1++x_code_2)++((:) (C_Or_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp_3 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Exp (C_SubExp_1 t_Exp_2 t_Exp_3 ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_uu_pp = (hv x_uu_pp_1 (C_Beside_1 (C_Text_1 " - ") x_uu_pp_2)) + x_typeerrors = (if (x_type==(C_Errortype_1 )) then ((:) (C_E_T_BOP_1 ) (x_typeerrors_1++x_typeerrors_2)) else (x_typeerrors_1++x_typeerrors_2)) + x_type = (infType 1 x_type_1 x_type_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((x_code_1++x_code_2)++((:) (C_Sub_1 ) ([] ))) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp_2 x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_code_2 , x_errlst_2 , x_type_2 , x_typeerrors_2 , x_uu_pp_2 ) = visit_Exp t_Exp_3 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Fac (C_ArrayConst_1 t_ArrayUse ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_uu_pp = x_uu_pp_1 + x_typeerrors = x_typeerrors_1 + x_type = (gettype x_an_1 x_fid x_env) + x_errlst = x_errlst_1 + x_code = x_code_1 + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + (x_an_1 , x_code_1 , x_errlst_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_ArrayUse t_ArrayUse x_env_1 x_fid_1 x_upw_Stats_infun_1 +visit_Fac (C_BoolConst_1 t_BOOL ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Text_1 (if t_BOOL then "true" else "false") ) + x_typeerrors = ([] ) + x_type = (C_Booltype_1 ) + x_errlst = ([] ) + x_code = ((:) (C_Pushb_1 t_BOOL) ([] )) +visit_Fac (C_CNIdent_1 t_Name ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (ppName t_Name) + x_typeerrors = ([] ) + x_type = (gettype t_Name x_fid x_env) + x_errlst = (if (isinenv t_Name x_fid x_env) then ([] ) else ((:) (C_E_Name_ND_1 t_Name) ([] ))) + x_code = ((:) (C_Pusha_1 t_Name x_upw_Stats_infun) ((:) (C_Load_1 ) ([] ))) +visit_Fac (C_Expr_1 t_Exp ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_uu_pp = x_uu_pp_1 + x_typeerrors = x_typeerrors_1 + x_type = x_type_1 + x_errlst = x_errlst_1 + x_code = x_code_1 + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp x_env_1 x_fid_1 x_upw_Stats_infun_1 +visit_Fac (C_Funcinv_1 t_Name t_ActPars ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (funccall (ppName t_Name) x_uu_pp_2) + x_typeerrors = (checkactparams t_Name x_act_params_2 x_env) + x_type = (gettype t_Name x_fid x_env) + x_errlst = (x_error++x_errlst_2) + x_code = (gen_code_func_inv t_Name x_env x_code_2) + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_noerror = (lrc_map_in t_Name x_env) + x_error = (if x_noerror then ([] ) else ((:) (C_E_Fun_ND_1 t_Name) ([] ))) + (x_act_params_2 , x_code_2 , x_errlst_2 , x_uu_pp_2 ) = visit_ActPars t_ActPars x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_Fac (C_IntConst_1 t_INT ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Text_1 (lrc_INTtoSTR t_INT)) + x_typeerrors = ([] ) + x_type = (C_Inttype_1 ) + x_errlst = ([] ) + x_code = ((:) (C_Pushi_1 t_INT) ([] )) +visit_Fac (C_RealConst_1 t_REAL ) x_env x_fid x_upw_Stats_infun = (x_code , x_errlst , x_type , x_typeerrors , x_uu_pp ) + where + x_uu_pp = (C_Text_1 (lrc_REALtoSTR t_REAL)) + x_typeerrors = ([] ) + x_type = (C_Realtype_1 ) + x_errlst = ([] ) + x_code = ((:) (C_Pushr_1 t_REAL) ([] )) +visit_ActPars (C_Emptyactpars_1 ) x_env x_fid x_upw_Stats_infun = (x_act_params , x_code , x_errlst , x_uu_pp ) + where + x_uu_pp = (C_Empty_1 ) + x_errlst = ([] ) + x_code = ([] ) + x_act_params = ([] ) +visit_ActPars (C_Lstactpars_1 t_Exp t_ActPars_2 ) x_env x_fid x_upw_Stats_infun = (x_act_params , x_code , x_errlst , x_uu_pp ) + where + x_upw_Stats_infun_1 = x_upw_Stats_infun + x_fid_1 = x_fid + x_env_1 = x_env + x_upw_Stats_infun_2 = x_upw_Stats_infun + x_fid_2 = x_fid + x_env_2 = x_env + x_uu_pp = (hv x_uu_pp_1 x_uu_pp_2) + x_errlst = (x_errlst_1++x_errlst_2) + x_code = ((:) x_code_1 x_code_2) + x_act_params = ((:) x_type_1 x_act_params_2) + (x_code_1 , x_errlst_1 , x_type_1 , x_typeerrors_1 , x_uu_pp_1 ) = visit_Exp t_Exp x_env_1 x_fid_1 x_upw_Stats_infun_1 + (x_act_params_2 , x_code_2 , x_errlst_2 , x_uu_pp_2 ) = visit_ActPars t_ActPars_2 x_env_2 x_fid_2 x_upw_Stats_infun_2 +visit_PPRoot (C_All_1 t_PPS ) x_pw = (x_fmts ) + where + x_frame_1 = (C_F_1 x_pw x_pw) + x_fmts = (eq_all_fmts x_pw x_fmts_1) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 ) = visit_PPS t_PPS x_frame_1 +visit_PPRoot (C_Best_1 t_PPS ) x_pw = (x_fmts ) + where + x_frame_1 = (C_F_1 x_pw x_pw) + x_fmts = (eq_best_fmts x_pw x_fmts_1) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 ) = visit_PPS t_PPS x_frame_1 +visit_PPS (C_Above_1 t_PPS_2 t_PPS_3 ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_frame_2 = x_frame + x_frame_1 = x_frame + x_minw = (max x_minw_1 x_minw_2) + x_minll = x_minll_2 + x_maxh = (x_maxh_1+x_maxh_2) + x_fmts = (fst_Pair_T_Formats x_fe) + x_error = ((x_error_1||x_error_2)||x_aerror) + x_fe = (set_fmts_above x_fmts_1 x_fmts_2 x_maxh_1 x_maxh_2) + x_aerror = (snd_Pair_T_Formats x_fe) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 ) = visit_PPS t_PPS_2 x_frame_1 + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 ) = visit_PPS t_PPS_3 x_frame_2 +visit_PPS (C_Apply_1 t_PPC t_PPSArgs ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_reqs_2 = x_reqs_1 + x_minw = (set_var_apply x_error_cond x_lem x_minw_1) + x_minll = (set_var_apply x_error_cond x_lem x_minll_1) + x_maxh = (set_var_apply x_error_cond 1 x_maxh_1) + x_fmts = (eq_set_fmts_apply x_error_cond x_error_msg x_fmts_1) + x_error = x_l_error + x_frame_1 = x_frame + x_fillmins_1 = x_mins_2 + x_fillfmts_1 = x_fmts_2 + x_fillerrs_1 = x_error_2 + x_lem = (fromIntegral (length x_error_msg)) + x_l_error = (if x_error_cond then True else x_error_1) + x_error_msg = (set_error_msg x_numpars_1 x_len_2) + x_error_cond = (x_numpars_1/=x_len_2) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 , x_numpars_1 , x_reqs_1 ) = visit_PPC t_PPC x_fillerrs_1 x_fillfmts_1 x_fillmins_1 x_frame_1 + (x_error_2 , x_fmts_2 , x_len_2 , x_mins_2 ) = visit_PPSArgs t_PPSArgs x_reqs_2 +visit_PPS (C_Beside_1 t_PPS_2 t_PPS_3 ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_frame_2 = (narrow_frame x_minll_1 x_frame) + x_frame_1 = (narrow_ll x_minw_2 x_frame) + x_minw = (max x_minw_1 (x_minll_1+x_minw_2)) + x_minll = (x_minll_1+x_minll_2) + x_maxh = (beside_height x_maxh_1 x_maxh_2) + x_fmts = (fst_Pair_T_Formats x_fe) + x_error = (x_l_error||x_berror) + x_l_error = (x_error_1||x_error_2) + x_fe = (set_fmts_beside x_fmts_1 x_fmts_2 x_maxh_1 x_maxh_2 x_frame x_l_error) + x_berror = (snd_Pair_T_Formats x_fe) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 ) = visit_PPS t_PPS_2 x_frame_1 + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 ) = visit_PPS t_PPS_3 x_frame_2 +visit_PPS (C_Dup_1 t_PPS_2 t_PPS_3 ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_frame_2 = x_frame + x_frame_1 = x_frame + x_minw = x_l_minw + x_minll = (min x_minll_1 x_minll_2) + x_maxh = (max x_maxh_1 x_maxh_2) + x_fmts = (sem_fmts_dup x_fmts_1 x_fmts_2 x_error_1 x_error_2 x_l_minw) + x_error = x_l_error + x_l_minw = (min x_minw_1 x_minw_2) + x_l_error = (x_error_1 && x_error_2) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 ) = visit_PPS t_PPS_2 x_frame_1 + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 ) = visit_PPS t_PPS_3 x_frame_2 +visit_PPS (C_Empty_1 ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_minw = 0 + x_minll = 0 + x_maxh = 0 + x_fmts = (set_fmts_empty ) + x_error = False +visit_PPS (C_FillBlock_1 t_INT t_FillList ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_minw = x_minw_2 + x_minll = x_minll_2 + x_maxh = x_maxh_2 + x_fmts = (set_fmts_fillblock t_INT x_fmts_2 x_l_pw) + x_error = (((t_INT<0)||(t_INT>x_l_pw))||x_error_2) + x_pw_2 = t_INT + x_minwi_2 = 0 + x_minlli_2 = 0 + x_maxhi_2 = 0 + x_frame_2 = (C_F_1 t_INT t_INT) + x_fmtsi_2 = (empty_fmts ) + x_errori_2 = False + x_l_pw = case x_frame of { (C_F_1 w _) -> w } + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 ) = visit_FillList t_FillList x_errori_2 x_fmtsi_2 x_frame_2 x_maxhi_2 x_minlli_2 x_minwi_2 x_pw_2 +visit_PPS (C_Filla_1 t_FillList ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_minw = x_minw_1 + x_minll = x_minll_1 + x_maxh = x_maxh_1 + x_fmts = (eq_set_fmts_fill x_fmts_1) + x_error = x_error_1 + x_pw_1 = x_l_pw + x_minwi_1 = 0 + x_minlli_1 = 0 + x_maxhi_1 = 0 + x_frame_1 = (C_F_1 x_l_pw x_l_pw) + x_fmtsi_1 = (empty_fmts ) + x_errori_1 = False + x_l_pw = case x_frame of { (C_F_1 w _) -> w } + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 ) = visit_FillList t_FillList x_errori_1 x_fmtsi_1 x_frame_1 x_maxhi_1 x_minlli_1 x_minwi_1 x_pw_1 +visit_PPS (C_Indent_1 t_INT t_PPS_2 ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_frame_2 = (narrow_frame t_INT x_frame) + x_minw = x_l_minw + x_minll = (t_INT+x_minll_2) + x_maxh = x_maxh_2 + x_fmts = (set_fmts_indent t_INT x_fmts_2 x_pw x_l_minw x_frame x_error_2) + x_error = (((t_INT<0)||(t_INT>x_pw))||x_error_2) + x_pw = case x_frame of { (C_F_1 w _) -> w } + x_l_minw = (t_INT+x_minw_2) + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 ) = visit_PPS t_PPS_2 x_frame_2 +visit_PPS (C_Join_1 t_PPS_2 ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_frame_1 = x_frame + x_minw = x_minw_1 + x_minll = x_minll_1 + x_maxh = x_maxh_1 + x_fmts = (fst_Pair_T_Formats x_fe) + x_error = (x_error_1||x_jerror) + x_jerror = (snd_Pair_T_Formats x_fe) + x_fe = (set_fmts_join x_fmts_1 x_error_1) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 ) = visit_PPS t_PPS_2 x_frame_1 +visit_PPS (C_Text_1 t_STR ) x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_minw = x_l_minw + x_minll = x_l_minw + x_maxh = 1 + x_fmts = (set_fmts_text t_STR x_l_minw x_l_error) + x_error = x_l_error + x_pw = case x_frame of { (C_F_1 w _) -> w } + x_l_minw = (fromIntegral (length t_STR)) + x_l_error = (x_l_minw>x_pw) +visit_PPC (C_AboveC_1 t_PPC_2 t_PPC_3 ) x_fillerrs x_fillfmts x_fillmins x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw , x_numpars , x_reqs ) + where + x_frame_2 = x_frame + x_fillmins_2 = (snd_Pair_Lst_T_Mins x_i) + x_fillfmts_2 = (snd_Pair_Lst_T_Fmts x_m) + x_fillerrs_2 = (snd_Pair_Lst_T_Errs x_e) + x_frame_1 = x_frame + x_fillmins_1 = (fst_Pair_Lst_T_Mins x_i) + x_fillfmts_1 = (fst_Pair_Lst_T_Fmts x_m) + x_fillerrs_1 = (fst_Pair_Lst_T_Errs x_e) + x_reqs = (x_reqs_1++x_reqs_2) + x_numpars = (x_numpars_1+x_numpars_2) + x_minw = (max x_minw_1 x_minw_2) + x_minll = x_minll_2 + x_maxh = (x_maxh_1+x_maxh_2) + x_fmts = (fst_Pair_T_Formats x_fe) + x_error = ((x_error_1||x_error_2)||x_aerror) + x_m = (splitAt_T_Fmts (fromIntegral x_numpars_1) x_fillfmts) + x_i = (splitAt_T_Mins (fromIntegral x_numpars_1) x_fillmins) + x_fe = (set_fmts_above x_fmts_1 x_fmts_2 x_maxh_1 x_maxh_2) + x_e = (splitAt_T_Errs (fromIntegral x_numpars_1) x_fillerrs) + x_aerror = (snd_Pair_T_Formats x_fe) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 , x_numpars_1 , x_reqs_1 ) = visit_PPC t_PPC_2 x_fillerrs_1 x_fillfmts_1 x_fillmins_1 x_frame_1 + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 , x_numpars_2 , x_reqs_2 ) = visit_PPC t_PPC_3 x_fillerrs_2 x_fillfmts_2 x_fillmins_2 x_frame_2 +visit_PPC (C_ApplyC_1 t_PPC_2 t_PPCArgs ) x_fillerrs x_fillfmts x_fillmins x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw , x_numpars , x_reqs ) + where + x_ireqs_2 = x_reqs_1 + x_ifillmins_2 = x_fillmins + x_ifillfmts_2 = x_fillfmts + x_ifillerrs_2 = x_fillerrs + x_frame_1 = x_frame + x_fillmins_1 = x_fillmins_2 + x_fillfmts_1 = x_fmts_2 + x_fillerrs_1 = x_error_2 + x_reqs = x_reqs_2 + x_numpars = x_numpars_2 + x_minw = (set_var_apply x_error_cond x_lem x_minw_1) + x_minll = (set_var_apply x_error_cond x_lem x_minll_1) + x_maxh = (set_var_apply x_error_cond 1 x_maxh_1) + x_fmts = (eq_set_fmts_apply x_error_cond x_error_msg x_fmts_1) + x_error = x_l_error + x_lem = (fromIntegral (length x_error_msg)) + x_l_error = (if x_error_cond then True else x_error_1) + x_error_msg = (set_error_msg x_numpars_1 x_len_2) + x_error_cond = (x_numpars_2/=x_len_2) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 , x_numpars_1 , x_reqs_1 ) = visit_PPC t_PPC_2 x_fillerrs_1 x_fillfmts_1 x_fillmins_1 x_frame_1 + (x_error_2 , x_fillmins_2 , x_fmts_2 , x_len_2 , x_numpars_2 , x_reqs_2 ) = visit_PPCArgs t_PPCArgs x_ifillerrs_2 x_ifillfmts_2 x_ifillmins_2 x_ireqs_2 +visit_PPC (C_BesideC_1 t_PPC_2 t_PPC_3 ) x_fillerrs x_fillfmts x_fillmins x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw , x_numpars , x_reqs ) + where + x_frame_2 = (narrow_frame x_minll_1 x_frame) + x_fillmins_2 = (snd_Pair_Lst_T_Mins x_i) + x_fillfmts_2 = (snd_Pair_Lst_T_Fmts x_m) + x_fillerrs_2 = (snd_Pair_Lst_T_Errs x_e) + x_frame_1 = (narrow_ll x_minw_2 x_frame) + x_fillmins_1 = (fst_Pair_Lst_T_Mins x_i) + x_fillfmts_1 = (fst_Pair_Lst_T_Fmts x_m) + x_fillerrs_1 = (fst_Pair_Lst_T_Errs x_e) + x_reqs = (x_reqs_1++x_reqs_2) + x_numpars = (x_numpars_1+x_numpars_2) + x_minw = (max x_minw_1 (x_minll_1+x_minw_2)) + x_minll = (x_minll_1+x_minll_2) + x_maxh = (beside_height x_maxh_1 x_maxh_2) + x_fmts = (fst_Pair_T_Formats x_fe) + x_error = (x_l_error||x_berror) + x_m = (splitAt_T_Fmts (fromIntegral x_numpars_1) x_fillfmts) + x_l_error = (x_error_1||x_error_2) + x_i = (splitAt_T_Mins (fromIntegral x_numpars_1) x_fillmins) + x_fe = (set_fmts_beside x_fmts_1 x_fmts_2 x_maxh_1 x_maxh_2 x_frame x_l_error) + x_e = (splitAt_T_Errs (fromIntegral x_numpars_1) x_fillerrs) + x_berror = (snd_Pair_T_Formats x_fe) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 , x_numpars_1 , x_reqs_1 ) = visit_PPC t_PPC_2 x_fillerrs_1 x_fillfmts_1 x_fillmins_1 x_frame_1 + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 , x_numpars_2 , x_reqs_2 ) = visit_PPC t_PPC_3 x_fillerrs_2 x_fillfmts_2 x_fillmins_2 x_frame_2 +visit_PPC (C_DupC_1 t_PPC_2 t_PPC_3 ) x_fillerrs x_fillfmts x_fillmins x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw , x_numpars , x_reqs ) + where + x_frame_2 = x_frame + x_fillmins_2 = x_fillmins + x_fillfmts_2 = x_fillfmts + x_fillerrs_2 = x_fillerrs + x_frame_1 = x_frame + x_fillmins_1 = x_fillmins + x_fillfmts_1 = x_fillfmts + x_fillerrs_1 = x_fillerrs + x_reqs = (eq_DupC x_reqs_1 x_reqs_2) + x_numpars = x_numpars_1 + x_minw = x_l_minw + x_minll = (min x_minll_1 x_minll_2) + x_maxh = (max x_maxh_1 x_maxh_2) + x_fmts = (sem_fmts_cdup x_fmts_1 x_fmts_2 x_error_1 x_error_2 x_numpars_1 x_numpars_2 x_l_minw x_error_msg) + x_error = x_l_error + x_l_minw = (min x_minw_1 x_minw_2) + x_l_error = ((x_numpars_1/=x_numpars_2)||(x_error_1 && x_error_2)) + x_error_msg = (eq_set_error_msg x_numpars_1 x_numpars_2) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 , x_numpars_1 , x_reqs_1 ) = visit_PPC t_PPC_2 x_fillerrs_1 x_fillfmts_1 x_fillmins_1 x_frame_1 + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 , x_numpars_2 , x_reqs_2 ) = visit_PPC t_PPC_3 x_fillerrs_2 x_fillfmts_2 x_fillmins_2 x_frame_2 +visit_PPC (C_IndentC_1 t_INT t_PPC_2 ) x_fillerrs x_fillfmts x_fillmins x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw , x_numpars , x_reqs ) + where + x_frame_2 = (narrow_frame t_INT x_frame) + x_fillmins_2 = x_fillmins + x_fillfmts_2 = x_fillfmts + x_fillerrs_2 = x_fillerrs + x_reqs = x_reqs_2 + x_numpars = x_numpars_2 + x_minw = x_l_minw + x_minll = (t_INT+x_minll_2) + x_maxh = x_maxh_2 + x_fmts = (set_fmts_indent t_INT x_fmts_2 x_pw x_l_minw x_frame x_error_2) + x_error = (((t_INT<0)||(t_INT>x_pw))||x_error_2) + x_pw = case x_frame of { (C_F_1 w _) -> w } + x_l_minw = (t_INT+x_minw_2) + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 , x_numpars_2 , x_reqs_2 ) = visit_PPC t_PPC_2 x_fillerrs_2 x_fillfmts_2 x_fillmins_2 x_frame_2 +visit_PPC (C_JoinC_1 t_PPC_2 ) x_fillerrs x_fillfmts x_fillmins x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw , x_numpars , x_reqs ) + where + x_frame_1 = x_frame + x_fillmins_1 = x_fillmins + x_fillfmts_1 = x_fillfmts + x_fillerrs_1 = x_fillerrs + x_reqs = x_reqs_1 + x_numpars = x_numpars_1 + x_minw = x_minw_1 + x_minll = x_minll_1 + x_maxh = x_maxh_1 + x_fmts = (fst_Pair_T_Formats x_fe) + x_error = (x_error_1||x_jerror) + x_jerror = (snd_Pair_T_Formats x_fe) + x_fe = (set_fmts_join x_fmts_1 x_error_1) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 , x_numpars_1 , x_reqs_1 ) = visit_PPC t_PPC_2 x_fillerrs_1 x_fillfmts_1 x_fillmins_1 x_frame_1 +visit_PPC (C_ParC_1 ) x_fillerrs x_fillfmts x_fillmins x_frame = (x_error , x_fmts , x_maxh , x_minll , x_minw , x_numpars , x_reqs ) + where + x_reqs = ((:) x_frame ([] )) + x_numpars = 1 + x_minw = (fst_t x_l_m) + x_minll = (snd_t x_l_m) + x_maxh = (third_t x_l_m) + x_fmts = (head_T_Fmts x_fillfmts) + x_error = x_l_error + x_l_m = (head_T_Mins x_fillmins) + x_l_error = (head_T_Errs x_fillerrs) +visit_PPCArgs (C_ConsPPCArgs_1 t_PPC t_PPCArgs_2 ) x_ifillerrs x_ifillfmts x_ifillmins x_ireqs = (x_error , x_fillmins , x_fmts , x_len , x_numpars , x_reqs ) + where + x_ireqs_2 = (tail_T_Reqs x_ireqs) + x_ifillmins_2 = (snd_Pair_Lst_T_Mins x_i) + x_ifillfmts_2 = (snd_Pair_Lst_T_Fmts x_m) + x_ifillerrs_2 = (snd_Pair_Lst_T_Errs x_e) + x_reqs = (x_reqs_1++x_reqs_2) + x_numpars = (x_numpars_1+x_numpars_2) + x_len = (x_len_2+1) + x_fmts = ((:) x_fmts_1 x_fmts_2) + x_fillmins = ((:) (C_Triple_1 x_minw_1 x_minll_1 x_maxh_1) x_fillmins_2) + x_error = ((:) x_error_1 x_error_2) + x_frame_1 = (head_T_Reqs x_ireqs) + x_fillmins_1 = (fst_Pair_Lst_T_Mins x_i) + x_fillfmts_1 = (fst_Pair_Lst_T_Fmts x_m) + x_fillerrs_1 = (fst_Pair_Lst_T_Errs x_e) + x_m = (splitAt_T_Fmts (fromIntegral x_numpars_1) x_ifillfmts) + x_i = (splitAt_T_Mins (fromIntegral x_numpars_1) x_ifillmins) + x_e = (splitAt_T_Errs (fromIntegral x_numpars_1) x_ifillerrs) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 , x_numpars_1 , x_reqs_1 ) = visit_PPC t_PPC x_fillerrs_1 x_fillfmts_1 x_fillmins_1 x_frame_1 + (x_error_2 , x_fillmins_2 , x_fmts_2 , x_len_2 , x_numpars_2 , x_reqs_2 ) = visit_PPCArgs t_PPCArgs_2 x_ifillerrs_2 x_ifillfmts_2 x_ifillmins_2 x_ireqs_2 +visit_PPCArgs (C_NilPPCArgs_1 ) x_ifillerrs x_ifillfmts x_ifillmins x_ireqs = (x_error , x_fillmins , x_fmts , x_len , x_numpars , x_reqs ) + where + x_reqs = ([] ) + x_numpars = 0 + x_len = 0 + x_fmts = ([] ) + x_fillmins = ([] ) + x_error = ([] ) +visit_PPSArgs (C_ConsArgs_1 t_PPS t_PPSArgs_2 ) x_reqs = (x_error , x_fmts , x_len , x_mins ) + where + x_reqs_2 = (tail_T_Reqs x_reqs) + x_mins = ((:) (C_Triple_1 x_minw_1 x_minll_1 x_maxh_1) x_mins_2) + x_len = (x_len_2+1) + x_fmts = ((:) x_fmts_1 x_fmts_2) + x_error = ((:) x_error_1 x_error_2) + x_frame_1 = (head_T_Reqs x_reqs) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 ) = visit_PPS t_PPS x_frame_1 + (x_error_2 , x_fmts_2 , x_len_2 , x_mins_2 ) = visit_PPSArgs t_PPSArgs_2 x_reqs_2 +visit_PPSArgs (C_NilArgs_1 ) x_reqs = (x_error , x_fmts , x_len , x_mins ) + where + x_mins = ([] ) + x_len = 0 + x_fmts = ([] ) + x_error = ([] ) +visit_FillList (C_ConsFillList_1 t_PPS t_FillList_2 ) x_errori x_fmtsi x_frame x_maxhi x_minlli x_minwi x_pw = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_frame_1 = x_frame + x_pw_2 = x_pw + x_minwi_2 = x_minwi + x_minlli_2 = ((x_minlli+x_minwi)+x_minw_1) + x_maxhi_2 = (cons_height x_maxh_1 x_maxhi True) + x_frame_2 = x_frame + x_fmtsi_2 = (fst_Pair_Formats x_fe) + x_errori_2 = (x_errori||x_ferror) + x_minw = x_minw_2 + x_minll = x_minll_2 + x_maxh = x_maxh_2 + x_fmts = x_fmts_2 + x_error = (x_error_2||x_error_1) + x_newll = (x_minlli+x_minw_1) + x_ferror = (snd_Pair_Formats x_fe) + x_fe = (set_fmts_filllist x_fmtsi x_fmts_1 x_maxhi x_maxh_1 x_frame x_avail) + x_avail = ((x_pw-x_newll)>=0) + (x_error_1 , x_fmts_1 , x_maxh_1 , x_minll_1 , x_minw_1 ) = visit_PPS t_PPS x_frame_1 + (x_error_2 , x_fmts_2 , x_maxh_2 , x_minll_2 , x_minw_2 ) = visit_FillList t_FillList_2 x_errori_2 x_fmtsi_2 x_frame_2 x_maxhi_2 x_minlli_2 x_minwi_2 x_pw_2 +visit_FillList (C_NilFillList_1 ) x_errori x_fmtsi x_frame x_maxhi x_minlli x_minwi x_pw = (x_error , x_fmts , x_maxh , x_minll , x_minw ) + where + x_minw = x_minwi + x_minll = x_minlli + x_maxh = x_maxhi + x_fmts = x_fmtsi + x_error = x_errori +above_fmt u l = + case u of { (C_Elem_1 uh ul uw ut) -> case l of { (C_Elem_1 lh ll lw lt) -> (C_Elem_1 (uh+lh) ll (max uw lw) (ut++lt)) } } +above_fmts u l = + case u of { ( [] ) -> ([] ) ; ( (:) u2 us ) -> case l of { ( [] ) -> ([] ) ; ( (:) l2 ls ) -> let { (utw) = (total_w u2) ; (ltw) = (total_w l2) ; (fe) = (above_fmt u2 l2) } in (if (utw>=ltw) then ((:) fe (above_fmts us l)) else ((:) fe (above_fmts u ls))) } } +actformparams actparams lfps = + case actparams of { ( (:) t1 ts ) -> case lfps of { ( (:) p ls ) -> case p of { (C_AParam_1 t2 n) -> (if (t1==t2) then (actformparams ts ls) else ((:) (C_E_T_ActParam_1 ) (actformparams ts ls))) } ; ( [] ) -> ((:) (C_E_T_ActParam_1 ) ([] )) } ; ( [] ) -> case lfps of { ( (:) p ls ) -> ((:) (C_E_T_ActParam_1 ) ([] )) ; ( [] ) -> ([] ) } } +add_glue i ls = + case ls of { ( [] ) -> ([] ) ; ( (:) s ss ) -> ((:) ((repeatCHAR ' ' i)++s) (add_glue i ss)) } +afmt_txt string = + (C_AFormat_1 (text_fmts string)) +allf fs = + case fs of { ( [] ) -> "" ; ( (:) f fs2 ) -> ((txtstr f 0 "\n\n")++(best fs2)) } +assign_InfType n exptype fid env = + let { (desttype) = (gettype n fid env) } in (if ((coersibleTypes desttype exptype)==(C_Errortype_1 )) then (C_E_T_NC_1 desttype exptype) else (C_NoTypeError_1 )) +asts i = + (if (i==0) then "" else (if (i==1) then "*" else ((":"++(repeatCHAR '*' (fromIntegral (i-2))))++"*>")) ) +beside_fmt l r = + case l of { (C_Elem_1 lh ll lw lt) -> case r of { (C_Elem_1 rh rl rw rt) -> (C_Elem_1 ((lh+rh)-1) (ll+rl) (max lw (ll+rw)) (join ll lt rt)) } } +beside_fmts f l r = + case f of { (C_F_1 pw _) -> (foldLeft pw l r) } +beside_height lh rh = + (if ((lh==0)||(rh==0)) then 0 else 1) +best fs = + case fs of { ( [] ) -> "" ; ( (:) f fs2 ) -> (txtstr f 0 "") } +blockStats sts = + (C_Above_1 (C_Beside_1 (C_Text_1 "{") (C_Indent_1 2 sts)) (C_Text_1 "}")) +checkactparams s actpars env = + case (lrc_map_application s env) of { (C_Consfunc_1 t i lfp) -> (actformparams actpars lfp) ; _ -> ([] ) } +choose_ab_beside_fmts avail fa fb f = + (if avail then (beside_fmts f fa fb) else (above_fmts fa fb)) +choose_ab_error_beside avail fa fb f = + (if avail then (error_beside fa fb) else (above_fmts fa fb)) +coersibleTypes t1 t2 = + (if (t1==t2) then t1 else case t1 of { (C_Realtype_1 ) -> case t2 of { (C_Inttype_1 ) -> t1 ; _ -> (C_Errortype_1 ) } ; _ -> (C_Errortype_1 ) } ) +cons_height pph acth avail = + (if (acth==0) then (if (pph>0) then 1 else 0) else (acth+(if avail then 0 else 1) )) +dispf fs = + case fs of { ( [] ) -> "" ; ( (:) f fs2 ) -> (txtstr f 0 "") } +dropWhileFormatsNotFit i fs = + case fs of { ( [] ) -> ([] ) ; ( (:) f fs2 ) -> (if (notFits i f) then (dropWhileFormatsNotFit i fs2) else fs) } +dropWhileFormatsTooWide i l r = + case r of { ( [] ) -> ([] ) ; ( (:) f fs ) -> (if (tooWide i l f) then (dropWhileFormatsTooWide i l fs) else r) } +empty_fmts = + ([] ) +enclosedBy o b c = + (C_Beside_1 (C_Text_1 o) (C_Beside_1 b (C_Text_1 c))) +eq_DupC r1 r2 = + (zipwith_max r1 r2) +eq_all_fmts pw fmts = + (allf (set_fmts_render pw fmts)) +eq_best_fmts pw fmts = + (best (set_fmts_render pw fmts)) +eq_disp pw fmts = + (dispf (set_fmts_render pw fmts)) +eq_set_error_msg apars bpars = + (((("<Error: incorrect choice expression. #pars left "++(lrc_INTtoSTR apars))++" /= #pars right ")++(lrc_INTtoSTR bpars))++">") +eq_set_fmts_apply error msg fmts = + (set_fmts_apply error (C_AFormat_1 (text_fmts msg)) fmts) +eq_set_fmts_fill fmts = + (C_AFormat_1 fmts) +error_beside fs1 fs2 = + ([] ) +error_indent i fs = + (map_indent_fmt i fs) +foldLeft pw l r = + case l of { ( [] ) -> ([] ) ; ( (:) f fs ) -> (map_With_fmts f (dropWhileFormatsTooWide pw f r)) } +fst_Pair_Formats f = + case f of { (C_C_Pair_Formats_1 a b) -> a } +fst_Pair_Lst_T_Errs t = + case t of { (C_CPair_Lst_T_Errs_1 a _) -> a } +fst_Pair_Lst_T_Fmts t = + case t of { (C_CPair_Lst_T_Fmts_1 a _) -> a } +fst_Pair_Lst_T_Mins t = + case t of { (C_CPair_Lst_T_Mins_1 a _) -> a } +fst_Pair_T_Formats f = + case f of { (C_C_Pair_T_Formats_1 a b) -> a } +fst_t t = + case t of { (C_Triple_1 pw _ _) -> pw } +func_def_a_la_c ty name formpars body = + (C_Above_1 (C_Beside_1 name (C_Beside_1 (C_Text_1 "(") (C_Beside_1 formpars (C_Beside_1 (C_Text_1 ") : ") ty)))) (blockStats body)) +funccall name pars = + (C_Beside_1 name (enclosedBy "(" pars ")")) +genCodeMainFun = + ((:) (C_Call_1 (C_Ident_1 "main")) ((:) (C_Halt_1 ) ([] ))) +genCodeParamsFunc i lsttp cap = + case lsttp of { ( [] ) -> ([] ) ; ( (:) fp fps ) -> case cap of { ( [] ) -> ([] ) ; ( (:) c cs ) -> case fp of { (C_AParam_1 t n) -> (((:) (C_Pusha_1 n i) c)++((:) (C_Store_1 ) (genCodeParamsFunc i fps cs))) } } } +gen_code_func nf lst = + case lst of { ( [] ) -> ([] ) ; ( (:) apar ls ) -> case apar of { (C_AParam_1 t n) -> ((:) (C_Var_1 n nf t) (gen_code_func nf ls)) } } +gen_code_func_inv fn env cap = + case (lrc_map_application fn env) of { (C_Consfunc_1 t i lstp) -> ((genCodeParamsFunc i lstp cap)++((:) (C_Call_1 fn) ([] ))) ; _ -> ([] ) } +gen_code_ite i e c1 c2 = + (((e++((:) (C_Jumpf_1 (C_Ident_1 ("else_"++(lrc_INTtoSTR i)))) c1))++((:) (C_Jumpf_1 (C_Ident_1 ("end_if_"++(lrc_INTtoSTR i)))) ((:) (C_ALabel_1 (C_Ident_1 ("else_"++(lrc_INTtoSTR i)))) c2)))++((:) (C_ALabel_1 (C_Ident_1 ("end_if_"++(lrc_INTtoSTR i)))) ([] ))) +gen_code_while i e c1 = + ((((:) (C_ALabel_1 (C_Ident_1 ("while_"++(lrc_INTtoSTR i)))) e)++((:) (C_Jumpf_1 (C_Ident_1 ("end_while_"++(lrc_INTtoSTR i)))) c1))++((:) (C_Jump_1 (C_Ident_1 ("while_"++(lrc_INTtoSTR i)))) ((:) (C_ALabel_1 (C_Ident_1 ("end_while_"++(lrc_INTtoSTR i)))) ([] )))) +gen_data_mem e = + ([] ) +get_fmts fs = + case fs of { (C_AFormat_1 a) -> a ; (C_TFormats_1 _ _ _ _) -> (text_fmts "<Error: can\'t dup a dup") } +gettype id fid env = + case (lrc_map_application id env) of { (C_Consvar_1 t i) -> t ; (C_Consarray_1 t i i2) -> t ; (C_Consfunc_1 t i l) -> t ; _ -> case (lrc_map_application fid env) of { (C_Consfunc_1 t i lstp) -> (gettypefp id lstp) ; _ -> (C_Errortype_1 ) } } +gettypefp id lstfp = + case lstfp of { ( (:) p ls ) -> case p of { (C_AParam_1 t n) -> (if (id==n) then t else (gettypefp id ls)) } ; ( [] ) -> (C_Errortype_1 ) } +head_T_Errs t = + case t of { ( (:) s _ ) -> s } +head_T_Fmts t = + case t of { ( (:) s _ ) -> s } +head_T_Mins t = + case t of { ( (:) s _ ) -> s } +head_T_Reqs t = + case t of { ( (:) f _ ) -> f } +hv a b = + (C_Join_1 (C_Dup_1 (C_Beside_1 a b) (C_Above_1 a b))) +hvc a b = + (C_DupC_1 (C_BesideC_1 a b) (C_AboveC_1 a b)) +if_t_ePP exp stats1 stats2 = + (hv (hv (hv (C_Text_1 "if") (C_Beside_1 (C_Text_1 "(") (C_Beside_1 exp (C_Text_1 ")")))) (hv (C_Text_1 "then") (blockStats stats1))) (hv (C_Text_1 "else") (blockStats stats2))) +indent_fmt i f = + case f of { (C_Elem_1 dh dl dw dt) -> (C_Elem_1 dh (i+dl) (i+dw) (add_glue i dt)) } +indent_fmts f i fs = + case f of { (C_F_1 pw _) -> (map_indent_fmt i (dropWhileFormatsNotFit (pw-i) fs)) } +infType op t1 t2 = + case op of { 1 -> (coersibleTypes t1 t2) ; 2 -> (if (t1==t2) then (C_Booltype_1 ) else (C_Errortype_1 )) ; _ -> (C_Errortype_1 ) } +initLst_Str l = + case l of { ( [] ) -> ([] ) ; ( (:) x ( [] ) ) -> ([] ) ; ( (:) x ls ) -> ((:) x (initLst_Str ls)) } +isaritmexp t = + case t of { (C_Inttype_1 ) -> True ; _ -> False } +isboolexp t = + case t of { (C_Booltype_1 ) -> True ; _ -> False } +isinenv n fid env = + (if (lrc_map_in n env) then True else case (lrc_map_application fid env) of { (C_Consfunc_1 t i lstp) -> (isinlst n lstp) ; _ -> False } ) +isinlst n l = + case l of { ( [] ) -> False ; ( (:) apar ls ) -> case apar of { (C_AParam_1 t n2) -> (if (n==n2) then True else (isinlst n ls)) } } +isinttype t = + case t of { (C_Inttype_1 ) -> True ; _ -> False } +join i lt rt = + case rt of { ( [] ) -> lt ; ( (:) x rt2 ) -> (((initLst_Str lt)++((:) ((lastLst_Str lt)++x) ([] )))++(add_glue i rt2)) } +lastLst_Str l = + case l of { ( (:) x ( [] ) ) -> x ; ( (:) _ ls ) -> (lastLst_Str ls) } +last_w f = + case f of { (C_Elem_1 _ pll _ _) -> pll } +map_With_fmts f fs = + case fs of { ( [] ) -> ([] ) ; ( (:) f2 fs2 ) -> ((:) (beside_fmt f f2) (map_With_fmts f fs2)) } +map_indent_fmt i fs = + case fs of { ( [] ) -> ([] ) ; ( (:) f fs2 ) -> ((:) (indent_fmt i f) (map_indent_fmt i fs2)) } +max_T_Frame a b = + case a of { (C_F_1 w _) -> case b of { (C_F_1 z _) -> (if (w>z) then a else b) } } +merge xs ys = + case xs of { ( [] ) -> ys ; ( (:) x xs2 ) -> case ys of { ( [] ) -> xs ; ( (:) y ys2 ) -> (if (x==y) then ((:) x (merge xs2 ys2)) else (if (x<y) then ((:) x (merge xs2 ys)) else ((:) y (merge xs ys2))) ) } } +nametoSTR n = + case n of { (C_Ident_1 s) -> s } +narrow_frame i f = + case f of { (C_F_1 s l) -> (C_F_1 (s-i) (l-i)) } +narrow_ll i f = + case f of { (C_F_1 s l) -> (C_F_1 s (l-i)) } +newlines ls = + case ls of { ( (:) x ( [] ) ) -> x ; ( (:) x xs ) -> ((x++"\n")++(newlines xs)) } +notFits delta f = + case f of { (C_Elem_1 _ _ dw _) -> (dw>delta) } +nullFormats fs = + case fs of { ( [] ) -> True ; _ -> False } +ppName n = + case n of { (C_Ident_1 s) -> (C_Text_1 s) } +ppType t = + case t of { (C_Inttype_1 ) -> (C_Text_1 "Int") ; (C_Realtype_1 ) -> (C_Text_1 "Real") ; (C_Booltype_1 ) -> (C_Text_1 "Bool") ; (C_Chartype_1 ) -> (C_Text_1 "Char") ; (C_Errortype_1 ) -> (C_Text_1 "Error??") } +s2fmt s = let { (l) = (fromIntegral (length s)) } in (C_Elem_1 1 l l ((:) s ([] ))) +sem_fmts_cdup a b ae be anpars bnpars min_w mesg = + (if (anpars/=bnpars) then (afmt_txt mesg) else (sem_fmts_dup a b ae be min_w)) +sem_fmts_dup afs bfs ae be minw = + (if (ae && be) then (afmt_txt (asts minw)) else (C_TFormats_1 (get_fmts afs) (get_fmts bfs) ae be)) +set_error_msg numpars len = + (((("<Error: incorrect apply expression. #pars "++(lrc_INTtoSTR numpars))++" /= #args ")++(lrc_INTtoSTR len))++">") +set_fmts_ab_above fs gs uh lh etxt = + case fs of { (C_AFormat_1 ffmts) -> case gs of { (C_AFormat_1 gfmts) -> (C_C_Pair_T_Formats_1 (C_AFormat_1 (set_fmts_abovea ffmts gfmts uh lh)) False) ; (C_TFormats_1 a bs ae be) -> (C_C_Pair_T_Formats_1 (C_TFormats_1 (set_fmts_abovea ffmts a uh lh) (set_fmts_abovea ffmts bs uh lh) ae be) False) } ; (C_TFormats_1 a bs ae be) -> case gs of { (C_AFormat_1 gfmts) -> (C_C_Pair_T_Formats_1 (C_TFormats_1 (set_fmts_abovea a gfmts uh lh) (set_fmts_abovea bs gfmts uh lh) ae be) False) ; _ -> (C_C_Pair_T_Formats_1 (afmt_txt etxt) True) } } +set_fmts_ab_beside fs gs uh lh frame error etxt = + case fs of { (C_AFormat_1 ffmts) -> case gs of { (C_AFormat_1 gfmts) -> (C_C_Pair_T_Formats_1 (C_AFormat_1 (set_fmts_besidea ffmts gfmts uh lh frame error)) False) ; (C_TFormats_1 a bs ae be) -> (C_C_Pair_T_Formats_1 (C_TFormats_1 (set_fmts_besidea ffmts a uh lh frame error) (set_fmts_besidea ffmts bs uh lh frame error) ae be) False) } ; (C_TFormats_1 a bs ae be) -> case gs of { (C_AFormat_1 gfmts) -> (C_C_Pair_T_Formats_1 (C_TFormats_1 (set_fmts_besidea a gfmts uh lh frame error) (set_fmts_besidea bs gfmts uh lh frame error) ae be) False) ; _ -> (C_C_Pair_T_Formats_1 (afmt_txt etxt) True) } } +set_fmts_above us ls uh lh = + (set_fmts_ab_above us ls uh lh "<Error: can\'t above two pairs") +set_fmts_abovea a bs uh lh = + (if (uh==0) then bs else (if (lh==0) then a else (above_fmts a bs)) ) +set_fmts_apply error msg fmts = + (if error then msg else fmts) +set_fmts_beside ls rs lh rh frame error = + (set_fmts_ab_beside ls rs lh rh frame error "<Error: can\'t beside two pairs") +set_fmts_besidea ls rs lh rh frame error = + (if (lh==0) then rs else (if (rh==0) then ls else (if error then (error_beside ls rs) else (beside_fmts frame ls rs)) ) ) +set_fmts_empty = + (C_AFormat_1 (empty_fmts )) +set_fmts_fillblock i fmts w = + (if (i<0) then (afmt_txt "<Error: negative page width in fillblock>") else (if (i>w) then (afmt_txt (asts i)) else (C_AFormat_1 fmts)) ) +set_fmts_filllist af bf ah bh f avail = + case bf of { (C_AFormat_1 ns) -> (if (ah==0) then (C_C_Pair_Formats_1 ns False) else (if (bh==0) then (C_C_Pair_Formats_1 af False) else (if (bh<=1) then (C_C_Pair_Formats_1 (choose_ab_beside_fmts avail af ns f) False) else (C_C_Pair_Formats_1 (choose_ab_error_beside avail af (text_fmts "<Error: element in fill higher than 1>") f) True)) ) ) ; _ -> (C_C_Pair_Formats_1 (set_fmts_filllista (text_fmts "<Error: element in fill list is a pair>") af ah bh avail f) True) } +set_fmts_filllista fs afmts ah nh avail f = + (if (ah==0) then afmts else (if (nh==0) then fs else (choose_ab_error_beside avail fs afmts f)) ) +set_fmts_indent i f pw minw frame error = + (if (i<0) then (afmt_txt "<Error: negative indentation>") else (if (i>pw) then (afmt_txt (asts minw)) else (if error then (set_fmts_indent_error_indent i f) else (set_fmts_indent_indent_fmts i f frame)) ) ) +set_fmts_indent_error_indent i fmts = + case fmts of { (C_AFormat_1 fs) -> (C_AFormat_1 (error_indent i fs)) ; (C_TFormats_1 a bs ae be) -> (C_TFormats_1 (error_indent i a) (error_indent i bs) ae be) } +set_fmts_indent_indent_fmts i fmts frame = + case fmts of { (C_AFormat_1 fs) -> (C_AFormat_1 (indent_fmts frame i fs)) ; (C_TFormats_1 a bs ae be) -> (C_TFormats_1 (indent_fmts frame i a) (indent_fmts frame i bs) ae be) } +set_fmts_join fs err = + case fs of { (C_AFormat_1 f) -> (if err then (C_C_Pair_T_Formats_1 fs err) else (C_C_Pair_T_Formats_1 (afmt_txt "<Error: can\'t join a single result>") True)) ; (C_TFormats_1 a bs ae be) -> let { (aa) = (if be then (if (nullFormats a) then bs else a) else (if ae then (if (nullFormats bs) then a else bs) else (merge a bs)) ) } in (C_C_Pair_T_Formats_1 (C_AFormat_1 aa) False) } +set_fmts_render pw fmts = + (if (pw<0) then (text_fmts "<Error: negative page width >") else case fmts of { (C_AFormat_1 fmt) -> fmt ; _ -> (text_fmts "<Error: can\'t render a pair>") } ) +set_fmts_text string minw error = + (afmt_txt (if error then (asts minw) else string) ) +set_var_apply error lem min = + (if error then lem else min) +snd_Pair_Formats f = + case f of { (C_C_Pair_Formats_1 a b) -> b } +snd_Pair_Lst_T_Errs t = + case t of { (C_CPair_Lst_T_Errs_1 _ a) -> a } +snd_Pair_Lst_T_Fmts t = + case t of { (C_CPair_Lst_T_Fmts_1 _ a) -> a } +snd_Pair_Lst_T_Mins t = + case t of { (C_CPair_Lst_T_Mins_1 _ a) -> a } +snd_Pair_T_Formats f = + case f of { (C_C_Pair_T_Formats_1 a b) -> b } +snd_t t = + case t of { (C_Triple_1 _ pll _) -> pll } +splitAt_T_Errs i tm = + (if (i<=0) then (C_CPair_Lst_T_Errs_1 ([] ) tm) else case tm of { ( [] ) -> (C_CPair_Lst_T_Errs_1 ([] ) ([] )) ; ( (:) x xs ) -> let { (a) = (splitAt_T_Errs (i-1) xs) ; (xs2) = (fst_Pair_Lst_T_Errs a) ; (xs22) = (snd_Pair_Lst_T_Errs a) } in (C_CPair_Lst_T_Errs_1 ((:) x xs2) xs22) } ) +splitAt_T_Fmts i tm = + (if (i<=0) then (C_CPair_Lst_T_Fmts_1 ([] ) tm) else case tm of { ( [] ) -> (C_CPair_Lst_T_Fmts_1 ([] ) ([] )) ; ( (:) x xs ) -> let { (a) = (splitAt_T_Fmts (i-1) xs) ; (xs2) = (fst_Pair_Lst_T_Fmts a) ; (xs22) = (snd_Pair_Lst_T_Fmts a) } in (C_CPair_Lst_T_Fmts_1 ((:) x xs2) xs22) } ) +splitAt_T_Mins i tm = + (if (i<=0) then (C_CPair_Lst_T_Mins_1 ([] ) tm) else case tm of { ( [] ) -> (C_CPair_Lst_T_Mins_1 ([] ) ([] )) ; ( (:) x xs ) -> let { (a) = (splitAt_T_Mins (i-1) xs) ; (xs2) = (fst_Pair_Lst_T_Mins a) ; (xs22) = (snd_Pair_Lst_T_Mins a) } in (C_CPair_Lst_T_Mins_1 ((:) x xs2) xs22) } ) +tail_T_Reqs t = + case t of { ( (:) _ tr ) -> tr } +text_fmts s = + ((:) (s2fmt s) ([] )) +third_t t = + case t of { (C_Triple_1 _ _ ph) -> ph } +tooWide pw x y = + ((max (total_w x) ((last_w x)+(total_w y)))>pw) +total_w f = + case f of { (C_Elem_1 _ _ w _) -> w } +txtstr f n s = + case f of { (C_Elem_1 dh dl dw dt) -> ((newlines (add_glue n dt))++s) } +typecheck s exptype fid env = + (if (exptype==(gettype s fid env)) then True else False) +whilePP bg exp stats = + (C_Apply_1 (C_JoinC_1 (hvc (C_ParC_1 ) (C_JoinC_1 (hvc (C_ParC_1 ) C_ParC_1)))) (C_ConsArgs_1 bg (C_ConsArgs_1 exp (C_ConsArgs_1 stats (C_NilArgs_1 ))))) +whilePPOLD exp stats = + (hv (hv (C_Text_1 "while") (C_Beside_1 (C_Text_1 "(") (C_Beside_1 exp (C_Text_1 ")")))) (blockStats stats)) +zipwith_max l1 l2 = + case l1 of { ( [] ) -> l2 ; ( (:) l11 l11s ) -> case l2 of { ( [] ) -> l1 ; ( (:) l22 l22s ) -> ((:) (max_T_Frame l11 l22) (zipwith_max l11s l22s)) } } diff --git a/testsuite/tests/programs/joao-circular/inp b/testsuite/tests/programs/joao-circular/inp new file mode 100644 index 0000000000..9f88682479 --- /dev/null +++ b/testsuite/tests/programs/joao-circular/inp @@ -0,0 +1,22 @@ +int a; +int b; +int c; +int a; + + +fact (int x) : int +{ + fact = 1; + while ( x > 0 ) + { fact = fact * x; + x = x - 1; + }; +}; + +recfact (int x) : int +{ if ( x == 0) then + { recfact = 1;} + else + { recfact = x * recfact (x - 1); }; +}; + diff --git a/testsuite/tests/programs/joao-circular/joao-circular.stdout b/testsuite/tests/programs/joao-circular/joao-circular.stdout new file mode 100644 index 0000000000..0c69f85dbc --- /dev/null +++ b/testsuite/tests/programs/joao-circular/joao-circular.stdout @@ -0,0 +1,86 @@ +["inp","40"] +Pretty Printed Input: +Int = a +Int = b +Int = c +Int = a +fact(Int x,) : Int +{ fact = 1; + while x > 0fact = fact * x; + x = x - 1;; +} +recfact(Int x,) : Int +{ if(x == 0)then{ recfact = 1; + } + else{ recfact = x * recfact(x - 1); + }; +} +MSP Generated Code: +MEMORIA DE DADOS +"a0" TAM 1 +"b0" TAM 1 +"c0" TAM 1 +"a0" TAM 1 +"fact0" TAM 1 +"x" TAM 1 +"recfact1" TAM 1 +"x" TAM 2 +CODIGO +CALL "main" +HALT +C_Ident_1 "fact": +PUSHa "fact" 1 +PUSHi 1 +STORE +C_Ident_1 "while_1": +PUSHa "x" 1 +LOAD +PUSHi 0 +GT +JMPF "end_while_1" +PUSHa "fact" 1 +PUSHa "fact" 1 +LOAD +PUSHa "x" 1 +LOAD +MUL +STORE +PUSHa "x" 1 +PUSHa "x" 1 +LOAD +PUSHi 1 +SUB +STORE +JMP "while_1" +C_Ident_1 "end_while_1": +RET +C_Ident_1 "recfact": +PUSHa "x" 2 +LOAD +PUSHi 0 +EQ +JMPF "else_1" +PUSHa "recfact" 2 +PUSHi 1 +STORE +JMPF "end_if_1" +C_Ident_1 "else_1": +PUSHa "recfact" 2 +PUSHa "x" 2 +LOAD +PUSHa "x" 1 +PUSHa "x" 2 +LOAD +PUSHi 1 +SUB +STORE +CALL "recfact" +MUL +STORE +C_Ident_1 "end_if_1": +RET + + +Detected Semantic Errors: +[C_E_Name_AD_1 (C_Ident_1 "a")] +[] diff --git a/testsuite/tests/programs/joao-circular/test.T b/testsuite/tests/programs/joao-circular/test.T new file mode 100644 index 0000000000..935ec7e6f4 --- /dev/null +++ b/testsuite/tests/programs/joao-circular/test.T @@ -0,0 +1,11 @@ +test('joao-circular', + [skip_if_fast, + extra_clean(['Data_Lazy.hi', 'Data_Lazy.o', + 'Funcs_Lexer.hi', 'Funcs_Lexer.o', + 'Funcs_Parser_Lazy.hi', 'Funcs_Parser_Lazy.o', + 'LrcPrelude.hi', 'LrcPrelude.o', + 'Main.hi', 'Main.o', + 'Visfun_Lazy.hi', 'Visfun_Lazy.o']), + extra_run_opts('inp 40')], + multimod_compile_and_run, + ['Main', '-O']) diff --git a/testsuite/tests/programs/jq_readsPrec/Main.hs b/testsuite/tests/programs/jq_readsPrec/Main.hs new file mode 100644 index 0000000000..360a411ef0 --- /dev/null +++ b/testsuite/tests/programs/jq_readsPrec/Main.hs @@ -0,0 +1,20 @@ +module Main where + +data Vertex = V Int deriving (Read, Show) + +main = do + userInput <- getContents + (parseVertex.lines) userInput report + +report::Vertex -> IO () +report int = putStr (show int) + +parseVertex::[String] -> (Vertex -> IO ()) -> IO () +parseVertex inputLines cont + = case inputLines of + (l1:rest) -> case (reads l1) of + [(x,"")] -> cont x + other -> putStr + ((showString "Error - retype the edges\n". shows other) "") + _ -> putStr "No Vertex" + diff --git a/testsuite/tests/programs/jq_readsPrec/Makefile b/testsuite/tests/programs/jq_readsPrec/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/jq_readsPrec/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/jq_readsPrec/jq_readsPrec.stdin b/testsuite/tests/programs/jq_readsPrec/jq_readsPrec.stdin new file mode 100644 index 0000000000..8cc78bf4cd --- /dev/null +++ b/testsuite/tests/programs/jq_readsPrec/jq_readsPrec.stdin @@ -0,0 +1 @@ +(V 1) diff --git a/testsuite/tests/programs/jq_readsPrec/jq_readsPrec.stdout b/testsuite/tests/programs/jq_readsPrec/jq_readsPrec.stdout new file mode 100644 index 0000000000..725c38e559 --- /dev/null +++ b/testsuite/tests/programs/jq_readsPrec/jq_readsPrec.stdout @@ -0,0 +1 @@ +V 1
\ No newline at end of file diff --git a/testsuite/tests/programs/jq_readsPrec/test.T b/testsuite/tests/programs/jq_readsPrec/test.T new file mode 100644 index 0000000000..393f82c4b3 --- /dev/null +++ b/testsuite/tests/programs/jq_readsPrec/test.T @@ -0,0 +1,6 @@ + +test('jq_readsPrec', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/jtod_circint/Bit.hs b/testsuite/tests/programs/jtod_circint/Bit.hs new file mode 100644 index 0000000000..be11a6f517 --- /dev/null +++ b/testsuite/tests/programs/jtod_circint/Bit.hs @@ -0,0 +1,183 @@ +module Bit where +import LogFun +import Signal + +data Bit = Bot | WeakZero | WeakOne | Zero | One | Top + deriving (Eq,Show{-was:Text-}) + +instance Static Bit where + intToSig = intToSigBit + sigToInt = sigToIntBit + showStaticSig = showBit + +instance Lattice Bit where + bot = Bot + top = Top + weakZero = WeakZero + weakOne = WeakOne + lub = lubBit + pass = passBit + +instance Signal Bit where + showSig = showBit + initial = Zero + zerO = Zero + one = One + tt1 = tt1Bit + tt2 = tt2Bit + +instance Log Bit where + dumLog = Zero + +tt1Bit :: TT1 -> Bit -> Bit +tt1Bit (a,b) = + let p = intBit a + q = intBit b + f x = case x of + Bot -> Bot + Zero -> p + One -> q + Top -> Top + in f + +tt2Bit :: TT2 -> Bit -> Bit -> Bit +tt2Bit (a,b,c,d) = f + where p = intBit a + q = intBit b + r = intBit c + s = intBit d + f x y = case x of + Bot -> case y of + Bot -> Bot + WeakZero -> Bot + WeakOne -> Bot + Zero -> Bot + One -> Bot + Top -> Top + WeakZero -> case y of + Bot -> Bot + WeakZero -> p + WeakOne -> q + Zero -> p + One -> q + Top -> Top + WeakOne -> case y of + Bot -> Bot + WeakZero -> r + WeakOne -> s + Zero -> r + One -> s + Top -> Top + Zero -> case y of + Bot -> Bot + WeakZero -> p + WeakOne -> q + Zero -> p + One -> q + Top -> Top + One -> case y of + Bot -> Bot + WeakZero -> r + WeakOne -> s + Zero -> r + One -> s + Top -> Top + Top -> case y of + Bot -> Top + WeakZero -> Top + WeakOne -> Top + Zero -> Top + One -> Top + Top -> Top + +lubBit :: Bit -> Bit -> Bit +lubBit a b = + case a of + Bot -> case b of + Bot -> Bot + WeakZero -> WeakZero + WeakOne -> WeakOne + Zero -> Zero + One -> One + Top -> Top + WeakZero -> case b of + Bot -> Zero + WeakZero -> WeakZero + WeakOne -> Top + Zero -> Zero + One -> One + Top -> Top + WeakOne -> case b of + Bot -> WeakOne + WeakZero -> Top + WeakOne -> WeakOne + Zero -> Zero + One -> One + Top -> Top + Zero -> case b of + Bot -> Zero + WeakZero -> Zero + WeakOne -> Zero + Zero -> Zero + One -> Top + Top -> Top + One -> case b of + Bot -> One + WeakZero -> One + WeakOne -> One + Zero -> Top + One -> One + Top -> Top + Top -> case b of + Bot -> Top + WeakZero -> Top + WeakOne -> Top + Zero -> Top + One -> Top + Top -> Top + +showBit :: Bit -> String +showBit Bot = "v" +showBit WeakZero = "z" +showBit WeakOne = "o" +showBit Zero = "0" +showBit One = "1" +showBit Top = "^" + + +intBit :: Int -> Bit +intBit 0 = Zero +intBit 1 = One +intBit x = + error ("\nintBit received bad Int " ++ show x ++ ".\n") + +intToSigBit :: Int -> Bit +intToSigBit i + | i==0 = Zero + | i==1 = One + | i==8 = Bot + | i==9 = Top + +sigToIntBit :: Bit -> Int +sigToIntBit Zero = 0 +sigToIntBit One = 1 +sigToIntBit Bot = 8 +sigToIntBit Top = 9 + +passBit :: Bit -> Bit -> Bit +passBit c a = + case c of + Bot -> Bot + Zero -> Bot + One -> a + Top -> Top + +instance Num Bit where + (+) = or2 + (*) = and2 + a - b = xor a b + negate = inv + abs = error "abs not defined for Signals" + signum = error "signum not defined for Signals" + fromInteger = error "fromInteger not defined for Signals" + diff --git a/testsuite/tests/programs/jtod_circint/LogFun.hs b/testsuite/tests/programs/jtod_circint/LogFun.hs new file mode 100644 index 0000000000..b9a5bf169d --- /dev/null +++ b/testsuite/tests/programs/jtod_circint/LogFun.hs @@ -0,0 +1,34 @@ +module LogFun where + +type TT1 = (Int,Int) +type TT2 = (Int,Int,Int,Int) + +tt_con10, tt_id, tt_inv, tt_con11 :: TT1 + +tt_con10 = (0,0) +tt_id = (0,1) +tt_inv = (1,0) +tt_con11 = (1,1) + +tt_con20, tt_and2, tt_nimp, tt_id21 :: TT2 +tt_nimp', tt_id22, tt_xor, tt_or2 :: TT2 +tt_nor2, tt_equ2, tt_inv22, tt_imp' :: TT2 +tt_inv21, tt_imp, tt_nand2, tt_con21 :: TT2 + +tt_con20 = (0,0,0,0) +tt_and2 = (0,0,0,1) +tt_nimp = (0,0,1,0) +tt_id21 = (0,0,1,1) +tt_nimp' = (0,1,0,0) +tt_id22 = (0,1,0,1) +tt_xor = (0,1,1,0) +tt_or2 = (0,1,1,1) +tt_nor2 = (1,0,0,0) +tt_equ2 = (1,0,0,1) +tt_inv22 = (1,0,1,0) +tt_imp' = (1,0,1,1) +tt_inv21 = (1,1,0,0) +tt_imp = (1,1,0,1) +tt_nand2 = (1,1,1,0) +tt_con21 = (1,1,1,1) + diff --git a/testsuite/tests/programs/jtod_circint/Main.hs b/testsuite/tests/programs/jtod_circint/Main.hs new file mode 100644 index 0000000000..a1907dc6a9 --- /dev/null +++ b/testsuite/tests/programs/jtod_circint/Main.hs @@ -0,0 +1,12 @@ +module Main where +import Signal +import Bit + +main = putStr test + +test = stest + +type B = Stream Bit + +stest = take 80 (shows z "\n") + where z = one :: B diff --git a/testsuite/tests/programs/jtod_circint/Makefile b/testsuite/tests/programs/jtod_circint/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/jtod_circint/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/jtod_circint/Signal.hs b/testsuite/tests/programs/jtod_circint/Signal.hs new file mode 100644 index 0000000000..38a1fc86f5 --- /dev/null +++ b/testsuite/tests/programs/jtod_circint/Signal.hs @@ -0,0 +1,146 @@ +module Signal where + +import LogFun + +class (Eq a, Show{-was:Text-} a, Num a) => Signal a where + showSig :: a -> String + + zerO, one, initial :: a + + tt1 :: TT1 -> a -> a + tt2 :: TT2 -> a -> a -> a + + con10, buf, inv, con11 :: a -> a + + con20, and2, nimp, id21 :: a -> a -> a + nimp', id22, xor, or2 :: a -> a -> a + nor2, equ2, inv22, imp' :: a -> a -> a + inv21, imp, nand2, con21 :: a -> a -> a + and3, or3, nand3, nor3 :: a -> a -> a -> a + and4, or4, nand4, nor4 :: a -> a -> a -> a -> a + + con10 = tt1 tt_con10 + buf = tt1 tt_id + inv = tt1 tt_inv + con11 = tt1 tt_con11 + + con20 = tt2 tt_con20 + and2 = tt2 tt_and2 + nimp = tt2 tt_nimp + id21 = tt2 tt_id21 + nimp' = tt2 tt_nimp' + id22 = tt2 tt_id22 + xor = tt2 tt_xor + or2 = tt2 tt_or2 + nor2 = tt2 tt_nor2 + equ2 = tt2 tt_equ2 + inv22 = tt2 tt_inv22 + imp' = tt2 tt_imp' + inv21 = tt2 tt_inv21 + imp = tt2 tt_imp + nand2 = tt2 tt_nand2 + con21 = tt2 tt_con21 + + and3 a b c = a*b*c + or3 a b c = a+b+c + nand3 a b c = nand2 a (nand2 b c) + nor3 a b c = nor2 a (nor2 b c) + + and4 a b c d = (a*b)*(c*d) + or4 a b c d = (a+b)+(c+d) + nand4 a b c d = nand2 (nand2 a b) (nand2 c d) + nor4 a b c d = nor2 (nor2 a b) (nor2 c d) + +class (Signal a) => Lattice a where + bot, top, weakZero, weakOne :: a + lub :: a -> a -> a + pass :: a -> a -> a + +class (Signal a) => Static a where + intToSig :: Int -> a + sigToInt :: a -> Int + showStaticSig :: a -> String + +class (Signal a) => Dynamic a where + latch, dff :: a -> a + +class (Lattice a, Static a) => Log a where + dumLog :: a + +class (Lattice a, Dynamic a) => Sig a where + dumSig :: a + +data Stream a = Snil | Scons a (Stream a) deriving (Eq,Show{-was:Text-}) + +shead :: Stream a -> a +shead (Scons x xs) = x + +stail :: Stream a -> Stream a +stail (Scons x xs) = xs + +snull :: Stream a -> Bool +snull Snil = True +snull (Scons x xs) = False + +smap :: (a->b) -> Stream a -> Stream b +smap f Snil = Snil +smap f (Scons x xs) = Scons (f x) (smap f xs) + +stake, sdrop :: Int -> Stream a -> Stream a + +stake 0 xs = xs +--should be: stake (i+1) (Scons x xs) = Scons x (stake i xs) +stake i (Scons x xs) | i < 0 = error "Signal.stake: < 0" + | otherwise = Scons x (stake (i-1) xs) + +sdrop 0 xs = xs +--should be:sdrop (i+1) (Scons x xs) = sdrop i xs +sdrop i (Scons x xs) | i < 0 = error "Signal.sdrop: < 0" + | otherwise = sdrop i xs + +smap2 :: (a->b->c) -> Stream a -> Stream b -> Stream c +smap2 f as bs = + case as of + Snil -> Snil + Scons a as' -> + case bs of + Snil -> Snil + Scons b bs' -> Scons (f a b) (smap2 f as' bs') + +srepeat :: (Static a) => a -> Stream a +srepeat x = xs where xs = Scons x xs + +stream :: [a] -> Stream a +stream [] = Snil +stream (x:xs) = Scons x (stream xs) + +instance (Signal a, Static a) => Dynamic (Stream a) where + latch xs = Scons initial xs + dff xs = Scons initial xs + +instance (Lattice a, Static a) => Lattice (Stream a) where + bot = srepeat bot + top = srepeat top + weakZero = srepeat weakZero + weakOne = srepeat weakOne + lub = smap2 lub + pass = smap2 pass + +instance (Signal a, Static a) => Signal (Stream a) where + zerO = srepeat zerO + one = srepeat one + tt1 = smap . tt1 + tt2 = smap2 . tt2 + +instance (Lattice a, Static a) => Sig (Stream a) where + dumSig = bot -- ??? shouldn't be necessary, check compiler + +instance (Static a) => Num (Stream a) where + (+) = or2 + (*) = and2 + a - b = xor a b + negate = inv + abs = error "abs not defined for Signals" + signum = error "signum not defined for Signals" + fromInteger = error "fromInteger not defined for Signals" + diff --git a/testsuite/tests/programs/jtod_circint/jtod_circint.stdout b/testsuite/tests/programs/jtod_circint/jtod_circint.stdout new file mode 100644 index 0000000000..bc629dadd2 --- /dev/null +++ b/testsuite/tests/programs/jtod_circint/jtod_circint.stdout @@ -0,0 +1 @@ +Scons One (Scons One (Scons One (Scons One (Scons One (Scons One (Scons One (Sco
\ No newline at end of file diff --git a/testsuite/tests/programs/jtod_circint/test.T b/testsuite/tests/programs/jtod_circint/test.T new file mode 100644 index 0000000000..47338d7b89 --- /dev/null +++ b/testsuite/tests/programs/jtod_circint/test.T @@ -0,0 +1,10 @@ + +test('jtod_circint', + [skip_if_fast, + extra_clean(['Bit.hi', 'Bit.o', + 'LogFun.hi', 'LogFun.o', + 'Main.hi', 'Main.o', + 'Signal.hi', 'Signal.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/jules_xref/Main.hs b/testsuite/tests/programs/jules_xref/Main.hs new file mode 100644 index 0000000000..19f364d0f9 --- /dev/null +++ b/testsuite/tests/programs/jules_xref/Main.hs @@ -0,0 +1,174 @@ +-- !!! a performance-problem test from Jules. +-- further comment at the end +-- +module Main where + +import Data.Char -- 1.3 + +--1.3:data Maybe a = Nothing | Just a + +data ATree a b = ALeaf + | ABranch (ATree a b) a [b] (ATree a b) Int + -- deriving (Eq) + +type SymTable = ATree String Int + + +pp_tree :: SymTable -> String +pp_tree ALeaf = "" +pp_tree (ABranch l k vs r h) + = pp_tree l ++ show (k,reverse vs) ++ "\n" ++ pp_tree r + +{- +avAdd :: Ord a => ATree a b -> + a -> + b -> + ATree a b +-} +avAdd ALeaf xk xv = ABranch ALeaf xk [xv] ALeaf 1 + +avAdd (ABranch l yk yv r hy) xk xv + | yk > xk = let (ABranch l1 zk zv l2 _) = avAdd l xk xv + in avCombine l1 (f l1) l2 (f l2) r (f r) zk zv yk yv + | xk > yk = let (ABranch r1 zk zv r2 _) = avAdd r xk xv + in avCombine l (f l) r1 (f r1) r2 (f r2) yk yv zk zv + | otherwise = ABranch l yk (xv:yv) r hy + where + f :: ATree a b -> Int + f ALeaf = 0 + f (ABranch _ _ _ _ d) = d + + + +-- ==========================================================-- +-- +{- +avLookup :: Ord a => ATree a b -> + a -> + Maybe b +-} +avLookup ALeaf _ = Nothing + +avLookup (ABranch l k v r _) kk + | kk < k = avLookup l kk + | kk > k = avLookup r kk + | otherwise = Just v + + + +-- ==========================================================-- +-- +avCombine :: ATree a b -> + Int -> + ATree a b -> + Int -> + ATree a b -> + Int -> + a -> + [b] -> + a -> + [b] -> + ATree a b + +avCombine t1 h1 t2 h2 t3 h3 ak av ck cv + | h2 > h1 && h2 > h3 + = ABranch (ABranch t1 ak av t21 (h1+1)) bk bv + (ABranch t22 ck cv t3 (h3+1)) (h1+2) + | h1 >= h2 && h1 >= h3 + = ABranch t1 ak av (ABranch t2 ck cv t3 (max1 h2 h3)) + (max1 h1 (max1 h2 h3)) + | h3 >= h2 && h3 >= h1 + = ABranch (ABranch t1 ak av t2 (max1 h1 h2)) ck cv t3 + (max1 (max1 h1 h2) h3) + where + (ABranch t21 bk bv t22 _) = t2 + max1 :: Int -> Int -> Int + max1 n m = 1 + (if n > m then n else m) + + +-- ==========================================================-- +-- === end AVLTree.hs ===-- +-- ==========================================================-- + + + + +xref :: SymTable -> Int -> String -> SymTable + +xref stab lineno [] = stab +xref stab lineno ('\n':cs) = xref stab (lineno+1) cs +xref stab lineno (c:cs) + = if isAlpha c then + let (word, rest) = span isAlphaNum cs + in xref (avAdd stab (c:word) lineno) lineno rest + else xref stab lineno cs + +main = do + s <- getContents + putStr (pp_tree (xref ALeaf 1 s)) + +{- +Date: Thu, 29 Oct 92 19:38:31 GMT +From: Julian Seward (DRL PhD) <sewardj@uk.ac.man.cs> +Message-Id: <9210291938.AA27685@r6b.cs.man.ac.uk> +To: partain@uk.ac.glasgow.dcs +Subject: More ghc vs hbc fiddling (OR: nofib ephemeral contribution (unsolicited :-)) + +Will, + +There are still some very simple programs for which ghc's performance +falls far behind that of hbc's -- even with ghc using a better +GC. The stat files below are from a +crude cross reference program we hacked together for the purposes +of an internal "what-language-to-teach-first-year-undergrads" debate. + +Is this something to do with dictionary zapping? + +Program included below. Use as a pipe. Suggest you feed it any +large Haskell source file (I used TypeCheck5.hs from Anna). + +Jules + +--------------------------------------------------------- + +a.out -H9000000 -S +Nw Heap Tt Heap Stk GC(real) GC acc (real) tot (real) newheap in -dupl -new -del +stk out mcode + 99192 99192 20 0.06 0.1 0.06 0.1 0.16 0.4 396768 0 0 0 0 0 0 + 247752 247752 14 0.13 0.1 0.19 0.2 0.44 0.8 991008 0 0 0 0 0 0 + 623104 623104 34 0.32 0.3 0.51 0.5 1.08 1.5 2492416 0 0 0 0 0 0 +1433968 1433968 15879 0.62 0.8 1.13 1.4 2.66 3.6 5735872 0 0 0 0 0 0 +3009700 3009700 2382 1.56 1.6 2.69 3.0 6.88 8.6 9000000 0 0 0 0 0 0 + 5 GCs, + 8.69 (13.1) seconds total time, + 2.69 (3.0) seconds GC time (31.0(23.1)% of total time) + 0.00 (0.0) seconds major GC time ( 0.0( 0.0)% of total time) + 9303816 bytes allocated from the heap. + +------------------------------------------------ + +xref +RTS -H9M -S -K200k + +Collector: APPEL HeapSize: 9,437,184 (bytes) + + Alloc Live Live Astk Bstk OldGen GC GC TOT TOT Page Flts Collec Resid + bytes bytes % bytes bytes roots user elap user elap GC TOT tion %heap +4718580 786672 16.7 40 220 424 0.37 0.52 3.67 4.68 0 0 Minor +4325248 808804 18.7 62724 62820 564968 0.50 0.60 6.63 8.05 0 0 Minor +3920848 743508 19.0 47512 47600 743220 0.47 0.60 8.60 10.17 0 0 Minor +3549096 681464 19.2 34644 34892 680820 0.46 0.53 10.43 12.13 0 0 Minor +3208348 604892 18.9 23564 23676 604512 0.41 0.48 12.07 13.89 0 0 Minor +2905900 528584 18.2 14164 14396 527952 0.35 0.41 13.53 15.42 0 0 Minor +2641592 490812 18.6 5228 5388 490476 0.30 0.37 14.85 16.82 0 0 Minor +2396204 534400 22.3 16 40 534380 0.28 0.32 16.41 18.75 0 0 Minor +2129016 691708 32.5 36 144 691420 0.33 0.39 18.38 21.68 0 0 Minor +1090480 + +30,885,312 bytes allocated in the heap + 9 garbage collections performed + + Total time 19.29s (23.06s elapsed) + GC time 3.47s (4.22s elapsed) + %GC time 18.0% + +-------------------------------------------------- +-} diff --git a/testsuite/tests/programs/jules_xref/Makefile b/testsuite/tests/programs/jules_xref/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/jules_xref/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/jules_xref/jules_xref.stdin b/testsuite/tests/programs/jules_xref/jules_xref.stdin new file mode 100644 index 0000000000..a43907d9bd --- /dev/null +++ b/testsuite/tests/programs/jules_xref/jules_xref.stdin @@ -0,0 +1,1105 @@ + +--==========================================================-- +--=== A type-checker -- v5 File: TypeCheck5.m (1) ===-- +--=== Corrected version for 0.210a ===-- +--==========================================================-- + +module TypeCheck5 where +import BaseDefs +import Utils +import MyUtils + +--==========================================================-- +--=== Formatting of results ===-- +--==========================================================-- + +tcMapAnnExpr :: (a -> b) -> + AnnExpr c a -> + AnnExpr c b + +tcMapAnnExpr f (ann, node) + = (f ann, mapAnnExpr' node) + where + mapAnnExpr' (AVar v) = AVar v + mapAnnExpr' (ANum n) = ANum n + mapAnnExpr' (AConstr c) = AConstr c + mapAnnExpr' (AAp ae1 ae2) + = AAp (tcMapAnnExpr f ae1) (tcMapAnnExpr f ae2) + mapAnnExpr' (ALet recFlag annDefs mainExpr) + = ALet recFlag (map mapAnnDefn annDefs) (tcMapAnnExpr f mainExpr) + mapAnnExpr' (ACase switchExpr annAlts) + = ACase (tcMapAnnExpr f switchExpr) (map mapAnnAlt annAlts) + mapAnnExpr' (ALam vs e) = ALam vs (tcMapAnnExpr f e) + + mapAnnDefn (naam, expr) + = (naam, tcMapAnnExpr f expr) + + mapAnnAlt (naam, (pars, resExpr)) + = (naam, (pars, tcMapAnnExpr f resExpr)) + + +--======================================================-- +-- +tcSubstAnnTree :: Subst -> + AnnExpr Naam TExpr -> + AnnExpr Naam TExpr + +tcSubstAnnTree phi tree = tcMapAnnExpr (tcSub_type phi) tree + + +--======================================================-- +-- +tcTreeToEnv :: AnnExpr Naam TExpr -> + TypeEnv + +tcTreeToEnv tree + = t2e tree + where + t2e (nodeType, node) = t2e' node + + t2e' (AVar v) = [] + t2e' (ANum n) = [] + t2e' (AConstr c) = [] + t2e' (AAp ae1 ae2) = (t2e ae1) ++ (t2e ae2) + t2e' (ALam cs e) = t2e e + t2e' (ALet rf dl me) + = (concat (map aFN dl)) ++ (t2e me) + t2e' (ACase sw alts) + = (t2e sw) ++ (concat (map (t2e.second.second) alts)) + + aFN (naam, (tijp, body)) + = (naam, tijp):(t2e' body) + + + +--======================================================-- +-- +tcShowtExpr :: TExpr -> + [Char] + +tcShowtExpr t + = pretty' False t + where + pretty' b (TVar tvname) = [' ', chr (96+(lookup tvname tvdict))] + pretty' b (TCons "int" []) = " int" + pretty' b (TCons "bool" []) = " bool" + pretty' b (TCons "char" []) = " char" + pretty' True (TArr t1 t2) + = " (" ++ (pretty' True t1) ++ " -> " ++ + (pretty' False t2) ++ ")" + pretty' False (TArr t1 t2) + = (pretty' True t1) ++ " -> " ++ + (pretty' False t2) + pretty' b (TCons notArrow cl) + = " (" ++ notArrow ++ + concat (map (pretty' True) cl) ++ ")" + lookup tvname [] + = panic "tcShowtExpr: Type name lookup failed" + lookup tvname (t:ts) | t==tvname = 1 + | otherwise = 1 + (lookup tvname ts) + tvdict = nub (tvdict' t) + tvdict' (TVar t) = [t] + tvdict' (TCons c ts) = concat (map tvdict' ts) + tvdict' (TArr t1 t2) = tvdict' t1 ++ tvdict' t2 + + +--======================================================-- +-- +tcPretty :: (Naam, TExpr) -> + [Char] + +tcPretty (naam, tipe) + = "\n " ++ (ljustify 25 (naam ++ " :: ")) ++ + (tcShowtExpr tipe) + + +--======================================================-- +tcCheck :: TcTypeEnv -> + TypeNameSupply -> + AtomicProgram -> + ([Char], Reply (AnnExpr Naam TExpr, TypeEnv) Message) + +tcCheck baseTypes ns (tdefs, expr) + = if good tcResult + then (fullEnvWords, Ok (rootTree, fullEnv)) + else ("", Fail "No type") + where + tcResult = tc (tdefs++builtInTypes) + (baseTypes++finalConstrTypes) finalNs expr + + good (Ok x) = True + good (Fail x2) = False + + (rootSubst, rootType, annoTree) = f tcResult where f (Ok x) = x + + rootTree = tcSubstAnnTree rootSubst annoTree + + rootEnv = tcTreeToEnv rootTree + + fullEnv = rootEnv ++ map f finalConstrTypes + where + f (naam, (Scheme vs t)) = (naam, t) + + fullEnvWords = concat (map tcPretty fullEnv) + + (finalNs, constrTypes) = + mapAccuml tcConstrTypeSchemes ns (tdefs++builtInTypes) + finalConstrTypes = concat constrTypes + + builtInTypes + = [ ("bool", [], [("True", []), ("False", [])]) ] + + + +--==========================================================-- +--=== 9.2 Representation of type expressions ===-- +--==========================================================-- + +----======================================================-- +--tcArrow :: TExpr -> +-- TExpr -> +-- TExpr +-- +--tcArrow t1 t2 = TArr t1 t2 + + + +--======================================================-- +tcInt :: TExpr + +tcInt = TCons "int" [] + + + +--======================================================-- +tcBool :: TExpr + +tcBool = TCons "bool" [] + + + +--======================================================-- +tcTvars_in :: TExpr -> + [TVName] + +tcTvars_in t = tvars_in' t [] + where + tvars_in' (TVar x) l = x:l + tvars_in' (TCons y ts) l = foldr tvars_in' l ts + tvars_in' (TArr t1 t2) l = tvars_in' t1 (tvars_in' t2 l) + + +--==========================================================-- +--=== 9.41 Substitutions ===-- +--==========================================================-- + +--======================================================-- +tcApply_sub :: Subst -> + TVName -> + TExpr + +tcApply_sub phi tvn + = if TVar tvn == lookUpResult + then TVar tvn + else tcSub_type phi lookUpResult + where + lookUpResult = utLookupDef phi tvn (TVar tvn) + + +--======================================================-- +tcSub_type :: Subst -> + TExpr -> + TExpr + +tcSub_type phi (TVar tvn) = tcApply_sub phi tvn + +tcSub_type phi (TCons tcn ts) = TCons tcn (map (tcSub_type phi) ts) + +tcSub_type phi (TArr t1 t2) = TArr (tcSub_type phi t1) (tcSub_type phi t2) + + +--======================================================-- +tcScomp :: Subst -> + Subst -> + Subst + +tcScomp sub2 sub1 = sub1 ++ sub2 + + + +--======================================================-- +tcId_subst :: Subst + +tcId_subst = [] + + + +--======================================================-- +tcDelta :: TVName -> + TExpr -> + Subst +-- all TVar -> TVar substitutions lead downhill +tcDelta tvn (TVar tvn2) + | tvn == tvn2 = [] + | tvn > tvn2 = [(tvn, TVar tvn2)] + | tvn < tvn2 = [(tvn2, TVar tvn)] + +tcDelta tvn non_var_texpr = [(tvn, non_var_texpr)] + + +--==========================================================-- +--=== 9.42 Unification ===-- +--==========================================================-- + +--======================================================-- +tcExtend :: Subst -> + TVName -> + TExpr -> + Reply Subst Message + +tcExtend phi tvn t + | t == TVar tvn + = Ok phi + | tvn `notElem` (tcTvars_in t) + = Ok ((tcDelta tvn t) `tcScomp` phi) + | otherwise + = fail + ( "Type error in source program:\n\n" ++ + "Circular substitution:\n " ++ + tcShowtExpr (TVar tvn) ++ + "\n going to\n" ++ + " " ++ + tcShowtExpr t ++ + "\n") + + + +--======================================================-- +tcUnify :: Subst -> + (TExpr, TExpr) -> + Reply Subst Message + +tcUnify phi (TVar tvn, t) + = if phitvn == TVar tvn + then tcExtend phi tvn phit + else tcUnify phi (phitvn, phit) + where + phitvn = tcApply_sub phi tvn + phit = tcSub_type phi t + +tcUnify phi (p@(TCons _ _), q@(TVar _)) + = tcUnify phi (q, p) + +tcUnify phi (p@(TArr _ _), q@(TVar _)) + = tcUnify phi (q, p) + +tcUnify phi (TArr t1 t2, TArr t1' t2') + = tcUnifyl phi [(t1, t1'), (t2, t2')] + +tcUnify phi (TCons tcn ts, TCons tcn' ts') + | tcn == tcn' + = tcUnifyl phi (ts `zip` ts') + +tcUnify phi (t1, t2) + = fail + ( "Type error in source program:\n\n" ++ + "Cannot unify\n " ++ + tcShowtExpr t1 ++ + "\n with\n " ++ + tcShowtExpr t2 ++ + "\n" + ) + + + +--======================================================-- +tcUnifyl :: Subst -> + [(TExpr, TExpr)] -> + Reply Subst Message + +tcUnifyl phi eqns + = foldr unify' (Ok phi) eqns + where + unify' eqn (Ok phi) = tcUnify phi eqn + unify' eqn (Fail m) = Fail m + + + +--==========================================================-- +--=== 9.42.2 Merging of substitutions ===-- +--==========================================================-- + +--======================================================-- +tcMergeSubs :: Subst -> + Subst + +tcMergeSubs phi + = if newBinds == [] + then unifiedOlds + else tcMergeSubs (unifiedOlds ++ newBinds) + where + (newBinds, unifiedOlds) = tcMergeSubsMain phi + + + +--======================================================-- +tcMergeSubsMain :: Subst -> + (Subst, Subst) -- pair of new binds, unified olds + +tcMergeSubsMain phi + = (concat newUnifiersChecked, + zip oldVars (tcOldUnified newUnifiersChecked oldGroups)) + where + oldVars = nub (utDomain phi) + oldGroups = map (utLookupAll phi) oldVars + newUnifiers = map (tcUnifySet tcId_subst) oldGroups + newUnifiersChecked = map tcCheckUnifier newUnifiers + + + +--======================================================-- +tcCheckUnifier :: Reply Subst Message -> Subst + +tcCheckUnifier (Ok r) = r +tcCheckUnifier (Fail m) + = panic ("tcCheckUnifier: " ++ m) + + + +--======================================================-- +tcOldUnified :: [Subst] -> [[TExpr]] -> [TExpr] + +tcOldUnified [] [] = [] +tcOldUnified (u:us) (og:ogs) + = (tcSub_type u (head og)): tcOldUnified us ogs + + +--==========================================================-- +--=== 9.5 Keeping track of types ===-- +--==========================================================-- + +--======================================================-- +tcUnknowns_scheme :: TypeScheme -> + [TVName] + +tcUnknowns_scheme (Scheme scvs t) = tcTvars_in t `tcBar` scvs + + + +--======================================================-- +tcBar :: (Eq a) => [a] -> + [a] -> + [a] + +tcBar xs ys = [ x | x <- xs, not (x `elem` ys)] + + + +--======================================================-- +tcSub_scheme :: Subst -> + TypeScheme -> + TypeScheme + +tcSub_scheme phi (Scheme scvs t) + = Scheme scvs (tcSub_type (tcExclude phi scvs) t) + where + tcExclude phi scvs = [(n,e) | (n,e) <- phi, not (n `elem` scvs)] + + + +--==========================================================-- +--=== 9.53 Association lists ===-- +--==========================================================-- + +--======================================================-- +tcCharVal :: AList Naam b -> Naam -> b + +tcCharVal al k + = utLookupDef al k (panic ("tcCharVal: no such variable: " ++ k)) + + +--======================================================-- +tcUnknowns_te :: TcTypeEnv -> + [TVName] + +tcUnknowns_te gamma = concat (map tcUnknowns_scheme (utRange gamma)) + + + +--======================================================-- +tcSub_te :: Subst -> + TcTypeEnv -> + TcTypeEnv + +tcSub_te phi gamma = [(x, tcSub_scheme phi st) | (x, st) <- gamma] + + +--==========================================================-- +--=== 9.6 New variables ===-- +--==========================================================-- + +--======================================================-- +tcNext_name :: TypeNameSupply -> + TVName + +tcNext_name ns@(f, s) = ns + + + +--======================================================-- +tcDeplete :: TypeNameSupply -> + TypeNameSupply + +tcDeplete (f, s) = (f, tcNSSucc s) + + + +--======================================================-- +tcSplit :: TypeNameSupply -> + (TypeNameSupply, TypeNameSupply) + +tcSplit (f, s) = ((f2, [0]), (tcNSSucc f2, [0])) + where f2 = tcNSDouble f + + + +--======================================================-- +tcName_sequence :: TypeNameSupply -> + [TVName] + +tcName_sequence ns = tcNext_name ns: tcName_sequence (tcDeplete ns) + + +--======================================================-- +tcNSSucc :: [Int] -> + [Int] + +tcNSSucc [] = [1] +tcNSSucc (n:ns) | n < tcNSslimit = n+1: ns + | otherwise = 0: tcNSSucc ns + + +--======================================================-- +tcNSDouble :: [Int] -> + [Int] + +tcNSDouble [] = [] +tcNSDouble (n:ns) + = 2*n': ns' + where n' | n > tcNSdlimit = n - tcNSdlimit + | otherwise = n + ns' | n' == n = tcNSDouble ns + | otherwise = tcNSSucc (tcNSDouble ns) + + +tcNSdlimit :: Int +tcNSdlimit = 2^30 + +tcNSslimit :: Int +tcNSslimit = tcNSdlimit + (tcNSdlimit - 1) + + +--==========================================================-- +--=== 9.7 The type-checker ===-- +--==========================================================-- + + +--======================================================-- +tc :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + CExpr -> + Reply TypeInfo Message + +tc tds gamma ns (ENum n) + = Ok (tcId_subst, TCons "int" [], (TCons "int" [], ANum n)) + +tc tds gamma ns (EVar x) + = tcvar tds gamma ns x + +tc tds gamma ns (EConstr c) + = tcvar tds gamma ns c + +tc tds gamma ns (EAp e1 e2) + = tcap tds gamma ns e1 e2 + +tc tds gamma ns (ELam [] e) + = tc tds gamma ns e +tc tds gamma ns (ELam [x] e) + = tclambda tds gamma ns x e +tc tds gamma ns (ELam (x:y:xs) e) + = tclambda tds gamma ns x (ELam (y:xs) e) + +tc tds gamma ns (ELet recursive dl e) + = if not recursive + then tclet tds gamma ns xs es e + else tcletrec tds gamma ns xs es e + where + (xs, es) = unzip2 dl + +tc tds gamma ns (ECase switch alts) + = tccase tds gamma ns switch constructors arglists exprs + where + (constructors, alters) = unzip2 alts + (arglists, exprs) = unzip2 alters + + +--==========================================================-- +--=== 0.00 Type-checking case-expressions ===-- +--==========================================================-- + +tcConstrTypeSchemes :: TypeNameSupply -> + TypeDef -> + (TypeNameSupply, AList Naam TypeScheme) + +tcConstrTypeSchemes ns (tn, stvs, cal) + = (finalNameSupply, map2nd enScheme cAltsCurried) + where + -- associates new type vars with each poly var + -- in the type + newTVs = tcNewTypeVars (tn, stvs, cal) ns + + -- the actual type variables themselves + tVs = map second newTVs + + -- the types of the constructor functions + cAltsCurried = map2nd (foldr TArr tdSignature) cAltsXLated + cAltsXLated = map2nd (map (tcTDefSubst newTVs)) cal + tdSignature = TCons tn (map TVar tVs) + enScheme texp = Scheme ((nub.tcTvars_in) texp) texp + + -- the revised name supply + finalNameSupply = applyNtimes ( length tVs + 2) tcDeplete ns + + -- apply a function n times to an arg + applyNtimes n func arg + | n ==0 = arg + | otherwise = applyNtimes (n-1) func (func arg) + + + +--======================================================-- +-- +tccase :: [TypeDef] -> -- constructor type definitions + TcTypeEnv -> -- current type bindings + TypeNameSupply -> -- name supply + CExpr -> -- switch expression + [Naam] -> -- constructors + [[Naam]] -> -- argument lists + [CExpr] -> -- resulting expressions + Reply TypeInfo Message + + +tccase tds gamma ns sw cs als res +-- get the type definition in use, & an association of +-- variables therein to type vars & pass +-- Also, reorder the argument lists +-- and resulting expressions so as to reflect the +-- sequence of constructors in the definition + = if length tdCNames /= length (nub cs) + then fail + "Error in source program: missing alternatives in CASE" + else tccase1 tds gamma ns1 sw reOals reOres newTVs tdInUse + where + tdInUse = tcGetTypeDef tds cs + newTVs = tcNewTypeVars tdInUse ns2 + (ns1, ns2) = tcSplit ns + merge = zip cs (zip als res) + tdCNames = map first (tcK33 tdInUse) + (reOals, reOres) = unzip2 (tcReorder tdCNames merge) + + + +--======================================================-- +-- +tcReorder :: [Naam] -> [(Naam,b)] -> [b] + +tcReorder [] uol = [] +tcReorder (k:ks) uol + = (utLookupDef uol k + (fail + ("Error in source program: undeclared constructor '" ++ k ++ + "' in CASE") ) ) + : tcReorder ks uol + + +--======================================================-- +-- Projection functions and similar rubbish. +tcDeOksel (Ok x) = x +tcDeOksel (Fail m) = panic ("tcDeOkSel: " ++ m) +tcOk13sel (Ok (a, b, c)) = a +tcOk13sel (Fail m) = panic ("tcOk13sel: " ++ m) +tcOk23sel (Ok (a, b, c)) = b +tcOk23sel (Fail m) = panic ("tcOk23sel: " ++ m) +tcOk33sel (Ok (a, b, c)) = c +tcOk33sel (Fail m) = panic ("tcOk33sel: " ++ m) +tcK31sel (a, b, c) = a +tcK33 (a,b,c) = c + + + +--======================================================-- +-- +tccase1 :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + CExpr -> + [[Naam]] -> + [CExpr] -> + AList Naam TVName -> + TypeDef -> + Reply TypeInfo Message + +tccase1 tds gamma ns sw reOals reOres newTVs tdInUse +-- calculate all the gammas for the RHS's +-- call tc for each RHS, so as to gather all the +-- sigmas and types for each RHS, then pass on + = tccase2 tds gamma ns2 sw reOals newTVs tdInUse rhsTcs + where + rhsGammas = tcGetAllGammas newTVs (tcK33 tdInUse) reOals + rhsTcs = rhsTc1 ns1 rhsGammas reOres + rhsTc1 nsl [] [] = [] + rhsTc1 nsl (g:gs) (r:rs) + = tc tds (g++gamma) nsl1 r : rhsTc1 nsl2 gs rs + where (nsl1, nsl2) = tcSplit nsl + (ns1, ns2) = tcSplit ns + + +--======================================================-- +-- +tccase2 :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + CExpr -> + [[Naam]] -> + AList Naam TVName -> + TypeDef -> + [Reply TypeInfo Message] -> + Reply TypeInfo Message + +tccase2 tds gamma ns sw reOals newTVs tdInUse rhsTcs +-- get the unifiers for T1 to Tk and hence the unifier for all +-- type variables in the type definition. Also compute the +-- unifier of the result types. + = tccase3 tds gamma ns sw reOals newTVs tdInUse rhsTcs + phi_1_to_n tau_1_to_n phi_rhs + where + phi_1_to_n = map tcOk13sel rhsTcs + tau_1_to_n = map tcOk23sel rhsTcs + phi_rhs = tcDeOksel (tcUnifySet tcId_subst tau_1_to_n) + + + +--======================================================-- +-- +tccase3 :: [TypeDef] -> -- tds + TcTypeEnv -> -- gamma + TypeNameSupply -> -- ns + CExpr -> -- sw + [[Naam]] -> -- reOals + AList Naam TVName -> -- newTVs + TypeDef -> -- tdInUse + [Reply TypeInfo Message] -> -- rhsTcs + [Subst] -> -- phi_1_to_n + [TExpr] -> -- tau_1_to_n + Subst -> -- phi_rhs + Reply TypeInfo Message + +tccase3 tds gamma ns sw reOals newTVs tdInUse rhsTcs + phi_1_to_n tau_1_to_n phi_rhs +-- make up substitutions for each of the unknown tvars +-- merge the substitutions into one +-- apply the substitution to the typedef's signature to get the +-- most general allowable input type +-- call tc to get the type of the switch expression +-- check that this is an instance of the deduced input type +-- gather the new bindings from the RHSs and switch expression +-- return Ok (the big substitution, the result type, gathered bindings) + = Ok (phi_Big, tau_final, + (tau_final, ACase tree_s + (zip tdCNames (zip reOals annotatedRHSs)))) + where + phi_sTau_sTree_s = tc tds gamma ns sw + phi_s = tcOk13sel phi_sTau_sTree_s + tau_s = tcOk23sel phi_sTau_sTree_s + tree_s = tcOk33sel phi_sTau_sTree_s + + phi = tcMergeSubs (concat phi_1_to_n ++ phi_rhs ++ phi_s) + + tau_lhs = tcSub_type phi tdSignature + + phi_lhs = tcUnify tcId_subst (tau_lhs, tau_s) -- reverse these? + + phi_Big = tcMergeSubs (tcDeOksel phi_lhs ++ phi) + + tau_final = tcSub_type phi_Big (head (map tcOk23sel rhsTcs)) + + annotatedRHSs = map tcOk33sel rhsTcs + tVs = map second newTVs + tdSignature = TCons (tcK31sel tdInUse) (map TVar tVs) + tdCNames = map first (tcK33 tdInUse) + + +--======================================================-- +-- +tcUnifySet :: Subst -> + [TExpr] -> + Reply Subst Message + +tcUnifySet sub (e1:[]) = Ok sub +tcUnifySet sub (e1:e2:[]) + = tcUnify sub (e1, e2) +tcUnifySet sub (e1:e2:e3:es) + = tcUnifySet newSub (e2:e3:es) + where + newSub = tcDeOksel (tcUnify sub (e1, e2)) + + +--======================================================-- +-- +tcNewTypeVars :: TypeDef -> + TypeNameSupply -> + AList Naam TVName + +tcNewTypeVars (t, vl, c) ns = zip vl (tcName_sequence ns) + + + +--======================================================-- +-- +tcGetGammaN :: AList Naam TVName -> + ConstrAlt -> + [Naam] -> + AList Naam TypeScheme + +tcGetGammaN tvl (cname, cal) cparams + = zip cparams (map (Scheme [] . tcTDefSubst tvl) cal) + + + +--======================================================-- +-- +tcTDefSubst :: AList Naam TVName -> + TDefExpr -> + TExpr + +tcTDefSubst nameMap (TDefVar n) + = f result + where + f (Just tvn) = TVar tvn + f Nothing = TCons n [] + result = utLookup nameMap n + +tcTDefSubst nameMap (TDefCons c al) + = TCons c (map (tcTDefSubst nameMap) al) + + +--======================================================-- +-- +tcGetAllGammas :: AList Naam TVName -> + [ConstrAlt] -> + [[Naam]] -> + [AList Naam TypeScheme] + +tcGetAllGammas tvl [] [] = [] +-- note param lists cparamss must be ordered in +-- accordance with calts +tcGetAllGammas tvl (calt:calts) (cparams:cparamss) = + tcGetGammaN tvl calt cparams : + tcGetAllGammas tvl calts cparamss + + +--======================================================-- +-- +tcGetTypeDef :: [TypeDef] -> -- type definitions + [Naam] -> -- list of constructors used here + TypeDef + +tcGetTypeDef tds cs + = if length tdefset == 0 + then fail "Undeclared constructors in use" + else if length tdefset > 1 + then fail "CASE expression contains mixed constructors" + else head tdefset + where + tdefset = nub + [ (tname, ftvs, cl) | + (tname, ftvs, cl) <- tds, + usedc <- cs, + usedc `elem` (map first cl) ] + + +--==========================================================-- +--=== 9.71 Type-checking lists of expressions ===-- +--==========================================================-- + +--======================================================-- +-- +tcl :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + [CExpr] -> + Reply (Subst, [TExpr], [AnnExpr Naam TExpr]) Message + +tcl tds gamma ns [] + = Ok (tcId_subst, [], []) +tcl tds gamma ns (e:es) + = tcl1 tds gamma ns0 es (tc tds gamma ns1 e) + where + (ns0, ns1) = tcSplit ns + + +--======================================================-- +-- +tcl1 tds gamma ns es (Fail m) = Fail m +tcl1 tds gamma ns es (Ok (phi, t, annotatedE)) + = tcl2 phi t (tcl tds (tcSub_te phi gamma) ns es) annotatedE + + +--======================================================-- +-- +tcl2 phi t (Fail m) annotatedE = Fail m +tcl2 phi t (Ok (psi, ts, annotatedEs)) annotatedE + = Ok (psi `tcScomp` phi, (tcSub_type psi t):ts, + annotatedE:annotatedEs) + + +--==========================================================-- +--=== 9.72 Type-checking variables ===-- +--==========================================================-- + +--======================================================-- +-- +tcvar :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + Naam -> + Reply TypeInfo Message + +tcvar tds gamma ns x = Ok (tcId_subst, finalType, (finalType, AVar x)) + where + scheme = tcCharVal gamma x + finalType = tcNewinstance ns scheme + + +--======================================================-- +-- +tcNewinstance :: TypeNameSupply -> + TypeScheme -> + TExpr + +tcNewinstance ns (Scheme scvs t) = tcSub_type phi t + where + al = scvs `zip` (tcName_sequence ns) + phi = tcAl_to_subst al + + +--======================================================-- +-- +tcAl_to_subst :: AList TVName TVName -> + Subst + +tcAl_to_subst al = map2nd TVar al + + +--==========================================================-- +--=== 9.73 Type-checking applications ===-- +--==========================================================-- + +--======================================================-- +-- +tcap :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + CExpr -> + CExpr -> + Reply TypeInfo Message + +tcap tds gamma ns e1 e2 = tcap1 tvn (tcl tds gamma ns' [e1, e2]) + where + tvn = tcNext_name ns + ns' = tcDeplete ns + + +--======================================================-- +-- +tcap1 tvn (Fail m) + = Fail m +tcap1 tvn (Ok (phi, [t1, t2], [ae1, ae2])) + = tcap2 tvn (tcUnify phi (t1, t2 `TArr` (TVar tvn))) [ae1, ae2] + + +--======================================================-- +-- +tcap2 tvn (Fail m) [ae1, ae2] + = Fail m +tcap2 tvn (Ok phi) [ae1, ae2] + = Ok (phi, finalType, (finalType, AAp ae1 ae2)) + where + finalType = tcApply_sub phi tvn + + +--==========================================================-- +--=== 9.74 Type-checking lambda abstractions ===-- +--==========================================================-- + +--======================================================-- +-- +tclambda :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + Naam -> + CExpr -> + Reply TypeInfo Message + +tclambda tds gamma ns x e = tclambda1 tvn x (tc tds gamma' ns' e) + where + ns' = tcDeplete ns + gamma' = tcNew_bvar (x, tvn): gamma + tvn = tcNext_name ns + + +--======================================================-- +-- +tclambda1 tvn x (Fail m) = Fail m + +tclambda1 tvn x (Ok (phi, t, annotatedE)) = + Ok (phi, finalType, (finalType, ALam [x] annotatedE)) + where + finalType = (tcApply_sub phi tvn) `TArr` t + + +--======================================================-- +-- +tcNew_bvar (x, tvn) = (x, Scheme [] (TVar tvn)) + + +--==========================================================-- +--=== 9.75 Type-checking let-expressions ===-- +--==========================================================-- + +--======================================================-- +-- +tclet :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + [Naam] -> + [CExpr] -> + CExpr -> + Reply TypeInfo Message + +tclet tds gamma ns xs es e + = tclet1 tds gamma ns0 xs e rhsTypes + where + (ns0, ns1) = tcSplit ns + rhsTypes = tcl tds gamma ns1 es + + +--======================================================-- +-- +tclet1 tds gamma ns xs e (Fail m) = Fail m + +tclet1 tds gamma ns xs e (Ok (phi, ts, rhsAnnExprs)) + = tclet2 phi xs False (tc tds gamma'' ns1 e) rhsAnnExprs + where + gamma'' = tcAdd_decls gamma' ns0 xs ts + gamma' = tcSub_te phi gamma + (ns0, ns1) = tcSplit ns + + +--======================================================-- +-- +tclet2 phi xs recFlag (Fail m) rhsAnnExprs = Fail m + +tclet2 phi xs recFlag (Ok (phi', t, annotatedE)) rhsAnnExprs + = Ok (phi' `tcScomp` phi, t, (t, ALet recFlag (zip xs rhsAnnExprs) annotatedE)) + + +--======================================================-- +-- +tcAdd_decls :: TcTypeEnv -> + TypeNameSupply -> + [Naam] -> + [TExpr] -> + TcTypeEnv + +tcAdd_decls gamma ns xs ts = (xs `zip` schemes) ++ gamma + where + schemes = map (tcGenbar unknowns ns) ts + unknowns = tcUnknowns_te gamma + + +--======================================================-- +-- +tcGenbar unknowns ns t = Scheme (map second al) t' + where + al = scvs `zip` (tcName_sequence ns) + scvs = (nub (tcTvars_in t)) `tcBar` unknowns + t' = tcSub_type (tcAl_to_subst al) t + + + +--==========================================================-- +--=== 9.76 Type-checking letrec-expressions ===-- +--==========================================================-- + +--======================================================-- +-- +tcletrec :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + [Naam] -> + [CExpr] -> + CExpr -> + Reply TypeInfo Message + +tcletrec tds gamma ns xs es e + = tcletrec1 tds gamma ns0 xs nbvs e + (tcl tds (nbvs ++ gamma) ns1 es) + where + (ns0, ns') = tcSplit ns + (ns1, ns2) = tcSplit ns' + nbvs = tcNew_bvars xs ns2 + + +--======================================================-- +-- +tcNew_bvars xs ns = map tcNew_bvar (xs `zip` (tcName_sequence ns)) + + + +--======================================================-- +-- +tcletrec1 tds gamma ns xs nbvs e (Fail m) = (Fail m) + +tcletrec1 tds gamma ns xs nbvs e (Ok (phi, ts, rhsAnnExprs)) + = tcletrec2 tds gamma' ns xs nbvs' e (tcUnifyl phi (ts `zip` ts')) rhsAnnExprs + where + ts' = map tcOld_bvar nbvs' + nbvs' = tcSub_te phi nbvs + gamma' = tcSub_te phi gamma + + +--======================================================-- +-- +tcOld_bvar (x, Scheme [] t) = t + + +--======================================================-- +-- +tcletrec2 tds gamma ns xs nbvs e (Fail m) rhsAnnExprs = (Fail m) + +tcletrec2 tds gamma ns xs nbvs e (Ok phi) rhsAnnExprs + = tclet2 phi xs True (tc tds gamma'' ns1 e) rhsAnnExprs + where + ts = map tcOld_bvar nbvs' + nbvs' = tcSub_te phi nbvs + gamma' = tcSub_te phi gamma + gamma'' = tcAdd_decls gamma' ns0 (map first nbvs) ts + (ns0, ns1) = tcSplit ns + subnames = map first nbvs + + +--==========================================================-- +--=== End TypeCheck5.m (1) ===-- +--==========================================================-- diff --git a/testsuite/tests/programs/jules_xref/jules_xref.stdout b/testsuite/tests/programs/jules_xref/jules_xref.stdout new file mode 100644 index 0000000000..8a8af9e4c6 --- /dev/null +++ b/testsuite/tests/programs/jules_xref/jules_xref.stdout @@ -0,0 +1,500 @@ +("A",[3]) +("AAp",[26,27,63,937]) +("ACase",[30,31,67,719]) +("AConstr",[25,25,62]) +("ALam",[32,32,64,967]) +("ALet",[28,29,65,1015]) +("AList",[415,553,649,675,700,762,770,773,782,799,802,899]) +("ANum",[24,24,61,515]) +("AVar",[23,23,60,879]) +("Also",[596,682]) +("AnnExpr",[17,18,44,45,52,120,842]) +("Association",[411]) +("AtomicProgram",[119]) +("BaseDefs",[8]) +("Big",[718,733,735]) +("CASE",[601,622,822]) +("CExpr",[511,586,589,646,648,673,698,841,914,915,952,987,988,1052,1053]) +("Cannot",[306]) +("Char",[78,109,120]) +("Circular",[268]) +("ConstrAlt",[771,800]) +("Corrected",[4]) +("EAp",[523]) +("ECase",[540]) +("EConstr",[520]) +("ELam",[526,528,530,531]) +("ELet",[533]) +("ENum",[514]) +("EVar",[517]) +("End",[1104]) +("Eq",[390]) +("Error",[601,621]) +("Fail",[125,131,324,324,364,629,631,633,635,854,854,861,861,926,927,934,935,964,964,1000,1000,1012,1012,1073,1073,1090,1090]) +("False",[81,89,90,92,131,150,1003]) +("File",[3]) +("Formatting",[13]) +("Int",[474,475,483,484,495,498]) +("Just",[789]) +("Keeping",[378]) +("Merging",[329]) +("Message",[120,258,280,318,361,512,590,651,677,678,702,706,747,842,877,916,953,989,1054]) +("MyUtils",[10]) +("Naam",[44,45,52,108,120,415,415,553,587,588,615,615,647,649,674,675,699,700,762,770,772,773,782,799,801,802,815,842,876,951,986,1022,1051]) +("New",[438]) +("No",[125]) +("Nothing",[790]) +("Ok",[124,130,133,262,264,321,323,363,515,628,630,632,634,717,718,749,845,855,862,863,879,928,936,937,966,967,1002,1014,1015,1075,1092]) +("Projection",[627]) +("RHS",[654,655,656]) +("RHSs",[716]) +("Reply",[120,258,280,318,361,512,590,651,677,678,702,706,747,842,877,916,953,989,1054]) +("Representation",[155]) +("Scheme",[141,385,403,404,569,776,891,974,1034,1085]) +("Subst",[43,197,210,222,223,224,231,240,255,258,278,280,316,318,333,334,346,347,347,361,361,370,399,430,703,705,745,747,842,900]) +("Substitutions",[193]) +("T1",[681]) +("TArr",[87,90,103,163,189,218,218,293,296,296,566,929,969]) +("TCons",[84,85,86,93,102,170,177,188,216,216,290,299,299,515,515,568,739,790,794]) +("TDefCons",[793]) +("TDefExpr",[783]) +("TDefVar",[786]) +("TExpr",[44,45,52,77,108,120,159,160,161,168,175,182,199,211,212,239,257,279,279,317,317,370,370,704,746,784,842,842,889,1023]) +("TVName",[183,198,238,256,383,423,443,468,649,675,700,762,770,782,799,899,899]) +("TVar",[83,101,187,202,203,206,214,241,241,242,244,245,261,269,282,283,290,293,568,739,789,902,929,974]) +("TcTypeEnv",[117,422,431,432,509,584,644,671,696,839,874,912,949,984,1020,1024,1049]) +("The",[503]) +("Tk",[681]) +("True",[87,88,91,95,130,150,1093]) +("Type",[97,267,305,548,833,868,906,943,978,1043]) +("TypeCheck5",[3,7,1104]) +("TypeDef",[508,552,583,643,650,670,676,695,701,760,814,816,838,873,911,948,983,1048]) +("TypeEnv",[53,120]) +("TypeInfo",[512,590,651,677,678,702,706,877,916,953,989,1054]) +("TypeNameSupply",[118,442,450,451,458,459,459,467,510,551,553,585,645,672,697,761,840,875,887,913,950,985,1021,1050]) +("TypeScheme",[382,400,401,553,773,802,888]) +("Undeclared",[820]) +("Unification",[251]) +("Utils",[9]) +("a",[4,16,17,390,390,391,392,574,630,630,632,634,636,636,637]) +("aFN",[66,70]) +("abstractions",[943]) +("accordance",[806]) +("actual",[562]) +("ae1",[26,27,63,63,928,929,934,936,937]) +("ae2",[26,27,63,63,928,929,934,936,937]) +("al",[417,418,793,794,893,894,902,902,1034,1036,1038]) +("all",[241,654,655,681]) +("allowable",[713]) +("als",[593,607]) +("alternatives",[601]) +("alters",[543,544]) +("alts",[67,68,540,543]) +("an",[574,594,715]) +("and",[597,627,656,681,716]) +("ann",[20,21]) +("annAlts",[30,31]) +("annDefs",[28,29]) +("annoTree",[133,135]) +("annotatedE",[855,856,861,862,864,966,967,1014,1015]) +("annotatedEs",[862,864]) +("annotatedRHSs",[720,737]) +("applications",[906]) +("apply",[574,712]) +("applyNtimes",[572,575,577]) +("arg",[574,575,576,577]) +("arglists",[541,544]) +("argument",[588,596]) +("as",[597,655]) +("associates",[558]) +("association",[594]) +("b",[16,18,83,84,85,86,93,415,415,615,615,630,632,632,634,636,637]) +("baseTypes",[122,128]) +("be",[805]) +("big",[717]) +("bindings",[584,716,717]) +("binds",[347]) +("body",[70,71]) +("bool",[85,85,150,177]) +("builtInTypes",[127,146,149]) +("bvar",[958,974,1067,1078,1085,1095]) +("bvars",[1062,1067]) +("c",[17,18,25,25,62,102,520,521,630,632,634,634,636,637,637,764,793,794]) +("cAltsCurried",[556,566]) +("cAltsXLated",[566,567]) +("cal",[555,560,567,775,776]) +("calculate",[654]) +("call",[655,714]) +("calt",[807,808]) +("calts",[806,807,809]) +("case",[548]) +("char",[86,86]) +("check",[715]) +("checker",[3,503]) +("checking",[548,833,868,906,943,978,1043]) +("chr",[83]) +("cl",[93,95,826,827,829]) +("cname",[775]) +("compute",[682]) +("concat",[66,68,95,102,143,147,350,425,727]) +("constrTypes",[145,147]) +("constructor",[565,583,621]) +("constructors",[541,543,587,598,815,820,822]) +("contains",[822]) +("cparams",[775,776,807,808]) +("cparamss",[805,807,809]) +("cs",[64,593,599,604,607,818,828]) +("current",[584]) +("decls",[1005,1020,1026,1098]) +("deduced",[715]) +("definition",[594,598,682]) +("definitions",[583,814]) +("dl",[65,66,533,538]) +("downhill",[241]) +("e",[32,32,64,64,406,406,526,527,528,529,530,531,533,535,536,846,847,955,955,991,992,1000,1002,1003,1056,1057,1073,1075,1076,1090,1092,1093]) +("e1",[523,524,749,750,751,752,755,918,918]) +("e2",[523,524,750,751,752,753,755,918,918]) +("e3",[752,753]) +("each",[558,655,656,710]) +("elem",[394,406,829]) +("else",[125,204,285,339,536,602,821,823]) +("enScheme",[556,569]) +("eqn",[323,323,324]) +("eqns",[320,321]) +("error",[267,305]) +("es",[535,536,538,752,753,846,847,854,855,856,991,995,1056,1058]) +("expr",[34,35,122,128]) +("expression",[586,714,716,822]) +("expressions",[155,548,589,597,833,978,1043]) +("exprs",[541,544]) +("f",[20,21,27,27,29,31,32,35,38,133,133,139,141,445,453,453,461,462,787,789,790]) +("f2",[461,461,462]) +("fail",[266,304,600,620,820,822]) +("failed",[97]) +("final",[718,719,735]) +("finalConstrTypes",[128,139,147]) +("finalNameSupply",[556,572]) +("finalNs",[128,145]) +("finalType",[879,879,882,937,937,939,967,967,969]) +("first",[608,740,829,1098,1100]) +("foldr",[188,321,566]) +("for",[4,654,655,656,681,681,710]) +("from",[716]) +("ftvs",[826,827]) +("fullEnv",[124,139,143]) +("fullEnvWords",[124,143]) +("func",[575,577,577]) +("function",[574]) +("functions",[565,627]) +("g",[662,663]) +("gamma",[425,425,434,434,514,517,518,520,521,523,524,526,527,528,529,530,531,533,535,536,540,541,593,602,653,657,663,680,684,696,708,722,844,846,847,847,854,855,856,879,881,918,918,955,955,958,958,991,992,995,1000,1002,1003,1005,1005,1006,1006,1026,1026,1029,1056,1057,1058,1073,1075,1076,1080,1080,1090,1092,1093,1097,1097,1098,1098]) +("gammas",[654]) +("gather",[655,716]) +("gathered",[717]) +("general",[713]) +("get",[594,681,712,714]) +("going",[270]) +("good",[123,130,131]) +("gs",[662,663]) +("head",[374,735,823]) +("hence",[681]) +("here",[815]) +("if",[123,202,283,337,534,599,819,821]) +("import",[8,9,10]) +("in",[182,185,185,187,188,188,189,189,189,263,267,305,385,559,569,594,598,601,601,621,622,682,805,820,1037]) +("input",[713,715]) +("instance",[715]) +("int",[84,84,170,515,515]) +("into",[711]) +("is",[715]) +("k",[417,418,418,618,619,621]) +("ks",[618,623]) +("l",[187,187,188,188,189,189]) +("lambda",[943]) +("lead",[241]) +("length",[572,599,599,819,821]) +("let",[978]) +("letrec",[1043]) +("lhs",[729,731,731,733]) +("list",[815]) +("lists",[411,588,596,805,833]) +("ljustify",[112]) +("lookUpResult",[202,204,206]) +("lookup",[83,96,97,98,99]) +("m",[3,324,324,364,365,629,629,631,631,633,633,635,635,854,854,861,861,926,927,934,935,964,964,1000,1000,1012,1012,1073,1073,1090,1090,1104]) +("mainExpr",[28,29]) +("make",[710]) +("map",[29,31,66,68,95,102,139,143,216,354,355,356,425,563,567,568,608,687,688,735,737,738,739,740,776,794,829,1028,1034,1067,1078,1095,1098,1100]) +("map2nd",[556,566,567,902]) +("mapAccuml",[146]) +("mapAnnAlt",[31,37]) +("mapAnnDefn",[29,34]) +("mapAnnExpr",[21,23,24,25,26,28,30,32]) +("me",[65,66]) +("merge",[607,609,711]) +("missing",[601]) +("mixed",[822]) +("module",[7]) +("most",[713]) +("must",[805]) +("n",[24,24,61,112,267,267,268,270,270,273,305,305,306,308,308,310,406,406,406,478,478,478,487,488,489,489,489,490,491,491,514,515,574,575,576,577,685,685,687,688,689,703,704,709,709,727,786,790,791]) +("naam",[34,35,37,38,70,71,111,112,141,141]) +("name",[97,442,445,470,571,585,920,959]) +("nameMap",[786,791,793,794]) +("nbvs",[1057,1058,1062,1073,1075,1076,1078,1079,1079,1090,1092,1095,1096,1096,1098,1100]) +("new",[347,558,716]) +("newBinds",[337,339,341]) +("newSub",[753,755]) +("newTVs",[560,563,567,602,605,653,657,659,680,684,700,708,738]) +("newUnifiers",[355,356]) +("newUnifiersChecked",[350,351,356]) +("no",[418]) +("node",[20,21,58,58]) +("nodeType",[58]) +("non",[247,247]) +("not",[394,406,534]) +("notArrow",[93,94]) +("notElem",[263]) +("note",[805]) +("ns",[122,146,445,445,470,470,470,478,478,479,487,488,491,491,492,514,517,518,520,521,523,524,526,527,528,529,530,531,533,535,536,540,541,555,560,572,593,606,653,665,680,684,697,708,722,764,764,844,846,849,854,855,856,879,882,891,893,918,918,920,921,921,955,955,957,957,959,991,994,1000,1002,1007,1026,1028,1034,1036,1056,1060,1060,1061,1067,1067,1073,1075,1076,1090,1092,1099]) +("ns0",[847,849,992,994,1005,1007,1057,1060,1098,1099]) +("ns1",[602,606,660,665,847,849,994,995,1003,1007,1058,1061,1093,1099]) +("ns2",[605,606,657,665,1061,1062]) +("nsl",[661,662,664]) +("nsl1",[663,664]) +("nsl2",[663,664]) +("nub",[100,353,569,599,825,1037]) +("of",[13,155,329,347,378,565,594,598,683,710,714,715,815,833]) +("og",[373,374]) +("ogs",[373,374]) +("oldGroups",[351,354,355]) +("oldVars",[351,353,354]) +("olds",[347]) +("on",[656]) +("one",[711]) +("ordered",[805]) +("otherwise",[99,265,479,490,492,577]) +("p",[290,291,293,294]) +("pair",[347]) +("panic",[97,365,418,629,631,633,635]) +("param",[805]) +("pars",[37,38]) +("pass",[595,656]) +("phi",[47,47,201,204,206,214,214,216,216,218,218,218,260,262,264,282,284,285,287,288,290,291,293,294,296,297,299,301,303,320,321,323,323,336,341,349,353,354,403,404,406,406,434,434,685,685,687,689,703,705,709,709,718,722,723,723,724,725,727,727,727,727,729,731,733,733,733,735,855,856,856,861,862,863,891,894,928,929,936,937,939,966,967,969,1002,1003,1006,1012,1014,1014,1015,1015,1075,1076,1079,1080,1092,1093,1096,1097]) +("phit",[284,285,288]) +("phitvn",[283,285,287]) +("poly",[558]) +("pretty",[81,83,84,85,86,87,88,89,90,91,92,93,95]) +("program",[267,305,601,621]) +("psi",[862,863,863]) +("q",[290,291,293,294]) +("r",[363,363,662,663]) +("reOals",[602,609,653,657,659,680,684,699,708,720]) +("reOres",[602,609,653,660]) +("recFlag",[28,29,1012,1014,1015]) +("recursive",[533,534]) +("reflect",[597]) +("reorder",[596]) +("res",[593,607]) +("resExpr",[37,38]) +("result",[683,717,787,791]) +("resulting",[589,597]) +("results",[13]) +("return",[717]) +("reverse",[731]) +("revised",[571]) +("rf",[65]) +("rhs",[685,689,705,709,727]) +("rhsAnnExprs",[1002,1003,1012,1014,1015,1075,1076,1090,1092,1093]) +("rhsGammas",[659,660]) +("rhsTc1",[660,661,662,663]) +("rhsTcs",[657,660,680,684,687,688,702,708,735,737]) +("rhsTypes",[992,995]) +("rootEnv",[137,139]) +("rootSubst",[133,135]) +("rootTree",[124,135,137]) +("rootType",[133]) +("rs",[662,663]) +("rubbish",[627]) +("s",[445,453,453,461,654,712,719,722,723,723,724,724,725,725,727,731]) +("sTau",[722,723,724,725]) +("sTree",[722,723,724,725]) +("scheme",[382,385,399,403,425,434,881,882]) +("schemes",[1026,1028]) +("scvs",[385,385,403,404,404,406,406,891,893,1036,1037]) +("second",[68,68,563,738,1034]) +("sequence",[467,470,470,598,764,893,1036,1067]) +("sigmas",[656]) +("signature",[712]) +("similar",[627]) +("so",[597,655]) +("source",[267,305,601,621]) +("st",[434,434]) +("stvs",[555,560]) +("sub",[197,201,214,287,749,749,750,751,752,755,939,969]) +("sub1",[226,226]) +("sub2",[226,226]) +("subnames",[1100]) +("subst",[231,233,355,515,689,731,845,879,894,899,902,1038]) +("substitution",[268,712,717]) +("substitutions",[241,329,710,711]) +("such",[418]) +("supply",[571,585]) +("sw",[67,68,593,602,653,657,680,684,698,708,722]) +("switch",[540,541,586,714,716]) +("switchExpr",[30,31]) +("t",[80,81,98,98,100,101,101,141,141,185,185,260,261,263,264,272,282,288,385,385,403,404,764,855,856,861,862,863,891,891,966,969,1014,1015,1015,1034,1034,1037,1038,1038,1085,1085]) +("t1",[87,88,90,91,103,103,163,163,189,189,218,218,296,296,297,297,303,307,928,929]) +("t2",[87,89,90,92,103,103,163,163,189,189,218,218,296,296,297,297,303,309,928,929]) +("t2e",[56,58,58,60,61,62,63,63,63,64,64,65,66,67,68,68,71]) +("tVs",[563,568,572,738,739]) +("tau",[685,688,689,704,709,718,719,724,729,731,731,735]) +("tc",[127,508,514,517,520,523,526,527,528,530,533,540,655,663,714,722,847,955,1003,1093]) +("tcAdd",[1005,1020,1026,1098]) +("tcAl",[894,899,902,1038]) +("tcApply",[197,201,214,287,939,969]) +("tcArrow",[159,163]) +("tcBar",[385,390,394,1037]) +("tcBool",[175,177]) +("tcCharVal",[415,417,418,881]) +("tcCheck",[117,122]) +("tcCheckUnifier",[356,361,363,364,365]) +("tcConstrTypeSchemes",[146,551,555]) +("tcDeOkSel",[629]) +("tcDeOksel",[628,629,689,733,755]) +("tcDelta",[238,242,247,264]) +("tcDeplete",[450,453,470,572,921,957]) +("tcExclude",[404,406]) +("tcExtend",[255,260,284]) +("tcGenbar",[1028,1034]) +("tcGetAllGammas",[659,799,804,807,809]) +("tcGetGammaN",[770,775,808]) +("tcGetTypeDef",[604,814,818]) +("tcId",[231,233,355,515,689,731,845,879]) +("tcInt",[168,170]) +("tcK31sel",[636,739]) +("tcK33",[608,637,659,740]) +("tcMapAnnExpr",[16,20,27,27,29,31,32,35,38,47]) +("tcMergeSubs",[333,336,339,727,733]) +("tcMergeSubsMain",[341,346,349]) +("tcNSDouble",[462,483,486,487,491,492]) +("tcNSSucc",[453,461,474,477,478,479,492]) +("tcNSdlimit",[489,489,495,496,499,499]) +("tcNSslimit",[478,498,499]) +("tcName",[467,470,470,764,893,1036,1067]) +("tcNew",[958,974,1062,1067,1067]) +("tcNewTypeVars",[560,605,760,764]) +("tcNewinstance",[882,887,891]) +("tcNext",[442,445,470,920,959]) +("tcOk13sel",[630,631,631,687,723]) +("tcOk23sel",[632,633,633,688,724,735]) +("tcOk33sel",[634,635,635,725,737]) +("tcOld",[1078,1085,1095]) +("tcOldUnified",[351,370,372,373,374]) +("tcPretty",[108,111,143]) +("tcReorder",[609,615,617,618,623]) +("tcResult",[123,127,133]) +("tcScomp",[222,226,264,863,1015]) +("tcShowtExpr",[77,80,97,113,269,272,307,309]) +("tcSplit",[458,461,606,664,665,849,994,1007,1060,1061,1099]) +("tcSub",[47,204,210,214,216,216,218,218,218,288,374,399,403,404,430,434,434,729,735,856,863,891,1006,1038,1079,1080,1096,1097]) +("tcSubstAnnTree",[43,47,135]) +("tcTDefSubst",[567,776,782,786,793,794]) +("tcTreeToEnv",[52,55,137]) +("tcTvars",[182,185,263,385,569,1037]) +("tcUnify",[278,282,285,290,291,293,294,296,299,303,323,731,751,755,929]) +("tcUnifySet",[355,689,745,749,750,752,753]) +("tcUnifyl",[297,301,316,320,1076]) +("tcUnknowns",[382,385,422,425,425,1029]) +("tcap",[524,911,918]) +("tcap1",[918,926,928]) +("tcap2",[929,934,936]) +("tccase",[541,583,593]) +("tccase1",[602,643,653]) +("tccase2",[657,670,680]) +("tccase3",[684,695,708]) +("tcl",[838,844,846,856,918,995,1058]) +("tcl1",[847,854,855]) +("tcl2",[856,861,862]) +("tclambda",[529,531,948,955]) +("tclambda1",[955,964,966]) +("tclet",[535,983,991]) +("tclet1",[992,1000,1002]) +("tclet2",[1003,1012,1014,1093]) +("tcletrec",[536,1048,1056]) +("tcletrec1",[1057,1073,1075]) +("tcletrec2",[1076,1090,1092]) +("tcn",[216,216,299,299,300,300]) +("tcvar",[518,521,873,879]) +("tdCNames",[599,608,609,720,740]) +("tdInUse",[602,604,605,608,653,657,659,680,684,701,708,739,740]) +("tdSignature",[566,568,729,739]) +("tdefs",[122,127,146]) +("tdefset",[819,821,823,825]) +("tds",[514,517,518,520,521,523,524,526,527,528,529,530,531,533,535,536,540,541,593,602,604,653,657,663,680,684,695,708,722,818,827,844,846,847,847,854,855,856,879,918,918,955,955,991,992,995,1000,1002,1003,1056,1057,1058,1073,1075,1076,1090,1092,1093]) +("te",[422,425,430,434,856,1006,1029,1079,1080,1096,1097]) +("texp",[569,569,569]) +("texpr",[247,247]) +("that",[715]) +("the",[559,562,565,565,571,594,596,597,598,654,654,655,681,681,682,682,683,710,711,712,712,712,714,714,715,716,716,717,717]) +("themselves",[562]) +("then",[124,203,284,338,535,600,656,820,822]) +("therein",[595]) +("these",[731]) +("this",[715]) +("tijp",[70,71]) +("times",[574]) +("tipe",[111,113]) +("tn",[555,560,568]) +("tname",[826,827]) +("to",[270,574,595,597,655,681,685,685,687,688,689,703,704,709,709,712,712,714,727,894,899,902,1038]) +("track",[378]) +("tree",[47,47,55,56,719,725]) +("ts",[98,99,102,102,188,188,216,216,299,299,301,301,862,863,1002,1005,1026,1028,1075,1076,1076,1078,1095,1098]) +("tvars",[185,187,188,188,189,189,189,710]) +("tvdict",[83,100,100,101,102,102,103,103,103]) +("tvl",[775,776,804,807,808,809]) +("tvn",[201,202,203,206,206,214,214,242,243,244,244,245,245,247,247,260,261,263,264,269,282,283,284,287,789,789,918,920,926,928,929,929,934,936,939,955,958,959,964,966,969,974,974]) +("tvn2",[242,243,244,244,245,245]) +("tvname",[83,83,96,98,98,99]) +("type",[3,47,125,155,204,210,214,216,216,218,218,218,288,374,404,503,558,559,562,583,584,594,595,682,682,713,714,715,717,729,735,814,863,891,1038]) +("typedef",[712]) +("types",[378,565,656,683]) +("u",[373,374]) +("undeclared",[621]) +("unified",[347]) +("unifiedOlds",[338,339,341]) +("unifier",[681,683]) +("unifiers",[681]) +("unify",[306,321,323,324]) +("unknown",[710]) +("unknowns",[1028,1029,1034,1037]) +("unzip2",[538,543,544,609]) +("uol",[617,618,619,623]) +("up",[710]) +("us",[373,374]) +("use",[594,820]) +("used",[815]) +("usedc",[828,829]) +("utDomain",[353]) +("utLookup",[791]) +("utLookupAll",[354]) +("utLookupDef",[206,418,619]) +("utRange",[425]) +("v",[23,23,60]) +("v5",[3]) +("var",[247,247,558]) +("variable",[418]) +("variables",[438,562,595,682,868]) +("vars",[558,595]) +("version",[4]) +("vl",[764,764]) +("vs",[32,32,141]) +("where",[7,22,57,82,126,133,140,186,205,286,322,340,352,405,462,489,537,542,557,603,658,664,686,721,754,788,824,848,880,892,919,938,956,968,993,1004,1027,1035,1059,1077,1094]) +("with",[308,558,806]) +("x",[130,133,133,187,187,394,394,394,434,434,517,518,528,529,530,531,628,628,879,879,881,955,955,958,964,966,967,974,974,1085]) +("x2",[131]) +("xs",[394,394,530,531,535,536,538,991,992,1000,1002,1003,1005,1012,1014,1015,1026,1026,1056,1057,1062,1067,1067,1073,1075,1076,1090,1092,1093]) +("y",[188,530,531]) +("ys",[394,394]) +("zip",[301,351,607,607,720,720,764,776,893,1015,1026,1036,1067,1076]) diff --git a/testsuite/tests/programs/jules_xref/test.T b/testsuite/tests/programs/jules_xref/test.T new file mode 100644 index 0000000000..07da9cbd0d --- /dev/null +++ b/testsuite/tests/programs/jules_xref/test.T @@ -0,0 +1,8 @@ +# exhausts Hugs's heap +test('jules_xref', + [skip_if_fast, + extra_clean(['Main.hi', 'Main.o']), + omit_compiler_types(['hugs'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/jules_xref2/Main.hs b/testsuite/tests/programs/jules_xref2/Main.hs new file mode 100644 index 0000000000..10d20a5671 --- /dev/null +++ b/testsuite/tests/programs/jules_xref2/Main.hs @@ -0,0 +1,73 @@ +-- partain: the failure (crashing) was w/ -prof-auto compilation + +module Main where + +xreff :: Int -> [String] -> Table -> Int -> String -> String +xreff cc exs stab lineno [] = display (foldl delete stab exs) +xreff cc exs stab lineno ('\n':cs) = xreff cc exs stab (lineno+1) cs +xreff cc exs stab lineno (c:cs) + = if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') then + case getRestWord cs of + (word, rest) -> if (cc :: Int) == 0 + then if stab == stab + then + xreff 1000 exs + (enter lineno stab (c:word)) lineno rest + else error "Force failed?!" + else xreff (cc-1) exs + (enter lineno stab (c:word)) lineno rest + else xreff cc exs stab lineno cs + +xref exceptions source = xreff 1000 exceptions ALeaf 1 source + +getRestWord [] = ([], []) +getRestWord xs@(x:xs') + | (x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z') || (x >= '0' && x <= '9') + = case getRestWord xs' of + (ys,zs) -> if (x >= 'A' && x <= 'Z') + then (toEnum (fromEnum x + (32::Int)):ys, zs) + else (x:ys, zs) + | otherwise + = ([],xs) + +data Table = ALeaf | ABranch Table String [Int] Table deriving (Eq) + +enter n ALeaf w = ABranch ALeaf w [n] ALeaf +enter n (ABranch l k ns r) w + = if w < k then ABranch (enter n l w) k ns r else + if w > k then ABranch l k ns (enter n r w) else + ABranch l k (n:ns) r + +delete ALeaf w = ALeaf +delete (ABranch l k ns r) w + = if w < k then ABranch (delete l w) k ns r else + if w > k then ABranch l k ns (delete r w) else + ABranch l k [] r + +display :: Table -> String +display t = display_a t "" + +display_a :: Table -> String -> String +display_a ALeaf acc = acc +display_a (ABranch l k ns r) acc + = display_a l (dispLine k ns ++ display_a r acc) + +dispLine k [] = "" +dispLine k ns = k ++ ":" ++ dispNos ns ++ "\n" + +dispNos :: [Int] -> String +dispNos [] = "" +dispNos (n:ns) = ' ':(show n ++ dispNos ns) + +main = do + input <- getContents + exceptions <- catch (readFile "exceptions") (\ e -> return "") + putStr (xref (lines exceptions) input) + +{- OLD 1.2: +main = readChan stdin abort (\input -> + readFile "exceptions" + (\errors -> output (xref [] input)) + (\exceptions -> output (xref (lines exceptions) input))) + where output s = appendChan stdout s abort done +-} diff --git a/testsuite/tests/programs/jules_xref2/Makefile b/testsuite/tests/programs/jules_xref2/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/jules_xref2/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/jules_xref2/jules_xref2.stdin b/testsuite/tests/programs/jules_xref2/jules_xref2.stdin new file mode 100644 index 0000000000..a43907d9bd --- /dev/null +++ b/testsuite/tests/programs/jules_xref2/jules_xref2.stdin @@ -0,0 +1,1105 @@ + +--==========================================================-- +--=== A type-checker -- v5 File: TypeCheck5.m (1) ===-- +--=== Corrected version for 0.210a ===-- +--==========================================================-- + +module TypeCheck5 where +import BaseDefs +import Utils +import MyUtils + +--==========================================================-- +--=== Formatting of results ===-- +--==========================================================-- + +tcMapAnnExpr :: (a -> b) -> + AnnExpr c a -> + AnnExpr c b + +tcMapAnnExpr f (ann, node) + = (f ann, mapAnnExpr' node) + where + mapAnnExpr' (AVar v) = AVar v + mapAnnExpr' (ANum n) = ANum n + mapAnnExpr' (AConstr c) = AConstr c + mapAnnExpr' (AAp ae1 ae2) + = AAp (tcMapAnnExpr f ae1) (tcMapAnnExpr f ae2) + mapAnnExpr' (ALet recFlag annDefs mainExpr) + = ALet recFlag (map mapAnnDefn annDefs) (tcMapAnnExpr f mainExpr) + mapAnnExpr' (ACase switchExpr annAlts) + = ACase (tcMapAnnExpr f switchExpr) (map mapAnnAlt annAlts) + mapAnnExpr' (ALam vs e) = ALam vs (tcMapAnnExpr f e) + + mapAnnDefn (naam, expr) + = (naam, tcMapAnnExpr f expr) + + mapAnnAlt (naam, (pars, resExpr)) + = (naam, (pars, tcMapAnnExpr f resExpr)) + + +--======================================================-- +-- +tcSubstAnnTree :: Subst -> + AnnExpr Naam TExpr -> + AnnExpr Naam TExpr + +tcSubstAnnTree phi tree = tcMapAnnExpr (tcSub_type phi) tree + + +--======================================================-- +-- +tcTreeToEnv :: AnnExpr Naam TExpr -> + TypeEnv + +tcTreeToEnv tree + = t2e tree + where + t2e (nodeType, node) = t2e' node + + t2e' (AVar v) = [] + t2e' (ANum n) = [] + t2e' (AConstr c) = [] + t2e' (AAp ae1 ae2) = (t2e ae1) ++ (t2e ae2) + t2e' (ALam cs e) = t2e e + t2e' (ALet rf dl me) + = (concat (map aFN dl)) ++ (t2e me) + t2e' (ACase sw alts) + = (t2e sw) ++ (concat (map (t2e.second.second) alts)) + + aFN (naam, (tijp, body)) + = (naam, tijp):(t2e' body) + + + +--======================================================-- +-- +tcShowtExpr :: TExpr -> + [Char] + +tcShowtExpr t + = pretty' False t + where + pretty' b (TVar tvname) = [' ', chr (96+(lookup tvname tvdict))] + pretty' b (TCons "int" []) = " int" + pretty' b (TCons "bool" []) = " bool" + pretty' b (TCons "char" []) = " char" + pretty' True (TArr t1 t2) + = " (" ++ (pretty' True t1) ++ " -> " ++ + (pretty' False t2) ++ ")" + pretty' False (TArr t1 t2) + = (pretty' True t1) ++ " -> " ++ + (pretty' False t2) + pretty' b (TCons notArrow cl) + = " (" ++ notArrow ++ + concat (map (pretty' True) cl) ++ ")" + lookup tvname [] + = panic "tcShowtExpr: Type name lookup failed" + lookup tvname (t:ts) | t==tvname = 1 + | otherwise = 1 + (lookup tvname ts) + tvdict = nub (tvdict' t) + tvdict' (TVar t) = [t] + tvdict' (TCons c ts) = concat (map tvdict' ts) + tvdict' (TArr t1 t2) = tvdict' t1 ++ tvdict' t2 + + +--======================================================-- +-- +tcPretty :: (Naam, TExpr) -> + [Char] + +tcPretty (naam, tipe) + = "\n " ++ (ljustify 25 (naam ++ " :: ")) ++ + (tcShowtExpr tipe) + + +--======================================================-- +tcCheck :: TcTypeEnv -> + TypeNameSupply -> + AtomicProgram -> + ([Char], Reply (AnnExpr Naam TExpr, TypeEnv) Message) + +tcCheck baseTypes ns (tdefs, expr) + = if good tcResult + then (fullEnvWords, Ok (rootTree, fullEnv)) + else ("", Fail "No type") + where + tcResult = tc (tdefs++builtInTypes) + (baseTypes++finalConstrTypes) finalNs expr + + good (Ok x) = True + good (Fail x2) = False + + (rootSubst, rootType, annoTree) = f tcResult where f (Ok x) = x + + rootTree = tcSubstAnnTree rootSubst annoTree + + rootEnv = tcTreeToEnv rootTree + + fullEnv = rootEnv ++ map f finalConstrTypes + where + f (naam, (Scheme vs t)) = (naam, t) + + fullEnvWords = concat (map tcPretty fullEnv) + + (finalNs, constrTypes) = + mapAccuml tcConstrTypeSchemes ns (tdefs++builtInTypes) + finalConstrTypes = concat constrTypes + + builtInTypes + = [ ("bool", [], [("True", []), ("False", [])]) ] + + + +--==========================================================-- +--=== 9.2 Representation of type expressions ===-- +--==========================================================-- + +----======================================================-- +--tcArrow :: TExpr -> +-- TExpr -> +-- TExpr +-- +--tcArrow t1 t2 = TArr t1 t2 + + + +--======================================================-- +tcInt :: TExpr + +tcInt = TCons "int" [] + + + +--======================================================-- +tcBool :: TExpr + +tcBool = TCons "bool" [] + + + +--======================================================-- +tcTvars_in :: TExpr -> + [TVName] + +tcTvars_in t = tvars_in' t [] + where + tvars_in' (TVar x) l = x:l + tvars_in' (TCons y ts) l = foldr tvars_in' l ts + tvars_in' (TArr t1 t2) l = tvars_in' t1 (tvars_in' t2 l) + + +--==========================================================-- +--=== 9.41 Substitutions ===-- +--==========================================================-- + +--======================================================-- +tcApply_sub :: Subst -> + TVName -> + TExpr + +tcApply_sub phi tvn + = if TVar tvn == lookUpResult + then TVar tvn + else tcSub_type phi lookUpResult + where + lookUpResult = utLookupDef phi tvn (TVar tvn) + + +--======================================================-- +tcSub_type :: Subst -> + TExpr -> + TExpr + +tcSub_type phi (TVar tvn) = tcApply_sub phi tvn + +tcSub_type phi (TCons tcn ts) = TCons tcn (map (tcSub_type phi) ts) + +tcSub_type phi (TArr t1 t2) = TArr (tcSub_type phi t1) (tcSub_type phi t2) + + +--======================================================-- +tcScomp :: Subst -> + Subst -> + Subst + +tcScomp sub2 sub1 = sub1 ++ sub2 + + + +--======================================================-- +tcId_subst :: Subst + +tcId_subst = [] + + + +--======================================================-- +tcDelta :: TVName -> + TExpr -> + Subst +-- all TVar -> TVar substitutions lead downhill +tcDelta tvn (TVar tvn2) + | tvn == tvn2 = [] + | tvn > tvn2 = [(tvn, TVar tvn2)] + | tvn < tvn2 = [(tvn2, TVar tvn)] + +tcDelta tvn non_var_texpr = [(tvn, non_var_texpr)] + + +--==========================================================-- +--=== 9.42 Unification ===-- +--==========================================================-- + +--======================================================-- +tcExtend :: Subst -> + TVName -> + TExpr -> + Reply Subst Message + +tcExtend phi tvn t + | t == TVar tvn + = Ok phi + | tvn `notElem` (tcTvars_in t) + = Ok ((tcDelta tvn t) `tcScomp` phi) + | otherwise + = fail + ( "Type error in source program:\n\n" ++ + "Circular substitution:\n " ++ + tcShowtExpr (TVar tvn) ++ + "\n going to\n" ++ + " " ++ + tcShowtExpr t ++ + "\n") + + + +--======================================================-- +tcUnify :: Subst -> + (TExpr, TExpr) -> + Reply Subst Message + +tcUnify phi (TVar tvn, t) + = if phitvn == TVar tvn + then tcExtend phi tvn phit + else tcUnify phi (phitvn, phit) + where + phitvn = tcApply_sub phi tvn + phit = tcSub_type phi t + +tcUnify phi (p@(TCons _ _), q@(TVar _)) + = tcUnify phi (q, p) + +tcUnify phi (p@(TArr _ _), q@(TVar _)) + = tcUnify phi (q, p) + +tcUnify phi (TArr t1 t2, TArr t1' t2') + = tcUnifyl phi [(t1, t1'), (t2, t2')] + +tcUnify phi (TCons tcn ts, TCons tcn' ts') + | tcn == tcn' + = tcUnifyl phi (ts `zip` ts') + +tcUnify phi (t1, t2) + = fail + ( "Type error in source program:\n\n" ++ + "Cannot unify\n " ++ + tcShowtExpr t1 ++ + "\n with\n " ++ + tcShowtExpr t2 ++ + "\n" + ) + + + +--======================================================-- +tcUnifyl :: Subst -> + [(TExpr, TExpr)] -> + Reply Subst Message + +tcUnifyl phi eqns + = foldr unify' (Ok phi) eqns + where + unify' eqn (Ok phi) = tcUnify phi eqn + unify' eqn (Fail m) = Fail m + + + +--==========================================================-- +--=== 9.42.2 Merging of substitutions ===-- +--==========================================================-- + +--======================================================-- +tcMergeSubs :: Subst -> + Subst + +tcMergeSubs phi + = if newBinds == [] + then unifiedOlds + else tcMergeSubs (unifiedOlds ++ newBinds) + where + (newBinds, unifiedOlds) = tcMergeSubsMain phi + + + +--======================================================-- +tcMergeSubsMain :: Subst -> + (Subst, Subst) -- pair of new binds, unified olds + +tcMergeSubsMain phi + = (concat newUnifiersChecked, + zip oldVars (tcOldUnified newUnifiersChecked oldGroups)) + where + oldVars = nub (utDomain phi) + oldGroups = map (utLookupAll phi) oldVars + newUnifiers = map (tcUnifySet tcId_subst) oldGroups + newUnifiersChecked = map tcCheckUnifier newUnifiers + + + +--======================================================-- +tcCheckUnifier :: Reply Subst Message -> Subst + +tcCheckUnifier (Ok r) = r +tcCheckUnifier (Fail m) + = panic ("tcCheckUnifier: " ++ m) + + + +--======================================================-- +tcOldUnified :: [Subst] -> [[TExpr]] -> [TExpr] + +tcOldUnified [] [] = [] +tcOldUnified (u:us) (og:ogs) + = (tcSub_type u (head og)): tcOldUnified us ogs + + +--==========================================================-- +--=== 9.5 Keeping track of types ===-- +--==========================================================-- + +--======================================================-- +tcUnknowns_scheme :: TypeScheme -> + [TVName] + +tcUnknowns_scheme (Scheme scvs t) = tcTvars_in t `tcBar` scvs + + + +--======================================================-- +tcBar :: (Eq a) => [a] -> + [a] -> + [a] + +tcBar xs ys = [ x | x <- xs, not (x `elem` ys)] + + + +--======================================================-- +tcSub_scheme :: Subst -> + TypeScheme -> + TypeScheme + +tcSub_scheme phi (Scheme scvs t) + = Scheme scvs (tcSub_type (tcExclude phi scvs) t) + where + tcExclude phi scvs = [(n,e) | (n,e) <- phi, not (n `elem` scvs)] + + + +--==========================================================-- +--=== 9.53 Association lists ===-- +--==========================================================-- + +--======================================================-- +tcCharVal :: AList Naam b -> Naam -> b + +tcCharVal al k + = utLookupDef al k (panic ("tcCharVal: no such variable: " ++ k)) + + +--======================================================-- +tcUnknowns_te :: TcTypeEnv -> + [TVName] + +tcUnknowns_te gamma = concat (map tcUnknowns_scheme (utRange gamma)) + + + +--======================================================-- +tcSub_te :: Subst -> + TcTypeEnv -> + TcTypeEnv + +tcSub_te phi gamma = [(x, tcSub_scheme phi st) | (x, st) <- gamma] + + +--==========================================================-- +--=== 9.6 New variables ===-- +--==========================================================-- + +--======================================================-- +tcNext_name :: TypeNameSupply -> + TVName + +tcNext_name ns@(f, s) = ns + + + +--======================================================-- +tcDeplete :: TypeNameSupply -> + TypeNameSupply + +tcDeplete (f, s) = (f, tcNSSucc s) + + + +--======================================================-- +tcSplit :: TypeNameSupply -> + (TypeNameSupply, TypeNameSupply) + +tcSplit (f, s) = ((f2, [0]), (tcNSSucc f2, [0])) + where f2 = tcNSDouble f + + + +--======================================================-- +tcName_sequence :: TypeNameSupply -> + [TVName] + +tcName_sequence ns = tcNext_name ns: tcName_sequence (tcDeplete ns) + + +--======================================================-- +tcNSSucc :: [Int] -> + [Int] + +tcNSSucc [] = [1] +tcNSSucc (n:ns) | n < tcNSslimit = n+1: ns + | otherwise = 0: tcNSSucc ns + + +--======================================================-- +tcNSDouble :: [Int] -> + [Int] + +tcNSDouble [] = [] +tcNSDouble (n:ns) + = 2*n': ns' + where n' | n > tcNSdlimit = n - tcNSdlimit + | otherwise = n + ns' | n' == n = tcNSDouble ns + | otherwise = tcNSSucc (tcNSDouble ns) + + +tcNSdlimit :: Int +tcNSdlimit = 2^30 + +tcNSslimit :: Int +tcNSslimit = tcNSdlimit + (tcNSdlimit - 1) + + +--==========================================================-- +--=== 9.7 The type-checker ===-- +--==========================================================-- + + +--======================================================-- +tc :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + CExpr -> + Reply TypeInfo Message + +tc tds gamma ns (ENum n) + = Ok (tcId_subst, TCons "int" [], (TCons "int" [], ANum n)) + +tc tds gamma ns (EVar x) + = tcvar tds gamma ns x + +tc tds gamma ns (EConstr c) + = tcvar tds gamma ns c + +tc tds gamma ns (EAp e1 e2) + = tcap tds gamma ns e1 e2 + +tc tds gamma ns (ELam [] e) + = tc tds gamma ns e +tc tds gamma ns (ELam [x] e) + = tclambda tds gamma ns x e +tc tds gamma ns (ELam (x:y:xs) e) + = tclambda tds gamma ns x (ELam (y:xs) e) + +tc tds gamma ns (ELet recursive dl e) + = if not recursive + then tclet tds gamma ns xs es e + else tcletrec tds gamma ns xs es e + where + (xs, es) = unzip2 dl + +tc tds gamma ns (ECase switch alts) + = tccase tds gamma ns switch constructors arglists exprs + where + (constructors, alters) = unzip2 alts + (arglists, exprs) = unzip2 alters + + +--==========================================================-- +--=== 0.00 Type-checking case-expressions ===-- +--==========================================================-- + +tcConstrTypeSchemes :: TypeNameSupply -> + TypeDef -> + (TypeNameSupply, AList Naam TypeScheme) + +tcConstrTypeSchemes ns (tn, stvs, cal) + = (finalNameSupply, map2nd enScheme cAltsCurried) + where + -- associates new type vars with each poly var + -- in the type + newTVs = tcNewTypeVars (tn, stvs, cal) ns + + -- the actual type variables themselves + tVs = map second newTVs + + -- the types of the constructor functions + cAltsCurried = map2nd (foldr TArr tdSignature) cAltsXLated + cAltsXLated = map2nd (map (tcTDefSubst newTVs)) cal + tdSignature = TCons tn (map TVar tVs) + enScheme texp = Scheme ((nub.tcTvars_in) texp) texp + + -- the revised name supply + finalNameSupply = applyNtimes ( length tVs + 2) tcDeplete ns + + -- apply a function n times to an arg + applyNtimes n func arg + | n ==0 = arg + | otherwise = applyNtimes (n-1) func (func arg) + + + +--======================================================-- +-- +tccase :: [TypeDef] -> -- constructor type definitions + TcTypeEnv -> -- current type bindings + TypeNameSupply -> -- name supply + CExpr -> -- switch expression + [Naam] -> -- constructors + [[Naam]] -> -- argument lists + [CExpr] -> -- resulting expressions + Reply TypeInfo Message + + +tccase tds gamma ns sw cs als res +-- get the type definition in use, & an association of +-- variables therein to type vars & pass +-- Also, reorder the argument lists +-- and resulting expressions so as to reflect the +-- sequence of constructors in the definition + = if length tdCNames /= length (nub cs) + then fail + "Error in source program: missing alternatives in CASE" + else tccase1 tds gamma ns1 sw reOals reOres newTVs tdInUse + where + tdInUse = tcGetTypeDef tds cs + newTVs = tcNewTypeVars tdInUse ns2 + (ns1, ns2) = tcSplit ns + merge = zip cs (zip als res) + tdCNames = map first (tcK33 tdInUse) + (reOals, reOres) = unzip2 (tcReorder tdCNames merge) + + + +--======================================================-- +-- +tcReorder :: [Naam] -> [(Naam,b)] -> [b] + +tcReorder [] uol = [] +tcReorder (k:ks) uol + = (utLookupDef uol k + (fail + ("Error in source program: undeclared constructor '" ++ k ++ + "' in CASE") ) ) + : tcReorder ks uol + + +--======================================================-- +-- Projection functions and similar rubbish. +tcDeOksel (Ok x) = x +tcDeOksel (Fail m) = panic ("tcDeOkSel: " ++ m) +tcOk13sel (Ok (a, b, c)) = a +tcOk13sel (Fail m) = panic ("tcOk13sel: " ++ m) +tcOk23sel (Ok (a, b, c)) = b +tcOk23sel (Fail m) = panic ("tcOk23sel: " ++ m) +tcOk33sel (Ok (a, b, c)) = c +tcOk33sel (Fail m) = panic ("tcOk33sel: " ++ m) +tcK31sel (a, b, c) = a +tcK33 (a,b,c) = c + + + +--======================================================-- +-- +tccase1 :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + CExpr -> + [[Naam]] -> + [CExpr] -> + AList Naam TVName -> + TypeDef -> + Reply TypeInfo Message + +tccase1 tds gamma ns sw reOals reOres newTVs tdInUse +-- calculate all the gammas for the RHS's +-- call tc for each RHS, so as to gather all the +-- sigmas and types for each RHS, then pass on + = tccase2 tds gamma ns2 sw reOals newTVs tdInUse rhsTcs + where + rhsGammas = tcGetAllGammas newTVs (tcK33 tdInUse) reOals + rhsTcs = rhsTc1 ns1 rhsGammas reOres + rhsTc1 nsl [] [] = [] + rhsTc1 nsl (g:gs) (r:rs) + = tc tds (g++gamma) nsl1 r : rhsTc1 nsl2 gs rs + where (nsl1, nsl2) = tcSplit nsl + (ns1, ns2) = tcSplit ns + + +--======================================================-- +-- +tccase2 :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + CExpr -> + [[Naam]] -> + AList Naam TVName -> + TypeDef -> + [Reply TypeInfo Message] -> + Reply TypeInfo Message + +tccase2 tds gamma ns sw reOals newTVs tdInUse rhsTcs +-- get the unifiers for T1 to Tk and hence the unifier for all +-- type variables in the type definition. Also compute the +-- unifier of the result types. + = tccase3 tds gamma ns sw reOals newTVs tdInUse rhsTcs + phi_1_to_n tau_1_to_n phi_rhs + where + phi_1_to_n = map tcOk13sel rhsTcs + tau_1_to_n = map tcOk23sel rhsTcs + phi_rhs = tcDeOksel (tcUnifySet tcId_subst tau_1_to_n) + + + +--======================================================-- +-- +tccase3 :: [TypeDef] -> -- tds + TcTypeEnv -> -- gamma + TypeNameSupply -> -- ns + CExpr -> -- sw + [[Naam]] -> -- reOals + AList Naam TVName -> -- newTVs + TypeDef -> -- tdInUse + [Reply TypeInfo Message] -> -- rhsTcs + [Subst] -> -- phi_1_to_n + [TExpr] -> -- tau_1_to_n + Subst -> -- phi_rhs + Reply TypeInfo Message + +tccase3 tds gamma ns sw reOals newTVs tdInUse rhsTcs + phi_1_to_n tau_1_to_n phi_rhs +-- make up substitutions for each of the unknown tvars +-- merge the substitutions into one +-- apply the substitution to the typedef's signature to get the +-- most general allowable input type +-- call tc to get the type of the switch expression +-- check that this is an instance of the deduced input type +-- gather the new bindings from the RHSs and switch expression +-- return Ok (the big substitution, the result type, gathered bindings) + = Ok (phi_Big, tau_final, + (tau_final, ACase tree_s + (zip tdCNames (zip reOals annotatedRHSs)))) + where + phi_sTau_sTree_s = tc tds gamma ns sw + phi_s = tcOk13sel phi_sTau_sTree_s + tau_s = tcOk23sel phi_sTau_sTree_s + tree_s = tcOk33sel phi_sTau_sTree_s + + phi = tcMergeSubs (concat phi_1_to_n ++ phi_rhs ++ phi_s) + + tau_lhs = tcSub_type phi tdSignature + + phi_lhs = tcUnify tcId_subst (tau_lhs, tau_s) -- reverse these? + + phi_Big = tcMergeSubs (tcDeOksel phi_lhs ++ phi) + + tau_final = tcSub_type phi_Big (head (map tcOk23sel rhsTcs)) + + annotatedRHSs = map tcOk33sel rhsTcs + tVs = map second newTVs + tdSignature = TCons (tcK31sel tdInUse) (map TVar tVs) + tdCNames = map first (tcK33 tdInUse) + + +--======================================================-- +-- +tcUnifySet :: Subst -> + [TExpr] -> + Reply Subst Message + +tcUnifySet sub (e1:[]) = Ok sub +tcUnifySet sub (e1:e2:[]) + = tcUnify sub (e1, e2) +tcUnifySet sub (e1:e2:e3:es) + = tcUnifySet newSub (e2:e3:es) + where + newSub = tcDeOksel (tcUnify sub (e1, e2)) + + +--======================================================-- +-- +tcNewTypeVars :: TypeDef -> + TypeNameSupply -> + AList Naam TVName + +tcNewTypeVars (t, vl, c) ns = zip vl (tcName_sequence ns) + + + +--======================================================-- +-- +tcGetGammaN :: AList Naam TVName -> + ConstrAlt -> + [Naam] -> + AList Naam TypeScheme + +tcGetGammaN tvl (cname, cal) cparams + = zip cparams (map (Scheme [] . tcTDefSubst tvl) cal) + + + +--======================================================-- +-- +tcTDefSubst :: AList Naam TVName -> + TDefExpr -> + TExpr + +tcTDefSubst nameMap (TDefVar n) + = f result + where + f (Just tvn) = TVar tvn + f Nothing = TCons n [] + result = utLookup nameMap n + +tcTDefSubst nameMap (TDefCons c al) + = TCons c (map (tcTDefSubst nameMap) al) + + +--======================================================-- +-- +tcGetAllGammas :: AList Naam TVName -> + [ConstrAlt] -> + [[Naam]] -> + [AList Naam TypeScheme] + +tcGetAllGammas tvl [] [] = [] +-- note param lists cparamss must be ordered in +-- accordance with calts +tcGetAllGammas tvl (calt:calts) (cparams:cparamss) = + tcGetGammaN tvl calt cparams : + tcGetAllGammas tvl calts cparamss + + +--======================================================-- +-- +tcGetTypeDef :: [TypeDef] -> -- type definitions + [Naam] -> -- list of constructors used here + TypeDef + +tcGetTypeDef tds cs + = if length tdefset == 0 + then fail "Undeclared constructors in use" + else if length tdefset > 1 + then fail "CASE expression contains mixed constructors" + else head tdefset + where + tdefset = nub + [ (tname, ftvs, cl) | + (tname, ftvs, cl) <- tds, + usedc <- cs, + usedc `elem` (map first cl) ] + + +--==========================================================-- +--=== 9.71 Type-checking lists of expressions ===-- +--==========================================================-- + +--======================================================-- +-- +tcl :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + [CExpr] -> + Reply (Subst, [TExpr], [AnnExpr Naam TExpr]) Message + +tcl tds gamma ns [] + = Ok (tcId_subst, [], []) +tcl tds gamma ns (e:es) + = tcl1 tds gamma ns0 es (tc tds gamma ns1 e) + where + (ns0, ns1) = tcSplit ns + + +--======================================================-- +-- +tcl1 tds gamma ns es (Fail m) = Fail m +tcl1 tds gamma ns es (Ok (phi, t, annotatedE)) + = tcl2 phi t (tcl tds (tcSub_te phi gamma) ns es) annotatedE + + +--======================================================-- +-- +tcl2 phi t (Fail m) annotatedE = Fail m +tcl2 phi t (Ok (psi, ts, annotatedEs)) annotatedE + = Ok (psi `tcScomp` phi, (tcSub_type psi t):ts, + annotatedE:annotatedEs) + + +--==========================================================-- +--=== 9.72 Type-checking variables ===-- +--==========================================================-- + +--======================================================-- +-- +tcvar :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + Naam -> + Reply TypeInfo Message + +tcvar tds gamma ns x = Ok (tcId_subst, finalType, (finalType, AVar x)) + where + scheme = tcCharVal gamma x + finalType = tcNewinstance ns scheme + + +--======================================================-- +-- +tcNewinstance :: TypeNameSupply -> + TypeScheme -> + TExpr + +tcNewinstance ns (Scheme scvs t) = tcSub_type phi t + where + al = scvs `zip` (tcName_sequence ns) + phi = tcAl_to_subst al + + +--======================================================-- +-- +tcAl_to_subst :: AList TVName TVName -> + Subst + +tcAl_to_subst al = map2nd TVar al + + +--==========================================================-- +--=== 9.73 Type-checking applications ===-- +--==========================================================-- + +--======================================================-- +-- +tcap :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + CExpr -> + CExpr -> + Reply TypeInfo Message + +tcap tds gamma ns e1 e2 = tcap1 tvn (tcl tds gamma ns' [e1, e2]) + where + tvn = tcNext_name ns + ns' = tcDeplete ns + + +--======================================================-- +-- +tcap1 tvn (Fail m) + = Fail m +tcap1 tvn (Ok (phi, [t1, t2], [ae1, ae2])) + = tcap2 tvn (tcUnify phi (t1, t2 `TArr` (TVar tvn))) [ae1, ae2] + + +--======================================================-- +-- +tcap2 tvn (Fail m) [ae1, ae2] + = Fail m +tcap2 tvn (Ok phi) [ae1, ae2] + = Ok (phi, finalType, (finalType, AAp ae1 ae2)) + where + finalType = tcApply_sub phi tvn + + +--==========================================================-- +--=== 9.74 Type-checking lambda abstractions ===-- +--==========================================================-- + +--======================================================-- +-- +tclambda :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + Naam -> + CExpr -> + Reply TypeInfo Message + +tclambda tds gamma ns x e = tclambda1 tvn x (tc tds gamma' ns' e) + where + ns' = tcDeplete ns + gamma' = tcNew_bvar (x, tvn): gamma + tvn = tcNext_name ns + + +--======================================================-- +-- +tclambda1 tvn x (Fail m) = Fail m + +tclambda1 tvn x (Ok (phi, t, annotatedE)) = + Ok (phi, finalType, (finalType, ALam [x] annotatedE)) + where + finalType = (tcApply_sub phi tvn) `TArr` t + + +--======================================================-- +-- +tcNew_bvar (x, tvn) = (x, Scheme [] (TVar tvn)) + + +--==========================================================-- +--=== 9.75 Type-checking let-expressions ===-- +--==========================================================-- + +--======================================================-- +-- +tclet :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + [Naam] -> + [CExpr] -> + CExpr -> + Reply TypeInfo Message + +tclet tds gamma ns xs es e + = tclet1 tds gamma ns0 xs e rhsTypes + where + (ns0, ns1) = tcSplit ns + rhsTypes = tcl tds gamma ns1 es + + +--======================================================-- +-- +tclet1 tds gamma ns xs e (Fail m) = Fail m + +tclet1 tds gamma ns xs e (Ok (phi, ts, rhsAnnExprs)) + = tclet2 phi xs False (tc tds gamma'' ns1 e) rhsAnnExprs + where + gamma'' = tcAdd_decls gamma' ns0 xs ts + gamma' = tcSub_te phi gamma + (ns0, ns1) = tcSplit ns + + +--======================================================-- +-- +tclet2 phi xs recFlag (Fail m) rhsAnnExprs = Fail m + +tclet2 phi xs recFlag (Ok (phi', t, annotatedE)) rhsAnnExprs + = Ok (phi' `tcScomp` phi, t, (t, ALet recFlag (zip xs rhsAnnExprs) annotatedE)) + + +--======================================================-- +-- +tcAdd_decls :: TcTypeEnv -> + TypeNameSupply -> + [Naam] -> + [TExpr] -> + TcTypeEnv + +tcAdd_decls gamma ns xs ts = (xs `zip` schemes) ++ gamma + where + schemes = map (tcGenbar unknowns ns) ts + unknowns = tcUnknowns_te gamma + + +--======================================================-- +-- +tcGenbar unknowns ns t = Scheme (map second al) t' + where + al = scvs `zip` (tcName_sequence ns) + scvs = (nub (tcTvars_in t)) `tcBar` unknowns + t' = tcSub_type (tcAl_to_subst al) t + + + +--==========================================================-- +--=== 9.76 Type-checking letrec-expressions ===-- +--==========================================================-- + +--======================================================-- +-- +tcletrec :: [TypeDef] -> + TcTypeEnv -> + TypeNameSupply -> + [Naam] -> + [CExpr] -> + CExpr -> + Reply TypeInfo Message + +tcletrec tds gamma ns xs es e + = tcletrec1 tds gamma ns0 xs nbvs e + (tcl tds (nbvs ++ gamma) ns1 es) + where + (ns0, ns') = tcSplit ns + (ns1, ns2) = tcSplit ns' + nbvs = tcNew_bvars xs ns2 + + +--======================================================-- +-- +tcNew_bvars xs ns = map tcNew_bvar (xs `zip` (tcName_sequence ns)) + + + +--======================================================-- +-- +tcletrec1 tds gamma ns xs nbvs e (Fail m) = (Fail m) + +tcletrec1 tds gamma ns xs nbvs e (Ok (phi, ts, rhsAnnExprs)) + = tcletrec2 tds gamma' ns xs nbvs' e (tcUnifyl phi (ts `zip` ts')) rhsAnnExprs + where + ts' = map tcOld_bvar nbvs' + nbvs' = tcSub_te phi nbvs + gamma' = tcSub_te phi gamma + + +--======================================================-- +-- +tcOld_bvar (x, Scheme [] t) = t + + +--======================================================-- +-- +tcletrec2 tds gamma ns xs nbvs e (Fail m) rhsAnnExprs = (Fail m) + +tcletrec2 tds gamma ns xs nbvs e (Ok phi) rhsAnnExprs + = tclet2 phi xs True (tc tds gamma'' ns1 e) rhsAnnExprs + where + ts = map tcOld_bvar nbvs' + nbvs' = tcSub_te phi nbvs + gamma' = tcSub_te phi gamma + gamma'' = tcAdd_decls gamma' ns0 (map first nbvs) ts + (ns0, ns1) = tcSplit ns + subnames = map first nbvs + + +--==========================================================-- +--=== End TypeCheck5.m (1) ===-- +--==========================================================-- diff --git a/testsuite/tests/programs/jules_xref2/jules_xref2.stdout b/testsuite/tests/programs/jules_xref2/jules_xref2.stdout new file mode 100644 index 0000000000..6adf88b894 --- /dev/null +++ b/testsuite/tests/programs/jules_xref2/jules_xref2.stdout @@ -0,0 +1,499 @@ +A: 3 +Aap: 937 63 27 26 +Acase: 719 67 31 30 +Aconstr: 62 25 25 +Alam: 967 64 32 32 +Alet: 1015 65 29 28 +Alist: 899 802 799 782 773 770 762 700 675 649 553 415 +Also: 682 596 +Annexpr: 842 120 52 45 44 18 17 +Anum: 515 61 24 24 +Association: 411 +Atomicprogram: 119 +Avar: 879 60 23 23 +Basedefs: 8 +Big: 735 733 718 +Cannot: 306 +Case: 822 622 601 +Cexpr: 1053 1052 988 987 952 915 914 841 698 673 648 646 589 586 511 +Char: 120 109 78 +Circular: 268 +Constralt: 800 771 +Corrected: 4 +Eap: 523 +Ecase: 540 +Econstr: 520 +Elam: 531 530 528 526 +Elet: 533 +End: 1104 +Enum: 514 +Eq: 390 +Error: 621 601 +Evar: 517 +Fail: 1090 1090 1073 1073 1012 1012 1000 1000 964 964 935 934 927 926 861 861 854 854 635 633 631 629 364 324 324 131 125 +False: 1003 150 131 92 90 89 81 +File: 3 +Formatting: 13 +Int: 498 495 484 483 475 474 +Just: 789 +Keeping: 378 +Merging: 329 +Message: 1054 989 953 916 877 842 747 706 702 678 677 651 590 512 361 318 280 258 120 +Myutils: 10 +Naam: 1051 1022 986 951 876 842 815 802 801 799 782 773 772 770 762 700 699 675 674 649 647 615 615 588 587 553 415 415 120 108 52 45 44 +New: 438 +No: 125 +Nothing: 790 +Ok: 1092 1075 1015 1014 1002 967 966 937 936 928 879 863 862 855 845 749 718 717 634 632 630 628 515 363 323 321 264 262 133 130 124 +Projection: 627 +Reply: 1054 989 953 916 877 842 747 706 702 678 677 651 590 512 361 318 280 258 120 +Representation: 155 +Rhs: 656 655 654 +Rhss: 716 +Scheme: 1085 1034 974 891 776 569 404 403 385 141 +Subst: 900 842 747 745 705 703 430 399 370 361 361 347 347 346 334 333 318 316 280 278 258 255 240 231 224 223 222 210 197 43 +Substitutions: 193 +T1: 681 +Tarr: 969 929 566 296 296 293 218 218 189 163 103 90 87 +Tcons: 794 790 739 568 515 515 299 299 290 216 216 188 177 170 102 93 86 85 84 +Tctypeenv: 1049 1024 1020 984 949 912 874 839 696 671 644 584 509 432 431 422 117 +Tdefcons: 793 +Tdefexpr: 783 +Tdefvar: 786 +Texpr: 1023 889 842 842 784 746 704 370 370 317 317 279 279 257 239 212 211 199 182 175 168 161 160 159 120 108 77 52 45 44 +The: 503 +Tk: 681 +True: 1093 150 130 95 91 88 87 +Tvar: 974 929 902 789 739 568 293 290 283 282 269 261 245 244 242 241 241 214 206 203 202 187 101 83 +Tvname: 899 899 799 782 770 762 700 675 649 468 443 423 383 256 238 198 183 +Type: 1043 978 943 906 868 833 548 305 267 97 +Typecheck5: 1104 7 3 +Typedef: 1048 983 948 911 873 838 816 814 760 701 695 676 670 650 643 583 552 508 +Typeenv: 120 53 +Typeinfo: 1054 989 953 916 877 706 702 678 677 651 590 512 +Typenamesupply: 1050 1021 985 950 913 887 875 840 761 697 672 645 585 553 551 510 467 459 459 458 451 450 442 118 +Typescheme: 888 802 773 553 401 400 382 +Undeclared: 820 +Unification: 251 +Utils: 9 +a: 637 636 636 634 632 630 630 574 392 391 390 390 17 16 4 +abstractions: 943 +accordance: 806 +actual: 562 +ae1: 937 936 934 929 928 63 63 27 26 +ae2: 937 936 934 929 928 63 63 27 26 +afn: 70 66 +al: 1038 1036 1034 902 902 894 893 794 793 418 417 +all: 681 655 654 241 +allowable: 713 +als: 607 593 +alternatives: 601 +alters: 544 543 +alts: 543 540 68 67 +an: 715 594 574 +and: 716 681 656 627 597 +ann: 21 20 +annalts: 31 30 +anndefs: 29 28 +annotatede: 1015 1014 967 966 864 862 861 856 855 +annotatedes: 864 862 +annotatedrhss: 737 720 +annotree: 135 133 +applications: 906 +apply: 712 574 +applyntimes: 577 575 572 +arg: 577 576 575 574 +arglists: 544 541 +argument: 596 588 +as: 655 597 +associates: 558 +association: 594 +b: 637 636 634 632 632 630 615 615 415 415 93 86 85 84 83 18 16 +basetypes: 128 122 +be: 805 +big: 717 +bindings: 717 716 584 +binds: 347 +body: 71 70 +bool: 177 150 85 85 +builtintypes: 149 146 127 +bvar: 1095 1085 1078 1067 974 958 +bvars: 1067 1062 +c: 794 793 764 637 637 636 634 634 632 630 521 520 102 62 25 25 18 17 +cal: 776 775 567 560 555 +calculate: 654 +call: 714 655 +calt: 808 807 +calts: 809 807 806 +caltscurried: 566 556 +caltsxlated: 567 566 +case: 548 +char: 86 86 +check: 715 +checker: 503 3 +checking: 1043 978 943 906 868 833 548 +chr: 83 +cl: 829 827 826 95 93 +cname: 775 +compute: 682 +concat: 727 425 350 147 143 102 95 68 66 +constrtypes: 147 145 +constructor: 621 583 565 +constructors: 822 820 815 598 587 543 541 +contains: 822 +cparams: 808 807 776 775 +cparamss: 809 807 805 +cs: 828 818 607 604 599 593 64 +current: 584 +decls: 1098 1026 1020 1005 +deduced: 715 +definition: 682 598 594 +definitions: 814 583 +dl: 538 533 66 65 +downhill: 241 +e: 1093 1092 1090 1076 1075 1073 1057 1056 1003 1002 1000 992 991 955 955 847 846 536 535 533 531 530 529 528 527 526 406 406 64 64 32 32 +e1: 918 918 755 752 751 750 749 524 523 +e2: 918 918 755 753 752 751 750 524 523 +e3: 753 752 +each: 710 656 655 558 +elem: 829 406 394 +else: 823 821 602 536 339 285 204 125 +enscheme: 569 556 +eqn: 324 323 323 +eqns: 321 320 +error: 305 267 +es: 1058 1056 995 991 856 855 854 847 846 753 752 538 536 535 +expr: 128 122 35 34 +expression: 822 716 714 586 +expressions: 1043 978 833 597 589 548 155 +exprs: 544 541 +f: 790 789 787 462 461 453 453 445 141 139 133 133 38 35 32 31 29 27 27 21 20 +f2: 462 461 461 +fail: 822 820 620 600 304 266 +failed: 97 +final: 735 719 718 +finalconstrtypes: 147 139 128 +finalnamesupply: 572 556 +finalns: 145 128 +finaltype: 969 967 967 939 937 937 882 879 879 +first: 1100 1098 829 740 608 +foldr: 566 321 188 +for: 710 681 681 656 655 654 4 +from: 716 +ftvs: 827 826 +fullenv: 143 139 124 +fullenvwords: 143 124 +func: 577 577 575 +function: 574 +functions: 627 565 +g: 663 662 +gamma: 1098 1098 1097 1097 1093 1092 1090 1080 1080 1076 1075 1073 1058 1057 1056 1029 1026 1026 1006 1006 1005 1005 1003 1002 1000 995 992 991 958 958 955 955 918 918 881 879 856 855 854 847 847 846 844 722 708 696 684 680 663 657 653 602 593 541 540 536 535 533 531 530 529 528 527 526 524 523 521 520 518 517 514 434 434 425 425 +gammas: 654 +gather: 716 655 +gathered: 717 +general: 713 +get: 714 712 681 594 +going: 270 +good: 131 130 123 +gs: 663 662 +head: 823 735 374 +hence: 681 +here: 815 +if: 821 819 599 534 337 283 202 123 +import: 10 9 8 +in: 1037 820 805 682 622 621 601 601 598 594 569 559 385 305 267 263 189 189 189 188 188 187 185 185 182 +input: 715 713 +instance: 715 +int: 515 515 170 84 84 +into: 711 +is: 715 +k: 621 619 618 418 418 417 +ks: 623 618 +l: 189 189 188 188 187 187 +lambda: 943 +lead: 241 +length: 821 819 599 599 572 +let: 978 +letrec: 1043 +lhs: 733 731 731 729 +list: 815 +lists: 833 805 596 588 411 +ljustify: 112 +lookup: 99 98 97 96 83 +lookupresult: 206 204 202 +m: 1104 1090 1090 1073 1073 1012 1012 1000 1000 964 964 935 934 927 926 861 861 854 854 635 635 633 633 631 631 629 629 365 364 324 324 3 +mainexpr: 29 28 +make: 710 +map: 1100 1098 1095 1078 1067 1034 1028 829 794 776 740 739 738 737 735 688 687 608 568 567 563 425 356 355 354 216 143 139 102 95 68 66 31 29 +map2nd: 902 567 566 556 +mapaccuml: 146 +mapannalt: 37 31 +mapanndefn: 34 29 +mapannexpr: 32 30 28 26 25 24 23 21 +me: 66 65 +merge: 711 609 607 +missing: 601 +mixed: 822 +module: 7 +most: 713 +must: 805 +n: 791 790 786 727 709 709 704 703 689 688 687 685 685 577 576 575 574 515 514 491 491 490 489 489 489 488 487 478 478 478 406 406 406 310 308 308 306 305 305 273 270 270 268 267 267 112 61 24 24 +naam: 141 141 112 111 71 70 38 37 35 34 +name: 959 920 585 571 470 445 442 97 +namemap: 794 793 791 786 +nbvs: 1100 1098 1096 1096 1095 1092 1090 1079 1079 1078 1076 1075 1073 1062 1058 1057 +new: 716 558 347 +newbinds: 341 339 337 +newsub: 755 753 +newtvs: 738 708 700 684 680 659 657 653 605 602 567 563 560 +newunifiers: 356 355 +newunifierschecked: 356 351 350 +no: 418 +node: 58 58 21 20 +nodetype: 58 +non: 247 247 +not: 534 406 394 +notarrow: 94 93 +note: 805 +notelem: 263 +ns: 1099 1092 1090 1076 1075 1073 1067 1067 1061 1060 1060 1056 1036 1034 1028 1026 1007 1002 1000 994 991 959 957 957 955 955 921 921 920 918 918 893 891 882 879 856 855 854 849 846 844 764 764 722 708 697 684 680 665 653 606 593 572 560 555 541 540 536 535 533 531 530 529 528 527 526 524 523 521 520 518 517 514 492 491 491 488 487 479 478 478 470 470 470 445 445 146 122 +ns0: 1099 1098 1060 1057 1007 1005 994 992 849 847 +ns1: 1099 1093 1061 1058 1007 1003 995 994 849 847 665 660 606 602 +ns2: 1062 1061 665 657 606 605 +nsl: 664 662 661 +nsl1: 664 663 +nsl2: 664 663 +nub: 1037 825 599 569 353 100 +of: 833 815 715 714 710 683 598 594 565 378 347 329 155 13 +og: 374 373 +ogs: 374 373 +oldgroups: 355 354 351 +olds: 347 +oldvars: 354 353 351 +on: 656 +one: 711 +ordered: 805 +otherwise: 577 492 490 479 265 99 +p: 294 293 291 290 +pair: 347 +panic: 635 633 631 629 418 365 97 +param: 805 +pars: 38 37 +pass: 656 595 +phi: 1097 1096 1093 1092 1080 1079 1076 1075 1015 1015 1014 1014 1012 1006 1003 1002 969 967 966 939 937 936 929 928 894 891 863 862 861 856 856 855 735 733 733 733 731 729 727 727 727 727 725 724 723 723 722 718 709 709 705 703 689 687 685 685 434 434 406 406 404 403 354 353 349 341 336 323 323 321 320 303 301 299 297 296 294 293 291 290 288 287 285 284 282 264 262 260 218 218 218 216 216 214 214 206 204 201 47 47 +phit: 288 285 284 +phitvn: 287 285 283 +poly: 558 +pretty: 95 93 92 91 90 89 88 87 86 85 84 83 81 +program: 621 601 305 267 +psi: 863 863 862 +q: 294 293 291 290 +r: 663 662 363 363 +recflag: 1015 1014 1012 29 28 +recursive: 534 533 +reflect: 597 +reoals: 720 708 699 684 680 659 657 653 609 602 +reorder: 596 +reores: 660 653 609 602 +res: 607 593 +resexpr: 38 37 +result: 791 787 717 683 +resulting: 597 589 +results: 13 +return: 717 +reverse: 731 +revised: 571 +rf: 65 +rhs: 727 709 705 689 685 +rhsannexprs: 1093 1092 1090 1076 1075 1015 1014 1012 1003 1002 +rhsgammas: 660 659 +rhstc1: 663 662 661 660 +rhstcs: 737 735 708 702 688 687 684 680 660 657 +rhstypes: 995 992 +rootenv: 139 137 +rootsubst: 135 133 +roottree: 137 135 124 +roottype: 133 +rs: 663 662 +rubbish: 627 +s: 731 727 725 725 724 724 723 723 722 719 712 654 461 453 453 445 +scheme: 882 881 434 425 403 399 385 382 +schemes: 1028 1026 +scvs: 1037 1036 893 891 406 406 404 404 403 385 385 +second: 1034 738 563 68 68 +sequence: 1067 1036 893 764 598 470 470 467 +sigmas: 656 +signature: 712 +similar: 627 +so: 655 597 +source: 621 601 305 267 +st: 434 434 +stau: 725 724 723 722 +stree: 725 724 723 722 +stvs: 560 555 +sub: 969 939 755 752 751 750 749 749 287 214 201 197 +sub1: 226 226 +sub2: 226 226 +subnames: 1100 +subst: 1038 902 899 894 879 845 731 689 515 355 233 231 +substitution: 717 712 268 +substitutions: 711 710 329 241 +such: 418 +supply: 585 571 +sw: 722 708 698 684 680 657 653 602 593 68 67 +switch: 716 714 586 541 540 +switchexpr: 31 30 +t: 1085 1085 1038 1038 1037 1034 1034 1015 1015 1014 969 966 891 891 863 862 861 856 855 764 404 403 385 385 288 282 272 264 263 261 260 185 185 141 141 101 101 100 98 98 81 80 +t1: 929 928 307 303 297 297 296 296 218 218 189 189 163 163 103 103 91 90 88 87 +t2: 929 928 309 303 297 297 296 296 218 218 189 189 163 163 103 103 92 90 89 87 +t2e: 71 68 68 67 66 65 64 64 63 63 63 62 61 60 58 58 56 +tau: 735 731 731 729 724 719 718 709 704 689 688 685 +tc: 1093 1003 955 847 722 714 663 655 540 533 530 528 527 526 523 520 517 514 508 127 +tcadd: 1098 1026 1020 1005 +tcal: 1038 902 899 894 +tcap: 918 911 524 +tcap1: 928 926 918 +tcap2: 936 934 929 +tcapply: 969 939 287 214 201 197 +tcarrow: 163 159 +tcbar: 1037 394 390 385 +tcbool: 177 175 +tccase: 593 583 541 +tccase1: 653 643 602 +tccase2: 680 670 657 +tccase3: 708 695 684 +tccharval: 881 418 417 415 +tccheck: 122 117 +tccheckunifier: 365 364 363 361 356 +tcconstrtypeschemes: 555 551 146 +tcdelta: 264 247 242 238 +tcdeoksel: 755 733 689 629 629 628 +tcdeplete: 957 921 572 470 453 450 +tcexclude: 406 404 +tcextend: 284 260 255 +tcgenbar: 1034 1028 +tcgetallgammas: 809 807 804 799 659 +tcgetgamman: 808 775 770 +tcgettypedef: 818 814 604 +tcid: 879 845 731 689 515 355 233 231 +tcint: 170 168 +tck31sel: 739 636 +tck33: 740 659 637 608 +tcl: 1058 995 918 856 846 844 838 +tcl1: 855 854 847 +tcl2: 862 861 856 +tclambda: 955 948 531 529 +tclambda1: 966 964 955 +tclet: 991 983 535 +tclet1: 1002 1000 992 +tclet2: 1093 1014 1012 1003 +tcletrec: 1056 1048 536 +tcletrec1: 1075 1073 1057 +tcletrec2: 1092 1090 1076 +tcmapannexpr: 47 38 35 32 31 29 27 27 20 16 +tcmergesubs: 733 727 339 336 333 +tcmergesubsmain: 349 346 341 +tcn: 300 300 299 299 216 216 +tcname: 1067 1036 893 764 470 470 467 +tcnew: 1067 1067 1062 974 958 +tcnewinstance: 891 887 882 +tcnewtypevars: 764 760 605 560 +tcnext: 959 920 470 445 442 +tcnsdlimit: 499 499 496 495 489 489 +tcnsdouble: 492 491 487 486 483 462 +tcnsslimit: 499 498 478 +tcnssucc: 492 479 478 477 474 461 453 +tcok13sel: 723 687 631 631 630 +tcok23sel: 735 724 688 633 633 632 +tcok33sel: 737 725 635 635 634 +tcold: 1095 1085 1078 +tcoldunified: 374 373 372 370 351 +tcpretty: 143 111 108 +tcreorder: 623 618 617 615 609 +tcresult: 133 127 123 +tcscomp: 1015 863 264 226 222 +tcshowtexpr: 309 307 272 269 113 97 80 77 +tcsplit: 1099 1061 1060 1007 994 849 665 664 606 461 458 +tcsub: 1097 1096 1080 1079 1038 1006 891 863 856 735 729 434 434 430 404 403 399 374 288 218 218 218 216 216 214 210 204 47 +tcsubstanntree: 135 47 43 +tctdefsubst: 794 793 786 782 776 567 +tctreetoenv: 137 55 52 +tctvars: 1037 569 385 263 185 182 +tcunify: 929 755 751 731 323 303 299 296 294 293 291 290 285 282 278 +tcunifyl: 1076 320 316 301 297 +tcunifyset: 753 752 750 749 745 689 355 +tcunknowns: 1029 425 425 422 385 382 +tcvar: 879 873 521 518 +tdcnames: 740 720 609 608 599 +tdefs: 146 127 122 +tdefset: 825 823 821 819 +tdinuse: 740 739 708 701 684 680 659 657 653 608 605 604 602 +tds: 1093 1092 1090 1076 1075 1073 1058 1057 1056 1003 1002 1000 995 992 991 955 955 918 918 879 856 855 854 847 847 846 844 827 818 722 708 695 684 680 663 657 653 604 602 593 541 540 536 535 533 531 530 529 528 527 526 524 523 521 520 518 517 514 +tdsignature: 739 729 568 566 +te: 1097 1096 1080 1079 1029 1006 856 434 430 425 422 +texp: 569 569 569 +texpr: 247 247 +that: 715 +the: 717 717 716 716 715 714 714 712 712 712 711 710 683 682 682 681 681 655 654 654 598 597 596 594 571 565 565 562 559 +themselves: 562 +then: 822 820 656 600 535 338 284 203 124 +therein: 595 +these: 731 +this: 715 +tijp: 71 70 +times: 574 +tipe: 113 111 +tn: 568 560 555 +tname: 827 826 +to: 1038 902 899 894 727 714 712 712 709 709 704 703 689 688 687 685 685 681 655 597 595 574 270 +track: 378 +tree: 725 719 56 55 47 47 +ts: 1098 1095 1078 1076 1076 1075 1028 1026 1005 1002 863 862 301 301 299 299 216 216 188 188 102 102 99 98 +tvars: 710 189 189 189 188 188 187 185 +tvdict: 103 103 103 102 102 101 100 100 83 +tvl: 809 808 807 804 776 775 +tvn: 974 974 969 966 964 959 958 955 939 936 934 929 929 928 926 920 918 789 789 287 284 283 282 269 264 263 261 260 247 247 245 245 244 244 243 242 214 214 206 206 203 202 201 +tvn2: 245 245 244 244 243 242 +tvname: 99 98 98 96 83 83 +tvs: 739 738 572 568 563 +type: 1038 891 863 814 735 729 717 715 714 713 682 682 595 594 584 583 562 559 558 503 404 374 288 218 218 218 216 216 214 210 204 155 125 47 3 +typedef: 712 +types: 683 656 565 378 +u: 374 373 +undeclared: 621 +unified: 347 +unifiedolds: 341 339 338 +unifier: 683 681 +unifiers: 681 +unify: 324 323 321 306 +unknown: 710 +unknowns: 1037 1034 1029 1028 +unzip2: 609 544 543 538 +uol: 623 619 618 617 +up: 710 +us: 374 373 +use: 820 594 +used: 815 +usedc: 829 828 +utdomain: 353 +utlookup: 791 +utlookupall: 354 +utlookupdef: 619 418 206 +utrange: 425 +v: 60 23 23 +v5: 3 +var: 558 247 247 +variable: 418 +variables: 868 682 595 562 438 +vars: 595 558 +version: 4 +vl: 764 764 +vs: 141 32 32 +where: 1094 1077 1059 1035 1027 1004 993 968 956 938 919 892 880 848 824 788 754 721 686 664 658 603 557 542 537 489 462 405 352 340 322 286 205 186 140 133 126 82 57 22 7 +with: 806 558 308 +x: 1085 974 974 967 966 964 958 955 955 881 879 879 628 628 531 530 529 528 518 517 434 434 394 394 394 187 187 133 133 130 +x2: 131 +xs: 1093 1092 1090 1076 1075 1073 1067 1067 1062 1057 1056 1026 1026 1015 1014 1012 1005 1003 1002 1000 992 991 538 536 535 531 530 394 394 +y: 531 530 188 +ys: 394 394 +zip: 1076 1067 1036 1026 1015 893 776 764 720 720 607 607 351 301 diff --git a/testsuite/tests/programs/jules_xref2/test.T b/testsuite/tests/programs/jules_xref2/test.T new file mode 100644 index 0000000000..384155c8c7 --- /dev/null +++ b/testsuite/tests/programs/jules_xref2/test.T @@ -0,0 +1,6 @@ + +test('jules_xref2', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/launchbury/Main.hs b/testsuite/tests/programs/launchbury/Main.hs new file mode 100644 index 0000000000..6351d54aa7 --- /dev/null +++ b/testsuite/tests/programs/launchbury/Main.hs @@ -0,0 +1,18 @@ +e=181021504832735228091659724090293195791121747536890433 + +u(f,m)x=i(m(x), [],let(a,b)=f(x) in(a:u(f,m)b)) +(v,h)=(foldr(\x(y )->00+128*y+x)0,u( sp(25),((==)""))) +p::(Integer,Integer )->Integer -> Integer --NotInt +p(n,m)x =i(n==0 ,1,i(z n ,q(n,m)x, r(n,m)x)) +i(n,e,d )=if(n) then(e) else (d) --23+3d4f +(g,main ,s,un)= (\x->x, y(j),\x->x*x,unlines)--) +j(o)=i(take(2)o== "e=","e="++t (drop(4-2)o),i(d>e,k,l)o) +l=un.map (show.p (e,n).v.map( fromIntegral{-g-}.fromEnum)).h +k=co.map(map(toEnum .fromIntegral ).w.p(d,n). read).lines +(t,y)=(\ (o:q)-> i(o=='-' ,'1','-' ): q,interact) +q(n,m)x= mod(s( p( div(n)2, m{-jl-})x) )m--hd&&gdb +(r,z,co) =(\(n, m)x->mod(x*p(n-1, m)x)m,even ,concat)--6 +(w,sp)=( u(\x->( mod(x)128,div(x )128),(==0 )),splitAt) + +d=563347325936+1197371806136556985877790097-563347325936 +n=351189532146914946493104395525009571831256157560461451 diff --git a/testsuite/tests/programs/launchbury/Makefile b/testsuite/tests/programs/launchbury/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/launchbury/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/launchbury/launchbury.stdin b/testsuite/tests/programs/launchbury/launchbury.stdin new file mode 100644 index 0000000000..085b33d738 --- /dev/null +++ b/testsuite/tests/programs/launchbury/launchbury.stdin @@ -0,0 +1,18 @@ +e=181021504832735228091659724090293195791121747536890433 + +u(f,m)x=i(m(x), [],let(a,b)=f(x) in(a:u(f,m)b)) +(v,h)=(foldr(\x(y )->00+128*y+x)0,u( sp(25),((==)""))) +p::(Integer,Integer )->Integer -> Integer --NotInt +p(n,m)x =i(n==0 ,1,i(z n ,q(n,m)x, r(n,m)x)) +i(n,e,d )=if(n) then(e) else (d) --23+3d4f +(g,main ,s,un)= (\x->x, y(j),\x->x*x,unlines)--) +j(o)=i(take(2)o== "e=","e="++t (drop(4-2)o),i(d>e,k,l)o) +l=un.map (show.p (e,n).v.map( fromIntegral{-g-}.ord)).h +k=co.map(map(chr .fromIntegral ).w.p(d,n). read).lines +(t,y)=(\ (o:q)-> i(o=='-' ,'1','-' ): q,interact) +q(n,m)x= mod(s( p( div(n)2, m{-jl-})x) )m--hd&&gdb +(r,z,co) =(\(n, m)x->mod(x*p(n-1, m)x)m,even ,concat)--6 +(w,sp)=( u(\x->( mod(x)128,div(x )128),(==0 )),splitAt) + +d=563347325936+1197371806136556985877790097-563347325936 +n=351189532146914946493104395525009571831256157560461451 diff --git a/testsuite/tests/programs/launchbury/launchbury.stdout b/testsuite/tests/programs/launchbury/launchbury.stdout new file mode 100644 index 0000000000..9eb035733e --- /dev/null +++ b/testsuite/tests/programs/launchbury/launchbury.stdout @@ -0,0 +1,18 @@ +e=-81021504832735228091659724090293195791121747536890433 + +u(f,m)x=i(m(x), [],let(a,b)=f(x) in(a:u(f,m)b)) +(v,h)=(foldr(\x(y )->00+128*y+x)0,u( sp(25),((==)""))) +p::(Integer,Integer )->Integer -> Integer --NotInt +p(n,m)x =i(n==0 ,1,i(z n ,q(n,m)x, r(n,m)x)) +i(n,e,d )=if(n) then(e) else (d) --23+3d4f +(g,main ,s,un)= (\x->x, y(j),\x->x*x,unlines)--) +j(o)=i(take(2)o== "e=","e="++t (drop(4-2)o),i(d>e,k,l)o) +l=un.map (show.p (e,n).v.map( fromIntegral{-g-}.ord)).h +k=co.map(map(chr .fromIntegral ).w.p(d,n). read).lines +(t,y)=(\ (o:q)-> i(o=='-' ,'1','-' ): q,interact) +q(n,m)x= mod(s( p( div(n)2, m{-jl-})x) )m--hd&&gdb +(r,z,co) =(\(n, m)x->mod(x*p(n-1, m)x)m,even ,concat)--6 +(w,sp)=( u(\x->( mod(x)128,div(x )128),(==0 )),splitAt) + +d=563347325936+1197371806136556985877790097-563347325936 +n=351189532146914946493104395525009571831256157560461451 diff --git a/testsuite/tests/programs/launchbury/test.T b/testsuite/tests/programs/launchbury/test.T new file mode 100644 index 0000000000..937bb94a6e --- /dev/null +++ b/testsuite/tests/programs/launchbury/test.T @@ -0,0 +1,6 @@ + +test('launchbury', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/lennart_range/Main.hs b/testsuite/tests/programs/lennart_range/Main.hs new file mode 100644 index 0000000000..c45e4b2b36 --- /dev/null +++ b/testsuite/tests/programs/lennart_range/Main.hs @@ -0,0 +1,24 @@ +{- +Date: Thu, 22 Sep 1994 01:59:49 +0200 +From: Lennart Augustsson <augustss@cs.chalmers.se> +Message-Id: <199409212359.BAA01719@statler.cs.chalmers.se> +To: glasgow-haskell-bugs@dcs.glasgow.ac.uk +Subject: ghc bug + + +Some floating constants that are within the floating range +become wrong, e.g. + + 1.82173691287639817263897126389712638972163e-300::Double + + -- Lennart + +PS. Maybe you use fromRational as defined in the Prelude? +That won't do. It is badly broken, tell me if you want +one that works. +-} + +-- I have turned this into a general test of extreme constants. +-- WDP 94/12 + +main = putStr (shows (1.82173691287639817263897126389712638972163e-300::Double) "\n") diff --git a/testsuite/tests/programs/lennart_range/Makefile b/testsuite/tests/programs/lennart_range/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/lennart_range/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/lennart_range/lennart_range.stdout b/testsuite/tests/programs/lennart_range/lennart_range.stdout new file mode 100644 index 0000000000..5196dcc970 --- /dev/null +++ b/testsuite/tests/programs/lennart_range/lennart_range.stdout @@ -0,0 +1 @@ +1.821736912876398e-300 diff --git a/testsuite/tests/programs/lennart_range/test.T b/testsuite/tests/programs/lennart_range/test.T new file mode 100644 index 0000000000..f308f0039d --- /dev/null +++ b/testsuite/tests/programs/lennart_range/test.T @@ -0,0 +1,6 @@ + +test('lennart_range', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/lex/Main.hs b/testsuite/tests/programs/lex/Main.hs new file mode 100644 index 0000000000..4c9a44802d --- /dev/null +++ b/testsuite/tests/programs/lex/Main.hs @@ -0,0 +1,9 @@ +module Main where + +main = interact ( \ s -> shows (lex' s) "\n") + where lex' "" = [] + lex' s = tok : lex' s' where -- [(tok,s')] = lex s + (tok,s') = case lex s of + [r] -> r + [] -> error ("Empty: " ++ s) + other -> error ("Multi: " ++ s) diff --git a/testsuite/tests/programs/lex/Makefile b/testsuite/tests/programs/lex/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/lex/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/lex/lex.stdin b/testsuite/tests/programs/lex/lex.stdin new file mode 100644 index 0000000000..dcd009c41b --- /dev/null +++ b/testsuite/tests/programs/lex/lex.stdin @@ -0,0 +1,170 @@ +module Graph where + +import Parse +import StdLib +import PSlib +import GRIP + +paperX = 280::Int +paperY = 190::Int + +fromInt :: Num a => Int -> a +fromInt = fromInteger . toInteger + +gspostscript str = initialise stdheader ++ portrait ++ str ++ "showpage\n" +postscript str = initialise stdheader ++ landscape ++ str ++ "showpage\n" + +ePostscript (reqdx,reqdy) str = initialise (stdheader++ + "%%BoundingBox: 0 0 "++show (cms2pts reqdx)++" "++show (cms2pts reqdy)++"\n" + ++ "%%EndComments\n") + ++ scale (fromInt reqdx*10/fromInt paperX) (fromInt reqdy*10/fromInt paperY) ++ str ++ + showpage + +initGraph title pedata (topX,topY) (xlabel,ylabel) keys = + drawBox (Pt 0 0) paperX paperY ++ + drawBox (Pt 1 1) (paperX-2) 5 ++ + drawBox (Pt 1 (paperY-7)) (paperX-2) 6 ++ + setfont "BOLD" ++ moveto (Pt (paperX `div` 2) (paperY-6)) ++ cjustify (title) ++ + setfont "NORM" ++ + placePEs pedata ++ + translate 20 25 ++ + newpath ++ moveto (Pt 0 (-5)) ++ lineto (Pt 0 dimY) ++ + moveto (Pt (-5) 0) ++ lineto (Pt dimX 0) ++ stroke ++ + setfont "SMALL" ++ + markXAxis dimX topX++ + markYAxis dimY topY++ + moveto (Pt 0 (dimY+4)) ++ rjustify ylabel ++ stroke ++ + moveto (Pt dimX (-8)) ++ rjustify xlabel ++ stroke ++ + setfont "NORM" ++ + dokeys dimX keys + +placePEs (pes,on) | checkPEs (tail pes) on = + showActive (length pes) (length used) ++ + showUsed pes used ++ setfont "NORM" + where used = if on==[] then tail pes else on + + +cms2pts :: Int -> Int +cms2pts x = round (28.4584 * fromInt x) + +plotCurve :: Int -> [Point] -> Postscript +plotCurve x pts = setgray x ++ fillObject pts + +plot :: [Point] -> Postscript +plot points = plotCurve 5 (Pt 0 0:points) + +dokeys left keys = concat (map2 format (places 0) keys) + where + format pt@(Pt x y) (col,tex,pc) = fillBox pt 16 9 col ++ stroke ++ moveto (Pt (x+17) (y+3)) + ++ text tex ++ stroke ++ moveto (Pt (x+8) (y+3)) ++ + inv col ++ setfont "BOLD" ++ cjustify (pc) ++ + stroke ++ setfont "NORM" ++ setgray 10 + no=left `div` length keys + places n | n == no = [] + places n = (Pt (n*no) (-17)):places (n+1) + +showActive t f = + setfont "LARGE" ++ moveto (Pt 10 16) ++ cjustify (show f) ++ + setfont "SMALL" ++ moveto (Pt 10 12) ++ cjustify "PE(s)" ++ stroke ++ + setfont "SMALL" ++ moveto (Pt 10 8) ++ cjustify "displayed" ++ stroke ++ + setfont "NORM" + +showUsed (m:pes) on = moveto (Pt 2 2) ++ setfont "SMALL" ++ text "Configuration:" ++ + dopes (paperX-27) (("SMALLITALIC",showPE m):map f pes) ++ stroke + where + f pe | elem pe on = ("SMALLBOLD",showPE pe) + | otherwise = ("SMALL",showPE pe) + +dopes left pes = concat (map2 format (places 0) pes) + where + format pt@(Pt x y) (font,tex) = setfont font ++ moveto pt ++ text tex ++ stroke + no=left `div` ((length pes*2)+1) + f x = (no*((x*2)+1)) + 27 + places n | n>2*no = [] + places n = (Pt (f n) 2):places (n+1) + + + +checkPEs pes [] = True +checkPEs pes (p:ps) | elem p pes = checkPEs pes ps + | otherwise = error ("Attempt to gather information from inactive PE - "++ showPE p) + +showPE :: PElement -> String +showPE (PE str no) = str++"."++show no + +inv x | x>=5 = setgray 0 + | otherwise = setgray 10 + +dimX = paperX-30 +dimY = paperY-40 + +markXAxis :: Int -> Int -> Postscript +markXAxis dimX maxX = label 10 ++ markOnX 100 + where + label 0 = "" + label x = newpath ++ moveto (Pt (notch x) 0) ++ rlineto 0 (-2) ++ + moveto (Pt (notch x) (-5)) ++ + cjustify (printFloat (t x)) ++ stroke ++ label (x-1) + t x = fromInt x*(fromInt maxX / fromInt 10) + notch x = x*(dimX `div` 10) + +markOnX n = mapcat notches [1..n] ++ stroke + where + notches n = movetofloat (m*fromInt n) 0 ++ (rlineto 0 (-1)) ++ stroke + m = fromInt dimX/fromInt n + + +markYAxis :: Int -> Int -> Postscript +markYAxis dimY maxY = label 10 ++ markOnY (calibrate maxY) + where + label 0 = "" + label x = newpath ++ moveto (Pt 0 (notch x)) ++ rlineto (-2) 0 ++ + moveto (Pt (-3) (notch x)) ++ + rjustify (printFloat (t x)) ++ stroke ++ label (x-1) + t x = fromInt x*(fromInt maxY / fromInt 10) + notch x = x*(dimY `div` 10) + +calibrate x | x<=1 = 1 + | x<=100 = x + | otherwise = calibrate (x `div` 10) + +markOnY n = mapcat notches [1..n] ++ stroke + where + notches n = movetofloat 0 (m*fromInt n) ++ (rlineto (-1) 0) + m = fromInt dimY/fromInt n + +movetofloat x y = show x ++ " " ++ show y ++ " moveto\n" + + +determineScale :: [Point] -> (Int,Int) +determineScale pts = (axisScale x, axisScale y) + where (min,Pt x y) = minandmax pts + +axisScale :: Int -> Int +axisScale x = axisScale' x 1 +axisScale' x m | x <= m = m + | x <= m*2 = m*2 + | x <= m*5 = m*5 + | x <= m*10 = m*10 + | otherwise = axisScale' x (m*10) + +minandmax :: [Point] -> (Point,Point) +minandmax [] = error "No points" +minandmax (p:ps) = f (p,p) ps + where + f p [] = p + f (Pt minx miny,Pt maxx maxy) (Pt x y:ps) = f (Pt minx' miny',Pt maxx' maxy') ps + where minx' = min x minx + miny' = min y miny + maxx' = max x maxx + maxy' = max y maxy + + +printFloat :: Float -> String +printFloat x = f (show (round (x*10))) + where + f "0" = "0" + f r | x<1 = "0."++r + f (r:"0") | x<10 = [r] + f (r:m) | x<10 = r:'.':m + f _ = show (round x) diff --git a/testsuite/tests/programs/lex/lex.stdout b/testsuite/tests/programs/lex/lex.stdout new file mode 100644 index 0000000000..e1e9e468d1 --- /dev/null +++ b/testsuite/tests/programs/lex/lex.stdout @@ -0,0 +1 @@ +["module","Graph","where","import","Parse","import","StdLib","import","PSlib","import","GRIP","paperX","=","280","::","Int","paperY","=","190","::","Int","fromInt","::","Num","a","=>","Int","->","a","fromInt","=","fromInteger",".","toInteger","gspostscript","str","=","initialise","stdheader","++","portrait","++","str","++","\"showpage\\n\"","postscript","str","=","initialise","stdheader","++","landscape","++","str","++","\"showpage\\n\"","ePostscript","(","reqdx",",","reqdy",")","str","=","initialise","(","stdheader","++","\"%%BoundingBox: 0 0 \"","++","show","(","cms2pts","reqdx",")","++","\" \"","++","show","(","cms2pts","reqdy",")","++","\"\\n\"","++","\"%%EndComments\\n\"",")","++","scale","(","fromInt","reqdx","*","10","/","fromInt","paperX",")","(","fromInt","reqdy","*","10","/","fromInt","paperY",")","++","str","++","showpage","initGraph","title","pedata","(","topX",",","topY",")","(","xlabel",",","ylabel",")","keys","=","drawBox","(","Pt","0","0",")","paperX","paperY","++","drawBox","(","Pt","1","1",")","(","paperX","-","2",")","5","++","drawBox","(","Pt","1","(","paperY","-","7",")",")","(","paperX","-","2",")","6","++","setfont","\"BOLD\"","++","moveto","(","Pt","(","paperX","`","div","`","2",")","(","paperY","-","6",")",")","++","cjustify","(","title",")","++","setfont","\"NORM\"","++","placePEs","pedata","++","translate","20","25","++","newpath","++","moveto","(","Pt","0","(","-","5",")",")","++","lineto","(","Pt","0","dimY",")","++","moveto","(","Pt","(","-","5",")","0",")","++","lineto","(","Pt","dimX","0",")","++","stroke","++","setfont","\"SMALL\"","++","markXAxis","dimX","topX","++","markYAxis","dimY","topY","++","moveto","(","Pt","0","(","dimY","+","4",")",")","++","rjustify","ylabel","++","stroke","++","moveto","(","Pt","dimX","(","-","8",")",")","++","rjustify","xlabel","++","stroke","++","setfont","\"NORM\"","++","dokeys","dimX","keys","placePEs","(","pes",",","on",")","|","checkPEs","(","tail","pes",")","on","=","showActive","(","length","pes",")","(","length","used",")","++","showUsed","pes","used","++","setfont","\"NORM\"","where","used","=","if","on","==","[","]","then","tail","pes","else","on","cms2pts","::","Int","->","Int","cms2pts","x","=","round","(","28.4584","*","fromInt","x",")","plotCurve","::","Int","->","[","Point","]","->","Postscript","plotCurve","x","pts","=","setgray","x","++","fillObject","pts","plot","::","[","Point","]","->","Postscript","plot","points","=","plotCurve","5","(","Pt","0","0",":","points",")","dokeys","left","keys","=","concat","(","map2","format","(","places","0",")","keys",")","where","format","pt","@","(","Pt","x","y",")","(","col",",","tex",",","pc",")","=","fillBox","pt","16","9","col","++","stroke","++","moveto","(","Pt","(","x","+","17",")","(","y","+","3",")",")","++","text","tex","++","stroke","++","moveto","(","Pt","(","x","+","8",")","(","y","+","3",")",")","++","inv","col","++","setfont","\"BOLD\"","++","cjustify","(","pc",")","++","stroke","++","setfont","\"NORM\"","++","setgray","10","no","=","left","`","div","`","length","keys","places","n","|","n","==","no","=","[","]","places","n","=","(","Pt","(","n","*","no",")","(","-","17",")",")",":","places","(","n","+","1",")","showActive","t","f","=","setfont","\"LARGE\"","++","moveto","(","Pt","10","16",")","++","cjustify","(","show","f",")","++","setfont","\"SMALL\"","++","moveto","(","Pt","10","12",")","++","cjustify","\"PE(s)\"","++","stroke","++","setfont","\"SMALL\"","++","moveto","(","Pt","10","8",")","++","cjustify","\"displayed\"","++","stroke","++","setfont","\"NORM\"","showUsed","(","m",":","pes",")","on","=","moveto","(","Pt","2","2",")","++","setfont","\"SMALL\"","++","text","\"Configuration:\"","++","dopes","(","paperX","-","27",")","(","(","\"SMALLITALIC\"",",","showPE","m",")",":","map","f","pes",")","++","stroke","where","f","pe","|","elem","pe","on","=","(","\"SMALLBOLD\"",",","showPE","pe",")","|","otherwise","=","(","\"SMALL\"",",","showPE","pe",")","dopes","left","pes","=","concat","(","map2","format","(","places","0",")","pes",")","where","format","pt","@","(","Pt","x","y",")","(","font",",","tex",")","=","setfont","font","++","moveto","pt","++","text","tex","++","stroke","no","=","left","`","div","`","(","(","length","pes","*","2",")","+","1",")","f","x","=","(","no","*","(","(","x","*","2",")","+","1",")",")","+","27","places","n","|","n",">","2","*","no","=","[","]","places","n","=","(","Pt","(","f","n",")","2",")",":","places","(","n","+","1",")","checkPEs","pes","[","]","=","True","checkPEs","pes","(","p",":","ps",")","|","elem","p","pes","=","checkPEs","pes","ps","|","otherwise","=","error","(","\"Attempt to gather information from inactive PE - \"","++","showPE","p",")","showPE","::","PElement","->","String","showPE","(","PE","str","no",")","=","str","++","\".\"","++","show","no","inv","x","|","x",">=","5","=","setgray","0","|","otherwise","=","setgray","10","dimX","=","paperX","-","30","dimY","=","paperY","-","40","markXAxis","::","Int","->","Int","->","Postscript","markXAxis","dimX","maxX","=","label","10","++","markOnX","100","where","label","0","=","\"\"","label","x","=","newpath","++","moveto","(","Pt","(","notch","x",")","0",")","++","rlineto","0","(","-","2",")","++","moveto","(","Pt","(","notch","x",")","(","-","5",")",")","++","cjustify","(","printFloat","(","t","x",")",")","++","stroke","++","label","(","x","-","1",")","t","x","=","fromInt","x","*","(","fromInt","maxX","/","fromInt","10",")","notch","x","=","x","*","(","dimX","`","div","`","10",")","markOnX","n","=","mapcat","notches","[","1","..","n","]","++","stroke","where","notches","n","=","movetofloat","(","m","*","fromInt","n",")","0","++","(","rlineto","0","(","-","1",")",")","++","stroke","m","=","fromInt","dimX","/","fromInt","n","markYAxis","::","Int","->","Int","->","Postscript","markYAxis","dimY","maxY","=","label","10","++","markOnY","(","calibrate","maxY",")","where","label","0","=","\"\"","label","x","=","newpath","++","moveto","(","Pt","0","(","notch","x",")",")","++","rlineto","(","-","2",")","0","++","moveto","(","Pt","(","-","3",")","(","notch","x",")",")","++","rjustify","(","printFloat","(","t","x",")",")","++","stroke","++","label","(","x","-","1",")","t","x","=","fromInt","x","*","(","fromInt","maxY","/","fromInt","10",")","notch","x","=","x","*","(","dimY","`","div","`","10",")","calibrate","x","|","x","<=","1","=","1","|","x","<=","100","=","x","|","otherwise","=","calibrate","(","x","`","div","`","10",")","markOnY","n","=","mapcat","notches","[","1","..","n","]","++","stroke","where","notches","n","=","movetofloat","0","(","m","*","fromInt","n",")","++","(","rlineto","(","-","1",")","0",")","m","=","fromInt","dimY","/","fromInt","n","movetofloat","x","y","=","show","x","++","\" \"","++","show","y","++","\" moveto\\n\"","determineScale","::","[","Point","]","->","(","Int",",","Int",")","determineScale","pts","=","(","axisScale","x",",","axisScale","y",")","where","(","min",",","Pt","x","y",")","=","minandmax","pts","axisScale","::","Int","->","Int","axisScale","x","=","axisScale'","x","1","axisScale'","x","m","|","x","<=","m","=","m","|","x","<=","m","*","2","=","m","*","2","|","x","<=","m","*","5","=","m","*","5","|","x","<=","m","*","10","=","m","*","10","|","otherwise","=","axisScale'","x","(","m","*","10",")","minandmax","::","[","Point","]","->","(","Point",",","Point",")","minandmax","[","]","=","error","\"No points\"","minandmax","(","p",":","ps",")","=","f","(","p",",","p",")","ps","where","f","p","[","]","=","p","f","(","Pt","minx","miny",",","Pt","maxx","maxy",")","(","Pt","x","y",":","ps",")","=","f","(","Pt","minx'","miny'",",","Pt","maxx'","maxy'",")","ps","where","minx'","=","min","x","minx","miny'","=","min","y","miny","maxx'","=","max","x","maxx","maxy'","=","max","y","maxy","printFloat","::","Float","->","String","printFloat","x","=","f","(","show","(","round","(","x","*","10",")",")",")","where","f","\"0\"","=","\"0\"","f","r","|","x","<","1","=","\"0.\"","++","r","f","(","r",":","\"0\"",")","|","x","<","10","=","[","r","]","f","(","r",":","m",")","|","x","<","10","=","r",":","'.'",":","m","f","_","=","show","(","round","x",")",""] diff --git a/testsuite/tests/programs/lex/test.T b/testsuite/tests/programs/lex/test.T new file mode 100644 index 0000000000..da6e227a68 --- /dev/null +++ b/testsuite/tests/programs/lex/test.T @@ -0,0 +1,6 @@ + +test('lex', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/life_space_leak/Main.hs b/testsuite/tests/programs/life_space_leak/Main.hs new file mode 100644 index 0000000000..b794a3779a --- /dev/null +++ b/testsuite/tests/programs/life_space_leak/Main.hs @@ -0,0 +1,360 @@ +-------------------------------- +-- The Game of Life -- +-------------------------------- + +generations x = 30 + +data L a = N | C1 a (L a) | C2 a a (L a) + +data Tuple2 a b = T2 a b + +data Tuple3 a b c = T3 a b c + + +main = putStr (listChar_string + (append1 (C1 '\FF' N) + (life1 (generations ()) (start ())))) + +listChar_string :: L Char -> String +listChar_string N = [] +listChar_string (C1 x xs) = x : listChar_string xs + +start :: a -> L (L Int) +start x = (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 N + (C1 + (C1 0 + (C1 0 + (C1 0 + (C1 1 + (C1 1 + (C1 1 + (C1 1 + (C1 1 + (C1 0 + (C1 1 + (C1 1 + (C1 1 + (C1 1 + (C1 1 + (C1 0 + (C1 1 + (C1 1 + (C1 1 + (C1 1 + (C1 1 + (C1 0 + (C1 1 + (C1 1 + (C1 1 + (C1 1 + (C1 1 + (C1 0 N))))))))))))))))))))))))))) N))))))))))))))) + +-- Calculating the next generation + +gen1 :: Int -> L (L Int) -> L (L Int) +gen1 n board = map1 row1 (shift1 (copy1 n 0) board) + +row1 :: Tuple3 (L Int) (L Int) (L Int) -> L Int +row1 (T3 last this next) + = zipWith31 elt1 (shift2 0 last) + (shift2 0 this) + (shift2 0 next) + + +elt1 :: Tuple3 Int Int Int + -> (Tuple3 Int Int Int) + -> (Tuple3 Int Int Int) -> Int +elt1 (T3 a b c) (T3 d e f) (T3 g h i) + = if (not (eq tot 2)) + && (not (eq tot 3)) + then 0 + else if (eq tot 3) then 1 else e + where tot = a `plus` b `plus` c `plus` d + `plus` f `plus` g `plus` h `plus` i + +eq :: Int -> Int -> Bool +eq x y = x == y + +plus :: Int -> Int -> Int +plus x y = x + y + +shiftr1 :: L Int -> L (L Int) -> L (L Int) +shiftr1 x xs = append2 (C1 x N) (init1 xs) + +shiftl1 :: L Int -> L (L Int) -> L (L Int) +shiftl1 x xs = append2 (tail1 xs) (C1 x N) + +shift1 :: L Int -> L (L Int) + -> L (Tuple3 (L Int) (L Int) (L Int)) +shift1 x xs = zip31 (shiftr1 x xs) xs (shiftl1 x xs) + +shiftr2 :: Int -> L Int -> L Int +shiftr2 x xs = append3 (C1 x N) (init2 xs) + +shiftl2 :: Int -> L Int -> L Int +shiftl2 x xs = append3 (tail2 xs) (C1 x N) + +shift2 :: Int -> L Int -> L (Tuple3 Int Int Int) +shift2 x xs = zip32 (shiftr2 x xs) xs (shiftl2 x xs) + +-- copy + +copy1 :: Int -> Int -> L Int +copy1 0 x = N +copy1 n x = C1 x (copy1 (n-1) x) + +copy2 :: Int -> L Int -> L (L Int) +copy2 0 x = N +copy2 n x = C1 x (copy2 (n-1) x) + +copy3 :: Int -> Char -> L Char +copy3 0 x = N +copy3 n x = C1 x (copy3 (n-1) x) + +-- Displaying one generation + +disp1 :: (Tuple2 (L Char) (L (L Int))) -> L Char +disp1 (T2 gen xss) + = append1 gen + (append1 (C1 '\n' (C1 '\n' N)) + (foldr_1 (glue1 (C1 '\n' N)) N + (map4 (compose2 concat1 (map2 star1)) xss))) + +star1 :: Int -> L Char +star1 i = case i of + 0 -> C1 ' ' (C1 ' ' N) + 1 -> C1 ' ' (C1 'o' N) + +glue1 :: L Char -> L Char -> L Char -> L Char +glue1 s xs ys = append1 xs (append1 s ys) + +-- Generating and displaying a sequence of generations + +life1 :: Int -> L (L Int) -> L Char +life1 n xss + = foldr_1 (glue1 (copy3 (n+2) '\VT')) N + (map5 disp1 + (zip1_ (map6 (string_ListChar.show) (ints 0)) + gens)) + where + gens = take3 (100 {-740-}::Int) (iterate1 (gen1 n) (initial1 n xss)) + +ints :: Int -> L Int +ints x = C1 x (ints (x+1)) + +string_ListChar :: String -> L Char +string_ListChar [] = N +string_ListChar (x:xs) = C1 x (string_ListChar xs) + +initial1 :: Int -> L (L Int) -> L (L Int) +initial1 n xss = take1 n (append2 (map3 (compose1 (take2 n) + (`append3` (copy1 n 0))) xss) + (copy2 n (copy1 n 0))) + +iterate1 :: (L (L Int) -> L (L Int)) + -> L (L Int) -> L (L (L Int)) +iterate1 f x = C1 x (iterate1 f (f x)) + +-- versions of built in functions + +-- take +take1 :: Int -> L (L Int) -> L (L Int) +take1 0 _ = N +take1 _ N = N +--should be:take1 (n+1) (C1 x xs) = C1 x (take1 n xs) +take1 n (C1 x xs) | n < 0 = error "Main.take1" + | otherwise = C1 x (take1 (n-1) xs) + +take2 :: Int -> L Int -> L Int +take2 0 _ = N +take2 _ N = N +--should be:take2 (n+1) (C1 x xs) = C1 x (take2 n xs) +take2 n (C1 x xs) | n < 0 = error "Main.take2" + | otherwise = C1 x (take2 (n-1) xs) + +take3 :: Int -> L (L (L Int)) + -> L (L (L Int)) +take3 0 _ = N +take3 _ N = N +take3 n (C1 x xs) = C1 x (take3 (n-1) xs) + +-- init + +init1 :: L (L Int) -> L (L Int) +init1 (C1 x N) = N +init1 (C1 x xs) = C1 x (init1 xs) +init1 N = error "init1 got a bad list" + +init2 :: L Int -> L Int +init2 (C1 x N) = N +init2 (C1 x xs) = C1 x (init2 xs) +init2 N = error "init1 got a bad list" + +-- tail + +tail1 :: L (L Int) -> L (L Int) +tail1 (C1 _ xs) = xs +tail1 N = error "tail1 got a bad list" + +tail2 :: L Int -> L Int +tail2 (C1 _ xs) = xs +tail2 N = error "tail2 got a bad list" + +-- maps + +map1 :: (Tuple3 (L Int) (L Int) (L Int) -> L Int) -> + L (Tuple3 (L Int) (L Int) (L Int)) + -> L (L Int) +map1 f N = N +map1 f (C1 x xs) = C1 (f x) (map1 f xs) + +map2 :: (Int -> L Char) -> L Int -> L (L Char) +map2 f N = N +map2 f (C1 x xs) = C1 (f x) (map2 f xs) + +map3 :: (L Int -> L Int) -> L (L Int) -> L (L Int) +map3 f N = N +map3 f (C1 x xs) = C1 (f x) (map3 f xs) + +map4 :: (L Int -> L Char) + -> L (L Int) -> L (L Char) +map4 f N = N +map4 f (C1 x xs) = C1 (f x) (map4 f xs) + +map5 :: (Tuple2 (L Char) (L (L Int)) -> L Char) + -> L (Tuple2 (L Char) (L (L Int))) + -> L (L Char) +map5 f N = N +map5 f (C1 x xs) = C1 (f x) (map5 f xs) + +map6 :: (Int -> L Char) -> L Int -> L (L Char) +map6 f N = N +map6 f (C1 x xs) = C1 (f x) (map6 f xs) + +-- compose + +compose2 :: (L (L Char) -> L Char) + -> (L Int -> L (L Char)) + -> L Int -> L Char +compose2 f g xs = f (g xs) + +compose1 :: (L Int -> L Int) + -> (L Int -> L Int) -> L Int -> L Int +compose1 f g xs = f (g xs) + +-- concat + +concat1 :: L (L Char) -> L Char +concat1 = foldr_1 append1 N + +-- foldr + +foldr_1 :: (L Char -> L Char -> L Char) + -> L Char -> L (L Char) -> L Char +foldr_1 f a N = a +foldr_1 f a (C1 x xs) = f x (foldr_1 f a xs) + +-- appends + +append1 :: L Char -> L Char -> L Char +append1 N ys = ys +append1 (C1 x xs) ys = C1 x (append1 xs ys) + +append2 :: L (L Int) -> L (L Int) -> L (L Int) +append2 N ys = ys +append2 (C1 x xs) ys = C1 x (append2 xs ys) + +append3 :: L Int -> L Int -> L Int +append3 N ys = ys +append3 (C1 x xs) ys = C1 x (append3 xs ys) + +-- zips + +pzip f (C1 x1 xs) (C1 y1 ys) + = C1 (f x1 y1) (pzip f xs ys) +pzip f _ _ = N + + +zip1_ :: L (L Char) + -> L (L (L Int)) + -> L (Tuple2 (L Char) (L (L Int))) +zip1_ = pzip T2 + +zip2_ :: L (L Int) + -> L (L Int) + -> L (Tuple2 (L Int) (L Int)) +zip2_ = pzip T2 + +zip3d :: L Int -> (Tuple2 (L Int) (L Int)) + -> (Tuple3 (L Int) (L Int) (L Int)) +zip3d x (T2 y z) = T3 x y z + +zip3_ :: L (L Int) + -> L (Tuple2 (L Int) (L Int)) + -> L (Tuple3 (L Int) (L Int) (L Int)) +zip3_ = pzip zip3d + +zip4_ :: L Int + -> L Int + -> L (Tuple2 Int Int) +zip4_ = pzip T2 + +zip5d :: Int -> (Tuple2 Int Int) -> (Tuple3 Int Int Int) +zip5d x (T2 y z) = T3 x y z + +zip5_ :: L Int + -> L (Tuple2 Int Int) + -> L (Tuple3 Int Int Int) +zip5_ = pzip zip5d + +zip6_ :: L (Tuple3 Int Int Int) + -> L (Tuple3 Int Int Int) + -> L (Tuple2 (Tuple3 Int Int Int) + (Tuple3 Int Int Int)) +zip6_ = pzip T2 + +zip31 :: L (L Int) -> L (L Int) + -> L (L Int) + -> L (Tuple3 (L Int) (L Int) (L Int)) +zip31 as bs cs + = zip3_ as (zip2_ bs cs) + +zip32 :: L Int -> L Int -> L Int + -> L (Tuple3 Int Int Int) +zip32 as bs cs + = zip5_ as (zip4_ bs cs) + +-- zipWith + +zipWith21 :: ((Tuple3 Int Int Int) + -> (Tuple2 (Tuple3 Int Int Int) + (Tuple3 Int Int Int)) -> Int) + -> L (Tuple3 Int Int Int) + -> L (Tuple2 (Tuple3 Int Int Int) + (Tuple3 Int Int Int)) + -> L Int +zipWith21 = pzip + +zipWith31 :: ((Tuple3 Int Int Int) + -> (Tuple3 Int Int Int) + -> (Tuple3 Int Int Int) -> Int) + -> L (Tuple3 Int Int Int) + -> L (Tuple3 Int Int Int) + -> L (Tuple3 Int Int Int) -> L Int +zipWith31 z as bs cs + = zipWith21 z' as (zip6_ bs cs) + where z' a (T2 b c) = z a b c diff --git a/testsuite/tests/programs/life_space_leak/Makefile b/testsuite/tests/programs/life_space_leak/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/life_space_leak/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/life_space_leak/life.test b/testsuite/tests/programs/life_space_leak/life.test new file mode 100644 index 0000000000..41d7928373 --- /dev/null +++ b/testsuite/tests/programs/life_space_leak/life.test @@ -0,0 +1,17 @@ +#! /bin/sh +# +./life_space_leak | sum > /tmp/sum-real-$$ + +cat > ./sum-expected-$$ << EOTHING +02845 1350 +EOTHING + +if cmp -s ./sum-real-$$ ./sum-expected-$$ ; then + /bin/rm ./sum*$$ + exit 0 +else + echo -n '*** sum I got: ' ; cat ./sum-real-$$ + echo -n '*** sum I expected: ' ; cat ./sum-expected-$$ + /bin/rm ./sum*$$ + exit 1 +fi diff --git a/testsuite/tests/programs/life_space_leak/life_space_leak.stdout b/testsuite/tests/programs/life_space_leak/life_space_leak.stdout new file mode 100644 index 0000000000..efb639a1c5 --- /dev/null +++ b/testsuite/tests/programs/life_space_leak/life_space_leak.stdout @@ -0,0 +1,3201 @@ +0 + + + + + + + + + + + + + + + + o o o o o o o o o o o o o o o o o o o o + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + + + + o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o + + + + + + + + + + + + + + +2 + + + + + + + + + + + + + + o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o + + + + + + + + + + + + + +3 + + + + + + + + + + + + + + o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o + + + + + + + + + + + + + +4 + + + + + + + + + + + + + + o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o + + + + + + + + + + + + + +5 + + + + + + + + + + + + + o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o + + + + + + + + + + + + +6 + + + + + + + + + + + + + o o o o o o o o o o o o + + o o o o o o o o + o o o o o o o o + o o o o o o o o + + o o o o o o o o o o o o + + + + + + + + + + + + +7 + + + + + + + + + + + + o o o o + o o o o + o o o o o o o o o o + + o o o o o o o o o o o o o o o o o o + + o o o o o o o o o o + o o o o + o o o o + + + + + + + + + + + +8 + + + + + + + + + + + + + o o o o + o o o o o o o o o o + o o o o o o o o o o + o o + o o o o o o o o o o + o o o o o o o o o o + o o o o + + + + + + + + + + + + +9 + + + + + + + + + + + + + o o o o o o o o + o o o o o o + o o o o o o o o + o o o o o o + o o o o o o o o + o o o o o o + o o o o o o o o + + + + + + + + + + + + +10 + + + + + + + + + + + + o o + o o o o o o o o + o o o o + o o o o o o + o o o o + o o o o o o + o o o o + o o o o o o o o + o o + + + + + + + + + + + +11 + + + + + + + + + + + + o o + o o o o o o o o + o o o o o o + o o + o o o o + o o + o o o o o o + o o o o o o o o + o o + + + + + + + + + + + +12 + + + + + + + + + + + + o o + o o o o o o o o o o o o + o o + + + + o o + o o o o o o o o o o o o + o o + + + + + + + + + + + +13 + + + + + + + + + + + + o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o + + + + o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o + + + + + + + + + + + +14 + + + + + + + + + + + o o + o o o o o o o o o o + + o o o o o o o o o o + o o + + o o + o o o o o o o o o o + + o o o o o o o o o o + o o + + + + + + + + + + +15 + + + + + + + + + + + o o o o + o o o o + o o o o o o o o + o o o o + o o o o + + o o o o + o o o o + o o o o o o o o + o o o o + o o o o + + + + + + + + + + +16 + + + + + + + + + + + + o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o + + + + o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o + + + + + + + + + + + +17 + + + + + + + + + + + o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o + + o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o + + + + + + + + + + +18 + + + + + + + + + + + o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o + + o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o + + + + + + + + + + +19 + + + + + + + + + + + o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o + + o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o + + + + + + + + + + +20 + + + + + + + + + + o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o + + o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o + + + + + + + + + +21 + + + + + + + + + + o o o o o o o o o o o o + + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o + + o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + + o o o o o o o o o o o o + + + + + + + + + +22 + + + + + + + + + o o o o + o o o o + o o o o o o o o o o + + o o o o o o o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o + + o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o o o o o o o + + o o o o o o o o o o + o o o o + o o o o + + + + + + + + +23 + + + + + + + + + + o o o o + o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o o o + + o o o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o + o o o o + + + + + + + + + +24 + + + + + + + + + + o o o o o o o o + o o o o o o + o o o o o o o o + o o o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o + + o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o o o + o o o o o o o o + o o o o o o + o o o o o o o o + + + + + + + + + +25 + + + + + + + + + o o + o o o o o o o o + o o o o o o o o o o + o o o o + o o o o o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o + + o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o o o o o + o o o o + o o o o o o o o o o + o o o o o o o o + o o + + + + + + + + +26 + + + + + + + + + o o + o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o o o + o o o o o o o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o + + o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o o o o o o o + o o o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o + o o + + + + + + + + +27 + + + + + + + + + o o + o o o o o o o o o o o o + o o o o o o o o + o o o o o o + o o o o + o o o o o o o o + o o o o o o o o o o o o + + o o o o o o o o o o o o + o o o o o o o o + o o o o + o o o o o o + o o o o o o o o + o o o o o o o o o o o o + o o + + + + + + + + +28 + + + + + + + + + o o o o o o o o + o o o o + o o o o o o + o o o o + o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o + + o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o + o o o o + o o o o o o + o o o o + o o o o o o o o + + + + + + + + +29 + + + + + + + + o o + o o o o o o + o o o o o o + o o o o + o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o + + o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o + o o o o + o o o o o o + o o o o o o + o o + + + + + + + +30 + + + + + + + + + o o o o o o + o o o o o o + o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o + o o o o o o + + o o o o o o + o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o + o o o o o o + o o o o o o + + + + + + + + +31 + + + + + + + + + o o o o o o + o o o o + o o o o o o o o + o o o o + o o o o o o o o o o o o + o o o o o o + o o o o + + o o o o + o o o o o o + o o o o o o o o o o o o + o o o o + o o o o o o o o + o o o o + o o o o o o + + + + + + + + +32 + + + + + + + + o o + o o + o o o o o o o o + o o o o + o o o o o o o o o o o o + o o o o o o + o o o o o o o o o o + o o + + o o + o o o o o o o o o o + o o o o o o + o o o o o o o o o o o o + o o o o + o o o o o o o o + o o + o o + + + + + + + +33 + + + + + + + + + o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o + o o o o + o o o o o o o o + o o o o + + o o o o + o o o o o o o o + o o o o + o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o + + + + + + + + +34 + + + + + + + + o o + o o o o o o o o + o o o o o o + o o o o o o + o o o o o o o o o o + o o o o o o + o o o o o o + o o o o o o o o + + o o o o o o o o + o o o o o o + o o o o o o + o o o o o o o o o o + o o o o o o + o o o o o o + o o o o o o o o + o o + + + + + + + +35 + + + + + + + + o o o o o o + o o o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o + o o o o + o o o o + o o o o o o + + o o o o o o + o o o o + o o o o + o o o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o o o + o o o o o o + + + + + + + +36 + + + + + + + o o + o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o + + o o o o o o o o + o o + + o o + o o o o o o o o + + o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o + o o + + + + + + +37 + + + + + + + o o + o o o o o o + o o o o o o o o o o o o o o + o o o o o o o o o o o o o o + o o o o o o + o o + + o o o o + o o o o + + o o o o + o o o o + + o o + o o o o o o + o o o o o o o o o o o o o o + o o o o o o o o o o o o o o + o o o o o o + o o + + + + + + +38 + + + + + + + o o o o o o + o o o o + o o o o o o o o + o o o o o o + o o o o o o + o o o o + + o o o o + o o o o + + o o o o + o o o o + + o o o o + o o o o o o + o o o o o o + o o o o o o o o + o o o o + o o o o o o + + + + + + +39 + + + + + + o o + o o o o o o + o o o o o o o o o o o o o o + o o o o + o o + o o o o o o o o o o o o + o o o o o o + + o o o o + o o o o + + o o o o + o o o o + + o o o o o o + o o o o o o o o o o o o + o o + o o o o + o o o o o o o o o o o o o o + o o o o o o + o o + + + + + +40 + + + + + + o o o o o o + o o o o + o o o o o o o o + o o o o o o o o + o o o o + o o o o o o + o o o o + o o + o o o o + o o o o + + o o o o + o o o o + o o + o o o o + o o o o o o + o o o o + o o o o o o o o + o o o o o o o o + o o o o + o o o o o o + + + + + +41 + + + + + o o + o o + o o o o o o o o + o o + o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o + o o + o o o o + o o o o + + o o o o + o o o o + o o + o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o + o o + o o o o o o o o + o o + o o + + + + +42 + + + + + + o o o o o o + o o o o o o + o o o o o o + o o o o o o o o + o o o o o o o o + o o o o + o o o o o o + o o o o + o o + o o o o + + o o o o + o o + o o o o + o o o o o o + o o o o + o o o o o o o o + o o o o o o o o + o o o o o o + o o o o o o + o o o o o o + + + + + +43 + + + + + o o + o o o o + o o o o + o o + o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o + o o o o o o + o o o o + o o + o o + + o o + o o + o o o o + o o o o o o + o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o + o o + o o o o + o o o o + o o + + + + +44 + + + + + o o o o + o o o o o o + o o o o + o o o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o + o o o o + o o + + + + o o + o o o o + o o + o o o o o o o o + o o o o o o o o + o o o o o o o o + o o o o + o o o o + o o o o o o + o o o o + + + + +45 + + + + + o o o o + o o o o + o o o o + o o o o o o + o o o o o o o o o o + o o o o o o o o o o o o + + o o o o o o + o o o o o o + o o + + + + o o + o o o o o o + o o o o o o + + o o o o o o o o o o o o + o o o o o o o o o o + o o o o o o + o o o o + o o o o + o o o o + + + + +46 + + + + + o o + o o o o o o o o + o o o o o o + o o o o + o o o o o o + o o o o o o o o + o o o o o o + o o o o o o + o o o o o o o o + o o + + + + o o + o o o o o o o o + o o o o o o + o o o o o o + o o o o o o o o + o o o o o o + o o o o + o o o o o o + o o o o o o o o + o o + + + + +47 + + + + + o o o o o o + o o o o o o + o o o o o o + o o o o o o o o + o o o o o o o o o o o o + o o o o o o + o o + o o o o + o o o o o o o o + o o o o o o + + + + o o o o o o + o o o o o o o o + o o o o + o o + o o o o o o + o o o o o o o o o o o o + o o o o o o o o + o o o o o o + o o o o o o + o o o o o o + + + + +48 + + + + o o + o o o o o o o o + o o o o + o o o o o o + + o o + o o o o o o o o o o o o + o o o o + o o o o + o o o o + o o o o o o + o o + + o o + o o o o o o + o o o o + o o o o + o o o o + o o o o o o o o o o o o + o o + + o o o o o o + o o o o + o o o o o o o o + o o + + + +49 + + + + o o o o + o o o o o o + o o o o + o o o o + o o o o o o + o o o o + o o o o o o o o o o + o o o o + o o o o + o o o o o o o o + o o o o o o o o + o o o o + + o o o o + o o o o o o o o + o o o o o o o o + o o o o + o o o o + o o o o o o o o o o + o o o o + o o o o o o + o o o o + o o o o + o o o o o o + o o o o + + + +50 + + + + o o o o o o + o o o o + o o o o o o + o o o o + o o o o + o o + o o o o o o + o o o o o o + o o + o o o o + o o o o + o o o o + + o o o o + o o o o + o o o o + o o + o o o o o o + o o o o o o + o o + o o o o + o o o o + o o o o o o + o o o o + o o o o o o + + + +51 + + + o o + o o o o o o + o o + o o o o o o o o + o o o o o o + + o o o o + o o o o o o + o o o o + o o o o o o + o o o o + o o o o o o o o + + + + o o o o o o o o + o o o o + o o o o o o + o o o o + o o o o o o + o o o o + + o o o o o o + o o o o o o o o + o o + o o o o o o + o o + + +52 + + + o o o o o o + o o o o o o + o o o o + o o o o + o o o o o o o o + + o o o o + o o o o + o o o o + o o + o o o o o o + o o o o o o + o o + + o o + o o o o o o + o o o o o o + o o + o o o o + o o o o + o o o o + + o o o o o o o o + o o o o + o o o o + o o o o o o + o o o o o o + + +53 + + o o + o o o o + o o + o o + o o o o + o o o o o o + + o o o o + o o o o o o + o o o o o o + o o o o o o + o o o o + o o o o o o o o o o + + + + o o o o o o o o o o + o o o o + o o o o o o + o o o o o o + o o o o o o + o o o o + + o o o o o o + o o o o + o o + o o + o o o o + o o + +54 + + o o + o o + o o + o o o o + o o + o o o o + o o + o o o o o o + o o o o + o o o o + o o + o o o o o o + o o o o o o + o o + + o o + o o o o o o + o o o o o o + o o + o o o o + o o o o + o o o o o o + o o + o o o o + o o + o o o o + o o + o o + o o + +55 + + + o o o o + o o + o o o o + o o o o + o o + o o o o + o o o o + o o o o + o o o o + o o o o o o + o o o o o o + o o o o o o o o o o + + + + o o o o o o o o o o + o o o o o o + o o o o o o + o o o o + o o o o + o o o o + o o o o + o o + o o o o + o o o o + o o + o o o o + + +56 + + + o o o o + o o + o o o o + o o + o o o o o o + o o o o + o o o o + o o + o o o o o o + o o + o o o o + o o o o o o + o o + + o o + o o o o o o + o o o o + o o + o o o o o o + o o + o o o o + o o o o + o o o o o o + o o + o o o o + o o + o o o o + + +57 + + + o o + o o + o o + o o o o + o o o o + o o o o o o + o o o o + o o o o + o o + o o o o + o o + o o o o o o o o + + + + o o o o o o o o + o o + o o o o + o o + o o o o + o o o o + o o o o o o + o o o o + o o o o + o o + o o + o o + + +58 + + + + o o + o o o o + o o o o + o o o o + o o o o o o o o o o + o o o o + o o + o o + + o o o o o o + o o + o o + + o o + o o + o o o o o o + + o o + o o + o o o o + o o o o o o o o o o + o o o o + o o o o + o o o o + o o + + + +59 + + + + o o o o + o o o o + o o o o o o + o o o o o o + o o o o o o o o o o + o o + o o + + o o o o + + o o o o o o + + + + o o o o o o + + o o o o + + o o + o o + o o o o o o o o o o + o o o o o o + o o o o o o + o o o o + o o o o + + + +60 + + + + o o o o o o + + + o o o o o o o o o o o o + o o o o o o o o + o o o o + + o o + + o o + o o + o o + + o o + o o + o o + + o o + + o o o o + o o o o o o o o + o o o o o o o o o o o o + + + o o o o o o + + + +61 + + + o o + o o + o o + o o + o o o o o o o o o o + o o o o o o o o o o o o + + + + + + o o o o o o + + + + o o o o o o + + + + + + o o o o o o o o o o o o + o o o o o o o o o o + o o + o o + o o + o o + + +62 + + + + o o o o o o + + o o o o o o o o + o o o o o o o o o o o o o o + o o o o o o o o o o o o o o + o o + + + + o o + o o + o o + + o o + o o + o o + + + + o o + o o o o o o o o o o o o o o + o o o o o o o o o o o o o o + o o o o o o o o + + o o o o o o + + + +63 + + + o o + o o + o o o o o o + o o o o o o o o o o + o o o o + o o o o o o o o + o o o o o o o o + + + + + o o o o o o + + + + o o o o o o + + + + + o o o o o o o o + o o o o o o o o + o o o o + o o o o o o o o o o + o o o o o o + o o + o o + + +64 + + + + o o o o + o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o + o o o o + + + o o + o o + o o + + o o + o o + o o + + + o o o o + o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o + o o o o + + + +65 + + + + o o o o o o o o o o + o o o o + o o o o + o o + o o o o o o + + o o o o + + + + o o o o o o + + + + o o o o o o + + + + o o o o + + o o o o o o + o o + o o o o + o o o o + o o o o o o o o o o + + + +66 + + + o o o o o o + o o o o o o + o o + o o o o + o o + o o o o + + + + + o o + o o + o o + + o o + o o + o o + + + + + o o o o + o o + o o o o + o o + o o o o o o + o o o o o o + + +67 + + o o + o o o o + o o o o o o + o o o o + o o o o + o o + o o o o + + + + + + o o o o o o + + + + o o o o o o + + + + + + o o o o + o o + o o o o + o o o o + o o o o o o + o o o o + o o + +68 + + o o + o o o o o o + o o o o o o + o o o o o o o o o o + o o o o + o o + o o + + + + + o o + o o + o o + + o o + o o + o o + + + + + o o + o o + o o o o + o o o o o o o o o o + o o o o o o + o o o o o o + o o + +69 + + o o o o + o o o o + o o o o + o o o o o o o o + o o o o + o o o o + + + + + + + o o o o o o + + + + o o o o o o + + + + + + + o o o o + o o o o + o o o o o o o o + o o o o + o o o o + o o o o + +70 + + o o o o + o o o o + o o o o o o o o o o + o o o o o o o o + o o o o o o + o o + + + + + + o o + o o + o o + + o o + o o + o o + + + + + + o o + o o o o o o + o o o o o o o o + o o o o o o o o o o + o o o o + o o o o + +71 + + o o o o + o o o o + o o o o + o o o o + o o o o o o o o o o + + + + + + + + o o o o o o + + + + o o o o o o + + + + + + + + o o o o o o o o o o + o o o o + o o o o + o o o o + o o o o + +72 + + o o + o o + o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o + o o + + + + + + o o + o o + o o + + o o + o o + o o + + + + + + o o + o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o + o o + o o + +73 + + + o o + o o o o o o o o o o + o o o o + o o o o o o + o o o o o o o o + + + + + + + o o o o o o + + + + o o o o o o + + + + + + + o o o o o o o o + o o o o o o + o o o o + o o o o o o o o o o + o o + + +74 + + + o o o o + o o o o o o o o o o o o + o o o o o o + o o o o o o o o o o o o + o o o o o o o o o o + o o + + + + + o o + o o + o o + + o o + o o + o o + + + + + o o + o o o o o o o o o o + o o o o o o o o o o o o + o o o o o o + o o o o o o o o o o o o + o o o o + + +75 + + + o o o o o o + o o o o o o o o + o o o o + o o o o + o o o o + o o o o o o + + + + + + o o o o o o + + + + o o o o o o + + + + + + o o o o o o + o o o o + o o o o + o o o o + o o o o o o o o + o o o o o o + + +76 + + + o o + o o o o o o + o o o o o o + o o o o o o + o o o o o o + o o + + + + + o o + o o + o o + + o o + o o + o o + + + + + o o + o o o o o o + o o o o o o + o o o o o o + o o o o o o + o o + + +77 + + + + o o o o o o o o + o o o o o o o o + o o o o o o + o o o o o o o o + o o o o + + + + + + o o o o o o + + + + o o o o o o + + + + + + o o o o + o o o o o o o o + o o o o o o + o o o o o o o o + o o o o o o o o + + + +78 + + + + o o o o o o o o + o o o o + o o o o o o o o + o o + o o o o + + + + + o o + o o + o o + + o o + o o + o o + + + + + o o o o + o o + o o o o o o o o + o o o o + o o o o o o o o + + + +79 + + + + o o o o + o o o o o o o o o o + o o o o + o o o o o o + + + + + + + o o o o o o + + + + o o o o o o + + + + + + + o o o o o o + o o o o + o o o o o o o o o o + o o o o + + + +80 + + + + o o o o o o + o o o o + o o o o o o o o o o + o o + + + + + + o o + o o + o o + + o o + o o + o o + + + + + + o o + o o o o o o o o o o + o o o o + o o o o o o + + + +81 + + + o o + o o o o o o + o o o o + o o o o o o + o o o o + + + + + + + o o o o o o + + + + o o o o o o + + + + + + + o o o o + o o o o o o + o o o o + o o o o o o + o o + + +82 + + + o o o o o o + o o o o o o + o o o o + o o o o o o + o o o o o o + + + + + + o o + o o + o o + + o o + o o + o o + + + + + + o o o o o o + o o o o o o + o o o o + o o o o o o + o o o o o o + + +83 + + o o + o o o o + o o o o + o o o o + o o o o + o o o o + o o + + + + + + o o o o o o + + + + o o o o o o + + + + + + o o + o o o o + o o o o + o o o o + o o o o + o o o o + o o + +84 + + o o + o o o o o o + o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o + o o o o o o + o o + + + + + o o + o o + o o + + o o + o o + o o + + + + + o o + o o o o o o + o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o + o o o o o o + o o + +85 + + o o o o o o + o o o o + o o o o + o o o o + o o o o + o o o o + o o o o o o + + + + + + o o o o o o + + + + o o o o o o + + + + + + o o o o o o + o o o o + o o o o + o o o o + o o o o + o o o o + o o o o o o + +86 + + o o o o o o + o o o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o o o + o o o o o o + o o + + + + o o + o o + o o + + o o + o o + o o + + + + o o + o o o o o o + o o o o o o o o o o + o o o o o o o o + o o o o o o o o o o o o + o o o o o o o o + o o o o o o o o o o + o o o o o o + o o +87 + + o o o o + o o o o + o o o o o o + o o o o o o o o + o o o o o o + o o o o + o o o o + o o o o o o + + + + + o o o o o o + + + + o o o o o o + + + + + o o o o o o + o o o o + o o o o + o o o o o o + o o o o o o o o + o o o o o o + o o o o + o o o o + o o o o o o +88 + + + o o o o + o o o o o o o o o o + o o o o o o o o o o o o o o o + o o o o o o o o o o + o o o o + o o o o o o o o o o + o o o o o o + o o + + + o o + o o + o o + + o o + o o + o o + + + o o + o o o o o o + o o o o o o o o o o + o o o o + o o o o o o o o o o + o o o o o o o o o o o o o o o + o o o o o o o o o o + o o o o + o o o o o o o o o o + o o o o o o +89 + + + o o o o o o o o + o o o o o + o o o o o o o + o o o o o + o o o o o o o o + o o o o + o o o o + o o o o o o + + + + o o o o o o + + + + o o o o o o + + + + o o o o o o + o o o o + o o o o + o o o o o o o o + o o o o o + o o o o o o o + o o o o o + o o o o o o o o + o o o o + o o o o +90 + + + o o o + o o o o o + o o o o o o o o o o o o + o o o o o + o o o o o o o + o o o o + o o o o o o + o o o o o o + o o + + o o + o o + o o + + o o + o o + o o + + o o + o o o o o o + o o o o o o + o o o o + o o o o o o o + o o o o o + o o o o o o o o o o o o + o o o o o + o o o o o o o + o o o o + +91 + + + + o o o o o + o o o o o o o o o o + o o o o o o o o + o o o o o o + o o o o o o o o o + o o o o o o + + o o o o o o + + + o o o o o o + + + + o o o o o o + + + o o o o o o + + o o o o o o + o o o o o o o o o + o o o o o o + o o o o o o o o + o o o o o o o o o o + o o o o o o o o + o o o o o o + o o o + +92 + + + + o o o o o o + o o o o o o o o o + o o o o o o o o o + o o o o o o o o o o o o o + o o o o o o o o o o o + o o o o o o o + + o o + o o + o o + o o + o o + + o o + o o + o o + o o + o o + + o o o o o o o + o o o o o o o o o o o + o o o o o o o o o o o o o + o o o o o o o o o + o o o o o o o o o o o o o o o o o + o o o o o o o o o + o o o o o o o o + o o o o o o + +93 + + + + o o o o o o + o o o o o o o o o o o + o o o o o o o + o o o o + + o o o o o o + o o o o + + + + o o o o o o + + + + o o o o o o + + + + o o o o + o o o o o o + + o o o o + o o o o + o o o o + o o o o + o o o + o o o o o o o + +94 + + + + o o o o o o o o o + o o o o o o o o o o o o o o o + o o o o o o o o o o o + o o o o o + + o o o o o + o o o o o + + + o o + o o + o o + + o o + o o + o o + + + o o o o o + o o o o o + + + o o o o o o o + o o o o o + o o + o o o o o o + o o + o +95 + + + o o o o o + o o + o o o o + o o o o o o o o + o o o o o + o + o o o o + o o o o + o + + + o o o o o o + + + + o o o o o o + + + o + o o o o + o o o o + o + + o o o o + o o o o o + o o o o + o o o + o o + o o +96 + + o o o + o o o o + o o o o + o o o + o o o o o o o o o + o o o o + o o o + o o o o + o o o o + o + + o o + o o + o o + + o o + o o + o o + + o + o o o o + o o o o + o + + o o o o + o o o o + o o o + o + o o o o o + o +97 + + o o + o + o o + o o o o o o o + o o o o o o o o + o o o o o + o o o + o o o o + o o o o + o + + + o o o o o o + + + + o o o o o o + + + o + o o o o + o o o o + o + + o o o o + o o o o o + o + o + o o o o + o o o o +98 + + + o o + o o + o o o o + o o o o o o o o o o o o + o o + o o o + o o o + o o o o + o + + o o + o o + o o + + o o + o o + o o + + o + o o o o + o o o o + o + + o o o o + o o o o + + o o o + o o + o o +99 + + + o o + o o o + o o o o o o o o + o o o o o o o + o o o o o o o + o o o + o o o o + o + o o + + + o o o o o o + + + + o o o o o o + + + o + o o o o + o o o o + o + + o o o o + o o o o + + o o + o o o o + +
\ No newline at end of file diff --git a/testsuite/tests/programs/life_space_leak/test.T b/testsuite/tests/programs/life_space_leak/test.T new file mode 100644 index 0000000000..417342f38e --- /dev/null +++ b/testsuite/tests/programs/life_space_leak/test.T @@ -0,0 +1,8 @@ +# exhausts Hugs's heap (CAF leak) +test('life_space_leak', + [skip_if_fast, + extra_clean(['Main.hi', 'Main.o']), + if_compiler_type('hugs', expect_fail)], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/maessen-hashtab/Data/HashTab.hs b/testsuite/tests/programs/maessen-hashtab/Data/HashTab.hs new file mode 100644 index 0000000000..8251a760c8 --- /dev/null +++ b/testsuite/tests/programs/maessen-hashtab/Data/HashTab.hs @@ -0,0 +1,339 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Data.HashTable +-- Copyright : (c) The University of Glasgow 2003 +-- License : BSD-style (see the file libraries/base/LICENSE) +-- +-- Maintainer : libraries@haskell.org +-- Stability : provisional +-- Portability : portable +-- +-- An implementation of extensible hash tables, as described in +-- Per-Ake Larson, /Dynamic Hash Tables/, CACM 31(4), April 1988, +-- pp. 446--457. The implementation is also derived from the one +-- in GHC's runtime system (@ghc\/rts\/Hash.{c,h}@). +-- +----------------------------------------------------------------------------- + +module Data.HashTab ( + -- * Basic hash table operations + HashTable, new, insert, delete, lookup, update, + -- * Converting to and from lists + fromList, toList, + -- * Hash functions + -- $hash_functions + hashInt, hashString, + prime, + -- * Diagnostics + longestChain + ) where + +-- This module is imported by Data.Typeable, which is pretty low down in the +-- module hierarchy, so don't import "high-level" modules + +-- Right now we import high-level modules with gay abandon. +import Prelude hiding ( lookup ) +import Data.Tuple ( fst ) +import Data.Bits +import Data.Maybe +import Data.List ( maximumBy, partition, concat, foldl ) +import Data.Int ( Int32 ) + +import Data.Array.Base +import Data.Array hiding (bounds) +import Data.Array.IO + +import Data.Char ( ord ) +import Data.IORef ( IORef, newIORef, readIORef, writeIORef ) +import Control.Monad ( mapM, sequence_ ) + + +----------------------------------------------------------------------- + +readHTArray :: HTArray a -> Int32 -> IO a +readMutArray :: MutArray a -> Int32 -> IO a +writeMutArray :: MutArray a -> Int32 -> a -> IO () +freezeArray :: MutArray a -> IO (HTArray a) +thawArray :: HTArray a -> IO (MutArray a) +newMutArray :: (Int32, Int32) -> a -> IO (MutArray a) +#if defined(DEBUG) || defined(__NHC__) +type MutArray a = IOArray Int32 a +type HTArray a = MutArray a +newMutArray = newArray +readHTArray = readArray +readMutArray = readArray +writeMutArray = writeArray +freezeArray = return +thawArray = return +#else +type MutArray a = IOArray Int32 a +type HTArray a = Array Int32 a +newMutArray = newArray +readHTArray arr i = return $! (unsafeAt arr (fromIntegral i)) +readMutArray arr i = unsafeRead arr (fromIntegral i) +writeMutArray arr i x = unsafeWrite arr (fromIntegral i) x +freezeArray = unsafeFreeze +thawArray = unsafeThaw +#endif + +newtype HashTable key val = HashTable (IORef (HT key val)) +-- TODO: the IORef should really be an MVar. + +data HT key val + = HT { + kcount :: !Int32, -- Total number of keys. + buckets :: !(HTArray [(key,val)]), + bmask :: !Int32, + hash_fn :: key -> Int32, + cmp :: key -> key -> Bool + } + +-- ----------------------------------------------------------------------------- +-- Sample hash functions + +-- $hash_functions +-- +-- This implementation of hash tables uses the low-order /n/ bits of the hash +-- value for a key, where /n/ varies as the hash table grows. A good hash +-- function therefore will give an even distribution regardless of /n/. +-- +-- If your keyspace is integrals such that the low-order bits between +-- keys are highly variable, then you could get away with using 'id' +-- as the hash function. +-- +-- We provide some sample hash functions for 'Int' and 'String' below. + +-- | A sample hash function for 'Int', implemented as simply @(x `mod` P)@ +-- where P is a suitable prime (currently 1500007). Should give +-- reasonable results for most distributions of 'Int' values, except +-- when the keys are all multiples of the prime! +-- +hashInt :: Int -> Int32 +hashInt = (`rem` prime) . fromIntegral + +-- | A sample hash function for 'String's. The implementation is: +-- +-- > hashString = fromIntegral . foldr f 0 +-- > where f c m = ord c + (m * 128) `rem` 1500007 +-- +-- which seems to give reasonable results. +-- +hashString :: String -> Int32 +hashString = fromIntegral . foldl f 0 + where f m c = ord c + (m * 128) `rem` fromIntegral prime + +-- | A prime larger than the maximum hash table size +prime :: Int32 +prime = 1500007 + +-- ----------------------------------------------------------------------------- +-- Parameters + +tABLE_MAX = 1024 * 1024 :: Int32 -- Maximum size of hash table +#if tABLE_MIN +#else +tABLE_MIN = 16 :: Int32 + +hLOAD = 4 :: Int32 -- Maximum average load of a single hash bucket + +hYSTERESIS = 0 :: Int32 -- entries to ignore in load computation +#endif + +{- Hysteresis favors long association-list-like behavior for small tables. -} + +-- ----------------------------------------------------------------------------- +-- Creating a new hash table + +-- | Creates a new hash table. The following property should hold for the @eq@ +-- and @hash@ functions passed to 'new': +-- +-- > eq A B => hash A == hash B +-- +new + :: (key -> key -> Bool) -- ^ @eq@: An equality comparison on keys + -> (key -> Int32) -- ^ @hash@: A hash function on keys + -> IO (HashTable key val) -- ^ Returns: an empty hash table + +new cmpr hash = do + -- make a new hash table with a single, empty, segment + let mask = tABLE_MIN-1 + bkts' <- newMutArray (0,mask) [] + bkts <- freezeArray bkts' + + let + kcnt = 0 + ht = HT { buckets=bkts, kcount=kcnt, bmask=mask, + hash_fn=hash, cmp=cmpr } + + table <- newIORef ht + return (HashTable table) + +-- ----------------------------------------------------------------------------- +-- Inserting a key\/value pair into the hash table + +-- | Inserts an key\/value mapping into the hash table. +-- +-- Note that 'insert' doesn't remove the old entry from the table - +-- the behaviour is like an association list, where 'lookup' returns +-- the most-recently-inserted mapping for a key in the table. The +-- reason for this is to keep 'insert' as efficient as possible. If +-- you need to update a mapping, then we provide 'update'. +-- +insert :: HashTable key val -> key -> val -> IO () + +insert (HashTable ref) key val = do + table@HT{ kcount=k, buckets=bkts, bmask=b } <- readIORef ref + let table1 = table{ kcount = k+1 } + indx = bucketIndex table key + bucket <- readHTArray bkts indx + bkts' <- thawArray bkts + writeMutArray bkts' indx ((key,val):bucket) + freezeArray bkts' + table2 <- + if tooBig k b + then expandHashTable table1 + else return table1 + writeIORef ref table2 + +tooBig :: Int32 -> Int32 -> Bool +tooBig k b = k-hYSTERESIS > hLOAD * b + +bucketIndex :: HT key val -> key -> Int32 +bucketIndex HT{ hash_fn=hash, bmask=mask } key = + let h = hash key + in (h .&. mask) + +expandHashTable :: HT key val -> IO (HT key val) +expandHashTable + table@HT{ buckets=bkts, bmask=mask } = do + let + oldsize = mask + 1 + newmask = mask + mask + 1 + newsize = newmask + 1 + -- + if newsize > tABLE_MAX + then return table + else do + -- + newbkts' <- newMutArray (0,newmask) [] + + let + table'=table{ bmask=newmask } + splitBucket oldindex = do + bucket <- readHTArray bkts oldindex + let (oldb,newb) = partition ((oldindex==).bucketIndex table' . fst) bucket + writeMutArray newbkts' oldindex oldb + writeMutArray newbkts' (oldindex + oldsize) newb + mapM_ splitBucket [0..mask] + + newbkts <- freezeArray newbkts' + + return ( table'{ buckets=newbkts } ) + +-- ----------------------------------------------------------------------------- +-- Deleting a mapping from the hash table + +-- Remove a key from a bucket +deleteBucket :: (key -> Bool) -> [(key,val)] -> (Int32, [(key, val)]) +deleteBucket _ [] = (0,[]) +deleteBucket del (pair@(k,_):bucket) = + case deleteBucket del bucket of + (dels, bucket') | del k -> dels' `seq` (dels', bucket') + | otherwise -> (dels, pair:bucket') + where dels' = dels + 1 + +-- | Remove an entry from the hash table. +delete :: HashTable key val -> key -> IO () + +delete (HashTable ref) key = do + table@HT{ buckets=bkts, kcount=kcnt, cmp=cmpr } <- readIORef ref + let indx = bucketIndex table key + bkts' <- thawArray bkts + bucket <- readMutArray bkts' indx + let (removed,bucket') = deleteBucket (cmpr key) bucket + writeMutArray bkts' indx bucket' + freezeArray bkts' + writeIORef ref ( table{kcount = kcnt - removed} ) + +-- ----------------------------------------------------------------------------- +-- Updating a mapping in the hash table + +-- | Updates an entry in the hash table, returning 'True' if there was +-- already an entry for this key, or 'False' otherwise. After 'update' +-- there will always be exactly one entry for the given key in the table. +-- +-- 'insert' is more efficient than 'update' if you don't care about +-- multiple entries, or you know for sure that multiple entries can't +-- occur. However, 'update' is more efficient than 'delete' followed +-- by 'insert'. +update :: HashTable key val -> key -> val -> IO Bool + +update (HashTable ref) key val = do + table@HT{ kcount=k, buckets=bkts, cmp=cmpr, bmask=b } <- readIORef ref + let indx = bucketIndex table key + bkts' <- thawArray bkts + bucket <- readMutArray bkts' indx + let (deleted,bucket') = deleteBucket (cmpr key) bucket + k' = k + 1 - deleted + table1 = table{ kcount=k' } + + writeMutArray bkts' indx ((key,val):bucket') + freezeArray bkts' + table2 <- + if tooBig k' b -- off by one from insert's resize heuristic. + then expandHashTable table1 + else return table1 + writeIORef ref table2 + return (deleted>0) + +-- ----------------------------------------------------------------------------- +-- Looking up an entry in the hash table + +-- | Looks up the value of a key in the hash table. +lookup :: HashTable key val -> key -> IO (Maybe val) + +lookup (HashTable ref) key = do + table@HT{ buckets=bkts, cmp=cmpr } <- readIORef ref + let indx = bucketIndex table key + bucket <- readHTArray bkts indx + case [ val | (key',val) <- bucket, cmpr key key' ] of + [] -> return Nothing + (v:_) -> return (Just v) + +-- ----------------------------------------------------------------------------- +-- Converting to/from lists + +-- | Convert a list of key\/value pairs into a hash table. Equality on keys +-- is taken from the Eq instance for the key type. +-- +fromList :: (Eq key) => (key -> Int32) -> [(key,val)] -> IO (HashTable key val) +fromList hash list = do + table <- new (==) hash + sequence_ [ insert table k v | (k,v) <- list ] + return table + +-- | Converts a hash table to a list of key\/value pairs. +-- +toList :: (Ord key, Ord val) => HashTable key val -> IO [(key,val)] +toList (HashTable ref) = do + HT{ buckets=bkts, bmask=b } <- readIORef ref + fmap concat (mapM (readHTArray bkts) [0..b]) + +-- ----------------------------------------------------------------------------- +-- Diagnostics + +-- | This function is useful for determining whether your hash function +-- is working well for your data set. It returns the longest chain +-- of key\/value pairs in the hash table for which all the keys hash to +-- the same bucket. If this chain is particularly long (say, longer +-- than 10 elements), then it might be a good idea to try a different +-- hash function. +-- +longestChain :: HashTable key val -> IO [(key,val)] +longestChain (HashTable ref) = do + HT{ buckets=bkts, bmask=b } <- readIORef ref + let lengthCmp (_:x)(_:y) = lengthCmp x y + lengthCmp [] [] = EQ + lengthCmp [] _ = LT + lengthCmp _ [] = GT + fmap (maximumBy lengthCmp) (mapM (readHTArray bkts) [0..b]) diff --git a/testsuite/tests/programs/maessen-hashtab/HashTest.hs b/testsuite/tests/programs/maessen-hashtab/HashTest.hs new file mode 100644 index 0000000000..51c60c0640 --- /dev/null +++ b/testsuite/tests/programs/maessen-hashtab/HashTest.hs @@ -0,0 +1,278 @@ +{- Test code for Data.HashTable -} + +module Main(main) where + +import Prelude hiding (lookup) +import qualified Prelude (lookup) +import Data.Maybe(isJust,isNothing) +import Data.Int(Int32) +import Test.QuickCheck +import System.IO.Unsafe(unsafePerformIO) +import Data.HashTab +import Control.Monad(liftM2, foldM) +import System.Random +import System.Environment + +infixr 0 ==. +infixr 0 ==~ +infixr 0 ~~ + +type HT = HashTable Int Int +newtype HashFun = HF {unHF :: (Int -> Int32)} +data Empty = E {e :: (IO HT), hfe :: HashFun} +data MkH = H {h :: (IO HT), hfh :: HashFun} +newtype List a = L [a] + +data Action = Lookup Int + | Insert Int Int + | Delete Int + | Update Int Int + deriving (Show) + +instance Arbitrary Action where + arbitrary = frequency [(10,fmap Lookup arbitrary), + (5, liftM2 Insert arbitrary arbitrary), + (3, liftM2 Update arbitrary arbitrary), + (1, fmap Delete arbitrary)] + coarbitrary = error "coarbitrary Action" + +simA :: [Action] -> [Either Bool [Int]] +simA = fst . foldl sim ([],[]) + where sim :: ([Either Bool [Int]], [Action]) -> Action -> + ([Either Bool [Int]], [Action]) + sim (res, past) (Lookup k) = (Right (lkup k past) : res, past) + sim (res, past) (Insert k v) = (res, Insert k v : past) + sim (res, past) (Delete k) = (res, Delete k : past) + sim (res, past) (Update k v) = + (Left (not (null l)) : res, Update k v : past) + where l = lkup k past + lkup _ [] = [] + lkup k (Delete k' : _) + | k==k' = [] + lkup k (Update k' v : _) + | k==k' = [v] + lkup k (Insert k' v : past) + | k==k' = v:lkup k past + lkup k (_ : past) = lkup k past + +runA :: HashFun -> [Action] -> IO [Either Bool (Maybe Int)] +runA hf acts = do + ht <- new (==) (unHF hf) + let run res (Lookup a) = fmap (lkup res) $ lookup ht a + run res (Insert k v) = insert ht k v >> return res + run res (Delete k) = delete ht k >> return res + run res (Update k v) = fmap (upd res) $ update ht k v + lkup res m = Right m : res + upd res b = Left b : res + foldM run [] acts + +(~~) :: IO [Either Bool (Maybe Int)] -> [Either Bool [Int]] -> Bool +acts ~~ sims = and $ zipWith same (unsafePerformIO acts) sims + where same (Left b) (Left b') = b==b' + same (Right Nothing) (Right []) = True + same (Right (Just a)) (Right xs) = a `elem` xs + same _ _ = False + +lookups :: HT -> [Int] -> IO [Maybe Int] +lookups ht ks = mapM (lookup ht) ks + +instance Show HashFun where + showsPrec _ (HF hf) r + | hf 1 == 0 = "degenerate"++r + | otherwise = "usual"++r + +instance Show Empty where + showsPrec _ ee r = shows (hfe ee) r + +instance Show MkH where + showsPrec _ hh r = shows (hfh hh) $ + ("; "++shows (unsafePerformIO (h hh >>= toList)) r) + +instance Show a => Show (List a) where + showsPrec _ (L l) r = shows l r + +instance Arbitrary HashFun where + arbitrary = frequency [(20,return (HF hashInt)), + (1,return (HF (const 0)))] + coarbitrary = error "coarbitrary HashFun" + +instance Arbitrary Empty where + arbitrary = fmap mkE arbitrary + where mkE (HF hf) = E {e = new (==) hf, hfe=HF hf} + coarbitrary = error "coarbitrary Empty" + +instance Arbitrary a => Arbitrary (List a) where + arbitrary = do + sz <- frequency [(50, sized return), + (1,return (4096*2)), + (0, return (1024*1024))] + resize sz $ fmap L $ sized vector + coarbitrary = error "coarbitrary (List a)" + +instance Arbitrary MkH where + arbitrary = do + hf <- arbitrary + L list <- arbitrary + let mkH act = H { h = act, hfh = hf } + return (mkH . fromList (unHF hf) $ list) + coarbitrary = error "coarbitrary MkH" + +(==~) :: (Eq a) => IO a -> IO a -> Bool +act1 ==~ act2 = unsafePerformIO act1 == unsafePerformIO act2 + +(==.) :: (Eq a) => IO a -> a -> Bool +act ==. v = unsafePerformIO act == v + +notin :: (Testable a) => Int -> MkH -> a -> Property +k `notin` hh = \prop -> + let f = (not . isJust . unsafePerformIO) (h hh >>= flip lookup k) in + f `trivial` prop + +prop_emptyLookup :: Empty -> Int -> Bool +prop_emptyLookup ee k = + isNothing . unsafePerformIO $ + (do mt <- e ee + lookup mt k) + +prop_emptyToList :: Empty -> Bool +prop_emptyToList ee = + (do mt <- e ee + toList mt) ==. [] + +prop_emptyFromList :: HashFun -> Int -> Bool +prop_emptyFromList hf k = + (do mt <- new (==) (unHF hf) :: IO HT + lookup mt k) ==~ + (do mt <- fromList (unHF hf) [] + lookup mt k) + +prop_insert :: MkH -> Int -> Int -> Bool +prop_insert hh k v = + (do ht <- h hh + insert ht k v + lookup ht k) ==. Just v + +prop_insertu :: MkH -> Int -> Int -> List Int -> Bool +prop_insertu hh k v (L ks) = + let ks' = filter (k /=) ks in + (do ht <- h hh + insert ht k v + lookups ht ks') ==~ + (do ht <- h hh + lookups ht ks') + +prop_delete :: MkH -> Int -> Property +prop_delete hh k = + k `notin` hh $ + isNothing . unsafePerformIO $ + (do ht <- h hh + delete ht k + lookup ht k) + +prop_deleteu :: MkH -> Int -> List Int -> Bool +prop_deleteu hh k (L ks) = + let ks' = filter (k /=) ks in + (do ht <- h hh + delete ht k + lookups ht ks') ==~ + (do ht <- h hh + lookups ht ks') + +naiveUpdate :: HT -> Int -> Int -> IO () +naiveUpdate ht k v = do + delete ht k + insert ht k v + +prop_update :: MkH -> Int -> Int -> List Int -> Bool +prop_update hh k v (L ks) = + (do ht <- h hh + _ <- update ht k v + lookups ht ks) ==~ + (do ht <- h hh + naiveUpdate ht k v + lookups ht ks) + +prop_updatec :: MkH -> Int -> Int -> Bool +prop_updatec hh k v = + (do ht <- h hh + _ <- update ht k v + lookup ht k) ==. Just v + +prop_updateLookup :: MkH -> Int -> Int -> Property +prop_updateLookup hh k v = + k `notin` hh $ + (do ht <- h hh + update ht k v) ==~ + (do ht <- h hh + fmap isJust (lookup ht k)) + +prop_simulation :: HashFun -> List Action -> Property +prop_simulation hf (L acts) = + (null acts `trivial`) $ + runA hf acts ~~ simA acts + +{- + +For "fromList" and "toList" properties we're a bit sloppy: we perform +multiple insertions for a key (potentially) but give nor promises +about which one we will retrieve with lookup, or what order they'll be +returned by toList (or if they'll all be returned at all). Thus we +insert all occurrences of a key with the same value, and do all +checking via lookups. + +-} + +prop_fromList :: HashFun -> List Int -> List Int -> Property +prop_fromList hf (L l) (L ks) = + null l `trivial` + let assocs = map (\t -> (t,t)) l in + ( do ht <- fromList (unHF hf) assocs + lookups ht ks) ==. (map (`Prelude.lookup` assocs) ks) + +prop_fromListInsert :: HashFun -> List (Int,Int) -> Int -> Int -> List Int -> Property +prop_fromListInsert hf (L l) k v (L ks) = + null l `trivial` + (( do ht <- fromList (unHF hf) l + insert ht k v + lookups ht ks) ==~ + ( do ht <- fromList (unHF hf) (l++[(k,v)]) + lookups ht ks)) + +prop_toList :: HashFun -> List Int -> List Int -> Property +prop_toList hf (L l) (L ks) = + null l `trivial` + let assocs = map (\t -> (t,t)) l in + ( do ht <- fromList (unHF hf) assocs + lookups ht ks) ==~ + ( do ht <- fromList (unHF hf) assocs + fmap (\as -> map (`Prelude.lookup` as) ks) $ toList ht ) + +te :: (Testable a) => String -> a -> IO () +-- te name prop = putStrLn name >> verboseCheck prop +te name prop = do + putStr name + check (defaultConfig{configMaxTest = 500, + configMaxFail = 10000, + configEvery = \_ _ -> "" }) prop + +main :: IO () +main = do + [r] <- getArgs + setStdGen (mkStdGen (read r :: Int)) + sequence_ $ + [ te "emptyLookup:" prop_emptyLookup, + te "emptyToList:" prop_emptyToList, + te "emptyFromList:" prop_emptyFromList, + te "insert:" prop_insert, + te "insertu:" prop_insertu, + te "delete:" prop_delete, + te "deleteu:" prop_deleteu, + te "update:" prop_update, + te "updatec:" prop_updatec, + te "updateLookup:" prop_updateLookup, + te "fromList:" prop_fromList, + te "fromListInsert:" prop_fromListInsert, + te "toList:" prop_toList, + te "simulation:" prop_simulation + ] + putStrLn "OK" diff --git a/testsuite/tests/programs/maessen-hashtab/Makefile b/testsuite/tests/programs/maessen-hashtab/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/maessen-hashtab/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/maessen-hashtab/maessen_hashtab.stdout b/testsuite/tests/programs/maessen-hashtab/maessen_hashtab.stdout new file mode 100644 index 0000000000..b667dcaae0 --- /dev/null +++ b/testsuite/tests/programs/maessen-hashtab/maessen_hashtab.stdout @@ -0,0 +1,15 @@ +emptyLookup:OK, passed 500 tests. +emptyToList:OK, passed 500 tests. +emptyFromList:OK, passed 500 tests. +insert:OK, passed 500 tests. +insertu:OK, passed 500 tests. +delete:OK, passed 500 tests (60% trivial). +deleteu:OK, passed 500 tests. +update:OK, passed 500 tests. +updatec:OK, passed 500 tests. +updateLookup:OK, passed 500 tests (63% trivial). +fromList:OK, passed 500 tests (2% trivial). +fromListInsert:OK, passed 500 tests (2% trivial). +toList:OK, passed 500 tests (1% trivial). +simulation:OK, passed 500 tests (1% trivial). +OK diff --git a/testsuite/tests/programs/maessen-hashtab/test.T b/testsuite/tests/programs/maessen-hashtab/test.T new file mode 100644 index 0000000000..807cb85e81 --- /dev/null +++ b/testsuite/tests/programs/maessen-hashtab/test.T @@ -0,0 +1,11 @@ + +test('maessen_hashtab', + [reqlib('QuickCheck'), + extra_clean(['HashTest.hi', 'HashTest.o', + 'Data/HashTab.hi', 'Data/HashTab.o']), + skip_if_fast, +# this test runs out of time when not optimised: + omit_ways(['normal','ghci','threaded1']), + extra_run_opts('99999')], + multimod_compile_and_run, ['HashTest', '-cpp']) + diff --git a/testsuite/tests/programs/north_array/Main.hs b/testsuite/tests/programs/north_array/Main.hs new file mode 100644 index 0000000000..b6ceb706d6 --- /dev/null +++ b/testsuite/tests/programs/north_array/Main.hs @@ -0,0 +1,10 @@ +import Data.Array -- 1.3 + +val1, val2 :: Array (Int,Int) Int +val1 = array ((1,2), (2,1)) [] +val2 = array ((2,1), (1,2)) [] + +val3 :: Array Integer Double +val3 = array (4, -3) [] + +main = print ((val1 == val1) && (val2 == val2) && (val3 == val3)) diff --git a/testsuite/tests/programs/north_array/Makefile b/testsuite/tests/programs/north_array/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/north_array/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/north_array/north_array.stdout b/testsuite/tests/programs/north_array/north_array.stdout new file mode 100644 index 0000000000..0ca95142bb --- /dev/null +++ b/testsuite/tests/programs/north_array/north_array.stdout @@ -0,0 +1 @@ +True diff --git a/testsuite/tests/programs/north_array/test.T b/testsuite/tests/programs/north_array/test.T new file mode 100644 index 0000000000..e2b89b4501 --- /dev/null +++ b/testsuite/tests/programs/north_array/test.T @@ -0,0 +1,6 @@ + +test('north_array', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/okeefe_neural/Main.hs b/testsuite/tests/programs/okeefe_neural/Main.hs new file mode 100644 index 0000000000..0717238787 --- /dev/null +++ b/testsuite/tests/programs/okeefe_neural/Main.hs @@ -0,0 +1,1533 @@ + +module Main(main) where + +--import Int( Num(fromInt) ) + +newtype RNG_State = RNG_State (Int, Int, Int) + +new_random i = RNG_State (i `mod` 30269, i `mod` 30307, i `mod` 30323) + +next_unit_random (RNG_State (a,b,c)) = + (r, RNG_State (a1,b1,c1)) + where a1 = (a * 171) `mod` 30269 + b1 = (b * 172) `mod` 30307 + c1 = (c * 170) `mod` 30323 + t = fromIntegral a1/30269.0 + + fromIntegral b1/30307.0 + + fromIntegral c1/30323.0 + r = t - fromIntegral (truncate t) + +next_random_bool p s = + (r < p, s1) + where (r,s1) = next_unit_random s + +next_random_list f n s = + loop [] n s + where loop ps 0 s = (ps, s) + loop ps m s = loop (p:ps) (m-1) s1 + where (p,s1) = f s + +rpart [] _ _ ps qs s = ((ps, qs), s) +rpart (x:xs) n d ps qs s = + if d*r < n + then rpart xs (n-1.0) (d-1.0) (x:ps) qs s1 + else rpart xs n (d-1.0) ps (x:qs) s1 + where (r, s1) = next_unit_random s + +random_permutation xs s = + rperm xs (length xs) [] s + where rperm [] 0 ps s = (ps, s) + rperm [x1] 1 ps s = ((x1:ps), s) + rperm [x1,x2] 2 ps s = + if b then (x1:x2:ps, s1) else (x2:x1:ps, s1) + where (b, s1) = next_random_bool 0.5 s + rperm xs d ps s = + let n = d `div` 2 + ((ys, zs), s1) = rpart xs (fromIntegral n) (fromIntegral d) [] [] s + (zps, s2) = rperm zs (d-n) ps s1 + in rperm ys n zps s2 + +minit m n g = + outer (m-1) [] + where outer (-1) xss = xss + outer m xss = outer (m-1) (inner (n-1) [] : xss) + where inner (-1) xs = xs + inner n xs = inner (n-1) (g m n : xs) + +vadd [] [] = [] +vadd (x:xs) (y:ys) = x+y : vadd xs ys + +madd [] [] = [] +madd (xs:xss) (ys:yss) = vadd xs ys : madd xss yss + +vaddx [] [] _ = [] +vaddx (x:xs) (y:ys) a = x+y*a : vaddx xs ys a + +vsub [] [] = [] +vsub (x:xs) (y:ys) = x-y : vsub xs ys + +vmulx [] _ = [] +vmulx (x:xs) a = x*a : vmulx xs a + +mmulx [] _ = [] +mmulx (xs:xss) a = vmulx xs a : mmulx xss a + +vdist xs ys = + loop xs ys 0.0 + where loop [] [] s = s + loop (x:xs) (y:ys) s = loop xs ys (s+d*d) + where d = x-y + +vdot xs ys = + loop xs ys 0.0 + where loop [] [] s = s + loop (x:xs) (y:ys) s = loop xs ys (s+x*y) + +vmmul [] [] = [] +vmmul (x:xs) (r:rs) = + loop xs rs (vmulx r x) + where loop [] [] ws = ws + loop (x:xs) (r:rs) ws = loop xs rs (vaddx ws r x) + +vupdate [] _ [] _ = [] +vupdate (r:rs) xs (y:ys) c = vaddx r xs (y*c) : vupdate rs xs ys c + +vscale [] [] = [] +vscale (x:xs) (y:ys) = x*y*(1.0-y) : vscale xs ys + +sigmoid x = 1.0/(1.0 + exp (0.0-x)) + +mrand m n l u s = + next_random_list (next_random_list f n) m s + where f s = (l + (u-l)*r, s1) + (r, s1) = next_unit_random s + +train pats i_h_wt i_h_ch h_o_wt h_o_ch epochs s = + loop pats1 i_h_ch h_o_ch 0.0 + where + (pats1, s1) = random_permutation pats s + loop [] i_h_ch h_o_ch e0 + | e < criterion = ((e,0,i_h_wt,h_o_wt), s1) + | epochs <= 0 = ((e,1,i_h_wt,h_o_wt), s1) + | True = + train pats (madd i_h_wt i_h_ch) (mmulx i_h_ch momentum) + (madd h_o_wt h_o_ch) (mmulx h_o_ch momentum) (epochs-1) s1 + where e = e0/(fromIntegral (length pats) * fromIntegral (length h_o_wt)) + loop ((in_pat, out_pat):ps) i_h_ch h_o_ch e = + loop ps (vupdate i_h_ch in_act (tail hid_err) rate) + (vupdate h_o_ch hid_act out_err rate) + (e + vdist out_pat out_act) + where + in_act = 1.0:in_pat + hid_act = 1.0:map (\w -> sigmoid (vdot in_act w)) i_h_wt + out_act = map (\w -> sigmoid (vdot hid_act w)) h_o_wt + out_err = vscale (vsub out_pat out_act) out_act + hid_err = vscale (vmmul out_err h_o_wt) hid_act + +main = putStrLn (show ans) + where (in1,out1) = head patterns + nin = length in1 + nhid = nin + nout = length out1 + s0 = new_random 353721 + (i_h_wt, s1) = mrand nhid (nin +1) (0.0-0.3) 0.3 s0 + i_h_ch = minit nhid (nin +1) (\i j -> 0.0) + (h_o_wt, s2) = mrand nout (nhid+1) (0.0-0.3) 0.3 s1 + h_o_ch = minit nout (nhid+1) (\i j -> 0.0) + (ans, _) = train patterns i_h_wt i_h_ch h_o_wt h_o_ch epochs s2 + +rate = 0.05 + +momentum = 0.9 + +criterion = 0.01 + +--epochs = 100 + +--patterns = [([1.0,0.0],[1.0]), +-- ([0.0,1.0],[1.0]), +-- ([0.0,0.0],[0.0]), +-- ([1.0,1.0],[0.0])] + +epochs = 90 + +patterns = + [([0.955809, 0.095706, 0.269204, 0.824671, 0.448012, 0.722709, + 0.327677, 0.148595, 0.063143, 0.007019, 0.135166, 0.928800, 0.298593, + 0.931150, 0.711234, 0.432630, 0.913450, 0.545061, 0.651082, 0.692984, + 0.371532, 0.940641, 0.202521, 0.064852, 0.965941, 0.523637, 0.914884, + 0.159062, 0.031648, 0.866848, 0.516526, 0.684317, 0.152135, 0.923734, + 0.177435, 0.228339, 0.766503, 0.885159, 0.812220, 0.510208, 0.082949, + 0.459792, 0.580920, 0.134190, 0.705741, 0.859523, 0.243171, 0.377117, + 0.880551, 0.271218, 0.521989, 0.039888, 0.765862, 0.096347, 0.133702, + 0.895138, 0.635548, 0.738853, 0.640126, 0.761162, 0.419599, 0.223579, + 0.779260, 0.734947, 0.488937, 0.426038, 0.430799, 0.613788, 0.090487, + 0.194372, 0.872494, 0.038179, 0.339183, 0.145482, 0.483932, 0.386425, + 0.172430, 0.416150, 0.553850, 0.952422, 0.174200, 0.150365, 0.347056, + 0.438063, 0.674154, 0.004456, 0.087527, 0.291269, 0.028474, 0.450819, + 0.013642, 0.920896, 0.488815, 0.161840, 0.162084, 0.319803, 0.564989, + 0.255287, 0.036348, 0.127750, 0.288461, 0.681906, 0.816370, 0.664449, + 0.282235, 0.537126, 0.265328, 0.964965, 0.043672, 0.577898, 0.990173, + 0.348186, 0.346446, 0.725700, 0.211463, 0.549821, 0.167943, 0.837062, + 0.700003, 0.950896, 0.048341, 0.523087, 0.034761, 0.933439, 0.287393, + 0.299081, 0.840144, 0.894284, 0.885464, 0.845302, 0.157476, 0.948210, + 0.635060, 0.660421, 0.607990, 0.852107, 0.268868, 0.888760, 0.502518, + 0.180609, 0.070650, 0.602802, 0.555223, 0.285440, 0.855495, 0.321665, + 0.356700, 0.068758, 0.725059, 0.047487, 0.263344, 0.102695, 0.504959, + 0.600452, 0.858974, 0.125217, 0.269662, 0.533982, 0.644642, 0.444838, + 0.861721, 0.411145, 0.113712, 0.284371, 0.811182, 0.723930, 0.867702, + 0.595538, 0.561968, 0.235847, 0.929167, 0.375408, 0.410901, 0.030122, + 0.908536, 0.016297, 0.065859, 0.043977, 0.180425, 0.719810, 0.229469, + 0.370403, 0.726096, 0.506699, 0.114353, 0.108921, 0.797998, 0.853908, + 0.296274, 0.046419, 0.063143, 0.489364, 0.811396, 0.949217, 0.380902, + 0.376751, 0.903958, 0.747703, 0.872127, 0.420392, 0.330729, 0.395032, + 0.435102, 0.922697, 0.628071, 0.680502, 0.365703, 0.324259, 0.248299, + 0.779656, 0.236610, 0.258950, 0.971496, 0.821680, 0.692892, 0.454146, + 0.498856, 0.255776, 0.319895, 0.508377, 0.634022, 0.297617, 0.239479, + 0.076937, 0.958342, 0.237007, 0.591144, 0.497055, 0.406842, 0.888241, + 0.554064, 0.383587, 0.650624], + [0.234896, 0.423061, 0.263443, 0.123426, + 0.794525, 0.243195, 0.176474, 0.282455, 0.620580, 0.126517, 0.858114, + 0.150592, 0.351949, 0.153976, 0.480803, 0.272537, 0.062543, 0.525171, + 0.896010, 0.872203, 0.431661, 0.702341, 0.385838, 0.951113, 0.058039, + 0.563982, 0.981357, 0.319594, 0.190779, 0.159156, 0.182152, 0.912154, + 0.046355, 0.322471, 0.190853, 0.146977, 0.556987, 0.432033, 0.849777, + 0.397618, 0.800925, 0.817440, 0.103982, 0.417800, 0.982832, 0.123455, + 0.075878, 0.578246, 0.575774, 0.662847, 0.121769, 0.310270, 0.451505, + 0.871721, 0.263607, 0.963375, 0.198854, 0.249971, 0.273863, 0.592648, + 0.133579, 0.119994, 0.679855, 0.626287, 0.174323, 0.164256, 0.841121, + 0.752313, 0.501021, 0.569367, 0.804985, 0.639864, 0.272153, 0.055158, + 0.281015, 0.090302, 0.648710, 0.526850, 0.121161, 0.620315, 0.383709, + 0.487889, 0.739381, 0.609108, 0.181023, 0.419480, 0.453455, 0.658062, + 0.054643, 0.832708, 0.255309, 0.744293, 0.909823, 0.895573, 0.934952, + 0.332162, 0.514298, 0.129617, 0.568588, 0.459891, 0.512871, 0.708730, + 0.244905, 0.504490, 0.408360, 0.724549, 0.263859, 0.126921, 0.917366, + 0.128843, 0.761606, 0.295994, 0.485532, 0.364426, 0.209157, 0.331918, + 0.923155, 0.832404, 0.344705, 0.992287, 0.797664, 0.513933, 0.197295, + 0.898075, 0.321190, 0.766076, 0.896433, 0.510118, 0.555644, 0.731407, + 0.336166, 0.961858, 0.108792, 0.274650, 0.447974, 0.322401, 0.519439, + 0.127972, 0.743228, 0.095587, 0.442358, 0.065578, 0.427339, 0.867874, + 0.115209, 0.391970, 0.222726, 0.427568, 0.562064, 0.073965, 0.500635, + 0.103580, 0.193423, 0.463678, 0.352990, 0.872354, 0.266832, 0.066053, + 0.567679, 0.465254, 0.715300, 0.890676, 0.962122, 0.823967, 0.085568, + 0.195321, 0.730473, 0.142718, 0.589829, 0.954951, 0.190184, 0.350517, + 0.593301, 0.582699, 0.060864, 0.072237, 0.305630, 0.417032, 0.670941, + 0.430787, 0.876681, 0.244844, 0.060370, 0.274557, 0.598552, 0.194049, + 0.661775, 0.251685, 0.143953, 0.228740, 0.268005, 0.353289, 0.234517, + 0.866899, 0.382406, 0.826395, 0.551468, 0.910383, 0.677785, 0.487901, + 0.408431, 0.465832, 0.226357, 0.897554, 0.717515, 0.630160, 0.664560, + 0.807919, 0.184460, 0.314334, 0.122805, 0.073591, 0.617129, 0.220999, + 0.050125, 0.388057, 0.262980, 0.898668, 0.103295, 0.798561, 0.110919, + 0.451100, 0.852923, 0.263962, 0.169917, 0.891759, 0.902670, 0.074144, + 0.746980, 0.667262, 0.158418, 0.192804, 0.468950]), + + ([0.964202, 0.066500, 0.226936, 0.692160, 0.655660, 0.898740, 0.524033, + 0.579821, 0.196814, 0.235450, 0.473617, 0.647664, 0.698416, 0.424787, + 0.767571, 0.187048, 0.029542, 0.048921, 0.508835, 0.956023, 0.030000, + 0.973724, 0.787866, 0.432691, 0.833460, 0.532731, 0.948271, 0.219459, + 0.583239, 0.502701, 0.073183, 0.503311, 0.322489, 0.025788, 0.723991, + 0.979400, 0.338694, 0.135716, 0.461501, 0.143620, 0.745018, 0.043428, + 0.182409, 0.360729, 0.578967, 0.839015, 0.800714, 0.613727, 0.199988, + 0.765618, 0.306711, 0.341594, 0.267281, 0.722098, 0.733726, 0.270852, + 0.078555, 0.150273, 0.064547, 0.647755, 0.551744, 0.963408, 0.608631, + 0.776727, 0.630360, 0.671590, 0.880856, 0.272225, 0.393933, 0.361126, + 0.513932, 0.929319, 0.654927, 0.683248, 0.235145, 0.619770, 0.322947, + 0.509049, 0.438612, 0.119938, 0.318155, 0.406720, 0.384625, 0.276345, + 0.314371, 0.597186, 0.557329, 0.415448, 0.093722, 0.544572, 0.211493, + 0.403851, 0.794000, 0.837703, 0.640553, 0.265084, 0.829402, 0.518754, + 0.195807, 0.759392, 0.766900, 0.515610, 0.589740, 0.832545, 0.938505, + 0.333811, 0.512986, 0.340007, 0.071291, 0.664602, 0.097476, 0.953063, + 0.716330, 0.065249, 0.256539, 0.652181, 0.757408, 0.367809, 0.432722, + 0.715354, 0.781518, 0.972747, 0.785791, 0.606159, 0.591449, 0.683523, + 0.350780, 0.668813, 0.642537, 0.238472, 0.198431, 0.035859, 0.684408, + 0.196112, 0.128605, 0.655354, 0.388958, 0.330393, 0.928220, 0.843074, + 0.246040, 0.191717, 0.724906, 0.266549, 0.507981, 0.990509, 0.467574, + 0.767113, 0.463881, 0.458998, 0.065279, 0.925687, 0.825770, 0.848079, + 0.215400, 0.779382, 0.506851, 0.714957, 0.452528, 0.594592, 0.573901, + 0.658132, 0.449507, 0.102847, 0.654500, 0.655812, 0.101474, 0.105991, + 0.580767, 0.164403, 0.424482, 0.856655, 0.550645, 0.632588, 0.799554, + 0.120334, 0.587909, 0.587939, 0.594195, 0.325510, 0.582446, 0.952055, + 0.691580, 0.707785, 0.691580, 0.740196, 0.959563, 0.854366, 0.384228, + 0.802393, 0.190100, 0.555376, 0.908933, 0.761345, 0.541063, 0.367840, + 0.466506, 0.804132, 0.010590, 0.799005, 0.869655, 0.483566, 0.976623, + 0.514817, 0.969665, 0.185705, 0.331492, 0.480422, 0.632160, 0.419385, + 0.244026, 0.438002, 0.543016, 0.584490, 0.079379, 0.629322, 0.625263, + 0.374889, 0.508713, 0.168279, 0.348827, 0.472396, 0.339213, 0.970336, + 0.714225, 0.688009, 0.096377, 0.644551, 0.190954, 0.206671, 0.889401, + 0.255043, 0.392529], + [ 0.347267, 0.395278, 0.312221, 0.271034, 0.606466, + 0.281430, 0.206116, 0.433894, 0.811608, 0.149699, 0.930589, 0.131576, + 0.606860, 0.168244, 0.510042, 0.318780, 0.017318, 0.390086, 0.887702, + 0.856325, 0.410205, 0.731879, 0.429107, 0.951366, 0.090044, 0.460008, + 0.982247, 0.365122, 0.274204, 0.137115, 0.153039, 0.951211, 0.065363, + 0.265502, 0.089683, 0.080594, 0.583010, 0.702345, 0.741734, 0.195394, + 0.694880, 0.634725, 0.110399, 0.510145, 0.984661, 0.095715, 0.060022, + 0.603920, 0.771879, 0.818352, 0.082082, 0.618599, 0.573476, 0.893264, + 0.229809, 0.985823, 0.317123, 0.178742, 0.319886, 0.742494, 0.070001, + 0.097983, 0.799138, 0.627735, 0.234819, 0.174270, 0.832352, 0.747531, + 0.647704, 0.705891, 0.773991, 0.515965, 0.364954, 0.068576, 0.245708, + 0.052415, 0.660207, 0.516471, 0.116974, 0.402301, 0.668778, 0.478975, + 0.759934, 0.675118, 0.254879, 0.420252, 0.301185, 0.501663, 0.106245, + 0.885773, 0.233874, 0.852706, 0.920644, 0.903723, 0.918905, 0.397496, + 0.508660, 0.350752, 0.525033, 0.525978, 0.501128, 0.591062, 0.327965, + 0.501709, 0.383894, 0.685330, 0.354505, 0.031559, 0.873401, 0.127268, + 0.798431, 0.353377, 0.460709, 0.275419, 0.208795, 0.362425, 0.876697, + 0.927418, 0.263693, 0.985030, 0.725649, 0.371198, 0.304175, 0.897437, + 0.436677, 0.633838, 0.883890, 0.471352, 0.563572, 0.763623, 0.364169, + 0.958443, 0.068425, 0.260482, 0.313543, 0.394317, 0.443647, 0.121875, + 0.780465, 0.211723, 0.268817, 0.067533, 0.660574, 0.821465, 0.084727, + 0.520244, 0.288125, 0.675550, 0.580184, 0.116487, 0.701141, 0.082960, + 0.262049, 0.478233, 0.452062, 0.902427, 0.540173, 0.098391, 0.338498, + 0.422226, 0.634723, 0.927242, 0.954212, 0.803277, 0.096551, 0.200374, + 0.689030, 0.291707, 0.580938, 0.939620, 0.151359, 0.232785, 0.503464, + 0.695066, 0.052623, 0.060584, 0.175948, 0.382867, 0.590377, 0.137340, + 0.854693, 0.227445, 0.042913, 0.300106, 0.598812, 0.232287, 0.684412, + 0.365377, 0.094614, 0.097589, 0.241374, 0.555737, 0.246608, 0.794405, + 0.244149, 0.733437, 0.394148, 0.893992, 0.702754, 0.580066, 0.313107, + 0.633119, 0.305982, 0.934299, 0.642923, 0.551348, 0.624630, 0.790857, + 0.331221, 0.474498, 0.189123, 0.110964, 0.484088, 0.151825, 0.119752, + 0.369902, 0.186865, 0.815287, 0.074211, 0.710128, 0.272505, 0.428258, + 0.913809, 0.370850, 0.101142, 0.907882, 0.813830, 0.169027, 0.828513, + 0.535021, 0.157700, 0.154209, 0.657740] ), + + ([0.091800, 0.590747, 0.357860, 0.768944, 0.705832, 0.861995, 0.219123, + 0.097995, 0.202826, 0.055971, 0.621387, 0.056795, 0.750175, 0.527818, + 0.164159, 0.654408, 0.634266, 0.384625, 0.464583, 0.807123, 0.907865, + 0.206702, 0.164922, 0.837733, 0.734306, 0.770074, 0.152898, 0.179693, + 0.085452, 0.302530, 0.901242, 0.067660, 0.949400, 0.304209, 0.332316, + 0.495651, 0.703909, 0.463515, 0.115024, 0.223945, 0.812586, 0.700278, + 0.798822, 0.116245, 0.499100, 0.867183, 0.692465, 0.587878, 0.556658, + 0.140294, 0.892911, 0.446852, 0.947905, 0.630696, 0.370830, 0.908597, + 0.352580, 0.247810, 0.519211, 0.065737, 0.318644, 0.345988, 0.070711, + 0.594501, 0.172735, 0.185614, 0.790979, 0.978179, 0.347209, 0.739830, + 0.852931, 0.029786, 0.279061, 0.878292, 0.299570, 0.995025, 0.537614, + 0.459029, 0.500534, 0.015748, 0.336619, 0.359905, 0.009095, 0.237007, + 0.087802, 0.980621, 0.726005, 0.337168, 0.151524, 0.246712, 0.775872, + 0.763451, 0.440596, 0.646962, 0.003052, 0.453749, 0.034516, 0.334819, + 0.492813, 0.326060, 0.459212, 0.825983, 0.023896, 0.316568, 0.789178, + 0.322672, 0.859310, 0.248024, 0.228217, 0.196203, 0.781091, 0.309366, + 0.324992, 0.658956, 0.775445, 0.427870, 0.479324, 0.157048, 0.274606, + 0.315165, 0.895993, 0.515091, 0.361614, 0.468337, 0.642048, 0.363872, + 0.844020, 0.907407, 0.963775, 0.882931, 0.603198, 0.930235, 0.519639, + 0.388195, 0.125248, 0.666524, 0.685812, 0.797388, 0.619831, 0.711478, + 0.589740, 0.502792, 0.632923, 0.621326, 0.028840, 0.684194, 0.560228, + 0.550920, 0.930204, 0.591937, 0.967132, 0.815455, 0.507126, 0.832453, + 0.121433, 0.657216, 0.769890, 0.186468, 0.645528, 0.998627, 0.545610, + 0.992279, 0.693594, 0.462813, 0.664510, 0.624012, 0.560564, 0.443159, + 0.468307, 0.097537, 0.129246, 0.502792, 0.297189, 0.334117, 0.061190, + 0.885464, 0.111545, 0.113559, 0.138157, 0.418867, 0.904599, 0.248360, + 0.660176, 0.592181, 0.062349, 0.009522, 0.306528, 0.088137, 0.327311, + 0.335643, 0.365917, 0.551897, 0.521531, 0.856471, 0.741783, 0.877163, + 0.686026, 0.262154, 0.639637, 0.791314, 0.792169, 0.049593, 0.341929, + 0.020661, 0.681936, 0.176702, 0.977325, 0.816828, 0.392651, 0.656301, + 0.690176, 0.125736, 0.522843, 0.620746, 0.116733, 0.180731, 0.795282, + 0.888485, 0.574419, 0.800439, 0.473739, 0.563616, 0.869655, 0.172918, + 0.789270, 0.700369, 0.131840, 0.407849, 0.032655, 0.562670, 0.578539, + 0.636982, 0.469131], + [0.250121, 0.483413, 0.264094, 0.307941, 0.733994, + 0.238909, 0.172450, 0.289615, 0.639522, 0.156406, 0.927321, 0.115653, + 0.439196, 0.138059, 0.430463, 0.210567, 0.043311, 0.427593, 0.713422, + 0.874737, 0.349128, 0.641711, 0.307643, 0.960792, 0.057629, 0.274816, + 0.959588, 0.398889, 0.271323, 0.171029, 0.242094, 0.978259, 0.096858, + 0.335654, 0.139114, 0.149906, 0.430454, 0.483910, 0.630219, 0.285243, + 0.744639, 0.707501, 0.128506, 0.505621, 0.986704, 0.086747, 0.267839, + 0.638377, 0.606427, 0.850217, 0.108584, 0.368790, 0.415063, 0.828986, + 0.366711, 0.960958, 0.215415, 0.253284, 0.268513, 0.436681, 0.111406, + 0.103739, 0.653758, 0.511406, 0.359645, 0.142705, 0.886096, 0.729033, + 0.570775, 0.475699, 0.781399, 0.624880, 0.453394, 0.105905, 0.258093, + 0.043573, 0.695208, 0.381172, 0.131100, 0.470651, 0.494271, 0.329024, + 0.677485, 0.566830, 0.452777, 0.283240, 0.187764, 0.614069, 0.110264, + 0.810169, 0.297650, 0.804280, 0.875188, 0.876858, 0.950973, 0.347310, + 0.568015, 0.203545, 0.636385, 0.402638, 0.561527, 0.704415, 0.335657, + 0.416779, 0.371755, 0.656713, 0.245263, 0.069130, 0.858867, 0.117609, + 0.814266, 0.357809, 0.368650, 0.195525, 0.253112, 0.273989, 0.897546, + 0.737842, 0.188547, 0.991165, 0.751005, 0.552062, 0.267549, 0.903292, + 0.309227, 0.766666, 0.885213, 0.570977, 0.382676, 0.564119, 0.461571, + 0.938216, 0.127708, 0.189827, 0.276506, 0.377828, 0.537514, 0.231975, + 0.575255, 0.211339, 0.194267, 0.110436, 0.330972, 0.823506, 0.087909, + 0.405803, 0.398364, 0.585681, 0.676848, 0.126466, 0.459028, 0.068184, + 0.229350, 0.508934, 0.295492, 0.876380, 0.290811, 0.034688, 0.401911, + 0.337465, 0.767958, 0.852948, 0.981002, 0.763970, 0.070562, 0.312852, + 0.691511, 0.244069, 0.497265, 0.912701, 0.104435, 0.312821, 0.663720, + 0.688728, 0.072052, 0.040471, 0.113943, 0.208670, 0.557001, 0.255511, + 0.744639, 0.166425, 0.049652, 0.223302, 0.492090, 0.229562, 0.573484, + 0.590362, 0.206928, 0.294928, 0.183751, 0.270976, 0.310734, 0.917243, + 0.200381, 0.691783, 0.425492, 0.882956, 0.635164, 0.618051, 0.253056, + 0.505014, 0.434698, 0.910271, 0.737867, 0.553463, 0.588869, 0.748615, + 0.244402, 0.282370, 0.257965, 0.119861, 0.620997, 0.124454, 0.112210, + 0.383214, 0.245615, 0.853594, 0.145247, 0.776892, 0.166819, 0.548061, + 0.802385, 0.142570, 0.098268, 0.887335, 0.906549, 0.087140, 0.690883, + 0.731714, 0.239845, 0.207338, 0.304361] ), + + ([0.511246, 0.618427, 0.945036, 0.731468, 0.048402, 0.198859, 0.911771, + 0.848018, 0.052889, 0.803369, 0.046754, 0.561571, 0.734703, 0.006043, + 0.897824, 0.095798, 0.342509, 0.988769, 0.114628, 0.024812, 0.153844, + 0.927488, 0.248695, 0.402722, 0.780084, 0.654073, 0.570818, 0.809198, + 0.316813, 0.499557, 0.687429, 0.467269, 0.371319, 0.725608, 0.237007, + 0.089572, 0.498337, 0.449721, 0.447890, 0.609638, 0.075076, 0.471175, + 0.838435, 0.453658, 0.147130, 0.903470, 0.841304, 0.510117, 0.276162, + 0.019532, 0.632557, 0.452528, 0.921018, 0.216407, 0.947417, 0.572161, + 0.382977, 0.504929, 0.163121, 0.776605, 0.847072, 0.431288, 0.431196, + 0.910825, 0.550035, 0.836573, 0.139134, 0.056368, 0.606738, 0.360027, + 0.484054, 0.965941, 0.525834, 0.093295, 0.438520, 0.288186, 0.946165, + 0.290719, 0.890316, 0.740532, 0.625294, 0.543016, 0.237251, 0.885006, + 0.211066, 0.319712, 0.218513, 0.663961, 0.827631, 0.287240, 0.263222, + 0.352092, 0.007172, 0.308573, 0.138035, 0.080264, 0.998840, 0.530656, + 0.174993, 0.588122, 0.985260, 0.466170, 0.860317, 0.361461, 0.239326, + 0.475600, 0.065981, 0.810541, 0.751152, 0.555773, 0.705252, 0.645741, + 0.356883, 0.841639, 0.093051, 0.106632, 0.901242, 0.726859, 0.792779, + 0.200873, 0.463912, 0.010041, 0.230628, 0.609210, 0.182226, 0.972442, + 0.859035, 0.412427, 0.700308, 0.793481, 0.149602, 0.297342, 0.776666, + 0.210761, 0.198004, 0.397015, 0.081118, 0.830256, 0.221076, 0.422315, + 0.712790, 0.992767, 0.727836, 0.240638, 0.469253, 0.604083, 0.645497, + 0.558153, 0.399884, 0.833644, 0.182073, 0.861904, 0.672903, 0.088626, + 0.706290, 0.277627, 0.288400, 0.170141, 0.426405, 0.500320, 0.668447, + 0.016816, 0.149052, 0.452895, 0.655019, 0.942717, 0.899747, 0.829737, + 0.947935, 0.775628, 0.685324, 0.181372, 0.512894, 0.802149, 0.180853, + 0.696341, 0.991943, 0.925413, 0.621357, 0.336467, 0.646809, 0.942015, + 0.679678, 0.482131, 0.867000, 0.344493, 0.612293, 0.743370, 0.773278, + 0.555376, 0.453688, 0.093204, 0.948363, 0.998871, 0.540880, 0.979797, + 0.825709, 0.917112, 0.149327, 0.572924, 0.767724, 0.336436, 0.521439, + 0.801843, 0.364666, 0.090609, 0.068575, 0.340251, 0.985717, 0.306742, + 0.028718, 0.194739, 0.112888, 0.260231, 0.360057, 0.053102, 0.489731, + 0.005432, 0.151982, 0.048616, 0.615528, 0.687857, 0.335643, 0.096561, + 0.616504, 0.943907, 0.973693, 0.459304, 0.025239, 0.295297, 0.911924, + 0.696127, 0.499680], + [0.372363, 0.313207, 0.276106, 0.279324, 0.820741, + 0.205839, 0.328552, 0.399419, 0.774962, 0.215105, 0.853020, 0.226282, + 0.571785, 0.173005, 0.436688, 0.238419, 0.019348, 0.460500, 0.847289, + 0.878880, 0.228861, 0.695937, 0.239922, 0.971454, 0.036638, 0.461105, + 0.972190, 0.455536, 0.254031, 0.210429, 0.335951, 0.912823, 0.057891, + 0.222266, 0.176725, 0.124067, 0.581808, 0.736316, 0.652302, 0.248547, + 0.704722, 0.716806, 0.087022, 0.515832, 0.973141, 0.095332, 0.098511, + 0.549793, 0.810595, 0.823819, 0.070312, 0.561088, 0.364184, 0.852806, + 0.259421, 0.961891, 0.135451, 0.210059, 0.366696, 0.553164, 0.115941, + 0.097627, 0.862905, 0.499057, 0.464813, 0.240171, 0.903088, 0.744335, + 0.613677, 0.796010, 0.774554, 0.611191, 0.427484, 0.043273, 0.272693, + 0.091735, 0.626866, 0.598557, 0.314647, 0.606310, 0.660126, 0.401762, + 0.782298, 0.587858, 0.140014, 0.598725, 0.358832, 0.437350, 0.217892, + 0.874923, 0.189696, 0.806172, 0.853777, 0.849070, 0.872760, 0.442148, + 0.530084, 0.230444, 0.608441, 0.564128, 0.408068, 0.732274, 0.456723, + 0.421654, 0.596509, 0.737912, 0.407249, 0.036761, 0.856259, 0.132400, + 0.832515, 0.371338, 0.573567, 0.425011, 0.247448, 0.522633, 0.942719, + 0.907415, 0.228517, 0.986824, 0.848198, 0.284663, 0.271171, 0.915369, + 0.547810, 0.745923, 0.881908, 0.504883, 0.428851, 0.661564, 0.298134, + 0.974143, 0.105652, 0.342785, 0.412873, 0.440510, 0.350132, 0.211733, + 0.810887, 0.132996, 0.237006, 0.051134, 0.598440, 0.778627, 0.090580, + 0.634583, 0.339945, 0.511342, 0.660187, 0.184938, 0.614215, 0.064794, + 0.270805, 0.456836, 0.536392, 0.940503, 0.295905, 0.129487, 0.447837, + 0.526879, 0.729304, 0.910458, 0.972890, 0.761394, 0.249717, 0.346499, + 0.779652, 0.299671, 0.729285, 0.934442, 0.192382, 0.281585, 0.555343, + 0.601925, 0.071142, 0.063458, 0.207701, 0.356162, 0.631022, 0.165572, + 0.760330, 0.131365, 0.021257, 0.262862, 0.640069, 0.250123, 0.642715, + 0.204412, 0.149900, 0.125013, 0.202026, 0.475843, 0.260838, 0.853036, + 0.272570, 0.625518, 0.496405, 0.928861, 0.852380, 0.627557, 0.282402, + 0.475618, 0.273318, 0.944023, 0.592831, 0.608529, 0.662162, 0.839359, + 0.161527, 0.473947, 0.200285, 0.107977, 0.738683, 0.100967, 0.083270, + 0.366952, 0.199829, 0.879304, 0.068496, 0.810832, 0.152595, 0.411953, + 0.930309, 0.339304, 0.144649, 0.935868, 0.843733, 0.110269, 0.859667, + 0.592107, 0.216361, 0.175124, 0.385298] ), + + ([0.943571, 0.073397, 0.654073, 0.012421, 0.871151, 0.176305, 0.656026, + 0.542619, 0.655629, 0.156926, 0.542405, 0.800378, 0.902829, 0.078860, + 0.722526, 0.016022, 0.705557, 0.810053, 0.891964, 0.325236, 0.033692, + 0.248329, 0.572222, 0.780511, 0.462539, 0.377392, 0.129032, 0.521500, + 0.144963, 0.933775, 0.425214, 0.134312, 0.434156, 0.966491, 0.764672, + 0.731895, 0.062868, 0.070772, 0.283547, 0.786004, 0.285745, 0.576525, + 0.445143, 0.242653, 0.890561, 0.473159, 0.794336, 0.951994, 0.485031, + 0.352306, 0.628040, 0.943632, 0.965209, 0.149022, 0.738151, 0.579333, + 0.571642, 0.963286, 0.882778, 0.113498, 0.439985, 0.742515, 0.142247, + 0.693381, 0.051637, 0.107181, 0.816492, 0.329875, 0.491256, 0.099826, + 0.018921, 0.870327, 0.917081, 0.139225, 0.624866, 0.504471, 0.150365, + 0.961089, 0.728721, 0.834925, 0.790429, 0.825892, 0.267861, 0.043214, + 0.760887, 0.776238, 0.968657, 0.183111, 0.694266, 0.223640, 0.270516, + 0.131596, 0.060457, 0.646962, 0.385601, 0.229835, 0.445692, 0.683218, + 0.148625, 0.144536, 0.887997, 0.392621, 0.814661, 0.981414, 0.675863, + 0.978240, 0.459761, 0.181738, 0.515610, 0.742088, 0.142125, 0.233406, + 0.474563, 0.559130, 0.478713, 0.727805, 0.605640, 0.649739, 0.794183, + 0.793298, 0.659810, 0.932279, 0.498611, 0.437361, 0.792779, 0.737205, + 0.849818, 0.827906, 0.672170, 0.163610, 0.756523, 0.045228, 0.891018, + 0.859615, 0.779260, 0.336314, 0.094516, 0.507736, 0.984222, 0.401685, + 0.725700, 0.796930, 0.807337, 0.747398, 0.796442, 0.161718, 0.584033, + 0.632344, 0.590472, 0.070559, 0.901578, 0.642506, 0.703818, 0.144047, + 0.429609, 0.423597, 0.329569, 0.884640, 0.385693, 0.603046, 0.193243, + 0.298593, 0.291696, 0.432661, 0.044496, 0.192328, 0.177679, 0.183294, + 0.111820, 0.423322, 0.888943, 0.822748, 0.426374, 0.887570, 0.653188, + 0.007904, 0.421369, 0.524461, 0.563555, 0.923124, 0.712760, 0.120975, + 0.133824, 0.994690, 0.468154, 0.195196, 0.582293, 0.014374, 0.269692, + 0.741783, 0.000336, 0.702048, 0.877377, 0.119633, 0.062075, 0.238655, + 0.798944, 0.863826, 0.431074, 0.801965, 0.072726, 0.701865, 0.520829, + 0.634602, 0.169713, 0.557176, 0.765007, 0.677358, 0.420850, 0.819544, + 0.053285, 0.297617, 0.876003, 0.664510, 0.490219, 0.144963, 0.000885, + 0.703085, 0.131718, 0.665090, 0.118290, 0.742485, 0.857143, 0.302835, + 0.999176, 0.939543, 0.031739, 0.926389, 0.510941, 0.128086, 0.116794, + 0.503006, 0.728446], + [0.351222, 0.278591, 0.283138, 0.122628, 0.763695, + 0.308245, 0.231191, 0.327072, 0.669178, 0.237753, 0.933039, 0.161955, + 0.527918, 0.162872, 0.276862, 0.338759, 0.013447, 0.500357, 0.758393, + 0.890117, 0.286404, 0.614922, 0.471315, 0.955186, 0.089488, 0.366257, + 0.978455, 0.616409, 0.306164, 0.160409, 0.159356, 0.978049, 0.097219, + 0.344033, 0.186289, 0.116885, 0.728207, 0.627205, 0.714860, 0.208562, + 0.727131, 0.828565, 0.158439, 0.466829, 0.971232, 0.121343, 0.161650, + 0.661611, 0.618124, 0.841358, 0.046860, 0.452121, 0.341010, 0.865947, + 0.152254, 0.966536, 0.213056, 0.304055, 0.335217, 0.523691, 0.087881, + 0.064809, 0.795485, 0.452027, 0.317999, 0.116250, 0.898968, 0.803284, + 0.544429, 0.616822, 0.841354, 0.611205, 0.371687, 0.033215, 0.256717, + 0.064430, 0.627021, 0.627504, 0.191870, 0.526017, 0.501716, 0.287086, + 0.784309, 0.622639, 0.183675, 0.468426, 0.212266, 0.355046, 0.108475, + 0.889961, 0.275599, 0.872669, 0.942839, 0.877238, 0.920511, 0.392231, + 0.563621, 0.144615, 0.633087, 0.349760, 0.505776, 0.827315, 0.389287, + 0.540466, 0.506721, 0.612825, 0.373225, 0.041362, 0.902200, 0.092558, + 0.739404, 0.272585, 0.388132, 0.298448, 0.321686, 0.374587, 0.935410, + 0.898459, 0.192054, 0.991002, 0.725184, 0.382465, 0.319403, 0.858241, + 0.597066, 0.710496, 0.882099, 0.531761, 0.456813, 0.845161, 0.499102, + 0.969086, 0.106525, 0.332143, 0.326130, 0.364720, 0.654414, 0.171305, + 0.596477, 0.110804, 0.178501, 0.057372, 0.576870, 0.814650, 0.061785, + 0.478826, 0.367008, 0.320375, 0.650806, 0.181174, 0.468965, 0.037388, + 0.270917, 0.385496, 0.362564, 0.833518, 0.339478, 0.046834, 0.462328, + 0.608506, 0.601353, 0.894656, 0.955409, 0.723455, 0.147482, 0.237962, + 0.735452, 0.206749, 0.757557, 0.933967, 0.214645, 0.375817, 0.574143, + 0.817046, 0.041647, 0.069035, 0.130061, 0.486610, 0.681156, 0.481305, + 0.869591, 0.204328, 0.104596, 0.343107, 0.564518, 0.275226, 0.611070, + 0.249097, 0.084293, 0.199324, 0.278827, 0.330948, 0.206980, 0.806283, + 0.256766, 0.588891, 0.445696, 0.906602, 0.709172, 0.561304, 0.262893, + 0.710889, 0.551355, 0.953251, 0.692670, 0.754259, 0.498363, 0.792302, + 0.159659, 0.299479, 0.167739, 0.071807, 0.487328, 0.132015, 0.081683, + 0.272535, 0.177688, 0.930233, 0.106226, 0.619949, 0.120131, 0.334437, + 0.914901, 0.213753, 0.088482, 0.942437, 0.858771, 0.095054, 0.726020, + 0.678025, 0.174585, 0.250140, 0.419005] ), + + ([0.601306, 0.883114, 0.558214, 0.413923, 0.130222, 0.384136, 0.449324, + 0.272683, 0.500229, 0.345470, 0.984649, 0.890042, 0.345927, 0.126225, + 0.419813, 0.756462, 0.566454, 0.909177, 0.362194, 0.286752, 0.101840, + 0.275582, 0.614643, 0.239540, 0.352245, 0.821070, 0.490219, 0.443525, + 0.020661, 0.968566, 0.628559, 0.236457, 0.661061, 0.635151, 0.845820, + 0.523545, 0.712516, 0.908383, 0.048616, 0.860897, 0.301248, 0.388562, + 0.744163, 0.470901, 0.591296, 0.353648, 0.176855, 0.595355, 0.965209, + 0.402234, 0.623585, 0.092685, 0.816248, 0.731590, 0.877987, 0.685690, + 0.233009, 0.706626, 0.455763, 0.765831, 0.358135, 0.876186, 0.551866, + 0.160466, 0.701590, 0.092624, 0.280770, 0.769280, 0.190893, 0.891629, + 0.231391, 0.475784, 0.238411, 0.787347, 0.867458, 0.240974, 0.607837, + 0.640522, 0.805078, 0.784509, 0.360515, 0.754662, 0.498337, 0.759972, + 0.663198, 0.857143, 0.364544, 0.830958, 0.738365, 0.621326, 0.879940, + 0.553301, 0.738395, 0.885830, 0.677480, 0.470473, 0.824793, 0.227515, + 0.177862, 0.328135, 0.233619, 0.044069, 0.784997, 0.813868, 0.608844, + 0.802728, 0.177038, 0.728782, 0.384106, 0.611042, 0.724540, 0.996948, + 0.494827, 0.766533, 0.566729, 0.418714, 0.201544, 0.440626, 0.377331, + 0.575030, 0.305979, 0.154241, 0.350841, 0.787622, 0.540605, 0.199896, + 0.441176, 0.542680, 0.413648, 0.667959, 0.382977, 0.283364, 0.290170, + 0.232246, 0.528031, 0.977935, 0.990936, 0.352031, 0.026643, 0.369121, + 0.689871, 0.045808, 0.386700, 0.311991, 0.391797, 0.894131, 0.940397, + 0.105319, 0.771477, 0.426649, 0.250557, 0.223823, 0.654927, 0.550768, + 0.987945, 0.356761, 0.925199, 0.177038, 0.309977, 0.159551, 0.132481, + 0.698355, 0.273354, 0.624531, 0.591235, 0.478805, 0.310312, 0.477004, + 0.244270, 0.008667, 0.301309, 0.503098, 0.076144, 0.881558, 0.274270, + 0.215339, 0.356426, 0.249977, 0.262093, 0.762444, 0.494186, 0.915983, + 0.349712, 0.489517, 0.785394, 0.712516, 0.441755, 0.054872, 0.833766, + 0.332133, 0.782250, 0.509812, 0.926908, 0.259377, 0.757439, 0.247291, + 0.148778, 0.962706, 0.013001, 0.226386, 0.509751, 0.002441, 0.417310, + 0.378002, 0.875271, 0.211280, 0.901120, 0.598773, 0.974853, 0.602954, + 0.705924, 0.238899, 0.272378, 0.165716, 0.071505, 0.490493, 0.978912, + 0.197302, 0.894253, 0.582476, 0.989257, 0.336314, 0.387463, 0.188452, + 0.023652, 0.948027, 0.274850, 0.953734, 0.756066, 0.019135, 0.548418, + 0.547594, 0.209479], + [0.271663, 0.525723, 0.267998, 0.250128, 0.702226, + 0.229707, 0.175555, 0.297942, 0.860000, 0.169436, 0.887007, 0.126692, + 0.384973, 0.182938, 0.553939, 0.253207, 0.029636, 0.425111, 0.846293, + 0.842762, 0.304010, 0.762392, 0.447713, 0.952176, 0.056503, 0.447279, + 0.970657, 0.412395, 0.340561, 0.121831, 0.176847, 0.956278, 0.114158, + 0.355843, 0.137279, 0.076094, 0.595278, 0.711299, 0.589624, 0.171310, + 0.768125, 0.554197, 0.121300, 0.554864, 0.976230, 0.161199, 0.085808, + 0.386882, 0.683964, 0.831818, 0.057765, 0.313484, 0.508615, 0.827996, + 0.333389, 0.971560, 0.189127, 0.211048, 0.345118, 0.566802, 0.105797, + 0.080436, 0.782501, 0.518403, 0.218373, 0.281876, 0.906947, 0.889611, + 0.479506, 0.629542, 0.654916, 0.480508, 0.389275, 0.082686, 0.280760, + 0.109858, 0.733491, 0.446057, 0.249002, 0.541121, 0.502550, 0.371208, + 0.721902, 0.436620, 0.244237, 0.250580, 0.226793, 0.627351, 0.160097, + 0.747408, 0.375859, 0.871497, 0.926349, 0.874001, 0.869867, 0.307266, + 0.483985, 0.124589, 0.578719, 0.366280, 0.412193, 0.594651, 0.369025, + 0.481161, 0.576671, 0.467754, 0.224526, 0.031813, 0.821986, 0.090304, + 0.836334, 0.444711, 0.408687, 0.205362, 0.263692, 0.475828, 0.905762, + 0.909118, 0.301838, 0.988982, 0.774767, 0.589240, 0.246877, 0.876037, + 0.457144, 0.741628, 0.921321, 0.527897, 0.302698, 0.768976, 0.397204, + 0.953512, 0.101570, 0.219640, 0.337110, 0.454909, 0.462697, 0.162126, + 0.761869, 0.168659, 0.298322, 0.061892, 0.703901, 0.867304, 0.080736, + 0.314129, 0.380475, 0.314903, 0.665137, 0.094841, 0.523808, 0.073543, + 0.279188, 0.490220, 0.451759, 0.926845, 0.472939, 0.145560, 0.309754, + 0.286070, 0.687752, 0.920453, 0.965685, 0.776630, 0.163112, 0.167838, + 0.626627, 0.243982, 0.641384, 0.902528, 0.114211, 0.308358, 0.492737, + 0.566340, 0.048890, 0.067968, 0.103615, 0.316475, 0.394561, 0.284335, + 0.879411, 0.207121, 0.036808, 0.216855, 0.550790, 0.368205, 0.531398, + 0.365759, 0.165072, 0.177080, 0.274344, 0.397236, 0.225324, 0.880869, + 0.228650, 0.783659, 0.547302, 0.814027, 0.767327, 0.545063, 0.256435, + 0.519250, 0.316496, 0.922818, 0.742588, 0.447345, 0.628000, 0.811624, + 0.252169, 0.572887, 0.213673, 0.089029, 0.696801, 0.113802, 0.091420, + 0.428054, 0.235681, 0.820236, 0.133022, 0.686627, 0.107302, 0.561399, + 0.916099, 0.288236, 0.200918, 0.935256, 0.871452, 0.071271, 0.844837, + 0.711053, 0.182887, 0.241940, 0.460490] ), + + ([0.219306, 0.322092, 0.147404, 0.200659, 0.284280, 0.812433, 0.760430, + 0.114444, 0.378002, 0.977233, 0.289865, 0.789850, 0.589251, 0.843959, + 0.751396, 0.798212, 0.219275, 0.058535, 0.546159, 0.895779, 0.016999, + 0.686483, 0.196661, 0.930845, 0.017365, 0.796655, 0.452040, 0.987487, + 0.139592, 0.860195, 0.168432, 0.046815, 0.201483, 0.494491, 0.871120, + 0.947172, 0.506088, 0.584613, 0.404584, 0.924009, 0.656545, 0.312540, + 0.576678, 0.511643, 0.756066, 0.126225, 0.203162, 0.087252, 0.648824, + 0.179022, 0.458876, 0.838771, 0.357830, 0.271249, 0.941954, 0.437727, + 0.376904, 0.824976, 0.356761, 0.198767, 0.971770, 0.923154, 0.222907, + 0.006409, 0.147496, 0.944456, 0.515183, 0.790796, 0.438429, 0.825312, + 0.641896, 0.833399, 0.176000, 0.479720, 0.666982, 0.684164, 0.392041, + 0.408856, 0.182928, 0.971374, 0.012452, 0.031281, 0.739891, 0.884854, + 0.498703, 0.765130, 0.237953, 0.614887, 0.592303, 0.393262, 0.188604, + 0.526902, 0.319590, 0.743370, 0.251320, 0.354137, 0.912076, 0.213263, + 0.951964, 0.188818, 0.799341, 0.173467, 0.989166, 0.553789, 0.330271, + 0.777825, 0.034639, 0.334971, 0.379254, 0.213538, 0.434095, 0.856960, + 0.493179, 0.922300, 0.714560, 0.881954, 0.735740, 0.822626, 0.304758, + 0.814142, 0.885464, 0.066225, 0.374645, 0.890103, 0.143284, 0.358257, + 0.200201, 0.637074, 0.006165, 0.373455, 0.959990, 0.379772, 0.463057, + 0.299265, 0.369518, 0.077609, 0.169347, 0.037141, 0.059816, 0.272897, + 0.756066, 0.093295, 0.106357, 0.431806, 0.929991, 0.690115, 0.614643, + 0.459212, 0.521317, 0.129551, 0.768517, 0.668508, 0.134556, 0.939848, + 0.248054, 0.987823, 0.559313, 0.836421, 0.422315, 0.683584, 0.597034, + 0.028748, 0.224067, 0.383435, 0.460158, 0.904111, 0.112278, 0.678640, + 0.399579, 0.619312, 0.028840, 0.088046, 0.717002, 0.632313, 0.755638, + 0.664907, 0.818293, 0.704154, 0.578021, 0.027009, 0.464095, 0.402936, + 0.661733, 0.092349, 0.874020, 0.641255, 0.048372, 0.300729, 0.840358, + 0.277657, 0.676748, 0.603351, 0.508164, 0.314188, 0.335276, 0.000824, + 0.977386, 0.720634, 0.953093, 0.911679, 0.383465, 0.417096, 0.134404, + 0.151738, 0.612903, 0.446089, 0.344005, 0.806513, 0.309671, 0.865047, + 0.648915, 0.777062, 0.328990, 0.391095, 0.423078, 0.281167, 0.294504, + 0.328928, 0.921384, 0.090823, 0.415387, 0.813135, 0.128697, 0.787164, + 0.219306, 0.896023, 0.790979, 0.814234, 0.357738, 0.512772, 0.033723, + 0.612995, 0.139805], + [0.337469, 0.211019, 0.303828, 0.169147, 0.566631, + 0.265004, 0.229917, 0.266692, 0.707275, 0.181060, 0.891105, 0.151850, + 0.330346, 0.236540, 0.566669, 0.367808, 0.022893, 0.342128, 0.828586, + 0.836092, 0.288965, 0.520367, 0.340710, 0.948377, 0.068229, 0.481998, + 0.961949, 0.321867, 0.409557, 0.096625, 0.235185, 0.963402, 0.086902, + 0.304833, 0.136653, 0.100314, 0.555993, 0.473476, 0.687371, 0.091541, + 0.824397, 0.761128, 0.176079, 0.461218, 0.972764, 0.101685, 0.092011, + 0.704997, 0.786809, 0.845653, 0.048572, 0.532518, 0.294126, 0.790332, + 0.263704, 0.972708, 0.345158, 0.097973, 0.310588, 0.411926, 0.068545, + 0.167609, 0.738812, 0.590916, 0.165281, 0.483342, 0.827012, 0.874491, + 0.706514, 0.764947, 0.810091, 0.569694, 0.516268, 0.052071, 0.182505, + 0.087599, 0.683585, 0.451136, 0.172146, 0.361382, 0.584432, 0.524382, + 0.697889, 0.607622, 0.269281, 0.404014, 0.383005, 0.465719, 0.133359, + 0.848459, 0.329923, 0.676798, 0.918466, 0.925962, 0.912074, 0.448496, + 0.592100, 0.143557, 0.664445, 0.531189, 0.525847, 0.767499, 0.299313, + 0.578332, 0.624400, 0.466934, 0.132613, 0.062552, 0.904959, 0.127579, + 0.818607, 0.446923, 0.465014, 0.273226, 0.337396, 0.414281, 0.956502, + 0.834423, 0.290169, 0.990990, 0.851944, 0.418151, 0.380813, 0.826651, + 0.462244, 0.779744, 0.812940, 0.421702, 0.511798, 0.737402, 0.242433, + 0.976064, 0.082025, 0.373773, 0.357622, 0.499017, 0.402349, 0.271163, + 0.773220, 0.143733, 0.266738, 0.050067, 0.499764, 0.788335, 0.090030, + 0.517396, 0.443833, 0.574189, 0.552392, 0.191110, 0.418867, 0.138714, + 0.305420, 0.657505, 0.572325, 0.943814, 0.480564, 0.142950, 0.344197, + 0.370294, 0.751791, 0.917778, 0.979460, 0.802610, 0.237874, 0.154067, + 0.546123, 0.157159, 0.840947, 0.881112, 0.184218, 0.258215, 0.482485, + 0.519804, 0.043765, 0.055481, 0.093186, 0.499097, 0.448311, 0.311212, + 0.855592, 0.258039, 0.041089, 0.214369, 0.600970, 0.397062, 0.636188, + 0.356101, 0.081942, 0.210988, 0.129305, 0.371435, 0.371639, 0.813555, + 0.371106, 0.809968, 0.372638, 0.920697, 0.714700, 0.493914, 0.314693, + 0.564047, 0.208476, 0.945736, 0.642147, 0.532650, 0.600253, 0.861064, + 0.231185, 0.557751, 0.243577, 0.108949, 0.781807, 0.164608, 0.116768, + 0.415680, 0.234421, 0.906828, 0.111577, 0.653296, 0.165778, 0.443490, + 0.832201, 0.205338, 0.099455, 0.939522, 0.892921, 0.067812, 0.864319, + 0.700760, 0.271345, 0.210610, 0.439696] ), + + ([0.854610, 0.475326, 0.616596, 0.950865, 0.181310, 0.239937, 0.388104, + 0.212043, 0.604663, 0.777734, 0.682180, 0.037111, 0.873531, 0.897580, + 0.711814, 0.242958, 0.692618, 0.919034, 0.401349, 0.869625, 0.605152, + 0.349773, 0.907193, 0.866420, 0.971740, 0.994659, 0.187109, 0.100467, + 0.075686, 0.902371, 0.899991, 0.343669, 0.887173, 0.056734, 0.416395, + 0.394208, 0.516037, 0.218085, 0.222419, 0.989471, 0.886166, 0.821223, + 0.496567, 0.665883, 0.661061, 0.336375, 0.142308, 0.222571, 0.953185, + 0.999573, 0.056734, 0.944517, 0.847346, 0.317728, 0.916807, 0.241737, + 0.270089, 0.256111, 0.264321, 0.861171, 0.235817, 0.513260, 0.171300, + 0.326365, 0.001282, 0.790063, 0.266274, 0.762535, 0.159398, 0.459365, + 0.403455, 0.762322, 0.203894, 0.542253, 0.755608, 0.448927, 0.595691, + 0.397046, 0.611988, 0.392743, 0.862850, 0.027497, 0.662709, 0.537706, + 0.764550, 0.416578, 0.050600, 0.793786, 0.051119, 0.791528, 0.971892, + 0.451552, 0.850826, 0.227088, 0.106937, 0.075411, 0.214850, 0.492874, + 0.662587, 0.031648, 0.851985, 0.550890, 0.306497, 0.307230, 0.583544, + 0.610065, 0.775964, 0.776147, 0.550768, 0.143223, 0.441389, 0.569140, + 0.705100, 0.773644, 0.606220, 0.703238, 0.612903, 0.436659, 0.824488, + 0.627277, 0.106082, 0.723136, 0.016999, 0.839625, 0.809595, 0.810663, + 0.668081, 0.234626, 0.076937, 0.889065, 0.882870, 0.333628, 0.365429, + 0.486129, 0.587970, 0.057009, 0.581957, 0.600085, 0.655538, 0.193640, + 0.430799, 0.044923, 0.232307, 0.223701, 0.294565, 0.914945, 0.055483, + 0.651296, 0.679708, 0.574450, 0.035493, 0.503189, 0.757500, 0.079470, + 0.888302, 0.149663, 0.032319, 0.437056, 0.097079, 0.104068, 0.667837, + 0.608753, 0.985992, 0.956877, 0.502762, 0.664693, 0.185675, 0.100833, + 0.287271, 0.994018, 0.273446, 0.403882, 0.171575, 0.978393, 0.867855, + 0.484603, 0.977294, 0.034639, 0.959990, 0.748314, 0.283578, 0.432752, + 0.762108, 0.838771, 0.859127, 0.795434, 0.855464, 0.662252, 0.470412, + 0.685659, 0.917722, 0.640034, 0.599139, 0.188330, 0.812006, 0.345836, + 0.098178, 0.892514, 0.318552, 0.184057, 0.318918, 0.179724, 0.290109, + 0.265450, 0.740165, 0.226020, 0.512284, 0.136235, 0.630360, 0.622272, + 0.050356, 0.516984, 0.774438, 0.020600, 0.363872, 0.707480, 0.795923, + 0.712027, 0.969573, 0.814051, 0.106540, 0.542009, 0.934843, 0.455031, + 0.013642, 0.070437, 0.982299, 0.101444, 0.017182, 0.381726, 0.486923, + 0.708243, 0.827479], + [0.358315, 0.270049, 0.342954, 0.214249, 0.838752, + 0.310564, 0.336771, 0.491659, 0.732358, 0.146048, 0.875334, 0.177203, + 0.340052, 0.229098, 0.470689, 0.199422, 0.013477, 0.437964, 0.834417, + 0.801902, 0.374778, 0.710470, 0.380647, 0.932384, 0.136688, 0.415547, + 0.964993, 0.435191, 0.308797, 0.163246, 0.208703, 0.966874, 0.093376, + 0.265505, 0.059608, 0.236134, 0.535674, 0.631452, 0.664845, 0.282025, + 0.768258, 0.736782, 0.122918, 0.461566, 0.987912, 0.084404, 0.129183, + 0.480177, 0.727945, 0.669787, 0.062807, 0.564469, 0.428409, 0.826974, + 0.384675, 0.966756, 0.210445, 0.272487, 0.317097, 0.370697, 0.125074, + 0.121726, 0.635255, 0.498751, 0.333923, 0.279037, 0.831576, 0.742353, + 0.554140, 0.759262, 0.788903, 0.342407, 0.402883, 0.054452, 0.192420, + 0.161426, 0.594132, 0.626459, 0.311456, 0.580723, 0.643488, 0.466939, + 0.751366, 0.460380, 0.344418, 0.299266, 0.238402, 0.530317, 0.201173, + 0.845135, 0.368270, 0.901918, 0.933553, 0.879270, 0.896686, 0.242673, + 0.645876, 0.221722, 0.671788, 0.696868, 0.613856, 0.594100, 0.345442, + 0.478488, 0.365499, 0.560186, 0.419429, 0.068769, 0.764765, 0.122668, + 0.800360, 0.269527, 0.402713, 0.334230, 0.186238, 0.417001, 0.967712, + 0.853496, 0.310179, 0.990401, 0.731177, 0.343208, 0.224512, 0.855574, + 0.460790, 0.815310, 0.857852, 0.702756, 0.390921, 0.820575, 0.520593, + 0.972868, 0.068325, 0.330995, 0.461637, 0.405847, 0.510358, 0.189043, + 0.743286, 0.146544, 0.298520, 0.047979, 0.553638, 0.834975, 0.179460, + 0.576135, 0.432415, 0.424000, 0.680846, 0.195304, 0.569258, 0.102375, + 0.234922, 0.416825, 0.427743, 0.919058, 0.366473, 0.080673, 0.323088, + 0.458077, 0.866718, 0.887048, 0.954464, 0.853763, 0.211882, 0.257413, + 0.401140, 0.143234, 0.711803, 0.858469, 0.176694, 0.376906, 0.538888, + 0.499580, 0.083381, 0.049338, 0.126933, 0.301235, 0.503423, 0.417381, + 0.790785, 0.244376, 0.054084, 0.341139, 0.605380, 0.327142, 0.557695, + 0.273406, 0.123661, 0.177072, 0.239960, 0.264496, 0.289714, 0.758051, + 0.287238, 0.796446, 0.445350, 0.931600, 0.752621, 0.391089, 0.172409, + 0.373470, 0.299196, 0.900410, 0.786394, 0.402751, 0.604255, 0.859393, + 0.225666, 0.533102, 0.141675, 0.139006, 0.737770, 0.172180, 0.215538, + 0.462962, 0.197081, 0.947766, 0.109388, 0.597156, 0.074044, 0.534133, + 0.892876, 0.319288, 0.078681, 0.906544, 0.855450, 0.069378, 0.791340, + 0.571897, 0.240928, 0.309915, 0.333618] ), + + ([0.451521, 0.147221, 0.793268, 0.134800, 0.476577, 0.611164, 0.619312, + 0.662313, 0.073580, 0.838679, 0.636280, 0.533280, 0.753319, 0.481674, + 0.839106, 0.484176, 0.576586, 0.062868, 0.198126, 0.954619, 0.398022, + 0.234657, 0.817927, 0.585437, 0.603961, 0.899411, 0.980773, 0.156499, + 0.750755, 0.472213, 0.731285, 0.494858, 0.009735, 0.067598, 0.158452, + 0.385083, 0.825037, 0.891324, 0.030732, 0.012787, 0.690573, 0.618091, + 0.941404, 0.972564, 0.452345, 0.037629, 0.619587, 0.371441, 0.042665, + 0.748924, 0.563768, 0.059786, 0.051729, 0.184606, 0.653706, 0.519852, + 0.043977, 0.747215, 0.897092, 0.444105, 0.024262, 0.337168, 0.967315, + 0.534165, 0.961150, 0.055483, 0.688437, 0.551775, 0.772637, 0.360759, + 0.123692, 0.152776, 0.681478, 0.463057, 0.423811, 0.535783, 0.345561, + 0.235115, 0.091189, 0.436445, 0.670095, 0.422437, 0.816492, 0.498489, + 0.707541, 0.433393, 0.543687, 0.553453, 0.551897, 0.490768, 0.920011, + 0.839228, 0.633168, 0.425855, 0.786615, 0.689840, 0.318613, 0.896237, + 0.866817, 0.726920, 0.226783, 0.308817, 0.307596, 0.084445, 0.160772, + 0.229316, 0.231239, 0.697897, 0.066927, 0.558763, 0.952391, 0.189154, + 0.924924, 0.259499, 0.018006, 0.378399, 0.976012, 0.910947, 0.725455, + 0.954070, 0.195318, 0.876461, 0.275369, 0.332316, 0.414594, 0.363414, + 0.215857, 0.237434, 0.001343, 0.156438, 0.333476, 0.033784, 0.501236, + 0.306101, 0.648152, 0.341227, 0.149297, 0.553819, 0.667592, 0.964965, + 0.656789, 0.774438, 0.557909, 0.670919, 0.179449, 0.217383, 0.386395, + 0.838435, 0.873989, 0.828394, 0.092746, 0.520737, 0.948180, 0.431837, + 0.345286, 0.945158, 0.611988, 0.056398, 0.937925, 0.983947, 0.834864, + 0.184088, 0.884640, 0.627003, 0.315989, 0.204352, 0.867244, 0.987884, + 0.573992, 0.854793, 0.193091, 0.874325, 0.561632, 0.929228, 0.918790, + 0.454176, 0.712302, 0.034577, 0.295877, 0.048708, 0.824549, 0.678182, + 0.195654, 0.583819, 0.690542, 0.465743, 0.668020, 0.730705, 0.874996, + 0.692587, 0.291879, 0.267403, 0.550737, 0.108310, 0.472610, 0.692251, + 0.797235, 0.136631, 0.343059, 0.620319, 0.268136, 0.331645, 0.424207, + 0.994598, 0.634236, 0.351482, 0.702170, 0.642689, 0.708243, 0.230903, + 0.277017, 0.210700, 0.657064, 0.234046, 0.240455, 0.004852, 0.208808, + 0.068270, 0.938200, 0.773156, 0.259468, 0.740928, 0.273110, 0.957274, + 0.786981, 0.839503, 0.206091, 0.446608, 0.477462, 0.517289, 0.109989, + 0.365703, 0.971221], + [0.322975, 0.414170, 0.161146, 0.219434, 0.685011, + 0.207119, 0.124562, 0.313554, 0.680383, 0.204607, 0.926401, 0.123031, + 0.342319, 0.160562, 0.383025, 0.263413, 0.031530, 0.278214, 0.854517, + 0.938668, 0.207718, 0.530081, 0.599408, 0.967141, 0.060306, 0.216206, + 0.956149, 0.457582, 0.287160, 0.123662, 0.170455, 0.944915, 0.075664, + 0.367949, 0.137354, 0.245977, 0.789458, 0.601613, 0.753918, 0.205538, + 0.801701, 0.727608, 0.099538, 0.372815, 0.980670, 0.128872, 0.153952, + 0.733913, 0.697334, 0.832264, 0.048116, 0.476656, 0.542969, 0.813115, + 0.428087, 0.974934, 0.283452, 0.267722, 0.308373, 0.467845, 0.073733, + 0.060755, 0.726314, 0.632607, 0.207968, 0.198739, 0.724649, 0.827431, + 0.659246, 0.606561, 0.804978, 0.605795, 0.421802, 0.080890, 0.184399, + 0.042613, 0.669469, 0.636515, 0.163279, 0.506129, 0.443891, 0.538560, + 0.687417, 0.616605, 0.243001, 0.421577, 0.417744, 0.332821, 0.104680, + 0.814680, 0.274723, 0.854675, 0.928105, 0.822819, 0.907391, 0.392828, + 0.560366, 0.167488, 0.771640, 0.421482, 0.502021, 0.705366, 0.356323, + 0.236132, 0.465837, 0.673047, 0.271604, 0.044967, 0.875918, 0.101957, + 0.690344, 0.418263, 0.416007, 0.385675, 0.177956, 0.381637, 0.926377, + 0.834779, 0.212896, 0.991925, 0.837922, 0.493060, 0.257955, 0.881184, + 0.455624, 0.759888, 0.797075, 0.476411, 0.546274, 0.653626, 0.437864, + 0.979247, 0.101421, 0.310239, 0.301380, 0.315334, 0.540806, 0.179717, + 0.803455, 0.157591, 0.320087, 0.061332, 0.563749, 0.755219, 0.043938, + 0.411661, 0.403751, 0.445964, 0.558204, 0.265296, 0.639173, 0.087912, + 0.230078, 0.404120, 0.337301, 0.932361, 0.434332, 0.084389, 0.343341, + 0.257858, 0.761906, 0.918835, 0.952784, 0.774380, 0.105933, 0.159839, + 0.830403, 0.338071, 0.526166, 0.863985, 0.233685, 0.379596, 0.616285, + 0.618324, 0.069956, 0.031873, 0.139768, 0.470940, 0.707807, 0.243367, + 0.727987, 0.305121, 0.104586, 0.262189, 0.546923, 0.339179, 0.566545, + 0.340525, 0.118514, 0.187525, 0.391617, 0.309406, 0.182629, 0.782616, + 0.233684, 0.765575, 0.523726, 0.866878, 0.699958, 0.572039, 0.237482, + 0.526532, 0.374557, 0.928282, 0.707831, 0.618044, 0.446578, 0.624965, + 0.199537, 0.468197, 0.182506, 0.083061, 0.585536, 0.276978, 0.076367, + 0.358145, 0.224962, 0.838192, 0.129973, 0.763684, 0.229108, 0.557319, + 0.866519, 0.293349, 0.163828, 0.895601, 0.903358, 0.058000, 0.789358, + 0.591071, 0.270399, 0.131062, 0.486600] ), + + ([0.965209, 0.133641, 0.925626, 0.133671, 0.650899, 0.231605, 0.871517, + 0.258309, 0.107364, 0.016541, 0.557054, 0.607166, 0.550859, 0.089724, + 0.176702, 0.195593, 0.110752, 0.006592, 0.188025, 0.227668, 0.951659, + 0.533219, 0.454115, 0.087741, 0.069246, 0.349925, 0.138401, 0.295358, + 0.041841, 0.858791, 0.882534, 0.328928, 0.517289, 0.250343, 0.298502, + 0.725211, 0.718314, 0.486862, 0.306864, 0.359874, 0.746239, 0.357524, + 0.351665, 0.316630, 0.964873, 0.262246, 0.023408, 0.249794, 0.245796, + 0.880398, 0.122013, 0.647938, 0.356243, 0.380047, 0.689871, 0.903531, + 0.270577, 0.325297, 0.047121, 0.595904, 0.687124, 0.936308, 0.360454, + 0.893399, 0.531205, 0.859523, 0.775628, 0.480361, 0.725822, 0.103824, + 0.646290, 0.916501, 0.010987, 0.299142, 0.889737, 0.833583, 0.093417, + 0.933103, 0.000305, 0.876553, 0.907254, 0.722800, 0.753166, 0.794946, + 0.267495, 0.777764, 0.127628, 0.590930, 0.697531, 0.709616, 0.483627, + 0.130345, 0.711173, 0.345744, 0.520463, 0.122745, 0.331400, 0.202582, + 0.050539, 0.876949, 0.126804, 0.374828, 0.118503, 0.737968, 0.546495, + 0.997009, 0.497635, 0.612384, 0.835261, 0.933500, 0.093997, 0.487197, + 0.310099, 0.853481, 0.290597, 0.349590, 0.279397, 0.346660, 0.761834, + 0.412946, 0.385571, 0.236427, 0.789911, 0.056154, 0.653279, 0.746544, + 0.614765, 0.381603, 0.023560, 0.677328, 0.848170, 0.798975, 0.655934, + 0.248329, 0.483566, 0.540361, 0.778741, 0.762841, 0.533067, 0.513596, + 0.370281, 0.751061, 0.822260, 0.399396, 0.450819, 0.748253, 0.974914, + 0.399030, 0.267159, 0.363384, 0.118046, 0.538774, 0.151311, 0.795740, + 0.339244, 0.937040, 0.334025, 0.454329, 0.426740, 0.940641, 0.494705, + 0.837642, 0.924558, 0.536699, 0.328990, 0.329020, 0.032716, 0.946013, + 0.914975, 0.064608, 0.384930, 0.804102, 0.159703, 0.529588, 0.234169, + 0.837001, 0.106906, 0.039155, 0.077731, 0.436689, 0.387310, 0.760826, + 0.253212, 0.043825, 0.592669, 0.433638, 0.536180, 0.742943, 0.855220, + 0.441084, 0.271157, 0.976867, 0.412976, 0.393719, 0.067049, 0.786706, + 0.443129, 0.877956, 0.588458, 0.483413, 0.943754, 0.526688, 0.473434, + 0.156957, 0.945952, 0.069094, 0.910062, 0.930143, 0.837275, 0.514573, + 0.902127, 0.362255, 0.077548, 0.128025, 0.755486, 0.909848, 0.088778, + 0.352489, 0.816553, 0.850124, 0.599902, 0.334941, 0.993927, 0.573504, + 0.227882, 0.212073, 0.094333, 0.651753, 0.576739, 0.812311, 0.504532, + 0.587451, 0.634816], + [0.302431, 0.592346, 0.385344, 0.262467, 0.590451, + 0.183795, 0.213462, 0.439501, 0.685453, 0.160185, 0.933631, 0.128044, + 0.473315, 0.155567, 0.492202, 0.220253, 0.019522, 0.469708, 0.877853, + 0.882415, 0.430326, 0.645252, 0.298033, 0.974497, 0.075881, 0.454331, + 0.980756, 0.353203, 0.227064, 0.112352, 0.204441, 0.986582, 0.111204, + 0.360922, 0.104295, 0.042607, 0.664624, 0.575153, 0.703935, 0.219955, + 0.724316, 0.760176, 0.086626, 0.569313, 0.985771, 0.070120, 0.125450, + 0.608872, 0.735175, 0.869160, 0.116281, 0.382006, 0.535477, 0.916268, + 0.339548, 0.951149, 0.269138, 0.158267, 0.227921, 0.496810, 0.078373, + 0.109946, 0.857936, 0.460175, 0.325318, 0.226608, 0.881037, 0.765901, + 0.643060, 0.624702, 0.860348, 0.550049, 0.440815, 0.045541, 0.260502, + 0.076994, 0.577882, 0.615792, 0.139510, 0.358114, 0.612593, 0.347721, + 0.818075, 0.526762, 0.377618, 0.514885, 0.205696, 0.501251, 0.196091, + 0.886461, 0.334135, 0.829124, 0.919315, 0.913637, 0.931191, 0.463876, + 0.534980, 0.183099, 0.612192, 0.441730, 0.502768, 0.648400, 0.513146, + 0.572191, 0.598630, 0.502384, 0.334881, 0.031650, 0.855085, 0.124462, + 0.852059, 0.450404, 0.460454, 0.470191, 0.387106, 0.341040, 0.953467, + 0.868460, 0.346095, 0.991675, 0.840988, 0.432867, 0.309167, 0.832854, + 0.502416, 0.631140, 0.913146, 0.646113, 0.533057, 0.744471, 0.344817, + 0.940144, 0.095737, 0.351065, 0.352773, 0.470006, 0.334397, 0.168739, + 0.758467, 0.118992, 0.163775, 0.065261, 0.683652, 0.880562, 0.097123, + 0.524062, 0.373206, 0.612702, 0.639353, 0.118260, 0.626205, 0.073664, + 0.238101, 0.415854, 0.550570, 0.891418, 0.355098, 0.070208, 0.362777, + 0.318568, 0.738166, 0.900724, 0.976352, 0.702925, 0.146500, 0.299967, + 0.705262, 0.364984, 0.552743, 0.965066, 0.116578, 0.213095, 0.466038, + 0.747374, 0.067506, 0.087477, 0.178816, 0.416269, 0.468249, 0.214696, + 0.835123, 0.118108, 0.025186, 0.379601, 0.633495, 0.177899, 0.682522, + 0.295777, 0.141661, 0.153813, 0.116872, 0.401177, 0.173447, 0.851914, + 0.213767, 0.629566, 0.332266, 0.909032, 0.721796, 0.678533, 0.154774, + 0.709337, 0.292937, 0.943155, 0.633317, 0.467546, 0.571542, 0.892620, + 0.209587, 0.472640, 0.425492, 0.096146, 0.488989, 0.063471, 0.114715, + 0.354080, 0.168293, 0.811268, 0.093427, 0.730772, 0.163385, 0.495506, + 0.936379, 0.234286, 0.082734, 0.884049, 0.750206, 0.102785, 0.857904, + 0.691171, 0.194803, 0.207255, 0.440377] ), + + ([0.929533, 0.249916, 0.651570, 0.752678, 0.825922, 0.961516, 0.715232, + 0.981933, 0.119022, 0.782250, 0.481582, 0.056917, 0.710440, 0.744163, + 0.024689, 0.800104, 0.911008, 0.647359, 0.041017, 0.232368, 0.420331, + 0.972259, 0.720145, 0.170141, 0.315378, 0.856197, 0.640889, 0.589434, + 0.705618, 0.666005, 0.599170, 0.539232, 0.209906, 0.197089, 0.773492, + 0.884823, 0.912564, 0.031281, 0.134800, 0.662252, 0.953429, 0.083590, + 0.506851, 0.325632, 0.409558, 0.869930, 0.182592, 0.668203, 0.624042, + 0.526902, 0.504379, 0.698263, 0.637928, 0.114566, 0.312449, 0.251686, + 0.882595, 0.233741, 0.669393, 0.622059, 0.787561, 0.489059, 0.765893, + 0.989288, 0.460860, 0.828913, 0.414533, 0.928587, 0.097812, 0.293558, + 0.037843, 0.780816, 0.274758, 0.202918, 0.556444, 0.165197, 0.783349, + 0.314676, 0.083987, 0.416028, 0.162694, 0.984741, 0.835170, 0.224250, + 0.584674, 0.860591, 0.152470, 0.265755, 0.248909, 0.139317, 0.058779, + 0.096744, 0.944182, 0.921293, 0.241127, 0.098422, 0.931639, 0.690481, + 0.872860, 0.751366, 0.806818, 0.453597, 0.179449, 0.021455, 0.496414, + 0.568194, 0.155065, 0.138371, 0.045839, 0.791528, 0.335582, 0.547716, + 0.354442, 0.581622, 0.034608, 0.318491, 0.513718, 0.181249, 0.948485, + 0.786798, 0.905820, 0.516587, 0.536851, 0.716880, 0.717704, 0.441359, + 0.084780, 0.761498, 0.027741, 0.358196, 0.852809, 0.501877, 0.120792, + 0.747978, 0.220954, 0.849330, 0.187933, 0.638630, 0.233589, 0.089114, + 0.067476, 0.544877, 0.450301, 0.348674, 0.182867, 0.909635, 0.510178, + 0.770287, 0.334483, 0.578784, 0.314920, 0.170507, 0.500961, 0.340342, + 0.237617, 0.467055, 0.306589, 0.059359, 0.262856, 0.654500, 0.310953, + 0.439802, 0.464888, 0.610065, 0.777306, 0.944517, 0.730033, 0.510666, + 0.075198, 0.904721, 0.129185, 0.142705, 0.374828, 0.350352, 0.847346, + 0.885556, 0.787927, 0.592059, 0.075533, 0.650136, 0.612690, 0.086581, + 0.772607, 0.553880, 0.838374, 0.616688, 0.701407, 0.613178, 0.565600, + 0.316538, 0.647694, 0.234718, 0.499344, 0.574175, 0.226051, 0.787072, + 0.170141, 0.342265, 0.180517, 0.033082, 0.040284, 0.888180, 0.585284, + 0.705618, 0.150731, 0.514817, 0.852107, 0.006226, 0.465651, 0.283395, + 0.950774, 0.309885, 0.570208, 0.269387, 0.748466, 0.855129, 0.878201, + 0.383007, 0.874722, 0.702322, 0.005676, 0.285348, 0.017823, 0.740684, + 0.467086, 0.431471, 0.059359, 0.025330, 0.349376, 0.771599, 0.952605, + 0.225471, 0.121464], + [0.471172, 0.394669, 0.206750, 0.210992, 0.672674, + 0.219721, 0.244692, 0.426030, 0.784261, 0.125930, 0.920721, 0.154459, + 0.450891, 0.147751, 0.367723, 0.353484, 0.026113, 0.408033, 0.834816, + 0.836353, 0.222549, 0.727688, 0.436814, 0.937279, 0.062492, 0.322380, + 0.970168, 0.358693, 0.165828, 0.163289, 0.179660, 0.946080, 0.107585, + 0.214507, 0.120466, 0.146463, 0.513517, 0.744142, 0.796061, 0.229379, + 0.872125, 0.699375, 0.097177, 0.456963, 0.983115, 0.103819, 0.067400, + 0.572813, 0.619288, 0.738678, 0.064006, 0.534990, 0.457646, 0.821854, + 0.245365, 0.935265, 0.292294, 0.273248, 0.484045, 0.650145, 0.134589, + 0.129359, 0.760950, 0.500222, 0.244806, 0.295520, 0.888711, 0.794874, + 0.648125, 0.671853, 0.861657, 0.618463, 0.418073, 0.037680, 0.213474, + 0.081569, 0.498616, 0.466083, 0.254703, 0.579328, 0.489857, 0.365154, + 0.823990, 0.691592, 0.177938, 0.402626, 0.413972, 0.432276, 0.128408, + 0.861022, 0.334743, 0.852509, 0.905923, 0.855449, 0.907655, 0.449490, + 0.525716, 0.146824, 0.576212, 0.621424, 0.631967, 0.680759, 0.213491, + 0.453037, 0.455632, 0.589247, 0.386547, 0.051896, 0.834187, 0.065552, + 0.821578, 0.352428, 0.257310, 0.496232, 0.325953, 0.415318, 0.944347, + 0.879332, 0.271775, 0.994542, 0.755022, 0.297164, 0.397653, 0.922277, + 0.248507, 0.646424, 0.828524, 0.605859, 0.566800, 0.766935, 0.501635, + 0.968145, 0.101199, 0.250424, 0.261777, 0.417199, 0.420268, 0.129902, + 0.670874, 0.244133, 0.465330, 0.072836, 0.635216, 0.847806, 0.110087, + 0.366808, 0.501077, 0.518786, 0.719245, 0.116495, 0.614688, 0.075322, + 0.230603, 0.497451, 0.382493, 0.916194, 0.445191, 0.092338, 0.298070, + 0.477992, 0.755918, 0.914011, 0.974732, 0.707787, 0.173469, 0.199932, + 0.765572, 0.213141, 0.596297, 0.892776, 0.147179, 0.364556, 0.506639, + 0.737935, 0.078835, 0.081713, 0.207005, 0.301130, 0.607415, 0.176493, + 0.729900, 0.207783, 0.024178, 0.266947, 0.655454, 0.133159, 0.598460, + 0.426653, 0.098941, 0.108835, 0.144931, 0.394514, 0.293194, 0.870920, + 0.156846, 0.751377, 0.464677, 0.895932, 0.790477, 0.579755, 0.462048, + 0.682392, 0.230107, 0.921158, 0.641127, 0.610895, 0.569350, 0.699673, + 0.178217, 0.276934, 0.170802, 0.081585, 0.765277, 0.194187, 0.089230, + 0.378231, 0.151939, 0.827206, 0.093455, 0.748796, 0.175005, 0.362430, + 0.899749, 0.406536, 0.105491, 0.936633, 0.825872, 0.095697, 0.877409, + 0.610769, 0.203597, 0.204503, 0.606680] ), + + ([0.142003, 0.751518, 0.465590, 0.234352, 0.876461, 0.696310, 0.339915, + 0.668569, 0.669485, 0.761986, 0.382611, 0.085208, 0.223121, 0.575793, + 0.773675, 0.736900, 0.707907, 0.110324, 0.562853, 0.794153, 0.569628, + 0.058077, 0.192145, 0.244758, 0.713095, 0.294137, 0.598560, 0.021302, + 0.594043, 0.332591, 0.677908, 0.513382, 0.250404, 0.183752, 0.391614, + 0.120975, 0.804621, 0.517899, 0.296945, 0.005188, 0.467360, 0.541704, + 0.782586, 0.692190, 0.574999, 0.494095, 0.790277, 0.687185, 0.691214, + 0.167272, 0.304422, 0.754418, 0.304331, 0.359569, 0.390179, 0.019105, + 0.151738, 0.666005, 0.061647, 0.548479, 0.702445, 0.513138, 0.761681, + 0.566820, 0.828913, 0.844234, 0.733970, 0.962340, 0.199927, 0.361064, + 0.069002, 0.240516, 0.425275, 0.728690, 0.705344, 0.581744, 0.483444, + 0.649129, 0.166875, 0.158025, 0.464034, 0.210852, 0.317911, 0.366222, + 0.155736, 0.419538, 0.917020, 0.133152, 0.511338, 0.316782, 0.250801, + 0.949675, 0.520859, 0.593127, 0.629414, 0.788903, 0.524155, 0.101291, + 0.024079, 0.566149, 0.494308, 0.176244, 0.628986, 0.295633, 0.322825, + 0.167791, 0.627735, 0.600818, 0.638203, 0.092868, 0.946715, 0.734642, + 0.188726, 0.812616, 0.275399, 0.765618, 0.321360, 0.641591, 0.136143, + 0.086184, 0.587024, 0.794610, 0.283456, 0.899930, 0.004608, 0.577685, + 0.214942, 0.842891, 0.014191, 0.729667, 0.074770, 0.396619, 0.650868, + 0.820124, 0.731040, 0.247932, 0.970763, 0.110355, 0.307810, 0.252602, + 0.260140, 0.783593, 0.954222, 0.158452, 0.058901, 0.950316, 0.130284, + 0.744774, 0.529954, 0.335520, 0.192419, 0.533708, 0.205237, 0.053743, + 0.558275, 0.730583, 0.640339, 0.378185, 0.233345, 0.548448, 0.008240, + 0.910215, 0.980041, 0.574084, 0.163976, 0.055635, 0.910550, 0.331095, + 0.211127, 0.213782, 0.784875, 0.696524, 0.101505, 0.585772, 0.795099, + 0.327189, 0.299417, 0.007965, 0.117161, 0.752190, 0.041505, 0.717429, + 0.011841, 0.287454, 0.223609, 0.454909, 0.755211, 0.429151, 0.445753, + 0.812281, 0.180944, 0.881344, 0.246742, 0.230079, 0.115024, 0.875149, + 0.059297, 0.551988, 0.484176, 0.934996, 0.917264, 0.541856, 0.379467, + 0.748222, 0.445784, 0.270180, 0.856349, 0.294778, 0.166387, 0.775903, + 0.751946, 0.892605, 0.647328, 0.909574, 0.301675, 0.315500, 0.531083, + 0.764855, 0.835444, 0.639454, 0.970031, 0.603778, 0.335368, 0.973693, + 0.501480, 0.682699, 0.136326, 0.732688, 0.893765, 0.884610, 0.549852, + 0.605731, 0.993652], + [0.253504, 0.534326, 0.251760, 0.237928, 0.664410, + 0.126609, 0.132684, 0.418006, 0.666470, 0.215330, 0.920184, 0.117055, + 0.355147, 0.170783, 0.327884, 0.256327, 0.027910, 0.470747, 0.880988, + 0.889491, 0.479139, 0.521001, 0.393600, 0.972722, 0.085265, 0.415580, + 0.972281, 0.482544, 0.346985, 0.134187, 0.148290, 0.967033, 0.064457, + 0.308757, 0.091188, 0.106056, 0.666364, 0.644436, 0.738676, 0.157409, + 0.796504, 0.819582, 0.161226, 0.572395, 0.985212, 0.056289, 0.124700, + 0.684193, 0.738343, 0.858700, 0.119422, 0.531593, 0.540814, 0.806578, + 0.255111, 0.953920, 0.375051, 0.132877, 0.304271, 0.424460, 0.108830, + 0.140324, 0.726330, 0.390954, 0.344656, 0.297103, 0.836113, 0.845710, + 0.541340, 0.593495, 0.799546, 0.607697, 0.385357, 0.059555, 0.275257, + 0.043167, 0.741677, 0.452371, 0.186232, 0.458056, 0.634944, 0.440253, + 0.781245, 0.585590, 0.386615, 0.299644, 0.311233, 0.638113, 0.139079, + 0.818473, 0.272349, 0.785139, 0.910448, 0.847825, 0.909313, 0.463918, + 0.570289, 0.136830, 0.605815, 0.361042, 0.480547, 0.633562, 0.233467, + 0.466913, 0.601511, 0.711690, 0.285150, 0.039565, 0.908040, 0.081223, + 0.741324, 0.409105, 0.448214, 0.349451, 0.247382, 0.355812, 0.891038, + 0.892278, 0.230916, 0.983817, 0.739059, 0.550368, 0.366082, 0.896731, + 0.351754, 0.755379, 0.861318, 0.627702, 0.478943, 0.759569, 0.411450, + 0.968553, 0.062213, 0.275821, 0.331454, 0.331865, 0.397601, 0.223281, + 0.710319, 0.145954, 0.317140, 0.057056, 0.578738, 0.816384, 0.047016, + 0.525610, 0.336833, 0.552102, 0.683525, 0.119884, 0.484933, 0.066421, + 0.280478, 0.551438, 0.287947, 0.877956, 0.468814, 0.059983, 0.421428, + 0.275246, 0.737221, 0.887111, 0.973068, 0.761741, 0.125024, 0.179706, + 0.712262, 0.175115, 0.647305, 0.929135, 0.099306, 0.232157, 0.620496, + 0.679094, 0.034862, 0.051003, 0.142482, 0.370931, 0.493494, 0.258032, + 0.837991, 0.177554, 0.086700, 0.207737, 0.563446, 0.417696, 0.483721, + 0.268154, 0.138681, 0.203293, 0.290859, 0.364657, 0.312939, 0.843912, + 0.214481, 0.670471, 0.528396, 0.848559, 0.746439, 0.552310, 0.207122, + 0.532526, 0.364218, 0.940528, 0.635287, 0.556140, 0.505382, 0.879060, + 0.255610, 0.447759, 0.191044, 0.081017, 0.529700, 0.163505, 0.202604, + 0.245266, 0.199667, 0.866675, 0.114402, 0.669242, 0.149501, 0.338364, + 0.852990, 0.361792, 0.111204, 0.925449, 0.829030, 0.085374, 0.849162, + 0.590237, 0.245031, 0.150276, 0.340917] ), + + ([0.564470, 0.693442, 0.879666, 0.107578, 0.513840, 0.306131, 0.271432, + 0.947142, 0.450636, 0.831721, 0.927030, 0.669912, 0.940580, 0.550462, + 0.742088, 0.047792, 0.156682, 0.041353, 0.661550, 0.293374, 0.382855, + 0.755455, 0.113773, 0.575396, 0.667714, 0.981658, 0.235786, 0.755394, + 0.535142, 0.986694, 0.045747, 0.376049, 0.157872, 0.609790, 0.218940, + 0.432936, 0.899991, 0.093966, 0.623646, 0.960265, 0.634938, 0.434828, + 0.272652, 0.962981, 0.745201, 0.027924, 0.847713, 0.725242, 0.209784, + 0.896725, 0.451704, 0.027467, 0.685934, 0.281228, 0.746239, 0.302713, + 0.991058, 0.869991, 0.129826, 0.263619, 0.891629, 0.455061, 0.113681, + 0.031587, 0.604541, 0.292825, 0.550615, 0.298959, 0.918088, 0.950591, + 0.874081, 0.555651, 0.337840, 0.920957, 0.003021, 0.911557, 0.164525, + 0.785180, 0.069155, 0.545976, 0.909726, 0.206366, 0.622486, 0.315073, + 0.955535, 0.534104, 0.471877, 0.548936, 0.864864, 0.301584, 0.816462, + 0.569140, 0.248146, 0.396710, 0.824427, 0.958556, 0.593219, 0.188147, + 0.315226, 0.114170, 0.963958, 0.387860, 0.701682, 0.114353, 0.974639, + 0.930906, 0.847865, 0.431928, 0.945891, 0.654439, 0.999481, 0.524003, + 0.648366, 0.056551, 0.442701, 0.830317, 0.540605, 0.916623, 0.047761, + 0.210761, 0.907559, 0.057924, 0.353465, 0.353740, 0.805231, 0.034425, + 0.349071, 0.186407, 0.218818, 0.022553, 0.609790, 0.818262, 0.339518, + 0.699057, 0.941710, 0.048799, 0.366863, 0.386822, 0.193091, 0.971587, + 0.742851, 0.249214, 0.387860, 0.704428, 0.223762, 0.814692, 0.837397, + 0.778466, 0.696280, 0.612629, 0.387249, 0.216193, 0.143742, 0.201758, + 0.455000, 0.830653, 0.669515, 0.372478, 0.015076, 0.776055, 0.982635, + 0.804102, 0.187414, 0.882138, 0.253090, 0.958678, 0.585559, 0.802576, + 0.742302, 0.492080, 0.080996, 0.509293, 0.115177, 0.964324, 0.139897, + 0.163701, 0.840327, 0.129429, 0.387829, 0.896115, 0.583880, 0.587237, + 0.559923, 0.524461, 0.004425, 0.077090, 0.491440, 0.744163, 0.853969, + 0.196173, 0.306101, 0.819422, 0.792077, 0.822077, 0.457564, 0.307962, + 0.819178, 0.022309, 0.780969, 0.850459, 0.734977, 0.731315, 0.210089, + 0.555071, 0.529038, 0.975768, 0.317301, 0.009491, 0.108585, 0.930784, + 0.331614, 0.451064, 0.271065, 0.586749, 0.791589, 0.126011, 0.326701, + 0.309183, 0.489364, 0.369976, 0.277749, 0.072176, 0.861965, 0.439833, + 0.960906, 0.647023, 0.485916, 0.629292, 0.058443, 0.527085, 0.831874, + 0.698630, 0.385174], + [0.495618, 0.441464, 0.557017, 0.272405, 0.594053, + 0.213913, 0.095401, 0.330141, 0.756265, 0.213387, 0.945661, 0.215836, + 0.478364, 0.166789, 0.265475, 0.224600, 0.011292, 0.356525, 0.881330, + 0.899717, 0.340867, 0.762765, 0.398643, 0.959794, 0.076373, 0.411068, + 0.956087, 0.425671, 0.267392, 0.086429, 0.230950, 0.969761, 0.077102, + 0.364494, 0.110616, 0.201659, 0.655970, 0.529764, 0.775525, 0.178886, + 0.732134, 0.748248, 0.129081, 0.515934, 0.980429, 0.110490, 0.140175, + 0.754832, 0.623327, 0.732077, 0.072652, 0.447853, 0.313085, 0.880703, + 0.231171, 0.966561, 0.265433, 0.153128, 0.496576, 0.485365, 0.232871, + 0.147871, 0.742083, 0.608403, 0.367386, 0.242410, 0.889346, 0.726072, + 0.567069, 0.541939, 0.876543, 0.588447, 0.463390, 0.048924, 0.332279, + 0.112237, 0.583767, 0.708608, 0.194895, 0.406334, 0.623418, 0.521972, + 0.732477, 0.736640, 0.234700, 0.436454, 0.332746, 0.552401, 0.149503, + 0.896181, 0.132756, 0.723063, 0.864270, 0.737282, 0.896088, 0.500499, + 0.435932, 0.208168, 0.772405, 0.552217, 0.466660, 0.676089, 0.363508, + 0.511280, 0.383914, 0.680339, 0.244844, 0.037614, 0.821954, 0.097665, + 0.866579, 0.369076, 0.428357, 0.289866, 0.218990, 0.386788, 0.958202, + 0.895966, 0.332165, 0.987714, 0.837437, 0.415629, 0.234766, 0.762833, + 0.575631, 0.802375, 0.868664, 0.547072, 0.361121, 0.787932, 0.372006, + 0.962287, 0.132690, 0.364041, 0.272380, 0.455698, 0.386066, 0.211024, + 0.726992, 0.223019, 0.238927, 0.028980, 0.619901, 0.829672, 0.114443, + 0.530184, 0.384064, 0.570925, 0.593174, 0.172192, 0.479118, 0.055151, + 0.175546, 0.543465, 0.386083, 0.921652, 0.407870, 0.111462, 0.413042, + 0.409689, 0.804235, 0.840629, 0.970208, 0.698751, 0.221048, 0.330415, + 0.674973, 0.245212, 0.661346, 0.911649, 0.197003, 0.272622, 0.678364, + 0.645042, 0.082575, 0.073088, 0.102925, 0.483113, 0.540776, 0.190397, + 0.789439, 0.199725, 0.028167, 0.298789, 0.666024, 0.294616, 0.698567, + 0.244601, 0.071771, 0.145942, 0.372541, 0.500928, 0.208398, 0.810336, + 0.256493, 0.752106, 0.419867, 0.844875, 0.739738, 0.589028, 0.172165, + 0.576336, 0.388612, 0.942727, 0.605002, 0.466328, 0.573021, 0.868937, + 0.193609, 0.484958, 0.312042, 0.164538, 0.625321, 0.355834, 0.114481, + 0.326462, 0.120043, 0.885765, 0.155206, 0.625728, 0.175445, 0.336309, + 0.853385, 0.299478, 0.164527, 0.921071, 0.777973, 0.099571, 0.860153, + 0.491092, 0.205249, 0.258365, 0.463333] ), + + ([0.870357, 0.935087, 0.150121, 0.356639, 0.240822, 0.138127, 0.380718, + 0.045442, 0.429823, 0.562517, 0.242409, 0.731742, 0.138768, 0.464309, + 0.042634, 0.353954, 0.804498, 0.131626, 0.514969, 0.766320, 0.348430, + 0.478835, 0.791864, 0.209052, 0.130772, 0.994385, 0.910764, 0.898007, + 0.891110, 0.198492, 0.884426, 0.139439, 0.956359, 0.266915, 0.867061, + 0.876614, 0.498032, 0.976684, 0.447493, 0.073946, 0.119053, 0.630573, + 0.600482, 0.846004, 0.552141, 0.116428, 0.327250, 0.735923, 0.750786, + 0.757378, 0.517228, 0.051332, 0.154057, 0.109104, 0.061281, 0.662770, + 0.406384, 0.361095, 0.748314, 0.171056, 0.313822, 0.497330, 0.976440, + 0.850581, 0.317667, 0.872921, 0.809565, 0.273690, 0.267159, 0.363384, + 0.411298, 0.023469, 0.772149, 0.742088, 0.386822, 0.400220, 0.916929, + 0.442579, 0.064089, 0.528459, 0.617023, 0.361950, 0.246193, 0.770837, + 0.399457, 0.861446, 0.465133, 0.854518, 0.888180, 0.620563, 0.269173, + 0.617115, 0.776025, 0.500992, 0.574511, 0.777551, 0.563921, 0.076479, + 0.612659, 0.639058, 0.849269, 0.985076, 0.504776, 0.129612, 0.444014, + 0.759636, 0.994293, 0.087008, 0.104495, 0.293527, 0.368694, 0.193701, + 0.153478, 0.596973, 0.102481, 0.468856, 0.776269, 0.000702, 0.251717, + 0.723014, 0.271676, 0.463393, 0.131748, 0.881924, 0.039613, 0.138493, + 0.309763, 0.585681, 0.585986, 0.857418, 0.442610, 0.969939, 0.326548, + 0.684713, 0.991852, 0.034211, 0.470840, 0.201971, 0.346904, 0.505295, + 0.767449, 0.676412, 0.387707, 0.600116, 0.391675, 0.770318, 0.017975, + 0.595965, 0.757439, 0.948088, 0.700552, 0.613239, 0.533708, 0.236518, + 0.525773, 0.517441, 0.647847, 0.495041, 0.844569, 0.346507, 0.555956, + 0.851680, 0.996948, 0.169897, 0.562578, 0.461623, 0.167638, 0.785394, + 0.470077, 0.244209, 0.900052, 0.160161, 0.339549, 0.754509, 0.299173, + 0.022309, 0.644307, 0.846034, 0.455824, 0.508805, 0.597034, 0.280923, + 0.122440, 0.276406, 0.932340, 0.943175, 0.172155, 0.982025, 0.925138, + 0.812067, 0.872494, 0.537828, 0.927244, 0.351482, 0.504379, 0.048799, + 0.202124, 0.471297, 0.358623, 0.837458, 0.340373, 0.717582, 0.640278, + 0.463027, 0.035951, 0.847407, 0.312296, 0.141240, 0.505356, 0.444563, + 0.410382, 0.470290, 0.330546, 0.732871, 0.859432, 0.869991, 0.006806, + 0.242683, 0.323160, 0.640065, 0.977264, 0.487289, 0.118381, 0.043641, + 0.434400, 0.305338, 0.724967, 0.322703, 0.671255, 0.025483, 0.922483, + 0.050966, 0.261727], + [0.260157, 0.307517, 0.358097, 0.252689, 0.772330, + 0.168730, 0.199755, 0.263603, 0.796697, 0.181093, 0.908662, 0.220840, + 0.448967, 0.056864, 0.383428, 0.252245, 0.028268, 0.379121, 0.920537, + 0.931111, 0.376615, 0.702265, 0.339892, 0.951384, 0.054280, 0.473895, + 0.985559, 0.437227, 0.257565, 0.131997, 0.163347, 0.974754, 0.051855, + 0.364200, 0.179886, 0.139106, 0.533888, 0.439360, 0.658220, 0.284960, + 0.802907, 0.717600, 0.108974, 0.423505, 0.979426, 0.072133, 0.140069, + 0.642677, 0.641243, 0.648287, 0.086454, 0.332935, 0.442687, 0.900471, + 0.324827, 0.970455, 0.321905, 0.153388, 0.273655, 0.560316, 0.054492, + 0.164323, 0.775053, 0.618409, 0.320127, 0.217728, 0.806489, 0.830306, + 0.422330, 0.576379, 0.884398, 0.516388, 0.381542, 0.044992, 0.252025, + 0.077069, 0.768432, 0.381270, 0.154768, 0.518110, 0.765505, 0.365825, + 0.591896, 0.683737, 0.155926, 0.240362, 0.234728, 0.662729, 0.099457, + 0.899237, 0.244236, 0.906834, 0.903701, 0.839181, 0.900426, 0.410311, + 0.610486, 0.151047, 0.777519, 0.399258, 0.474944, 0.605231, 0.337552, + 0.385688, 0.341139, 0.679593, 0.385755, 0.035838, 0.872824, 0.144731, + 0.756607, 0.337629, 0.336516, 0.400295, 0.349064, 0.239996, 0.890461, + 0.918159, 0.191377, 0.993292, 0.743830, 0.487235, 0.297947, 0.904181, + 0.347443, 0.796035, 0.902446, 0.487609, 0.457696, 0.661949, 0.538200, + 0.961316, 0.048804, 0.252998, 0.376427, 0.402341, 0.368201, 0.151905, + 0.719359, 0.208973, 0.274783, 0.051515, 0.586169, 0.870502, 0.067245, + 0.473591, 0.397839, 0.618277, 0.627337, 0.094868, 0.342847, 0.082950, + 0.306641, 0.610109, 0.216219, 0.850829, 0.415679, 0.109415, 0.430899, + 0.368500, 0.672157, 0.943332, 0.973869, 0.654748, 0.097660, 0.130777, + 0.714200, 0.168292, 0.513323, 0.919240, 0.323300, 0.443992, 0.613737, + 0.690707, 0.038421, 0.054618, 0.152763, 0.333967, 0.530286, 0.307992, + 0.929752, 0.188744, 0.063666, 0.359969, 0.680815, 0.212698, 0.676648, + 0.319024, 0.140095, 0.220252, 0.142314, 0.333826, 0.266799, 0.812927, + 0.297978, 0.767975, 0.598235, 0.890015, 0.710723, 0.567831, 0.346083, + 0.587204, 0.342478, 0.962254, 0.687791, 0.580150, 0.457589, 0.859200, + 0.168856, 0.500052, 0.205292, 0.075898, 0.546948, 0.241454, 0.054149, + 0.449954, 0.299996, 0.883236, 0.178772, 0.792651, 0.196661, 0.379851, + 0.872677, 0.203970, 0.132733, 0.919790, 0.809352, 0.089786, 0.863894, + 0.624949, 0.109569, 0.242875, 0.490815] ), + + ([0.109653, 0.085360, 0.731498, 0.853023, 0.430921, 0.667531, 0.044008, + 0.850154, 0.842463, 0.407300, 0.649648, 0.774590, 0.193823, 0.284799, + 0.957732, 0.577776, 0.450789, 0.762169, 0.762383, 0.691122, 0.074648, + 0.338389, 0.154241, 0.093356, 0.318003, 0.949950, 0.613880, 0.177160, + 0.592273, 0.248024, 0.692862, 0.695242, 0.564287, 0.284463, 0.189398, + 0.568255, 0.137181, 0.636647, 0.224097, 0.835078, 0.972625, 0.503494, + 0.122288, 0.527024, 0.709952, 0.803125, 0.509537, 0.746971, 0.539415, + 0.803919, 0.525956, 0.734947, 0.284402, 0.319864, 0.566210, 0.201239, + 0.650410, 0.001801, 0.450911, 0.708457, 0.795862, 0.755516, 0.436171, + 0.383374, 0.881466, 0.817835, 0.966979, 0.740532, 0.754509, 0.522599, + 0.581103, 0.897977, 0.424116, 0.287027, 0.869961, 0.967071, 0.483627, + 0.850154, 0.901700, 0.897488, 0.136662, 0.294290, 0.014008, 0.558214, + 0.982940, 0.881375, 0.382244, 0.336375, 0.219855, 0.234382, 0.268654, + 0.034822, 0.416761, 0.896359, 0.360271, 0.349834, 0.517472, 0.797082, + 0.100467, 0.709983, 0.227424, 0.659627, 0.420942, 0.757775, 0.442335, + 0.877346, 0.780511, 0.255074, 0.873501, 0.892941, 0.916623, 0.693625, + 0.527085, 0.610584, 0.216132, 0.391614, 0.192969, 0.872768, 0.111423, + 0.358409, 0.599780, 0.532609, 0.408124, 0.707389, 0.391797, 0.153142, + 0.950774, 0.899533, 0.584887, 0.864986, 0.532609, 0.597858, 0.656850, + 0.413190, 0.455794, 0.414716, 0.928922, 0.925077, 0.648213, 0.332713, + 0.394421, 0.429762, 0.743095, 0.080905, 0.651234, 0.661153, 0.027985, + 0.247139, 0.093509, 0.175176, 0.669027, 0.408185, 0.019929, 0.312784, + 0.116611, 0.058351, 0.813959, 0.039888, 0.099429, 0.618641, 0.852504, + 0.195654, 0.112186, 0.306833, 0.299783, 0.180029, 0.804041, 0.150334, + 0.441664, 0.612049, 0.173437, 0.922910, 0.717612, 0.990204, 0.976043, + 0.286172, 0.106082, 0.885769, 0.251625, 0.918027, 0.019684, 0.700980, + 0.376598, 0.907865, 0.366314, 0.522385, 0.547777, 0.201270, 0.932493, + 0.101688, 0.104434, 0.374615, 0.745384, 0.494430, 0.594440, 0.520707, + 0.569597, 0.388134, 0.990387, 0.527390, 0.194708, 0.651479, 0.962951, + 0.529740, 0.670400, 0.134983, 0.616688, 0.817530, 0.144810, 0.255318, + 0.595294, 0.978668, 0.463027, 0.393689, 0.961913, 0.560747, 0.181127, + 0.640217, 0.761345, 0.030885, 0.152898, 0.915036, 0.670125, 0.316111, + 0.344829, 0.997864, 0.640645, 0.704550, 0.035859, 0.496719, 0.945677, + 0.389813, 0.058412], + [0.454856, 0.248515, 0.361389, 0.122148, 0.694139, + 0.146798, 0.280774, 0.412776, 0.702364, 0.163216, 0.902092, 0.093065, + 0.474958, 0.264249, 0.434468, 0.227983, 0.011746, 0.387684, 0.926212, + 0.733468, 0.251994, 0.594014, 0.524123, 0.948130, 0.157794, 0.383516, + 0.975607, 0.466704, 0.307640, 0.100712, 0.141646, 0.956370, 0.042512, + 0.297531, 0.085487, 0.093468, 0.596480, 0.690076, 0.797975, 0.267221, + 0.753295, 0.774192, 0.116699, 0.464241, 0.985235, 0.073823, 0.089206, + 0.447433, 0.719236, 0.815190, 0.046099, 0.489775, 0.405497, 0.906062, + 0.254434, 0.967531, 0.295697, 0.102913, 0.406725, 0.519415, 0.081144, + 0.196076, 0.755829, 0.377023, 0.214420, 0.150418, 0.858558, 0.876656, + 0.635810, 0.630952, 0.729097, 0.625271, 0.333465, 0.042126, 0.224886, + 0.142931, 0.763860, 0.603410, 0.175108, 0.380019, 0.666179, 0.447647, + 0.869742, 0.579908, 0.245852, 0.371972, 0.344010, 0.359698, 0.081658, + 0.833780, 0.219437, 0.796887, 0.949882, 0.901161, 0.913896, 0.377543, + 0.619674, 0.128213, 0.516002, 0.422384, 0.409693, 0.684524, 0.425780, + 0.548613, 0.520597, 0.594379, 0.261667, 0.079061, 0.904477, 0.080815, + 0.801571, 0.404271, 0.580455, 0.402241, 0.263298, 0.523119, 0.942118, + 0.916117, 0.335429, 0.988195, 0.777338, 0.500755, 0.323573, 0.857648, + 0.592954, 0.611505, 0.838570, 0.625515, 0.332418, 0.798301, 0.539981, + 0.981028, 0.122947, 0.425385, 0.327212, 0.369861, 0.378286, 0.154940, + 0.779355, 0.110862, 0.317416, 0.040495, 0.507705, 0.858675, 0.089329, + 0.297920, 0.288036, 0.377962, 0.567168, 0.167161, 0.586962, 0.064270, + 0.234567, 0.532191, 0.422919, 0.913402, 0.394611, 0.032129, 0.312803, + 0.443883, 0.683181, 0.931617, 0.976537, 0.787270, 0.157918, 0.235750, + 0.617241, 0.176583, 0.705436, 0.958141, 0.218316, 0.217251, 0.681318, + 0.793152, 0.079533, 0.080840, 0.214927, 0.437709, 0.604961, 0.227055, + 0.805453, 0.181182, 0.030641, 0.358724, 0.664910, 0.292232, 0.570454, + 0.224660, 0.089332, 0.112569, 0.273717, 0.225018, 0.222019, 0.788015, + 0.214029, 0.802656, 0.590121, 0.912856, 0.734046, 0.469630, 0.260610, + 0.592389, 0.334603, 0.936535, 0.760104, 0.684230, 0.639625, 0.771056, + 0.221245, 0.374172, 0.134190, 0.110979, 0.800637, 0.245717, 0.135946, + 0.260575, 0.133939, 0.933764, 0.118476, 0.528121, 0.136099, 0.495127, + 0.832425, 0.290466, 0.117380, 0.906839, 0.875183, 0.109638, 0.801086, + 0.592449, 0.213508, 0.105856, 0.559403] ), + + ([0.287667, 0.529618, 0.438673, 0.236427, 0.456221, 0.072512, 0.464156, + 0.676840, 0.272042, 0.673482, 0.784814, 0.071169, 0.228248, 0.558977, + 0.351512, 0.662923, 0.676229, 0.723411, 0.223273, 0.037019, 0.087497, + 0.907071, 0.873074, 0.388348, 0.473739, 0.818476, 0.104709, 0.424421, + 0.996277, 0.007080, 0.862880, 0.559435, 0.296335, 0.292642, 0.716330, + 0.555620, 0.577166, 0.157262, 0.296731, 0.267830, 0.969390, 0.006928, + 0.473403, 0.648152, 0.210730, 0.708121, 0.546007, 0.666372, 0.171728, + 0.306284, 0.235694, 0.302835, 0.258034, 0.332102, 0.756676, 0.269784, + 0.221168, 0.601794, 0.748833, 0.617328, 0.408521, 0.918088, 0.353099, + 0.880612, 0.984344, 0.577532, 0.210608, 0.924131, 0.152379, 0.090884, + 0.667013, 0.139714, 0.912015, 0.022645, 0.962706, 0.154088, 0.378460, + 0.355846, 0.691366, 0.702475, 0.199225, 0.288553, 0.306650, 0.824641, + 0.096835, 0.868343, 0.959380, 0.039155, 0.070467, 0.370739, 0.445662, + 0.652913, 0.286416, 0.828272, 0.548173, 0.860988, 0.189764, 0.615894, + 0.550707, 0.794305, 0.867641, 0.499588, 0.208014, 0.170660, 0.195868, + 0.053896, 0.952147, 0.705496, 0.800104, 0.854976, 0.615955, 0.938505, + 0.362468, 0.355022, 0.455947, 0.632893, 0.305307, 0.845149, 0.754814, + 0.402814, 0.383221, 0.411695, 0.785363, 0.725791, 0.214209, 0.293527, + 0.417158, 0.996002, 0.282022, 0.545701, 0.146947, 0.774834, 0.439955, + 0.415845, 0.834132, 0.895138, 0.448195, 0.340190, 0.922422, 0.575060, + 0.575457, 0.964476, 0.429365, 0.197882, 0.796442, 0.096713, 0.484603, + 0.914396, 0.616108, 0.998077, 0.697958, 0.723258, 0.052217, 0.917264, + 0.139195, 0.186743, 0.807428, 0.276101, 0.210242, 0.437208, 0.161779, + 0.411145, 0.191046, 0.630543, 0.617695, 0.278390, 0.740867, 0.503739, + 0.827418, 0.027253, 0.135472, 0.191687, 0.835658, 0.849696, 0.522507, + 0.960417, 0.167425, 0.011017, 0.974883, 0.012116, 0.793146, 0.468978, + 0.624958, 0.019257, 0.501572, 0.986328, 0.659841, 0.542924, 0.712699, + 0.144322, 0.458937, 0.992523, 0.260903, 0.162633, 0.655873, 0.282632, + 0.180303, 0.932218, 0.405011, 0.843440, 0.023194, 0.167119, 0.634602, + 0.140690, 0.743034, 0.082095, 0.567461, 0.362041, 0.672964, 0.501450, + 0.290262, 0.425428, 0.631581, 0.805994, 0.653279, 0.965941, 0.686575, + 0.624012, 0.281045, 0.457595, 0.608081, 0.672903, 0.976012, 0.126011, + 0.542528, 0.656941, 0.295572, 0.808527, 0.938688, 0.628498, 0.584643, + 0.417402, 0.256569], + [0.218635, 0.357876, 0.173623, 0.173806, 0.673032, + 0.189860, 0.351286, 0.442685, 0.692897, 0.138260, 0.929152, 0.187127, + 0.499222, 0.119533, 0.454319, 0.261703, 0.018971, 0.302934, 0.747664, + 0.921815, 0.284514, 0.658830, 0.284149, 0.956592, 0.066063, 0.446204, + 0.972693, 0.393397, 0.309208, 0.095630, 0.181192, 0.938930, 0.067703, + 0.237331, 0.113878, 0.093320, 0.503422, 0.681623, 0.733120, 0.312091, + 0.650519, 0.652697, 0.137933, 0.532398, 0.983085, 0.084617, 0.065343, + 0.549961, 0.745401, 0.892501, 0.074734, 0.519583, 0.376233, 0.753947, + 0.242325, 0.964071, 0.286072, 0.208462, 0.337912, 0.594345, 0.092390, + 0.212956, 0.694319, 0.460707, 0.237936, 0.361339, 0.858933, 0.819767, + 0.467638, 0.727528, 0.746701, 0.532651, 0.330979, 0.050657, 0.332196, + 0.035503, 0.658197, 0.457472, 0.193841, 0.467948, 0.537894, 0.345733, + 0.718487, 0.513743, 0.333842, 0.380397, 0.321536, 0.427051, 0.148436, + 0.799359, 0.348584, 0.849755, 0.868229, 0.841677, 0.909258, 0.539411, + 0.690853, 0.152109, 0.660805, 0.456971, 0.539072, 0.776359, 0.274709, + 0.519946, 0.582156, 0.705097, 0.382707, 0.054506, 0.834956, 0.064999, + 0.809754, 0.418180, 0.407116, 0.378793, 0.226499, 0.431485, 0.869723, + 0.873152, 0.149430, 0.982588, 0.630468, 0.370831, 0.299135, 0.909328, + 0.323344, 0.720702, 0.875886, 0.584744, 0.507132, 0.548361, 0.426220, + 0.959330, 0.112001, 0.223089, 0.350064, 0.521868, 0.493527, 0.204729, + 0.762551, 0.219292, 0.210416, 0.070511, 0.560222, 0.754688, 0.060908, + 0.647756, 0.250738, 0.593946, 0.819360, 0.207920, 0.412829, 0.103411, + 0.364463, 0.585421, 0.424595, 0.913237, 0.494716, 0.067945, 0.427710, + 0.381549, 0.765270, 0.912343, 0.971849, 0.806889, 0.129748, 0.287356, + 0.736490, 0.295920, 0.689556, 0.923895, 0.205147, 0.320950, 0.615522, + 0.694049, 0.058830, 0.072159, 0.210321, 0.362232, 0.547235, 0.186022, + 0.851536, 0.164144, 0.022905, 0.236097, 0.560682, 0.291979, 0.590515, + 0.365463, 0.178689, 0.189426, 0.202501, 0.315727, 0.251595, 0.922035, + 0.244061, 0.671076, 0.500123, 0.894621, 0.834322, 0.546120, 0.309387, + 0.600686, 0.311961, 0.941726, 0.612745, 0.578015, 0.654615, 0.818524, + 0.202517, 0.443512, 0.141913, 0.090282, 0.711760, 0.207059, 0.192837, + 0.374708, 0.308595, 0.899807, 0.086978, 0.753923, 0.143085, 0.494978, + 0.853515, 0.231696, 0.082054, 0.950877, 0.857621, 0.094328, 0.831074, + 0.575920, 0.180761, 0.182903, 0.451331] ), + + ([0.718009, 0.244209, 0.163427, 0.491195, 0.639515, 0.517624, 0.195013, + 0.041749, 0.877834, 0.575610, 0.809778, 0.957854, 0.963408, 0.181585, + 0.894559, 0.093814, 0.741722, 0.717978, 0.750359, 0.202765, 0.042695, + 0.855434, 0.958098, 0.501022, 0.656911, 0.645558, 0.441786, 0.734794, + 0.024689, 0.319102, 0.385052, 0.279641, 0.544420, 0.570025, 0.157659, + 0.305033, 0.906003, 0.607593, 0.907834, 0.533891, 0.356182, 0.756920, + 0.976928, 0.629597, 0.301828, 0.889828, 0.792657, 0.741111, 0.157048, + 0.466933, 0.397015, 0.237220, 0.840907, 0.472427, 0.265328, 0.162053, + 0.831782, 0.022462, 0.572344, 0.441908, 0.184606, 0.928922, 0.562059, + 0.375927, 0.417127, 0.999023, 0.177313, 0.440596, 0.671804, 0.353252, + 0.605213, 0.940550, 0.058901, 0.541429, 0.894925, 0.535783, 0.588183, + 0.739128, 0.304025, 0.177526, 0.593890, 0.805506, 0.529710, 0.483230, + 0.060884, 0.483535, 0.480575, 0.082461, 0.756981, 0.524247, 0.746330, + 0.964660, 0.578143, 0.015839, 0.420362, 0.360057, 0.013123, 0.699393, + 0.432600, 0.185247, 0.133427, 0.551744, 0.048128, 0.584246, 0.014496, + 0.417707, 0.688009, 0.596515, 0.995483, 0.971984, 0.728782, 0.483383, + 0.682394, 0.792535, 0.436720, 0.743736, 0.102390, 0.826472, 0.692984, + 0.350414, 0.914212, 0.029969, 0.666128, 0.238746, 0.081515, 0.463027, + 0.088076, 0.578051, 0.915708, 0.620594, 0.289987, 0.857662, 0.893735, + 0.281381, 0.653859, 0.318766, 0.157811, 0.655507, 0.636708, 0.763237, + 0.103030, 0.112033, 0.023133, 0.270272, 0.958892, 0.268075, 0.562639, + 0.852962, 0.771264, 0.720237, 0.647908, 0.585314, 0.691366, 0.200079, + 0.190405, 0.231269, 0.977233, 0.434706, 0.349742, 0.907041, 0.614277, + 0.493332, 0.272164, 0.807581, 0.961699, 0.901822, 0.495834, 0.529160, + 0.329905, 0.305857, 0.177801, 0.018616, 0.896573, 0.964263, 0.799707, + 0.680990, 0.866024, 0.853542, 0.508316, 0.676382, 0.279611, 0.665059, + 0.746910, 0.937742, 0.382702, 0.476272, 0.334086, 0.940519, 0.954009, + 0.376476, 0.645924, 0.755516, 0.504685, 0.829615, 0.058077, 0.416181, + 0.752617, 0.053926, 0.303842, 0.131596, 0.278085, 0.201056, 0.904294, + 0.376568, 0.767815, 0.614795, 0.327250, 0.389630, 0.752647, 0.951445, + 0.030793, 0.110721, 0.245949, 0.442457, 0.047884, 0.089572, 0.188604, + 0.081332, 0.268227, 0.395978, 0.106754, 0.015137, 0.073580, 0.063143, + 0.888882, 0.922636, 0.482986, 0.095767, 0.087985, 0.659810, 0.463851, + 0.573687, 0.655934], + [0.426641, 0.368498, 0.324384, 0.244630, 0.810313, + 0.154400, 0.349735, 0.383929, 0.592216, 0.152524, 0.905401, 0.140957, + 0.476962, 0.196000, 0.330754, 0.277185, 0.018883, 0.277773, 0.862392, + 0.903272, 0.303903, 0.594118, 0.361856, 0.941660, 0.079700, 0.480783, + 0.969456, 0.472912, 0.230198, 0.098414, 0.160896, 0.968786, 0.046620, + 0.262502, 0.139625, 0.175795, 0.361952, 0.682237, 0.823679, 0.267849, + 0.790622, 0.778540, 0.116554, 0.395309, 0.970600, 0.098625, 0.083999, + 0.714550, 0.748284, 0.835519, 0.077502, 0.521743, 0.326032, 0.755997, + 0.251540, 0.976562, 0.302812, 0.305042, 0.410685, 0.551413, 0.117068, + 0.132348, 0.621621, 0.626591, 0.383646, 0.184807, 0.834431, 0.780612, + 0.507623, 0.612959, 0.794717, 0.533914, 0.477495, 0.029843, 0.227917, + 0.108277, 0.660436, 0.700065, 0.209277, 0.487593, 0.541569, 0.553619, + 0.731494, 0.580211, 0.275850, 0.372828, 0.243097, 0.420385, 0.098984, + 0.857177, 0.250690, 0.833313, 0.913703, 0.867545, 0.951534, 0.361687, + 0.527698, 0.243859, 0.717807, 0.467260, 0.580161, 0.714308, 0.267384, + 0.456982, 0.374384, 0.692335, 0.299550, 0.083761, 0.919893, 0.096244, + 0.848201, 0.232173, 0.484829, 0.245712, 0.249837, 0.437164, 0.970420, + 0.887475, 0.244833, 0.991818, 0.763004, 0.286520, 0.264178, 0.806474, + 0.660562, 0.674266, 0.860876, 0.734945, 0.467590, 0.805231, 0.447643, + 0.964540, 0.110531, 0.299224, 0.495899, 0.439600, 0.515685, 0.221798, + 0.708328, 0.123330, 0.259151, 0.045842, 0.530350, 0.760107, 0.140522, + 0.285037, 0.378773, 0.458631, 0.583821, 0.141129, 0.426094, 0.055360, + 0.322095, 0.582423, 0.468241, 0.884921, 0.413174, 0.046554, 0.445516, + 0.540792, 0.812143, 0.869259, 0.956194, 0.762436, 0.207954, 0.269481, + 0.813644, 0.223316, 0.794380, 0.903227, 0.153186, 0.216683, 0.710133, + 0.745967, 0.076032, 0.082960, 0.138856, 0.522247, 0.371434, 0.332129, + 0.891117, 0.218265, 0.071134, 0.248548, 0.680875, 0.198809, 0.592904, + 0.277751, 0.089860, 0.167141, 0.243550, 0.326903, 0.306565, 0.898553, + 0.198083, 0.618236, 0.607264, 0.941108, 0.790631, 0.602020, 0.208493, + 0.649504, 0.429139, 0.913258, 0.681561, 0.603627, 0.630023, 0.737105, + 0.243026, 0.483829, 0.173393, 0.060755, 0.683204, 0.284398, 0.103508, + 0.451004, 0.147505, 0.885852, 0.105137, 0.803031, 0.112451, 0.412019, + 0.725960, 0.227560, 0.200442, 0.915390, 0.853311, 0.078259, 0.842300, + 0.799232, 0.236802, 0.236590, 0.327087] ), + + ([0.954619, 0.565477, 0.882290, 0.514939, 0.431104, 0.530839, 0.601520, + 0.873959, 0.745659, 0.043428, 0.083987, 0.694906, 0.115177, 0.264992, + 0.254036, 0.215796, 0.019532, 0.320292, 0.658498, 0.936796, 0.358745, + 0.385907, 0.300882, 0.975127, 0.846828, 0.538285, 0.290017, 0.195654, + 0.922880, 0.018097, 0.834101, 0.023194, 0.961272, 0.066805, 0.612140, + 0.342235, 0.061831, 0.991760, 0.053194, 0.391247, 0.201239, 0.615833, + 0.555406, 0.057314, 0.027192, 0.768517, 0.175451, 0.477218, 0.076205, + 0.973907, 0.820093, 0.351512, 0.696615, 0.992309, 0.470962, 0.877926, + 0.457930, 0.371685, 0.473708, 0.709677, 0.327677, 0.665059, 0.422895, + 0.846034, 0.397076, 0.470138, 0.673788, 0.860347, 0.436934, 0.947569, + 0.012513, 0.372204, 0.064577, 0.973785, 0.515427, 0.170415, 0.803797, + 0.585101, 0.129429, 0.892026, 0.818018, 0.868954, 0.004059, 0.664693, + 0.599261, 0.958464, 0.106784, 0.618000, 0.392895, 0.287179, 0.152989, + 0.670248, 0.640126, 0.759484, 0.381329, 0.496689, 0.219337, 0.993439, + 0.206183, 0.086032, 0.767602, 0.292032, 0.278512, 0.790704, 0.863277, + 0.499344, 0.985839, 0.277596, 0.351390, 0.397595, 0.922941, 0.285684, + 0.592853, 0.801569, 0.364940, 0.596271, 0.918546, 0.006256, 0.273080, + 0.122410, 0.069948, 0.744957, 0.865230, 0.523911, 0.907346, 0.312357, + 0.281869, 0.253761, 0.166540, 0.010956, 0.379498, 0.442518, 0.546251, + 0.575243, 0.181585, 0.526841, 0.906095, 0.730888, 0.019501, 0.028474, + 0.857814, 0.545152, 0.894040, 0.389874, 0.529893, 0.724143, 0.088504, + 0.272439, 0.787500, 0.513932, 0.565783, 0.224372, 0.688589, 0.361431, + 0.178961, 0.123508, 0.457686, 0.990905, 0.228339, 0.302072, 0.758507, + 0.053224, 0.395123, 0.759056, 0.546556, 0.003449, 0.583239, 0.367016, + 0.283151, 0.362987, 0.700766, 0.479049, 0.791986, 0.023072, 0.912137, + 0.842555, 0.539506, 0.745323, 0.391858, 0.225715, 0.620411, 0.515885, + 0.112064, 0.663411, 0.229438, 0.909360, 0.694113, 0.728050, 0.900784, + 0.118595, 0.855739, 0.732658, 0.296213, 0.807093, 0.485733, 0.271249, + 0.823481, 0.439283, 0.876308, 0.003815, 0.865810, 0.246467, 0.145054, + 0.091372, 0.904202, 0.483016, 0.377850, 0.187872, 0.313334, 0.130009, + 0.523209, 0.394818, 0.112827, 0.702780, 0.570452, 0.085238, 0.454512, + 0.317667, 0.041719, 0.002808, 0.127476, 0.675253, 0.330271, 0.542833, + 0.861965, 0.115421, 0.915250, 0.620991, 0.713157, 0.401471, 0.984863, + 0.036164, 0.306619], + [0.359776, 0.367097, 0.360432, 0.206506, 0.754471, + 0.285965, 0.166168, 0.326315, 0.800244, 0.206862, 0.902224, 0.139618, + 0.610692, 0.143672, 0.351668, 0.325182, 0.025730, 0.455092, 0.929569, + 0.796769, 0.251855, 0.747627, 0.331670, 0.964723, 0.081021, 0.389377, + 0.981844, 0.573396, 0.213534, 0.174239, 0.116232, 0.955129, 0.098010, + 0.382178, 0.106874, 0.088279, 0.545543, 0.621791, 0.575619, 0.146018, + 0.761163, 0.653365, 0.150332, 0.606838, 0.980184, 0.110615, 0.146229, + 0.514361, 0.704054, 0.766151, 0.064525, 0.409417, 0.439298, 0.897061, + 0.299828, 0.971770, 0.367509, 0.291184, 0.281051, 0.502794, 0.096782, + 0.083478, 0.840663, 0.583090, 0.395116, 0.281379, 0.877926, 0.828898, + 0.625191, 0.619742, 0.853877, 0.536377, 0.372904, 0.073845, 0.199405, + 0.100709, 0.606060, 0.473555, 0.180722, 0.531621, 0.601256, 0.244270, + 0.741130, 0.594147, 0.163998, 0.204984, 0.241442, 0.590100, 0.134714, + 0.816974, 0.270377, 0.806844, 0.880223, 0.902738, 0.878790, 0.222071, + 0.650206, 0.154455, 0.539164, 0.455021, 0.436253, 0.719163, 0.462310, + 0.466113, 0.538283, 0.504002, 0.245044, 0.046836, 0.881469, 0.148622, + 0.804958, 0.406845, 0.435662, 0.364701, 0.291077, 0.404339, 0.948996, + 0.888650, 0.217218, 0.988262, 0.810153, 0.354070, 0.251472, 0.892376, + 0.390826, 0.855087, 0.934166, 0.635453, 0.402146, 0.843193, 0.463845, + 0.975613, 0.078484, 0.275776, 0.417762, 0.424582, 0.351462, 0.152584, + 0.709934, 0.176501, 0.342223, 0.045484, 0.523229, 0.867291, 0.180673, + 0.433035, 0.494813, 0.457182, 0.578500, 0.122501, 0.627640, 0.059493, + 0.203059, 0.417564, 0.405842, 0.883510, 0.382213, 0.080276, 0.288037, + 0.366680, 0.771502, 0.868585, 0.984384, 0.748690, 0.225509, 0.208029, + 0.508301, 0.300714, 0.593630, 0.933136, 0.149565, 0.327301, 0.570310, + 0.512326, 0.044906, 0.068581, 0.171144, 0.334918, 0.595896, 0.244451, + 0.868130, 0.306131, 0.023271, 0.230718, 0.581006, 0.262223, 0.475655, + 0.306093, 0.119837, 0.192525, 0.192306, 0.363700, 0.344519, 0.844001, + 0.236159, 0.757393, 0.441866, 0.873148, 0.723895, 0.628312, 0.289490, + 0.471274, 0.276109, 0.933656, 0.774933, 0.515753, 0.508829, 0.878633, + 0.161455, 0.487705, 0.194438, 0.073326, 0.719559, 0.146848, 0.064468, + 0.295699, 0.159501, 0.841205, 0.130773, 0.727858, 0.213309, 0.529196, + 0.900356, 0.375119, 0.133807, 0.913048, 0.900510, 0.175900, 0.858299, + 0.624336, 0.144456, 0.290592, 0.449766] ), + + ([0.388440, 0.499100, 0.733940, 0.225929, 0.232795, 0.223090, 0.876339, + 0.324351, 0.299356, 0.762169, 0.124699, 0.241615, 0.421522, 0.130528, + 0.041871, 0.907041, 0.671590, 0.884213, 0.019318, 0.309915, 0.296731, + 0.349498, 0.636219, 0.319224, 0.977630, 0.978820, 0.856349, 0.833064, + 0.065096, 0.364208, 0.969207, 0.039460, 0.952208, 0.940916, 0.681356, + 0.069918, 0.236579, 0.911008, 0.264534, 0.826624, 0.830744, 0.419446, + 0.166601, 0.264809, 0.675344, 0.513321, 0.991638, 0.911466, 0.212561, + 0.915128, 0.255379, 0.901486, 0.275369, 0.142155, 0.822535, 0.312845, + 0.549120, 0.002838, 0.431623, 0.081851, 0.261422, 0.000977, 0.214240, + 0.279397, 0.257302, 0.679678, 0.614551, 0.030152, 0.114689, 0.435926, + 0.615497, 0.855617, 0.457808, 0.837184, 0.677969, 0.721702, 0.123600, + 0.971038, 0.298898, 0.573473, 0.338267, 0.859340, 0.594989, 0.636738, + 0.559618, 0.468276, 0.817927, 0.268838, 0.141697, 0.345042, 0.207495, + 0.639485, 0.478042, 0.412946, 0.088961, 0.022736, 0.779626, 0.955870, + 0.620685, 0.981933, 0.143742, 0.323527, 0.098392, 0.227912, 0.070437, + 0.388592, 0.222510, 0.432844, 0.082003, 0.287027, 0.234504, 0.780084, + 0.602710, 0.472945, 0.328471, 0.531602, 0.754234, 0.619098, 0.244667, + 0.394452, 0.223426, 0.394330, 0.450758, 0.967101, 0.858760, 0.649190, + 0.817225, 0.047121, 0.151219, 0.041231, 0.193121, 0.081668, 0.256630, + 0.630696, 0.788629, 0.541459, 0.714805, 0.478256, 0.770287, 0.500076, + 0.522507, 0.776086, 0.975463, 0.199438, 0.716086, 0.543352, 0.152318, + 0.883206, 0.120151, 0.417158, 0.631336, 0.678243, 0.418531, 0.570818, + 0.834529, 0.807184, 0.203528, 0.290048, 0.529160, 0.911405, 0.160436, + 0.238777, 0.231574, 0.767174, 0.042421, 0.945555, 0.667928, 0.175390, + 0.593280, 0.541917, 0.697378, 0.306375, 0.073183, 0.284127, 0.604968, + 0.281075, 0.544816, 0.889096, 0.169347, 0.269845, 0.574664, 0.216163, + 0.412732, 0.889950, 0.507523, 0.325938, 0.438124, 0.183325, 0.968780, + 0.447096, 0.261116, 0.955596, 0.751854, 0.882717, 0.041932, 0.757408, + 0.746513, 0.387494, 0.624226, 0.290139, 0.064486, 0.046663, 0.786370, + 0.516160, 0.018586, 0.188360, 0.112522, 0.255684, 0.111606, 0.360057, + 0.888607, 0.551195, 0.691214, 0.901181, 0.929960, 0.580615, 0.427168, + 0.142399, 0.747154, 0.400586, 0.266976, 0.763115, 0.955779, 0.301065, + 0.026276, 0.338481, 0.336375, 0.052614, 0.270486, 0.607135, 0.451674, + 0.827326, 0.643361], + [0.341520, 0.354248, 0.277172, 0.160909, 0.797057, + 0.240798, 0.202232, 0.531780, 0.648235, 0.247807, 0.899272, 0.204557, + 0.643516, 0.176589, 0.498432, 0.206448, 0.025146, 0.357909, 0.889836, + 0.870475, 0.239393, 0.718789, 0.405395, 0.966255, 0.060351, 0.494726, + 0.973623, 0.450753, 0.274252, 0.156538, 0.144262, 0.967449, 0.117045, + 0.347548, 0.190970, 0.086992, 0.503627, 0.736885, 0.627200, 0.147963, + 0.625970, 0.729231, 0.144069, 0.508258, 0.979544, 0.100684, 0.155637, + 0.614090, 0.726387, 0.819368, 0.064838, 0.369947, 0.284572, 0.910960, + 0.231451, 0.965955, 0.243170, 0.194659, 0.336649, 0.518927, 0.181495, + 0.160324, 0.764995, 0.434198, 0.334108, 0.141132, 0.895691, 0.739906, + 0.519881, 0.575619, 0.774124, 0.553721, 0.448064, 0.045919, 0.193842, + 0.091922, 0.777352, 0.523866, 0.113049, 0.299497, 0.627231, 0.439321, + 0.832294, 0.576561, 0.340493, 0.339656, 0.307748, 0.471689, 0.148783, + 0.872684, 0.317473, 0.791259, 0.918053, 0.786497, 0.862708, 0.431441, + 0.684761, 0.260587, 0.733843, 0.426337, 0.532126, 0.655947, 0.510283, + 0.364938, 0.552296, 0.762060, 0.360770, 0.052184, 0.840864, 0.127741, + 0.689611, 0.300560, 0.320230, 0.241689, 0.372612, 0.472813, 0.967107, + 0.929884, 0.252993, 0.992958, 0.742849, 0.411894, 0.345896, 0.770270, + 0.572115, 0.658990, 0.814392, 0.655808, 0.420486, 0.707766, 0.345577, + 0.975158, 0.085844, 0.406723, 0.249006, 0.238066, 0.539499, 0.145692, + 0.790438, 0.168272, 0.230688, 0.057680, 0.571479, 0.740323, 0.066511, + 0.489331, 0.318142, 0.492005, 0.589285, 0.132762, 0.636211, 0.046943, + 0.332692, 0.462977, 0.288413, 0.866029, 0.322398, 0.070890, 0.418203, + 0.476348, 0.784088, 0.918616, 0.971825, 0.687118, 0.119708, 0.226636, + 0.739284, 0.164853, 0.567597, 0.948301, 0.253904, 0.454577, 0.630131, + 0.797070, 0.069375, 0.062262, 0.181825, 0.514047, 0.579143, 0.347091, + 0.790777, 0.249278, 0.041634, 0.302402, 0.692700, 0.223413, 0.806465, + 0.255903, 0.078892, 0.196589, 0.233383, 0.438091, 0.133392, 0.873997, + 0.187271, 0.777030, 0.369699, 0.892954, 0.791136, 0.568050, 0.271141, + 0.550761, 0.438786, 0.966893, 0.695801, 0.625005, 0.646452, 0.847563, + 0.206998, 0.480985, 0.149400, 0.125530, 0.576586, 0.184683, 0.119176, + 0.215631, 0.154857, 0.888609, 0.251622, 0.675261, 0.155464, 0.353164, + 0.907869, 0.196696, 0.109431, 0.930597, 0.817032, 0.075295, 0.760376, + 0.463851, 0.244921, 0.108898, 0.363699] ), + + ([0.490799, 0.225929, 0.074892, 0.299295, 0.397198, 0.393933, 0.135197, + 0.595447, 0.837336, 0.225318, 0.868160, 0.699576, 0.888455, 0.430280, + 0.082522, 0.270516, 0.534074, 0.653493, 0.045015, 0.866939, 0.412214, + 0.461928, 0.850429, 0.240822, 0.002838, 0.233283, 0.934324, 0.172216, + 0.786401, 0.850764, 0.509842, 0.001007, 0.403821, 0.611042, 0.209449, + 0.512284, 0.350383, 0.251167, 0.712882, 0.331492, 0.233283, 0.501053, + 0.642750, 0.485702, 0.125431, 0.067263, 0.509201, 0.286843, 0.046144, + 0.455184, 0.984191, 0.193701, 0.099704, 0.534806, 0.287484, 0.808802, + 0.303781, 0.257302, 0.965209, 0.665822, 0.638356, 0.428144, 0.841853, + 0.964843, 0.346568, 0.942930, 0.427839, 0.910703, 0.018830, 0.392499, + 0.563128, 0.811274, 0.491501, 0.443617, 0.578448, 0.591876, 0.090976, + 0.900815, 0.755394, 0.881619, 0.255013, 0.856624, 0.366649, 0.328623, + 0.062166, 0.835719, 0.077364, 0.299783, 0.700522, 0.339396, 0.989319, + 0.621662, 0.407453, 0.696799, 0.108737, 0.518509, 0.911039, 0.629048, + 0.519395, 0.403943, 0.904782, 0.432417, 0.041688, 0.682455, 0.586871, + 0.186987, 0.659810, 0.216529, 0.795068, 0.896878, 0.497147, 0.616626, + 0.768395, 0.968383, 0.622394, 0.009156, 0.067385, 0.932310, 0.466384, + 0.439619, 0.683523, 0.816675, 0.131870, 0.566332, 0.869289, 0.075869, + 0.377178, 0.801874, 0.720511, 0.483139, 0.554643, 0.557756, 0.041597, + 0.891690, 0.285531, 0.748955, 0.525468, 0.271493, 0.152684, 0.214423, + 0.778893, 0.927824, 0.191748, 0.209876, 0.225135, 0.307291, 0.462600, + 0.629200, 0.414502, 0.298441, 0.482101, 0.110355, 0.774560, 0.432508, + 0.799402, 0.682699, 0.330760, 0.890835, 0.495071, 0.111087, 0.429548, + 0.725181, 0.885434, 0.594012, 0.994079, 0.197241, 0.212867, 0.971038, + 0.344646, 0.643666, 0.604266, 0.096530, 0.115024, 0.772210, 0.077700, + 0.535691, 0.295450, 0.796472, 0.879727, 0.238716, 0.933805, 0.314280, + 0.933409, 0.350383, 0.526536, 0.336650, 0.679617, 0.809870, 0.630024, + 0.373333, 0.091556, 0.898587, 0.723991, 0.981353, 0.144749, 0.390881, + 0.858089, 0.682424, 0.523148, 0.465102, 0.112980, 0.656240, 0.842891, + 0.030122, 0.407239, 0.114841, 0.174810, 0.624500, 0.680746, 0.765282, + 0.147374, 0.544084, 0.986877, 0.266182, 0.410352, 0.354198, 0.523759, + 0.084964, 0.741539, 0.443220, 0.136418, 0.661367, 0.577044, 0.772942, + 0.320780, 0.284127, 0.246986, 0.482833, 0.260842, 0.586688, 0.697104, + 0.503922, 0.930418], + [0.424107, 0.396879, 0.414405, 0.114626, 0.785829, + 0.223161, 0.220193, 0.579817, 0.719536, 0.172066, 0.875931, 0.125967, + 0.394629, 0.199909, 0.343574, 0.187285, 0.027203, 0.308855, 0.855927, + 0.876132, 0.397154, 0.704915, 0.341795, 0.949075, 0.098719, 0.354898, + 0.976726, 0.321007, 0.223962, 0.124901, 0.175442, 0.971870, 0.143232, + 0.219022, 0.142665, 0.053376, 0.474999, 0.543850, 0.804155, 0.310526, + 0.791216, 0.762469, 0.169269, 0.528699, 0.985355, 0.087431, 0.175909, + 0.577205, 0.625587, 0.768158, 0.096223, 0.503537, 0.413709, 0.885578, + 0.191869, 0.926045, 0.329703, 0.186974, 0.282816, 0.604256, 0.109594, + 0.178356, 0.753140, 0.517298, 0.515606, 0.216674, 0.820059, 0.804815, + 0.611976, 0.631029, 0.803835, 0.591237, 0.322586, 0.052500, 0.328980, + 0.123051, 0.620348, 0.532733, 0.144982, 0.391361, 0.613410, 0.383974, + 0.734064, 0.532324, 0.344537, 0.422938, 0.254770, 0.530569, 0.153824, + 0.835986, 0.547887, 0.832646, 0.901160, 0.830598, 0.935647, 0.287002, + 0.598803, 0.108118, 0.799591, 0.405487, 0.543971, 0.689053, 0.329327, + 0.383579, 0.390946, 0.614205, 0.349351, 0.048845, 0.904713, 0.143100, + 0.771536, 0.357421, 0.459892, 0.389907, 0.224094, 0.376756, 0.948369, + 0.888373, 0.273341, 0.992956, 0.780531, 0.400960, 0.424054, 0.878922, + 0.436259, 0.647822, 0.800395, 0.634784, 0.492485, 0.799851, 0.479985, + 0.964370, 0.058900, 0.276129, 0.348107, 0.391172, 0.603799, 0.216043, + 0.688422, 0.219302, 0.464335, 0.091783, 0.600059, 0.873305, 0.044057, + 0.450227, 0.399348, 0.499331, 0.611188, 0.133346, 0.474435, 0.073997, + 0.290723, 0.628574, 0.407430, 0.898788, 0.407404, 0.074780, 0.427978, + 0.480693, 0.685756, 0.861848, 0.948614, 0.789383, 0.103810, 0.242024, + 0.591603, 0.202827, 0.707913, 0.928032, 0.219192, 0.375436, 0.620618, + 0.740555, 0.085314, 0.073262, 0.123595, 0.291393, 0.559089, 0.284462, + 0.905447, 0.173849, 0.075588, 0.443385, 0.643536, 0.251822, 0.598107, + 0.282495, 0.110525, 0.149146, 0.151177, 0.353747, 0.285400, 0.869472, + 0.224384, 0.648134, 0.328993, 0.908896, 0.810594, 0.513033, 0.234783, + 0.575107, 0.211473, 0.963435, 0.609522, 0.609734, 0.516709, 0.787513, + 0.218430, 0.318520, 0.172837, 0.092019, 0.536853, 0.163634, 0.178079, + 0.368606, 0.184779, 0.929009, 0.159243, 0.748073, 0.172109, 0.597596, + 0.901627, 0.175661, 0.128399, 0.923317, 0.852674, 0.072980, 0.825466, + 0.662855, 0.122188, 0.163042, 0.256912] )] diff --git a/testsuite/tests/programs/okeefe_neural/Makefile b/testsuite/tests/programs/okeefe_neural/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/okeefe_neural/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/okeefe_neural/test.T b/testsuite/tests/programs/okeefe_neural/test.T new file mode 100644 index 0000000000..cf329cf716 --- /dev/null +++ b/testsuite/tests/programs/okeefe_neural/test.T @@ -0,0 +1,12 @@ + +# this one causes the compiler to run out of heap in the simplifier + +def set_opts( opts ): + opts.expect = 'fail' + +test('okeefe_neural', + [skip_if_fast, + set_opts, + extra_clean(['Main.hi'])], + multimod_compile_and_run, + ['Main', '-package lang +RTS -M64m -RTS']) diff --git a/testsuite/tests/programs/record_upd/Main.hs b/testsuite/tests/programs/record_upd/Main.hs new file mode 100644 index 0000000000..3b6b3ae2f9 --- /dev/null +++ b/testsuite/tests/programs/record_upd/Main.hs @@ -0,0 +1,25 @@ +{- The purpose of this is to test that record update is + sufficiently polymorphic. See comments with + tcExpr (RecordUpd) in TcExpr.lhs +-} + +module Main where + +data T a b c d = MkT1 { op1 :: a, op2 :: b } + | MkT2 { op1 :: a, op3 :: c } + | MkT3 { op4 :: a, op5 :: d } + +update1 :: a2 -> T a b c d -> T a2 b c d2 +update1 x t = t { op1 = x } + -- NB: the MkT3.op4 case doesn't constrain the result because + -- it doesn't have an op1 field + +update2 :: a2 -> T a b c d -> T a2 b2 c2 d +update2 x t = t { op4 = x } + +main = print (op4 $ + update2 True $ + MkT3 { op4 = op2 $ + update1 (1::Int) $ + MkT1 { op1 = True } + }) diff --git a/testsuite/tests/programs/record_upd/Makefile b/testsuite/tests/programs/record_upd/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/record_upd/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/record_upd/record_upd.stdout b/testsuite/tests/programs/record_upd/record_upd.stdout new file mode 100644 index 0000000000..0ca95142bb --- /dev/null +++ b/testsuite/tests/programs/record_upd/record_upd.stdout @@ -0,0 +1 @@ +True diff --git a/testsuite/tests/programs/record_upd/test.T b/testsuite/tests/programs/record_upd/test.T new file mode 100644 index 0000000000..e98b70c43e --- /dev/null +++ b/testsuite/tests/programs/record_upd/test.T @@ -0,0 +1,6 @@ + +test('record_upd', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/rittri/Main.hs b/testsuite/tests/programs/rittri/Main.hs new file mode 100644 index 0000000000..e62c8a4667 --- /dev/null +++ b/testsuite/tests/programs/rittri/Main.hs @@ -0,0 +1,39 @@ +infixr ->!,=\ + +-- auxiliary functions ----------------------------------------------------- + +g u v w (x:y:z) = i(v x y)(u x y (w z) z)(x:w(y:z)) +g u v w [x] = [x,512] +q u v w nil = u : 95 : z v : w + +long = several.length +((->!),(=\))=(map,($)) +a = g q f +y = (-)32 +z = (+)32 +several = (>)2 +fairlySmall = (<)64 +notTooSmall = (>)91 +justRight = (==)95 +notTooBig = (<)96 +veryBig = (>)123 +goodSize x =foldr(&&) + otherwise =\($x)->![notTooBig,veryBig] +f y z =fairlySmall(z)&&goodSize(y)&¬TooSmall(z) +i cond th el=if(cond)then(th)else(el) +toBeIsToDoAndToDoIsToBeSaidConFuTse + +-- main functions ---------------------------------------------------------- + + g = interact$map + toEnum.g.map + fromEnum +main = + toBeIsToDoAndToDoIsToBeSaidConFuTse(let h=a;t=x where x x=i(long x)x(h t x) + q v w x z = - y w:x + a = g q f + f x y = justRight x + && goodSize y + in t) + +-- rittri@cs.chalmers.se --------------------------------------------------- diff --git a/testsuite/tests/programs/rittri/Makefile b/testsuite/tests/programs/rittri/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/rittri/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/rittri/rittri.stdin b/testsuite/tests/programs/rittri/rittri.stdin new file mode 100644 index 0000000000..84e5ba190d --- /dev/null +++ b/testsuite/tests/programs/rittri/rittri.stdin @@ -0,0 +1,39 @@ +infixr ->!,=\ + +-- auxiliary functions ----------------------------------------------------- + +g u v w (x:y:z) = i(v x y)(u x y (w z) z)(x:w(y:z)) +g u v w [x] = [x,512] +q u v w nil = u : 95 : z v : w + +long = several.length +((->!),(=\))=(map,($)) +a = g q f +y = (-)32 +z = (+)32 +several = (>)2 +fairlySmall = (<)64 +notTooSmall = (>)91 +justRight = (==)95 +notTooBig = (<)96 +veryBig = (>)123 +goodSize x =foldr(&&) + otherwise =\($x)->![notTooBig,veryBig] +f y z =fairlySmall(z)&&goodSize(y)&¬TooSmall(z) +i cond th el=if(cond)then(th)else(el) +toBeIsToDoAndToDoIsToBeSaidConFuTse + +-- main functions ---------------------------------------------------------- + + g = interact$map + chr.g.map + ord +main = + toBeIsToDoAndToDoIsToBeSaidConFuTse(let h=a;t=x where x x=i(long x)x(h t x) + q v w x z =- y w:x + a = g q f + f x y = justRight x + && goodSize y + in t) + +-- rittri@cs.chalmers.se --------------------------------------------------- diff --git a/testsuite/tests/programs/rittri/rittri.stdout b/testsuite/tests/programs/rittri/rittri.stdout new file mode 100644 index 0000000000..c904cda513 --- /dev/null +++ b/testsuite/tests/programs/rittri/rittri.stdout @@ -0,0 +1,39 @@ +infixr ->!,=\ + +-- auxiliary functions ----------------------------------------------------- + +g u v w (x:y:z) = i(v x y)(u x y (w z) z)(x:w(y:z)) +g u v w [x] = [x,512] +q u v w nil = u : 95 : z v : w + +long = several.length +((->!),(=\))=(map,($)) +a = g q f +y = (-)32 +z = (+)32 +several = (>)2 +fairly_small = (<)64 +not_too_small = (>)91 +just_right = (==)95 +not_too_big = (<)96 +very_big = (>)123 +good_size x =foldr(&&) + otherwise =\($x)->![not_too_big,very_big] +f y z =fairly_small(z)&&good_size(y)&¬_too_small(z) +i cond th el=if(cond)then(th)else(el) +to_be_is_to_do_and_to_do_is_to_be_said_con_fu_tse + +-- main functions ---------------------------------------------------------- + + g = interact$map + chr.g.map + ord +main = + to_be_is_to_do_and_to_do_is_to_be_said_con_fu_tse(let h=a;t=x where x x=i(long x)x(h t x) + q v w x z =- y w:x + a = g q f + f x y = just_right x + && good_size y + in t) + +-- rittri@cs.chalmers.se --------------------------------------------------- diff --git a/testsuite/tests/programs/rittri/test.T b/testsuite/tests/programs/rittri/test.T new file mode 100644 index 0000000000..2e14f6fdcc --- /dev/null +++ b/testsuite/tests/programs/rittri/test.T @@ -0,0 +1,6 @@ + +test('rittri', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/sanders_array/Main.hs b/testsuite/tests/programs/sanders_array/Main.hs new file mode 100644 index 0000000000..d5a2b29d12 --- /dev/null +++ b/testsuite/tests/programs/sanders_array/Main.hs @@ -0,0 +1,52 @@ +{- +From: Paul Sanders <psanders@srd.bt.co.uk> +To: partain +Subject: A puzzle for you +Date: Mon, 28 Oct 91 17:02:19 GMT + +I'm struggling with the following code fragment at the moment: +-} + +import Data.Array -- 1.3 +import Data.Ix -- 1.3 + +conv_list :: (Ix a, Ix b) => [a] -> [b] -> [[c]] -> Array (a,b) c -> Array (a,b) c +conv_list [] _ _ ar = ar +conv_list _ _ [] ar = ar +conv_list (r:rs) cls (rt:rts) ar + = conv_list rs cls rts ar' + where ar' = conv_elems r cls rt ar + +conv_elems :: (Ix a, Ix b) => a -> [b] -> [c] -> Array (a,b) c -> Array (a,b) c +conv_elems row [] _ ar = ar +conv_elems _ _ [] ar = ar +conv_elems row (col:cls) (rt:rts) ar + = conv_elems row cls rts ar' + where ar' = ar // [((row,col), rt)] + +ar :: Array (Int, Int) Int +ar = conv_list [(1::Int)..(3::Int)] [(1::Int)..(3::Int)] ar_list init_ar + where init_ar = array (((1::Int),(1::Int)),((3::Int),(3::Int))) [] + + +ar_list :: [[Int]] -- WDP +ar_list = [[1,2,3], + [6,7,8], + [10,12,15]] + +main = putStrLn (show ar) + +{- +What it tries to do is turn a list of lists into a 2-d array in an incremental +fashion using 2 nested for-loops. It compiles okay on the prototype compiler +but gives a segmentation fault when it executes. I know I can define in the +array in one go (and I have done) but, for my piece of mind, I want to get this +way working properly. + +Is it a bug in the prototype or is there a glaringly obvious error in my code +which I've been stupid to spot ???? + +Hoping its the latter, + +Paul. +-} diff --git a/testsuite/tests/programs/sanders_array/Makefile b/testsuite/tests/programs/sanders_array/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/sanders_array/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/sanders_array/sanders_array.stdout b/testsuite/tests/programs/sanders_array/sanders_array.stdout new file mode 100644 index 0000000000..d3405a74e2 --- /dev/null +++ b/testsuite/tests/programs/sanders_array/sanders_array.stdout @@ -0,0 +1 @@ +array ((1,1),(3,3)) [((1,1),1),((1,2),2),((1,3),3),((2,1),6),((2,2),7),((2,3),8),((3,1),10),((3,2),12),((3,3),15)] diff --git a/testsuite/tests/programs/sanders_array/test.T b/testsuite/tests/programs/sanders_array/test.T new file mode 100644 index 0000000000..03c4d4eece --- /dev/null +++ b/testsuite/tests/programs/sanders_array/test.T @@ -0,0 +1,6 @@ + +test('sanders_array', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/seward-space-leak/Main.lhs b/testsuite/tests/programs/seward-space-leak/Main.lhs new file mode 100644 index 0000000000..327118d5e3 --- /dev/null +++ b/testsuite/tests/programs/seward-space-leak/Main.lhs @@ -0,0 +1,650 @@ +{- + +This test runs for a Long Time (10mins for the registerised version) +and allocates 3.4Gbytes. It also hammers the GC; with -H16M it spend +40% of the time in the GC. + + + +Date: Sun, 25 Oct 92 16:38:12 GMT +From: Julian Seward (DRL PhD) <sewardj@uk.ac.man.cs> +Message-Id: <9210251638.AA21153@r6b.cs.man.ac.uk> +To: partain@uk.ac.glasgow.dcs +Subject: Space consumption in 0.09 produced binary +Cc: sewardj@uk.ac.man.cs, simonpj@uk.ac.glasgow.dcs + +Folks, + +At the risk of wasting even more of your valuable time, here is +a small problem I ran into: + +The program (XXXX.lhs) listed below runs in constant space (about 4k) +in both Gofer and hbc 0.998.5. When compiled with 0.09, it runs out +of heap in seconds (4 meg heap). + +The program builds a gigantic list of things (CDSs, in fact), I believe +at least 100,000 long, and searches to find out if a particular CDS is +present. The CDS list is generated lazily, and should be thrown away +as it goes, until apply_cds is found (see the bottom of the listing). +Gofer and hbc behave as expected, but I suspect ghc is holding onto +the complete list unnecessarily. + +I include XXXX.stat as supporting evidence. + +Jules + +(compiled hence: +ghc9 -v -O -gc-ap -flet-float -Rgc-stats -Rmax-heapsize 14M -o XXXX XXXX.lhs +) + +----------------------------------------------------------------------- + +XXXX +RTS -S + +Collector: APPEL HeapSize: 4,194,304 (bytes) + + Alloc Live Live Astk Bstk OldGen GC GC TOT TOT Page Flts Collec Resid + bytes bytes % bytes bytes roots user elap user elap GC TOT tion %heap +2097108 1119672 53.4 52 132 1119616 0.33 0.35 1.01 1.15 0 0 Minor +1537300 918200 59.7 48 128 918188 0.26 0.31 1.76 1.95 0 0 Minor +1078216 654212 60.7 56 160 652612 0.19 0.18 2.29 2.46 0 0 Minor + 751108 442140 58.9 52 108 442140 0.12 0.12 2.64 2.84 0 0 Minor +3134224 2935044 93.6 52 108 1.49 1.50 4.13 4.34 0 0 *MAJOR* 70.0% + 629612 376848 59.9 52 132 376836 0.11 0.11 4.44 4.64 0 0 Minor + 441184 265100 60.1 96 200 264416 0.08 0.07 4.66 4.86 0 0 Minor + 308640 204072 66.1 56 160 199476 0.06 0.05 4.81 5.01 0 0 Minor +3781064 3687092 97.5 56 160 1.81 1.85 6.62 6.86 0 0 *MAJOR* 87.9% + 253600 160584 63.3 52 108 160584 0.05 0.04 6.75 6.98 0 0 Minor + 173312 112344 64.8 56 160 110304 0.03 0.03 6.83 7.07 0 0 Minor + 117128 77260 66.0 36 140 74112 0.01 0.02 6.88 7.13 0 0 Minor +4037280 3985284 98.7 36 140 1.96 1.98 8.85 9.11 0 0 *MAJOR* 95.0% + +------------------------------------------------------------------------- +-} + +> module Main where + +%============================================================ +%============================================================ + +\section{A CDS interpreter} + +\subsection{Declarations} + +Second attempt at a CDS interpreter. Should do +loop detection correctly in the presence of higher order functions. + +The types allowed are very restrictive at the mo. + +> data Type = Two +> | Fn [Type] + +Now, we also have to define CDSs and selectors. +\begin{itemize} +\item +@Empty@ is a non-legitimate CDS, denoting no value at all. We use +it as an argument in calls to other CDSs denoting that +the particular argument is not really supplied. +\item +@Par@ is similarly a non-legit CDS, but useful for constructing +selectors. It simply denotes the parameter specified (note +parameter numbering starts at 1). +\item +@Zero@ and @One@ are constant valued CDSs. +\item +@Call@. +Calls to other functions are done with @Call@, which expects +the callee to return @Zero@ or @One@, and selects the relevant +branch. The @Tag@s identify calls in the dependancy list. +Although a @Call@ is a glorified @Case@ statement, the only allowed +return values are @Zero@ and @One@. Hence the @CDS CDS@ continuations +rather than the more comprehensive @(AList Return CDS)@. +We require arguments to be fully disassembled. +\item @Case@ +Case selectors can only be of the following form: +\begin{itemize} +\item + @[Par n]@ if the n'th parameter is not a function space. +\item + @[Par n, v1 ... vn]@ if the n'th parameter is a function space of + arity n. The v's may be only @Empty@, @Zero@, + @One@, or @Par n@. +\end{itemize} +\end{itemize} +We also have a @Magic@ CDS which is a load of mumbo-jumbo for use +in enumeration of and compilation to CDSs. Of no significance +whatever here. + +> data CDS = Empty +> | Par Int +> | Zero +> | One +> | Case [CDS] (AList Return CDS) +> | Call String Tag [CDS] CDS CDS +> | Magic +> +> type AList a b = [(a, b)] +> +> type Tag = Int + +> instance Eq CDS where +> (Par n1) == (Par n2) = n1 == n2 +> Zero == Zero = True +> One == One = True +> (Case sels1 rets1) == (Case sels2 rets2) = sels1 == sels2 && +> rets1 == rets2 +> (Call f1 t1 sels1 a1 b1) == (Call f2 t2 sels2 a2 b2) +> = f1 == f2 && t1 == t2 && sels1 == sels2 && a1 == a2 && b1 == b2 +> Magic == Magic = True +> _ == _ = False + + +A @Return@ is a temporary thing used to decide which way to go at +a @Case@ statement. + +> data Return = RZero +> | ROne +> | RP Int + +> instance Eq Return where +> RZero == RZero = True +> ROne == ROne = True +> (RP p1) == (RP p2) = p1 == p2 +> _ == _ = False + +We need a code store, which gives out a fresh instance of a CDS +as necessary. ToDo: Need to rename call sites? I don't think so. + +> type Code = AList String CDS + +%============================================================ +%============================================================ + +\subsection{The evaluator} +Main CDS evaluator takes +\begin{itemize} +\item the code store +\item the dependancy list, a list of @Tag@s of calls which are + currently in progress +\item the current arguments +\item the CDS fragment currently being worked on +\end{itemize} + +> type Depends = [Tag] +> +> eval :: Code -> Depends -> [CDS] -> CDS -> CDS + +Evaluating a constant valued CDS is trivial. There may be arguments +present -- this is not a mistake. + +> eval co de args Zero = Zero +> eval co de args One = One + +Making a call is also pretty simple, because we assume +that all non-functional arguments are presented as literals, +and all functional values have already been dismantled (unless +they are being passed unchanged in the same position in a recursive call +to the same function, something for the compiler to detect). + +Two other issues are at work here. Guided by the selectors, +we copy the args to make a set of args for the call. However, if an +copied arg is Empty, the call cannot proceed, so we return the CDS as-is. +Note that an Empty *selector* is not allowed in a Call (although it is +in a Case). + +The second issue arises if the call can go ahead. We need to check the +tag on the call just about to be made with the tags of calls already in +progress (in de) to see if we are looping. If the tag has already been +encountered, the result of the call is Zero, so the Zero alternative is +immediately selected. + +> eval co de args cds@(Call fname tag params alt0 alt1) +> = let (copied_an_empty, callee_args) = copy_args args params +> augmented_de = tag : de +> callee_code = lkup co fname +> callee_result = eval co augmented_de callee_args callee_code +> been_here_before = tag `elem` de +> in +> if copied_an_empty +> then cds +> else +> if been_here_before +> then eval co augmented_de args alt0 +> else case callee_result of +> Zero -> eval co de args alt0 +> One -> eval co de args alt1 +> _ -> error "Bad callee result" + +Case really means "evaluate". + + - make sure first selector is non-Empty. If so, return CDS as-is. + + - Copy other args. If Empty is *copied*, return CDS as-is. + Otherwise, call evaluator and switch on head of result. + +Note about switching on the head of the result. We expect to see +*only* the following as results: + + Zero + One + Case [Param m, rest] + +in which case switching is performed on + + Zero + One + Case (Param m) + +ToDo: what happens if a Call turns up ??? + +> eval co de args cds@(Case ((Par n):ps) alts) +> = let (copied_an_empty, new_args) = copy_args args ps +> functional_param = args !! (n-1) +> in if functional_param == Empty || +> copied_an_empty +> then cds +> else eval co de args +> (lkup alts (get_head +> (eval co de new_args functional_param))) + +Auxiliary for evaluating Case expressions. + +> get_head Zero = RZero +> get_head One = ROne +> get_head (Case ((Par n):_) _) = RP n + +Copy args based on directions in a list of selectors. +Also returns a boolean which is True if an Empty has been +*copied*. An Empty *selector* simply produces Empty in the +corresponding output position. + +> copy_args :: [CDS] -> [CDS] -> (Bool, [CDS]) +> +> copy_args args params +> = case cax False params [] of +> (empty_copied, res) -> (empty_copied, reverse res) +> where +> cax empty [] res = (empty, res) +> cax empty (Zero:ps) res = cax empty ps (Zero:res) +> cax empty (One:ps) res = cax empty ps (One:res) +> cax empty (Empty:ps) res = cax empty ps (Empty:res) +> cax empty ((Par n):ps) res +> = case args !! (n-1) of +> Empty -> cax True ps (Empty:res) +> other -> cax empty ps (other:res) + +> lkup env k = head ( [v | (kk,v) <- env, kk == k] ++ +> [error ( "Can't look up " ) ] ) + +%============================================================ +%============================================================ + +%============================================================ +%============================================================ + +Something to make running tests easier ... + +> eval0 fname args = eval test [] args (lkup test fname) +> +> two = [Zero, One] + +Now for some test data ... + +> test +> = +> [ +> ("add", add_cds), +> ("apply", apply_cds), +> ("k0", k0_cds), +> ("id", id_cds), +> ("k1", k1_cds), +> ("kkkr", kkkr_cds), +> ("kkkl", kkkl_cds), +> ("apply2", apply2_cds) +> ] +> + +Constant Zero function. + +> k0_cds +> = Case [Par 1] +> [(RZero, Zero), +> (ROne, Zero)] +> + +Identity. + +> id_cds +> = Case [Par 1] +> [(RZero, Zero), +> (ROne, One)] + +Constant One function. + +> k1_cds +> = Case [Par 1] +> [(RZero, One), +> (ROne, One)] + +Strict in both of two arguments, for example (+). + +> add_cds +> = Case [Par 1] +> [(RZero, Case [Par 2] +> [(RZero, Zero), +> (ROne, Zero) +> ]), +> (ROne, Case [Par 2] +> [(RZero, Zero), +> (ROne, One) +> ]) +> ] + +The (in)famous apply function. + +> apply_cds +> = Case [Par 1, Empty] +> [(RZero, Zero), +> (ROne, One), +> (RP 1, Case [Par 2] +> [(RZero, Case [Par 1, Zero] +> [(RZero, Zero), +> (ROne, One)]), +> (ROne, Case [Par 1, One] +> [(RZero, Zero), +> (ROne, One)]) +> ]) +> ] + +The inverse K-combinator: K x y = y + +> kkkr_cds +> = Case [Par 2] +> [(RZero, Zero), +> (ROne, One) +> ] + +The standard K-combinator, defined thus: K x y = K-inverse y x. +Purpose of this is to test function calling. + +> kkkl_cds +> = Case [Par 1] +> [(RZero, Case [Par 2] +> [(RZero, Call "kkkr" 101 [Zero, Zero] Zero One), +> (ROne, Call "kkkr" 102 [One, Zero] Zero One) +> ]), +> (ROne, Case [Par 2] +> [(RZero, Call "kkkr" 103 [Zero, One] Zero One), +> (ROne, Call "kkkr" 104 [One, One] Zero One) +> ]) +> ] + +Apply a 2-argument function (apply2 f x y = f x y). + +> apply2_cds +> = Case [Par 1, Empty, Empty] +> [(RZero, Zero), +> (ROne, One), +> (RP 1, Case [Par 2] +> [(RZero, Case [Par 1, Zero, Empty] +> [(RZero, Zero), +> (ROne, One), +> (RP 2, Case [Par 3] +> [(RZero, Case [Par 1, Zero, Zero] +> [(RZero, Zero), +> (ROne, One)]), +> (ROne, Case [Par 1, Zero, One] +> [(RZero, Zero), +> (ROne, One)]) +> ]) +> ]), +> (ROne, Case [Par 1, One, Empty] +> [(RZero, Zero), +> (ROne, One), +> (RP 2, Case [Par 3] +> [(RZero, Case [Par 1, One, Zero] +> [(RZero, Zero), +> (ROne, One)]), +> (ROne, Case [Par 1, One, One] +> [(RZero, Zero), +> (ROne, One)]) +> ]) +> ]) +> ]), +> (RP 2, Case [Par 3] +> [(RZero, Case [Par 1, Empty, Zero] +> [(RZero, Zero), +> (ROne, One), +> (RP 1, Case [Par 2] +> [(RZero, Case [Par 1, Zero, Zero] +> [(RZero, Zero), +> (ROne, One)]), +> (ROne, Case [Par 1, One, Zero] +> [(RZero, Zero), +> (ROne, One)]) +> ]) +> ]), +> (ROne, Case [Par 1, Empty, One] +> [(RZero, Zero), +> (ROne, One), +> (RP 1, Case [Par 2] +> [(RZero, Case [Par 1, Zero, One] +> [(RZero, Zero), +> (ROne, One)]), +> (ROne, Case [Par 1, One, One] +> [(RZero, Zero), +> (ROne, One)]) +> ]) +> ]) +> ]) +> ] + +Simple, isn't it! + +%============================================================ +%============================================================ + +%============================================================ +%============================================================ + +Enumeration of all CDSs of a given type. + +Define n-ary branched trees. These are used to hold the +possible prefixes of function arguments, something essential +when enumerating higher-order CDSs. ToDo: translate to English + +> data NTree a = NLeaf +> | NBranch a [NTree a] + +The enumeration enterprise involves some mutual recursion +when it comes to higher-order functions. We define the +top-level enumerator function, for trivial cases, hence: + +> enumerate :: Type -> [CDS] +> +> enumerate Two = [Zero, One] +> enumerate (Fn ats) = +> expand_templates (traverse (length ats) (gen_pfx_trees ats)) + +Enumerating a function space is tricky. In summary: + + - Generate the prefix trees for each argument. + For non-function arguments this trivial, but for + function-valued arguments this means a call to the + enumerator to get all the possible values of the + (argument) function space. + + - Traverse the prefix trees, generating a series of + "templates" for functions. + + - Expand each template thus generated into a genuine CDS. + Each template denotes a group of CDSs, all of + the same "shape" and differing only in the constants + they return. The Magic and RMagic constructors are + used for these purposes. + +Generating prefix trees. For a Two-argument, is easy: + +> gen_pfx_trees :: [Type] -> [NTree [CDS]] +> +> gen_pfx_trees ts = zipWith gen_pfx_tree ts [1 .. length ts] +> +> gen_pfx_tree :: Type -> Int -> NTree [CDS] +> +> gen_pfx_tree Two n = NBranch [Par n] [] + +Note all prefixes are missing the initial (Par n) selector ... + +For a function arg + + - enumerate each of the *function's* args + + - starting with a selector [Empty, ...., Empty], + make a tree wherein at each level, branching is + achieved by filling in every Empty with every value + of that argument type. ToDo: fix this + +> gen_pfx_tree (Fn arg_types) n +> = let number_args = length arg_types +> enumed_args = map enumerate arg_types +> initial_sel = take number_args (repeat Empty) +> init_tree = NBranch ((Par n):initial_sel) [] +> in +> expand_pfx_tree number_args number_args n enumed_args init_tree + +@expand_pfx_tree@ expands a tree until there are no Emptys +at the leaves. Its first parameter is the number of Emptys +in the tree it has been given; when zero, expansion is complete. +The second parameter is the number of Emptys in the original +tree (equal to the arity of the function being enumerated). +Third number is the argument number in the top-level function, +needed to make the initial "Par n" selector. +Also needs to carry around the enumeration of the function's +arguments. + +> expand_pfx_tree :: Int -> Int -> Int -> [[CDS]] -> NTree [CDS] -> NTree [CDS] +> +> expand_pfx_tree 0 w i enums tree = tree +> +> expand_pfx_tree n w i enums (NBranch sels []) +> = let indices = [0 .. w - 1] +> n_minus_1 = n - 1 +> new_sels = concat (map expand_sel indices) +> expand_sel n +> = case sels !! (n+1) of +> Empty -> map (upd (n+1) sels) (enums !! n) +> other -> [] +> mk_trivial_tree sel = NBranch sel [] +> in +> NBranch sels (map (expand_pfx_tree n_minus_1 w i enums . mk_trivial_tree) +> new_sels) + +> upd :: Int -> [a] -> a -> [a] +> upd 0 (y:ys) x = x:ys +> upd n (y:ys) x = y:upd (n-1) ys x + +In the second phase, the prefix trees are traversed to generate +CDS templates (full of Magic, but no Zero or One). +The first arg is the number of arguments, and the +second the prefix trees for each argument. + +> traverse :: Int -> [NTree [CDS]] -> [CDS] + +Each pfxtree denotes a selector, one for each argument, plus a load +of more specific selectors. So for each argument, one manufactures +all possible sub-cds using the sub-selectors as the set Z. +You then take this arg's selector, and manufacture a load of CDSs +like this: +\begin{verbatim} + Case this_selector + 0 -> z | z <- Z + 1 -> z | z <- Z + Par n -> z | z <- Z for each n in [1 .. length this_selector] + satisfying this_selector !! n == Empty +\end{verbatim} + + +> traverse n pfxtrees +> = Magic : concat (map doOne [0 .. n - 1]) +> where +> doOne i = traverse_arg n i pfxtrees (pfxtrees !! i) + +@traverse_arg@ makes the CDSs corresponding to descending a +particular argument, the number of which is given as its second +parameter. It also gets the complete set of pfxtrees and the one +to descend. Note that having descended in the given argument, we +check its sub-selectors. If none, (an empty list), this replaced +by [NLeaf] to make everything work out. A NLeaf selector +is a dummy which generates no CDSs. + +> traverse_arg n i pfxtrees NLeaf +> = [] + +> traverse_arg n i pfxtrees (NBranch this_selector subsidiary_selectors_init) +> = let subsidiary_selectors +> = case subsidiary_selectors_init of +> [] -> [NLeaf]; (_:_) -> subsidiary_selectors_init +> subsidiary_pfxtrees = map (upd i pfxtrees) subsidiary_selectors +> par_requests = preq 1 [] this_selector +> preq n acc [] = acc +> preq n acc (Empty:rest) = preq (n+1) ((RP n):acc) rest +> preq n acc (other:rest) = preq (n+1) acc rest +> subsidiary_cdss = concat (map (traverse n) subsidiary_pfxtrees) +> all_poss_rhss = splat (2 + length par_requests) subsidiary_cdss +> all_poss_returns = [RZero, ROne] ++ par_requests +> in +> [Case this_selector (zip all_poss_returns rhs) +> | rhs <- all_poss_rhss] +> +> splat :: Int -> [a] -> [[a]] +> splat 0 set = [[]] +> splat n set = [x:xs | x <- set, xs <- splat (n-1) set] + +The final stage in the game is to fill in all the @Magic@s +with constants. A template with $n$ @Magic@s presently generates +@2^n@ CDSs, obtained by all possible combinations of +filling each @Magic@ in with @Zero@ or @One@. To do this we +first need to count the @Magic@s. + +> count_magic :: CDS -> Int +> +> count_magic Magic = 1 +> count_magic (Case sels alts) = sum (map (count_magic.snd) alts) + +We don't expect to see anything else at this stage. +Now make $2^n$ lists, each of length $n$, each with a different +sequence of @Zero@s and @One@s. Use these to label the +@Magic@s in the template. + +> label_cds :: CDS -> [CDS] -> ([CDS], CDS) +> +> label_cds Magic (l:ls) = (ls, l) +> label_cds (Case sels alts) ls +> = case f ls alts of (l9, alts_done) -> (l9, Case sels alts_done) +> where +> f l0 [] = (l0, []) +> f l0 (a:as) = let (l1, a_done) = lalt l0 a +> (l2, as_done) = f l1 as +> in (l2, a_done:as_done) +> lalt l0 (ret, cds) = case label_cds cds l0 of +> (l1, cds_done) -> (l1, (ret, cds_done)) + +Finally: + +> expand_templates :: [CDS] -> [CDS] +> +> expand_templates ts +> = concat (map f ts) +> where +> f tem = map (snd . label_cds tem) +> (splat (count_magic tem) [Zero, One]) + +--> testq tt = (layn . map show' . nub) (enumerate tt) + +> main = putStrLn (show (apply_cds `myElem` (enumerate (Fn [Fn [Two], Two])))) +> +> i `myElem` [] = False +> i `myElem` (x:xs) = if i == x then True else i `myElem` xs + +%============================================================ +%============================================================ diff --git a/testsuite/tests/programs/seward-space-leak/Makefile b/testsuite/tests/programs/seward-space-leak/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/seward-space-leak/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/seward-space-leak/README b/testsuite/tests/programs/seward-space-leak/README new file mode 100644 index 0000000000..b43c8a7e7b --- /dev/null +++ b/testsuite/tests/programs/seward-space-leak/README @@ -0,0 +1,13 @@ +I thought this crashed if compiled without -O, but I +can't make it do so. + + glhc -darity-checks -C Main.hs + +then + + glhc -g -v -optc-O Main.hc -o cg023-reg + +It eats 3Gbytes and runs for 10mins but doesn't crash. + + +SLPJ 17 june 93 diff --git a/testsuite/tests/programs/seward-space-leak/cg023.stdout b/testsuite/tests/programs/seward-space-leak/cg023.stdout new file mode 100644 index 0000000000..c1f22fbc23 --- /dev/null +++ b/testsuite/tests/programs/seward-space-leak/cg023.stdout @@ -0,0 +1 @@ +False
\ No newline at end of file diff --git a/testsuite/tests/programs/seward-space-leak/seward-space-leak.stdout b/testsuite/tests/programs/seward-space-leak/seward-space-leak.stdout new file mode 100644 index 0000000000..bc59c12aa1 --- /dev/null +++ b/testsuite/tests/programs/seward-space-leak/seward-space-leak.stdout @@ -0,0 +1 @@ +False diff --git a/testsuite/tests/programs/seward-space-leak/test.T b/testsuite/tests/programs/seward-space-leak/test.T new file mode 100644 index 0000000000..bdb7759275 --- /dev/null +++ b/testsuite/tests/programs/seward-space-leak/test.T @@ -0,0 +1,7 @@ +setTestOpts(omit_compiler_types(['hugs'])) # takes much too long + +test('seward-space-leak', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/strict_anns/Main.hs b/testsuite/tests/programs/strict_anns/Main.hs new file mode 100644 index 0000000000..b2ee82d4bc --- /dev/null +++ b/testsuite/tests/programs/strict_anns/Main.hs @@ -0,0 +1,13 @@ +-- This test checks that constructors with strictness annotations +-- at least parse correctly. In GHC 2.02 they didn't! + +module Main where + +data Foo1 = Crunch1 ! Int ! Int Int deriving( Show ) + +data Foo2 = Crunch2 ! Int Int Int deriving( Show ) + +main = do + print (Crunch1 (1+1) (2+2) (3+3)) + print (Crunch2 (1+1) (2+2) (3+3)) + diff --git a/testsuite/tests/programs/strict_anns/Makefile b/testsuite/tests/programs/strict_anns/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/strict_anns/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/strict_anns/strict_anns.stdout b/testsuite/tests/programs/strict_anns/strict_anns.stdout new file mode 100644 index 0000000000..0f6e62ec68 --- /dev/null +++ b/testsuite/tests/programs/strict_anns/strict_anns.stdout @@ -0,0 +1,2 @@ +Crunch1 2 4 6 +Crunch2 2 4 6 diff --git a/testsuite/tests/programs/strict_anns/test.T b/testsuite/tests/programs/strict_anns/test.T new file mode 100644 index 0000000000..77ed9dab53 --- /dev/null +++ b/testsuite/tests/programs/strict_anns/test.T @@ -0,0 +1,6 @@ + +test('strict_anns', + [skip_if_fast, extra_clean(['Main.hi', 'Main.o'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/thurston-modular-arith/Main.hs b/testsuite/tests/programs/thurston-modular-arith/Main.hs new file mode 100644 index 0000000000..608025b1e1 --- /dev/null +++ b/testsuite/tests/programs/thurston-modular-arith/Main.hs @@ -0,0 +1,62 @@ +{-# LANGUAGE UndecidableInstances, ExistentialQuantification, + ScopedTypeVariables, Rank2Types #-} + +-- Modular arithmetic, due to Dale Thurston + +-- Here's a way to mimic dependent types using existential types, +-- illustrated by an implementation of modular arithmetic. To try it +-- out, load modulus.hs and try something like +-- inModulus (mkModulus (1234567890123::Integer)) (^ 98765432198765) 2 +-- to compute 2 to the 98765432198765'th power modulo 1234567890123. + +-- The key is the definitions at the top of TypeVal.hs: +-- +-- class TypeVal a t | t -> a where +-- -- typeToVal should ignore its argument. +-- typeToVal :: t -> a +-- +-- data Wrapper a = forall t . (TypeVal a t) => Wrapper t +-- +-- class ValToType a where +-- valToType :: a -> Wrapper a +-- +-- `valToType' takes a value `x' and returns a (wrapped version of a) +-- fake value in a new type; from the new type, `x' can be recovered by +-- applying typeToVal. +-- +-- This code works under ghc. It uses existentially quantified data +-- constructors, scoped type variables, and explicit universal +-- quantification. + + +module Main where + +import TypeVal + +default (Integer) + +main = print (map (inModulus (mkModulus (1234567890123::Integer)) (^98765432198765)) [2..1000]) + + + +data Mod s a = Mod {value::a} deriving (Eq, Show) + +data Modulus a = forall s. TypeVal a s => Modulus (a -> Mod s a) (Mod s a -> a) + +mkModulus :: (ValToType a, Integral a) => a -> Modulus a +mkModulus x = case valToType x of {Wrapper (y :: t) -> + Modulus normalize (value :: Mod t a -> a)} + +normalize :: forall a s. (TypeVal a s, Integral a) => a -> Mod s a +normalize x = (Mod (x `mod` typeToVal (undefined::s))) + +inModulus :: Modulus a -> (forall s . TypeVal a s => Mod s a -> Mod s a) + -> a -> a +inModulus (Modulus in_ out) f x = out (f (in_ x)) + +instance (TypeVal a s, Integral a) => Num (Mod s a) where + Mod x + Mod y = normalize (x + y) + Mod x - Mod y = normalize (x - y) + negate (Mod x) = normalize (negate x) + Mod x * Mod y = normalize (x * y) + fromInteger a = normalize (fromInteger a) diff --git a/testsuite/tests/programs/thurston-modular-arith/Makefile b/testsuite/tests/programs/thurston-modular-arith/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/programs/thurston-modular-arith/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/programs/thurston-modular-arith/TypeVal.hs b/testsuite/tests/programs/thurston-modular-arith/TypeVal.hs new file mode 100644 index 0000000000..f1608a7dfe --- /dev/null +++ b/testsuite/tests/programs/thurston-modular-arith/TypeVal.hs @@ -0,0 +1,89 @@ +{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, + UndecidableInstances, ExistentialQuantification, + ScopedTypeVariables #-} + +-- TypeVal.hs: dependent types, here we come! +module TypeVal where + +-- The functional dependency is necessary to get ghc to accept +-- some of the instances below. Is this a bug? +class TypeVal a t | t -> a where + -- typeToVal should ignore its argument. + typeToVal :: t -> a + +data Wrapper a = forall t . (TypeVal a t) => Wrapper t +instance Show a => Show (Wrapper a) where + show x = "valToType " ++ show (getValue x) + +class ValToType a where + valToType :: a -> Wrapper a + +getValue :: Wrapper a -> a +getValue (Wrapper p) = case p of {(_::t) -> typeToVal (undefined::t)} + +-- Instances of ValToType for standard types. This would also be a +-- straightforward compiler extension for the general case. +---- ValToType Bool +data TRUE = Dummy1 +instance TypeVal Bool TRUE where typeToVal = const True +data FALSE = Dummy2 +instance TypeVal Bool FALSE where typeToVal = const False + +instance ValToType Bool where + valToType True = Wrapper (undefined :: TRUE) + valToType False = Wrapper (undefined :: FALSE) + +---- ValToType Int, ValToType Integer +data Zero = Dummy3 +instance TypeVal Integer Zero where typeToVal = const 0 +data Succ n = Dummy4 +instance (TypeVal Integer n) => TypeVal Integer (Succ n) + where typeToVal = const (typeToVal (undefined :: n) + 1) +data Pred n = Dummy5 +instance (TypeVal Integer n) => TypeVal Integer (Pred n) + where typeToVal = const (typeToVal (undefined :: n) - 1) +data Dbl n = Dummy6 +instance (TypeVal Integer n) => TypeVal Integer (Dbl n) + where typeToVal = const (typeToVal (undefined :: n) * 2) + +instance ValToType Integer where + valToType n | n == 0 = Wrapper (undefined :: Zero) + | even n = + case valToType (div n 2) of {Wrapper x -> + case x of {(_ :: t) -> + Wrapper (undefined :: Dbl t)}} + | n > 0 = + case valToType (n-1) of {Wrapper x -> + case x of {(_ :: t) -> + Wrapper (undefined :: Succ t)}} + | n < 1 = + case valToType (n+1) of {Wrapper x -> + case x of {(_ :: t) -> + Wrapper (undefined :: Pred t)}} + +--- ValToType (a,b) +--- Doesn't work. Perhaps a bug in ghc? +--- Don't need it yet, anyway. +--instance (TypeVal a1 t1, TypeVal a2 t2) => TypeVal (a1,a2) (t1,t2) +-- where typeToVal (x,y) = (typeToVal x, typeToVal y) + +--instance (ValToType a, ValToType b) => ValToType (a,b) where +-- valToType (a,b) = case valToType a of {x -> +-- case valToType b of {y -> +-- Wrapper (x,y)}} + +data NIL a = Dummy20 +instance TypeVal [a] (NIL a) + where typeToVal = const [] +data CONS t r = Dummy21 +instance (TypeVal [a] r, TypeVal a t) => TypeVal [a] (CONS t r) + where typeToVal = const (typeToVal (undefined::t):typeToVal (undefined::r)) + +instance (ValToType a) => ValToType [a] where + valToType [] = Wrapper (undefined::NIL a) + valToType (x:xs) = case valToType x of {Wrapper x' -> + case x' of {(_::xt) -> + case valToType xs of {Wrapper xs' -> + case xs' of {(_::xst) -> + Wrapper (undefined::CONS xt xst)}}}} + diff --git a/testsuite/tests/programs/thurston-modular-arith/test.T b/testsuite/tests/programs/thurston-modular-arith/test.T new file mode 100644 index 0000000000..812fb07ba0 --- /dev/null +++ b/testsuite/tests/programs/thurston-modular-arith/test.T @@ -0,0 +1,8 @@ +# uses GHC-specific scoped type variables +test('thurston-modular-arith', + [skip_if_fast, + extra_clean(['Main.hi', 'Main.o', 'TypeVal.hi', 'TypeVal.o']), + only_compiler_types(['ghc'])], + multimod_compile_and_run, + ['Main', '']) + diff --git a/testsuite/tests/programs/thurston-modular-arith/thurston-modular-arith.stdout b/testsuite/tests/programs/thurston-modular-arith/thurston-modular-arith.stdout new file mode 100644 index 0000000000..8e3f242235 --- /dev/null +++ b/testsuite/tests/programs/thurston-modular-arith/thurston-modular-arith.stdout @@ -0,0 +1 @@ +[1160454313058,601042866744,486139893064,1061833102220,1200539454459,431697477337,1071932948573,437368016493,648465519190,28117328753,572802463620,525458964661,1098965050058,1146413181663,1031790281833,132693597578,1022572439703,1188385014820,1155550272194,1085333828748,711138169084,1097810085884,969851413290,688113499105,1051451464166,91762740357,683576430811,1017300306164,859345346706,464476722784,986691407909,126154333557,616844850370,807700787534,950949002319,569427334108,139926701747,190252127100,681104764591,255337432013,578119123611,1095387195469,205025111054,4280351535,610564088860,668244575777,808958391,413622644002,547196368946,972489655833,43426052275,1029109886156,1003618336884,701219690218,32652275231,856890419730,795025690024,547167228323,81588598779,99123847990,1220352459311,861656358801,415539053485,262846600937,1095771863403,902329833964,155153868473,153256674846,95762892226,434756569979,1119461310498,225955668604,956407996106,602727331338,938712892870,138739207238,597476751261,753203850127,630377605028,1104011481810,651971720632,612639306767,44587272558,723189778903,1175694673739,296308490298,1050104370640,627705731156,456946245990,273636070060,370164717197,714102131007,241897937971,38548029431,641195604432,461162026660,1034230483799,414958271178,116683347148,993546029951,41338685529,1220999331823,355305087011,1154304537831,766433766430,492783359087,728660191128,1182291562810,303019838675,970531985883,1045175815468,414139799249,356215791186,930220136011,1207666364855,579053085321,1129739376256,618126466955,368266007673,603781312885,473511265493,481922050275,677266129081,470427220376,847741222506,990891352681,812435920874,1023023680992,1208648273494,1088031018179,397541463261,529449734884,685114033205,176592183684,1090703954446,425846826311,1030710203349,955873684381,1187149926806,151655613972,786557007817,906015064925,705327542406,765658988977,796744992014,459893204178,7120144612,955773870884,1107099246174,642634148962,523073631629,58810720680,871199825791,432464993000,473547864180,1192291465438,595260628376,1072564372326,78245140603,907635981434,1107920080794,448916242606,138424240535,771626704089,165569019913,39555526940,770608713618,515846898835,75890462387,368361334842,45929245822,113717079968,27967579008,761506187395,1041881431520,325796720496,1116752001385,562028391536,674089512057,684719722795,698329876223,1000106137626,333283811722,544115584442,52151559447,593024042413,593403396845,703893326397,891454822660,673538061926,1085365393980,682406768362,1175661162158,24810610938,428514302596,242328677783,1146691870623,445320947368,864057887837,1043096768322,1079482205566,528910556072,656320945593,1064352684013,278897066828,225559146681,402782331265,659412153374,362593056657,364730396677,1148557099688,421921752513,133993132252,1212170060675,634220655210,1193832204682,944513974343,100005147966,1143053740822,869930873522,597571253205,1126573274992,1098475166978,1019152575837,127516694770,753856020941,182462155983,1055841159892,1090239319538,1111328111610,109997744290,716224188827,696188724732,628913582881,1140602949365,1191662634855,1118097070063,914849082719,675285189684,1212483031948,1005245378633,359463110721,599408183053,547330377389,722963002668,297547082524,774657435221,99824244072,823385133688,281330124509,496819564299,608029555942,418934961653,535244972361,69559315471,719903133248,775576742202,791217321085,830663150129,357628283766,50329297006,629010984818,399300483534,844190871193,1177651219601,295235324508,298762498933,640850115419,996814410816,1191748613152,623580620366,848859960861,450598347415,937257569423,185858247159,387374896393,484633408337,595302696579,313413800134,496578302939,1186936457550,1084776227881,1207149372011,378702576975,13768562311,88971637925,78133947057,370744945123,506882398136,1041055057095,514588090864,810688626791,749466223761,201955679689,193128396581,622185514341,50781478150,96159001679,1095884182806,363039641863,721677089876,539220204741,703310309362,792815735693,1158048228795,902375131249,967175975249,236171954442,212846487217,355219969592,224801991714,399425740960,705135846005,1097450157045,1113041027773,740806614671,471468459255,212390876815,875518600811,91631615655,549056769637,318874352846,804813562572,320760633832,415881440936,967177486461,220454508523,1017740100677,1189461696882,304789032646,1053664539896,952370456796,387781408399,205824342704,1043023288251,229962678091,1157959228388,157439920431,710504704177,547579387976,162664500339,870138759367,460985207786,455487687357,8941448179,554639580674,1188661385061,541750828411,644168654918,1112574821787,426308210125,32055355232,1043230207386,817091977816,893778761354,943758646944,228461650648,1048712884757,421413823740,325501620253,1199866192940,928639509771,131629542466,129295607117,360470445201,917320693930,762083126231,824301510441,201186223081,333161915069,632714271198,360025291471,1081931599316,1189948821699,478148985928,360636707762,733359741846,1154318330158,4740061154,154804428228,595322626936,1190077271684,648335955183,70902560803,965638725137,884647563534,246333658246,997025680376,876772960188,268821879826,564963007403,496203319992,1190255420221,1205878745345,761790415671,363992050603,914469688418,830971452261,604356339244,681802188773,1139919862926,617134290520,506310044828,1062000551985,367349124595,631047074579,139402478742,119201476132,568357381712,746135276958,377692642384,427149372725,1134775925640,6286992172,1213780407968,1099210021863,1112144815717,186978713498,473414771892,1042388392384,810706992008,1184326701837,230266782967,777166996691,754307517579,185890912750,737382949109,1157370682449,984031886647,201323443925,451852790436,29770301089,510986676710,272590013214,313071017737,183766893173,24142297407,1019310800176,518107423013,848680481169,1001375623714,222556405526,1078851836163,971374237084,685014921170,306091259997,758451325831,161822311238,503187490506,757573811953,399929921153,307727255763,622976564857,777026317370,878048036676,375263237737,190034609300,560433601737,439106791060,688051786847,800100518109,1056996730813,1052473747676,1079216172801,388541989780,693297119405,65087791335,1032219499684,752853293756,225848306913,214729950034,1071237287861,1047979140312,376025964895,723732391964,105401678547,983938797598,779738601410,583856935776,847798794211,1202302182695,433115846580,776043906184,490746025703,540238890048,576350727547,1210658282030,1205125109643,638664247138,1218415239266,665480311572,264979343416,42572107736,519364330929,1013530783237,1136792022548,266240525811,1116177912751,876885668567,579372041244,686881957741,869588711057,53902619421,1137719320579,333660464642,653519234190,536169401650,488134923326,666373975728,574797219589,419780893640,1056631409409,404201534647,700888820813,12633156054,1048562180281,452418067259,98144609445,678734068666,223938955292,571034512779,1089434833354,813073368098,66718778856,896591098510,810930390536,1083816917535,949520068315,237324564635,450805767306,1031087019826,718256322665,668953458180,107118126445,796601244899,423207189471,745416172117,331197599630,548793228600,836410144525,1109259650234,287280184875,551647209646,673640803448,930837538401,246170879647,1073444959250,1133458004343,777088699882,512175277337,187110897210,1188867033061,1029022199471,1003276554945,1149086828404,872914915673,771310912452,919129709572,977899716566,645299335803,636693979498,777884667695,241002230496,308988228235,716253490004,990350757363,551816255251,795464824433,579042118215,590495051341,485379632300,333440087460,401442097876,58112869031,538439987268,723917486872,738611440298,25181737887,789222479599,778777859522,177224757066,591901112146,603428436269,36556739187,1095915354724,1120666090166,1076764711272,417618270562,372482310311,1115161210740,1061283447088,891370967168,614503373025,705386707777,176657312189,426056599269,106155768004,4834253099,185076150300,1134248064883,255044207948,969655781724,801145069630,823540691849,495443851494,1124906765692,63595663727,543602566536,1080292362568,803133407084,1196172699624,615526340809,42092276858,859293415248,34559835463,501493313834,36454784694,605630067508,1192374228119,1171423126038,62066814913,44545946426,439207033797,1092646960921,414091445564,608291005227,21762096208,867954464315,1017550045014,22731996142,49560289331,222015335580,151964194894,696163708808,498591364503,458938819435,852580990280,176405495163,716406386188,873740680490,810232860120,1064634217903,743347864466,542722926261,627997546633,922725420917,141925635147,1082879409280,246364778111,1173214463124,1107528346528,347026435673,1175664021489,811196017027,520831331666,668249677512,414115730068,282793576307,939013384965,246200840836,77432200211,463885150533,394985748859,339962496404,788961748989,492272778106,1132589035625,95797076439,81297818446,603127748105,488796622353,19119566668,350885526914,608635935204,272378421700,266623750190,490855611894,111923979553,213211244837,619892836065,575035208152,600688763276,3968264184,1134646634788,231538274435,472441410960,291440077675,1025363433788,532254950955,949871527390,163404774242,947254408062,989303806084,67039322273,455068899216,759289806901,492408235529,443633467602,197303904070,830603398865,1039525525473,549796662556,225671429921,1089123020142,13099529380,991302967631,376676271165,50848774357,245397995564,27673216080,73564292053,222598516223,162621662673,1116304987417,845358791561,324151213014,663787442521,759535744781,835869085407,45516137494,39088312847,281794196451,742120345573,704748391196,127129982442,784443607819,1007044082108,1020324776409,1151301844147,1054297114136,1217548061994,624217342234,756801050240,827565925374,610212327871,1209344774438,420836195643,190253021119,1019448057740,904737588471,298611112576,922632323987,377556252450,493405832035,986145757880,931014075537,987189757201,16801494617,912036401208,963436283158,961508349530,196882435335,324623940508,488567083754,473968663077,237556588690,428804808065,872569024512,566376854056,169576240292,1184551251063,1047838560715,585107124704,1041503818257,618379283590,986528569040,173200849248,978957144595,377336710283,747312415956,765602210758,987023945711,1221251392449,1144049855161,1194562367543,883657437597,801193848082,1144522383824,19018716660,833643076306,1094367968099,1045228448610,537332435335,937431679397,32309800005,8820587755,1099504787084,316187090010,1076501314930,1117055439086,291270278271,655813071325,823457184848,1030789554096,866396461009,7799629667,727869519225,160285383850,743348569961,1021748344044,540077384539,850294073258,1096919735280,810655428142,778365106256,49073962377,320024370520,678926236469,708492477777,49993284382,762653920025,624120527208,421583562973,1172984912486,158832494130,186071390764,817194898499,1230715808202,1026946734106,742625356844,697042207251,1095808038256,961307591537,870277884573,855648831577,649462441088,695372808411,673649632234,910307791166,1094641072197,474112802497,903646629164,808585464567,650147277253,444834812771,778279687335,211291803634,1022480888153,178013981526,47880352543,975754452467,707537330220,269331014119,303622262270,1039322874414,149200761730,1219332108926,170560181796,945674748334,485302770896,311002029522,559559656303,566899917458,236783273007,206088843892,1088628973061,1026892605411,394263456073,394345625390,1122032680902,491690434723,1020592556885,1219961462568,652365968092,825235016780,73370248665,796890173578,928364785229,17110826604,1162942078537,1173507878195,1232221757148,467827784866,223619026325,298514612472,887977813861,260547093800,825998471361,109911996004,215065834514,319154485806,1189677213955,53282417159,109447793880,1011636097942,176096736290,156690829818,197304290182,125061656846,32794352883,895336369369,1047310675160,469354358526,273657872464,875246913089,717944780535,492436502587,86652673007,1181180595048,256906166476,56191734983,337545292959,20090366131,1042260087323,1096609289421,468486331123,657576693674,540406625694,589752064096,196447528265,1092803351910,1033442605564,738974294747,360853858020,753658950817,251754117887,185150165169,1080251673814,696410723501,209146220727,728116952386,541816275992,885329108817,523336091209,1207901223971,197708138706,549737409931,707289691964,1008236790759,593819768920,3135402797,757258400919,188728338655,326462614298,202101067536,49575572212,792989987609,656828936424,1027081263814,664578896573,568858527078,379895869435,1200454144442,1187313887964,347463668044,863495153564,697828624611,707836378177,497800941782,891147150183,1097337866503,965913241799,214704777741,1233651782329,1135014633092,357714026754,633888552586,89066644166,1030848723300,509543498059,1142147774309,270312177909,729834048334,520851616817,473654695560,1191708665263,980790712148,559483522461,823078061473,139116053984,156281534361,508228538947,1170210501914,98354970072,412534017133,1141235914757,986721161949,178299003463,982812836462,382538408247,424482988636,91109478353,394544577027,633277865194,1017479542775,757102424373,140155683415,455694849041,785294036826,1224623784043,393785874140,990223248441,109957573366,480437033783,1057527371877,1145404508929,531860986940,738863767248,1033171120555] |